Migrate libmojo repository into libchrome, part 2.

This CL moves following files.
- .gitignore
- Android.bp is merged into libchrome's Android.bp.
- base/android/*
- build/* except build_config.h which is exactly same with libchrome's.
- ipc/*
- mojo/*
- soong/* into libchrome_tools/
- third_party/{catapult,jinja2,markupsafe,ply}/*
- ui/gfx/{geometry,range}/mojo/*

Then removed following files:
- Android.bp
- CleanSpec.mk
- build/build_config.h

And added README.md to notify the migration.

Bug: 73606903
Test: Built locally. Ran on DUT.
Change-Id: I94aa1b43ff0854f48f30fdf03025bd1c8a346038
diff --git a/.gitignore b/.gitignore
deleted file mode 100644
index 0d20b64..0000000
--- a/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-*.pyc
diff --git a/Android.bp b/Android.bp
deleted file mode 100644
index 24f235a..0000000
--- a/Android.bp
+++ /dev/null
@@ -1,415 +0,0 @@
-// Copyright 2017 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-filegroup {
-    name: "libmojo_mojom_files",
-    srcs: [
-        "ipc/ipc.mojom",
-        "mojo/common/file.mojom",
-        "mojo/common/file_path.mojom",
-        "mojo/common/string16.mojom",
-        "mojo/common/text_direction.mojom",
-        "mojo/common/time.mojom",
-        "mojo/common/unguessable_token.mojom",
-        "mojo/common/values.mojom",
-        "mojo/common/version.mojom",
-        "mojo/public/interfaces/bindings/interface_control_messages.mojom",
-        "mojo/public/interfaces/bindings/pipe_control_messages.mojom",
-        "ui/gfx/geometry/mojo/geometry.mojom",
-        "ui/gfx/range/mojo/range.mojom",
-    ],
-}
-
-filegroup {
-    name: "mojo_sources",
-    srcs: [
-        "mojo/**/*.cc",
-    ],
-    exclude_srcs: [
-        // Unused in Chrome. Looks like mistakenly checked in.
-        // TODO(hidehiko): Remove this after the file is removed in Chrome
-        // repository. http://crrev.com/c/644531
-        "mojo/public/cpp/system/message.cc",
-
-        // No WTF support.
-        "mojo/public/cpp/bindings/lib/string_traits_wtf.cc",
-
-        // Exclude windows/mac/ios files.
-        "**/*_win.cc",
-        "mojo/edk/system/mach_port_relay.cc",
-
-        // Exclude js binding related files.
-        "mojo/edk/js/**/*",
-        "mojo/public/js/**/*",
-
-        // Exclude tests.
-        // Note that mojo/edk/embedder/test_embedder.cc needs to be included
-        // for Mojo support. cf) b/62071944.
-        "**/*_unittest.cc",
-        "**/*_unittests.cc",
-        "**/*_perftest.cc",
-        "mojo/android/javatests/**/*",
-        "mojo/edk/system/core_test_base.cc",
-        "mojo/edk/system/test_utils.cc",
-        "mojo/edk/test/**/*",
-        "mojo/public/c/system/tests/**/*",
-        "mojo/public/cpp/bindings/tests/**/*",
-        "mojo/public/cpp/system/tests/**/*",
-        "mojo/public/cpp/test_support/**/*",
-        "mojo/public/tests/**/*",
-    ],
-}
-
-// Python in Chrome repository requires still Python 2.
-python_defaults {
-    name: "libmojo_scripts",
-    version: {
-        py2: {
-            enabled: true,
-        },
-        py3: {
-            enabled: false,
-        },
-    },
-}
-
-python_binary_host {
-    name: "jni_generator",
-    main: "base/android/jni_generator/jni_generator.py",
-    srcs: [
-        "base/android/jni_generator/jni_generator.py",
-        "build/**/*.py",
-        "third_party/catapult/devil/devil/**/*.py",
-    ],
-    defaults: ["libmojo_scripts"],
-}
-
-python_binary_host {
-    name: "mojom_bindings_generator",
-    main: "mojo/public/tools/bindings/mojom_bindings_generator.py",
-    srcs: [
-        "mojo/public/tools/bindings/**/*.py",
-        "build/**/*.py",
-        "third_party/catapult/devil/**/*.py",
-        "third_party/jinja2/**/*.py",
-        "third_party/markupsafe/**/*.py",
-        "third_party/ply/**/*.py",
-    ],
-    data: [
-        "mojo/public/tools/bindings/generators/cpp_templates/*.tmpl",
-        "mojo/public/tools/bindings/generators/java_templates/*.tmpl",
-        "mojo/public/tools/bindings/generators/js_templates/*.tmpl",
-    ],
-    defaults: ["libmojo_scripts"],
-}
-
-cc_prebuilt_binary {
-    name: "mojom_source_generator_sh",
-    srcs: ["soong/mojom_source_generator.sh"],
-    host_supported: true,
-}
-
-genrule {
-    name: "libmojo_mojom_headers",
-    cmd: "$(location mojom_source_generator_sh)" +
-    "    --mojom_bindings_generator=$(location mojom_bindings_generator)" +
-    "    --package=external/libmojo" +
-    "    --output_dir=$(genDir)" +
-    "    --bytecode_path=$(genDir)" +
-    "    --typemap=$(location gen/mojo/common/common_custom_types__type_mappings)" +
-    "    --generators=c++" +
-    "    --use_new_wrapper_types" +
-    "    $(in)",
-
-    tools: [
-        "mojom_bindings_generator",
-        "mojom_source_generator_sh",
-    ],
-
-    tool_files: [
-        // This file was copied from out/Release in a Chrome checkout.
-        // TODO(lhchavez): Generate this file instead of hardcoding it.
-        "gen/mojo/common/common_custom_types__type_mappings",
-    ],
-
-    srcs: [":libmojo_mojom_files"],
-
-    out: [
-        "ipc/ipc.mojom.h",
-        "ipc/ipc.mojom-shared.h",
-        "ipc/ipc.mojom-shared-internal.h",
-        "mojo/common/file.mojom.h",
-        "mojo/common/file.mojom-shared.h",
-        "mojo/common/file.mojom-shared-internal.h",
-        "mojo/common/file_path.mojom.h",
-        "mojo/common/file_path.mojom-shared.h",
-        "mojo/common/file_path.mojom-shared-internal.h",
-        "mojo/common/string16.mojom.h",
-        "mojo/common/string16.mojom-shared.h",
-        "mojo/common/string16.mojom-shared-internal.h",
-        "mojo/common/text_direction.mojom.h",
-        "mojo/common/text_direction.mojom-shared.h",
-        "mojo/common/text_direction.mojom-shared-internal.h",
-        "mojo/common/time.mojom.h",
-        "mojo/common/time.mojom-shared.h",
-        "mojo/common/time.mojom-shared-internal.h",
-        "mojo/common/unguessable_token.mojom.h",
-        "mojo/common/unguessable_token.mojom-shared.h",
-        "mojo/common/unguessable_token.mojom-shared-internal.h",
-        "mojo/common/values.mojom.h",
-        "mojo/common/values.mojom-shared.h",
-        "mojo/common/values.mojom-shared-internal.h",
-        "mojo/common/version.mojom.h",
-        "mojo/common/version.mojom-shared.h",
-        "mojo/common/version.mojom-shared-internal.h",
-        "mojo/public/interfaces/bindings/interface_control_messages.mojom.h",
-        "mojo/public/interfaces/bindings/interface_control_messages.mojom-shared.h",
-        "mojo/public/interfaces/bindings/interface_control_messages.mojom-shared-internal.h",
-        "mojo/public/interfaces/bindings/pipe_control_messages.mojom.h",
-        "mojo/public/interfaces/bindings/pipe_control_messages.mojom-shared.h",
-        "mojo/public/interfaces/bindings/pipe_control_messages.mojom-shared-internal.h",
-        "ui/gfx/geometry/mojo/geometry.mojom.h",
-        "ui/gfx/geometry/mojo/geometry.mojom-shared.h",
-        "ui/gfx/geometry/mojo/geometry.mojom-shared-internal.h",
-        "ui/gfx/range/mojo/range.mojom.h",
-        "ui/gfx/range/mojo/range.mojom-shared.h",
-        "ui/gfx/range/mojo/range.mojom-shared-internal.h",
-    ],
-}
-
-genrule {
-    name: "libmojo_mojom_srcs",
-    cmd: "$(location mojom_source_generator_sh)" +
-    "    --mojom_bindings_generator=$(location mojom_bindings_generator)" +
-    "    --package=external/libmojo" +
-    "    --output_dir=$(genDir)" +
-    "    --bytecode_path=$(genDir)" +
-    "    --typemap=$(location gen/mojo/common/common_custom_types__type_mappings)" +
-    "    --generators=c++" +
-    "    --use_new_wrapper_types" +
-    "    $(in)",
-
-    tools: [
-        "mojom_bindings_generator",
-        "mojom_source_generator_sh",
-    ],
-
-    tool_files: [
-        // This file was copied from out/Release in a Chrome checkout.
-        // TODO(lhchavez): Generate this file instead of hardcoding it.
-        "gen/mojo/common/common_custom_types__type_mappings",
-        "soong/mojom_source_generator.sh",
-    ],
-
-    srcs: [":libmojo_mojom_files"],
-
-    out: [
-        "ipc/ipc.mojom.cc",
-        "ipc/ipc.mojom-shared.cc",
-        "mojo/common/file.mojom.cc",
-        "mojo/common/file.mojom-shared.cc",
-        "mojo/common/string16.mojom.cc",
-        "mojo/common/string16.mojom-shared.cc",
-        "mojo/common/text_direction.mojom.cc",
-        "mojo/common/text_direction.mojom-shared.cc",
-        "mojo/common/time.mojom.cc",
-        "mojo/common/time.mojom-shared.cc",
-        "mojo/common/unguessable_token.mojom.cc",
-        "mojo/common/unguessable_token.mojom-shared.cc",
-        "mojo/common/version.mojom.cc",
-        "mojo/common/version.mojom-shared.cc",
-        "mojo/public/interfaces/bindings/interface_control_messages.mojom.cc",
-        "mojo/public/interfaces/bindings/interface_control_messages.mojom-shared.cc",
-        "mojo/public/interfaces/bindings/pipe_control_messages.mojom.cc",
-        "mojo/public/interfaces/bindings/pipe_control_messages.mojom-shared.cc",
-        "ui/gfx/geometry/mojo/geometry.mojom.cc",
-        "ui/gfx/geometry/mojo/geometry.mojom-shared.cc",
-        "ui/gfx/range/mojo/range.mojom.cc",
-        "ui/gfx/range/mojo/range.mojom-shared.cc",
-    ],
-}
-
-// TODO(hidehiko): Remove JNI for ContextUtils, after cleaning up the
-// depended code.
-genrule {
-    name: "libmojo_jni_headers",
-    cmd: "$(location soong/jni_generator_helper.sh)" +
-    "    --jni_generator=$(location jni_generator)" +
-    "    --output_dir=$(genDir)/jni" +
-    "    --includes=base/android/jni_generator/jni_generator_helper.h" +
-    "    --ptr_type=long" +
-    "    --native_exports_optional" +
-    "    $(in)",
-
-    tools: [
-        "jni_generator",
-    ],
-
-    tool_files: [
-        "soong/jni_generator_helper.sh",
-    ],
-
-    srcs: [
-        "base/android/java/src/org/chromium/base/BuildInfo.java",
-        "base/android/java/src/org/chromium/base/ContextUtils.java",
-        "mojo/android/system/src/org/chromium/mojo/system/impl/BaseRunLoop.java",
-        "mojo/android/system/src/org/chromium/mojo/system/impl/CoreImpl.java",
-        "mojo/android/system/src/org/chromium/mojo/system/impl/WatcherImpl.java",
-    ],
-
-    out: [
-        "jni/BuildInfo_jni.h",
-        "jni/ContextUtils_jni.h",
-        "jni/BaseRunLoop_jni.h",
-        "jni/CoreImpl_jni.h",
-        "jni/WatcherImpl_jni.h",
-    ],
-}
-
-cc_library_shared {
-    name: "libmojo",
-
-    generated_headers: [
-        "libmojo_jni_headers",
-        "libmojo_mojom_headers",
-    ],
-
-    generated_sources: [
-        "libmojo_mojom_srcs",
-    ],
-
-    export_generated_headers: [
-        "libmojo_jni_headers",
-        "libmojo_mojom_headers",
-    ],
-
-    srcs: [
-        "base/android/build_info.cc",
-        "base/android/context_utils.cc",
-        "base/android/jni_android.cc",
-        "base/android/jni_string.cc",
-        "base/android/scoped_java_ref.cc",
-        "ipc/ipc_message.cc",
-        "ipc/ipc_message_attachment.cc",
-        "ipc/ipc_message_attachment_set.cc",
-        "ipc/ipc_message_utils.cc",
-        "ipc/ipc_mojo_handle_attachment.cc",
-        "ipc/ipc_mojo_message_helper.cc",
-        "ipc/ipc_mojo_param_traits.cc",
-        "ipc/ipc_platform_file_attachment_posix.cc",
-        ":mojo_sources",
-    ],
-
-    cflags: [
-        "-Wall",
-        "-Werror",
-        "-Wno-unused-parameter",
-        "-Wno-missing-field-initializers",
-        "-DMOJO_EDK_LEGACY_PROTOCOL",
-    ],
-
-    // We also pass NO_ASHMEM to make base::SharedMemory avoid using it and prefer
-    // the POSIX versions.
-    cppflags: [
-        "-Wno-sign-promo",
-        "-Wno-non-virtual-dtor",
-        "-Wno-ignored-qualifiers",
-        "-Wno-extra",
-        "-DNO_ASHMEM",
-    ],
-
-    shared_libs: [
-        "libevent",
-        "liblog",
-        "libchrome",
-        "libchrome-crypto",
-    ],
-
-    export_include_dirs: ["."],
-}
-
-genrule {
-    name: "libmojo_mojom_java_srcs",
-    cmd: "$(location mojom_source_generator_sh)" +
-    "    --mojom_bindings_generator=$(location mojom_bindings_generator)" +
-    "    --package=external/libmojo" +
-    "    --output_dir=$(genDir)" +
-    "    --bytecode_path=$(genDir)" +
-    "    --typemap=$(location gen/mojo/common/common_custom_types__type_mappings)" +
-    "    --generators=java" +
-    "    --use_new_wrapper_types" +
-    "    $(in)",
-
-    tools: [
-        "mojom_bindings_generator",
-        "mojom_source_generator_sh",
-    ],
-
-    tool_files: [
-        // This file was copied from out/Release in a Chrome checkout.
-        // TODO(lhchavez): Generate this file instead of hardcoding it.
-        "gen/mojo/common/common_custom_types__type_mappings",
-    ],
-
-    srcs: [":libmojo_mojom_files"],
-
-    out: [
-        "src/org/chromium/gfx/mojom/InsetsF.java",
-        "src/org/chromium/gfx/mojom/Insets.java",
-        "src/org/chromium/gfx/mojom/PointF.java",
-        "src/org/chromium/gfx/mojom/Point.java",
-        "src/org/chromium/gfx/mojom/RangeF.java",
-        "src/org/chromium/gfx/mojom/Range.java",
-        "src/org/chromium/gfx/mojom/RectF.java",
-        "src/org/chromium/gfx/mojom/Rect.java",
-        "src/org/chromium/gfx/mojom/SizeF.java",
-        "src/org/chromium/gfx/mojom/Size.java",
-        "src/org/chromium/gfx/mojom/Vector2dF.java",
-        "src/org/chromium/gfx/mojom/Vector2d.java",
-        "src/org/chromium/IPC/mojom/ChannelBootstrap_Internal.java",
-        "src/org/chromium/IPC/mojom/ChannelBootstrap.java",
-        "src/org/chromium/IPC/mojom/Channel_Internal.java",
-        "src/org/chromium/IPC/mojom/Channel.java",
-        "src/org/chromium/IPC/mojom/GenericInterface_Internal.java",
-        "src/org/chromium/IPC/mojom/GenericInterface.java",
-        "src/org/chromium/IPC/mojom/IpcConstants.java",
-        "src/org/chromium/IPC/mojom/SerializedHandle.java",
-        "src/org/chromium/mojo/bindings/interfacecontrol/FlushForTesting.java",
-        "src/org/chromium/mojo/bindings/interfacecontrol/InterfaceControlMessagesConstants.java",
-        "src/org/chromium/mojo/bindings/interfacecontrol/QueryVersion.java",
-        "src/org/chromium/mojo/bindings/interfacecontrol/QueryVersionResult.java",
-        "src/org/chromium/mojo/bindings/interfacecontrol/RequireVersion.java",
-        "src/org/chromium/mojo/bindings/interfacecontrol/RunInput.java",
-        "src/org/chromium/mojo/bindings/interfacecontrol/RunMessageParams.java",
-        "src/org/chromium/mojo/bindings/interfacecontrol/RunOrClosePipeInput.java",
-        "src/org/chromium/mojo/bindings/interfacecontrol/RunOrClosePipeMessageParams.java",
-        "src/org/chromium/mojo/bindings/interfacecontrol/RunOutput.java",
-        "src/org/chromium/mojo/bindings/interfacecontrol/RunResponseMessageParams.java",
-        "src/org/chromium/mojo/bindings/pipecontrol/DisconnectReason.java",
-        "src/org/chromium/mojo/bindings/pipecontrol/PeerAssociatedEndpointClosedEvent.java",
-        "src/org/chromium/mojo/bindings/pipecontrol/PipeControlMessagesConstants.java",
-        "src/org/chromium/mojo/bindings/pipecontrol/RunOrClosePipeInput.java",
-        "src/org/chromium/mojo/bindings/pipecontrol/RunOrClosePipeMessageParams.java",
-        "src/org/chromium/mojo/common/mojom/File.java",
-        "src/org/chromium/mojo/common/mojom/String16.java",
-        "src/org/chromium/mojo/common/mojom/TextDirection.java",
-        "src/org/chromium/mojo/common/mojom/TimeDelta.java",
-        "src/org/chromium/mojo/common/mojom/Time.java",
-        "src/org/chromium/mojo/common/mojom/TimeTicks.java",
-        "src/org/chromium/mojo/common/mojom/UnguessableToken.java",
-        "src/org/chromium/mojo/common/mojom/Version.java",
-    ],
-}
-
-java_library {
-    name: "android.mojo",
-
-    srcs: [
-        ":libmojo_mojom_java_srcs",
-        "base/android/java/src/**/*.java",
-        "mojo/android/system/src/**/*.java",
-        "mojo/public/java/system/src/**/*.java",
-        "mojo/public/java/bindings/src/**/*.java",
-    ],
-}
diff --git a/CleanSpec.mk b/CleanSpec.mk
deleted file mode 100644
index da5b4d1..0000000
--- a/CleanSpec.mk
+++ /dev/null
@@ -1,56 +0,0 @@
-# Copyright (C) 2018 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-# If you don't need to do a full clean build but would like to touch
-# a file or delete some intermediate files, add a clean step to the end
-# of the list.  These steps will only be run once, if they haven't been
-# run before.
-#
-# E.g.:
-#     $(call add-clean-step, touch -c external/sqlite/sqlite3.h)
-#     $(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/STATIC_LIBRARIES/libz_intermediates)
-#
-# Always use "touch -c" and "rm -f" or "rm -rf" to gracefully deal with
-# files that are missing or have been moved.
-#
-# Use $(PRODUCT_OUT) to get to the "out/target/product/blah/" directory.
-# Use $(OUT_DIR) to refer to the "out" directory.
-#
-# If you need to re-do something that's already mentioned, just copy
-# the command and add it to the bottom of the list.  E.g., if a change
-# that you made last week required touching a file and a change you
-# made today requires touching the same file, just copy the old
-# touch step and add it to the end of the list.
-#
-# ************************************************
-# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
-# ************************************************
-
-# For example:
-#$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/APPS/AndroidTests_intermediates)
-#$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/core_intermediates)
-#$(call add-clean-step, find $(OUT_DIR) -type f -name "IGTalkSession*" -print0 | xargs -0 rm -f)
-#$(call add-clean-step, rm -rf $(PRODUCT_OUT)/data/*)
-
-$(call add-clean-step, rm -rf $(OUT_DIR)/target/product/generic/system/framework/*_bp.jar)
-$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj_x86/SHARED_LIBRARIES/*_bp_intermediates)
-$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/SHARED_LIBRARIES/*_bp_intermediates)
-$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib/*_bp.so)
-$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib64/*_bp.so)
-$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib/arm/*_bp.so)
-
-# ************************************************
-# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
-# ************************************************
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..602ddf9
--- /dev/null
+++ b/README.md
@@ -0,0 +1 @@
+This repository was migrated into libchrome.
diff --git a/base/android/build_info.cc b/base/android/build_info.cc
deleted file mode 100644
index 869c703..0000000
--- a/base/android/build_info.cc
+++ /dev/null
@@ -1,80 +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 "base/android/build_info.h"
-
-#include <string>
-
-#include "base/android/jni_android.h"
-#include "base/android/jni_string.h"
-#include "base/android/scoped_java_ref.h"
-#include "base/logging.h"
-#include "base/memory/singleton.h"
-#include "jni/BuildInfo_jni.h"
-
-namespace {
-
-// We are leaking these strings.
-const char* StrDupJString(const base::android::JavaRef<jstring>& java_string) {
-  std::string str = ConvertJavaStringToUTF8(java_string);
-  return strdup(str.c_str());
-}
-
-}  // namespace
-
-namespace base {
-namespace android {
-
-struct BuildInfoSingletonTraits {
-  static BuildInfo* New() {
-    return new BuildInfo(AttachCurrentThread());
-  }
-
-  static void Delete(BuildInfo* x) {
-    // We're leaking this type, see kRegisterAtExit.
-    NOTREACHED();
-  }
-
-  static const bool kRegisterAtExit = false;
-#if DCHECK_IS_ON()
-  static const bool kAllowedToAccessOnNonjoinableThread = true;
-#endif
-};
-
-BuildInfo::BuildInfo(JNIEnv* env)
-    : device_(StrDupJString(Java_BuildInfo_getDevice(env))),
-      manufacturer_(StrDupJString(Java_BuildInfo_getDeviceManufacturer(env))),
-      model_(StrDupJString(Java_BuildInfo_getDeviceModel(env))),
-      brand_(StrDupJString(Java_BuildInfo_getBrand(env))),
-      android_build_id_(StrDupJString(Java_BuildInfo_getAndroidBuildId(env))),
-      android_build_fp_(
-          StrDupJString(Java_BuildInfo_getAndroidBuildFingerprint(env))),
-      gms_version_code_(StrDupJString(Java_BuildInfo_getGMSVersionCode(env))),
-      package_version_code_(
-          StrDupJString(Java_BuildInfo_getPackageVersionCode(env))),
-      package_version_name_(
-          StrDupJString(Java_BuildInfo_getPackageVersionName(env))),
-      package_label_(StrDupJString(Java_BuildInfo_getPackageLabel(env))),
-      package_name_(StrDupJString(Java_BuildInfo_getPackageName(env))),
-      build_type_(StrDupJString(Java_BuildInfo_getBuildType(env))),
-      sdk_int_(Java_BuildInfo_getSdkInt(env)),
-      java_exception_info_(NULL) {}
-
-// static
-BuildInfo* BuildInfo::GetInstance() {
-  return Singleton<BuildInfo, BuildInfoSingletonTraits >::get();
-}
-
-void BuildInfo::SetJavaExceptionInfo(const std::string& info) {
-  DCHECK(!java_exception_info_) << "info should be set only once.";
-  java_exception_info_ = strndup(info.c_str(), 4096);
-}
-
-void BuildInfo::ClearJavaExceptionInfo() {
-  delete java_exception_info_;
-  java_exception_info_ = nullptr;
-}
-
-}  // namespace android
-}  // namespace base
diff --git a/base/android/build_info.h b/base/android/build_info.h
deleted file mode 100644
index cce74f4..0000000
--- a/base/android/build_info.h
+++ /dev/null
@@ -1,145 +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.
-
-#ifndef BASE_ANDROID_BUILD_INFO_H_
-#define BASE_ANDROID_BUILD_INFO_H_
-
-#include <jni.h>
-
-#include <string>
-
-#include "base/base_export.h"
-#include "base/macros.h"
-#include "base/memory/singleton.h"
-
-namespace base {
-namespace android {
-
-// This enumeration maps to the values returned by BuildInfo::sdk_int(),
-// indicating the Android release associated with a given SDK version.
-enum SdkVersion {
-  SDK_VERSION_JELLY_BEAN = 16,
-  SDK_VERSION_JELLY_BEAN_MR1 = 17,
-  SDK_VERSION_JELLY_BEAN_MR2 = 18,
-  SDK_VERSION_KITKAT = 19,
-  SDK_VERSION_KITKAT_WEAR = 20,
-  SDK_VERSION_LOLLIPOP = 21,
-  SDK_VERSION_LOLLIPOP_MR1 = 22,
-  SDK_VERSION_MARSHMALLOW = 23,
-  SDK_VERSION_NOUGAT = 24
-};
-
-// BuildInfo is a singleton class that stores android build and device
-// information. It will be called from Android specific code and gets used
-// primarily in crash reporting.
-
-// It is also used to store the last java exception seen during JNI.
-// TODO(nileshagrawal): Find a better place to store this info.
-class BASE_EXPORT BuildInfo {
- public:
-
-  ~BuildInfo() {}
-
-  // Static factory method for getting the singleton BuildInfo instance.
-  // Note that ownership is not conferred on the caller and the BuildInfo in
-  // question isn't actually freed until shutdown. This is ok because there
-  // should only be one instance of BuildInfo ever created.
-  static BuildInfo* GetInstance();
-
-  // Const char* is used instead of std::strings because these values must be
-  // available even if the process is in a crash state. Sadly
-  // std::string.c_str() doesn't guarantee that memory won't be allocated when
-  // it is called.
-  const char* device() const {
-    return device_;
-  }
-
-  const char* manufacturer() const {
-    return manufacturer_;
-  }
-
-  const char* model() const {
-    return model_;
-  }
-
-  const char* brand() const {
-    return brand_;
-  }
-
-  const char* android_build_id() const {
-    return android_build_id_;
-  }
-
-  const char* android_build_fp() const {
-    return android_build_fp_;
-  }
-
-  const char* gms_version_code() const {
-    return gms_version_code_;
-  }
-
-  const char* package_version_code() const {
-    return package_version_code_;
-  }
-
-  const char* package_version_name() const {
-    return package_version_name_;
-  }
-
-  const char* package_label() const {
-    return package_label_;
-  }
-
-  const char* package_name() const {
-    return package_name_;
-  }
-
-  const char* build_type() const {
-    return build_type_;
-  }
-
-  int sdk_int() const {
-    return sdk_int_;
-  }
-
-  const char* java_exception_info() const {
-    return java_exception_info_;
-  }
-
-  void SetJavaExceptionInfo(const std::string& info);
-
-  void ClearJavaExceptionInfo();
-
- private:
-  friend struct BuildInfoSingletonTraits;
-
-  explicit BuildInfo(JNIEnv* env);
-
-  // Const char* is used instead of std::strings because these values must be
-  // available even if the process is in a crash state. Sadly
-  // std::string.c_str() doesn't guarantee that memory won't be allocated when
-  // it is called.
-  const char* const device_;
-  const char* const manufacturer_;
-  const char* const model_;
-  const char* const brand_;
-  const char* const android_build_id_;
-  const char* const android_build_fp_;
-  const char* const gms_version_code_;
-  const char* const package_version_code_;
-  const char* const package_version_name_;
-  const char* const package_label_;
-  const char* const package_name_;
-  const char* const build_type_;
-  const int sdk_int_;
-  // This is set via set_java_exception_info, not at constructor time.
-  const char* java_exception_info_;
-
-  DISALLOW_COPY_AND_ASSIGN(BuildInfo);
-};
-
-}  // namespace android
-}  // namespace base
-
-#endif  // BASE_ANDROID_BUILD_INFO_H_
diff --git a/base/android/context_utils.cc b/base/android/context_utils.cc
deleted file mode 100644
index e2c4ed0..0000000
--- a/base/android/context_utils.cc
+++ /dev/null
@@ -1,53 +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/android/context_utils.h"
-
-#include <jni.h>
-
-#include "base/android/scoped_java_ref.h"
-#include "base/lazy_instance.h"
-#include "jni/ContextUtils_jni.h"
-
-using base::android::JavaRef;
-
-namespace base {
-namespace android {
-
-namespace {
-
-// Leak the global app context, as it is used from a non-joinable worker thread
-// that may still be running at shutdown. There is no harm in doing this.
-base::LazyInstance<base::android::ScopedJavaGlobalRef<jobject>>::Leaky
-    g_application_context = LAZY_INSTANCE_INITIALIZER;
-
-void SetNativeApplicationContext(JNIEnv* env, const JavaRef<jobject>& context) {
-  if (env->IsSameObject(g_application_context.Get().obj(), context.obj())) {
-    // It's safe to set the context more than once if it's the same context.
-    return;
-  }
-  DCHECK(g_application_context.Get().is_null());
-  g_application_context.Get().Reset(context);
-}
-
-}  // namespace
-
-const JavaRef<jobject>& GetApplicationContext() {
-  DCHECK(!g_application_context.Get().is_null());
-  return g_application_context.Get();
-}
-
-static void InitNativeSideApplicationContext(
-    JNIEnv* env,
-    const JavaParamRef<jclass>& clazz,
-    const JavaParamRef<jobject>& context) {
-  SetNativeApplicationContext(env, context);
-}
-
-bool RegisterContextUtils(JNIEnv* env) {
-  return RegisterNativesImpl(env);
-}
-
-}  // namespace android
-}  // namespace base
diff --git a/base/android/context_utils.h b/base/android/context_utils.h
deleted file mode 100644
index c5289f1..0000000
--- a/base/android/context_utils.h
+++ /dev/null
@@ -1,26 +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 BASE_ANDROID_CONTEXT_UTILS_H_
-#define BASE_ANDROID_CONTEXT_UTILS_H_
-
-#include <jni.h>
-
-#include "base/android/scoped_java_ref.h"
-#include "base/base_export.h"
-
-namespace base {
-namespace android {
-
-// Gets a global ref to the application context set with
-// InitApplicationContext(). Ownership is retained by the function - the caller
-// must NOT release it.
-BASE_EXPORT const JavaRef<jobject>& GetApplicationContext();
-
-bool RegisterContextUtils(JNIEnv* env);
-
-}  // namespace android
-}  // namespace base
-
-#endif  // BASE_ANDROID_CONTEXT_UTILS_H_
diff --git a/base/android/java/src/org/chromium/base/BuildInfo.java b/base/android/java/src/org/chromium/base/BuildInfo.java
deleted file mode 100644
index de4ad08..0000000
--- a/base/android/java/src/org/chromium/base/BuildInfo.java
+++ /dev/null
@@ -1,171 +0,0 @@
-// Copyright 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.
-
-package org.chromium.base;
-
-import android.content.Context;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager;
-import android.content.pm.PackageManager.NameNotFoundException;
-import android.os.Build;
-import android.os.StrictMode;
-
-import org.chromium.base.annotations.CalledByNative;
-
-/**
- * BuildInfo is a utility class providing easy access to {@link PackageInfo} information. This is
- * primarily of use for accessing package information from native code.
- */
-public class BuildInfo {
-    private static final String TAG = "BuildInfo";
-    private static final int MAX_FINGERPRINT_LENGTH = 128;
-
-    /**
-     * BuildInfo is a static utility class and therefore shouldn't be instantiated.
-     */
-    private BuildInfo() {}
-
-    @CalledByNative
-    public static String getDevice() {
-        return Build.DEVICE;
-    }
-
-    @CalledByNative
-    public static String getBrand() {
-        return Build.BRAND;
-    }
-
-    @CalledByNative
-    public static String getAndroidBuildId() {
-        return Build.ID;
-    }
-
-    /**
-     * @return The build fingerprint for the current Android install.  The value is truncated to a
-     * 128 characters as this is used for crash and UMA reporting, which should avoid huge
-     * strings.
-     */
-    @CalledByNative
-    public static String getAndroidBuildFingerprint() {
-        return Build.FINGERPRINT.substring(
-                0, Math.min(Build.FINGERPRINT.length(), MAX_FINGERPRINT_LENGTH));
-    }
-
-    @CalledByNative
-    public static String getDeviceManufacturer() {
-        return Build.MANUFACTURER;
-    }
-
-    @CalledByNative
-    public static String getDeviceModel() {
-        return Build.MODEL;
-    }
-
-    @CalledByNative
-    public static String getGMSVersionCode() {
-        String msg = "gms versionCode not available.";
-        try {
-            PackageManager packageManager =
-                    ContextUtils.getApplicationContext().getPackageManager();
-            PackageInfo packageInfo = packageManager.getPackageInfo("com.google.android.gms", 0);
-            msg = Integer.toString(packageInfo.versionCode);
-        } catch (NameNotFoundException e) {
-            Log.d(TAG, "GMS package is not found.", e);
-        }
-        return msg;
-    }
-
-    @CalledByNative
-    public static String getPackageVersionCode() {
-        String msg = "versionCode not available.";
-        try {
-            PackageManager pm = ContextUtils.getApplicationContext().getPackageManager();
-            PackageInfo pi = pm.getPackageInfo(getPackageName(), 0);
-            msg = "";
-            if (pi.versionCode > 0) {
-                msg = Integer.toString(pi.versionCode);
-            }
-        } catch (NameNotFoundException e) {
-            Log.d(TAG, msg);
-        }
-        return msg;
-    }
-
-    @CalledByNative
-    public static String getPackageVersionName() {
-        String msg = "versionName not available";
-        try {
-            PackageManager pm = ContextUtils.getApplicationContext().getPackageManager();
-            PackageInfo pi = pm.getPackageInfo(getPackageName(), 0);
-            msg = "";
-            if (pi.versionName != null) {
-                msg = pi.versionName;
-            }
-        } catch (NameNotFoundException e) {
-            Log.d(TAG, msg);
-        }
-        return msg;
-    }
-
-    @CalledByNative
-    public static String getPackageLabel() {
-        // Third-party code does disk read on the getApplicationInfo call. http://crbug.com/614343
-        StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskReads();
-        try {
-            PackageManager packageManager =
-                    ContextUtils.getApplicationContext().getPackageManager();
-            ApplicationInfo appInfo = packageManager.getApplicationInfo(
-                    getPackageName(), PackageManager.GET_META_DATA);
-            CharSequence label = packageManager.getApplicationLabel(appInfo);
-            return label != null ? label.toString() : "";
-        } catch (NameNotFoundException e) {
-            return "";
-        } finally {
-            StrictMode.setThreadPolicy(oldPolicy);
-        }
-    }
-
-    @CalledByNative
-    public static String getPackageName() {
-        if (ContextUtils.getApplicationContext() == null) {
-            return "";
-        }
-        return ContextUtils.getApplicationContext().getPackageName();
-    }
-
-    @CalledByNative
-    public static String getBuildType() {
-        return Build.TYPE;
-    }
-
-    /**
-     * Check if this is a debuggable build of Android. Use this to enable developer-only features.
-     */
-    public static boolean isDebugAndroid() {
-        return "eng".equals(Build.TYPE) || "userdebug".equals(Build.TYPE);
-    }
-
-    @CalledByNative
-    public static int getSdkInt() {
-        return Build.VERSION.SDK_INT;
-    }
-
-    /**
-     * @return Whether the current device is running Android O release or newer.
-     */
-    public static boolean isAtLeastO() {
-        return !"REL".equals(Build.VERSION.CODENAME)
-                && ("O".equals(Build.VERSION.CODENAME) || Build.VERSION.CODENAME.startsWith("OMR"));
-    }
-
-    /**
-     * @return Whether the current app targets the SDK for at least O
-     */
-    public static boolean targetsAtLeastO(Context appContext) {
-        return isAtLeastO()
-                && appContext.getApplicationInfo().targetSdkVersion
-                == Build.VERSION_CODES.CUR_DEVELOPMENT;
-    }
-}
diff --git a/base/android/java/src/org/chromium/base/ContextUtils.java b/base/android/java/src/org/chromium/base/ContextUtils.java
deleted file mode 100644
index 448eff9..0000000
--- a/base/android/java/src/org/chromium/base/ContextUtils.java
+++ /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.
-
-package org.chromium.base;
-
-import android.content.Context;
-import android.content.SharedPreferences;
-import android.preference.PreferenceManager;
-
-import org.chromium.base.annotations.JNINamespace;
-import org.chromium.base.annotations.MainDex;
-
-/**
- * This class provides Android application context related utility methods.
- */
-@JNINamespace("base::android")
-@MainDex
-public class ContextUtils {
-    private static final String TAG = "ContextUtils";
-    private static Context sApplicationContext;
-
-    /**
-     * Initialization-on-demand holder. This exists for thread-safe lazy initialization.
-     */
-    private static class Holder {
-        // Not final for tests.
-        private static SharedPreferences sSharedPreferences = fetchAppSharedPreferences();
-    }
-
-    /**
-     * Get the Android application context.
-     *
-     * Under normal circumstances there is only one application context in a process, so it's safe
-     * to treat this as a global. In WebView it's possible for more than one app using WebView to be
-     * running in a single process, but this mechanism is rarely used and this is not the only
-     * problem in that scenario, so we don't currently forbid using it as a global.
-     *
-     * Do not downcast the context returned by this method to Application (or any subclass). It may
-     * not be an Application object; it may be wrapped in a ContextWrapper. The only assumption you
-     * may make is that it is a Context whose lifetime is the same as the lifetime of the process.
-     */
-    public static Context getApplicationContext() {
-        return sApplicationContext;
-    }
-
-    /**
-     * Initializes the java application context.
-     *
-     * This should be called exactly once early on during startup, before native is loaded and
-     * before any other clients make use of the application context through this class.
-     *
-     * @param appContext The application context.
-     */
-    public static void initApplicationContext(Context appContext) {
-        // Conceding that occasionally in tests, native is loaded before the browser process is
-        // started, in which case the browser process re-sets the application context.
-        if (sApplicationContext != null && sApplicationContext != appContext) {
-            throw new RuntimeException("Attempting to set multiple global application contexts.");
-        }
-        initJavaSideApplicationContext(appContext);
-    }
-
-    /**
-     * Initialize the native Android application context to be the same as the java counter-part.
-     */
-    public static void initApplicationContextForNative() {
-        if (sApplicationContext == null) {
-            throw new RuntimeException("Cannot have native global application context be null.");
-        }
-        nativeInitNativeSideApplicationContext(sApplicationContext);
-    }
-
-    /**
-     * Only called by the static holder class and tests.
-     *
-     * @return The application-wide shared preferences.
-     */
-    private static SharedPreferences fetchAppSharedPreferences() {
-        return PreferenceManager.getDefaultSharedPreferences(sApplicationContext);
-    }
-
-    /**
-     * This is used to ensure that we always use the application context to fetch the default shared
-     * preferences. This avoids needless I/O for android N and above. It also makes it clear that
-     * the app-wide shared preference is desired, rather than the potentially context-specific one.
-     *
-     * @return application-wide shared preferences.
-     */
-    public static SharedPreferences getAppSharedPreferences() {
-        return Holder.sSharedPreferences;
-    }
-
-    /**
-     * Occasionally tests cannot ensure the application context doesn't change between tests (junit)
-     * and sometimes specific tests has its own special needs, initApplicationContext should be used
-     * as much as possible, but this method can be used to override it.
-     *
-     * @param appContext The new application context.
-     */
-    @VisibleForTesting
-    public static void initApplicationContextForTests(Context appContext) {
-        initJavaSideApplicationContext(appContext);
-        Holder.sSharedPreferences = fetchAppSharedPreferences();
-    }
-
-    private static void initJavaSideApplicationContext(Context appContext) {
-        if (appContext == null) {
-            throw new RuntimeException("Global application context cannot be set to null.");
-        }
-        sApplicationContext = appContext;
-    }
-
-    private static native void nativeInitNativeSideApplicationContext(Context appContext);
-}
diff --git a/base/android/java/src/org/chromium/base/Log.java b/base/android/java/src/org/chromium/base/Log.java
deleted file mode 100644
index 399f16d..0000000
--- a/base/android/java/src/org/chromium/base/Log.java
+++ /dev/null
@@ -1,387 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.base;
-
-import org.chromium.base.annotations.RemovableInRelease;
-
-import java.util.Locale;
-
-/**
- * Utility class for Logging.
- *
- * <p>
- * Defines logging access points for each feature. They format and forward the logs to
- * {@link android.util.Log}, allowing to standardize the output, to make it easy to identify
- * the origin of logs, and enable or disable logging in different parts of the code.
- * </p>
- * <p>
- * Usage documentation: {@code //docs/android_logging.md}.
- * </p>
- */
-public class Log {
-    /** Convenience property, same as {@link android.util.Log#ASSERT}. */
-    public static final int ASSERT = android.util.Log.ASSERT;
-
-    /** Convenience property, same as {@link android.util.Log#DEBUG}. */
-    public static final int DEBUG = android.util.Log.DEBUG;
-
-    /** Convenience property, same as {@link android.util.Log#ERROR}. */
-    public static final int ERROR = android.util.Log.ERROR;
-
-    /** Convenience property, same as {@link android.util.Log#INFO}. */
-    public static final int INFO = android.util.Log.INFO;
-
-    /** Convenience property, same as {@link android.util.Log#VERBOSE}. */
-    public static final int VERBOSE = android.util.Log.VERBOSE;
-
-    /** Convenience property, same as {@link android.util.Log#WARN}. */
-    public static final int WARN = android.util.Log.WARN;
-
-    private static final String sTagPrefix = "cr_";
-    private static final String sDeprecatedTagPrefix = "cr.";
-
-    private Log() {
-        // Static only access
-    }
-
-    /** Returns a formatted log message, using the supplied format and arguments.*/
-    private static String formatLog(String messageTemplate, Object... params) {
-        if (params != null && params.length != 0) {
-            messageTemplate = String.format(Locale.US, messageTemplate, params);
-        }
-
-        return messageTemplate;
-    }
-
-    /**
-     * Returns a normalized tag that will be in the form: "cr_foo". This function is called by the
-     * various Log overrides. If using {@link #isLoggable(String, int)}, you might want to call it
-     * to get the tag that will actually be used.
-     * @see #sTagPrefix
-     */
-    public static String normalizeTag(String tag) {
-        if (tag.startsWith(sTagPrefix)) return tag;
-
-        // TODO(dgn) simplify this once 'cr.' is out of the repo (http://crbug.com/533072)
-        int unprefixedTagStart = 0;
-        if (tag.startsWith(sDeprecatedTagPrefix)) {
-            unprefixedTagStart = sDeprecatedTagPrefix.length();
-        }
-
-        return sTagPrefix + tag.substring(unprefixedTagStart, tag.length());
-    }
-
-    /**
-     * Returns a formatted log message, using the supplied format and arguments.
-     * The message will be prepended with the filename and line number of the call.
-     */
-    private static String formatLogWithStack(String messageTemplate, Object... params) {
-        return "[" + getCallOrigin() + "] " + formatLog(messageTemplate, params);
-    }
-
-    /**
-     * Convenience function, forwards to {@link android.util.Log#isLoggable(String, int)}.
-     *
-     * Note: Has no effect on whether logs are sent or not. Use a method with
-     * {@link RemovableInRelease} to log something in Debug builds only.
-     */
-    public static boolean isLoggable(String tag, int level) {
-        return android.util.Log.isLoggable(tag, level);
-    }
-
-    /**
-     * Sends a {@link android.util.Log#VERBOSE} log message.
-     *
-     * For optimization purposes, only the fixed parameters versions are visible. If you need more
-     * than 7 parameters, consider building your log message using a function annotated with
-     * {@link RemovableInRelease}.
-     *
-     * @param tag Used to identify the source of a log message. Might be modified in the output
-     *            (see {@link #normalizeTag(String)})
-     * @param messageTemplate The message you would like logged. It is to be specified as a format
-     *                        string.
-     * @param args Arguments referenced by the format specifiers in the format string. If the last
-     *             one is a {@link Throwable}, its trace will be printed.
-     */
-    private static void verbose(String tag, String messageTemplate, Object... args) {
-        String message = formatLogWithStack(messageTemplate, args);
-        Throwable tr = getThrowableToLog(args);
-        if (tr != null) {
-            android.util.Log.v(normalizeTag(tag), message, tr);
-        } else {
-            android.util.Log.v(normalizeTag(tag), message);
-        }
-    }
-
-    /** Sends a {@link android.util.Log#VERBOSE} log message. 0 args version. */
-    @RemovableInRelease
-    @VisibleForTesting
-    public static void v(String tag, String message) {
-        verbose(tag, message);
-    }
-
-    /** Sends a {@link android.util.Log#VERBOSE} log message. 1 arg version. */
-    @RemovableInRelease
-    @VisibleForTesting
-    public static void v(String tag, String messageTemplate, Object arg1) {
-        verbose(tag, messageTemplate, arg1);
-    }
-
-    /** Sends a {@link android.util.Log#VERBOSE} log message. 2 args version */
-    @RemovableInRelease
-    @VisibleForTesting
-    public static void v(String tag, String messageTemplate, Object arg1, Object arg2) {
-        verbose(tag, messageTemplate, arg1, arg2);
-    }
-
-    /** Sends a {@link android.util.Log#VERBOSE} log message. 3 args version */
-    @RemovableInRelease
-    @VisibleForTesting
-    public static void v(
-            String tag, String messageTemplate, Object arg1, Object arg2, Object arg3) {
-        verbose(tag, messageTemplate, arg1, arg2, arg3);
-    }
-
-    /** Sends a {@link android.util.Log#VERBOSE} log message. 4 args version */
-    @RemovableInRelease
-    @VisibleForTesting
-    public static void v(String tag, String messageTemplate, Object arg1, Object arg2, Object arg3,
-            Object arg4) {
-        verbose(tag, messageTemplate, arg1, arg2, arg3, arg4);
-    }
-
-    /** Sends a {@link android.util.Log#VERBOSE} log message. 5 args version */
-    @RemovableInRelease
-    @VisibleForTesting
-    public static void v(String tag, String messageTemplate, Object arg1, Object arg2, Object arg3,
-            Object arg4, Object arg5) {
-        verbose(tag, messageTemplate, arg1, arg2, arg3, arg4, arg5);
-    }
-
-    /** Sends a {@link android.util.Log#VERBOSE} log message. 6 args version */
-    @RemovableInRelease
-    @VisibleForTesting
-    public static void v(String tag, String messageTemplate, Object arg1, Object arg2, Object arg3,
-            Object arg4, Object arg5, Object arg6) {
-        verbose(tag, messageTemplate, arg1, arg2, arg3, arg4, arg5, arg6);
-    }
-
-    /** Sends a {@link android.util.Log#VERBOSE} log message. 7 args version */
-    @RemovableInRelease
-    @VisibleForTesting
-    public static void v(String tag, String messageTemplate, Object arg1, Object arg2, Object arg3,
-            Object arg4, Object arg5, Object arg6, Object arg7) {
-        verbose(tag, messageTemplate, arg1, arg2, arg3, arg4, arg5, arg6, arg7);
-    }
-
-    /**
-     * Sends a {@link android.util.Log#DEBUG} log message.
-     *
-     * For optimization purposes, only the fixed parameters versions are visible. If you need more
-     * than 7 parameters, consider building your log message using a function annotated with
-     * {@link RemovableInRelease}.
-     *
-     * @param tag Used to identify the source of a log message. Might be modified in the output
-     *            (see {@link #normalizeTag(String)})
-     * @param messageTemplate The message you would like logged. It is to be specified as a format
-     *                        string.
-     * @param args Arguments referenced by the format specifiers in the format string. If the last
-     *             one is a {@link Throwable}, its trace will be printed.
-     */
-    private static void debug(String tag, String messageTemplate, Object... args) {
-        String message = formatLogWithStack(messageTemplate, args);
-        Throwable tr = getThrowableToLog(args);
-        if (tr != null) {
-            android.util.Log.d(normalizeTag(tag), message, tr);
-        } else {
-            android.util.Log.d(normalizeTag(tag), message);
-        }
-    }
-
-    /** Sends a {@link android.util.Log#DEBUG} log message. 0 args version. */
-    @RemovableInRelease
-    @VisibleForTesting
-    public static void d(String tag, String message) {
-        debug(tag, message);
-    }
-
-    /** Sends a {@link android.util.Log#DEBUG} log message. 1 arg version. */
-    @RemovableInRelease
-    @VisibleForTesting
-    public static void d(String tag, String messageTemplate, Object arg1) {
-        debug(tag, messageTemplate, arg1);
-    }
-    /** Sends a {@link android.util.Log#DEBUG} log message. 2 args version */
-    @RemovableInRelease
-    @VisibleForTesting
-    public static void d(String tag, String messageTemplate, Object arg1, Object arg2) {
-        debug(tag, messageTemplate, arg1, arg2);
-    }
-    /** Sends a {@link android.util.Log#DEBUG} log message. 3 args version */
-    @RemovableInRelease
-    @VisibleForTesting
-    public static void d(
-            String tag, String messageTemplate, Object arg1, Object arg2, Object arg3) {
-        debug(tag, messageTemplate, arg1, arg2, arg3);
-    }
-
-    /** Sends a {@link android.util.Log#DEBUG} log message. 4 args version */
-    @RemovableInRelease
-    @VisibleForTesting
-    public static void d(String tag, String messageTemplate, Object arg1, Object arg2, Object arg3,
-            Object arg4) {
-        debug(tag, messageTemplate, arg1, arg2, arg3, arg4);
-    }
-
-    /** Sends a {@link android.util.Log#DEBUG} log message. 5 args version */
-    @RemovableInRelease
-    @VisibleForTesting
-    public static void d(String tag, String messageTemplate, Object arg1, Object arg2, Object arg3,
-            Object arg4, Object arg5) {
-        debug(tag, messageTemplate, arg1, arg2, arg3, arg4, arg5);
-    }
-
-    /** Sends a {@link android.util.Log#DEBUG} log message. 6 args version */
-    @RemovableInRelease
-    @VisibleForTesting
-    public static void d(String tag, String messageTemplate, Object arg1, Object arg2, Object arg3,
-            Object arg4, Object arg5, Object arg6) {
-        debug(tag, messageTemplate, arg1, arg2, arg3, arg4, arg5, arg6);
-    }
-
-    /** Sends a {@link android.util.Log#DEBUG} log message. 7 args version */
-    @RemovableInRelease
-    @VisibleForTesting
-    public static void d(String tag, String messageTemplate, Object arg1, Object arg2, Object arg3,
-            Object arg4, Object arg5, Object arg6, Object arg7) {
-        debug(tag, messageTemplate, arg1, arg2, arg3, arg4, arg5, arg6, arg7);
-    }
-
-    /**
-     * Sends an {@link android.util.Log#INFO} log message.
-     *
-     * @param tag Used to identify the source of a log message. Might be modified in the output
-     *            (see {@link #normalizeTag(String)})
-     * @param messageTemplate The message you would like logged. It is to be specified as a format
-     *                        string.
-     * @param args Arguments referenced by the format specifiers in the format string. If the last
-     *             one is a {@link Throwable}, its trace will be printed.
-     */
-    @VisibleForTesting
-    public static void i(String tag, String messageTemplate, Object... args) {
-        String message = formatLog(messageTemplate, args);
-        Throwable tr = getThrowableToLog(args);
-        if (tr != null) {
-            android.util.Log.i(normalizeTag(tag), message, tr);
-        } else {
-            android.util.Log.i(normalizeTag(tag), message);
-        }
-    }
-
-    /**
-     * Sends a {@link android.util.Log#WARN} log message.
-     *
-     * @param tag Used to identify the source of a log message. Might be modified in the output
-     *            (see {@link #normalizeTag(String)})
-     * @param messageTemplate The message you would like logged. It is to be specified as a format
-     *                        string.
-     * @param args Arguments referenced by the format specifiers in the format string. If the last
-     *             one is a {@link Throwable}, its trace will be printed.
-     */
-    @VisibleForTesting
-    public static void w(String tag, String messageTemplate, Object... args) {
-        String message = formatLog(messageTemplate, args);
-        Throwable tr = getThrowableToLog(args);
-        if (tr != null) {
-            android.util.Log.w(normalizeTag(tag), message, tr);
-        } else {
-            android.util.Log.w(normalizeTag(tag), message);
-        }
-    }
-
-    /**
-     * Sends an {@link android.util.Log#ERROR} log message.
-     *
-     * @param tag Used to identify the source of a log message. Might be modified in the output
-     *            (see {@link #normalizeTag(String)})
-     * @param messageTemplate The message you would like logged. It is to be specified as a format
-     *                        string.
-     * @param args Arguments referenced by the format specifiers in the format string. If the last
-     *             one is a {@link Throwable}, its trace will be printed.
-     */
-    @VisibleForTesting
-    public static void e(String tag, String messageTemplate, Object... args) {
-        String message = formatLog(messageTemplate, args);
-        Throwable tr = getThrowableToLog(args);
-        if (tr != null) {
-            android.util.Log.e(normalizeTag(tag), message, tr);
-        } else {
-            android.util.Log.e(normalizeTag(tag), message);
-        }
-    }
-
-    /**
-     * What a Terrible Failure: Used for conditions that should never happen, and logged at
-     * the {@link android.util.Log#ASSERT} level. Depending on the configuration, it might
-     * terminate the process.
-     *
-     * @see android.util.Log#wtf(String, String, Throwable)
-     *
-     * @param tag Used to identify the source of a log message. Might be modified in the output
-     *            (see {@link #normalizeTag(String)})
-     * @param messageTemplate The message you would like logged. It is to be specified as a format
-     *                        string.
-     * @param args Arguments referenced by the format specifiers in the format string. If the last
-     *             one is a {@link Throwable}, its trace will be printed.
-     */
-    @VisibleForTesting
-    public static void wtf(String tag, String messageTemplate, Object... args) {
-        String message = formatLog(messageTemplate, args);
-        Throwable tr = getThrowableToLog(args);
-        if (tr != null) {
-            android.util.Log.wtf(normalizeTag(tag), message, tr);
-        } else {
-            android.util.Log.wtf(normalizeTag(tag), message);
-        }
-    }
-
-    /** Handy function to get a loggable stack trace from a Throwable. */
-    public static String getStackTraceString(Throwable tr) {
-        return android.util.Log.getStackTraceString(tr);
-    }
-
-    private static Throwable getThrowableToLog(Object[] args) {
-        if (args == null || args.length == 0) return null;
-
-        Object lastArg = args[args.length - 1];
-
-        if (!(lastArg instanceof Throwable)) return null;
-        return (Throwable) lastArg;
-    }
-
-    /** Returns a string form of the origin of the log call, to be used as secondary tag.*/
-    private static String getCallOrigin() {
-        StackTraceElement[] st = Thread.currentThread().getStackTrace();
-
-        // The call stack should look like:
-        //   n [a variable number of calls depending on the vm used]
-        //  +0 getCallOrigin()
-        //  +1 privateLogFunction: verbose or debug
-        //  +2 formatLogWithStack()
-        //  +3 logFunction: v or d
-        //  +4 caller
-
-        int callerStackIndex;
-        String logClassName = Log.class.getName();
-        for (callerStackIndex = 0; callerStackIndex < st.length; callerStackIndex++) {
-            if (st[callerStackIndex].getClassName().equals(logClassName)) {
-                callerStackIndex += 4;
-                break;
-            }
-        }
-
-        return st[callerStackIndex].getFileName() + ":" + st[callerStackIndex].getLineNumber();
-    }
-}
diff --git a/base/android/java/src/org/chromium/base/PackageUtils.java b/base/android/java/src/org/chromium/base/PackageUtils.java
deleted file mode 100644
index ab554cd..0000000
--- a/base/android/java/src/org/chromium/base/PackageUtils.java
+++ /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.
-
-package org.chromium.base;
-
-import android.content.Context;
-import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager;
-
-/**
- * This class provides package checking related methods.
- */
-public class PackageUtils {
-    /**
-     * Retrieves the version of the given package installed on the device.
-     *
-     * @param context Any context.
-     * @param packageName Name of the package to find.
-     * @return The package's version code if found, -1 otherwise.
-     */
-    public static int getPackageVersion(Context context, String packageName) {
-        int versionCode = -1;
-        PackageManager pm = context.getPackageManager();
-        try {
-            PackageInfo packageInfo = pm.getPackageInfo(packageName, 0);
-            if (packageInfo != null) versionCode = packageInfo.versionCode;
-        } catch (PackageManager.NameNotFoundException e) {
-            // Do nothing, versionCode stays -1
-        }
-        return versionCode;
-    }
-
-    private PackageUtils() {
-        // Hide constructor
-    }
-}
diff --git a/base/android/java/src/org/chromium/base/VisibleForTesting.java b/base/android/java/src/org/chromium/base/VisibleForTesting.java
deleted file mode 100644
index 24cbfad..0000000
--- a/base/android/java/src/org/chromium/base/VisibleForTesting.java
+++ /dev/null
@@ -1,12 +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.
-
-package org.chromium.base;
-
-/**
- * Annotation used to mark code that has wider visibility or present for testing code.
- */
-public @interface VisibleForTesting {
-
-}
diff --git a/base/android/java/src/org/chromium/base/annotations/AccessedByNative.java b/base/android/java/src/org/chromium/base/annotations/AccessedByNative.java
deleted file mode 100644
index 6df7c11..0000000
--- a/base/android/java/src/org/chromium/base/annotations/AccessedByNative.java
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 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.
-
-package org.chromium.base.annotations;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- *  @AccessedByNative is used to ensure proguard will keep this field, since it's
- *  only accessed by native.
- */
-@Target(ElementType.FIELD)
-@Retention(RetentionPolicy.CLASS)
-public @interface AccessedByNative {
-    public String value() default "";
-}
diff --git a/base/android/java/src/org/chromium/base/annotations/CalledByNative.java b/base/android/java/src/org/chromium/base/annotations/CalledByNative.java
deleted file mode 100644
index 94ef3fa..0000000
--- a/base/android/java/src/org/chromium/base/annotations/CalledByNative.java
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 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.
-
-package org.chromium.base.annotations;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * @CalledByNative is used by the JNI generator to create the necessary JNI
- * bindings and expose this method to native code.
- */
-@Target(ElementType.METHOD)
-@Retention(RetentionPolicy.CLASS)
-public @interface CalledByNative {
-    /*
-     *  If present, tells which inner class the method belongs to.
-     */
-    public String value() default "";
-}
diff --git a/base/android/java/src/org/chromium/base/annotations/CalledByNativeUnchecked.java b/base/android/java/src/org/chromium/base/annotations/CalledByNativeUnchecked.java
deleted file mode 100644
index c0abcbe..0000000
--- a/base/android/java/src/org/chromium/base/annotations/CalledByNativeUnchecked.java
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 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.
-
-package org.chromium.base.annotations;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- *  @CalledByNativeUnchecked is used to generate JNI bindings that do not check for exceptions.
- *  It only makes sense to use this annotation on methods that declare a throws... spec.
- *  However, note that the exception received native side maybe an 'unchecked' (RuntimeExpception)
- *  such as NullPointerException, so the native code should differentiate these cases.
- *  Usage of this should be very rare; where possible handle exceptions in the Java side and use a
- *  return value to indicate success / failure.
- */
-@Target(ElementType.METHOD)
-@Retention(RetentionPolicy.CLASS)
-public @interface CalledByNativeUnchecked {
-    /*
-     *  If present, tells which inner class the method belongs to.
-     */
-    public String value() default "";
-}
diff --git a/base/android/java/src/org/chromium/base/annotations/JNIAdditionalImport.java b/base/android/java/src/org/chromium/base/annotations/JNIAdditionalImport.java
deleted file mode 100644
index f1bf85e..0000000
--- a/base/android/java/src/org/chromium/base/annotations/JNIAdditionalImport.java
+++ /dev/null
@@ -1,35 +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.
-
-package org.chromium.base.annotations;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * JNIAdditionalImport is used by the JNI generator to qualify inner types used on JNI methods. Must
- * be used when an inner class is used from a class within the same package. Example:
- *
- * <pre>
- * @JNIAdditionImport(Foo.class)
- * public class Bar {
- *     @CalledByNative static void doSomethingWithInner(Foo.Inner inner) {
- *     ...
- *     }
- * }
- * <pre>
- * <p>
- * Notes:
- * 1) Foo must be in the same package as Bar
- * 2) For classes in different packages, they should be imported as:
- *    import other.package.Foo;
- *    and this annotation should not be used.
- */
-@Target(ElementType.TYPE)
-@Retention(RetentionPolicy.CLASS)
-public @interface JNIAdditionalImport {
-    Class<?>[] value();
-}
diff --git a/base/android/java/src/org/chromium/base/annotations/JNINamespace.java b/base/android/java/src/org/chromium/base/annotations/JNINamespace.java
deleted file mode 100644
index 4cd5531..0000000
--- a/base/android/java/src/org/chromium/base/annotations/JNINamespace.java
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 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.
-
-package org.chromium.base.annotations;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * @JNINamespace is used by the JNI generator to create the necessary JNI
- * bindings and expose this method to native code using the specified namespace.
- */
-@Target(ElementType.TYPE)
-@Retention(RetentionPolicy.RUNTIME)
-public @interface JNINamespace {
-    public String value();
-}
diff --git a/base/android/java/src/org/chromium/base/annotations/MainDex.java b/base/android/java/src/org/chromium/base/annotations/MainDex.java
deleted file mode 100644
index 0b35ade..0000000
--- a/base/android/java/src/org/chromium/base/annotations/MainDex.java
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.base.annotations;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * An annotation that signals that a class should be kept in the main dex file.
- *
- * This generally means it's used by renderer processes, which can't load secondary dexes
- * on K and below.
- */
-@Target(ElementType.TYPE)
-@Retention(RetentionPolicy.CLASS)
-public @interface MainDex {
-}
diff --git a/base/android/java/src/org/chromium/base/annotations/NativeCall.java b/base/android/java/src/org/chromium/base/annotations/NativeCall.java
deleted file mode 100644
index b69cd17..0000000
--- a/base/android/java/src/org/chromium/base/annotations/NativeCall.java
+++ /dev/null
@@ -1,24 +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.
-
-package org.chromium.base.annotations;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * @NativeCall is used by the JNI generator to create the necessary JNI bindings
- * so a native function can be bound to a Java inner class. The native class for
- * which the JNI method will be generated is specified by the first parameter.
- */
-@Target(ElementType.METHOD)
-@Retention(RetentionPolicy.CLASS)
-public @interface NativeCall {
-    /*
-     * Value determines which native class the method should map to.
-     */
-    public String value() default "";
-}
diff --git a/base/android/java/src/org/chromium/base/annotations/NativeClassQualifiedName.java b/base/android/java/src/org/chromium/base/annotations/NativeClassQualifiedName.java
deleted file mode 100644
index afbc368..0000000
--- a/base/android/java/src/org/chromium/base/annotations/NativeClassQualifiedName.java
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 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.
-
-package org.chromium.base.annotations;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * @NativeClassQualifiedName is used by the JNI generator to create the necessary JNI
- * bindings to call into the specified native class name.
- */
-@Target(ElementType.METHOD)
-@Retention(RetentionPolicy.RUNTIME)
-public @interface NativeClassQualifiedName {
-    /*
-     * Tells which native class the method is going to be bound to.
-     * The first parameter of the annotated method must be an int nativePtr pointing to
-     * an instance of this class.
-     */
-    public String value();
-}
diff --git a/base/android/java/src/org/chromium/base/annotations/RemovableInRelease.java b/base/android/java/src/org/chromium/base/annotations/RemovableInRelease.java
deleted file mode 100644
index 2191334..0000000
--- a/base/android/java/src/org/chromium/base/annotations/RemovableInRelease.java
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.base.annotations;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Target;
-
-/**
- * The annotated function can be removed in release builds.
- *
- * Calls to this function will be removed if its return value is not used. If all calls are removed,
- * the function definition itself will be candidate for removal.
- * It works by indicating to Proguard that the function has no side effects.
- */
-@Target({ElementType.METHOD, ElementType.CONSTRUCTOR})
-public @interface RemovableInRelease {}
diff --git a/base/android/java/src/org/chromium/base/annotations/SuppressFBWarnings.java b/base/android/java/src/org/chromium/base/annotations/SuppressFBWarnings.java
deleted file mode 100644
index 89068ac..0000000
--- a/base/android/java/src/org/chromium/base/annotations/SuppressFBWarnings.java
+++ /dev/null
@@ -1,20 +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.
-
-package org.chromium.base.annotations;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- *  @SuppressFBWarnings is used to suppress FindBugs warnings.
- *
- *  The long name of FindBugs warnings can be found at
- *  http://findbugs.sourceforge.net/bugDescriptions.html
- */
-@Retention(RetentionPolicy.CLASS)
-public @interface SuppressFBWarnings {
-    String[] value() default {};
-    String justification() default "";
-}
diff --git a/base/android/java/src/org/chromium/base/annotations/UsedByReflection.java b/base/android/java/src/org/chromium/base/annotations/UsedByReflection.java
deleted file mode 100644
index a2af704..0000000
--- a/base/android/java/src/org/chromium/base/annotations/UsedByReflection.java
+++ /dev/null
@@ -1,24 +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.
-
-package org.chromium.base.annotations;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Target;
-
-/**
- * Annotation used for marking methods and fields that are called by reflection.
- * Useful for keeping components that would otherwise be removed by Proguard.
- * Use the value parameter to mention a file that calls this method.
- *
- * Note that adding this annotation to a method is not enough to guarantee that
- * it is kept - either its class must be referenced elsewhere in the program, or
- * the class must be annotated with this as well.
- */
-@Target({
-        ElementType.METHOD, ElementType.FIELD, ElementType.TYPE,
-        ElementType.CONSTRUCTOR })
-public @interface UsedByReflection {
-    String value();
-}
diff --git a/base/android/java_runtime.cc b/base/android/java_runtime.cc
deleted file mode 100644
index 5fae49a..0000000
--- a/base/android/java_runtime.cc
+++ /dev/null
@@ -1,21 +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/android/java_runtime.h"
-
-#include "jni/Runtime_jni.h"
-
-namespace base {
-namespace android {
-
-void JavaRuntime::GetMemoryUsage(long* total_memory, long* free_memory) {
-  JNIEnv* env = base::android::AttachCurrentThread();
-  base::android::ScopedJavaLocalRef<jobject> runtime =
-      JNI_Runtime::Java_Runtime_getRuntime(env);
-  *total_memory = JNI_Runtime::Java_Runtime_totalMemory(env, runtime);
-  *free_memory = JNI_Runtime::Java_Runtime_freeMemory(env, runtime);
-}
-
-}  // namespace android
-}  // namespace base
diff --git a/base/android/java_runtime.h b/base/android/java_runtime.h
deleted file mode 100644
index 2034fb9..0000000
--- a/base/android/java_runtime.h
+++ /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.
-
-#ifndef BASE_ANDROID_JAVA_RUNTIME_H_
-#define BASE_ANDROID_JAVA_RUNTIME_H_
-
-#include "base/android/scoped_java_ref.h"
-#include "base/base_export.h"
-
-namespace base {
-namespace android {
-
-// Wrapper class for using the java.lang.Runtime object from jni.
-class BASE_EXPORT JavaRuntime {
- public:
-  // Fills the total memory used and memory allocated for objects by the java
-  // heap in the current process. Returns true on success.
-  static void GetMemoryUsage(long* total_memory, long* free_memory);
-};
-
-}  // namespace android
-}  // namespace base
-
-#endif  // BASE_ANDROID_JAVA_RUNTIME_H_
diff --git a/base/android/jni_android.cc b/base/android/jni_android.cc
deleted file mode 100644
index 2b5869f..0000000
--- a/base/android/jni_android.cc
+++ /dev/null
@@ -1,320 +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 "base/android/jni_android.h"
-
-#include <stddef.h>
-
-#include <map>
-
-#include "base/android/build_info.h"
-#include "base/android/jni_string.h"
-// Removed unused headers. TODO(hidehiko): Upstream.
-// #include "base/android/jni_utils.h"
-#include "base/debug/debugging_flags.h"
-#include "base/lazy_instance.h"
-#include "base/logging.h"
-#include "base/threading/thread_local.h"
-
-namespace {
-using base::android::GetClass;
-using base::android::MethodID;
-using base::android::ScopedJavaLocalRef;
-
-base::android::JniRegistrationType g_jni_registration_type =
-    base::android::ALL_JNI_REGISTRATION;
-
-JavaVM* g_jvm = NULL;
-base::LazyInstance<base::android::ScopedJavaGlobalRef<jobject>>::Leaky
-    g_class_loader = LAZY_INSTANCE_INITIALIZER;
-jmethodID g_class_loader_load_class_method_id = 0;
-
-#if BUILDFLAG(ENABLE_PROFILING) && HAVE_TRACE_STACK_FRAME_POINTERS
-base::LazyInstance<base::ThreadLocalPointer<void>>::Leaky
-    g_stack_frame_pointer = LAZY_INSTANCE_INITIALIZER;
-#endif
-
-}  // namespace
-
-namespace base {
-namespace android {
-
-JniRegistrationType GetJniRegistrationType() {
-  return g_jni_registration_type;
-}
-
-void SetJniRegistrationType(JniRegistrationType jni_registration_type) {
-  g_jni_registration_type = jni_registration_type;
-}
-
-JNIEnv* AttachCurrentThread() {
-  DCHECK(g_jvm);
-  JNIEnv* env = NULL;
-  jint ret = g_jvm->AttachCurrentThread(&env, NULL);
-  DCHECK_EQ(JNI_OK, ret);
-  return env;
-}
-
-JNIEnv* AttachCurrentThreadWithName(const std::string& thread_name) {
-  DCHECK(g_jvm);
-  JavaVMAttachArgs args;
-  args.version = JNI_VERSION_1_2;
-  args.name = thread_name.c_str();
-  args.group = NULL;
-  JNIEnv* env = NULL;
-  jint ret = g_jvm->AttachCurrentThread(&env, &args);
-  DCHECK_EQ(JNI_OK, ret);
-  return env;
-}
-
-void DetachFromVM() {
-  // Ignore the return value, if the thread is not attached, DetachCurrentThread
-  // will fail. But it is ok as the native thread may never be attached.
-  if (g_jvm)
-    g_jvm->DetachCurrentThread();
-}
-
-void InitVM(JavaVM* vm) {
-  DCHECK(!g_jvm || g_jvm == vm);
-  g_jvm = vm;
-}
-
-bool IsVMInitialized() {
-  return g_jvm != NULL;
-}
-
-void InitReplacementClassLoader(JNIEnv* env,
-                                const JavaRef<jobject>& class_loader) {
-  DCHECK(g_class_loader.Get().is_null());
-  DCHECK(!class_loader.is_null());
-
-  ScopedJavaLocalRef<jclass> class_loader_clazz =
-      GetClass(env, "java/lang/ClassLoader");
-  CHECK(!ClearException(env));
-  g_class_loader_load_class_method_id =
-      env->GetMethodID(class_loader_clazz.obj(),
-                       "loadClass",
-                       "(Ljava/lang/String;)Ljava/lang/Class;");
-  CHECK(!ClearException(env));
-
-  DCHECK(env->IsInstanceOf(class_loader.obj(), class_loader_clazz.obj()));
-  g_class_loader.Get().Reset(class_loader);
-}
-
-ScopedJavaLocalRef<jclass> GetClass(JNIEnv* env, const char* class_name) {
-  jclass clazz;
-  if (!g_class_loader.Get().is_null()) {
-    // ClassLoader.loadClass expects a classname with components separated by
-    // dots instead of the slashes that JNIEnv::FindClass expects. The JNI
-    // generator generates names with slashes, so we have to replace them here.
-    // TODO(torne): move to an approach where we always use ClassLoader except
-    // for the special case of base::android::GetClassLoader(), and change the
-    // JNI generator to generate dot-separated names. http://crbug.com/461773
-    size_t bufsize = strlen(class_name) + 1;
-    char dotted_name[bufsize];
-    memmove(dotted_name, class_name, bufsize);
-    for (size_t i = 0; i < bufsize; ++i) {
-      if (dotted_name[i] == '/') {
-        dotted_name[i] = '.';
-      }
-    }
-
-    clazz = static_cast<jclass>(
-        env->CallObjectMethod(g_class_loader.Get().obj(),
-                              g_class_loader_load_class_method_id,
-                              ConvertUTF8ToJavaString(env, dotted_name).obj()));
-  } else {
-    clazz = env->FindClass(class_name);
-  }
-  if (ClearException(env) || !clazz) {
-    LOG(FATAL) << "Failed to find class " << class_name;
-  }
-  return ScopedJavaLocalRef<jclass>(env, clazz);
-}
-
-jclass LazyGetClass(
-    JNIEnv* env,
-    const char* class_name,
-    base::subtle::AtomicWord* atomic_class_id) {
-  static_assert(sizeof(subtle::AtomicWord) >= sizeof(jclass),
-                "AtomicWord can't be smaller than jclass");
-  subtle::AtomicWord value = base::subtle::Acquire_Load(atomic_class_id);
-  if (value)
-    return reinterpret_cast<jclass>(value);
-  ScopedJavaGlobalRef<jclass> clazz;
-  clazz.Reset(GetClass(env, class_name));
-  subtle::AtomicWord null_aw = reinterpret_cast<subtle::AtomicWord>(NULL);
-  subtle::AtomicWord cas_result = base::subtle::Release_CompareAndSwap(
-      atomic_class_id,
-      null_aw,
-      reinterpret_cast<subtle::AtomicWord>(clazz.obj()));
-  if (cas_result == null_aw) {
-    // We intentionally leak the global ref since we now storing it as a raw
-    // pointer in |atomic_class_id|.
-    return clazz.Release();
-  } else {
-    return reinterpret_cast<jclass>(cas_result);
-  }
-}
-
-template<MethodID::Type type>
-jmethodID MethodID::Get(JNIEnv* env,
-                        jclass clazz,
-                        const char* method_name,
-                        const char* jni_signature) {
-  jmethodID id = type == TYPE_STATIC ?
-      env->GetStaticMethodID(clazz, method_name, jni_signature) :
-      env->GetMethodID(clazz, method_name, jni_signature);
-  if (base::android::ClearException(env) || !id) {
-    LOG(FATAL) << "Failed to find " <<
-        (type == TYPE_STATIC ? "static " : "") <<
-        "method " << method_name << " " << jni_signature;
-  }
-  return id;
-}
-
-// If |atomic_method_id| set, it'll return immediately. Otherwise, it'll call
-// into ::Get() above. If there's a race, it's ok since the values are the same
-// (and the duplicated effort will happen only once).
-template<MethodID::Type type>
-jmethodID MethodID::LazyGet(JNIEnv* env,
-                            jclass clazz,
-                            const char* method_name,
-                            const char* jni_signature,
-                            base::subtle::AtomicWord* atomic_method_id) {
-  static_assert(sizeof(subtle::AtomicWord) >= sizeof(jmethodID),
-                "AtomicWord can't be smaller than jMethodID");
-  subtle::AtomicWord value = base::subtle::Acquire_Load(atomic_method_id);
-  if (value)
-    return reinterpret_cast<jmethodID>(value);
-  jmethodID id = MethodID::Get<type>(env, clazz, method_name, jni_signature);
-  base::subtle::Release_Store(
-      atomic_method_id, reinterpret_cast<subtle::AtomicWord>(id));
-  return id;
-}
-
-// Various template instantiations.
-template jmethodID MethodID::Get<MethodID::TYPE_STATIC>(
-    JNIEnv* env, jclass clazz, const char* method_name,
-    const char* jni_signature);
-
-template jmethodID MethodID::Get<MethodID::TYPE_INSTANCE>(
-    JNIEnv* env, jclass clazz, const char* method_name,
-    const char* jni_signature);
-
-template jmethodID MethodID::LazyGet<MethodID::TYPE_STATIC>(
-    JNIEnv* env, jclass clazz, const char* method_name,
-    const char* jni_signature, base::subtle::AtomicWord* atomic_method_id);
-
-template jmethodID MethodID::LazyGet<MethodID::TYPE_INSTANCE>(
-    JNIEnv* env, jclass clazz, const char* method_name,
-    const char* jni_signature, base::subtle::AtomicWord* atomic_method_id);
-
-bool HasException(JNIEnv* env) {
-  return env->ExceptionCheck() != JNI_FALSE;
-}
-
-bool ClearException(JNIEnv* env) {
-  if (!HasException(env))
-    return false;
-  env->ExceptionDescribe();
-  env->ExceptionClear();
-  return true;
-}
-
-void CheckException(JNIEnv* env) {
-  if (!HasException(env))
-    return;
-
-  // Exception has been found, might as well tell breakpad about it.
-  jthrowable java_throwable = env->ExceptionOccurred();
-  if (java_throwable) {
-    // Clear the pending exception, since a local reference is now held.
-    env->ExceptionDescribe();
-    env->ExceptionClear();
-
-    // Set the exception_string in BuildInfo so that breakpad can read it.
-    // RVO should avoid any extra copies of the exception string.
-    base::android::BuildInfo::GetInstance()->SetJavaExceptionInfo(
-        GetJavaExceptionInfo(env, java_throwable));
-  }
-
-  // Now, feel good about it and die.
-  // TODO(lhchavez): Remove this hack. See b/28814913 for details.
-  // We're using BuildInfo's java_exception_info() instead of storing the
-  // exception info a few lines above to avoid extra copies. It will be
-  // truncated to 1024 bytes anyways.
-  const char* exception_string =
-      base::android::BuildInfo::GetInstance()->java_exception_info();
-  if (exception_string)
-    LOG(FATAL) << exception_string;
-  else
-    LOG(FATAL) << "Unhandled exception";
-}
-
-std::string GetJavaExceptionInfo(JNIEnv* env, jthrowable java_throwable) {
-  ScopedJavaLocalRef<jclass> throwable_clazz =
-      GetClass(env, "java/lang/Throwable");
-  jmethodID throwable_printstacktrace =
-      MethodID::Get<MethodID::TYPE_INSTANCE>(
-          env, throwable_clazz.obj(), "printStackTrace",
-          "(Ljava/io/PrintStream;)V");
-
-  // Create an instance of ByteArrayOutputStream.
-  ScopedJavaLocalRef<jclass> bytearray_output_stream_clazz =
-      GetClass(env, "java/io/ByteArrayOutputStream");
-  jmethodID bytearray_output_stream_constructor =
-      MethodID::Get<MethodID::TYPE_INSTANCE>(
-          env, bytearray_output_stream_clazz.obj(), "<init>", "()V");
-  jmethodID bytearray_output_stream_tostring =
-      MethodID::Get<MethodID::TYPE_INSTANCE>(
-          env, bytearray_output_stream_clazz.obj(), "toString",
-          "()Ljava/lang/String;");
-  ScopedJavaLocalRef<jobject> bytearray_output_stream(env,
-      env->NewObject(bytearray_output_stream_clazz.obj(),
-                     bytearray_output_stream_constructor));
-
-  // Create an instance of PrintStream.
-  ScopedJavaLocalRef<jclass> printstream_clazz =
-      GetClass(env, "java/io/PrintStream");
-  jmethodID printstream_constructor =
-      MethodID::Get<MethodID::TYPE_INSTANCE>(
-          env, printstream_clazz.obj(), "<init>",
-          "(Ljava/io/OutputStream;)V");
-  ScopedJavaLocalRef<jobject> printstream(env,
-      env->NewObject(printstream_clazz.obj(), printstream_constructor,
-                     bytearray_output_stream.obj()));
-
-  // Call Throwable.printStackTrace(PrintStream)
-  env->CallVoidMethod(java_throwable, throwable_printstacktrace,
-      printstream.obj());
-
-  // Call ByteArrayOutputStream.toString()
-  ScopedJavaLocalRef<jstring> exception_string(
-      env, static_cast<jstring>(
-          env->CallObjectMethod(bytearray_output_stream.obj(),
-                                bytearray_output_stream_tostring)));
-
-  return ConvertJavaStringToUTF8(exception_string);
-}
-
-#if BUILDFLAG(ENABLE_PROFILING) && HAVE_TRACE_STACK_FRAME_POINTERS
-
-JNIStackFrameSaver::JNIStackFrameSaver(void* current_fp) {
-  previous_fp_ = g_stack_frame_pointer.Pointer()->Get();
-  g_stack_frame_pointer.Pointer()->Set(current_fp);
-}
-
-JNIStackFrameSaver::~JNIStackFrameSaver() {
-  g_stack_frame_pointer.Pointer()->Set(previous_fp_);
-}
-
-void* JNIStackFrameSaver::SavedFrame() {
-  return g_stack_frame_pointer.Pointer()->Get();
-}
-
-#endif  // ENABLE_PROFILING && HAVE_TRACE_STACK_FRAME_POINTERS
-
-}  // namespace android
-}  // namespace base
diff --git a/base/android/jni_android.h b/base/android/jni_android.h
deleted file mode 100644
index de53c10..0000000
--- a/base/android/jni_android.h
+++ /dev/null
@@ -1,190 +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.
-
-#ifndef BASE_ANDROID_JNI_ANDROID_H_
-#define BASE_ANDROID_JNI_ANDROID_H_
-
-#include <jni.h>
-#include <sys/types.h>
-
-#include <string>
-
-#include "base/android/scoped_java_ref.h"
-#include "base/atomicops.h"
-#include "base/base_export.h"
-#include "base/compiler_specific.h"
-#include "base/debug/stack_trace.h"
-#include "base/macros.h"
-
-#if HAVE_TRACE_STACK_FRAME_POINTERS
-
-// When profiling is enabled (enable_profiling=true) this macro is added to
-// all generated JNI stubs so that it becomes the last thing that runs before
-// control goes into Java.
-//
-// This macro saves stack frame pointer of the current function. Saved value
-// used later by JNI_LINK_SAVED_FRAME_POINTER.
-#define JNI_SAVE_FRAME_POINTER \
-  base::android::JNIStackFrameSaver jni_frame_saver(__builtin_frame_address(0))
-
-// When profiling is enabled (enable_profiling=true) this macro is added to
-// all generated JNI callbacks so that it becomes the first thing that runs
-// after control returns from Java.
-//
-// This macro links stack frame of the current function to the stack frame
-// saved by JNI_SAVE_FRAME_POINTER, allowing frame-based unwinding
-// (used by the heap profiler) to produce complete traces.
-#define JNI_LINK_SAVED_FRAME_POINTER                    \
-  base::debug::ScopedStackFrameLinker jni_frame_linker( \
-      __builtin_frame_address(0),                       \
-      base::android::JNIStackFrameSaver::SavedFrame())
-
-#else
-
-// Frame-based stack unwinding is not supported, do nothing.
-#define JNI_SAVE_FRAME_POINTER
-#define JNI_LINK_SAVED_FRAME_POINTER
-
-#endif  // HAVE_TRACE_STACK_FRAME_POINTERS
-
-namespace base {
-namespace android {
-
-// Used to mark symbols to be exported in a shared library's symbol table.
-#define JNI_EXPORT __attribute__ ((visibility("default")))
-
-// The level of JNI registration required for the current process.
-enum JniRegistrationType {
-  // Register all native methods.
-  ALL_JNI_REGISTRATION,
-  // Register some native methods, as controlled by the jni_generator.
-  SELECTIVE_JNI_REGISTRATION,
-  // Do not register any native methods.
-  NO_JNI_REGISTRATION,
-};
-
-BASE_EXPORT JniRegistrationType GetJniRegistrationType();
-
-// Set the JniRegistrationType for this process (defaults to
-// ALL_JNI_REGISTRATION). This should be called in the JNI_OnLoad function
-// which is called when the native library is first loaded.
-BASE_EXPORT void SetJniRegistrationType(
-    JniRegistrationType jni_registration_type);
-
-// Contains the registration method information for initializing JNI bindings.
-struct RegistrationMethod {
-  const char* name;
-  bool (*func)(JNIEnv* env);
-};
-
-// Attaches the current thread to the VM (if necessary) and return the JNIEnv*.
-BASE_EXPORT JNIEnv* AttachCurrentThread();
-
-// Same to AttachCurrentThread except that thread name will be set to
-// |thread_name| if it is the first call. Otherwise, thread_name won't be
-// changed. AttachCurrentThread() doesn't regard underlying platform thread
-// name, but just resets it to "Thread-???". This function should be called
-// right after new thread is created if it is important to keep thread name.
-BASE_EXPORT JNIEnv* AttachCurrentThreadWithName(const std::string& thread_name);
-
-// Detaches the current thread from VM if it is attached.
-BASE_EXPORT void DetachFromVM();
-
-// Initializes the global JVM.
-BASE_EXPORT void InitVM(JavaVM* vm);
-
-// Returns true if the global JVM has been initialized.
-BASE_EXPORT bool IsVMInitialized();
-
-// Initializes the global ClassLoader used by the GetClass and LazyGetClass
-// methods. This is needed because JNI will use the base ClassLoader when there
-// is no Java code on the stack. The base ClassLoader doesn't know about any of
-// the application classes and will fail to lookup anything other than system
-// classes.
-BASE_EXPORT void InitReplacementClassLoader(
-    JNIEnv* env,
-    const JavaRef<jobject>& class_loader);
-
-// Finds the class named |class_name| and returns it.
-// Use this method instead of invoking directly the JNI FindClass method (to
-// prevent leaking local references).
-// This method triggers a fatal assertion if the class could not be found.
-// Use HasClass if you need to check whether the class exists.
-BASE_EXPORT ScopedJavaLocalRef<jclass> GetClass(JNIEnv* env,
-                                                const char* class_name);
-
-// The method will initialize |atomic_class_id| to contain a global ref to the
-// class. And will return that ref on subsequent calls.  It's the caller's
-// responsibility to release the ref when it is no longer needed.
-// The caller is responsible to zero-initialize |atomic_method_id|.
-// It's fine to simultaneously call this on multiple threads referencing the
-// same |atomic_method_id|.
-BASE_EXPORT jclass LazyGetClass(
-    JNIEnv* env,
-    const char* class_name,
-    base::subtle::AtomicWord* atomic_class_id);
-
-// This class is a wrapper for JNIEnv Get(Static)MethodID.
-class BASE_EXPORT MethodID {
- public:
-  enum Type {
-    TYPE_STATIC,
-    TYPE_INSTANCE,
-  };
-
-  // Returns the method ID for the method with the specified name and signature.
-  // This method triggers a fatal assertion if the method could not be found.
-  template<Type type>
-  static jmethodID Get(JNIEnv* env,
-                       jclass clazz,
-                       const char* method_name,
-                       const char* jni_signature);
-
-  // The caller is responsible to zero-initialize |atomic_method_id|.
-  // It's fine to simultaneously call this on multiple threads referencing the
-  // same |atomic_method_id|.
-  template<Type type>
-  static jmethodID LazyGet(JNIEnv* env,
-                           jclass clazz,
-                           const char* method_name,
-                           const char* jni_signature,
-                           base::subtle::AtomicWord* atomic_method_id);
-};
-
-// Returns true if an exception is pending in the provided JNIEnv*.
-BASE_EXPORT bool HasException(JNIEnv* env);
-
-// If an exception is pending in the provided JNIEnv*, this function clears it
-// and returns true.
-BASE_EXPORT bool ClearException(JNIEnv* env);
-
-// This function will call CHECK() macro if there's any pending exception.
-BASE_EXPORT void CheckException(JNIEnv* env);
-
-// This returns a string representation of the java stack trace.
-BASE_EXPORT std::string GetJavaExceptionInfo(JNIEnv* env,
-                                             jthrowable java_throwable);
-
-#if HAVE_TRACE_STACK_FRAME_POINTERS
-
-// Saves caller's PC and stack frame in a thread-local variable.
-// Implemented only when profiling is enabled (enable_profiling=true).
-class BASE_EXPORT JNIStackFrameSaver {
- public:
-  JNIStackFrameSaver(void* current_fp);
-  ~JNIStackFrameSaver();
-  static void* SavedFrame();
-
- private:
-  void* previous_fp_;
-
-  DISALLOW_COPY_AND_ASSIGN(JNIStackFrameSaver);
-};
-
-#endif  // HAVE_TRACE_STACK_FRAME_POINTERS
-
-}  // namespace android
-}  // namespace base
-
-#endif  // BASE_ANDROID_JNI_ANDROID_H_
diff --git a/base/android/jni_android_unittest.cc b/base/android/jni_android_unittest.cc
deleted file mode 100644
index dabd480..0000000
--- a/base/android/jni_android_unittest.cc
+++ /dev/null
@@ -1,61 +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 "base/android/jni_android.h"
-
-#include "base/at_exit.h"
-#include "base/logging.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace android {
-
-namespace {
-
-base::subtle::AtomicWord g_atomic_id = 0;
-int LazyMethodIDCall(JNIEnv* env, jclass clazz, int p) {
-  jmethodID id = base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_STATIC>(
-      env, clazz,
-      "abs",
-      "(I)I",
-      &g_atomic_id);
-
-  return env->CallStaticIntMethod(clazz, id, p);
-}
-
-int MethodIDCall(JNIEnv* env, jclass clazz, jmethodID id, int p) {
-  return env->CallStaticIntMethod(clazz, id, p);
-}
-
-}  // namespace
-
-TEST(JNIAndroidMicrobenchmark, MethodId) {
-  JNIEnv* env = AttachCurrentThread();
-  ScopedJavaLocalRef<jclass> clazz(GetClass(env, "java/lang/Math"));
-  base::Time start_lazy = base::Time::Now();
-  int o = 0;
-  for (int i = 0; i < 1024; ++i)
-    o += LazyMethodIDCall(env, clazz.obj(), i);
-  base::Time end_lazy = base::Time::Now();
-
-  jmethodID id = reinterpret_cast<jmethodID>(g_atomic_id);
-  base::Time start = base::Time::Now();
-  for (int i = 0; i < 1024; ++i)
-    o += MethodIDCall(env, clazz.obj(), id, i);
-  base::Time end = base::Time::Now();
-
-  // On a Galaxy Nexus, results were in the range of:
-  // JNI LazyMethodIDCall (us) 1984
-  // JNI MethodIDCall (us) 1861
-  LOG(ERROR) << "JNI LazyMethodIDCall (us) " <<
-      base::TimeDelta(end_lazy - start_lazy).InMicroseconds();
-  LOG(ERROR) << "JNI MethodIDCall (us) " <<
-      base::TimeDelta(end - start).InMicroseconds();
-  LOG(ERROR) << "JNI " << o;
-}
-
-
-}  // namespace android
-}  // namespace base
diff --git a/base/android/jni_generator/android_jar.classes b/base/android/jni_generator/android_jar.classes
deleted file mode 100644
index 7d412ce..0000000
--- a/base/android/jni_generator/android_jar.classes
+++ /dev/null
@@ -1,98 +0,0 @@
-java/lang/AbstractMethodError.class
-java/lang/AbstractStringBuilder.class
-java/lang/Appendable.class
-java/lang/ArithmeticException.class
-java/lang/ArrayIndexOutOfBoundsException.class
-java/lang/ArrayStoreException.class
-java/lang/AssertionError.class
-java/lang/AutoCloseable.class
-java/lang/Boolean.class
-java/lang/Byte.class
-java/lang/Character.class
-java/lang/Character$Subset.class
-java/lang/Character$UnicodeBlock.class
-java/lang/CharSequence.class
-java/lang/ClassCastException.class
-java/lang/ClassCircularityError.class
-java/lang/Class.class
-java/lang/ClassFormatError.class
-java/lang/ClassLoader.class
-java/lang/ClassNotFoundException.class
-java/lang/Cloneable.class
-java/lang/CloneNotSupportedException.class
-java/lang/Comparable.class
-java/lang/Compiler.class
-java/lang/Deprecated.class
-java/lang/Double.class
-java/lang/Enum.class
-java/lang/EnumConstantNotPresentException.class
-java/lang/Error.class
-java/lang/Exception.class
-java/lang/ExceptionInInitializerError.class
-java/lang/Float.class
-java/lang/IllegalAccessError.class
-java/lang/IllegalAccessException.class
-java/lang/IllegalArgumentException.class
-java/lang/IllegalMonitorStateException.class
-java/lang/IllegalStateException.class
-java/lang/IncompatibleClassChangeError.class
-java/lang/IndexOutOfBoundsException.class
-java/lang/InheritableThreadLocal.class
-java/lang/InstantiationError.class
-java/lang/InstantiationException.class
-java/lang/Integer.class
-java/lang/InternalError.class
-java/lang/InterruptedException.class
-java/lang/Iterable.class
-java/lang/LinkageError.class
-java/lang/Long.class
-java/lang/Math.class
-java/lang/NegativeArraySizeException.class
-java/lang/NoClassDefFoundError.class
-java/lang/NoSuchFieldError.class
-java/lang/NoSuchFieldException.class
-java/lang/NoSuchMethodError.class
-java/lang/NoSuchMethodException.class
-java/lang/NullPointerException.class
-java/lang/Number.class
-java/lang/NumberFormatException.class
-java/lang/Object.class
-java/lang/OutOfMemoryError.class
-java/lang/Override.class
-java/lang/Package.class
-java/lang/ProcessBuilder.class
-java/lang/Process.class
-java/lang/Readable.class
-java/lang/ReflectiveOperationException.class
-java/lang/Runnable.class
-java/lang/Runtime.class
-java/lang/RuntimeException.class
-java/lang/RuntimePermission.class
-java/lang/SafeVarargs.class
-java/lang/SecurityException.class
-java/lang/SecurityManager.class
-java/lang/Short.class
-java/lang/StackOverflowError.class
-java/lang/StackTraceElement.class
-java/lang/StrictMath.class
-java/lang/StringBuffer.class
-java/lang/StringBuilder.class
-java/lang/String.class
-java/lang/StringIndexOutOfBoundsException.class
-java/lang/SuppressWarnings.class
-java/lang/System.class
-java/lang/Thread.class
-java/lang/ThreadDeath.class
-java/lang/ThreadGroup.class
-java/lang/ThreadLocal.class
-java/lang/Thread$State.class
-java/lang/Thread$UncaughtExceptionHandler.class
-java/lang/Throwable.class
-java/lang/TypeNotPresentException.class
-java/lang/UnknownError.class
-java/lang/UnsatisfiedLinkError.class
-java/lang/UnsupportedClassVersionError.class
-java/lang/UnsupportedOperationException.class
-java/lang/VerifyError.class
-java/lang/VirtualMachineError.class
-java/lang/Void.class
diff --git a/base/android/jni_generator/java/src/org/chromium/example/jni_generator/SampleForTests.java b/base/android/jni_generator/java/src/org/chromium/example/jni_generator/SampleForTests.java
deleted file mode 100644
index 42d8e56..0000000
--- a/base/android/jni_generator/java/src/org/chromium/example/jni_generator/SampleForTests.java
+++ /dev/null
@@ -1,318 +0,0 @@
-// Copyright 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.
-
-package org.chromium.example.jni_generator;
-
-import android.graphics.Rect;
-
-import org.chromium.base.annotations.AccessedByNative;
-import org.chromium.base.annotations.CalledByNative;
-import org.chromium.base.annotations.CalledByNativeUnchecked;
-import org.chromium.base.annotations.JNINamespace;
-import org.chromium.base.annotations.NativeCall;
-import org.chromium.base.annotations.NativeClassQualifiedName;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-// This class serves as a reference test for the bindings generator, and as example documentation
-// for how to use the jni generator.
-// The C++ counter-part is sample_for_tests.cc.
-// jni_generator/BUILD.gn has a jni_generator_tests target that will:
-//   * Generate a header file for the JNI bindings based on this file.
-//   * Compile sample_for_tests.cc using the generated header file.
-//   * link a native executable to prove the generated header + cc file are self-contained.
-// All comments are informational only, and are ignored by the jni generator.
-//
-// Binding C/C++ with Java is not trivial, specially when ownership and object lifetime
-// semantics needs to be managed across boundaries.
-// Following a few guidelines will make the code simpler and less buggy:
-//
-// - Never write any JNI "by hand". Rely on the bindings generator to have a thin
-// layer of type-safety.
-//
-// - Treat the types from the other side as "opaque" as possible. Do not inspect any
-// object directly, but rather, rely on well-defined getters / setters.
-//
-// - Minimize the surface API between the two sides, and rather than calling multiple
-// functions across boundaries, call only one (and then, internally in the other side,
-// call as many little functions as required).
-//
-// - If a Java object "owns" a native object, stash the pointer in a "long mNativeClassName".
-// Note that it needs to have a "destruction path", i.e., it must eventually call a method
-// to delete the native object (for example, the java object has a "close()" method that
-// in turn deletes the native object). Avoid relying on finalizers: those run in a different
-// thread and makes the native lifetime management more difficult.
-//
-// - For native object "owning" java objects:
-//   - If there's a strong 1:1 to relationship between native and java, the best way is to
-//   stash the java object into a base::android::ScopedJavaGlobalRef. This will ensure the
-//   java object can be GC'd once the native object is destroyed but note that this global strong
-//   ref implies a new GC root, so be sure it will not leak and it must never rely on being
-//   triggered (transitively) from a java side GC.
-//   - In all other cases, the native side should keep a JavaObjectWeakGlobalRef, and check whether
-//   that reference is still valid before de-referencing it. Note that you will need another
-//   java-side object to be holding a strong reference to this java object while it is in use, to
-//   avoid unpredictable GC of the object before native side has finished with it.
-//
-// - The best way to pass "compound" datatypes across in either direction is to create an inner
-// class with PODs and a factory function. If possible, make it immutable (i.e., mark all the
-// fields as "final"). See examples with "InnerStructB" below.
-//
-// - It's simpler to create thin wrappers with a well defined JNI interface than to
-// expose a lot of internal details. This is specially significant for system classes where it's
-// simpler to wrap factory methods and a few getters / setters than expose the entire class.
-//
-// - Use static factory functions annotated with @CalledByNative rather than calling the
-// constructors directly.
-//
-// - Iterate over containers where they are originally owned, then create inner structs or
-// directly call methods on the other side. It's much simpler than trying to amalgamate
-// java and stl containers.
-//
-// An important note about qualified class name resolution:
-// The generator doesn't compile the class and have little context about the
-// classes being passed through the JNI layers. It adds a few simple rules:
-//
-// - all classes are either explicitly imported, or they are assumed to be in
-// the same package.
-//
-// - Inner class needs to be done through an import and usage of the
-// outer class, so that the generator knows how to qualify it:
-// import foo.bar.Zoo;
-// void call(Zoo.Inner);
-//
-// - implicitly imported classes aren't supported, so in order to pass
-// things like Runnable, please import java.lang.Runnable;
-//
-// This JNINamespace annotation indicates that all native methods should be
-// generated inside this namespace, including the native class that this
-// object binds to.
-@JNINamespace("base::android")
-class SampleForTests {
-    // Classes can store their C++ pointer counter part as an int that is normally initialized by
-    // calling out a nativeInit() function. Replace "CPPClass" with your particular class name!
-    long mNativeCPPObject;
-
-    // You can define methods and attributes on the java class just like any other.
-    // Methods without the @CalledByNative annotation won't be exposed to JNI.
-    public SampleForTests() {
-    }
-
-    public void startExample() {
-        // Calls C++ Init(...) method and holds a pointer to the C++ class.
-        mNativeCPPObject = nativeInit("myParam");
-    }
-
-    public void doStuff() {
-        // This will call CPPClass::Method() using nativePtr as a pointer to the object. This must
-        // be done to:
-        // * avoid leaks.
-        // * using finalizers are not allowed to destroy the cpp class.
-        nativeMethod(mNativeCPPObject);
-    }
-
-    public void finishExample() {
-        // We're done, so let's destroy nativePtr object.
-        nativeDestroy(mNativeCPPObject);
-    }
-
-    // ---------------------------------------------------------------------------------------------
-    // The following methods demonstrate exporting Java methods for invocation from C++ code.
-    // Java functions are mapping into C global functions by prefixing the method name with
-    // "Java_<Class>_"
-    // This is triggered by the @CalledByNative annotation; the methods may be named as you wish.
-
-    // Exported to C++ as:
-    // Java_SampleForTests_javaMethod(JNIEnv* env, jobject caller, jint foo, jint bar)
-    // Typically the C++ code would have obtained the jobject via the Init() call described above.
-    @CalledByNative
-    public int javaMethod(int foo, int bar) {
-        return 0;
-    }
-
-    // Exported to C++ as Java_SampleForTests_staticJavaMethod(JNIEnv* env)
-    // Note no jobject argument, as it is static.
-    @CalledByNative
-    public static boolean staticJavaMethod() {
-        return true;
-    }
-
-    // No prefix, so this method is package private. It will still be exported.
-    @CalledByNative
-    void packagePrivateJavaMethod() {
-    }
-
-    // Note the "Unchecked" suffix. By default, @CalledByNative will always generate bindings that
-    // call CheckException(). With "@CalledByNativeUnchecked", the client C++ code is responsible to
-    // call ClearException() and act as appropriate.
-    // See more details at the "@CalledByNativeUnchecked" annotation.
-    @CalledByNativeUnchecked
-    void methodThatThrowsException() throws Exception {}
-
-    // The generator is not confused by inline comments:
-    // @CalledByNative void thisShouldNotAppearInTheOutput();
-    // @CalledByNativeUnchecked public static void neitherShouldThis(int foo);
-
-    /**
-     * The generator is not confused by block comments:
-     * @CalledByNative void thisShouldNotAppearInTheOutputEither();
-     * @CalledByNativeUnchecked public static void andDefinitelyNotThis(int foo);
-     */
-
-    // String constants that look like comments don't confuse the generator:
-    private String mArrgh = "*/*";
-
-    private @interface SomeAnnotation {}
-
-    // The generator is not confused by @Annotated parameters.
-    @CalledByNative
-    void javaMethodWithAnnotatedParam(@SomeAnnotation int foo) {
-    }
-
-    // ---------------------------------------------------------------------------------------------
-    // Java fields which are accessed from C++ code only must be annotated with @AccessedByNative to
-    // prevent them being eliminated when unreferenced code is stripped.
-    @AccessedByNative
-    private int mJavaField;
-
-    // ---------------------------------------------------------------------------------------------
-    // The following methods demonstrate declaring methods to call into C++ from Java.
-    // The generator detects the "native" and "static" keywords, the type and name of the first
-    // parameter, and the "native" prefix to the function name to determine the C++ function
-    // signatures. Besides these constraints the methods can be freely named.
-
-    // This declares a C++ function which the application code must implement:
-    // static jint Init(JNIEnv* env, jobject caller);
-    // The jobject parameter refers back to this java side object instance.
-    // The implementation must return the pointer to the C++ object cast to jint.
-    // The caller of this method should store it, and supply it as a the nativeCPPClass param to
-    // subsequent native method calls (see the methods below that take an "int native..." as first
-    // param).
-    private native long nativeInit(String param);
-
-    // This defines a function binding to the associated C++ class member function. The name is
-    // derived from |nativeDestroy| and |nativeCPPClass| to arrive at CPPClass::Destroy() (i.e.
-    // native prefixes stripped).
-    //
-    // The |nativeCPPClass| is automatically cast to type CPPClass*, in order to obtain the object
-    // on
-    // which to invoke the member function. Replace "CPPClass" with your particular class name!
-    private native void nativeDestroy(long nativeCPPClass);
-
-    // This declares a C++ function which the application code must implement:
-    // static jdouble GetDoubleFunction(JNIEnv* env, jobject caller);
-    // The jobject parameter refers back to this java side object instance.
-    private native double nativeGetDoubleFunction();
-
-    // Similar to nativeGetDoubleFunction(), but here the C++ side will receive a jclass rather than
-    // jobject param, as the function is declared static.
-    private static native float nativeGetFloatFunction();
-
-    // This function takes a non-POD datatype. We have a list mapping them to their full classpath
-    // in jni_generator.py JavaParamToJni. If you require a new datatype, make sure you add to that
-    // function.
-    private native void nativeSetNonPODDatatype(Rect rect);
-
-    // This declares a C++ function which the application code must implement:
-    // static ScopedJavaLocalRef<jobject> GetNonPODDatatype(JNIEnv* env, jobject caller);
-    // The jobject parameter refers back to this java side object instance.
-    // Note that it returns a ScopedJavaLocalRef<jobject> so that you don' have to worry about
-    // deleting the JNI local reference. This is similar with Strings and arrays.
-    private native Object nativeGetNonPODDatatype();
-
-    // Similar to nativeDestroy above, this will cast nativeCPPClass into pointer of CPPClass type
-    // and call its Method member function. Replace "CPPClass" with your particular class name!
-    private native int nativeMethod(long nativeCPPClass);
-
-    // Similar to nativeMethod above, but here the C++ fully qualified class name is taken from the
-    // annotation rather than parameter name, which can thus be chosen freely.
-    @NativeClassQualifiedName("CPPClass::InnerClass")
-    private native double nativeMethodOtherP0(long nativePtr);
-
-    // This "struct" will be created by the native side using |createInnerStructA|,
-    // and used by the java-side somehow.
-    // Note that |@CalledByNative| has to contain the inner class name.
-    static class InnerStructA {
-        private final long mLong;
-        private final int mInt;
-        private final String mString;
-
-        private InnerStructA(long l, int i, String s) {
-            mLong = l;
-            mInt = i;
-            mString = s;
-        }
-
-        @CalledByNative("InnerStructA")
-        private static InnerStructA create(long l, int i, String s) {
-            return new InnerStructA(l, i, s);
-        }
-    }
-
-    private List<InnerStructA> mListInnerStructA = new ArrayList<InnerStructA>();
-
-    @CalledByNative
-    private void addStructA(InnerStructA a) {
-        // Called by the native side to append another element.
-        mListInnerStructA.add(a);
-    }
-
-    @CalledByNative
-    private void iterateAndDoSomething() {
-        Iterator<InnerStructA> it = mListInnerStructA.iterator();
-        while (it.hasNext()) {
-            InnerStructA element = it.next();
-            // Now, do something with element.
-        }
-        // Done, clear the list.
-        mListInnerStructA.clear();
-    }
-
-    // This "struct" will be created by the java side passed to native, which
-    // will use its getters.
-    // Note that |@CalledByNative| has to contain the inner class name.
-    static class InnerStructB {
-        private final long mKey;
-        private final String mValue;
-
-        private InnerStructB(long k, String v) {
-            mKey = k;
-            mValue = v;
-        }
-
-        @CalledByNative("InnerStructB")
-        private long getKey() {
-            return mKey;
-        }
-
-        @CalledByNative("InnerStructB")
-        private String getValue() {
-            return mValue;
-        }
-    }
-
-    List<InnerStructB> mListInnerStructB = new ArrayList<InnerStructB>();
-
-    void iterateAndDoSomethingWithMap() {
-        Iterator<InnerStructB> it = mListInnerStructB.iterator();
-        while (it.hasNext()) {
-            InnerStructB element = it.next();
-            // Now, do something with element.
-            nativeAddStructB(mNativeCPPObject, element);
-        }
-        nativeIterateAndDoSomethingWithStructB(mNativeCPPObject);
-    }
-
-    native void nativeAddStructB(long nativeCPPClass, InnerStructB b);
-    native void nativeIterateAndDoSomethingWithStructB(long nativeCPPClass);
-    native String nativeReturnAString(long nativeCPPClass);
-
-    // This inner class shows how to annotate native methods on inner classes.
-    static class InnerClass {
-        @NativeCall("InnerClass")
-        private static native int nativeGetInnerIntFunction();
-    }
-}
diff --git a/base/android/jni_generator/jni_generator.py b/base/android/jni_generator/jni_generator.py
deleted file mode 100755
index 99d8b42..0000000
--- a/base/android/jni_generator/jni_generator.py
+++ /dev/null
@@ -1,1418 +0,0 @@
-#!/usr/bin/env python
-# 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.
-
-"""Extracts native methods from a Java file and generates the JNI bindings.
-If you change this, please run and update the tests."""
-
-import collections
-import errno
-import optparse
-import os
-import re
-import string
-from string import Template
-import subprocess
-import sys
-import textwrap
-import zipfile
-
-CHROMIUM_SRC = os.path.join(
-    os.path.dirname(__file__), os.pardir, os.pardir, os.pardir)
-BUILD_ANDROID_GYP = os.path.join(
-    CHROMIUM_SRC, 'build', 'android', 'gyp')
-
-sys.path.append(BUILD_ANDROID_GYP)
-
-from util import build_utils
-
-
-class ParseError(Exception):
-  """Exception thrown when we can't parse the input file."""
-
-  def __init__(self, description, *context_lines):
-    Exception.__init__(self)
-    self.description = description
-    self.context_lines = context_lines
-
-  def __str__(self):
-    context = '\n'.join(self.context_lines)
-    return '***\nERROR: %s\n\n%s\n***' % (self.description, context)
-
-
-class Param(object):
-  """Describes a param for a method, either java or native."""
-
-  def __init__(self, **kwargs):
-    self.datatype = kwargs['datatype']
-    self.name = kwargs['name']
-
-
-class NativeMethod(object):
-  """Describes a C/C++ method that is called by Java code"""
-
-  def __init__(self, **kwargs):
-    self.static = kwargs['static']
-    self.java_class_name = kwargs['java_class_name']
-    self.return_type = kwargs['return_type']
-    self.name = kwargs['name']
-    self.params = kwargs['params']
-    if self.params:
-      assert type(self.params) is list
-      assert type(self.params[0]) is Param
-    if (self.params and
-        self.params[0].datatype == kwargs.get('ptr_type', 'int') and
-        self.params[0].name.startswith('native')):
-      self.type = 'method'
-      self.p0_type = self.params[0].name[len('native'):]
-      if kwargs.get('native_class_name'):
-        self.p0_type = kwargs['native_class_name']
-    else:
-      self.type = 'function'
-    self.method_id_var_name = kwargs.get('method_id_var_name', None)
-
-
-class CalledByNative(object):
-  """Describes a java method exported to c/c++"""
-
-  def __init__(self, **kwargs):
-    self.system_class = kwargs['system_class']
-    self.unchecked = kwargs['unchecked']
-    self.static = kwargs['static']
-    self.java_class_name = kwargs['java_class_name']
-    self.return_type = kwargs['return_type']
-    self.name = kwargs['name']
-    self.params = kwargs['params']
-    self.method_id_var_name = kwargs.get('method_id_var_name', None)
-    self.signature = kwargs.get('signature')
-    self.is_constructor = kwargs.get('is_constructor', False)
-    self.env_call = GetEnvCall(self.is_constructor, self.static,
-                               self.return_type)
-    self.static_cast = GetStaticCastForReturnType(self.return_type)
-
-
-class ConstantField(object):
-  def __init__(self, **kwargs):
-    self.name = kwargs['name']
-    self.value = kwargs['value']
-
-
-def JavaDataTypeToC(java_type):
-  """Returns a C datatype for the given java type."""
-  java_pod_type_map = {
-      'int': 'jint',
-      'byte': 'jbyte',
-      'char': 'jchar',
-      'short': 'jshort',
-      'boolean': 'jboolean',
-      'long': 'jlong',
-      'double': 'jdouble',
-      'float': 'jfloat',
-  }
-  java_type_map = {
-      'void': 'void',
-      'String': 'jstring',
-      'Throwable': 'jthrowable',
-      'java/lang/String': 'jstring',
-      'java/lang/Class': 'jclass',
-      'java/lang/Throwable': 'jthrowable',
-  }
-
-  if java_type in java_pod_type_map:
-    return java_pod_type_map[java_type]
-  elif java_type in java_type_map:
-    return java_type_map[java_type]
-  elif java_type.endswith('[]'):
-    if java_type[:-2] in java_pod_type_map:
-      return java_pod_type_map[java_type[:-2]] + 'Array'
-    return 'jobjectArray'
-  elif java_type.startswith('Class'):
-    # Checking just the start of the name, rather than a direct comparison,
-    # in order to handle generics.
-    return 'jclass'
-  else:
-    return 'jobject'
-
-
-def WrapCTypeForDeclaration(c_type):
-  """Wrap the C datatype in a JavaRef if required."""
-  if re.match(RE_SCOPED_JNI_TYPES, c_type):
-    return 'const base::android::JavaParamRef<' + c_type + '>&'
-  else:
-    return c_type
-
-
-def JavaDataTypeToCForDeclaration(java_type):
-  """Returns a JavaRef-wrapped C datatype for the given java type."""
-  return WrapCTypeForDeclaration(JavaDataTypeToC(java_type))
-
-
-def JavaDataTypeToCForCalledByNativeParam(java_type):
-  """Returns a C datatype to be when calling from native."""
-  if java_type == 'int':
-    return 'JniIntWrapper'
-  else:
-    c_type = JavaDataTypeToC(java_type)
-    if re.match(RE_SCOPED_JNI_TYPES, c_type):
-      return 'const base::android::JavaRefOrBare<' + c_type + '>&'
-    else:
-      return c_type
-
-
-def JavaReturnValueToC(java_type):
-  """Returns a valid C return value for the given java type."""
-  java_pod_type_map = {
-      'int': '0',
-      'byte': '0',
-      'char': '0',
-      'short': '0',
-      'boolean': 'false',
-      'long': '0',
-      'double': '0',
-      'float': '0',
-      'void': ''
-  }
-  return java_pod_type_map.get(java_type, 'NULL')
-
-
-class JniParams(object):
-  _imports = []
-  _fully_qualified_class = ''
-  _package = ''
-  _inner_classes = []
-  _implicit_imports = []
-
-  @staticmethod
-  def SetFullyQualifiedClass(fully_qualified_class):
-    JniParams._fully_qualified_class = 'L' + fully_qualified_class
-    JniParams._package = '/'.join(fully_qualified_class.split('/')[:-1])
-
-  @staticmethod
-  def AddAdditionalImport(class_name):
-    assert class_name.endswith('.class')
-    raw_class_name = class_name[:-len('.class')]
-    if '.' in raw_class_name:
-      raise SyntaxError('%s cannot be used in @JNIAdditionalImport. '
-                        'Only import unqualified outer classes.' % class_name)
-    new_import = 'L%s/%s' % (JniParams._package, raw_class_name)
-    if new_import in JniParams._imports:
-      raise SyntaxError('Do not use JNIAdditionalImport on an already '
-                        'imported class: %s' % (new_import.replace('/', '.')))
-    JniParams._imports += [new_import]
-
-  @staticmethod
-  def ExtractImportsAndInnerClasses(contents):
-    if not JniParams._package:
-      raise RuntimeError('SetFullyQualifiedClass must be called before '
-                         'ExtractImportsAndInnerClasses')
-    contents = contents.replace('\n', '')
-    re_import = re.compile(r'import.*?(?P<class>\S*?);')
-    for match in re.finditer(re_import, contents):
-      JniParams._imports += ['L' + match.group('class').replace('.', '/')]
-
-    re_inner = re.compile(r'(class|interface)\s+?(?P<name>\w+?)\W')
-    for match in re.finditer(re_inner, contents):
-      inner = match.group('name')
-      if not JniParams._fully_qualified_class.endswith(inner):
-        JniParams._inner_classes += [JniParams._fully_qualified_class + '$' +
-                                     inner]
-
-    re_additional_imports = re.compile(
-        r'@JNIAdditionalImport\(\s*{?(?P<class_names>.*?)}?\s*\)')
-    for match in re.finditer(re_additional_imports, contents):
-      for class_name in match.group('class_names').split(','):
-        JniParams.AddAdditionalImport(class_name.strip())
-
-  @staticmethod
-  def ParseJavaPSignature(signature_line):
-    prefix = 'Signature: '
-    index = signature_line.find(prefix)
-    if index == -1:
-      prefix = 'descriptor: '
-      index = signature_line.index(prefix)
-    return '"%s"' % signature_line[index + len(prefix):]
-
-  @staticmethod
-  def JavaToJni(param):
-    """Converts a java param into a JNI signature type."""
-    pod_param_map = {
-        'int': 'I',
-        'boolean': 'Z',
-        'char': 'C',
-        'short': 'S',
-        'long': 'J',
-        'double': 'D',
-        'float': 'F',
-        'byte': 'B',
-        'void': 'V',
-    }
-    object_param_list = [
-        'Ljava/lang/Boolean',
-        'Ljava/lang/Integer',
-        'Ljava/lang/Long',
-        'Ljava/lang/Object',
-        'Ljava/lang/String',
-        'Ljava/lang/Class',
-        'Ljava/lang/CharSequence',
-        'Ljava/lang/Runnable',
-        'Ljava/lang/Throwable',
-    ]
-
-    prefix = ''
-    # Array?
-    while param[-2:] == '[]':
-      prefix += '['
-      param = param[:-2]
-    # Generic?
-    if '<' in param:
-      param = param[:param.index('<')]
-    if param in pod_param_map:
-      return prefix + pod_param_map[param]
-    if '/' in param:
-      # Coming from javap, use the fully qualified param directly.
-      return prefix + 'L' + param + ';'
-
-    for qualified_name in (object_param_list +
-                           [JniParams._fully_qualified_class] +
-                           JniParams._inner_classes):
-      if (qualified_name.endswith('/' + param) or
-          qualified_name.endswith('$' + param.replace('.', '$')) or
-          qualified_name == 'L' + param):
-        return prefix + qualified_name + ';'
-
-    # Is it from an import? (e.g. referecing Class from import pkg.Class;
-    # note that referencing an inner class Inner from import pkg.Class.Inner
-    # is not supported).
-    for qualified_name in JniParams._imports:
-      if qualified_name.endswith('/' + param):
-        # Ensure it's not an inner class.
-        components = qualified_name.split('/')
-        if len(components) > 2 and components[-2][0].isupper():
-          raise SyntaxError('Inner class (%s) can not be imported '
-                            'and used by JNI (%s). Please import the outer '
-                            'class and use Outer.Inner instead.' %
-                            (qualified_name, param))
-        return prefix + qualified_name + ';'
-
-    # Is it an inner class from an outer class import? (e.g. referencing
-    # Class.Inner from import pkg.Class).
-    if '.' in param:
-      components = param.split('.')
-      outer = '/'.join(components[:-1])
-      inner = components[-1]
-      for qualified_name in JniParams._imports:
-        if qualified_name.endswith('/' + outer):
-          return (prefix + qualified_name + '$' + inner + ';')
-      raise SyntaxError('Inner class (%s) can not be '
-                        'used directly by JNI. Please import the outer '
-                        'class, probably:\n'
-                        'import %s.%s;' %
-                        (param, JniParams._package.replace('/', '.'),
-                         outer.replace('/', '.')))
-
-    JniParams._CheckImplicitImports(param)
-
-    # Type not found, falling back to same package as this class.
-    return (prefix + 'L' + JniParams._package + '/' + param + ';')
-
-  @staticmethod
-  def _CheckImplicitImports(param):
-    # Ensure implicit imports, such as java.lang.*, are not being treated
-    # as being in the same package.
-    if not JniParams._implicit_imports:
-      # This file was generated from android.jar and lists
-      # all classes that are implicitly imported.
-      with file(os.path.join(os.path.dirname(sys.argv[0]),
-                             'android_jar.classes'), 'r') as f:
-        JniParams._implicit_imports = f.readlines()
-    for implicit_import in JniParams._implicit_imports:
-      implicit_import = implicit_import.strip().replace('.class', '')
-      implicit_import = implicit_import.replace('/', '.')
-      if implicit_import.endswith('.' + param):
-        raise SyntaxError('Ambiguous class (%s) can not be used directly '
-                          'by JNI.\nPlease import it, probably:\n\n'
-                          'import %s;' %
-                          (param, implicit_import))
-
-
-  @staticmethod
-  def Signature(params, returns, wrap):
-    """Returns the JNI signature for the given datatypes."""
-    items = ['(']
-    items += [JniParams.JavaToJni(param.datatype) for param in params]
-    items += [')']
-    items += [JniParams.JavaToJni(returns)]
-    if wrap:
-      return '\n' + '\n'.join(['"' + item + '"' for item in items])
-    else:
-      return '"' + ''.join(items) + '"'
-
-  @staticmethod
-  def Parse(params):
-    """Parses the params into a list of Param objects."""
-    if not params:
-      return []
-    ret = []
-    for p in [p.strip() for p in params.split(',')]:
-      items = p.split(' ')
-
-      # Remove @Annotations from parameters.
-      while items[0].startswith('@'):
-        del items[0]
-
-      if 'final' in items:
-        items.remove('final')
-
-      param = Param(
-          datatype=items[0],
-          name=(items[1] if len(items) > 1 else 'p%s' % len(ret)),
-      )
-      ret += [param]
-    return ret
-
-
-def ExtractJNINamespace(contents):
-  re_jni_namespace = re.compile('.*?@JNINamespace\("(.*?)"\)')
-  m = re.findall(re_jni_namespace, contents)
-  if not m:
-    return ''
-  return m[0]
-
-
-def ExtractFullyQualifiedJavaClassName(java_file_name, contents):
-  re_package = re.compile('.*?package (.*?);')
-  matches = re.findall(re_package, contents)
-  if not matches:
-    raise SyntaxError('Unable to find "package" line in %s' % java_file_name)
-  return (matches[0].replace('.', '/') + '/' +
-          os.path.splitext(os.path.basename(java_file_name))[0])
-
-
-def ExtractNatives(contents, ptr_type):
-  """Returns a list of dict containing information about a native method."""
-  contents = contents.replace('\n', '')
-  natives = []
-  re_native = re.compile(r'(@NativeClassQualifiedName'
-                         '\(\"(?P<native_class_name>.*?)\"\)\s+)?'
-                         '(@NativeCall(\(\"(?P<java_class_name>.*?)\"\))\s+)?'
-                         '(?P<qualifiers>\w+\s\w+|\w+|\s+)\s*native '
-                         '(?P<return_type>\S*) '
-                         '(?P<name>native\w+)\((?P<params>.*?)\);')
-  for match in re.finditer(re_native, contents):
-    native = NativeMethod(
-        static='static' in match.group('qualifiers'),
-        java_class_name=match.group('java_class_name'),
-        native_class_name=match.group('native_class_name'),
-        return_type=match.group('return_type'),
-        name=match.group('name').replace('native', ''),
-        params=JniParams.Parse(match.group('params')),
-        ptr_type=ptr_type)
-    natives += [native]
-  return natives
-
-
-def IsMainDexJavaClass(contents):
-  """Returns "true" if the class is annotated with "@MainDex", "false" if not.
-
-  JNI registration doesn't always need to be completed for non-browser processes
-  since most Java code is only used by the browser process. Classes that are
-  needed by non-browser processes must explicitly be annotated with @MainDex
-  to force JNI registration.
-  """
-  re_maindex = re.compile(r'@MainDex[\s\S]*class\s+\w+\s*{')
-  found = re.search(re_maindex, contents)
-  return 'true' if found else 'false'
-
-
-def GetStaticCastForReturnType(return_type):
-  type_map = { 'String' : 'jstring',
-               'java/lang/String' : 'jstring',
-               'Throwable': 'jthrowable',
-               'java/lang/Throwable': 'jthrowable',
-               'boolean[]': 'jbooleanArray',
-               'byte[]': 'jbyteArray',
-               'char[]': 'jcharArray',
-               'short[]': 'jshortArray',
-               'int[]': 'jintArray',
-               'long[]': 'jlongArray',
-               'float[]': 'jfloatArray',
-               'double[]': 'jdoubleArray' }
-  ret = type_map.get(return_type, None)
-  if ret:
-    return ret
-  if return_type.endswith('[]'):
-    return 'jobjectArray'
-  return None
-
-
-def GetEnvCall(is_constructor, is_static, return_type):
-  """Maps the types availabe via env->Call__Method."""
-  if is_constructor:
-    return 'NewObject'
-  env_call_map = {'boolean': 'Boolean',
-                  'byte': 'Byte',
-                  'char': 'Char',
-                  'short': 'Short',
-                  'int': 'Int',
-                  'long': 'Long',
-                  'float': 'Float',
-                  'void': 'Void',
-                  'double': 'Double',
-                  'Object': 'Object',
-                 }
-  call = env_call_map.get(return_type, 'Object')
-  if is_static:
-    call = 'Static' + call
-  return 'Call' + call + 'Method'
-
-
-def GetMangledParam(datatype):
-  """Returns a mangled identifier for the datatype."""
-  if len(datatype) <= 2:
-    return datatype.replace('[', 'A')
-  ret = ''
-  for i in range(1, len(datatype)):
-    c = datatype[i]
-    if c == '[':
-      ret += 'A'
-    elif c.isupper() or datatype[i - 1] in ['/', 'L']:
-      ret += c.upper()
-  return ret
-
-
-def GetMangledMethodName(name, params, return_type):
-  """Returns a mangled method name for the given signature.
-
-     The returned name can be used as a C identifier and will be unique for all
-     valid overloads of the same method.
-
-  Args:
-     name: string.
-     params: list of Param.
-     return_type: string.
-
-  Returns:
-      A mangled name.
-  """
-  mangled_items = []
-  for datatype in [return_type] + [x.datatype for x in params]:
-    mangled_items += [GetMangledParam(JniParams.JavaToJni(datatype))]
-  mangled_name = name + '_'.join(mangled_items)
-  assert re.match(r'[0-9a-zA-Z_]+', mangled_name)
-  return mangled_name
-
-
-def MangleCalledByNatives(called_by_natives):
-  """Mangles all the overloads from the call_by_natives list."""
-  method_counts = collections.defaultdict(
-      lambda: collections.defaultdict(lambda: 0))
-  for called_by_native in called_by_natives:
-    java_class_name = called_by_native.java_class_name
-    name = called_by_native.name
-    method_counts[java_class_name][name] += 1
-  for called_by_native in called_by_natives:
-    java_class_name = called_by_native.java_class_name
-    method_name = called_by_native.name
-    method_id_var_name = method_name
-    if method_counts[java_class_name][method_name] > 1:
-      method_id_var_name = GetMangledMethodName(method_name,
-                                                called_by_native.params,
-                                                called_by_native.return_type)
-    called_by_native.method_id_var_name = method_id_var_name
-  return called_by_natives
-
-
-# Regex to match the JNI types that should be wrapped in a JavaRef.
-RE_SCOPED_JNI_TYPES = re.compile('jobject|jclass|jstring|jthrowable|.*Array')
-
-
-# Regex to match a string like "@CalledByNative public void foo(int bar)".
-RE_CALLED_BY_NATIVE = re.compile(
-    '@CalledByNative(?P<Unchecked>(Unchecked)*?)(?:\("(?P<annotation>.*)"\))?'
-    '\s+(?P<prefix>[\w ]*?)'
-    '(:?\s*@\w+)?'  # Ignore annotations in return types.
-    '\s*(?P<return_type>\S+?)'
-    '\s+(?P<name>\w+)'
-    '\s*\((?P<params>[^\)]*)\)')
-
-
-# Removes empty lines that are indented (i.e. start with 2x spaces).
-def RemoveIndentedEmptyLines(string):
-  return re.sub('^(?: {2})+$\n', '', string, flags=re.MULTILINE)
-
-
-def ExtractCalledByNatives(contents):
-  """Parses all methods annotated with @CalledByNative.
-
-  Args:
-    contents: the contents of the java file.
-
-  Returns:
-    A list of dict with information about the annotated methods.
-    TODO(bulach): return a CalledByNative object.
-
-  Raises:
-    ParseError: if unable to parse.
-  """
-  called_by_natives = []
-  for match in re.finditer(RE_CALLED_BY_NATIVE, contents):
-    called_by_natives += [CalledByNative(
-        system_class=False,
-        unchecked='Unchecked' in match.group('Unchecked'),
-        static='static' in match.group('prefix'),
-        java_class_name=match.group('annotation') or '',
-        return_type=match.group('return_type'),
-        name=match.group('name'),
-        params=JniParams.Parse(match.group('params')))]
-  # Check for any @CalledByNative occurrences that weren't matched.
-  unmatched_lines = re.sub(RE_CALLED_BY_NATIVE, '', contents).split('\n')
-  for line1, line2 in zip(unmatched_lines, unmatched_lines[1:]):
-    if '@CalledByNative' in line1:
-      raise ParseError('could not parse @CalledByNative method signature',
-                       line1, line2)
-  return MangleCalledByNatives(called_by_natives)
-
-
-class JNIFromJavaP(object):
-  """Uses 'javap' to parse a .class file and generate the JNI header file."""
-
-  def __init__(self, contents, options):
-    self.contents = contents
-    self.namespace = options.namespace
-    for line in contents:
-      class_name = re.match(
-          '.*?(public).*?(class|interface) (?P<class_name>\S+?)( |\Z)',
-          line)
-      if class_name:
-        self.fully_qualified_class = class_name.group('class_name')
-        break
-    self.fully_qualified_class = self.fully_qualified_class.replace('.', '/')
-    # Java 7's javap includes type parameters in output, like HashSet<T>. Strip
-    # away the <...> and use the raw class name that Java 6 would've given us.
-    self.fully_qualified_class = self.fully_qualified_class.split('<', 1)[0]
-    JniParams.SetFullyQualifiedClass(self.fully_qualified_class)
-    self.java_class_name = self.fully_qualified_class.split('/')[-1]
-    if not self.namespace:
-      self.namespace = 'JNI_' + self.java_class_name
-    re_method = re.compile('(?P<prefix>.*?)(?P<return_type>\S+?) (?P<name>\w+?)'
-                           '\((?P<params>.*?)\)')
-    self.called_by_natives = []
-    for lineno, content in enumerate(contents[2:], 2):
-      match = re.match(re_method, content)
-      if not match:
-        continue
-      self.called_by_natives += [CalledByNative(
-          system_class=True,
-          unchecked=False,
-          static='static' in match.group('prefix'),
-          java_class_name='',
-          return_type=match.group('return_type').replace('.', '/'),
-          name=match.group('name'),
-          params=JniParams.Parse(match.group('params').replace('.', '/')),
-          signature=JniParams.ParseJavaPSignature(contents[lineno + 1]))]
-    re_constructor = re.compile('(.*?)public ' +
-                                self.fully_qualified_class.replace('/', '.') +
-                                '\((?P<params>.*?)\)')
-    for lineno, content in enumerate(contents[2:], 2):
-      match = re.match(re_constructor, content)
-      if not match:
-        continue
-      self.called_by_natives += [CalledByNative(
-          system_class=True,
-          unchecked=False,
-          static=False,
-          java_class_name='',
-          return_type=self.fully_qualified_class,
-          name='Constructor',
-          params=JniParams.Parse(match.group('params').replace('.', '/')),
-          signature=JniParams.ParseJavaPSignature(contents[lineno + 1]),
-          is_constructor=True)]
-    self.called_by_natives = MangleCalledByNatives(self.called_by_natives)
-
-    self.constant_fields = []
-    re_constant_field = re.compile('.*?public static final int (?P<name>.*?);')
-    re_constant_field_value = re.compile(
-        '.*?Constant(Value| value): int (?P<value>(-*[0-9]+)?)')
-    for lineno, content in enumerate(contents[2:], 2):
-      match = re.match(re_constant_field, content)
-      if not match:
-        continue
-      value = re.match(re_constant_field_value, contents[lineno + 2])
-      if not value:
-        value = re.match(re_constant_field_value, contents[lineno + 3])
-      if value:
-        self.constant_fields.append(
-            ConstantField(name=match.group('name'),
-                          value=value.group('value')))
-
-    self.inl_header_file_generator = InlHeaderFileGenerator(
-        self.namespace, self.fully_qualified_class, [], self.called_by_natives,
-        self.constant_fields, options)
-
-  def GetContent(self):
-    return self.inl_header_file_generator.GetContent()
-
-  @staticmethod
-  def CreateFromClass(class_file, options):
-    class_name = os.path.splitext(os.path.basename(class_file))[0]
-    p = subprocess.Popen(args=[options.javap, '-c', '-verbose',
-                               '-s', class_name],
-                         cwd=os.path.dirname(class_file),
-                         stdout=subprocess.PIPE,
-                         stderr=subprocess.PIPE)
-    stdout, _ = p.communicate()
-    jni_from_javap = JNIFromJavaP(stdout.split('\n'), options)
-    return jni_from_javap
-
-
-class JNIFromJavaSource(object):
-  """Uses the given java source file to generate the JNI header file."""
-
-  # Match single line comments, multiline comments, character literals, and
-  # double-quoted strings.
-  _comment_remover_regex = re.compile(
-      r'//.*?$|/\*.*?\*/|\'(?:\\.|[^\\\'])*\'|"(?:\\.|[^\\"])*"',
-      re.DOTALL | re.MULTILINE)
-
-  def __init__(self, contents, fully_qualified_class, options):
-    contents = self._RemoveComments(contents)
-    JniParams.SetFullyQualifiedClass(fully_qualified_class)
-    JniParams.ExtractImportsAndInnerClasses(contents)
-    jni_namespace = ExtractJNINamespace(contents) or options.namespace
-    natives = ExtractNatives(contents, options.ptr_type)
-    called_by_natives = ExtractCalledByNatives(contents)
-    maindex = IsMainDexJavaClass(contents)
-    if len(natives) == 0 and len(called_by_natives) == 0:
-      raise SyntaxError('Unable to find any JNI methods for %s.' %
-                        fully_qualified_class)
-    inl_header_file_generator = InlHeaderFileGenerator(
-        jni_namespace, fully_qualified_class, natives, called_by_natives, [],
-        options, maindex)
-    self.content = inl_header_file_generator.GetContent()
-
-  @classmethod
-  def _RemoveComments(cls, contents):
-    # We need to support both inline and block comments, and we need to handle
-    # strings that contain '//' or '/*'.
-    # TODO(bulach): This is a bit hacky. It would be cleaner to use a real Java
-    # parser. Maybe we could ditch JNIFromJavaSource and just always use
-    # JNIFromJavaP; or maybe we could rewrite this script in Java and use APT.
-    # http://code.google.com/p/chromium/issues/detail?id=138941
-    def replacer(match):
-      # Replace matches that are comments with nothing; return literals/strings
-      # unchanged.
-      s = match.group(0)
-      if s.startswith('/'):
-        return ''
-      else:
-        return s
-    return cls._comment_remover_regex.sub(replacer, contents)
-
-  def GetContent(self):
-    return self.content
-
-  @staticmethod
-  def CreateFromFile(java_file_name, options):
-    contents = file(java_file_name).read()
-    fully_qualified_class = ExtractFullyQualifiedJavaClassName(java_file_name,
-                                                               contents)
-    return JNIFromJavaSource(contents, fully_qualified_class, options)
-
-
-class InlHeaderFileGenerator(object):
-  """Generates an inline header file for JNI integration."""
-
-  def __init__(self, namespace, fully_qualified_class, natives,
-               called_by_natives, constant_fields, options, maindex='false'):
-    self.namespace = namespace
-    self.fully_qualified_class = fully_qualified_class
-    self.class_name = self.fully_qualified_class.split('/')[-1]
-    self.natives = natives
-    self.called_by_natives = called_by_natives
-    self.header_guard = fully_qualified_class.replace('/', '_') + '_JNI'
-    self.constant_fields = constant_fields
-    self.maindex = maindex
-    self.options = options
-
-
-  def GetContent(self):
-    """Returns the content of the JNI binding file."""
-    template = Template("""\
-// 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.
-
-
-// This file is autogenerated by
-//     ${SCRIPT_NAME}
-// For
-//     ${FULLY_QUALIFIED_CLASS}
-
-#ifndef ${HEADER_GUARD}
-#define ${HEADER_GUARD}
-
-#include <jni.h>
-
-${INCLUDES}
-
-#include "base/android/jni_int_wrapper.h"
-
-// Step 1: forward declarations.
-namespace {
-$CLASS_PATH_DEFINITIONS
-
-}  // namespace
-
-$OPEN_NAMESPACE
-
-$CONSTANT_FIELDS
-
-// Step 2: method stubs.
-$METHOD_STUBS
-
-// Step 3: RegisterNatives.
-$JNI_NATIVE_METHODS
-$REGISTER_NATIVES
-$CLOSE_NAMESPACE
-
-#endif  // ${HEADER_GUARD}
-""")
-    values = {
-        'SCRIPT_NAME': self.options.script_name,
-        'FULLY_QUALIFIED_CLASS': self.fully_qualified_class,
-        'CLASS_PATH_DEFINITIONS': self.GetClassPathDefinitionsString(),
-        'CONSTANT_FIELDS': self.GetConstantFieldsString(),
-        'METHOD_STUBS': self.GetMethodStubsString(),
-        'OPEN_NAMESPACE': self.GetOpenNamespaceString(),
-        'JNI_NATIVE_METHODS': self.GetJNINativeMethodsString(),
-        'REGISTER_NATIVES': self.GetRegisterNativesString(),
-        'CLOSE_NAMESPACE': self.GetCloseNamespaceString(),
-        'HEADER_GUARD': self.header_guard,
-        'INCLUDES': self.GetIncludesString(),
-    }
-    assert ((values['JNI_NATIVE_METHODS'] == '') ==
-            (values['REGISTER_NATIVES'] == ''))
-    return WrapOutput(template.substitute(values))
-
-  def GetClassPathDefinitionsString(self):
-    ret = []
-    ret += [self.GetClassPathDefinitions()]
-    return '\n'.join(ret)
-
-  def GetConstantFieldsString(self):
-    if not self.constant_fields:
-      return ''
-    ret = ['enum Java_%s_constant_fields {' % self.class_name]
-    for c in self.constant_fields:
-      ret += ['  %s = %s,' % (c.name, c.value)]
-    ret += ['};']
-    return '\n'.join(ret)
-
-  def GetMethodStubsString(self):
-    """Returns the code corresponding to method stubs."""
-    ret = []
-    for native in self.natives:
-      ret += [self.GetNativeStub(native)]
-    ret += self.GetLazyCalledByNativeMethodStubs()
-    return '\n'.join(ret)
-
-  def GetLazyCalledByNativeMethodStubs(self):
-    return [self.GetLazyCalledByNativeMethodStub(called_by_native)
-            for called_by_native in self.called_by_natives]
-
-  def GetIncludesString(self):
-    if not self.options.includes:
-      return ''
-    includes = self.options.includes.split(',')
-    return '\n'.join('#include "%s"' % x for x in includes)
-
-  def GetKMethodsString(self, clazz):
-    ret = []
-    for native in self.natives:
-      if (native.java_class_name == clazz or
-          (not native.java_class_name and clazz == self.class_name)):
-        ret += [self.GetKMethodArrayEntry(native)]
-    return '\n'.join(ret)
-
-  def SubstituteNativeMethods(self, template):
-    """Substitutes JAVA_CLASS and KMETHODS in the provided template."""
-    ret = []
-    all_classes = self.GetUniqueClasses(self.natives)
-    all_classes[self.class_name] = self.fully_qualified_class
-    for clazz in all_classes:
-      kmethods = self.GetKMethodsString(clazz)
-      if kmethods:
-        values = {'JAVA_CLASS': clazz,
-                  'KMETHODS': kmethods}
-        ret += [template.substitute(values)]
-    if not ret: return ''
-    return '\n' + '\n'.join(ret)
-
-  def GetJNINativeMethodsString(self):
-    """Returns the implementation of the array of native methods."""
-    if not self.options.native_exports_optional:
-      return ''
-    template = Template("""\
-static const JNINativeMethod kMethods${JAVA_CLASS}[] = {
-${KMETHODS}
-};
-""")
-    return self.SubstituteNativeMethods(template)
-
-  def GetRegisterNativesString(self):
-    """Returns the code for RegisterNatives."""
-    natives = self.GetRegisterNativesImplString()
-    if not natives:
-      return ''
-
-    template = Template("""\
-${REGISTER_NATIVES_SIGNATURE} {
-${EARLY_EXIT}
-${NATIVES}
-  return true;
-}
-""")
-    signature = 'static bool RegisterNativesImpl(JNIEnv* env)'
-    early_exit = ''
-    if self.options.native_exports_optional:
-      early_exit = """\
-  if (jni_generator::ShouldSkipJniRegistration(%s))
-    return true;
-""" % self.maindex
-
-    values = {'REGISTER_NATIVES_SIGNATURE': signature,
-              'EARLY_EXIT': early_exit,
-              'NATIVES': natives,
-             }
-
-    return template.substitute(values)
-
-  def GetRegisterNativesImplString(self):
-    """Returns the shared implementation for RegisterNatives."""
-    if not self.options.native_exports_optional:
-      return ''
-
-    template = Template("""\
-  const int kMethods${JAVA_CLASS}Size = arraysize(kMethods${JAVA_CLASS});
-
-  if (env->RegisterNatives(${JAVA_CLASS}_clazz(env),
-                           kMethods${JAVA_CLASS},
-                           kMethods${JAVA_CLASS}Size) < 0) {
-    jni_generator::HandleRegistrationError(
-        env, ${JAVA_CLASS}_clazz(env), __FILE__);
-    return false;
-  }
-""")
-    return self.SubstituteNativeMethods(template)
-
-  def GetOpenNamespaceString(self):
-    if self.namespace:
-      all_namespaces = ['namespace %s {' % ns
-                        for ns in self.namespace.split('::')]
-      return '\n'.join(all_namespaces)
-    return ''
-
-  def GetCloseNamespaceString(self):
-    if self.namespace:
-      all_namespaces = ['}  // namespace %s' % ns
-                        for ns in self.namespace.split('::')]
-      all_namespaces.reverse()
-      return '\n'.join(all_namespaces) + '\n'
-    return ''
-
-  def GetJNIFirstParamType(self, native):
-    if native.type == 'method':
-      return 'jobject'
-    elif native.type == 'function':
-      if native.static:
-        return 'jclass'
-      else:
-        return 'jobject'
-
-  def GetJNIFirstParam(self, native, for_declaration):
-    c_type = self.GetJNIFirstParamType(native)
-    if for_declaration:
-      c_type = WrapCTypeForDeclaration(c_type)
-    return [c_type + ' jcaller']
-
-  def GetParamsInDeclaration(self, native):
-    """Returns the params for the forward declaration.
-
-    Args:
-      native: the native dictionary describing the method.
-
-    Returns:
-      A string containing the params.
-    """
-    return ',\n    '.join(self.GetJNIFirstParam(native, True) +
-                          [JavaDataTypeToCForDeclaration(param.datatype) + ' ' +
-                           param.name
-                           for param in native.params])
-
-  def GetParamsInStub(self, native):
-    """Returns the params for the stub declaration.
-
-    Args:
-      native: the native dictionary describing the method.
-
-    Returns:
-      A string containing the params.
-    """
-    return ',\n    '.join(self.GetJNIFirstParam(native, False) +
-                          [JavaDataTypeToC(param.datatype) + ' ' +
-                           param.name
-                           for param in native.params])
-
-  def GetCalledByNativeParamsInDeclaration(self, called_by_native):
-    return ',\n    '.join([
-        JavaDataTypeToCForCalledByNativeParam(param.datatype) + ' ' +
-        param.name
-        for param in called_by_native.params])
-
-  def GetStubName(self, native):
-    """Return the name of the stub function for this native method.
-
-    Args:
-      native: the native dictionary describing the method.
-
-    Returns:
-      A string with the stub function name (used by the JVM).
-    """
-    template = Template("Java_${JAVA_NAME}_native${NAME}")
-
-    java_name = self.fully_qualified_class.replace('_', '_1').replace('/', '_')
-    if native.java_class_name:
-      java_name += '_00024' + native.java_class_name
-
-    values = {'NAME': native.name,
-              'JAVA_NAME': java_name}
-    return template.substitute(values)
-
-  def GetJavaParamRefForCall(self, c_type, name):
-    return Template(
-        'base::android::JavaParamRef<${TYPE}>(env, ${NAME})').substitute({
-        'TYPE': c_type,
-        'NAME': name,
-    })
-
-  def GetJNIFirstParamForCall(self, native):
-    c_type = self.GetJNIFirstParamType(native)
-    return [self.GetJavaParamRefForCall(c_type, 'jcaller')]
-
-  def GetNativeStub(self, native):
-    is_method = native.type == 'method'
-
-    if is_method:
-      params = native.params[1:]
-    else:
-      params = native.params
-    params_in_call = ['env'] + self.GetJNIFirstParamForCall(native)
-    for p in params:
-      c_type = JavaDataTypeToC(p.datatype)
-      if re.match(RE_SCOPED_JNI_TYPES, c_type):
-        params_in_call.append(self.GetJavaParamRefForCall(c_type, p.name))
-      else:
-        params_in_call.append(p.name)
-    params_in_call = ', '.join(params_in_call)
-
-    return_type = return_declaration = JavaDataTypeToC(native.return_type)
-    post_call = ''
-    if re.match(RE_SCOPED_JNI_TYPES, return_type):
-      post_call = '.Release()'
-      return_declaration = ('base::android::ScopedJavaLocalRef<' + return_type +
-                            '>')
-    profiling_entered_native = ''
-    if self.options.enable_profiling:
-      profiling_entered_native = 'JNI_LINK_SAVED_FRAME_POINTER;'
-    values = {
-        'RETURN': return_type,
-        'RETURN_DECLARATION': return_declaration,
-        'NAME': native.name,
-        'PARAMS': self.GetParamsInDeclaration(native),
-        'PARAMS_IN_STUB': self.GetParamsInStub(native),
-        'PARAMS_IN_CALL': params_in_call,
-        'POST_CALL': post_call,
-        'STUB_NAME': self.GetStubName(native),
-        'PROFILING_ENTERED_NATIVE': profiling_entered_native,
-    }
-
-    if is_method:
-      optional_error_return = JavaReturnValueToC(native.return_type)
-      if optional_error_return:
-        optional_error_return = ', ' + optional_error_return
-      values.update({
-          'OPTIONAL_ERROR_RETURN': optional_error_return,
-          'PARAM0_NAME': native.params[0].name,
-          'P0_TYPE': native.p0_type,
-      })
-      template = Template("""\
-JNI_GENERATOR_EXPORT ${RETURN} ${STUB_NAME}(JNIEnv* env, ${PARAMS_IN_STUB}) {
-  ${PROFILING_ENTERED_NATIVE}
-  ${P0_TYPE}* native = reinterpret_cast<${P0_TYPE}*>(${PARAM0_NAME});
-  CHECK_NATIVE_PTR(env, jcaller, native, "${NAME}"${OPTIONAL_ERROR_RETURN});
-  return native->${NAME}(${PARAMS_IN_CALL})${POST_CALL};
-}
-""")
-    else:
-      template = Template("""
-static ${RETURN_DECLARATION} ${NAME}(JNIEnv* env, ${PARAMS});
-
-JNI_GENERATOR_EXPORT ${RETURN} ${STUB_NAME}(JNIEnv* env, ${PARAMS_IN_STUB}) {
-  ${PROFILING_ENTERED_NATIVE}
-  return ${NAME}(${PARAMS_IN_CALL})${POST_CALL};
-}
-""")
-
-    return RemoveIndentedEmptyLines(template.substitute(values))
-
-  def GetArgument(self, param):
-    if param.datatype == 'int':
-      return 'as_jint(' + param.name + ')'
-    elif re.match(RE_SCOPED_JNI_TYPES, JavaDataTypeToC(param.datatype)):
-      return param.name + '.obj()'
-    else:
-      return param.name
-
-  def GetArgumentsInCall(self, params):
-    """Return a string of arguments to call from native into Java"""
-    return [self.GetArgument(p) for p in params]
-
-  def GetCalledByNativeValues(self, called_by_native):
-    """Fills in necessary values for the CalledByNative methods."""
-    java_class = called_by_native.java_class_name or self.class_name
-    if called_by_native.static or called_by_native.is_constructor:
-      first_param_in_declaration = ''
-      first_param_in_call = ('%s_clazz(env)' % java_class)
-    else:
-      first_param_in_declaration = (
-          ', const base::android::JavaRefOrBare<jobject>& obj')
-      first_param_in_call = 'obj.obj()'
-    params_in_declaration = self.GetCalledByNativeParamsInDeclaration(
-        called_by_native)
-    if params_in_declaration:
-      params_in_declaration = ', ' + params_in_declaration
-    params_in_call = ', '.join(self.GetArgumentsInCall(called_by_native.params))
-    if params_in_call:
-      params_in_call = ', ' + params_in_call
-    pre_call = ''
-    post_call = ''
-    if called_by_native.static_cast:
-      pre_call = 'static_cast<%s>(' % called_by_native.static_cast
-      post_call = ')'
-    check_exception = ''
-    if not called_by_native.unchecked:
-      check_exception = 'jni_generator::CheckException(env);'
-    return_type = JavaDataTypeToC(called_by_native.return_type)
-    optional_error_return = JavaReturnValueToC(called_by_native.return_type)
-    if optional_error_return:
-      optional_error_return = ', ' + optional_error_return
-    return_declaration = ''
-    return_clause = ''
-    if return_type != 'void':
-      pre_call = ' ' + pre_call
-      return_declaration = return_type + ' ret ='
-      if re.match(RE_SCOPED_JNI_TYPES, return_type):
-        return_type = 'base::android::ScopedJavaLocalRef<' + return_type + '>'
-        return_clause = 'return ' + return_type + '(env, ret);'
-      else:
-        return_clause = 'return ret;'
-    profiling_leaving_native = ''
-    if self.options.enable_profiling:
-      profiling_leaving_native = 'JNI_SAVE_FRAME_POINTER;'
-    return {
-        'JAVA_CLASS': java_class,
-        'RETURN_TYPE': return_type,
-        'OPTIONAL_ERROR_RETURN': optional_error_return,
-        'RETURN_DECLARATION': return_declaration,
-        'RETURN_CLAUSE': return_clause,
-        'FIRST_PARAM_IN_DECLARATION': first_param_in_declaration,
-        'PARAMS_IN_DECLARATION': params_in_declaration,
-        'PRE_CALL': pre_call,
-        'POST_CALL': post_call,
-        'ENV_CALL': called_by_native.env_call,
-        'FIRST_PARAM_IN_CALL': first_param_in_call,
-        'PARAMS_IN_CALL': params_in_call,
-        'METHOD_ID_VAR_NAME': called_by_native.method_id_var_name,
-        'CHECK_EXCEPTION': check_exception,
-        'GET_METHOD_ID_IMPL': self.GetMethodIDImpl(called_by_native),
-        'PROFILING_LEAVING_NATIVE': profiling_leaving_native,
-    }
-
-
-  def GetLazyCalledByNativeMethodStub(self, called_by_native):
-    """Returns a string."""
-    function_signature_template = Template("""\
-static ${RETURN_TYPE} Java_${JAVA_CLASS}_${METHOD_ID_VAR_NAME}(\
-JNIEnv* env${FIRST_PARAM_IN_DECLARATION}${PARAMS_IN_DECLARATION})""")
-    function_header_template = Template("""\
-${FUNCTION_SIGNATURE} {""")
-    function_header_with_unused_template = Template("""\
-${FUNCTION_SIGNATURE} __attribute__ ((unused));
-${FUNCTION_SIGNATURE} {""")
-    template = Template("""
-static base::subtle::AtomicWord g_${JAVA_CLASS}_${METHOD_ID_VAR_NAME} = 0;
-${FUNCTION_HEADER}
-  CHECK_CLAZZ(env, ${FIRST_PARAM_IN_CALL},
-      ${JAVA_CLASS}_clazz(env)${OPTIONAL_ERROR_RETURN});
-  jmethodID method_id =
-    ${GET_METHOD_ID_IMPL}
-  ${PROFILING_LEAVING_NATIVE}
-  ${RETURN_DECLARATION}
-     ${PRE_CALL}env->${ENV_CALL}(${FIRST_PARAM_IN_CALL},
-          method_id${PARAMS_IN_CALL})${POST_CALL};
-  ${CHECK_EXCEPTION}
-  ${RETURN_CLAUSE}
-}""")
-    values = self.GetCalledByNativeValues(called_by_native)
-    values['FUNCTION_SIGNATURE'] = (
-        function_signature_template.substitute(values))
-    if called_by_native.system_class:
-      values['FUNCTION_HEADER'] = (
-          function_header_with_unused_template.substitute(values))
-    else:
-      values['FUNCTION_HEADER'] = function_header_template.substitute(values)
-    return RemoveIndentedEmptyLines(template.substitute(values))
-
-  def GetKMethodArrayEntry(self, native):
-    template = Template('    { "native${NAME}", ${JNI_SIGNATURE}, ' +
-                        'reinterpret_cast<void*>(${STUB_NAME}) },')
-    values = {'NAME': native.name,
-              'JNI_SIGNATURE': JniParams.Signature(native.params,
-                                                   native.return_type,
-                                                   True),
-              'STUB_NAME': self.GetStubName(native)}
-    return template.substitute(values)
-
-  def GetUniqueClasses(self, origin):
-    ret = {self.class_name: self.fully_qualified_class}
-    for entry in origin:
-      class_name = self.class_name
-      jni_class_path = self.fully_qualified_class
-      if entry.java_class_name:
-        class_name = entry.java_class_name
-        jni_class_path = self.fully_qualified_class + '$' + class_name
-      ret[class_name] = jni_class_path
-    return ret
-
-  def GetClassPathDefinitions(self):
-    """Returns the ClassPath constants."""
-    ret = []
-    template = Template("""\
-const char k${JAVA_CLASS}ClassPath[] = "${JNI_CLASS_PATH}";""")
-    all_classes = self.GetUniqueClasses(self.called_by_natives)
-    if self.options.native_exports_optional:
-      all_classes.update(self.GetUniqueClasses(self.natives))
-
-    for clazz in all_classes:
-      values = {
-          'JAVA_CLASS': clazz,
-          'JNI_CLASS_PATH': all_classes[clazz],
-      }
-      ret += [template.substitute(values)]
-    ret += ''
-
-    template = Template("""\
-// Leaking this jclass as we cannot use LazyInstance from some threads.
-base::subtle::AtomicWord g_${JAVA_CLASS}_clazz __attribute__((unused)) = 0;
-#define ${JAVA_CLASS}_clazz(env) \
-base::android::LazyGetClass(env, k${JAVA_CLASS}ClassPath, \
-&g_${JAVA_CLASS}_clazz)""")
-
-    for clazz in all_classes:
-      values = {
-          'JAVA_CLASS': clazz,
-      }
-      ret += [template.substitute(values)]
-
-    return '\n'.join(ret)
-
-  def GetMethodIDImpl(self, called_by_native):
-    """Returns the implementation of GetMethodID."""
-    template = Template("""\
-  base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_${STATIC}>(
-      env, ${JAVA_CLASS}_clazz(env),
-      "${JNI_NAME}",
-      ${JNI_SIGNATURE},
-      &g_${JAVA_CLASS}_${METHOD_ID_VAR_NAME});
-""")
-    jni_name = called_by_native.name
-    jni_return_type = called_by_native.return_type
-    if called_by_native.is_constructor:
-      jni_name = '<init>'
-      jni_return_type = 'void'
-    if called_by_native.signature:
-      signature = called_by_native.signature
-    else:
-      signature = JniParams.Signature(called_by_native.params,
-                                      jni_return_type,
-                                      True)
-    values = {
-        'JAVA_CLASS': called_by_native.java_class_name or self.class_name,
-        'JNI_NAME': jni_name,
-        'METHOD_ID_VAR_NAME': called_by_native.method_id_var_name,
-        'STATIC': 'STATIC' if called_by_native.static else 'INSTANCE',
-        'JNI_SIGNATURE': signature,
-    }
-    return template.substitute(values)
-
-
-def WrapOutput(output):
-  ret = []
-  for line in output.splitlines():
-    # Do not wrap lines under 80 characters or preprocessor directives.
-    if len(line) < 80 or line.lstrip()[:1] == '#':
-      stripped = line.rstrip()
-      if len(ret) == 0 or len(ret[-1]) or len(stripped):
-        ret.append(stripped)
-    else:
-      first_line_indent = ' ' * (len(line) - len(line.lstrip()))
-      subsequent_indent =  first_line_indent + ' ' * 4
-      if line.startswith('//'):
-        subsequent_indent = '//' + subsequent_indent
-      wrapper = textwrap.TextWrapper(width=80,
-                                     subsequent_indent=subsequent_indent,
-                                     break_long_words=False)
-      ret += [wrapped.rstrip() for wrapped in wrapper.wrap(line)]
-  ret += ['']
-  return '\n'.join(ret)
-
-
-def ExtractJarInputFile(jar_file, input_file, out_dir):
-  """Extracts input file from jar and returns the filename.
-
-  The input file is extracted to the same directory that the generated jni
-  headers will be placed in.  This is passed as an argument to script.
-
-  Args:
-    jar_file: the jar file containing the input files to extract.
-    input_files: the list of files to extract from the jar file.
-    out_dir: the name of the directories to extract to.
-
-  Returns:
-    the name of extracted input file.
-  """
-  jar_file = zipfile.ZipFile(jar_file)
-
-  out_dir = os.path.join(out_dir, os.path.dirname(input_file))
-  try:
-    os.makedirs(out_dir)
-  except OSError as e:
-    if e.errno != errno.EEXIST:
-      raise
-  extracted_file_name = os.path.join(out_dir, os.path.basename(input_file))
-  with open(extracted_file_name, 'w') as outfile:
-    outfile.write(jar_file.read(input_file))
-
-  return extracted_file_name
-
-
-def GenerateJNIHeader(input_file, output_file, options):
-  try:
-    if os.path.splitext(input_file)[1] == '.class':
-      jni_from_javap = JNIFromJavaP.CreateFromClass(input_file, options)
-      content = jni_from_javap.GetContent()
-    else:
-      jni_from_java_source = JNIFromJavaSource.CreateFromFile(
-          input_file, options)
-      content = jni_from_java_source.GetContent()
-  except ParseError, e:
-    print e
-    sys.exit(1)
-  if output_file:
-    if not os.path.exists(os.path.dirname(os.path.abspath(output_file))):
-      os.makedirs(os.path.dirname(os.path.abspath(output_file)))
-    if options.optimize_generation and os.path.exists(output_file):
-      with file(output_file, 'r') as f:
-        existing_content = f.read()
-        if existing_content == content:
-          return
-    with file(output_file, 'w') as f:
-      f.write(content)
-  else:
-    print content
-
-
-def GetScriptName():
-  script_components = os.path.abspath(sys.argv[0]).split(os.path.sep)
-  base_index = 0
-  for idx, value in enumerate(script_components):
-    if value == 'base' or value == 'third_party':
-      base_index = idx
-      break
-  return os.sep.join(script_components[base_index:])
-
-
-def main(argv):
-  usage = """usage: %prog [OPTIONS]
-This script will parse the given java source code extracting the native
-declarations and print the header file to stdout (or a file).
-See SampleForTests.java for more details.
-  """
-  option_parser = optparse.OptionParser(usage=usage)
-  build_utils.AddDepfileOption(option_parser)
-
-  option_parser.add_option('-j', '--jar_file', dest='jar_file',
-                           help='Extract the list of input files from'
-                           ' a specified jar file.'
-                           ' Uses javap to extract the methods from a'
-                           ' pre-compiled class. --input should point'
-                           ' to pre-compiled Java .class files.')
-  option_parser.add_option('-n', dest='namespace',
-                           help='Uses as a namespace in the generated header '
-                           'instead of the javap class name, or when there is '
-                           'no JNINamespace annotation in the java source.')
-  option_parser.add_option('--input_file',
-                           help='Single input file name. The output file name '
-                           'will be derived from it. Must be used with '
-                           '--output_dir.')
-  option_parser.add_option('--output_dir',
-                           help='The output directory. Must be used with '
-                           '--input')
-  option_parser.add_option('--optimize_generation', type="int",
-                           default=0, help='Whether we should optimize JNI '
-                           'generation by not regenerating files if they have '
-                           'not changed.')
-  option_parser.add_option('--script_name', default=GetScriptName(),
-                           help='The name of this script in the generated '
-                           'header.')
-  option_parser.add_option('--includes',
-                           help='The comma-separated list of header files to '
-                           'include in the generated header.')
-  option_parser.add_option('--ptr_type', default='int',
-                           type='choice', choices=['int', 'long'],
-                           help='The type used to represent native pointers in '
-                           'Java code. For 32-bit, use int; '
-                           'for 64-bit, use long.')
-  option_parser.add_option('--cpp', default='cpp',
-                           help='The path to cpp command.')
-  option_parser.add_option('--javap', default='javap',
-                           help='The path to javap command.')
-  option_parser.add_option('--native_exports_optional', action='store_true',
-                           help='Support both explicit and native method'
-                           'registration.')
-  option_parser.add_option('--enable_profiling', action='store_true',
-                           help='Add additional profiling instrumentation.')
-  options, args = option_parser.parse_args(argv)
-  if options.jar_file:
-    input_file = ExtractJarInputFile(options.jar_file, options.input_file,
-                                     options.output_dir)
-  elif options.input_file:
-    input_file = options.input_file
-  else:
-    option_parser.print_help()
-    print '\nError: Must specify --jar_file or --input_file.'
-    return 1
-  output_file = None
-  if options.output_dir:
-    root_name = os.path.splitext(os.path.basename(input_file))[0]
-    output_file = os.path.join(options.output_dir, root_name) + '_jni.h'
-  GenerateJNIHeader(input_file, output_file, options)
-
-  if options.depfile:
-    build_utils.WriteDepfile(options.depfile, output_file)
-
-
-if __name__ == '__main__':
-  sys.exit(main(sys.argv))
diff --git a/base/android/jni_generator/jni_generator_helper.h b/base/android/jni_generator/jni_generator_helper.h
deleted file mode 100644
index 3062806..0000000
--- a/base/android/jni_generator/jni_generator_helper.h
+++ /dev/null
@@ -1,62 +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 BASE_ANDROID_JNI_GENERATOR_JNI_GENERATOR_HELPER_H_
-#define BASE_ANDROID_JNI_GENERATOR_JNI_GENERATOR_HELPER_H_
-
-#include <jni.h>
-
-#include "base/android/jni_android.h"
-#include "base/android/scoped_java_ref.h"
-#include "base/logging.h"
-#include "build/build_config.h"
-
-// Project-specific macros used by the header files generated by
-// jni_generator.py. Different projects can then specify their own
-// implementation for this file.
-#define CHECK_NATIVE_PTR(env, jcaller, native_ptr, method_name, ...) \
-  DCHECK(native_ptr) << method_name;
-
-#define CHECK_CLAZZ(env, jcaller, clazz, ...) DCHECK(clazz);
-
-#if defined(ARCH_CPU_X86)
-// Dalvik JIT generated code doesn't guarantee 16-byte stack alignment on
-// x86 - use force_align_arg_pointer to realign the stack at the JNI
-// boundary. crbug.com/655248
-#define JNI_GENERATOR_EXPORT \
-  extern "C" __attribute__((visibility("default"), force_align_arg_pointer))
-#else
-#define JNI_GENERATOR_EXPORT extern "C" __attribute__((visibility("default")))
-#endif
-
-namespace jni_generator {
-
-inline void HandleRegistrationError(JNIEnv* env,
-                                    jclass clazz,
-                                    const char* filename) {
-  LOG(ERROR) << "RegisterNatives failed in " << filename;
-}
-
-inline void CheckException(JNIEnv* env) {
-  base::android::CheckException(env);
-}
-
-inline bool ShouldSkipJniRegistration(bool is_maindex_class) {
-  switch (base::android::GetJniRegistrationType()) {
-    case base::android::ALL_JNI_REGISTRATION:
-      return false;
-    case base::android::NO_JNI_REGISTRATION:
-      // TODO(estevenson): Change this to a DCHECK.
-      return true;
-    case base::android::SELECTIVE_JNI_REGISTRATION:
-      return !is_maindex_class;
-    default:
-      NOTREACHED();
-      return false;
-  }
-}
-
-}  // namespace jni_generator
-
-#endif  // BASE_ANDROID_JNI_GENERATOR_JNI_GENERATOR_HELPER_H_
diff --git a/base/android/jni_generator/jni_generator_tests.py b/base/android/jni_generator/jni_generator_tests.py
deleted file mode 100755
index c0c8238..0000000
--- a/base/android/jni_generator/jni_generator_tests.py
+++ /dev/null
@@ -1,1097 +0,0 @@
-#!/usr/bin/env python
-# 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.
-
-"""Tests for jni_generator.py.
-
-This test suite contains various tests for the JNI generator.
-It exercises the low-level parser all the way up to the
-code generator and ensures the output matches a golden
-file.
-"""
-
-import difflib
-import inspect
-import optparse
-import os
-import sys
-import unittest
-import jni_generator
-from jni_generator import CalledByNative, JniParams, NativeMethod, Param
-
-
-SCRIPT_NAME = 'base/android/jni_generator/jni_generator.py'
-INCLUDES = (
-    'base/android/jni_generator/jni_generator_helper.h'
-)
-
-# Set this environment variable in order to regenerate the golden text
-# files.
-REBASELINE_ENV = 'REBASELINE'
-
-class TestOptions(object):
-  """The mock options object which is passed to the jni_generator.py script."""
-
-  def __init__(self):
-    self.namespace = None
-    self.script_name = SCRIPT_NAME
-    self.includes = INCLUDES
-    self.ptr_type = 'long'
-    self.cpp = 'cpp'
-    self.javap = 'javap'
-    self.native_exports_optional = True
-    self.enable_profiling = False
-
-class TestGenerator(unittest.TestCase):
-  def assertObjEquals(self, first, second):
-    dict_first = first.__dict__
-    dict_second = second.__dict__
-    self.assertEquals(dict_first.keys(), dict_second.keys())
-    for key, value in dict_first.iteritems():
-      if (type(value) is list and len(value) and
-          isinstance(type(value[0]), object)):
-        self.assertListEquals(value, second.__getattribute__(key))
-      else:
-        actual = second.__getattribute__(key)
-        self.assertEquals(value, actual,
-                          'Key ' + key + ': ' + str(value) + '!=' + str(actual))
-
-  def assertListEquals(self, first, second):
-    self.assertEquals(len(first), len(second))
-    for i in xrange(len(first)):
-      if isinstance(first[i], object):
-        self.assertObjEquals(first[i], second[i])
-      else:
-        self.assertEquals(first[i], second[i])
-
-  def assertTextEquals(self, golden_text, generated_text):
-    if not self.compareText(golden_text, generated_text):
-      self.fail('Golden text mismatch.')
-
-  def compareText(self, golden_text, generated_text):
-    def FilterText(text):
-      return [
-          l.strip() for l in text.split('\n')
-          if not l.startswith('// Copyright')
-      ]
-    stripped_golden = FilterText(golden_text)
-    stripped_generated = FilterText(generated_text)
-    if stripped_golden == stripped_generated:
-      return True
-    print self.id()
-    for line in difflib.context_diff(stripped_golden, stripped_generated):
-      print line
-    print '\n\nGenerated'
-    print '=' * 80
-    print generated_text
-    print '=' * 80
-    print 'Run with:'
-    print 'REBASELINE=1', sys.argv[0]
-    print 'to regenerate the data files.'
-
-  def _ReadGoldenFile(self, golden_file):
-    if not os.path.exists(golden_file):
-      return None
-    with file(golden_file, 'r') as f:
-      return f.read()
-
-  def assertGoldenTextEquals(self, generated_text):
-    script_dir = os.path.dirname(sys.argv[0])
-    # This is the caller test method.
-    caller = inspect.stack()[1][3]
-    self.assertTrue(caller.startswith('test'),
-                    'assertGoldenTextEquals can only be called from a '
-                    'test* method, not %s' % caller)
-    golden_file = os.path.join(script_dir, caller + '.golden')
-    golden_text = self._ReadGoldenFile(golden_file)
-    if os.environ.get(REBASELINE_ENV):
-      if golden_text != generated_text:
-        with file(golden_file, 'w') as f:
-          f.write(generated_text)
-      return
-    self.assertTextEquals(golden_text, generated_text)
-
-  def testInspectCaller(self):
-    def willRaise():
-      # This function can only be called from a test* method.
-      self.assertGoldenTextEquals('')
-    self.assertRaises(AssertionError, willRaise)
-
-  def testNatives(self):
-    test_data = """"
-    interface OnFrameAvailableListener {}
-    private native int nativeInit();
-    private native void nativeDestroy(int nativeChromeBrowserProvider);
-    private native long nativeAddBookmark(
-            int nativeChromeBrowserProvider,
-            String url, String title, boolean isFolder, long parentId);
-    private static native String nativeGetDomainAndRegistry(String url);
-    private static native void nativeCreateHistoricalTabFromState(
-            byte[] state, int tab_index);
-    private native byte[] nativeGetStateAsByteArray(View view);
-    private static native String[] nativeGetAutofillProfileGUIDs();
-    private native void nativeSetRecognitionResults(
-            int sessionId, String[] results);
-    private native long nativeAddBookmarkFromAPI(
-            int nativeChromeBrowserProvider,
-            String url, Long created, Boolean isBookmark,
-            Long date, byte[] favicon, String title, Integer visits);
-    native int nativeFindAll(String find);
-    private static native OnFrameAvailableListener nativeGetInnerClass();
-    private native Bitmap nativeQueryBitmap(
-            int nativeChromeBrowserProvider,
-            String[] projection, String selection,
-            String[] selectionArgs, String sortOrder);
-    private native void nativeGotOrientation(
-            int nativeDataFetcherImplAndroid,
-            double alpha, double beta, double gamma);
-    private static native Throwable nativeMessWithJavaException(Throwable e);
-    """
-    jni_generator.JniParams.SetFullyQualifiedClass(
-        'org/chromium/example/jni_generator/SampleForTests')
-    jni_generator.JniParams.ExtractImportsAndInnerClasses(test_data)
-    natives = jni_generator.ExtractNatives(test_data, 'int')
-    golden_natives = [
-        NativeMethod(return_type='int', static=False,
-                     name='Init',
-                     params=[],
-                     java_class_name=None,
-                     type='function'),
-        NativeMethod(return_type='void', static=False, name='Destroy',
-                     params=[Param(datatype='int',
-                                   name='nativeChromeBrowserProvider')],
-                     java_class_name=None,
-                     type='method',
-                     p0_type='ChromeBrowserProvider'),
-        NativeMethod(return_type='long', static=False, name='AddBookmark',
-                     params=[Param(datatype='int',
-                                   name='nativeChromeBrowserProvider'),
-                             Param(datatype='String',
-                                   name='url'),
-                             Param(datatype='String',
-                                   name='title'),
-                             Param(datatype='boolean',
-                                   name='isFolder'),
-                             Param(datatype='long',
-                                   name='parentId')],
-                     java_class_name=None,
-                     type='method',
-                     p0_type='ChromeBrowserProvider'),
-        NativeMethod(return_type='String', static=True,
-                     name='GetDomainAndRegistry',
-                     params=[Param(datatype='String',
-                                   name='url')],
-                     java_class_name=None,
-                     type='function'),
-        NativeMethod(return_type='void', static=True,
-                     name='CreateHistoricalTabFromState',
-                     params=[Param(datatype='byte[]',
-                                   name='state'),
-                             Param(datatype='int',
-                                   name='tab_index')],
-                     java_class_name=None,
-                     type='function'),
-        NativeMethod(return_type='byte[]', static=False,
-                     name='GetStateAsByteArray',
-                     params=[Param(datatype='View', name='view')],
-                     java_class_name=None,
-                     type='function'),
-        NativeMethod(return_type='String[]', static=True,
-                     name='GetAutofillProfileGUIDs', params=[],
-                     java_class_name=None,
-                     type='function'),
-        NativeMethod(return_type='void', static=False,
-                     name='SetRecognitionResults',
-                     params=[Param(datatype='int', name='sessionId'),
-                             Param(datatype='String[]', name='results')],
-                     java_class_name=None,
-                     type='function'),
-        NativeMethod(return_type='long', static=False,
-                     name='AddBookmarkFromAPI',
-                     params=[Param(datatype='int',
-                                   name='nativeChromeBrowserProvider'),
-                             Param(datatype='String',
-                                   name='url'),
-                             Param(datatype='Long',
-                                   name='created'),
-                             Param(datatype='Boolean',
-                                   name='isBookmark'),
-                             Param(datatype='Long',
-                                   name='date'),
-                             Param(datatype='byte[]',
-                                   name='favicon'),
-                             Param(datatype='String',
-                                   name='title'),
-                             Param(datatype='Integer',
-                                   name='visits')],
-                     java_class_name=None,
-                     type='method',
-                     p0_type='ChromeBrowserProvider'),
-        NativeMethod(return_type='int', static=False,
-                     name='FindAll',
-                     params=[Param(datatype='String',
-                                   name='find')],
-                     java_class_name=None,
-                     type='function'),
-        NativeMethod(return_type='OnFrameAvailableListener', static=True,
-                     name='GetInnerClass',
-                     params=[],
-                     java_class_name=None,
-                     type='function'),
-        NativeMethod(return_type='Bitmap',
-                     static=False,
-                     name='QueryBitmap',
-                     params=[Param(datatype='int',
-                                   name='nativeChromeBrowserProvider'),
-                             Param(datatype='String[]',
-                                   name='projection'),
-                             Param(datatype='String',
-                                   name='selection'),
-                             Param(datatype='String[]',
-                                   name='selectionArgs'),
-                             Param(datatype='String',
-                                   name='sortOrder'),
-                            ],
-                     java_class_name=None,
-                     type='method',
-                     p0_type='ChromeBrowserProvider'),
-        NativeMethod(return_type='void', static=False,
-                     name='GotOrientation',
-                     params=[Param(datatype='int',
-                                   name='nativeDataFetcherImplAndroid'),
-                             Param(datatype='double',
-                                   name='alpha'),
-                             Param(datatype='double',
-                                   name='beta'),
-                             Param(datatype='double',
-                                   name='gamma'),
-                            ],
-                     java_class_name=None,
-                     type='method',
-                     p0_type='content::DataFetcherImplAndroid'),
-        NativeMethod(return_type='Throwable', static=True,
-                     name='MessWithJavaException',
-                     params=[Param(datatype='Throwable', name='e')],
-                     java_class_name=None,
-                     type='function')
-    ]
-    self.assertListEquals(golden_natives, natives)
-    h = jni_generator.InlHeaderFileGenerator('', 'org/chromium/TestJni',
-                                             natives, [], [], TestOptions())
-    self.assertGoldenTextEquals(h.GetContent())
-
-  def testInnerClassNatives(self):
-    test_data = """
-    class MyInnerClass {
-      @NativeCall("MyInnerClass")
-      private native int nativeInit();
-    }
-    """
-    natives = jni_generator.ExtractNatives(test_data, 'int')
-    golden_natives = [
-        NativeMethod(return_type='int', static=False,
-                     name='Init', params=[],
-                     java_class_name='MyInnerClass',
-                     type='function')
-    ]
-    self.assertListEquals(golden_natives, natives)
-    h = jni_generator.InlHeaderFileGenerator('', 'org/chromium/TestJni',
-                                             natives, [], [], TestOptions())
-    self.assertGoldenTextEquals(h.GetContent())
-
-  def testInnerClassNativesMultiple(self):
-    test_data = """
-    class MyInnerClass {
-      @NativeCall("MyInnerClass")
-      private native int nativeInit();
-    }
-    class MyOtherInnerClass {
-      @NativeCall("MyOtherInnerClass")
-      private native int nativeInit();
-    }
-    """
-    natives = jni_generator.ExtractNatives(test_data, 'int')
-    golden_natives = [
-        NativeMethod(return_type='int', static=False,
-                     name='Init', params=[],
-                     java_class_name='MyInnerClass',
-                     type='function'),
-        NativeMethod(return_type='int', static=False,
-                     name='Init', params=[],
-                     java_class_name='MyOtherInnerClass',
-                     type='function')
-    ]
-    self.assertListEquals(golden_natives, natives)
-    h = jni_generator.InlHeaderFileGenerator('', 'org/chromium/TestJni',
-                                             natives, [], [], TestOptions())
-    self.assertGoldenTextEquals(h.GetContent())
-
-  def testInnerClassNativesBothInnerAndOuter(self):
-    test_data = """
-    class MyOuterClass {
-      private native int nativeInit();
-      class MyOtherInnerClass {
-        @NativeCall("MyOtherInnerClass")
-        private native int nativeInit();
-      }
-    }
-    """
-    natives = jni_generator.ExtractNatives(test_data, 'int')
-    golden_natives = [
-        NativeMethod(return_type='int', static=False,
-                     name='Init', params=[],
-                     java_class_name=None,
-                     type='function'),
-        NativeMethod(return_type='int', static=False,
-                     name='Init', params=[],
-                     java_class_name='MyOtherInnerClass',
-                     type='function')
-    ]
-    self.assertListEquals(golden_natives, natives)
-    h = jni_generator.InlHeaderFileGenerator('', 'org/chromium/TestJni',
-                                             natives, [], [], TestOptions())
-    self.assertGoldenTextEquals(h.GetContent())
-
-  def testCalledByNatives(self):
-    test_data = """"
-    import android.graphics.Bitmap;
-    import android.view.View;
-    import java.io.InputStream;
-    import java.util.List;
-
-    class InnerClass {}
-
-    @CalledByNative
-    InnerClass showConfirmInfoBar(int nativeInfoBar,
-            String buttonOk, String buttonCancel, String title, Bitmap icon) {
-        InfoBar infobar = new ConfirmInfoBar(nativeInfoBar, mContext,
-                                             buttonOk, buttonCancel,
-                                             title, icon);
-        return infobar;
-    }
-    @CalledByNative
-    InnerClass showAutoLoginInfoBar(int nativeInfoBar,
-            String realm, String account, String args) {
-        AutoLoginInfoBar infobar = new AutoLoginInfoBar(nativeInfoBar, mContext,
-                realm, account, args);
-        if (infobar.displayedAccountCount() == 0)
-            infobar = null;
-        return infobar;
-    }
-    @CalledByNative("InfoBar")
-    void dismiss();
-    @SuppressWarnings("unused")
-    @CalledByNative
-    private static boolean shouldShowAutoLogin(View view,
-            String realm, String account, String args) {
-        AccountManagerContainer accountManagerContainer =
-            new AccountManagerContainer((Activity)contentView.getContext(),
-            realm, account, args);
-        String[] logins = accountManagerContainer.getAccountLogins(null);
-        return logins.length != 0;
-    }
-    @CalledByNative
-    static InputStream openUrl(String url) {
-        return null;
-    }
-    @CalledByNative
-    private void activateHardwareAcceleration(final boolean activated,
-            final int iPid, final int iType,
-            final int iPrimaryID, final int iSecondaryID) {
-      if (!activated) {
-          return
-      }
-    }
-    @CalledByNative
-    public static @Status int updateStatus(@Status int status) {
-        return getAndUpdateStatus(status);
-    }
-    @CalledByNativeUnchecked
-    private void uncheckedCall(int iParam);
-
-    @CalledByNative
-    public byte[] returnByteArray();
-
-    @CalledByNative
-    public boolean[] returnBooleanArray();
-
-    @CalledByNative
-    public char[] returnCharArray();
-
-    @CalledByNative
-    public short[] returnShortArray();
-
-    @CalledByNative
-    public int[] returnIntArray();
-
-    @CalledByNative
-    public long[] returnLongArray();
-
-    @CalledByNative
-    public double[] returnDoubleArray();
-
-    @CalledByNative
-    public Object[] returnObjectArray();
-
-    @CalledByNative
-    public byte[][] returnArrayOfByteArray();
-
-    @CalledByNative
-    public Bitmap.CompressFormat getCompressFormat();
-
-    @CalledByNative
-    public List<Bitmap.CompressFormat> getCompressFormatList();
-    """
-    jni_generator.JniParams.SetFullyQualifiedClass('org/chromium/Foo')
-    jni_generator.JniParams.ExtractImportsAndInnerClasses(test_data)
-    called_by_natives = jni_generator.ExtractCalledByNatives(test_data)
-    golden_called_by_natives = [
-        CalledByNative(
-            return_type='InnerClass',
-            system_class=False,
-            static=False,
-            name='showConfirmInfoBar',
-            method_id_var_name='showConfirmInfoBar',
-            java_class_name='',
-            params=[Param(datatype='int', name='nativeInfoBar'),
-                    Param(datatype='String', name='buttonOk'),
-                    Param(datatype='String', name='buttonCancel'),
-                    Param(datatype='String', name='title'),
-                    Param(datatype='Bitmap', name='icon')],
-            env_call=('Object', ''),
-            unchecked=False,
-        ),
-        CalledByNative(
-            return_type='InnerClass',
-            system_class=False,
-            static=False,
-            name='showAutoLoginInfoBar',
-            method_id_var_name='showAutoLoginInfoBar',
-            java_class_name='',
-            params=[Param(datatype='int', name='nativeInfoBar'),
-                    Param(datatype='String', name='realm'),
-                    Param(datatype='String', name='account'),
-                    Param(datatype='String', name='args')],
-            env_call=('Object', ''),
-            unchecked=False,
-        ),
-        CalledByNative(
-            return_type='void',
-            system_class=False,
-            static=False,
-            name='dismiss',
-            method_id_var_name='dismiss',
-            java_class_name='InfoBar',
-            params=[],
-            env_call=('Void', ''),
-            unchecked=False,
-        ),
-        CalledByNative(
-            return_type='boolean',
-            system_class=False,
-            static=True,
-            name='shouldShowAutoLogin',
-            method_id_var_name='shouldShowAutoLogin',
-            java_class_name='',
-            params=[Param(datatype='View', name='view'),
-                    Param(datatype='String', name='realm'),
-                    Param(datatype='String', name='account'),
-                    Param(datatype='String', name='args')],
-            env_call=('Boolean', ''),
-            unchecked=False,
-        ),
-        CalledByNative(
-            return_type='InputStream',
-            system_class=False,
-            static=True,
-            name='openUrl',
-            method_id_var_name='openUrl',
-            java_class_name='',
-            params=[Param(datatype='String', name='url')],
-            env_call=('Object', ''),
-            unchecked=False,
-        ),
-        CalledByNative(
-            return_type='void',
-            system_class=False,
-            static=False,
-            name='activateHardwareAcceleration',
-            method_id_var_name='activateHardwareAcceleration',
-            java_class_name='',
-            params=[Param(datatype='boolean', name='activated'),
-                    Param(datatype='int', name='iPid'),
-                    Param(datatype='int', name='iType'),
-                    Param(datatype='int', name='iPrimaryID'),
-                    Param(datatype='int', name='iSecondaryID'),
-                   ],
-            env_call=('Void', ''),
-            unchecked=False,
-        ),
-        CalledByNative(
-          return_type='int',
-          system_class=False,
-          static=True,
-          name='updateStatus',
-          method_id_var_name='updateStatus',
-          java_class_name='',
-          params=[Param(datatype='int', name='status')],
-          env_call=('Integer', ''),
-          unchecked=False,
-        ),
-        CalledByNative(
-            return_type='void',
-            system_class=False,
-            static=False,
-            name='uncheckedCall',
-            method_id_var_name='uncheckedCall',
-            java_class_name='',
-            params=[Param(datatype='int', name='iParam')],
-            env_call=('Void', ''),
-            unchecked=True,
-        ),
-        CalledByNative(
-            return_type='byte[]',
-            system_class=False,
-            static=False,
-            name='returnByteArray',
-            method_id_var_name='returnByteArray',
-            java_class_name='',
-            params=[],
-            env_call=('Void', ''),
-            unchecked=False,
-        ),
-        CalledByNative(
-            return_type='boolean[]',
-            system_class=False,
-            static=False,
-            name='returnBooleanArray',
-            method_id_var_name='returnBooleanArray',
-            java_class_name='',
-            params=[],
-            env_call=('Void', ''),
-            unchecked=False,
-        ),
-        CalledByNative(
-            return_type='char[]',
-            system_class=False,
-            static=False,
-            name='returnCharArray',
-            method_id_var_name='returnCharArray',
-            java_class_name='',
-            params=[],
-            env_call=('Void', ''),
-            unchecked=False,
-        ),
-        CalledByNative(
-            return_type='short[]',
-            system_class=False,
-            static=False,
-            name='returnShortArray',
-            method_id_var_name='returnShortArray',
-            java_class_name='',
-            params=[],
-            env_call=('Void', ''),
-            unchecked=False,
-        ),
-        CalledByNative(
-            return_type='int[]',
-            system_class=False,
-            static=False,
-            name='returnIntArray',
-            method_id_var_name='returnIntArray',
-            java_class_name='',
-            params=[],
-            env_call=('Void', ''),
-            unchecked=False,
-        ),
-        CalledByNative(
-            return_type='long[]',
-            system_class=False,
-            static=False,
-            name='returnLongArray',
-            method_id_var_name='returnLongArray',
-            java_class_name='',
-            params=[],
-            env_call=('Void', ''),
-            unchecked=False,
-        ),
-        CalledByNative(
-            return_type='double[]',
-            system_class=False,
-            static=False,
-            name='returnDoubleArray',
-            method_id_var_name='returnDoubleArray',
-            java_class_name='',
-            params=[],
-            env_call=('Void', ''),
-            unchecked=False,
-        ),
-        CalledByNative(
-            return_type='Object[]',
-            system_class=False,
-            static=False,
-            name='returnObjectArray',
-            method_id_var_name='returnObjectArray',
-            java_class_name='',
-            params=[],
-            env_call=('Void', ''),
-            unchecked=False,
-        ),
-        CalledByNative(
-            return_type='byte[][]',
-            system_class=False,
-            static=False,
-            name='returnArrayOfByteArray',
-            method_id_var_name='returnArrayOfByteArray',
-            java_class_name='',
-            params=[],
-            env_call=('Void', ''),
-            unchecked=False,
-        ),
-        CalledByNative(
-            return_type='Bitmap.CompressFormat',
-            system_class=False,
-            static=False,
-            name='getCompressFormat',
-            method_id_var_name='getCompressFormat',
-            java_class_name='',
-            params=[],
-            env_call=('Void', ''),
-            unchecked=False,
-        ),
-        CalledByNative(
-            return_type='List<Bitmap.CompressFormat>',
-            system_class=False,
-            static=False,
-            name='getCompressFormatList',
-            method_id_var_name='getCompressFormatList',
-            java_class_name='',
-            params=[],
-            env_call=('Void', ''),
-            unchecked=False,
-        ),
-    ]
-    self.assertListEquals(golden_called_by_natives, called_by_natives)
-    h = jni_generator.InlHeaderFileGenerator('', 'org/chromium/TestJni',
-                                             [], called_by_natives, [],
-                                             TestOptions())
-    self.assertGoldenTextEquals(h.GetContent())
-
-  def testCalledByNativeParseError(self):
-    try:
-      jni_generator.ExtractCalledByNatives("""
-@CalledByNative
-public static int foo(); // This one is fine
-
-@CalledByNative
-scooby doo
-""")
-      self.fail('Expected a ParseError')
-    except jni_generator.ParseError, e:
-      self.assertEquals(('@CalledByNative', 'scooby doo'), e.context_lines)
-
-  def testFullyQualifiedClassName(self):
-    contents = """
-// Copyright (c) 2010 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.content.browser;
-
-import org.chromium.base.BuildInfo;
-"""
-    self.assertEquals('org/chromium/content/browser/Foo',
-                      jni_generator.ExtractFullyQualifiedJavaClassName(
-                          'org/chromium/content/browser/Foo.java', contents))
-    self.assertEquals('org/chromium/content/browser/Foo',
-                      jni_generator.ExtractFullyQualifiedJavaClassName(
-                          'frameworks/Foo.java', contents))
-    self.assertRaises(SyntaxError,
-                      jni_generator.ExtractFullyQualifiedJavaClassName,
-                      'com/foo/Bar', 'no PACKAGE line')
-
-  def testMethodNameMangling(self):
-    self.assertEquals('closeV',
-        jni_generator.GetMangledMethodName('close', [], 'void'))
-    self.assertEquals('readI_AB_I_I',
-        jni_generator.GetMangledMethodName('read',
-            [Param(name='p1',
-                   datatype='byte[]'),
-             Param(name='p2',
-                   datatype='int'),
-             Param(name='p3',
-                   datatype='int'),],
-             'int'))
-    self.assertEquals('openJIIS_JLS',
-        jni_generator.GetMangledMethodName('open',
-            [Param(name='p1',
-                   datatype='java/lang/String'),],
-             'java/io/InputStream'))
-
-  def testFromJavaPGenerics(self):
-    contents = """
-public abstract class java.util.HashSet<T> extends java.util.AbstractSet<E>
-      implements java.util.Set<E>, java.lang.Cloneable, java.io.Serializable {
-    public void dummy();
-  Signature: ()V
-}
-"""
-    jni_from_javap = jni_generator.JNIFromJavaP(contents.split('\n'),
-                                                TestOptions())
-    self.assertEquals(1, len(jni_from_javap.called_by_natives))
-    self.assertGoldenTextEquals(jni_from_javap.GetContent())
-
-  def testSnippnetJavap6_7_8(self):
-    content_javap6 = """
-public class java.util.HashSet {
-public boolean add(java.lang.Object);
- Signature: (Ljava/lang/Object;)Z
-}
-"""
-
-    content_javap7 = """
-public class java.util.HashSet {
-public boolean add(E);
-  Signature: (Ljava/lang/Object;)Z
-}
-"""
-
-    content_javap8 = """
-public class java.util.HashSet {
-  public boolean add(E);
-    descriptor: (Ljava/lang/Object;)Z
-}
-"""
-
-    jni_from_javap6 = jni_generator.JNIFromJavaP(content_javap6.split('\n'),
-                                                 TestOptions())
-    jni_from_javap7 = jni_generator.JNIFromJavaP(content_javap7.split('\n'),
-                                                 TestOptions())
-    jni_from_javap8 = jni_generator.JNIFromJavaP(content_javap8.split('\n'),
-                                                 TestOptions())
-    self.assertTrue(jni_from_javap6.GetContent())
-    self.assertTrue(jni_from_javap7.GetContent())
-    self.assertTrue(jni_from_javap8.GetContent())
-    # Ensure the javap7 is correctly parsed and uses the Signature field rather
-    # than the "E" parameter.
-    self.assertTextEquals(jni_from_javap6.GetContent(),
-                          jni_from_javap7.GetContent())
-    # Ensure the javap8 is correctly parsed and uses the descriptor field.
-    self.assertTextEquals(jni_from_javap7.GetContent(),
-                          jni_from_javap8.GetContent())
-
-  def testFromJavaP(self):
-    contents = self._ReadGoldenFile(os.path.join(os.path.dirname(sys.argv[0]),
-        'testInputStream.javap'))
-    jni_from_javap = jni_generator.JNIFromJavaP(contents.split('\n'),
-                                                TestOptions())
-    self.assertEquals(10, len(jni_from_javap.called_by_natives))
-    self.assertGoldenTextEquals(jni_from_javap.GetContent())
-
-  def testConstantsFromJavaP(self):
-    for f in ['testMotionEvent.javap', 'testMotionEvent.javap7']:
-      contents = self._ReadGoldenFile(os.path.join(os.path.dirname(sys.argv[0]),
-          f))
-      jni_from_javap = jni_generator.JNIFromJavaP(contents.split('\n'),
-                                                  TestOptions())
-      self.assertEquals(86, len(jni_from_javap.called_by_natives))
-      self.assertGoldenTextEquals(jni_from_javap.GetContent())
-
-  def testREForNatives(self):
-    # We should not match "native SyncSetupFlow" inside the comment.
-    test_data = """
-    /**
-     * Invoked when the setup process is complete so we can disconnect from the
-     * native-side SyncSetupFlowHandler.
-     */
-    public void destroy() {
-        Log.v(TAG, "Destroying native SyncSetupFlow");
-        if (mNativeSyncSetupFlow != 0) {
-            nativeSyncSetupEnded(mNativeSyncSetupFlow);
-            mNativeSyncSetupFlow = 0;
-        }
-    }
-    private native void nativeSyncSetupEnded(
-        int nativeAndroidSyncSetupFlowHandler);
-    """
-    jni_from_java = jni_generator.JNIFromJavaSource(
-        test_data, 'foo/bar', TestOptions())
-
-  def testRaisesOnNonJNIMethod(self):
-    test_data = """
-    class MyInnerClass {
-      private int Foo(int p0) {
-      }
-    }
-    """
-    self.assertRaises(SyntaxError,
-                      jni_generator.JNIFromJavaSource,
-                      test_data, 'foo/bar', TestOptions())
-
-  def testJniSelfDocumentingExample(self):
-    script_dir = os.path.dirname(sys.argv[0])
-    content = file(os.path.join(script_dir,
-        'java/src/org/chromium/example/jni_generator/SampleForTests.java')
-        ).read()
-    golden_file = os.path.join(script_dir, 'SampleForTests_jni.golden')
-    golden_content = file(golden_file).read()
-    jni_from_java = jni_generator.JNIFromJavaSource(
-        content, 'org/chromium/example/jni_generator/SampleForTests',
-        TestOptions())
-    generated_text = jni_from_java.GetContent()
-    if not self.compareText(golden_content, generated_text):
-      if os.environ.get(REBASELINE_ENV):
-        with file(golden_file, 'w') as f:
-          f.write(generated_text)
-        return
-      self.fail('testJniSelfDocumentingExample')
-
-  def testNoWrappingPreprocessorLines(self):
-    test_data = """
-    package com.google.lookhowextremelylongiam.snarf.icankeepthisupallday;
-
-    class ReallyLongClassNamesAreAllTheRage {
-        private static native int nativeTest();
-    }
-    """
-    jni_from_java = jni_generator.JNIFromJavaSource(
-        test_data, ('com/google/lookhowextremelylongiam/snarf/'
-                    'icankeepthisupallday/ReallyLongClassNamesAreAllTheRage'),
-        TestOptions())
-    jni_lines = jni_from_java.GetContent().split('\n')
-    line = filter(lambda line: line.lstrip().startswith('#ifndef'),
-                  jni_lines)[0]
-    self.assertTrue(len(line) > 80,
-                    ('Expected #ifndef line to be > 80 chars: ', line))
-
-  def testImports(self):
-    import_header = """
-// 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.
-
-package org.chromium.content.app;
-
-import android.app.Service;
-import android.content.Context;
-import android.content.Intent;
-import android.graphics.SurfaceTexture;
-import android.os.Bundle;
-import android.os.IBinder;
-import android.os.ParcelFileDescriptor;
-import android.os.Process;
-import android.os.RemoteException;
-import android.util.Log;
-import android.view.Surface;
-
-import java.util.ArrayList;
-
-import org.chromium.base.annotations.CalledByNative;
-import org.chromium.base.annotations.JNINamespace;
-import org.chromium.content.app.ContentMain;
-import org.chromium.content.browser.SandboxedProcessConnection;
-import org.chromium.content.common.ISandboxedProcessCallback;
-import org.chromium.content.common.ISandboxedProcessService;
-import org.chromium.content.common.WillNotRaise.AnException;
-import org.chromium.content.common.WillRaise.AnException;
-
-import static org.chromium.Bar.Zoo;
-
-class Foo {
-  public static class BookmarkNode implements Parcelable {
-  }
-  public interface PasswordListObserver {
-  }
-}
-    """
-    jni_generator.JniParams.SetFullyQualifiedClass(
-        'org/chromium/content/app/Foo')
-    jni_generator.JniParams.ExtractImportsAndInnerClasses(import_header)
-    self.assertTrue('Lorg/chromium/content/common/ISandboxedProcessService' in
-                    jni_generator.JniParams._imports)
-    self.assertTrue('Lorg/chromium/Bar/Zoo' in
-                    jni_generator.JniParams._imports)
-    self.assertTrue('Lorg/chromium/content/app/Foo$BookmarkNode' in
-                    jni_generator.JniParams._inner_classes)
-    self.assertTrue('Lorg/chromium/content/app/Foo$PasswordListObserver' in
-                    jni_generator.JniParams._inner_classes)
-    self.assertEquals('Lorg/chromium/content/app/ContentMain$Inner;',
-                      jni_generator.JniParams.JavaToJni('ContentMain.Inner'))
-    self.assertRaises(SyntaxError,
-                      jni_generator.JniParams.JavaToJni,
-                      'AnException')
-
-  def testJniParamsJavaToJni(self):
-    self.assertTextEquals('I', JniParams.JavaToJni('int'))
-    self.assertTextEquals('[B', JniParams.JavaToJni('byte[]'))
-    self.assertTextEquals(
-        '[Ljava/nio/ByteBuffer;', JniParams.JavaToJni('java/nio/ByteBuffer[]'))
-
-  def testNativesLong(self):
-    test_options = TestOptions()
-    test_options.ptr_type = 'long'
-    test_data = """"
-    private native void nativeDestroy(long nativeChromeBrowserProvider);
-    """
-    jni_generator.JniParams.ExtractImportsAndInnerClasses(test_data)
-    natives = jni_generator.ExtractNatives(test_data, test_options.ptr_type)
-    golden_natives = [
-        NativeMethod(return_type='void', static=False, name='Destroy',
-                     params=[Param(datatype='long',
-                                   name='nativeChromeBrowserProvider')],
-                     java_class_name=None,
-                     type='method',
-                     p0_type='ChromeBrowserProvider',
-                     ptr_type=test_options.ptr_type),
-    ]
-    self.assertListEquals(golden_natives, natives)
-    h = jni_generator.InlHeaderFileGenerator('', 'org/chromium/TestJni',
-                                             natives, [], [], test_options)
-    self.assertGoldenTextEquals(h.GetContent())
-
-  def testMainDexFile(self):
-    test_data = """
-    package org.chromium.example.jni_generator;
-
-    @MainDex
-    class Test {
-        private static native int nativeStaticMethod(long nativeTest, int arg1);
-    }
-    """
-    options = TestOptions()
-    jni_from_java = jni_generator.JNIFromJavaSource(
-      test_data, 'org/chromium/foo/Bar', options)
-    self.assertGoldenTextEquals(jni_from_java.GetContent())
-
-  def testNonMainDexFile(self):
-    test_data = """
-    package org.chromium.example.jni_generator;
-
-    class Test {
-        private static native int nativeStaticMethod(long nativeTest, int arg1);
-    }
-    """
-    options = TestOptions()
-    jni_from_java = jni_generator.JNIFromJavaSource(
-      test_data, 'org/chromium/foo/Bar', options)
-    self.assertGoldenTextEquals(jni_from_java.GetContent())
-
-  def testNativeExportsOnlyOption(self):
-    test_data = """
-    package org.chromium.example.jni_generator;
-
-    /** The pointer to the native Test. */
-    long nativeTest;
-
-    class Test {
-        private static native int nativeStaticMethod(long nativeTest, int arg1);
-        private native int nativeMethod(long nativeTest, int arg1);
-        @CalledByNative
-        private void testMethodWithParam(int iParam);
-        @CalledByNative
-        private String testMethodWithParamAndReturn(int iParam);
-        @CalledByNative
-        private static int testStaticMethodWithParam(int iParam);
-        @CalledByNative
-        private static double testMethodWithNoParam();
-        @CalledByNative
-        private static String testStaticMethodWithNoParam();
-
-        class MyInnerClass {
-          @NativeCall("MyInnerClass")
-          private native int nativeInit();
-        }
-        class MyOtherInnerClass {
-          @NativeCall("MyOtherInnerClass")
-          private native int nativeInit();
-        }
-    }
-    """
-    options = TestOptions()
-    options.native_exports_optional = False
-    jni_from_java = jni_generator.JNIFromJavaSource(
-        test_data, 'org/chromium/example/jni_generator/SampleForTests', options)
-    self.assertGoldenTextEquals(jni_from_java.GetContent())
-
-  def testOuterInnerRaises(self):
-    test_data = """
-    package org.chromium.media;
-
-    @CalledByNative
-    static int getCaptureFormatWidth(VideoCapture.CaptureFormat format) {
-        return format.getWidth();
-    }
-    """
-    def willRaise():
-      jni_generator.JNIFromJavaSource(
-          test_data,
-          'org/chromium/media/VideoCaptureFactory',
-          TestOptions())
-    self.assertRaises(SyntaxError, willRaise)
-
-  def testSingleJNIAdditionalImport(self):
-    test_data = """
-    package org.chromium.foo;
-
-    @JNIAdditionalImport(Bar.class)
-    class Foo {
-
-    @CalledByNative
-    private static void calledByNative(Bar.Callback callback) {
-    }
-
-    private static native void nativeDoSomething(Bar.Callback callback);
-    }
-    """
-    jni_from_java = jni_generator.JNIFromJavaSource(test_data,
-                                                    'org/chromium/foo/Foo',
-                                                    TestOptions())
-    self.assertGoldenTextEquals(jni_from_java.GetContent())
-
-  def testMultipleJNIAdditionalImport(self):
-    test_data = """
-    package org.chromium.foo;
-
-    @JNIAdditionalImport({Bar1.class, Bar2.class})
-    class Foo {
-
-    @CalledByNative
-    private static void calledByNative(Bar1.Callback callback1,
-                                       Bar2.Callback callback2) {
-    }
-
-    private static native void nativeDoSomething(Bar1.Callback callback1,
-                                                 Bar2.Callback callback2);
-    }
-    """
-    jni_from_java = jni_generator.JNIFromJavaSource(test_data,
-                                                    'org/chromium/foo/Foo',
-                                                    TestOptions())
-    self.assertGoldenTextEquals(jni_from_java.GetContent())
-
-
-def TouchStamp(stamp_path):
-  dir_name = os.path.dirname(stamp_path)
-  if not os.path.isdir(dir_name):
-    os.makedirs(dir_name)
-
-  with open(stamp_path, 'a'):
-    os.utime(stamp_path, None)
-
-
-def main(argv):
-  parser = optparse.OptionParser()
-  parser.add_option('--stamp', help='Path to touch on success.')
-  options, _ = parser.parse_args(argv[1:])
-
-  test_result = unittest.main(argv=argv[0:1], exit=False)
-
-  if test_result.result.wasSuccessful() and options.stamp:
-    TouchStamp(options.stamp)
-
-  return not test_result.result.wasSuccessful()
-
-
-if __name__ == '__main__':
-  sys.exit(main(sys.argv))
diff --git a/base/android/jni_generator/sample_for_tests.cc b/base/android/jni_generator/sample_for_tests.cc
deleted file mode 100644
index 42b2143..0000000
--- a/base/android/jni_generator/sample_for_tests.cc
+++ /dev/null
@@ -1,142 +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 <iostream>
-
-#include "base/android/jni_generator/sample_for_tests.h"
-
-#include "base/android/jni_android.h"
-#include "base/android/jni_string.h"
-#include "base/android/scoped_java_ref.h"
-// Generated file for JNI bindings from C++ to Java @CalledByNative methods.
-// Only to be included in one .cc file.
-// Name is based on the java file name: *.java -> jni/*_jni.h
-#include "jni/SampleForTests_jni.h"  // Generated by JNI.
-
-using base::android::AttachCurrentThread;
-using base::android::ConvertJavaStringToUTF8;
-using base::android::ConvertUTF8ToJavaString;
-using base::android::ScopedJavaLocalRef;
-
-namespace base {
-namespace android {
-
-jdouble CPPClass::InnerClass::MethodOtherP0(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& caller) {
-  return 0.0;
-}
-
-CPPClass::CPPClass() {
-}
-
-CPPClass::~CPPClass() {
-}
-
-// static
-bool CPPClass::RegisterJNI(JNIEnv* env) {
-  return RegisterNativesImpl(env);  // Generated in SampleForTests_jni.h
-}
-
-void CPPClass::Destroy(JNIEnv* env, const JavaParamRef<jobject>& caller) {
-  delete this;
-}
-
-jint CPPClass::Method(JNIEnv* env, const JavaParamRef<jobject>& caller) {
-  return 0;
-}
-
-void CPPClass::AddStructB(JNIEnv* env,
-                          const JavaParamRef<jobject>& caller,
-                          const JavaParamRef<jobject>& structb) {
-  long key = Java_InnerStructB_getKey(env, structb);
-  std::string value =
-      ConvertJavaStringToUTF8(env, Java_InnerStructB_getValue(env, structb));
-  map_[key] = value;
-}
-
-void CPPClass::IterateAndDoSomethingWithStructB(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& caller) {
-  // Iterate over the elements and do something with them.
-  for (std::map<long, std::string>::const_iterator it = map_.begin();
-       it != map_.end(); ++it) {
-    long key = it->first;
-    std::string value = it->second;
-    std::cout << key << value;
-  }
-  map_.clear();
-}
-
-ScopedJavaLocalRef<jstring> CPPClass::ReturnAString(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& caller) {
-  return ConvertUTF8ToJavaString(env, "test");
-}
-
-// Static free functions declared and called directly from java.
-static jlong Init(JNIEnv* env,
-                  const JavaParamRef<jobject>& caller,
-                  const JavaParamRef<jstring>& param) {
-  return 0;
-}
-
-static jdouble GetDoubleFunction(JNIEnv*, const JavaParamRef<jobject>&) {
-  return 0;
-}
-
-static jfloat GetFloatFunction(JNIEnv*, const JavaParamRef<jclass>&) {
-  return 0;
-}
-
-static void SetNonPODDatatype(JNIEnv*,
-                              const JavaParamRef<jobject>&,
-                              const JavaParamRef<jobject>&) {}
-
-static ScopedJavaLocalRef<jobject> GetNonPODDatatype(
-    JNIEnv*,
-    const JavaParamRef<jobject>&) {
-  return ScopedJavaLocalRef<jobject>();
-}
-
-static jint GetInnerIntFunction(JNIEnv*, const JavaParamRef<jclass>&) {
-  return 0;
-}
-
-} // namespace android
-} // namespace base
-
-int main() {
-  // On a regular application, you'd call AttachCurrentThread(). This sample is
-  // not yet linking with all the libraries.
-  JNIEnv* env = /* AttachCurrentThread() */ NULL;
-
-  // This is how you call a java static method from C++.
-  bool foo = base::android::Java_SampleForTests_staticJavaMethod(env);
-
-  // This is how you call a java method from C++. Note that you must have
-  // obtained the jobject somehow.
-  ScopedJavaLocalRef<jobject> my_java_object;
-  int bar = base::android::Java_SampleForTests_javaMethod(
-      env, my_java_object, 1, 2);
-
-  std::cout << foo << bar;
-
-  for (int i = 0; i < 10; ++i) {
-    // Creates a "struct" that will then be used by the java side.
-    ScopedJavaLocalRef<jobject> struct_a =
-        base::android::Java_InnerStructA_create(
-            env, 0, 1, ConvertUTF8ToJavaString(env, "test"));
-    base::android::Java_SampleForTests_addStructA(env, my_java_object,
-                                                  struct_a);
-  }
-  base::android::Java_SampleForTests_iterateAndDoSomething(env, my_java_object);
-  base::android::Java_SampleForTests_packagePrivateJavaMethod(env,
-                                                              my_java_object);
-  base::android::Java_SampleForTests_methodThatThrowsException(env,
-                                                               my_java_object);
-  base::android::Java_SampleForTests_javaMethodWithAnnotatedParam(
-      env, my_java_object, 42);
-  return 0;
-}
diff --git a/base/android/jni_generator/sample_for_tests.h b/base/android/jni_generator/sample_for_tests.h
deleted file mode 100644
index a9cf7b0..0000000
--- a/base/android/jni_generator/sample_for_tests.h
+++ /dev/null
@@ -1,126 +0,0 @@
-// Copyright (c) 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 BASE_ANDROID_JNI_GENERATOR_SAMPLE_FOR_TESTS_H_
-#define BASE_ANDROID_JNI_GENERATOR_SAMPLE_FOR_TESTS_H_
-
-#include <jni.h>
-#include <map>
-#include <string>
-
-#include "base/android/jni_android.h"
-
-namespace base {
-namespace android {
-
-// This file is used to:
-// - document the best practices and guidelines on JNI usage.
-// - ensure sample_for_tests_jni.h compiles and the functions declared in it
-// as expected.
-//
-// Methods are called directly from Java (except RegisterJNI). More
-// documentation in SampleForTests.java
-//
-// For C++ to access Java methods:
-// - GN Build must be configured to generate bindings:
-//  # Add import at top of file:
-//  if (is_android) {
-//    import("//build/config/android/rules.gni")  # For generate_jni().
-//  }
-//  # ...
-//  # An example target that will rely on JNI:
-//  component("foo") {
-//    # ... normal sources, defines, deps.
-//    #     For each jni generated .java -> .h header file in jni_headers
-//    #     target there will be a single .cc file here that includes it.
-//    #
-//    # Add a dep for JNI:
-//    if (is_android) {
-//      deps += [ ":foo_jni" ]
-//    }
-//  }
-//  # ...
-//  # Create target for JNI:
-//  if (is_android) {
-//    generate_jni("jni_headers") {
-//      sources = [
-//        "java/src/org/chromium/example/jni_generator/SampleForTests.java",
-//      ]
-//      jni_package = "foo"
-//    }
-//    android_library("java") {
-//      java_files = [
-//        "java/src/org/chromium/example/jni_generator/SampleForTests.java",
-//        "java/src/org/chromium/example/jni_generator/NonJniFile.java",
-//      ]
-//    }
-//  }
-//
-// For C++ methods to be exposed to Java:
-// - The generated RegisterNativesImpl method must be called, this is typically
-//   done by having a static RegisterJNI method in the C++ class.
-// - The RegisterJNI method is added to a module's collection of register
-//   methods, such as: example_jni_registrar.h/cc files which call
-//   base::android::RegisterNativeMethods.
-//   An example_jni_registstrar.cc:
-//
-//     namespace {
-//     const base::android::RegistrationMethod kRegisteredMethods[] = {
-//         // Initial string is for debugging only.
-//         { "ExampleName", base::ExampleNameAndroid::RegisterJNI },
-//         { "ExampleName2", base::ExampleName2Android::RegisterJNI },
-//     };
-//     }  // namespace
-//
-//     bool RegisterModuleNameJni(JNIEnv* env) {
-//       return RegisterNativeMethods(env, kRegisteredMethods,
-//                                    arraysize(kRegisteredMethods));
-//     }
-//
-//  - Each module's RegisterModuleNameJni must be called by a larger module,
-//    or application during startup.
-//
-class CPPClass {
- public:
-  CPPClass();
-  ~CPPClass();
-
-  // Register C++ methods exposed to Java using JNI.
-  static bool RegisterJNI(JNIEnv* env);
-
-  // Java @CalledByNative methods implicitly available to C++ via the _jni.h
-  // file included in the .cc file.
-
-  class InnerClass {
-   public:
-    jdouble MethodOtherP0(JNIEnv* env,
-                          const base::android::JavaParamRef<jobject>& caller);
-  };
-
-  void Destroy(JNIEnv* env, const base::android::JavaParamRef<jobject>& caller);
-
-  jint Method(JNIEnv* env, const base::android::JavaParamRef<jobject>& caller);
-
-  void AddStructB(JNIEnv* env,
-                  const base::android::JavaParamRef<jobject>& caller,
-                  const base::android::JavaParamRef<jobject>& structb);
-
-  void IterateAndDoSomethingWithStructB(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& caller);
-
-  base::android::ScopedJavaLocalRef<jstring> ReturnAString(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& caller);
-
- private:
-  std::map<long, std::string> map_;
-
-  DISALLOW_COPY_AND_ASSIGN(CPPClass);
-};
-
-}  // namespace android
-}  // namespace base
-
-#endif  // BASE_ANDROID_JNI_GENERATOR_SAMPLE_FOR_TESTS_H_
diff --git a/base/android/jni_generator/testCalledByNatives.golden b/base/android/jni_generator/testCalledByNatives.golden
deleted file mode 100644
index ac86b2e..0000000
--- a/base/android/jni_generator/testCalledByNatives.golden
+++ /dev/null
@@ -1,497 +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.
-
-// This file is autogenerated by
-//     base/android/jni_generator/jni_generator.py
-// For
-//     org/chromium/TestJni
-
-#ifndef org_chromium_TestJni_JNI
-#define org_chromium_TestJni_JNI
-
-#include <jni.h>
-
-#include "base/android/jni_generator/jni_generator_helper.h"
-
-#include "base/android/jni_int_wrapper.h"
-
-// Step 1: forward declarations.
-namespace {
-const char kTestJniClassPath[] = "org/chromium/TestJni";
-const char kInfoBarClassPath[] = "org/chromium/TestJni$InfoBar";
-// Leaking this jclass as we cannot use LazyInstance from some threads.
-base::subtle::AtomicWord g_TestJni_clazz __attribute__((unused)) = 0;
-#define TestJni_clazz(env) base::android::LazyGetClass(env, kTestJniClassPath, &g_TestJni_clazz)
-// Leaking this jclass as we cannot use LazyInstance from some threads.
-base::subtle::AtomicWord g_InfoBar_clazz __attribute__((unused)) = 0;
-#define InfoBar_clazz(env) base::android::LazyGetClass(env, kInfoBarClassPath, &g_InfoBar_clazz)
-
-}  // namespace
-
-// Step 2: method stubs.
-
-static base::subtle::AtomicWord g_TestJni_showConfirmInfoBar = 0;
-static base::android::ScopedJavaLocalRef<jobject>
-    Java_TestJni_showConfirmInfoBar(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper nativeInfoBar,
-    const base::android::JavaRefOrBare<jstring>& buttonOk,
-    const base::android::JavaRefOrBare<jstring>& buttonCancel,
-    const base::android::JavaRefOrBare<jstring>& title,
-    const base::android::JavaRefOrBare<jobject>& icon) {
-  CHECK_CLAZZ(env, obj.obj(),
-      TestJni_clazz(env), NULL);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, TestJni_clazz(env),
-      "showConfirmInfoBar",
-"("
-"I"
-"Ljava/lang/String;"
-"Ljava/lang/String;"
-"Ljava/lang/String;"
-"Landroid/graphics/Bitmap;"
-")"
-"Lorg/chromium/Foo$InnerClass;",
-      &g_TestJni_showConfirmInfoBar);
-
-  jobject ret =
-      env->CallObjectMethod(obj.obj(),
-          method_id, as_jint(nativeInfoBar), buttonOk.obj(), buttonCancel.obj(),
-              title.obj(), icon.obj());
-  jni_generator::CheckException(env);
-  return base::android::ScopedJavaLocalRef<jobject>(env, ret);
-}
-
-static base::subtle::AtomicWord g_TestJni_showAutoLoginInfoBar = 0;
-static base::android::ScopedJavaLocalRef<jobject>
-    Java_TestJni_showAutoLoginInfoBar(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper nativeInfoBar,
-    const base::android::JavaRefOrBare<jstring>& realm,
-    const base::android::JavaRefOrBare<jstring>& account,
-    const base::android::JavaRefOrBare<jstring>& args) {
-  CHECK_CLAZZ(env, obj.obj(),
-      TestJni_clazz(env), NULL);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, TestJni_clazz(env),
-      "showAutoLoginInfoBar",
-"("
-"I"
-"Ljava/lang/String;"
-"Ljava/lang/String;"
-"Ljava/lang/String;"
-")"
-"Lorg/chromium/Foo$InnerClass;",
-      &g_TestJni_showAutoLoginInfoBar);
-
-  jobject ret =
-      env->CallObjectMethod(obj.obj(),
-          method_id, as_jint(nativeInfoBar), realm.obj(), account.obj(),
-              args.obj());
-  jni_generator::CheckException(env);
-  return base::android::ScopedJavaLocalRef<jobject>(env, ret);
-}
-
-static base::subtle::AtomicWord g_InfoBar_dismiss = 0;
-static void Java_InfoBar_dismiss(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      InfoBar_clazz(env));
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, InfoBar_clazz(env),
-      "dismiss",
-"("
-")"
-"V",
-      &g_InfoBar_dismiss);
-
-     env->CallVoidMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-}
-
-static base::subtle::AtomicWord g_TestJni_shouldShowAutoLogin = 0;
-static jboolean Java_TestJni_shouldShowAutoLogin(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& view,
-    const base::android::JavaRefOrBare<jstring>& realm,
-    const base::android::JavaRefOrBare<jstring>& account,
-    const base::android::JavaRefOrBare<jstring>& args) {
-  CHECK_CLAZZ(env, TestJni_clazz(env),
-      TestJni_clazz(env), false);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_STATIC>(
-      env, TestJni_clazz(env),
-      "shouldShowAutoLogin",
-"("
-"Landroid/view/View;"
-"Ljava/lang/String;"
-"Ljava/lang/String;"
-"Ljava/lang/String;"
-")"
-"Z",
-      &g_TestJni_shouldShowAutoLogin);
-
-  jboolean ret =
-      env->CallStaticBooleanMethod(TestJni_clazz(env),
-          method_id, view.obj(), realm.obj(), account.obj(), args.obj());
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_TestJni_openUrl = 0;
-static base::android::ScopedJavaLocalRef<jobject> Java_TestJni_openUrl(JNIEnv*
-    env, const base::android::JavaRefOrBare<jstring>& url) {
-  CHECK_CLAZZ(env, TestJni_clazz(env),
-      TestJni_clazz(env), NULL);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_STATIC>(
-      env, TestJni_clazz(env),
-      "openUrl",
-"("
-"Ljava/lang/String;"
-")"
-"Ljava/io/InputStream;",
-      &g_TestJni_openUrl);
-
-  jobject ret =
-      env->CallStaticObjectMethod(TestJni_clazz(env),
-          method_id, url.obj());
-  jni_generator::CheckException(env);
-  return base::android::ScopedJavaLocalRef<jobject>(env, ret);
-}
-
-static base::subtle::AtomicWord g_TestJni_activateHardwareAcceleration = 0;
-static void Java_TestJni_activateHardwareAcceleration(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, jboolean activated,
-    JniIntWrapper iPid,
-    JniIntWrapper iType,
-    JniIntWrapper iPrimaryID,
-    JniIntWrapper iSecondaryID) {
-  CHECK_CLAZZ(env, obj.obj(),
-      TestJni_clazz(env));
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, TestJni_clazz(env),
-      "activateHardwareAcceleration",
-"("
-"Z"
-"I"
-"I"
-"I"
-"I"
-")"
-"V",
-      &g_TestJni_activateHardwareAcceleration);
-
-     env->CallVoidMethod(obj.obj(),
-          method_id, activated, as_jint(iPid), as_jint(iType),
-              as_jint(iPrimaryID), as_jint(iSecondaryID));
-  jni_generator::CheckException(env);
-}
-
-static base::subtle::AtomicWord g_TestJni_updateStatus = 0;
-static jint Java_TestJni_updateStatus(JNIEnv* env, JniIntWrapper status) {
-  CHECK_CLAZZ(env, TestJni_clazz(env),
-      TestJni_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_STATIC>(
-      env, TestJni_clazz(env),
-      "updateStatus",
-"("
-"I"
-")"
-"I",
-      &g_TestJni_updateStatus);
-
-  jint ret =
-      env->CallStaticIntMethod(TestJni_clazz(env),
-          method_id, as_jint(status));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_TestJni_uncheckedCall = 0;
-static void Java_TestJni_uncheckedCall(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper iParam) {
-  CHECK_CLAZZ(env, obj.obj(),
-      TestJni_clazz(env));
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, TestJni_clazz(env),
-      "uncheckedCall",
-"("
-"I"
-")"
-"V",
-      &g_TestJni_uncheckedCall);
-
-     env->CallVoidMethod(obj.obj(),
-          method_id, as_jint(iParam));
-}
-
-static base::subtle::AtomicWord g_TestJni_returnByteArray = 0;
-static base::android::ScopedJavaLocalRef<jbyteArray>
-    Java_TestJni_returnByteArray(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      TestJni_clazz(env), NULL);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, TestJni_clazz(env),
-      "returnByteArray",
-"("
-")"
-"[B",
-      &g_TestJni_returnByteArray);
-
-  jbyteArray ret =
-      static_cast<jbyteArray>(env->CallObjectMethod(obj.obj(),
-          method_id));
-  jni_generator::CheckException(env);
-  return base::android::ScopedJavaLocalRef<jbyteArray>(env, ret);
-}
-
-static base::subtle::AtomicWord g_TestJni_returnBooleanArray = 0;
-static base::android::ScopedJavaLocalRef<jbooleanArray>
-    Java_TestJni_returnBooleanArray(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      TestJni_clazz(env), NULL);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, TestJni_clazz(env),
-      "returnBooleanArray",
-"("
-")"
-"[Z",
-      &g_TestJni_returnBooleanArray);
-
-  jbooleanArray ret =
-      static_cast<jbooleanArray>(env->CallObjectMethod(obj.obj(),
-          method_id));
-  jni_generator::CheckException(env);
-  return base::android::ScopedJavaLocalRef<jbooleanArray>(env, ret);
-}
-
-static base::subtle::AtomicWord g_TestJni_returnCharArray = 0;
-static base::android::ScopedJavaLocalRef<jcharArray>
-    Java_TestJni_returnCharArray(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      TestJni_clazz(env), NULL);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, TestJni_clazz(env),
-      "returnCharArray",
-"("
-")"
-"[C",
-      &g_TestJni_returnCharArray);
-
-  jcharArray ret =
-      static_cast<jcharArray>(env->CallObjectMethod(obj.obj(),
-          method_id));
-  jni_generator::CheckException(env);
-  return base::android::ScopedJavaLocalRef<jcharArray>(env, ret);
-}
-
-static base::subtle::AtomicWord g_TestJni_returnShortArray = 0;
-static base::android::ScopedJavaLocalRef<jshortArray>
-    Java_TestJni_returnShortArray(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      TestJni_clazz(env), NULL);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, TestJni_clazz(env),
-      "returnShortArray",
-"("
-")"
-"[S",
-      &g_TestJni_returnShortArray);
-
-  jshortArray ret =
-      static_cast<jshortArray>(env->CallObjectMethod(obj.obj(),
-          method_id));
-  jni_generator::CheckException(env);
-  return base::android::ScopedJavaLocalRef<jshortArray>(env, ret);
-}
-
-static base::subtle::AtomicWord g_TestJni_returnIntArray = 0;
-static base::android::ScopedJavaLocalRef<jintArray>
-    Java_TestJni_returnIntArray(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      TestJni_clazz(env), NULL);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, TestJni_clazz(env),
-      "returnIntArray",
-"("
-")"
-"[I",
-      &g_TestJni_returnIntArray);
-
-  jintArray ret =
-      static_cast<jintArray>(env->CallObjectMethod(obj.obj(),
-          method_id));
-  jni_generator::CheckException(env);
-  return base::android::ScopedJavaLocalRef<jintArray>(env, ret);
-}
-
-static base::subtle::AtomicWord g_TestJni_returnLongArray = 0;
-static base::android::ScopedJavaLocalRef<jlongArray>
-    Java_TestJni_returnLongArray(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      TestJni_clazz(env), NULL);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, TestJni_clazz(env),
-      "returnLongArray",
-"("
-")"
-"[J",
-      &g_TestJni_returnLongArray);
-
-  jlongArray ret =
-      static_cast<jlongArray>(env->CallObjectMethod(obj.obj(),
-          method_id));
-  jni_generator::CheckException(env);
-  return base::android::ScopedJavaLocalRef<jlongArray>(env, ret);
-}
-
-static base::subtle::AtomicWord g_TestJni_returnDoubleArray = 0;
-static base::android::ScopedJavaLocalRef<jdoubleArray>
-    Java_TestJni_returnDoubleArray(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      TestJni_clazz(env), NULL);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, TestJni_clazz(env),
-      "returnDoubleArray",
-"("
-")"
-"[D",
-      &g_TestJni_returnDoubleArray);
-
-  jdoubleArray ret =
-      static_cast<jdoubleArray>(env->CallObjectMethod(obj.obj(),
-          method_id));
-  jni_generator::CheckException(env);
-  return base::android::ScopedJavaLocalRef<jdoubleArray>(env, ret);
-}
-
-static base::subtle::AtomicWord g_TestJni_returnObjectArray = 0;
-static base::android::ScopedJavaLocalRef<jobjectArray>
-    Java_TestJni_returnObjectArray(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      TestJni_clazz(env), NULL);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, TestJni_clazz(env),
-      "returnObjectArray",
-"("
-")"
-"[Ljava/lang/Object;",
-      &g_TestJni_returnObjectArray);
-
-  jobjectArray ret =
-      static_cast<jobjectArray>(env->CallObjectMethod(obj.obj(),
-          method_id));
-  jni_generator::CheckException(env);
-  return base::android::ScopedJavaLocalRef<jobjectArray>(env, ret);
-}
-
-static base::subtle::AtomicWord g_TestJni_returnArrayOfByteArray = 0;
-static base::android::ScopedJavaLocalRef<jobjectArray>
-    Java_TestJni_returnArrayOfByteArray(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      TestJni_clazz(env), NULL);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, TestJni_clazz(env),
-      "returnArrayOfByteArray",
-"("
-")"
-"[[B",
-      &g_TestJni_returnArrayOfByteArray);
-
-  jobjectArray ret =
-      static_cast<jobjectArray>(env->CallObjectMethod(obj.obj(),
-          method_id));
-  jni_generator::CheckException(env);
-  return base::android::ScopedJavaLocalRef<jobjectArray>(env, ret);
-}
-
-static base::subtle::AtomicWord g_TestJni_getCompressFormat = 0;
-static base::android::ScopedJavaLocalRef<jobject>
-    Java_TestJni_getCompressFormat(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      TestJni_clazz(env), NULL);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, TestJni_clazz(env),
-      "getCompressFormat",
-"("
-")"
-"Landroid/graphics/Bitmap$CompressFormat;",
-      &g_TestJni_getCompressFormat);
-
-  jobject ret =
-      env->CallObjectMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-  return base::android::ScopedJavaLocalRef<jobject>(env, ret);
-}
-
-static base::subtle::AtomicWord g_TestJni_getCompressFormatList = 0;
-static base::android::ScopedJavaLocalRef<jobject>
-    Java_TestJni_getCompressFormatList(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      TestJni_clazz(env), NULL);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, TestJni_clazz(env),
-      "getCompressFormatList",
-"("
-")"
-"Ljava/util/List;",
-      &g_TestJni_getCompressFormatList);
-
-  jobject ret =
-      env->CallObjectMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-  return base::android::ScopedJavaLocalRef<jobject>(env, ret);
-}
-
-// Step 3: RegisterNatives.
-
-#endif  // org_chromium_TestJni_JNI
diff --git a/base/android/jni_generator/testConstantsFromJavaP.golden b/base/android/jni_generator/testConstantsFromJavaP.golden
deleted file mode 100644
index b16956f..0000000
--- a/base/android/jni_generator/testConstantsFromJavaP.golden
+++ /dev/null
@@ -1,2195 +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.
-
-// This file is autogenerated by
-//     base/android/jni_generator/jni_generator.py
-// For
-//     android/view/MotionEvent
-
-#ifndef android_view_MotionEvent_JNI
-#define android_view_MotionEvent_JNI
-
-#include <jni.h>
-
-#include "base/android/jni_generator/jni_generator_helper.h"
-
-#include "base/android/jni_int_wrapper.h"
-
-// Step 1: forward declarations.
-namespace {
-const char kMotionEventClassPath[] = "android/view/MotionEvent";
-// Leaking this jclass as we cannot use LazyInstance from some threads.
-base::subtle::AtomicWord g_MotionEvent_clazz __attribute__((unused)) = 0;
-#define MotionEvent_clazz(env) base::android::LazyGetClass(env, kMotionEventClassPath, &g_MotionEvent_clazz)
-
-}  // namespace
-
-namespace JNI_MotionEvent {
-
-enum Java_MotionEvent_constant_fields {
-  INVALID_POINTER_ID = -1,
-  ACTION_MASK = 255,
-  ACTION_DOWN = 0,
-  ACTION_UP = 1,
-  ACTION_MOVE = 2,
-  ACTION_CANCEL = 3,
-  ACTION_OUTSIDE = 4,
-  ACTION_POINTER_DOWN = 5,
-  ACTION_POINTER_UP = 6,
-  ACTION_HOVER_MOVE = 7,
-  ACTION_SCROLL = 8,
-  ACTION_HOVER_ENTER = 9,
-  ACTION_HOVER_EXIT = 10,
-  ACTION_POINTER_INDEX_MASK = 65280,
-  ACTION_POINTER_INDEX_SHIFT = 8,
-  ACTION_POINTER_1_DOWN = 5,
-  ACTION_POINTER_2_DOWN = 261,
-  ACTION_POINTER_3_DOWN = 517,
-  ACTION_POINTER_1_UP = 6,
-  ACTION_POINTER_2_UP = 262,
-  ACTION_POINTER_3_UP = 518,
-  ACTION_POINTER_ID_MASK = 65280,
-  ACTION_POINTER_ID_SHIFT = 8,
-  FLAG_WINDOW_IS_OBSCURED = 1,
-  EDGE_TOP = 1,
-  EDGE_BOTTOM = 2,
-  EDGE_LEFT = 4,
-  EDGE_RIGHT = 8,
-  AXIS_X = 0,
-  AXIS_Y = 1,
-  AXIS_PRESSURE = 2,
-  AXIS_SIZE = 3,
-  AXIS_TOUCH_MAJOR = 4,
-  AXIS_TOUCH_MINOR = 5,
-  AXIS_TOOL_MAJOR = 6,
-  AXIS_TOOL_MINOR = 7,
-  AXIS_ORIENTATION = 8,
-  AXIS_VSCROLL = 9,
-  AXIS_HSCROLL = 10,
-  AXIS_Z = 11,
-  AXIS_RX = 12,
-  AXIS_RY = 13,
-  AXIS_RZ = 14,
-  AXIS_HAT_X = 15,
-  AXIS_HAT_Y = 16,
-  AXIS_LTRIGGER = 17,
-  AXIS_RTRIGGER = 18,
-  AXIS_THROTTLE = 19,
-  AXIS_RUDDER = 20,
-  AXIS_WHEEL = 21,
-  AXIS_GAS = 22,
-  AXIS_BRAKE = 23,
-  AXIS_DISTANCE = 24,
-  AXIS_TILT = 25,
-  AXIS_GENERIC_1 = 32,
-  AXIS_GENERIC_2 = 33,
-  AXIS_GENERIC_3 = 34,
-  AXIS_GENERIC_4 = 35,
-  AXIS_GENERIC_5 = 36,
-  AXIS_GENERIC_6 = 37,
-  AXIS_GENERIC_7 = 38,
-  AXIS_GENERIC_8 = 39,
-  AXIS_GENERIC_9 = 40,
-  AXIS_GENERIC_10 = 41,
-  AXIS_GENERIC_11 = 42,
-  AXIS_GENERIC_12 = 43,
-  AXIS_GENERIC_13 = 44,
-  AXIS_GENERIC_14 = 45,
-  AXIS_GENERIC_15 = 46,
-  AXIS_GENERIC_16 = 47,
-  BUTTON_PRIMARY = 1,
-  BUTTON_SECONDARY = 2,
-  BUTTON_TERTIARY = 4,
-  BUTTON_BACK = 8,
-  BUTTON_FORWARD = 16,
-  TOOL_TYPE_UNKNOWN = 0,
-  TOOL_TYPE_FINGER = 1,
-  TOOL_TYPE_STYLUS = 2,
-  TOOL_TYPE_MOUSE = 3,
-  TOOL_TYPE_ERASER = 4,
-};
-
-// Step 2: method stubs.
-
-static base::subtle::AtomicWord g_MotionEvent_finalize = 0;
-static void Java_MotionEvent_finalize(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static void Java_MotionEvent_finalize(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env));
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "finalize",
-      "()V",
-      &g_MotionEvent_finalize);
-
-     env->CallVoidMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-}
-
-static base::subtle::AtomicWord
-    g_MotionEvent_obtainAVME_J_J_I_I_LAVMEPP_LAVMEPC_I_I_F_F_I_I_I_I = 0;
-static base::android::ScopedJavaLocalRef<jobject>
-    Java_MotionEvent_obtainAVME_J_J_I_I_LAVMEPP_LAVMEPC_I_I_F_F_I_I_I_I(JNIEnv*
-    env, jlong p0,
-    jlong p1,
-    JniIntWrapper p2,
-    JniIntWrapper p3,
-    const base::android::JavaRefOrBare<jobjectArray>& p4,
-    const base::android::JavaRefOrBare<jobjectArray>& p5,
-    JniIntWrapper p6,
-    JniIntWrapper p7,
-    jfloat p8,
-    jfloat p9,
-    JniIntWrapper p10,
-    JniIntWrapper p11,
-    JniIntWrapper p12,
-    JniIntWrapper p13) __attribute__ ((unused));
-static base::android::ScopedJavaLocalRef<jobject>
-    Java_MotionEvent_obtainAVME_J_J_I_I_LAVMEPP_LAVMEPC_I_I_F_F_I_I_I_I(JNIEnv*
-    env, jlong p0,
-    jlong p1,
-    JniIntWrapper p2,
-    JniIntWrapper p3,
-    const base::android::JavaRefOrBare<jobjectArray>& p4,
-    const base::android::JavaRefOrBare<jobjectArray>& p5,
-    JniIntWrapper p6,
-    JniIntWrapper p7,
-    jfloat p8,
-    jfloat p9,
-    JniIntWrapper p10,
-    JniIntWrapper p11,
-    JniIntWrapper p12,
-    JniIntWrapper p13) {
-  CHECK_CLAZZ(env, MotionEvent_clazz(env),
-      MotionEvent_clazz(env), NULL);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_STATIC>(
-      env, MotionEvent_clazz(env),
-      "obtain",
-"(JJII[Landroid/view/MotionEvent$PointerProperties;[Landroid/view/MotionEvent$PointerCoords;IIFFIIII)Landroid/view/MotionEvent;",
-      &g_MotionEvent_obtainAVME_J_J_I_I_LAVMEPP_LAVMEPC_I_I_F_F_I_I_I_I);
-
-  jobject ret =
-      env->CallStaticObjectMethod(MotionEvent_clazz(env),
-          method_id, p0, p1, as_jint(p2), as_jint(p3), p4.obj(), p5.obj(),
-              as_jint(p6), as_jint(p7), p8, p9, as_jint(p10), as_jint(p11),
-              as_jint(p12), as_jint(p13));
-  jni_generator::CheckException(env);
-  return base::android::ScopedJavaLocalRef<jobject>(env, ret);
-}
-
-static base::subtle::AtomicWord
-    g_MotionEvent_obtainAVME_J_J_I_I_AI_LAVMEPC_I_F_F_I_I_I_I = 0;
-static base::android::ScopedJavaLocalRef<jobject>
-    Java_MotionEvent_obtainAVME_J_J_I_I_AI_LAVMEPC_I_F_F_I_I_I_I(JNIEnv* env,
-    jlong p0,
-    jlong p1,
-    JniIntWrapper p2,
-    JniIntWrapper p3,
-    const base::android::JavaRefOrBare<jintArray>& p4,
-    const base::android::JavaRefOrBare<jobjectArray>& p5,
-    JniIntWrapper p6,
-    jfloat p7,
-    jfloat p8,
-    JniIntWrapper p9,
-    JniIntWrapper p10,
-    JniIntWrapper p11,
-    JniIntWrapper p12) __attribute__ ((unused));
-static base::android::ScopedJavaLocalRef<jobject>
-    Java_MotionEvent_obtainAVME_J_J_I_I_AI_LAVMEPC_I_F_F_I_I_I_I(JNIEnv* env,
-    jlong p0,
-    jlong p1,
-    JniIntWrapper p2,
-    JniIntWrapper p3,
-    const base::android::JavaRefOrBare<jintArray>& p4,
-    const base::android::JavaRefOrBare<jobjectArray>& p5,
-    JniIntWrapper p6,
-    jfloat p7,
-    jfloat p8,
-    JniIntWrapper p9,
-    JniIntWrapper p10,
-    JniIntWrapper p11,
-    JniIntWrapper p12) {
-  CHECK_CLAZZ(env, MotionEvent_clazz(env),
-      MotionEvent_clazz(env), NULL);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_STATIC>(
-      env, MotionEvent_clazz(env),
-      "obtain",
-"(JJII[I[Landroid/view/MotionEvent$PointerCoords;IFFIIII)Landroid/view/MotionEvent;",
-      &g_MotionEvent_obtainAVME_J_J_I_I_AI_LAVMEPC_I_F_F_I_I_I_I);
-
-  jobject ret =
-      env->CallStaticObjectMethod(MotionEvent_clazz(env),
-          method_id, p0, p1, as_jint(p2), as_jint(p3), p4.obj(), p5.obj(),
-              as_jint(p6), p7, p8, as_jint(p9), as_jint(p10), as_jint(p11),
-              as_jint(p12));
-  jni_generator::CheckException(env);
-  return base::android::ScopedJavaLocalRef<jobject>(env, ret);
-}
-
-static base::subtle::AtomicWord g_MotionEvent_obtainAVME_J_J_I_F_F_F_F_I_F_F_I_I
-    = 0;
-static base::android::ScopedJavaLocalRef<jobject>
-    Java_MotionEvent_obtainAVME_J_J_I_F_F_F_F_I_F_F_I_I(JNIEnv* env, jlong p0,
-    jlong p1,
-    JniIntWrapper p2,
-    jfloat p3,
-    jfloat p4,
-    jfloat p5,
-    jfloat p6,
-    JniIntWrapper p7,
-    jfloat p8,
-    jfloat p9,
-    JniIntWrapper p10,
-    JniIntWrapper p11) __attribute__ ((unused));
-static base::android::ScopedJavaLocalRef<jobject>
-    Java_MotionEvent_obtainAVME_J_J_I_F_F_F_F_I_F_F_I_I(JNIEnv* env, jlong p0,
-    jlong p1,
-    JniIntWrapper p2,
-    jfloat p3,
-    jfloat p4,
-    jfloat p5,
-    jfloat p6,
-    JniIntWrapper p7,
-    jfloat p8,
-    jfloat p9,
-    JniIntWrapper p10,
-    JniIntWrapper p11) {
-  CHECK_CLAZZ(env, MotionEvent_clazz(env),
-      MotionEvent_clazz(env), NULL);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_STATIC>(
-      env, MotionEvent_clazz(env),
-      "obtain",
-      "(JJIFFFFIFFII)Landroid/view/MotionEvent;",
-      &g_MotionEvent_obtainAVME_J_J_I_F_F_F_F_I_F_F_I_I);
-
-  jobject ret =
-      env->CallStaticObjectMethod(MotionEvent_clazz(env),
-          method_id, p0, p1, as_jint(p2), p3, p4, p5, p6, as_jint(p7), p8, p9,
-              as_jint(p10), as_jint(p11));
-  jni_generator::CheckException(env);
-  return base::android::ScopedJavaLocalRef<jobject>(env, ret);
-}
-
-static base::subtle::AtomicWord
-    g_MotionEvent_obtainAVME_J_J_I_I_F_F_F_F_I_F_F_I_I = 0;
-static base::android::ScopedJavaLocalRef<jobject>
-    Java_MotionEvent_obtainAVME_J_J_I_I_F_F_F_F_I_F_F_I_I(JNIEnv* env, jlong p0,
-    jlong p1,
-    JniIntWrapper p2,
-    JniIntWrapper p3,
-    jfloat p4,
-    jfloat p5,
-    jfloat p6,
-    jfloat p7,
-    JniIntWrapper p8,
-    jfloat p9,
-    jfloat p10,
-    JniIntWrapper p11,
-    JniIntWrapper p12) __attribute__ ((unused));
-static base::android::ScopedJavaLocalRef<jobject>
-    Java_MotionEvent_obtainAVME_J_J_I_I_F_F_F_F_I_F_F_I_I(JNIEnv* env, jlong p0,
-    jlong p1,
-    JniIntWrapper p2,
-    JniIntWrapper p3,
-    jfloat p4,
-    jfloat p5,
-    jfloat p6,
-    jfloat p7,
-    JniIntWrapper p8,
-    jfloat p9,
-    jfloat p10,
-    JniIntWrapper p11,
-    JniIntWrapper p12) {
-  CHECK_CLAZZ(env, MotionEvent_clazz(env),
-      MotionEvent_clazz(env), NULL);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_STATIC>(
-      env, MotionEvent_clazz(env),
-      "obtain",
-      "(JJIIFFFFIFFII)Landroid/view/MotionEvent;",
-      &g_MotionEvent_obtainAVME_J_J_I_I_F_F_F_F_I_F_F_I_I);
-
-  jobject ret =
-      env->CallStaticObjectMethod(MotionEvent_clazz(env),
-          method_id, p0, p1, as_jint(p2), as_jint(p3), p4, p5, p6, p7,
-              as_jint(p8), p9, p10, as_jint(p11), as_jint(p12));
-  jni_generator::CheckException(env);
-  return base::android::ScopedJavaLocalRef<jobject>(env, ret);
-}
-
-static base::subtle::AtomicWord g_MotionEvent_obtainAVME_J_J_I_F_F_I = 0;
-static base::android::ScopedJavaLocalRef<jobject>
-    Java_MotionEvent_obtainAVME_J_J_I_F_F_I(JNIEnv* env, jlong p0,
-    jlong p1,
-    JniIntWrapper p2,
-    jfloat p3,
-    jfloat p4,
-    JniIntWrapper p5) __attribute__ ((unused));
-static base::android::ScopedJavaLocalRef<jobject>
-    Java_MotionEvent_obtainAVME_J_J_I_F_F_I(JNIEnv* env, jlong p0,
-    jlong p1,
-    JniIntWrapper p2,
-    jfloat p3,
-    jfloat p4,
-    JniIntWrapper p5) {
-  CHECK_CLAZZ(env, MotionEvent_clazz(env),
-      MotionEvent_clazz(env), NULL);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_STATIC>(
-      env, MotionEvent_clazz(env),
-      "obtain",
-      "(JJIFFI)Landroid/view/MotionEvent;",
-      &g_MotionEvent_obtainAVME_J_J_I_F_F_I);
-
-  jobject ret =
-      env->CallStaticObjectMethod(MotionEvent_clazz(env),
-          method_id, p0, p1, as_jint(p2), p3, p4, as_jint(p5));
-  jni_generator::CheckException(env);
-  return base::android::ScopedJavaLocalRef<jobject>(env, ret);
-}
-
-static base::subtle::AtomicWord g_MotionEvent_obtainAVME_AVME = 0;
-static base::android::ScopedJavaLocalRef<jobject>
-    Java_MotionEvent_obtainAVME_AVME(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& p0) __attribute__ ((unused));
-static base::android::ScopedJavaLocalRef<jobject>
-    Java_MotionEvent_obtainAVME_AVME(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& p0) {
-  CHECK_CLAZZ(env, MotionEvent_clazz(env),
-      MotionEvent_clazz(env), NULL);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_STATIC>(
-      env, MotionEvent_clazz(env),
-      "obtain",
-      "(Landroid/view/MotionEvent;)Landroid/view/MotionEvent;",
-      &g_MotionEvent_obtainAVME_AVME);
-
-  jobject ret =
-      env->CallStaticObjectMethod(MotionEvent_clazz(env),
-          method_id, p0.obj());
-  jni_generator::CheckException(env);
-  return base::android::ScopedJavaLocalRef<jobject>(env, ret);
-}
-
-static base::subtle::AtomicWord g_MotionEvent_obtainNoHistory = 0;
-static base::android::ScopedJavaLocalRef<jobject>
-    Java_MotionEvent_obtainNoHistory(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& p0) __attribute__ ((unused));
-static base::android::ScopedJavaLocalRef<jobject>
-    Java_MotionEvent_obtainNoHistory(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& p0) {
-  CHECK_CLAZZ(env, MotionEvent_clazz(env),
-      MotionEvent_clazz(env), NULL);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_STATIC>(
-      env, MotionEvent_clazz(env),
-      "obtainNoHistory",
-      "(Landroid/view/MotionEvent;)Landroid/view/MotionEvent;",
-      &g_MotionEvent_obtainNoHistory);
-
-  jobject ret =
-      env->CallStaticObjectMethod(MotionEvent_clazz(env),
-          method_id, p0.obj());
-  jni_generator::CheckException(env);
-  return base::android::ScopedJavaLocalRef<jobject>(env, ret);
-}
-
-static base::subtle::AtomicWord g_MotionEvent_recycle = 0;
-static void Java_MotionEvent_recycle(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static void Java_MotionEvent_recycle(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env));
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "recycle",
-      "()V",
-      &g_MotionEvent_recycle);
-
-     env->CallVoidMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getDeviceId = 0;
-static jint Java_MotionEvent_getDeviceId(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static jint Java_MotionEvent_getDeviceId(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getDeviceId",
-      "()I",
-      &g_MotionEvent_getDeviceId);
-
-  jint ret =
-      env->CallIntMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getSource = 0;
-static jint Java_MotionEvent_getSource(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static jint Java_MotionEvent_getSource(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getSource",
-      "()I",
-      &g_MotionEvent_getSource);
-
-  jint ret =
-      env->CallIntMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_setSource = 0;
-static void Java_MotionEvent_setSource(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
-    ((unused));
-static void Java_MotionEvent_setSource(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env));
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "setSource",
-      "(I)V",
-      &g_MotionEvent_setSource);
-
-     env->CallVoidMethod(obj.obj(),
-          method_id, as_jint(p0));
-  jni_generator::CheckException(env);
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getAction = 0;
-static jint Java_MotionEvent_getAction(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static jint Java_MotionEvent_getAction(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getAction",
-      "()I",
-      &g_MotionEvent_getAction);
-
-  jint ret =
-      env->CallIntMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getActionMasked = 0;
-static jint Java_MotionEvent_getActionMasked(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static jint Java_MotionEvent_getActionMasked(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getActionMasked",
-      "()I",
-      &g_MotionEvent_getActionMasked);
-
-  jint ret =
-      env->CallIntMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getActionIndex = 0;
-static jint Java_MotionEvent_getActionIndex(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static jint Java_MotionEvent_getActionIndex(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getActionIndex",
-      "()I",
-      &g_MotionEvent_getActionIndex);
-
-  jint ret =
-      env->CallIntMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getFlags = 0;
-static jint Java_MotionEvent_getFlags(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static jint Java_MotionEvent_getFlags(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getFlags",
-      "()I",
-      &g_MotionEvent_getFlags);
-
-  jint ret =
-      env->CallIntMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getDownTime = 0;
-static jlong Java_MotionEvent_getDownTime(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static jlong Java_MotionEvent_getDownTime(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getDownTime",
-      "()J",
-      &g_MotionEvent_getDownTime);
-
-  jlong ret =
-      env->CallLongMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getEventTime = 0;
-static jlong Java_MotionEvent_getEventTime(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static jlong Java_MotionEvent_getEventTime(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getEventTime",
-      "()J",
-      &g_MotionEvent_getEventTime);
-
-  jlong ret =
-      env->CallLongMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getXF = 0;
-static jfloat Java_MotionEvent_getXF(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static jfloat Java_MotionEvent_getXF(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getX",
-      "()F",
-      &g_MotionEvent_getXF);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getYF = 0;
-static jfloat Java_MotionEvent_getYF(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static jfloat Java_MotionEvent_getYF(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getY",
-      "()F",
-      &g_MotionEvent_getYF);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getPressureF = 0;
-static jfloat Java_MotionEvent_getPressureF(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static jfloat Java_MotionEvent_getPressureF(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getPressure",
-      "()F",
-      &g_MotionEvent_getPressureF);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getSizeF = 0;
-static jfloat Java_MotionEvent_getSizeF(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static jfloat Java_MotionEvent_getSizeF(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getSize",
-      "()F",
-      &g_MotionEvent_getSizeF);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getTouchMajorF = 0;
-static jfloat Java_MotionEvent_getTouchMajorF(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static jfloat Java_MotionEvent_getTouchMajorF(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getTouchMajor",
-      "()F",
-      &g_MotionEvent_getTouchMajorF);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getTouchMinorF = 0;
-static jfloat Java_MotionEvent_getTouchMinorF(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static jfloat Java_MotionEvent_getTouchMinorF(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getTouchMinor",
-      "()F",
-      &g_MotionEvent_getTouchMinorF);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getToolMajorF = 0;
-static jfloat Java_MotionEvent_getToolMajorF(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static jfloat Java_MotionEvent_getToolMajorF(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getToolMajor",
-      "()F",
-      &g_MotionEvent_getToolMajorF);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getToolMinorF = 0;
-static jfloat Java_MotionEvent_getToolMinorF(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static jfloat Java_MotionEvent_getToolMinorF(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getToolMinor",
-      "()F",
-      &g_MotionEvent_getToolMinorF);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getOrientationF = 0;
-static jfloat Java_MotionEvent_getOrientationF(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static jfloat Java_MotionEvent_getOrientationF(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getOrientation",
-      "()F",
-      &g_MotionEvent_getOrientationF);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getAxisValueF_I = 0;
-static jfloat Java_MotionEvent_getAxisValueF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
-    ((unused));
-static jfloat Java_MotionEvent_getAxisValueF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getAxisValue",
-      "(I)F",
-      &g_MotionEvent_getAxisValueF_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id, as_jint(p0));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getPointerCount = 0;
-static jint Java_MotionEvent_getPointerCount(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static jint Java_MotionEvent_getPointerCount(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getPointerCount",
-      "()I",
-      &g_MotionEvent_getPointerCount);
-
-  jint ret =
-      env->CallIntMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getPointerId = 0;
-static jint Java_MotionEvent_getPointerId(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
-    ((unused));
-static jint Java_MotionEvent_getPointerId(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getPointerId",
-      "(I)I",
-      &g_MotionEvent_getPointerId);
-
-  jint ret =
-      env->CallIntMethod(obj.obj(),
-          method_id, as_jint(p0));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getToolType = 0;
-static jint Java_MotionEvent_getToolType(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
-    ((unused));
-static jint Java_MotionEvent_getToolType(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getToolType",
-      "(I)I",
-      &g_MotionEvent_getToolType);
-
-  jint ret =
-      env->CallIntMethod(obj.obj(),
-          method_id, as_jint(p0));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_findPointerIndex = 0;
-static jint Java_MotionEvent_findPointerIndex(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
-    ((unused));
-static jint Java_MotionEvent_findPointerIndex(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "findPointerIndex",
-      "(I)I",
-      &g_MotionEvent_findPointerIndex);
-
-  jint ret =
-      env->CallIntMethod(obj.obj(),
-          method_id, as_jint(p0));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getXF_I = 0;
-static jfloat Java_MotionEvent_getXF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
-    ((unused));
-static jfloat Java_MotionEvent_getXF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getX",
-      "(I)F",
-      &g_MotionEvent_getXF_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id, as_jint(p0));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getYF_I = 0;
-static jfloat Java_MotionEvent_getYF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
-    ((unused));
-static jfloat Java_MotionEvent_getYF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getY",
-      "(I)F",
-      &g_MotionEvent_getYF_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id, as_jint(p0));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getPressureF_I = 0;
-static jfloat Java_MotionEvent_getPressureF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
-    ((unused));
-static jfloat Java_MotionEvent_getPressureF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getPressure",
-      "(I)F",
-      &g_MotionEvent_getPressureF_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id, as_jint(p0));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getSizeF_I = 0;
-static jfloat Java_MotionEvent_getSizeF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
-    ((unused));
-static jfloat Java_MotionEvent_getSizeF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getSize",
-      "(I)F",
-      &g_MotionEvent_getSizeF_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id, as_jint(p0));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getTouchMajorF_I = 0;
-static jfloat Java_MotionEvent_getTouchMajorF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
-    ((unused));
-static jfloat Java_MotionEvent_getTouchMajorF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getTouchMajor",
-      "(I)F",
-      &g_MotionEvent_getTouchMajorF_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id, as_jint(p0));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getTouchMinorF_I = 0;
-static jfloat Java_MotionEvent_getTouchMinorF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
-    ((unused));
-static jfloat Java_MotionEvent_getTouchMinorF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getTouchMinor",
-      "(I)F",
-      &g_MotionEvent_getTouchMinorF_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id, as_jint(p0));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getToolMajorF_I = 0;
-static jfloat Java_MotionEvent_getToolMajorF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
-    ((unused));
-static jfloat Java_MotionEvent_getToolMajorF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getToolMajor",
-      "(I)F",
-      &g_MotionEvent_getToolMajorF_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id, as_jint(p0));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getToolMinorF_I = 0;
-static jfloat Java_MotionEvent_getToolMinorF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
-    ((unused));
-static jfloat Java_MotionEvent_getToolMinorF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getToolMinor",
-      "(I)F",
-      &g_MotionEvent_getToolMinorF_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id, as_jint(p0));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getOrientationF_I = 0;
-static jfloat Java_MotionEvent_getOrientationF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
-    ((unused));
-static jfloat Java_MotionEvent_getOrientationF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getOrientation",
-      "(I)F",
-      &g_MotionEvent_getOrientationF_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id, as_jint(p0));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getAxisValueF_I_I = 0;
-static jfloat Java_MotionEvent_getAxisValueF_I_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1) __attribute__ ((unused));
-static jfloat Java_MotionEvent_getAxisValueF_I_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getAxisValue",
-      "(II)F",
-      &g_MotionEvent_getAxisValueF_I_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id, as_jint(p0), as_jint(p1));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getPointerCoords = 0;
-static void Java_MotionEvent_getPointerCoords(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
-    const base::android::JavaRefOrBare<jobject>& p1) __attribute__ ((unused));
-static void Java_MotionEvent_getPointerCoords(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
-    const base::android::JavaRefOrBare<jobject>& p1) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env));
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getPointerCoords",
-      "(ILandroid/view/MotionEvent$PointerCoords;)V",
-      &g_MotionEvent_getPointerCoords);
-
-     env->CallVoidMethod(obj.obj(),
-          method_id, as_jint(p0), p1.obj());
-  jni_generator::CheckException(env);
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getPointerProperties = 0;
-static void Java_MotionEvent_getPointerProperties(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
-    const base::android::JavaRefOrBare<jobject>& p1) __attribute__ ((unused));
-static void Java_MotionEvent_getPointerProperties(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
-    const base::android::JavaRefOrBare<jobject>& p1) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env));
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getPointerProperties",
-      "(ILandroid/view/MotionEvent$PointerProperties;)V",
-      &g_MotionEvent_getPointerProperties);
-
-     env->CallVoidMethod(obj.obj(),
-          method_id, as_jint(p0), p1.obj());
-  jni_generator::CheckException(env);
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getMetaState = 0;
-static jint Java_MotionEvent_getMetaState(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static jint Java_MotionEvent_getMetaState(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getMetaState",
-      "()I",
-      &g_MotionEvent_getMetaState);
-
-  jint ret =
-      env->CallIntMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getButtonState = 0;
-static jint Java_MotionEvent_getButtonState(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static jint Java_MotionEvent_getButtonState(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getButtonState",
-      "()I",
-      &g_MotionEvent_getButtonState);
-
-  jint ret =
-      env->CallIntMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getRawX = 0;
-static jfloat Java_MotionEvent_getRawX(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static jfloat Java_MotionEvent_getRawX(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getRawX",
-      "()F",
-      &g_MotionEvent_getRawX);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getRawY = 0;
-static jfloat Java_MotionEvent_getRawY(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static jfloat Java_MotionEvent_getRawY(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getRawY",
-      "()F",
-      &g_MotionEvent_getRawY);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getXPrecision = 0;
-static jfloat Java_MotionEvent_getXPrecision(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static jfloat Java_MotionEvent_getXPrecision(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getXPrecision",
-      "()F",
-      &g_MotionEvent_getXPrecision);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getYPrecision = 0;
-static jfloat Java_MotionEvent_getYPrecision(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static jfloat Java_MotionEvent_getYPrecision(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getYPrecision",
-      "()F",
-      &g_MotionEvent_getYPrecision);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getHistorySize = 0;
-static jint Java_MotionEvent_getHistorySize(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static jint Java_MotionEvent_getHistorySize(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getHistorySize",
-      "()I",
-      &g_MotionEvent_getHistorySize);
-
-  jint ret =
-      env->CallIntMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getHistoricalEventTime = 0;
-static jlong Java_MotionEvent_getHistoricalEventTime(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
-    ((unused));
-static jlong Java_MotionEvent_getHistoricalEventTime(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getHistoricalEventTime",
-      "(I)J",
-      &g_MotionEvent_getHistoricalEventTime);
-
-  jlong ret =
-      env->CallLongMethod(obj.obj(),
-          method_id, as_jint(p0));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getHistoricalXF_I = 0;
-static jfloat Java_MotionEvent_getHistoricalXF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
-    ((unused));
-static jfloat Java_MotionEvent_getHistoricalXF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getHistoricalX",
-      "(I)F",
-      &g_MotionEvent_getHistoricalXF_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id, as_jint(p0));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getHistoricalYF_I = 0;
-static jfloat Java_MotionEvent_getHistoricalYF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
-    ((unused));
-static jfloat Java_MotionEvent_getHistoricalYF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getHistoricalY",
-      "(I)F",
-      &g_MotionEvent_getHistoricalYF_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id, as_jint(p0));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getHistoricalPressureF_I = 0;
-static jfloat Java_MotionEvent_getHistoricalPressureF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
-    ((unused));
-static jfloat Java_MotionEvent_getHistoricalPressureF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getHistoricalPressure",
-      "(I)F",
-      &g_MotionEvent_getHistoricalPressureF_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id, as_jint(p0));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getHistoricalSizeF_I = 0;
-static jfloat Java_MotionEvent_getHistoricalSizeF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
-    ((unused));
-static jfloat Java_MotionEvent_getHistoricalSizeF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getHistoricalSize",
-      "(I)F",
-      &g_MotionEvent_getHistoricalSizeF_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id, as_jint(p0));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getHistoricalTouchMajorF_I = 0;
-static jfloat Java_MotionEvent_getHistoricalTouchMajorF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
-    ((unused));
-static jfloat Java_MotionEvent_getHistoricalTouchMajorF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getHistoricalTouchMajor",
-      "(I)F",
-      &g_MotionEvent_getHistoricalTouchMajorF_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id, as_jint(p0));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getHistoricalTouchMinorF_I = 0;
-static jfloat Java_MotionEvent_getHistoricalTouchMinorF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
-    ((unused));
-static jfloat Java_MotionEvent_getHistoricalTouchMinorF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getHistoricalTouchMinor",
-      "(I)F",
-      &g_MotionEvent_getHistoricalTouchMinorF_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id, as_jint(p0));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getHistoricalToolMajorF_I = 0;
-static jfloat Java_MotionEvent_getHistoricalToolMajorF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
-    ((unused));
-static jfloat Java_MotionEvent_getHistoricalToolMajorF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getHistoricalToolMajor",
-      "(I)F",
-      &g_MotionEvent_getHistoricalToolMajorF_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id, as_jint(p0));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getHistoricalToolMinorF_I = 0;
-static jfloat Java_MotionEvent_getHistoricalToolMinorF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
-    ((unused));
-static jfloat Java_MotionEvent_getHistoricalToolMinorF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getHistoricalToolMinor",
-      "(I)F",
-      &g_MotionEvent_getHistoricalToolMinorF_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id, as_jint(p0));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getHistoricalOrientationF_I = 0;
-static jfloat Java_MotionEvent_getHistoricalOrientationF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
-    ((unused));
-static jfloat Java_MotionEvent_getHistoricalOrientationF_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getHistoricalOrientation",
-      "(I)F",
-      &g_MotionEvent_getHistoricalOrientationF_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id, as_jint(p0));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getHistoricalAxisValueF_I_I = 0;
-static jfloat Java_MotionEvent_getHistoricalAxisValueF_I_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1) __attribute__ ((unused));
-static jfloat Java_MotionEvent_getHistoricalAxisValueF_I_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getHistoricalAxisValue",
-      "(II)F",
-      &g_MotionEvent_getHistoricalAxisValueF_I_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id, as_jint(p0), as_jint(p1));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getHistoricalXF_I_I = 0;
-static jfloat Java_MotionEvent_getHistoricalXF_I_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1) __attribute__ ((unused));
-static jfloat Java_MotionEvent_getHistoricalXF_I_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getHistoricalX",
-      "(II)F",
-      &g_MotionEvent_getHistoricalXF_I_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id, as_jint(p0), as_jint(p1));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getHistoricalYF_I_I = 0;
-static jfloat Java_MotionEvent_getHistoricalYF_I_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1) __attribute__ ((unused));
-static jfloat Java_MotionEvent_getHistoricalYF_I_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getHistoricalY",
-      "(II)F",
-      &g_MotionEvent_getHistoricalYF_I_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id, as_jint(p0), as_jint(p1));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getHistoricalPressureF_I_I = 0;
-static jfloat Java_MotionEvent_getHistoricalPressureF_I_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1) __attribute__ ((unused));
-static jfloat Java_MotionEvent_getHistoricalPressureF_I_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getHistoricalPressure",
-      "(II)F",
-      &g_MotionEvent_getHistoricalPressureF_I_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id, as_jint(p0), as_jint(p1));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getHistoricalSizeF_I_I = 0;
-static jfloat Java_MotionEvent_getHistoricalSizeF_I_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1) __attribute__ ((unused));
-static jfloat Java_MotionEvent_getHistoricalSizeF_I_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getHistoricalSize",
-      "(II)F",
-      &g_MotionEvent_getHistoricalSizeF_I_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id, as_jint(p0), as_jint(p1));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getHistoricalTouchMajorF_I_I = 0;
-static jfloat Java_MotionEvent_getHistoricalTouchMajorF_I_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1) __attribute__ ((unused));
-static jfloat Java_MotionEvent_getHistoricalTouchMajorF_I_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getHistoricalTouchMajor",
-      "(II)F",
-      &g_MotionEvent_getHistoricalTouchMajorF_I_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id, as_jint(p0), as_jint(p1));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getHistoricalTouchMinorF_I_I = 0;
-static jfloat Java_MotionEvent_getHistoricalTouchMinorF_I_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1) __attribute__ ((unused));
-static jfloat Java_MotionEvent_getHistoricalTouchMinorF_I_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getHistoricalTouchMinor",
-      "(II)F",
-      &g_MotionEvent_getHistoricalTouchMinorF_I_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id, as_jint(p0), as_jint(p1));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getHistoricalToolMajorF_I_I = 0;
-static jfloat Java_MotionEvent_getHistoricalToolMajorF_I_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1) __attribute__ ((unused));
-static jfloat Java_MotionEvent_getHistoricalToolMajorF_I_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getHistoricalToolMajor",
-      "(II)F",
-      &g_MotionEvent_getHistoricalToolMajorF_I_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id, as_jint(p0), as_jint(p1));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getHistoricalToolMinorF_I_I = 0;
-static jfloat Java_MotionEvent_getHistoricalToolMinorF_I_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1) __attribute__ ((unused));
-static jfloat Java_MotionEvent_getHistoricalToolMinorF_I_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getHistoricalToolMinor",
-      "(II)F",
-      &g_MotionEvent_getHistoricalToolMinorF_I_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id, as_jint(p0), as_jint(p1));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getHistoricalOrientationF_I_I = 0;
-static jfloat Java_MotionEvent_getHistoricalOrientationF_I_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1) __attribute__ ((unused));
-static jfloat Java_MotionEvent_getHistoricalOrientationF_I_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getHistoricalOrientation",
-      "(II)F",
-      &g_MotionEvent_getHistoricalOrientationF_I_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id, as_jint(p0), as_jint(p1));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getHistoricalAxisValueF_I_I_I = 0;
-static jfloat Java_MotionEvent_getHistoricalAxisValueF_I_I_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1,
-    JniIntWrapper p2) __attribute__ ((unused));
-static jfloat Java_MotionEvent_getHistoricalAxisValueF_I_I_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1,
-    JniIntWrapper p2) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getHistoricalAxisValue",
-      "(III)F",
-      &g_MotionEvent_getHistoricalAxisValueF_I_I_I);
-
-  jfloat ret =
-      env->CallFloatMethod(obj.obj(),
-          method_id, as_jint(p0), as_jint(p1), as_jint(p2));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getHistoricalPointerCoords = 0;
-static void Java_MotionEvent_getHistoricalPointerCoords(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1,
-    const base::android::JavaRefOrBare<jobject>& p2) __attribute__ ((unused));
-static void Java_MotionEvent_getHistoricalPointerCoords(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0,
-    JniIntWrapper p1,
-    const base::android::JavaRefOrBare<jobject>& p2) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env));
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getHistoricalPointerCoords",
-      "(IILandroid/view/MotionEvent$PointerCoords;)V",
-      &g_MotionEvent_getHistoricalPointerCoords);
-
-     env->CallVoidMethod(obj.obj(),
-          method_id, as_jint(p0), as_jint(p1), p2.obj());
-  jni_generator::CheckException(env);
-}
-
-static base::subtle::AtomicWord g_MotionEvent_getEdgeFlags = 0;
-static jint Java_MotionEvent_getEdgeFlags(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static jint Java_MotionEvent_getEdgeFlags(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "getEdgeFlags",
-      "()I",
-      &g_MotionEvent_getEdgeFlags);
-
-  jint ret =
-      env->CallIntMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_setEdgeFlags = 0;
-static void Java_MotionEvent_setEdgeFlags(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
-    ((unused));
-static void Java_MotionEvent_setEdgeFlags(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env));
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "setEdgeFlags",
-      "(I)V",
-      &g_MotionEvent_setEdgeFlags);
-
-     env->CallVoidMethod(obj.obj(),
-          method_id, as_jint(p0));
-  jni_generator::CheckException(env);
-}
-
-static base::subtle::AtomicWord g_MotionEvent_setAction = 0;
-static void Java_MotionEvent_setAction(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
-    ((unused));
-static void Java_MotionEvent_setAction(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env));
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "setAction",
-      "(I)V",
-      &g_MotionEvent_setAction);
-
-     env->CallVoidMethod(obj.obj(),
-          method_id, as_jint(p0));
-  jni_generator::CheckException(env);
-}
-
-static base::subtle::AtomicWord g_MotionEvent_offsetLocation = 0;
-static void Java_MotionEvent_offsetLocation(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, jfloat p0,
-    jfloat p1) __attribute__ ((unused));
-static void Java_MotionEvent_offsetLocation(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, jfloat p0,
-    jfloat p1) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env));
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "offsetLocation",
-      "(FF)V",
-      &g_MotionEvent_offsetLocation);
-
-     env->CallVoidMethod(obj.obj(),
-          method_id, p0, p1);
-  jni_generator::CheckException(env);
-}
-
-static base::subtle::AtomicWord g_MotionEvent_setLocation = 0;
-static void Java_MotionEvent_setLocation(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, jfloat p0,
-    jfloat p1) __attribute__ ((unused));
-static void Java_MotionEvent_setLocation(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, jfloat p0,
-    jfloat p1) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env));
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "setLocation",
-      "(FF)V",
-      &g_MotionEvent_setLocation);
-
-     env->CallVoidMethod(obj.obj(),
-          method_id, p0, p1);
-  jni_generator::CheckException(env);
-}
-
-static base::subtle::AtomicWord g_MotionEvent_transform = 0;
-static void Java_MotionEvent_transform(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, const
-    base::android::JavaRefOrBare<jobject>& p0) __attribute__ ((unused));
-static void Java_MotionEvent_transform(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, const
-    base::android::JavaRefOrBare<jobject>& p0) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env));
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "transform",
-      "(Landroid/graphics/Matrix;)V",
-      &g_MotionEvent_transform);
-
-     env->CallVoidMethod(obj.obj(),
-          method_id, p0.obj());
-  jni_generator::CheckException(env);
-}
-
-static base::subtle::AtomicWord g_MotionEvent_addBatchV_J_F_F_F_F_I = 0;
-static void Java_MotionEvent_addBatchV_J_F_F_F_F_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, jlong p0,
-    jfloat p1,
-    jfloat p2,
-    jfloat p3,
-    jfloat p4,
-    JniIntWrapper p5) __attribute__ ((unused));
-static void Java_MotionEvent_addBatchV_J_F_F_F_F_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, jlong p0,
-    jfloat p1,
-    jfloat p2,
-    jfloat p3,
-    jfloat p4,
-    JniIntWrapper p5) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env));
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "addBatch",
-      "(JFFFFI)V",
-      &g_MotionEvent_addBatchV_J_F_F_F_F_I);
-
-     env->CallVoidMethod(obj.obj(),
-          method_id, p0, p1, p2, p3, p4, as_jint(p5));
-  jni_generator::CheckException(env);
-}
-
-static base::subtle::AtomicWord g_MotionEvent_addBatchV_J_LAVMEPC_I = 0;
-static void Java_MotionEvent_addBatchV_J_LAVMEPC_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, jlong p0,
-    const base::android::JavaRefOrBare<jobjectArray>& p1,
-    JniIntWrapper p2) __attribute__ ((unused));
-static void Java_MotionEvent_addBatchV_J_LAVMEPC_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, jlong p0,
-    const base::android::JavaRefOrBare<jobjectArray>& p1,
-    JniIntWrapper p2) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env));
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "addBatch",
-      "(J[Landroid/view/MotionEvent$PointerCoords;I)V",
-      &g_MotionEvent_addBatchV_J_LAVMEPC_I);
-
-     env->CallVoidMethod(obj.obj(),
-          method_id, p0, p1.obj(), as_jint(p2));
-  jni_generator::CheckException(env);
-}
-
-static base::subtle::AtomicWord g_MotionEvent_toString = 0;
-static base::android::ScopedJavaLocalRef<jstring>
-    Java_MotionEvent_toString(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static base::android::ScopedJavaLocalRef<jstring>
-    Java_MotionEvent_toString(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env), NULL);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "toString",
-      "()Ljava/lang/String;",
-      &g_MotionEvent_toString);
-
-  jstring ret =
-      static_cast<jstring>(env->CallObjectMethod(obj.obj(),
-          method_id));
-  jni_generator::CheckException(env);
-  return base::android::ScopedJavaLocalRef<jstring>(env, ret);
-}
-
-static base::subtle::AtomicWord g_MotionEvent_actionToString = 0;
-static base::android::ScopedJavaLocalRef<jstring>
-    Java_MotionEvent_actionToString(JNIEnv* env, JniIntWrapper p0) __attribute__
-    ((unused));
-static base::android::ScopedJavaLocalRef<jstring>
-    Java_MotionEvent_actionToString(JNIEnv* env, JniIntWrapper p0) {
-  CHECK_CLAZZ(env, MotionEvent_clazz(env),
-      MotionEvent_clazz(env), NULL);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_STATIC>(
-      env, MotionEvent_clazz(env),
-      "actionToString",
-      "(I)Ljava/lang/String;",
-      &g_MotionEvent_actionToString);
-
-  jstring ret =
-      static_cast<jstring>(env->CallStaticObjectMethod(MotionEvent_clazz(env),
-          method_id, as_jint(p0)));
-  jni_generator::CheckException(env);
-  return base::android::ScopedJavaLocalRef<jstring>(env, ret);
-}
-
-static base::subtle::AtomicWord g_MotionEvent_axisToString = 0;
-static base::android::ScopedJavaLocalRef<jstring>
-    Java_MotionEvent_axisToString(JNIEnv* env, JniIntWrapper p0) __attribute__
-    ((unused));
-static base::android::ScopedJavaLocalRef<jstring>
-    Java_MotionEvent_axisToString(JNIEnv* env, JniIntWrapper p0) {
-  CHECK_CLAZZ(env, MotionEvent_clazz(env),
-      MotionEvent_clazz(env), NULL);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_STATIC>(
-      env, MotionEvent_clazz(env),
-      "axisToString",
-      "(I)Ljava/lang/String;",
-      &g_MotionEvent_axisToString);
-
-  jstring ret =
-      static_cast<jstring>(env->CallStaticObjectMethod(MotionEvent_clazz(env),
-          method_id, as_jint(p0)));
-  jni_generator::CheckException(env);
-  return base::android::ScopedJavaLocalRef<jstring>(env, ret);
-}
-
-static base::subtle::AtomicWord g_MotionEvent_axisFromString = 0;
-static jint Java_MotionEvent_axisFromString(JNIEnv* env, const
-    base::android::JavaRefOrBare<jstring>& p0) __attribute__ ((unused));
-static jint Java_MotionEvent_axisFromString(JNIEnv* env, const
-    base::android::JavaRefOrBare<jstring>& p0) {
-  CHECK_CLAZZ(env, MotionEvent_clazz(env),
-      MotionEvent_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_STATIC>(
-      env, MotionEvent_clazz(env),
-      "axisFromString",
-      "(Ljava/lang/String;)I",
-      &g_MotionEvent_axisFromString);
-
-  jint ret =
-      env->CallStaticIntMethod(MotionEvent_clazz(env),
-          method_id, p0.obj());
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_MotionEvent_writeToParcel = 0;
-static void Java_MotionEvent_writeToParcel(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, const
-    base::android::JavaRefOrBare<jobject>& p0,
-    JniIntWrapper p1) __attribute__ ((unused));
-static void Java_MotionEvent_writeToParcel(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, const
-    base::android::JavaRefOrBare<jobject>& p0,
-    JniIntWrapper p1) {
-  CHECK_CLAZZ(env, obj.obj(),
-      MotionEvent_clazz(env));
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, MotionEvent_clazz(env),
-      "writeToParcel",
-      "(Landroid/os/Parcel;I)V",
-      &g_MotionEvent_writeToParcel);
-
-     env->CallVoidMethod(obj.obj(),
-          method_id, p0.obj(), as_jint(p1));
-  jni_generator::CheckException(env);
-}
-
-// Step 3: RegisterNatives.
-
-}  // namespace JNI_MotionEvent
-
-#endif  // android_view_MotionEvent_JNI
diff --git a/base/android/jni_generator/testFromJavaP.golden b/base/android/jni_generator/testFromJavaP.golden
deleted file mode 100644
index 18a9430..0000000
--- a/base/android/jni_generator/testFromJavaP.golden
+++ /dev/null
@@ -1,260 +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.
-
-// This file is autogenerated by
-//     base/android/jni_generator/jni_generator.py
-// For
-//     java/io/InputStream
-
-#ifndef java_io_InputStream_JNI
-#define java_io_InputStream_JNI
-
-#include <jni.h>
-
-#include "base/android/jni_generator/jni_generator_helper.h"
-
-#include "base/android/jni_int_wrapper.h"
-
-// Step 1: forward declarations.
-namespace {
-const char kInputStreamClassPath[] = "java/io/InputStream";
-// Leaking this jclass as we cannot use LazyInstance from some threads.
-base::subtle::AtomicWord g_InputStream_clazz __attribute__((unused)) = 0;
-#define InputStream_clazz(env) base::android::LazyGetClass(env, kInputStreamClassPath, &g_InputStream_clazz)
-
-}  // namespace
-
-namespace JNI_InputStream {
-
-// Step 2: method stubs.
-
-static base::subtle::AtomicWord g_InputStream_available = 0;
-static jint Java_InputStream_available(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static jint Java_InputStream_available(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      InputStream_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, InputStream_clazz(env),
-      "available",
-      "()I",
-      &g_InputStream_available);
-
-  jint ret =
-      env->CallIntMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_InputStream_close = 0;
-static void Java_InputStream_close(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static void Java_InputStream_close(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      InputStream_clazz(env));
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, InputStream_clazz(env),
-      "close",
-      "()V",
-      &g_InputStream_close);
-
-     env->CallVoidMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-}
-
-static base::subtle::AtomicWord g_InputStream_mark = 0;
-static void Java_InputStream_mark(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) __attribute__
-    ((unused));
-static void Java_InputStream_mark(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, JniIntWrapper p0) {
-  CHECK_CLAZZ(env, obj.obj(),
-      InputStream_clazz(env));
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, InputStream_clazz(env),
-      "mark",
-      "(I)V",
-      &g_InputStream_mark);
-
-     env->CallVoidMethod(obj.obj(),
-          method_id, as_jint(p0));
-  jni_generator::CheckException(env);
-}
-
-static base::subtle::AtomicWord g_InputStream_markSupported = 0;
-static jboolean Java_InputStream_markSupported(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static jboolean Java_InputStream_markSupported(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      InputStream_clazz(env), false);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, InputStream_clazz(env),
-      "markSupported",
-      "()Z",
-      &g_InputStream_markSupported);
-
-  jboolean ret =
-      env->CallBooleanMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_InputStream_readI = 0;
-static jint Java_InputStream_readI(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static jint Java_InputStream_readI(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      InputStream_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, InputStream_clazz(env),
-      "read",
-      "()I",
-      &g_InputStream_readI);
-
-  jint ret =
-      env->CallIntMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_InputStream_readI_AB = 0;
-static jint Java_InputStream_readI_AB(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, const
-    base::android::JavaRefOrBare<jbyteArray>& p0) __attribute__ ((unused));
-static jint Java_InputStream_readI_AB(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, const
-    base::android::JavaRefOrBare<jbyteArray>& p0) {
-  CHECK_CLAZZ(env, obj.obj(),
-      InputStream_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, InputStream_clazz(env),
-      "read",
-      "([B)I",
-      &g_InputStream_readI_AB);
-
-  jint ret =
-      env->CallIntMethod(obj.obj(),
-          method_id, p0.obj());
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_InputStream_readI_AB_I_I = 0;
-static jint Java_InputStream_readI_AB_I_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, const
-    base::android::JavaRefOrBare<jbyteArray>& p0,
-    JniIntWrapper p1,
-    JniIntWrapper p2) __attribute__ ((unused));
-static jint Java_InputStream_readI_AB_I_I(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, const
-    base::android::JavaRefOrBare<jbyteArray>& p0,
-    JniIntWrapper p1,
-    JniIntWrapper p2) {
-  CHECK_CLAZZ(env, obj.obj(),
-      InputStream_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, InputStream_clazz(env),
-      "read",
-      "([BII)I",
-      &g_InputStream_readI_AB_I_I);
-
-  jint ret =
-      env->CallIntMethod(obj.obj(),
-          method_id, p0.obj(), as_jint(p1), as_jint(p2));
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_InputStream_reset = 0;
-static void Java_InputStream_reset(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static void Java_InputStream_reset(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      InputStream_clazz(env));
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, InputStream_clazz(env),
-      "reset",
-      "()V",
-      &g_InputStream_reset);
-
-     env->CallVoidMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-}
-
-static base::subtle::AtomicWord g_InputStream_skip = 0;
-static jlong Java_InputStream_skip(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, jlong p0) __attribute__
-    ((unused));
-static jlong Java_InputStream_skip(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj, jlong p0) {
-  CHECK_CLAZZ(env, obj.obj(),
-      InputStream_clazz(env), 0);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, InputStream_clazz(env),
-      "skip",
-      "(J)J",
-      &g_InputStream_skip);
-
-  jlong ret =
-      env->CallLongMethod(obj.obj(),
-          method_id, p0);
-  jni_generator::CheckException(env);
-  return ret;
-}
-
-static base::subtle::AtomicWord g_InputStream_Constructor = 0;
-static base::android::ScopedJavaLocalRef<jobject>
-    Java_InputStream_Constructor(JNIEnv* env) __attribute__ ((unused));
-static base::android::ScopedJavaLocalRef<jobject>
-    Java_InputStream_Constructor(JNIEnv* env) {
-  CHECK_CLAZZ(env, InputStream_clazz(env),
-      InputStream_clazz(env), NULL);
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, InputStream_clazz(env),
-      "<init>",
-      "()V",
-      &g_InputStream_Constructor);
-
-  jobject ret =
-      env->NewObject(InputStream_clazz(env),
-          method_id);
-  jni_generator::CheckException(env);
-  return base::android::ScopedJavaLocalRef<jobject>(env, ret);
-}
-
-// Step 3: RegisterNatives.
-
-}  // namespace JNI_InputStream
-
-#endif  // java_io_InputStream_JNI
diff --git a/base/android/jni_generator/testFromJavaPGenerics.golden b/base/android/jni_generator/testFromJavaPGenerics.golden
deleted file mode 100644
index c076c39..0000000
--- a/base/android/jni_generator/testFromJavaPGenerics.golden
+++ /dev/null
@@ -1,56 +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.
-
-// This file is autogenerated by
-//     base/android/jni_generator/jni_generator.py
-// For
-//     java/util/HashSet
-
-#ifndef java_util_HashSet_JNI
-#define java_util_HashSet_JNI
-
-#include <jni.h>
-
-#include "base/android/jni_generator/jni_generator_helper.h"
-
-#include "base/android/jni_int_wrapper.h"
-
-// Step 1: forward declarations.
-namespace {
-const char kHashSetClassPath[] = "java/util/HashSet";
-// Leaking this jclass as we cannot use LazyInstance from some threads.
-base::subtle::AtomicWord g_HashSet_clazz __attribute__((unused)) = 0;
-#define HashSet_clazz(env) base::android::LazyGetClass(env, kHashSetClassPath, &g_HashSet_clazz)
-
-}  // namespace
-
-namespace JNI_HashSet {
-
-// Step 2: method stubs.
-
-static base::subtle::AtomicWord g_HashSet_dummy = 0;
-static void Java_HashSet_dummy(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) __attribute__ ((unused));
-static void Java_HashSet_dummy(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& obj) {
-  CHECK_CLAZZ(env, obj.obj(),
-      HashSet_clazz(env));
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_INSTANCE>(
-      env, HashSet_clazz(env),
-      "dummy",
-      "()V",
-      &g_HashSet_dummy);
-
-     env->CallVoidMethod(obj.obj(),
-          method_id);
-  jni_generator::CheckException(env);
-}
-
-// Step 3: RegisterNatives.
-
-}  // namespace JNI_HashSet
-
-#endif  // java_util_HashSet_JNI
diff --git a/base/android/jni_generator/testInnerClassNatives.golden b/base/android/jni_generator/testInnerClassNatives.golden
deleted file mode 100644
index 20b8830..0000000
--- a/base/android/jni_generator/testInnerClassNatives.golden
+++ /dev/null
@@ -1,71 +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.
-
-// This file is autogenerated by
-//     base/android/jni_generator/jni_generator.py
-// For
-//     org/chromium/TestJni
-
-#ifndef org_chromium_TestJni_JNI
-#define org_chromium_TestJni_JNI
-
-#include <jni.h>
-
-#include "base/android/jni_generator/jni_generator_helper.h"
-
-#include "base/android/jni_int_wrapper.h"
-
-// Step 1: forward declarations.
-namespace {
-const char kTestJniClassPath[] = "org/chromium/TestJni";
-const char kMyInnerClassClassPath[] = "org/chromium/TestJni$MyInnerClass";
-// Leaking this jclass as we cannot use LazyInstance from some threads.
-base::subtle::AtomicWord g_TestJni_clazz __attribute__((unused)) = 0;
-#define TestJni_clazz(env) base::android::LazyGetClass(env, kTestJniClassPath, &g_TestJni_clazz)
-// Leaking this jclass as we cannot use LazyInstance from some threads.
-base::subtle::AtomicWord g_MyInnerClass_clazz __attribute__((unused)) = 0;
-#define MyInnerClass_clazz(env) base::android::LazyGetClass(env, kMyInnerClassClassPath, &g_MyInnerClass_clazz)
-
-}  // namespace
-
-// Step 2: method stubs.
-
-static jint Init(JNIEnv* env, const base::android::JavaParamRef<jobject>&
-    jcaller);
-
-JNI_GENERATOR_EXPORT jint
-    Java_org_chromium_TestJni_00024MyInnerClass_nativeInit(JNIEnv* env, jobject
-    jcaller) {
-  return Init(env, base::android::JavaParamRef<jobject>(env, jcaller));
-}
-
-// Step 3: RegisterNatives.
-
-static const JNINativeMethod kMethodsMyInnerClass[] = {
-    { "nativeInit",
-"("
-")"
-"I",
-    reinterpret_cast<void*>(Java_org_chromium_TestJni_00024MyInnerClass_nativeInit)
-    },
-};
-
-static bool RegisterNativesImpl(JNIEnv* env) {
-  if (jni_generator::ShouldSkipJniRegistration(false))
-    return true;
-
-  const int kMethodsMyInnerClassSize = arraysize(kMethodsMyInnerClass);
-
-  if (env->RegisterNatives(MyInnerClass_clazz(env),
-                           kMethodsMyInnerClass,
-                           kMethodsMyInnerClassSize) < 0) {
-    jni_generator::HandleRegistrationError(
-        env, MyInnerClass_clazz(env), __FILE__);
-    return false;
-  }
-
-  return true;
-}
-
-#endif  // org_chromium_TestJni_JNI
diff --git a/base/android/jni_generator/testInnerClassNativesBothInnerAndOuter.golden b/base/android/jni_generator/testInnerClassNativesBothInnerAndOuter.golden
deleted file mode 100644
index 67352e7..0000000
--- a/base/android/jni_generator/testInnerClassNativesBothInnerAndOuter.golden
+++ /dev/null
@@ -1,98 +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.
-
-// This file is autogenerated by
-//     base/android/jni_generator/jni_generator.py
-// For
-//     org/chromium/TestJni
-
-#ifndef org_chromium_TestJni_JNI
-#define org_chromium_TestJni_JNI
-
-#include <jni.h>
-
-#include "base/android/jni_generator/jni_generator_helper.h"
-
-#include "base/android/jni_int_wrapper.h"
-
-// Step 1: forward declarations.
-namespace {
-const char kMyOtherInnerClassClassPath[] =
-    "org/chromium/TestJni$MyOtherInnerClass";
-const char kTestJniClassPath[] = "org/chromium/TestJni";
-// Leaking this jclass as we cannot use LazyInstance from some threads.
-base::subtle::AtomicWord g_MyOtherInnerClass_clazz __attribute__((unused)) = 0;
-#define MyOtherInnerClass_clazz(env) base::android::LazyGetClass(env, kMyOtherInnerClassClassPath, &g_MyOtherInnerClass_clazz)
-// Leaking this jclass as we cannot use LazyInstance from some threads.
-base::subtle::AtomicWord g_TestJni_clazz __attribute__((unused)) = 0;
-#define TestJni_clazz(env) base::android::LazyGetClass(env, kTestJniClassPath, &g_TestJni_clazz)
-
-}  // namespace
-
-// Step 2: method stubs.
-
-static jint Init(JNIEnv* env, const base::android::JavaParamRef<jobject>&
-    jcaller);
-
-JNI_GENERATOR_EXPORT jint Java_org_chromium_TestJni_nativeInit(JNIEnv* env,
-    jobject jcaller) {
-  return Init(env, base::android::JavaParamRef<jobject>(env, jcaller));
-}
-
-static jint Init(JNIEnv* env, const base::android::JavaParamRef<jobject>&
-    jcaller);
-
-JNI_GENERATOR_EXPORT jint
-    Java_org_chromium_TestJni_00024MyOtherInnerClass_nativeInit(JNIEnv* env,
-    jobject jcaller) {
-  return Init(env, base::android::JavaParamRef<jobject>(env, jcaller));
-}
-
-// Step 3: RegisterNatives.
-
-static const JNINativeMethod kMethodsMyOtherInnerClass[] = {
-    { "nativeInit",
-"("
-")"
-"I",
-    reinterpret_cast<void*>(Java_org_chromium_TestJni_00024MyOtherInnerClass_nativeInit)
-    },
-};
-
-static const JNINativeMethod kMethodsTestJni[] = {
-    { "nativeInit",
-"("
-")"
-"I", reinterpret_cast<void*>(Java_org_chromium_TestJni_nativeInit) },
-};
-
-static bool RegisterNativesImpl(JNIEnv* env) {
-  if (jni_generator::ShouldSkipJniRegistration(false))
-    return true;
-
-  const int kMethodsMyOtherInnerClassSize =
-      arraysize(kMethodsMyOtherInnerClass);
-
-  if (env->RegisterNatives(MyOtherInnerClass_clazz(env),
-                           kMethodsMyOtherInnerClass,
-                           kMethodsMyOtherInnerClassSize) < 0) {
-    jni_generator::HandleRegistrationError(
-        env, MyOtherInnerClass_clazz(env), __FILE__);
-    return false;
-  }
-
-  const int kMethodsTestJniSize = arraysize(kMethodsTestJni);
-
-  if (env->RegisterNatives(TestJni_clazz(env),
-                           kMethodsTestJni,
-                           kMethodsTestJniSize) < 0) {
-    jni_generator::HandleRegistrationError(
-        env, TestJni_clazz(env), __FILE__);
-    return false;
-  }
-
-  return true;
-}
-
-#endif  // org_chromium_TestJni_JNI
diff --git a/base/android/jni_generator/testInnerClassNativesMultiple.golden b/base/android/jni_generator/testInnerClassNativesMultiple.golden
deleted file mode 100644
index 7807efa..0000000
--- a/base/android/jni_generator/testInnerClassNativesMultiple.golden
+++ /dev/null
@@ -1,105 +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.
-
-// This file is autogenerated by
-//     base/android/jni_generator/jni_generator.py
-// For
-//     org/chromium/TestJni
-
-#ifndef org_chromium_TestJni_JNI
-#define org_chromium_TestJni_JNI
-
-#include <jni.h>
-
-#include "base/android/jni_generator/jni_generator_helper.h"
-
-#include "base/android/jni_int_wrapper.h"
-
-// Step 1: forward declarations.
-namespace {
-const char kMyOtherInnerClassClassPath[] =
-    "org/chromium/TestJni$MyOtherInnerClass";
-const char kTestJniClassPath[] = "org/chromium/TestJni";
-const char kMyInnerClassClassPath[] = "org/chromium/TestJni$MyInnerClass";
-// Leaking this jclass as we cannot use LazyInstance from some threads.
-base::subtle::AtomicWord g_MyOtherInnerClass_clazz __attribute__((unused)) = 0;
-#define MyOtherInnerClass_clazz(env) base::android::LazyGetClass(env, kMyOtherInnerClassClassPath, &g_MyOtherInnerClass_clazz)
-// Leaking this jclass as we cannot use LazyInstance from some threads.
-base::subtle::AtomicWord g_TestJni_clazz __attribute__((unused)) = 0;
-#define TestJni_clazz(env) base::android::LazyGetClass(env, kTestJniClassPath, &g_TestJni_clazz)
-// Leaking this jclass as we cannot use LazyInstance from some threads.
-base::subtle::AtomicWord g_MyInnerClass_clazz __attribute__((unused)) = 0;
-#define MyInnerClass_clazz(env) base::android::LazyGetClass(env, kMyInnerClassClassPath, &g_MyInnerClass_clazz)
-
-}  // namespace
-
-// Step 2: method stubs.
-
-static jint Init(JNIEnv* env, const base::android::JavaParamRef<jobject>&
-    jcaller);
-
-JNI_GENERATOR_EXPORT jint
-    Java_org_chromium_TestJni_00024MyInnerClass_nativeInit(JNIEnv* env, jobject
-    jcaller) {
-  return Init(env, base::android::JavaParamRef<jobject>(env, jcaller));
-}
-
-static jint Init(JNIEnv* env, const base::android::JavaParamRef<jobject>&
-    jcaller);
-
-JNI_GENERATOR_EXPORT jint
-    Java_org_chromium_TestJni_00024MyOtherInnerClass_nativeInit(JNIEnv* env,
-    jobject jcaller) {
-  return Init(env, base::android::JavaParamRef<jobject>(env, jcaller));
-}
-
-// Step 3: RegisterNatives.
-
-static const JNINativeMethod kMethodsMyOtherInnerClass[] = {
-    { "nativeInit",
-"("
-")"
-"I",
-    reinterpret_cast<void*>(Java_org_chromium_TestJni_00024MyOtherInnerClass_nativeInit)
-    },
-};
-
-static const JNINativeMethod kMethodsMyInnerClass[] = {
-    { "nativeInit",
-"("
-")"
-"I",
-    reinterpret_cast<void*>(Java_org_chromium_TestJni_00024MyInnerClass_nativeInit)
-    },
-};
-
-static bool RegisterNativesImpl(JNIEnv* env) {
-  if (jni_generator::ShouldSkipJniRegistration(false))
-    return true;
-
-  const int kMethodsMyOtherInnerClassSize =
-      arraysize(kMethodsMyOtherInnerClass);
-
-  if (env->RegisterNatives(MyOtherInnerClass_clazz(env),
-                           kMethodsMyOtherInnerClass,
-                           kMethodsMyOtherInnerClassSize) < 0) {
-    jni_generator::HandleRegistrationError(
-        env, MyOtherInnerClass_clazz(env), __FILE__);
-    return false;
-  }
-
-  const int kMethodsMyInnerClassSize = arraysize(kMethodsMyInnerClass);
-
-  if (env->RegisterNatives(MyInnerClass_clazz(env),
-                           kMethodsMyInnerClass,
-                           kMethodsMyInnerClassSize) < 0) {
-    jni_generator::HandleRegistrationError(
-        env, MyInnerClass_clazz(env), __FILE__);
-    return false;
-  }
-
-  return true;
-}
-
-#endif  // org_chromium_TestJni_JNI
diff --git a/base/android/jni_generator/testInputStream.javap b/base/android/jni_generator/testInputStream.javap
deleted file mode 100644
index 50ab617..0000000
--- a/base/android/jni_generator/testInputStream.javap
+++ /dev/null
@@ -1,228 +0,0 @@
-Compiled from "InputStream.java"
-public abstract class java.io.InputStream extends java.lang.Object implements java.io.Closeable
-  SourceFile: "InputStream.java"
-  minor version: 0
-  major version: 49
-  Constant pool:
-const #1 = Method #6.#39; //  java/lang/Object."<init>":()V
-const #2 = class  #40;  //  java/lang/RuntimeException
-const #3 = String #41;  //  Stub!
-const #4 = Method #2.#42; //  java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-const #5 = class  #43;  //  java/io/InputStream
-const #6 = class  #44;  //  java/lang/Object
-const #7 = class  #45;  //  java/io/Closeable
-const #8 = Asciz  <init>;
-const #9 = Asciz  ()V;
-const #10 = Asciz Code;
-const #11 = Asciz LineNumberTable;
-const #12 = Asciz LocalVariableTable;
-const #13 = Asciz this;
-const #14 = Asciz Ljava/io/InputStream;;
-const #15 = Asciz available;
-const #16 = Asciz ()I;
-const #17 = Asciz Exceptions;
-const #18 = class #46;  //  java/io/IOException
-const #19 = Asciz close;
-const #20 = Asciz mark;
-const #21 = Asciz (I)V;
-const #22 = Asciz readlimit;
-const #23 = Asciz I;
-const #24 = Asciz markSupported;
-const #25 = Asciz ()Z;
-const #26 = Asciz read;
-const #27 = Asciz ([B)I;
-const #28 = Asciz buffer;
-const #29 = Asciz [B;
-const #30 = Asciz ([BII)I;
-const #31 = Asciz byteOffset;
-const #32 = Asciz byteCount;
-const #33 = Asciz reset;
-const #34 = Asciz skip;
-const #35 = Asciz (J)J;
-const #36 = Asciz J;
-const #37 = Asciz SourceFile;
-const #38 = Asciz InputStream.java;
-const #39 = NameAndType #8:#9;//  "<init>":()V
-const #40 = Asciz java/lang/RuntimeException;
-const #41 = Asciz Stub!;
-const #42 = NameAndType #8:#47;//  "<init>":(Ljava/lang/String;)V
-const #43 = Asciz java/io/InputStream;
-const #44 = Asciz java/lang/Object;
-const #45 = Asciz java/io/Closeable;
-const #46 = Asciz java/io/IOException;
-const #47 = Asciz (Ljava/lang/String;)V;
-
-{
-public java.io.InputStream();
-  Signature: ()V
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: aload_0
-   1: invokespecial #1; //Method java/lang/Object."<init>":()V
-   4: new #2; //class java/lang/RuntimeException
-   7: dup
-   8: ldc #3; //String Stub!
-   10:  invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   13:  athrow
-  LineNumberTable:
-   line 5: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      14      0    this       Ljava/io/InputStream;
-
-
-public int available()   throws java.io.IOException;
-  Signature: ()I
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 6: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Ljava/io/InputStream;
-
-  Exceptions:
-   throws java.io.IOException
-public void close()   throws java.io.IOException;
-  Signature: ()V
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 7: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Ljava/io/InputStream;
-
-  Exceptions:
-   throws java.io.IOException
-public void mark(int);
-  Signature: (I)V
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 8: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Ljava/io/InputStream;
-   0      10      1    readlimit       I
-
-
-public boolean markSupported();
-  Signature: ()Z
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 9: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Ljava/io/InputStream;
-
-
-public abstract int read()   throws java.io.IOException;
-  Signature: ()I
-  Exceptions:
-   throws java.io.IOException
-public int read(byte[])   throws java.io.IOException;
-  Signature: ([B)I
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 11: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Ljava/io/InputStream;
-   0      10      1    buffer       [B
-
-  Exceptions:
-   throws java.io.IOException
-public int read(byte[], int, int)   throws java.io.IOException;
-  Signature: ([BII)I
-  Code:
-   Stack=3, Locals=4, Args_size=4
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 12: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Ljava/io/InputStream;
-   0      10      1    buffer       [B
-   0      10      2    byteOffset       I
-   0      10      3    byteCount       I
-
-  Exceptions:
-   throws java.io.IOException
-public synchronized void reset()   throws java.io.IOException;
-  Signature: ()V
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 13: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Ljava/io/InputStream;
-
-  Exceptions:
-   throws java.io.IOException
-public long skip(long)   throws java.io.IOException;
-  Signature: (J)J
-  Code:
-   Stack=3, Locals=3, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 14: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Ljava/io/InputStream;
-   0      10      1    byteCount       J
-
-  Exceptions:
-   throws java.io.IOException
-}
-
diff --git a/base/android/jni_generator/testMotionEvent.javap b/base/android/jni_generator/testMotionEvent.javap
deleted file mode 100644
index 0746943..0000000
--- a/base/android/jni_generator/testMotionEvent.javap
+++ /dev/null
@@ -1,2295 +0,0 @@
-Compiled from "MotionEvent.java"
-public final class android.view.MotionEvent extends android.view.InputEvent implements android.os.Parcelable
-  SourceFile: "MotionEvent.java"
-  InnerClass:
-   public final #10= #9 of #6; //PointerProperties=class android/view/MotionEvent$PointerProperties of class android/view/MotionEvent
-   public final #13= #12 of #6; //PointerCoords=class android/view/MotionEvent$PointerCoords of class android/view/MotionEvent
-   public abstract #150= #149 of #8; //Creator=class android/os/Parcelable$Creator of class android/os/Parcelable
-  minor version: 0
-  major version: 49
-  Constant pool:
-const #1 = Method #7.#293;  //  android/view/InputEvent."<init>":()V
-const #2 = class  #294; //  java/lang/RuntimeException
-const #3 = String #295; //  Stub!
-const #4 = Method #2.#296;  //  java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-const #5 = Field  #6.#297;  //  android/view/MotionEvent.CREATOR:Landroid/os/Parcelable$Creator;
-const #6 = class  #298; //  android/view/MotionEvent
-const #7 = class  #299; //  android/view/InputEvent
-const #8 = class  #300; //  android/os/Parcelable
-const #9 = class  #301; //  android/view/MotionEvent$PointerProperties
-const #10 = Asciz PointerProperties;
-const #11 = Asciz InnerClasses;
-const #12 = class #302; //  android/view/MotionEvent$PointerCoords
-const #13 = Asciz PointerCoords;
-const #14 = Asciz INVALID_POINTER_ID;
-const #15 = Asciz I;
-const #16 = Asciz ConstantValue;
-const #17 = int -1;
-const #18 = Asciz ACTION_MASK;
-const #19 = int 255;
-const #20 = Asciz ACTION_DOWN;
-const #21 = int 0;
-const #22 = Asciz ACTION_UP;
-const #23 = int 1;
-const #24 = Asciz ACTION_MOVE;
-const #25 = int 2;
-const #26 = Asciz ACTION_CANCEL;
-const #27 = int 3;
-const #28 = Asciz ACTION_OUTSIDE;
-const #29 = int 4;
-const #30 = Asciz ACTION_POINTER_DOWN;
-const #31 = int 5;
-const #32 = Asciz ACTION_POINTER_UP;
-const #33 = int 6;
-const #34 = Asciz ACTION_HOVER_MOVE;
-const #35 = int 7;
-const #36 = Asciz ACTION_SCROLL;
-const #37 = int 8;
-const #38 = Asciz ACTION_HOVER_ENTER;
-const #39 = int 9;
-const #40 = Asciz ACTION_HOVER_EXIT;
-const #41 = int 10;
-const #42 = Asciz ACTION_POINTER_INDEX_MASK;
-const #43 = int 65280;
-const #44 = Asciz ACTION_POINTER_INDEX_SHIFT;
-const #45 = Asciz ACTION_POINTER_1_DOWN;
-const #46 = Asciz Deprecated;
-const #47 = Asciz RuntimeVisibleAnnotations;
-const #48 = Asciz Ljava/lang/Deprecated;;
-const #49 = Asciz ACTION_POINTER_2_DOWN;
-const #50 = int 261;
-const #51 = Asciz ACTION_POINTER_3_DOWN;
-const #52 = int 517;
-const #53 = Asciz ACTION_POINTER_1_UP;
-const #54 = Asciz ACTION_POINTER_2_UP;
-const #55 = int 262;
-const #56 = Asciz ACTION_POINTER_3_UP;
-const #57 = int 518;
-const #58 = Asciz ACTION_POINTER_ID_MASK;
-const #59 = Asciz ACTION_POINTER_ID_SHIFT;
-const #60 = Asciz FLAG_WINDOW_IS_OBSCURED;
-const #61 = Asciz EDGE_TOP;
-const #62 = Asciz EDGE_BOTTOM;
-const #63 = Asciz EDGE_LEFT;
-const #64 = Asciz EDGE_RIGHT;
-const #65 = Asciz AXIS_X;
-const #66 = Asciz AXIS_Y;
-const #67 = Asciz AXIS_PRESSURE;
-const #68 = Asciz AXIS_SIZE;
-const #69 = Asciz AXIS_TOUCH_MAJOR;
-const #70 = Asciz AXIS_TOUCH_MINOR;
-const #71 = Asciz AXIS_TOOL_MAJOR;
-const #72 = Asciz AXIS_TOOL_MINOR;
-const #73 = Asciz AXIS_ORIENTATION;
-const #74 = Asciz AXIS_VSCROLL;
-const #75 = Asciz AXIS_HSCROLL;
-const #76 = Asciz AXIS_Z;
-const #77 = int 11;
-const #78 = Asciz AXIS_RX;
-const #79 = int 12;
-const #80 = Asciz AXIS_RY;
-const #81 = int 13;
-const #82 = Asciz AXIS_RZ;
-const #83 = int 14;
-const #84 = Asciz AXIS_HAT_X;
-const #85 = int 15;
-const #86 = Asciz AXIS_HAT_Y;
-const #87 = int 16;
-const #88 = Asciz AXIS_LTRIGGER;
-const #89 = int 17;
-const #90 = Asciz AXIS_RTRIGGER;
-const #91 = int 18;
-const #92 = Asciz AXIS_THROTTLE;
-const #93 = int 19;
-const #94 = Asciz AXIS_RUDDER;
-const #95 = int 20;
-const #96 = Asciz AXIS_WHEEL;
-const #97 = int 21;
-const #98 = Asciz AXIS_GAS;
-const #99 = int 22;
-const #100 = Asciz  AXIS_BRAKE;
-const #101 = int  23;
-const #102 = Asciz  AXIS_DISTANCE;
-const #103 = int  24;
-const #104 = Asciz  AXIS_TILT;
-const #105 = int  25;
-const #106 = Asciz  AXIS_GENERIC_1;
-const #107 = int  32;
-const #108 = Asciz  AXIS_GENERIC_2;
-const #109 = int  33;
-const #110 = Asciz  AXIS_GENERIC_3;
-const #111 = int  34;
-const #112 = Asciz  AXIS_GENERIC_4;
-const #113 = int  35;
-const #114 = Asciz  AXIS_GENERIC_5;
-const #115 = int  36;
-const #116 = Asciz  AXIS_GENERIC_6;
-const #117 = int  37;
-const #118 = Asciz  AXIS_GENERIC_7;
-const #119 = int  38;
-const #120 = Asciz  AXIS_GENERIC_8;
-const #121 = int  39;
-const #122 = Asciz  AXIS_GENERIC_9;
-const #123 = int  40;
-const #124 = Asciz  AXIS_GENERIC_10;
-const #125 = int  41;
-const #126 = Asciz  AXIS_GENERIC_11;
-const #127 = int  42;
-const #128 = Asciz  AXIS_GENERIC_12;
-const #129 = int  43;
-const #130 = Asciz  AXIS_GENERIC_13;
-const #131 = int  44;
-const #132 = Asciz  AXIS_GENERIC_14;
-const #133 = int  45;
-const #134 = Asciz  AXIS_GENERIC_15;
-const #135 = int  46;
-const #136 = Asciz  AXIS_GENERIC_16;
-const #137 = int  47;
-const #138 = Asciz  BUTTON_PRIMARY;
-const #139 = Asciz  BUTTON_SECONDARY;
-const #140 = Asciz  BUTTON_TERTIARY;
-const #141 = Asciz  BUTTON_BACK;
-const #142 = Asciz  BUTTON_FORWARD;
-const #143 = Asciz  TOOL_TYPE_UNKNOWN;
-const #144 = Asciz  TOOL_TYPE_FINGER;
-const #145 = Asciz  TOOL_TYPE_STYLUS;
-const #146 = Asciz  TOOL_TYPE_MOUSE;
-const #147 = Asciz  TOOL_TYPE_ERASER;
-const #148 = Asciz  CREATOR;
-const #149 = class  #303; //  android/os/Parcelable$Creator
-const #150 = Asciz  Creator;
-const #151 = Asciz  Landroid/os/Parcelable$Creator;;
-const #152 = Asciz  Signature;
-const #153 = Asciz  Landroid/os/Parcelable$Creator<Landroid/view/MotionEvent;>;;
-const #154 = Asciz  <init>;
-const #155 = Asciz  ()V;
-const #156 = Asciz  Code;
-const #157 = Asciz  LineNumberTable;
-const #158 = Asciz  LocalVariableTable;
-const #159 = Asciz  this;
-const #160 = Asciz  Landroid/view/MotionEvent;;
-const #161 = Asciz  finalize;
-const #162 = Asciz  Exceptions;
-const #163 = class  #304; //  java/lang/Throwable
-const #164 = Asciz  obtain;
-const #165 = Asciz  (JJII[Landroid/view/MotionEvent$PointerProperties;[Landroid/view/MotionEvent$PointerCoords;IIFFIIII)Landroid/view/MotionEvent;;
-const #166 = Asciz  downTime;
-const #167 = Asciz  J;
-const #168 = Asciz  eventTime;
-const #169 = Asciz  action;
-const #170 = Asciz  pointerCount;
-const #171 = Asciz  pointerProperties;
-const #172 = Asciz  [Landroid/view/MotionEvent$PointerProperties;;
-const #173 = Asciz  pointerCoords;
-const #174 = Asciz  [Landroid/view/MotionEvent$PointerCoords;;
-const #175 = Asciz  metaState;
-const #176 = Asciz  buttonState;
-const #177 = Asciz  xPrecision;
-const #178 = Asciz  F;
-const #179 = Asciz  yPrecision;
-const #180 = Asciz  deviceId;
-const #181 = Asciz  edgeFlags;
-const #182 = Asciz  source;
-const #183 = Asciz  flags;
-const #184 = Asciz  (JJII[I[Landroid/view/MotionEvent$PointerCoords;IFFIIII)Landroid/view/MotionEvent;;
-const #185 = Asciz  pointerIds;
-const #186 = Asciz  [I;
-const #187 = Asciz  (JJIFFFFIFFII)Landroid/view/MotionEvent;;
-const #188 = Asciz  x;
-const #189 = Asciz  y;
-const #190 = Asciz  pressure;
-const #191 = Asciz  size;
-const #192 = Asciz  (JJIIFFFFIFFII)Landroid/view/MotionEvent;;
-const #193 = Asciz  (JJIFFI)Landroid/view/MotionEvent;;
-const #194 = Asciz  (Landroid/view/MotionEvent;)Landroid/view/MotionEvent;;
-const #195 = Asciz  other;
-const #196 = Asciz  obtainNoHistory;
-const #197 = Asciz  recycle;
-const #198 = Asciz  getDeviceId;
-const #199 = Asciz  ()I;
-const #200 = Asciz  getSource;
-const #201 = Asciz  setSource;
-const #202 = Asciz  (I)V;
-const #203 = Asciz  getAction;
-const #204 = Asciz  getActionMasked;
-const #205 = Asciz  getActionIndex;
-const #206 = Asciz  getFlags;
-const #207 = Asciz  getDownTime;
-const #208 = Asciz  ()J;
-const #209 = Asciz  getEventTime;
-const #210 = Asciz  getX;
-const #211 = Asciz  ()F;
-const #212 = Asciz  getY;
-const #213 = Asciz  getPressure;
-const #214 = Asciz  getSize;
-const #215 = Asciz  getTouchMajor;
-const #216 = Asciz  getTouchMinor;
-const #217 = Asciz  getToolMajor;
-const #218 = Asciz  getToolMinor;
-const #219 = Asciz  getOrientation;
-const #220 = Asciz  getAxisValue;
-const #221 = Asciz  (I)F;
-const #222 = Asciz  axis;
-const #223 = Asciz  getPointerCount;
-const #224 = Asciz  getPointerId;
-const #225 = Asciz  (I)I;
-const #226 = Asciz  pointerIndex;
-const #227 = Asciz  getToolType;
-const #228 = Asciz  findPointerIndex;
-const #229 = Asciz  pointerId;
-const #230 = Asciz  (II)F;
-const #231 = Asciz  getPointerCoords;
-const #232 = Asciz  (ILandroid/view/MotionEvent$PointerCoords;)V;
-const #233 = Asciz  outPointerCoords;
-const #234 = Asciz  Landroid/view/MotionEvent$PointerCoords;;
-const #235 = Asciz  getPointerProperties;
-const #236 = Asciz  (ILandroid/view/MotionEvent$PointerProperties;)V;
-const #237 = Asciz  outPointerProperties;
-const #238 = Asciz  Landroid/view/MotionEvent$PointerProperties;;
-const #239 = Asciz  getMetaState;
-const #240 = Asciz  getButtonState;
-const #241 = Asciz  getRawX;
-const #242 = Asciz  getRawY;
-const #243 = Asciz  getXPrecision;
-const #244 = Asciz  getYPrecision;
-const #245 = Asciz  getHistorySize;
-const #246 = Asciz  getHistoricalEventTime;
-const #247 = Asciz  (I)J;
-const #248 = Asciz  pos;
-const #249 = Asciz  getHistoricalX;
-const #250 = Asciz  getHistoricalY;
-const #251 = Asciz  getHistoricalPressure;
-const #252 = Asciz  getHistoricalSize;
-const #253 = Asciz  getHistoricalTouchMajor;
-const #254 = Asciz  getHistoricalTouchMinor;
-const #255 = Asciz  getHistoricalToolMajor;
-const #256 = Asciz  getHistoricalToolMinor;
-const #257 = Asciz  getHistoricalOrientation;
-const #258 = Asciz  getHistoricalAxisValue;
-const #259 = Asciz  (III)F;
-const #260 = Asciz  getHistoricalPointerCoords;
-const #261 = Asciz  (IILandroid/view/MotionEvent$PointerCoords;)V;
-const #262 = Asciz  getEdgeFlags;
-const #263 = Asciz  setEdgeFlags;
-const #264 = Asciz  setAction;
-const #265 = Asciz  offsetLocation;
-const #266 = Asciz  (FF)V;
-const #267 = Asciz  deltaX;
-const #268 = Asciz  deltaY;
-const #269 = Asciz  setLocation;
-const #270 = Asciz  transform;
-const #271 = Asciz  (Landroid/graphics/Matrix;)V;
-const #272 = Asciz  matrix;
-const #273 = Asciz  Landroid/graphics/Matrix;;
-const #274 = Asciz  addBatch;
-const #275 = Asciz  (JFFFFI)V;
-const #276 = Asciz  (J[Landroid/view/MotionEvent$PointerCoords;I)V;
-const #277 = Asciz  toString;
-const #278 = Asciz  ()Ljava/lang/String;;
-const #279 = Asciz  actionToString;
-const #280 = Asciz  (I)Ljava/lang/String;;
-const #281 = Asciz  axisToString;
-const #282 = Asciz  axisFromString;
-const #283 = Asciz  (Ljava/lang/String;)I;
-const #284 = Asciz  symbolicName;
-const #285 = Asciz  Ljava/lang/String;;
-const #286 = Asciz  writeToParcel;
-const #287 = Asciz  (Landroid/os/Parcel;I)V;
-const #288 = Asciz  out;
-const #289 = Asciz  Landroid/os/Parcel;;
-const #290 = Asciz  <clinit>;
-const #291 = Asciz  SourceFile;
-const #292 = Asciz  MotionEvent.java;
-const #293 = NameAndType  #154:#155;//  "<init>":()V
-const #294 = Asciz  java/lang/RuntimeException;
-const #295 = Asciz  Stub!;
-const #296 = NameAndType  #154:#305;//  "<init>":(Ljava/lang/String;)V
-const #297 = NameAndType  #148:#151;//  CREATOR:Landroid/os/Parcelable$Creator;
-const #298 = Asciz  android/view/MotionEvent;
-const #299 = Asciz  android/view/InputEvent;
-const #300 = Asciz  android/os/Parcelable;
-const #301 = Asciz  android/view/MotionEvent$PointerProperties;
-const #302 = Asciz  android/view/MotionEvent$PointerCoords;
-const #303 = Asciz  android/os/Parcelable$Creator;
-const #304 = Asciz  java/lang/Throwable;
-const #305 = Asciz  (Ljava/lang/String;)V;
-
-{
-public static final int INVALID_POINTER_ID;
-  Signature: I
-  Constant value: int -1
-
-public static final int ACTION_MASK;
-  Signature: I
-  Constant value: int 255
-
-public static final int ACTION_DOWN;
-  Signature: I
-  Constant value: int 0
-
-public static final int ACTION_UP;
-  Signature: I
-  Constant value: int 1
-
-public static final int ACTION_MOVE;
-  Signature: I
-  Constant value: int 2
-
-public static final int ACTION_CANCEL;
-  Signature: I
-  Constant value: int 3
-
-public static final int ACTION_OUTSIDE;
-  Signature: I
-  Constant value: int 4
-
-public static final int ACTION_POINTER_DOWN;
-  Signature: I
-  Constant value: int 5
-
-public static final int ACTION_POINTER_UP;
-  Signature: I
-  Constant value: int 6
-
-public static final int ACTION_HOVER_MOVE;
-  Signature: I
-  Constant value: int 7
-
-public static final int ACTION_SCROLL;
-  Signature: I
-  Constant value: int 8
-
-public static final int ACTION_HOVER_ENTER;
-  Signature: I
-  Constant value: int 9
-
-public static final int ACTION_HOVER_EXIT;
-  Signature: I
-  Constant value: int 10
-
-public static final int ACTION_POINTER_INDEX_MASK;
-  Signature: I
-  Constant value: int 65280
-
-public static final int ACTION_POINTER_INDEX_SHIFT;
-  Signature: I
-  Constant value: int 8
-
-public static final int ACTION_POINTER_1_DOWN;
-  Signature: I
-  Constant value: int 5Deprecated: true
-  RuntimeVisibleAnnotations: length = 0x6
-   00 01 00 30 00 00
-
-
-public static final int ACTION_POINTER_2_DOWN;
-  Signature: I
-  Constant value: int 261Deprecated: true
-  RuntimeVisibleAnnotations: length = 0x6
-   00 01 00 30 00 00
-
-
-public static final int ACTION_POINTER_3_DOWN;
-  Signature: I
-  Constant value: int 517Deprecated: true
-  RuntimeVisibleAnnotations: length = 0x6
-   00 01 00 30 00 00
-
-
-public static final int ACTION_POINTER_1_UP;
-  Signature: I
-  Constant value: int 6Deprecated: true
-  RuntimeVisibleAnnotations: length = 0x6
-   00 01 00 30 00 00
-
-
-public static final int ACTION_POINTER_2_UP;
-  Signature: I
-  Constant value: int 262Deprecated: true
-  RuntimeVisibleAnnotations: length = 0x6
-   00 01 00 30 00 00
-
-
-public static final int ACTION_POINTER_3_UP;
-  Signature: I
-  Constant value: int 518Deprecated: true
-  RuntimeVisibleAnnotations: length = 0x6
-   00 01 00 30 00 00
-
-
-public static final int ACTION_POINTER_ID_MASK;
-  Signature: I
-  Constant value: int 65280Deprecated: true
-  RuntimeVisibleAnnotations: length = 0x6
-   00 01 00 30 00 00
-
-
-public static final int ACTION_POINTER_ID_SHIFT;
-  Signature: I
-  Constant value: int 8Deprecated: true
-  RuntimeVisibleAnnotations: length = 0x6
-   00 01 00 30 00 00
-
-
-public static final int FLAG_WINDOW_IS_OBSCURED;
-  Signature: I
-  Constant value: int 1
-
-public static final int EDGE_TOP;
-  Signature: I
-  Constant value: int 1
-
-public static final int EDGE_BOTTOM;
-  Signature: I
-  Constant value: int 2
-
-public static final int EDGE_LEFT;
-  Signature: I
-  Constant value: int 4
-
-public static final int EDGE_RIGHT;
-  Signature: I
-  Constant value: int 8
-
-public static final int AXIS_X;
-  Signature: I
-  Constant value: int 0
-
-public static final int AXIS_Y;
-  Signature: I
-  Constant value: int 1
-
-public static final int AXIS_PRESSURE;
-  Signature: I
-  Constant value: int 2
-
-public static final int AXIS_SIZE;
-  Signature: I
-  Constant value: int 3
-
-public static final int AXIS_TOUCH_MAJOR;
-  Signature: I
-  Constant value: int 4
-
-public static final int AXIS_TOUCH_MINOR;
-  Signature: I
-  Constant value: int 5
-
-public static final int AXIS_TOOL_MAJOR;
-  Signature: I
-  Constant value: int 6
-
-public static final int AXIS_TOOL_MINOR;
-  Signature: I
-  Constant value: int 7
-
-public static final int AXIS_ORIENTATION;
-  Signature: I
-  Constant value: int 8
-
-public static final int AXIS_VSCROLL;
-  Signature: I
-  Constant value: int 9
-
-public static final int AXIS_HSCROLL;
-  Signature: I
-  Constant value: int 10
-
-public static final int AXIS_Z;
-  Signature: I
-  Constant value: int 11
-
-public static final int AXIS_RX;
-  Signature: I
-  Constant value: int 12
-
-public static final int AXIS_RY;
-  Signature: I
-  Constant value: int 13
-
-public static final int AXIS_RZ;
-  Signature: I
-  Constant value: int 14
-
-public static final int AXIS_HAT_X;
-  Signature: I
-  Constant value: int 15
-
-public static final int AXIS_HAT_Y;
-  Signature: I
-  Constant value: int 16
-
-public static final int AXIS_LTRIGGER;
-  Signature: I
-  Constant value: int 17
-
-public static final int AXIS_RTRIGGER;
-  Signature: I
-  Constant value: int 18
-
-public static final int AXIS_THROTTLE;
-  Signature: I
-  Constant value: int 19
-
-public static final int AXIS_RUDDER;
-  Signature: I
-  Constant value: int 20
-
-public static final int AXIS_WHEEL;
-  Signature: I
-  Constant value: int 21
-
-public static final int AXIS_GAS;
-  Signature: I
-  Constant value: int 22
-
-public static final int AXIS_BRAKE;
-  Signature: I
-  Constant value: int 23
-
-public static final int AXIS_DISTANCE;
-  Signature: I
-  Constant value: int 24
-
-public static final int AXIS_TILT;
-  Signature: I
-  Constant value: int 25
-
-public static final int AXIS_GENERIC_1;
-  Signature: I
-  Constant value: int 32
-
-public static final int AXIS_GENERIC_2;
-  Signature: I
-  Constant value: int 33
-
-public static final int AXIS_GENERIC_3;
-  Signature: I
-  Constant value: int 34
-
-public static final int AXIS_GENERIC_4;
-  Signature: I
-  Constant value: int 35
-
-public static final int AXIS_GENERIC_5;
-  Signature: I
-  Constant value: int 36
-
-public static final int AXIS_GENERIC_6;
-  Signature: I
-  Constant value: int 37
-
-public static final int AXIS_GENERIC_7;
-  Signature: I
-  Constant value: int 38
-
-public static final int AXIS_GENERIC_8;
-  Signature: I
-  Constant value: int 39
-
-public static final int AXIS_GENERIC_9;
-  Signature: I
-  Constant value: int 40
-
-public static final int AXIS_GENERIC_10;
-  Signature: I
-  Constant value: int 41
-
-public static final int AXIS_GENERIC_11;
-  Signature: I
-  Constant value: int 42
-
-public static final int AXIS_GENERIC_12;
-  Signature: I
-  Constant value: int 43
-
-public static final int AXIS_GENERIC_13;
-  Signature: I
-  Constant value: int 44
-
-public static final int AXIS_GENERIC_14;
-  Signature: I
-  Constant value: int 45
-
-public static final int AXIS_GENERIC_15;
-  Signature: I
-  Constant value: int 46
-
-public static final int AXIS_GENERIC_16;
-  Signature: I
-  Constant value: int 47
-
-public static final int BUTTON_PRIMARY;
-  Signature: I
-  Constant value: int 1
-
-public static final int BUTTON_SECONDARY;
-  Signature: I
-  Constant value: int 2
-
-public static final int BUTTON_TERTIARY;
-  Signature: I
-  Constant value: int 4
-
-public static final int BUTTON_BACK;
-  Signature: I
-  Constant value: int 8
-
-public static final int BUTTON_FORWARD;
-  Signature: I
-  Constant value: int 16
-
-public static final int TOOL_TYPE_UNKNOWN;
-  Signature: I
-  Constant value: int 0
-
-public static final int TOOL_TYPE_FINGER;
-  Signature: I
-  Constant value: int 1
-
-public static final int TOOL_TYPE_STYLUS;
-  Signature: I
-  Constant value: int 2
-
-public static final int TOOL_TYPE_MOUSE;
-  Signature: I
-  Constant value: int 3
-
-public static final int TOOL_TYPE_ERASER;
-  Signature: I
-  Constant value: int 4
-
-public static final android.os.Parcelable$Creator CREATOR;
-  Signature: Landroid/os/Parcelable$Creator;
-  Signature: length = 0x2
-   00 FFFFFF99
-
-
-android.view.MotionEvent();
-  Signature: ()V
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: aload_0
-   1: invokespecial #1; //Method android/view/InputEvent."<init>":()V
-   4: new #2; //class java/lang/RuntimeException
-   7: dup
-   8: ldc #3; //String Stub!
-   10:  invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   13:  athrow
-  LineNumberTable:
-   line 35: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      14      0    this       Landroid/view/MotionEvent;
-
-
-protected void finalize()   throws java.lang.Throwable;
-  Signature: ()V
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 36: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-  Exceptions:
-   throws java.lang.Throwable
-public static android.view.MotionEvent obtain(long, long, int, int, android.view.MotionEvent$PointerProperties[], android.view.MotionEvent$PointerCoords[], int, int, float, float, int, int, int, int);
-  Signature: (JJII[Landroid/view/MotionEvent$PointerProperties;[Landroid/view/MotionEvent$PointerCoords;IIFFIIII)Landroid/view/MotionEvent;
-  Code:
-   Stack=3, Locals=16, Args_size=14
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 37: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    downTime       J
-   0      10      2    eventTime       J
-   0      10      4    action       I
-   0      10      5    pointerCount       I
-   0      10      6    pointerProperties       [Landroid/view/MotionEvent$PointerProperties;
-   0      10      7    pointerCoords       [Landroid/view/MotionEvent$PointerCoords;
-   0      10      8    metaState       I
-   0      10      9    buttonState       I
-   0      10      10    xPrecision       F
-   0      10      11    yPrecision       F
-   0      10      12    deviceId       I
-   0      10      13    edgeFlags       I
-   0      10      14    source       I
-   0      10      15    flags       I
-
-
-public static android.view.MotionEvent obtain(long, long, int, int, int[], android.view.MotionEvent$PointerCoords[], int, float, float, int, int, int, int);
-  Signature: (JJII[I[Landroid/view/MotionEvent$PointerCoords;IFFIIII)Landroid/view/MotionEvent;
-  Code:
-   Stack=3, Locals=15, Args_size=13
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 39: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    downTime       J
-   0      10      2    eventTime       J
-   0      10      4    action       I
-   0      10      5    pointerCount       I
-   0      10      6    pointerIds       [I
-   0      10      7    pointerCoords       [Landroid/view/MotionEvent$PointerCoords;
-   0      10      8    metaState       I
-   0      10      9    xPrecision       F
-   0      10      10    yPrecision       F
-   0      10      11    deviceId       I
-   0      10      12    edgeFlags       I
-   0      10      13    source       I
-   0      10      14    flags       I
-
-  Deprecated: true
-  RuntimeVisibleAnnotations: length = 0x6
-   00 01 00 30 00 00
-
-public static android.view.MotionEvent obtain(long, long, int, float, float, float, float, int, float, float, int, int);
-  Signature: (JJIFFFFIFFII)Landroid/view/MotionEvent;
-  Code:
-   Stack=3, Locals=14, Args_size=12
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 40: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    downTime       J
-   0      10      2    eventTime       J
-   0      10      4    action       I
-   0      10      5    x       F
-   0      10      6    y       F
-   0      10      7    pressure       F
-   0      10      8    size       F
-   0      10      9    metaState       I
-   0      10      10    xPrecision       F
-   0      10      11    yPrecision       F
-   0      10      12    deviceId       I
-   0      10      13    edgeFlags       I
-
-
-public static android.view.MotionEvent obtain(long, long, int, int, float, float, float, float, int, float, float, int, int);
-  Signature: (JJIIFFFFIFFII)Landroid/view/MotionEvent;
-  Code:
-   Stack=3, Locals=15, Args_size=13
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 42: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    downTime       J
-   0      10      2    eventTime       J
-   0      10      4    action       I
-   0      10      5    pointerCount       I
-   0      10      6    x       F
-   0      10      7    y       F
-   0      10      8    pressure       F
-   0      10      9    size       F
-   0      10      10    metaState       I
-   0      10      11    xPrecision       F
-   0      10      12    yPrecision       F
-   0      10      13    deviceId       I
-   0      10      14    edgeFlags       I
-
-  Deprecated: true
-  RuntimeVisibleAnnotations: length = 0x6
-   00 01 00 30 00 00
-
-public static android.view.MotionEvent obtain(long, long, int, float, float, int);
-  Signature: (JJIFFI)Landroid/view/MotionEvent;
-  Code:
-   Stack=3, Locals=8, Args_size=6
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 43: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    downTime       J
-   0      10      2    eventTime       J
-   0      10      4    action       I
-   0      10      5    x       F
-   0      10      6    y       F
-   0      10      7    metaState       I
-
-
-public static android.view.MotionEvent obtain(android.view.MotionEvent);
-  Signature: (Landroid/view/MotionEvent;)Landroid/view/MotionEvent;
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 44: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    other       Landroid/view/MotionEvent;
-
-
-public static android.view.MotionEvent obtainNoHistory(android.view.MotionEvent);
-  Signature: (Landroid/view/MotionEvent;)Landroid/view/MotionEvent;
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 45: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    other       Landroid/view/MotionEvent;
-
-
-public final void recycle();
-  Signature: ()V
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 46: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final int getDeviceId();
-  Signature: ()I
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 47: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final int getSource();
-  Signature: ()I
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 48: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final void setSource(int);
-  Signature: (I)V
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 49: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    source       I
-
-
-public final int getAction();
-  Signature: ()I
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 50: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final int getActionMasked();
-  Signature: ()I
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 51: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final int getActionIndex();
-  Signature: ()I
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 52: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final int getFlags();
-  Signature: ()I
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 53: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final long getDownTime();
-  Signature: ()J
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 54: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final long getEventTime();
-  Signature: ()J
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 55: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final float getX();
-  Signature: ()F
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 56: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final float getY();
-  Signature: ()F
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 57: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final float getPressure();
-  Signature: ()F
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 58: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final float getSize();
-  Signature: ()F
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 59: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final float getTouchMajor();
-  Signature: ()F
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 60: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final float getTouchMinor();
-  Signature: ()F
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 61: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final float getToolMajor();
-  Signature: ()F
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 62: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final float getToolMinor();
-  Signature: ()F
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 63: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final float getOrientation();
-  Signature: ()F
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 64: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final float getAxisValue(int);
-  Signature: (I)F
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 65: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    axis       I
-
-
-public final int getPointerCount();
-  Signature: ()I
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 66: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final int getPointerId(int);
-  Signature: (I)I
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 67: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-
-
-public final int getToolType(int);
-  Signature: (I)I
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 68: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-
-
-public final int findPointerIndex(int);
-  Signature: (I)I
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 69: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerId       I
-
-
-public final float getX(int);
-  Signature: (I)F
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 70: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-
-
-public final float getY(int);
-  Signature: (I)F
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 71: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-
-
-public final float getPressure(int);
-  Signature: (I)F
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 72: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-
-
-public final float getSize(int);
-  Signature: (I)F
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 73: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-
-
-public final float getTouchMajor(int);
-  Signature: (I)F
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 74: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-
-
-public final float getTouchMinor(int);
-  Signature: (I)F
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 75: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-
-
-public final float getToolMajor(int);
-  Signature: (I)F
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 76: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-
-
-public final float getToolMinor(int);
-  Signature: (I)F
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 77: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-
-
-public final float getOrientation(int);
-  Signature: (I)F
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 78: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-
-
-public final float getAxisValue(int, int);
-  Signature: (II)F
-  Code:
-   Stack=3, Locals=3, Args_size=3
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 79: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    axis       I
-   0      10      2    pointerIndex       I
-
-
-public final void getPointerCoords(int, android.view.MotionEvent$PointerCoords);
-  Signature: (ILandroid/view/MotionEvent$PointerCoords;)V
-  Code:
-   Stack=3, Locals=3, Args_size=3
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 80: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-   0      10      2    outPointerCoords       Landroid/view/MotionEvent$PointerCoords;
-
-
-public final void getPointerProperties(int, android.view.MotionEvent$PointerProperties);
-  Signature: (ILandroid/view/MotionEvent$PointerProperties;)V
-  Code:
-   Stack=3, Locals=3, Args_size=3
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 81: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-   0      10      2    outPointerProperties       Landroid/view/MotionEvent$PointerProperties;
-
-
-public final int getMetaState();
-  Signature: ()I
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 82: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final int getButtonState();
-  Signature: ()I
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 83: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final float getRawX();
-  Signature: ()F
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 84: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final float getRawY();
-  Signature: ()F
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 85: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final float getXPrecision();
-  Signature: ()F
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 86: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final float getYPrecision();
-  Signature: ()F
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 87: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final int getHistorySize();
-  Signature: ()I
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 88: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final long getHistoricalEventTime(int);
-  Signature: (I)J
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 89: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pos       I
-
-
-public final float getHistoricalX(int);
-  Signature: (I)F
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 90: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pos       I
-
-
-public final float getHistoricalY(int);
-  Signature: (I)F
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 91: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pos       I
-
-
-public final float getHistoricalPressure(int);
-  Signature: (I)F
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 92: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pos       I
-
-
-public final float getHistoricalSize(int);
-  Signature: (I)F
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 93: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pos       I
-
-
-public final float getHistoricalTouchMajor(int);
-  Signature: (I)F
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 94: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pos       I
-
-
-public final float getHistoricalTouchMinor(int);
-  Signature: (I)F
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 95: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pos       I
-
-
-public final float getHistoricalToolMajor(int);
-  Signature: (I)F
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 96: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pos       I
-
-
-public final float getHistoricalToolMinor(int);
-  Signature: (I)F
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 97: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pos       I
-
-
-public final float getHistoricalOrientation(int);
-  Signature: (I)F
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 98: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pos       I
-
-
-public final float getHistoricalAxisValue(int, int);
-  Signature: (II)F
-  Code:
-   Stack=3, Locals=3, Args_size=3
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 99: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    axis       I
-   0      10      2    pos       I
-
-
-public final float getHistoricalX(int, int);
-  Signature: (II)F
-  Code:
-   Stack=3, Locals=3, Args_size=3
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 100: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-   0      10      2    pos       I
-
-
-public final float getHistoricalY(int, int);
-  Signature: (II)F
-  Code:
-   Stack=3, Locals=3, Args_size=3
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 101: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-   0      10      2    pos       I
-
-
-public final float getHistoricalPressure(int, int);
-  Signature: (II)F
-  Code:
-   Stack=3, Locals=3, Args_size=3
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 102: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-   0      10      2    pos       I
-
-
-public final float getHistoricalSize(int, int);
-  Signature: (II)F
-  Code:
-   Stack=3, Locals=3, Args_size=3
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 103: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-   0      10      2    pos       I
-
-
-public final float getHistoricalTouchMajor(int, int);
-  Signature: (II)F
-  Code:
-   Stack=3, Locals=3, Args_size=3
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 104: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-   0      10      2    pos       I
-
-
-public final float getHistoricalTouchMinor(int, int);
-  Signature: (II)F
-  Code:
-   Stack=3, Locals=3, Args_size=3
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 105: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-   0      10      2    pos       I
-
-
-public final float getHistoricalToolMajor(int, int);
-  Signature: (II)F
-  Code:
-   Stack=3, Locals=3, Args_size=3
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 106: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-   0      10      2    pos       I
-
-
-public final float getHistoricalToolMinor(int, int);
-  Signature: (II)F
-  Code:
-   Stack=3, Locals=3, Args_size=3
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 107: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-   0      10      2    pos       I
-
-
-public final float getHistoricalOrientation(int, int);
-  Signature: (II)F
-  Code:
-   Stack=3, Locals=3, Args_size=3
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 108: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-   0      10      2    pos       I
-
-
-public final float getHistoricalAxisValue(int, int, int);
-  Signature: (III)F
-  Code:
-   Stack=3, Locals=4, Args_size=4
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 109: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    axis       I
-   0      10      2    pointerIndex       I
-   0      10      3    pos       I
-
-
-public final void getHistoricalPointerCoords(int, int, android.view.MotionEvent$PointerCoords);
-  Signature: (IILandroid/view/MotionEvent$PointerCoords;)V
-  Code:
-   Stack=3, Locals=4, Args_size=4
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 110: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    pointerIndex       I
-   0      10      2    pos       I
-   0      10      3    outPointerCoords       Landroid/view/MotionEvent$PointerCoords;
-
-
-public final int getEdgeFlags();
-  Signature: ()I
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 111: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public final void setEdgeFlags(int);
-  Signature: (I)V
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 112: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    flags       I
-
-
-public final void setAction(int);
-  Signature: (I)V
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 113: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    action       I
-
-
-public final void offsetLocation(float, float);
-  Signature: (FF)V
-  Code:
-   Stack=3, Locals=3, Args_size=3
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 114: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    deltaX       F
-   0      10      2    deltaY       F
-
-
-public final void setLocation(float, float);
-  Signature: (FF)V
-  Code:
-   Stack=3, Locals=3, Args_size=3
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 115: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    x       F
-   0      10      2    y       F
-
-
-public final void transform(android.graphics.Matrix);
-  Signature: (Landroid/graphics/Matrix;)V
-  Code:
-   Stack=3, Locals=2, Args_size=2
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 116: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    matrix       Landroid/graphics/Matrix;
-
-
-public final void addBatch(long, float, float, float, float, int);
-  Signature: (JFFFFI)V
-  Code:
-   Stack=3, Locals=8, Args_size=7
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 117: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    eventTime       J
-   0      10      3    x       F
-   0      10      4    y       F
-   0      10      5    pressure       F
-   0      10      6    size       F
-   0      10      7    metaState       I
-
-
-public final void addBatch(long, android.view.MotionEvent$PointerCoords[], int);
-  Signature: (J[Landroid/view/MotionEvent$PointerCoords;I)V
-  Code:
-   Stack=3, Locals=5, Args_size=4
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 118: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    eventTime       J
-   0      10      3    pointerCoords       [Landroid/view/MotionEvent$PointerCoords;
-   0      10      4    metaState       I
-
-
-public java.lang.String toString();
-  Signature: ()Ljava/lang/String;
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 119: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-
-
-public static java.lang.String actionToString(int);
-  Signature: (I)Ljava/lang/String;
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 120: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    action       I
-
-
-public static java.lang.String axisToString(int);
-  Signature: (I)Ljava/lang/String;
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 121: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    axis       I
-
-
-public static int axisFromString(java.lang.String);
-  Signature: (Ljava/lang/String;)I
-  Code:
-   Stack=3, Locals=1, Args_size=1
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 122: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    symbolicName       Ljava/lang/String;
-
-
-public void writeToParcel(android.os.Parcel, int);
-  Signature: (Landroid/os/Parcel;I)V
-  Code:
-   Stack=3, Locals=3, Args_size=3
-   0: new #2; //class java/lang/RuntimeException
-   3: dup
-   4: ldc #3; //String Stub!
-   6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-   9: athrow
-  LineNumberTable:
-   line 123: 0
-
-  LocalVariableTable:
-   Start  Length  Slot  Name   Signature
-   0      10      0    this       Landroid/view/MotionEvent;
-   0      10      1    out       Landroid/os/Parcel;
-   0      10      2    flags       I
-
-
-static {};
-  Signature: ()V
-  Code:
-   Stack=1, Locals=0, Args_size=0
-   0: aconst_null
-   1: putstatic #5; //Field CREATOR:Landroid/os/Parcelable$Creator;
-   4: return
-  LineNumberTable:
-   line 213: 0
-
-
-}
-
diff --git a/base/android/jni_generator/testMotionEvent.javap7 b/base/android/jni_generator/testMotionEvent.javap7
deleted file mode 100644
index f4f5444..0000000
--- a/base/android/jni_generator/testMotionEvent.javap7
+++ /dev/null
@@ -1,2370 +0,0 @@
-Classfile out_android/Debug/gen/content/jni/android/view/MotionEvent.class
-  Last modified Feb 27, 2014; size 13369 bytes
-  MD5 checksum 3718d77a994cb8aceb7b35c5df3c4dd1
-  Compiled from "MotionEvent.java"
-public final class android.view.MotionEvent extends android.view.InputEvent implements android.os.Parcelable
-  SourceFile: "MotionEvent.java"
-  InnerClasses:
-       public static final #10= #9 of #6; //PointerProperties=class android/view/MotionEvent$PointerProperties of class android/view/MotionEvent
-       public static final #13= #12 of #6; //PointerCoords=class android/view/MotionEvent$PointerCoords of class android/view/MotionEvent
-       public static #150= #149 of #8; //Creator=class android/os/Parcelable$Creator of class android/os/Parcelable
-  minor version: 0
-  major version: 49
-  flags: ACC_PUBLIC, ACC_FINAL, ACC_SUPER
-Constant pool:
-    #1 = Methodref          #7.#293       //  android/view/InputEvent."<init>":()V
-    #2 = Class              #294          //  java/lang/RuntimeException
-    #3 = String             #295          //  Stub!
-    #4 = Methodref          #2.#296       //  java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-    #5 = Fieldref           #6.#297       //  android/view/MotionEvent.CREATOR:Landroid/os/Parcelable$Creator;
-    #6 = Class              #298          //  android/view/MotionEvent
-    #7 = Class              #299          //  android/view/InputEvent
-    #8 = Class              #300          //  android/os/Parcelable
-    #9 = Class              #301          //  android/view/MotionEvent$PointerProperties
-   #10 = Utf8               PointerProperties
-   #11 = Utf8               InnerClasses
-   #12 = Class              #302          //  android/view/MotionEvent$PointerCoords
-   #13 = Utf8               PointerCoords
-   #14 = Utf8               INVALID_POINTER_ID
-   #15 = Utf8               I
-   #16 = Utf8               ConstantValue
-   #17 = Integer            -1
-   #18 = Utf8               ACTION_MASK
-   #19 = Integer            255
-   #20 = Utf8               ACTION_DOWN
-   #21 = Integer            0
-   #22 = Utf8               ACTION_UP
-   #23 = Integer            1
-   #24 = Utf8               ACTION_MOVE
-   #25 = Integer            2
-   #26 = Utf8               ACTION_CANCEL
-   #27 = Integer            3
-   #28 = Utf8               ACTION_OUTSIDE
-   #29 = Integer            4
-   #30 = Utf8               ACTION_POINTER_DOWN
-   #31 = Integer            5
-   #32 = Utf8               ACTION_POINTER_UP
-   #33 = Integer            6
-   #34 = Utf8               ACTION_HOVER_MOVE
-   #35 = Integer            7
-   #36 = Utf8               ACTION_SCROLL
-   #37 = Integer            8
-   #38 = Utf8               ACTION_HOVER_ENTER
-   #39 = Integer            9
-   #40 = Utf8               ACTION_HOVER_EXIT
-   #41 = Integer            10
-   #42 = Utf8               ACTION_POINTER_INDEX_MASK
-   #43 = Integer            65280
-   #44 = Utf8               ACTION_POINTER_INDEX_SHIFT
-   #45 = Utf8               ACTION_POINTER_1_DOWN
-   #46 = Utf8               Deprecated
-   #47 = Utf8               RuntimeVisibleAnnotations
-   #48 = Utf8               Ljava/lang/Deprecated;
-   #49 = Utf8               ACTION_POINTER_2_DOWN
-   #50 = Integer            261
-   #51 = Utf8               ACTION_POINTER_3_DOWN
-   #52 = Integer            517
-   #53 = Utf8               ACTION_POINTER_1_UP
-   #54 = Utf8               ACTION_POINTER_2_UP
-   #55 = Integer            262
-   #56 = Utf8               ACTION_POINTER_3_UP
-   #57 = Integer            518
-   #58 = Utf8               ACTION_POINTER_ID_MASK
-   #59 = Utf8               ACTION_POINTER_ID_SHIFT
-   #60 = Utf8               FLAG_WINDOW_IS_OBSCURED
-   #61 = Utf8               EDGE_TOP
-   #62 = Utf8               EDGE_BOTTOM
-   #63 = Utf8               EDGE_LEFT
-   #64 = Utf8               EDGE_RIGHT
-   #65 = Utf8               AXIS_X
-   #66 = Utf8               AXIS_Y
-   #67 = Utf8               AXIS_PRESSURE
-   #68 = Utf8               AXIS_SIZE
-   #69 = Utf8               AXIS_TOUCH_MAJOR
-   #70 = Utf8               AXIS_TOUCH_MINOR
-   #71 = Utf8               AXIS_TOOL_MAJOR
-   #72 = Utf8               AXIS_TOOL_MINOR
-   #73 = Utf8               AXIS_ORIENTATION
-   #74 = Utf8               AXIS_VSCROLL
-   #75 = Utf8               AXIS_HSCROLL
-   #76 = Utf8               AXIS_Z
-   #77 = Integer            11
-   #78 = Utf8               AXIS_RX
-   #79 = Integer            12
-   #80 = Utf8               AXIS_RY
-   #81 = Integer            13
-   #82 = Utf8               AXIS_RZ
-   #83 = Integer            14
-   #84 = Utf8               AXIS_HAT_X
-   #85 = Integer            15
-   #86 = Utf8               AXIS_HAT_Y
-   #87 = Integer            16
-   #88 = Utf8               AXIS_LTRIGGER
-   #89 = Integer            17
-   #90 = Utf8               AXIS_RTRIGGER
-   #91 = Integer            18
-   #92 = Utf8               AXIS_THROTTLE
-   #93 = Integer            19
-   #94 = Utf8               AXIS_RUDDER
-   #95 = Integer            20
-   #96 = Utf8               AXIS_WHEEL
-   #97 = Integer            21
-   #98 = Utf8               AXIS_GAS
-   #99 = Integer            22
-  #100 = Utf8               AXIS_BRAKE
-  #101 = Integer            23
-  #102 = Utf8               AXIS_DISTANCE
-  #103 = Integer            24
-  #104 = Utf8               AXIS_TILT
-  #105 = Integer            25
-  #106 = Utf8               AXIS_GENERIC_1
-  #107 = Integer            32
-  #108 = Utf8               AXIS_GENERIC_2
-  #109 = Integer            33
-  #110 = Utf8               AXIS_GENERIC_3
-  #111 = Integer            34
-  #112 = Utf8               AXIS_GENERIC_4
-  #113 = Integer            35
-  #114 = Utf8               AXIS_GENERIC_5
-  #115 = Integer            36
-  #116 = Utf8               AXIS_GENERIC_6
-  #117 = Integer            37
-  #118 = Utf8               AXIS_GENERIC_7
-  #119 = Integer            38
-  #120 = Utf8               AXIS_GENERIC_8
-  #121 = Integer            39
-  #122 = Utf8               AXIS_GENERIC_9
-  #123 = Integer            40
-  #124 = Utf8               AXIS_GENERIC_10
-  #125 = Integer            41
-  #126 = Utf8               AXIS_GENERIC_11
-  #127 = Integer            42
-  #128 = Utf8               AXIS_GENERIC_12
-  #129 = Integer            43
-  #130 = Utf8               AXIS_GENERIC_13
-  #131 = Integer            44
-  #132 = Utf8               AXIS_GENERIC_14
-  #133 = Integer            45
-  #134 = Utf8               AXIS_GENERIC_15
-  #135 = Integer            46
-  #136 = Utf8               AXIS_GENERIC_16
-  #137 = Integer            47
-  #138 = Utf8               BUTTON_PRIMARY
-  #139 = Utf8               BUTTON_SECONDARY
-  #140 = Utf8               BUTTON_TERTIARY
-  #141 = Utf8               BUTTON_BACK
-  #142 = Utf8               BUTTON_FORWARD
-  #143 = Utf8               TOOL_TYPE_UNKNOWN
-  #144 = Utf8               TOOL_TYPE_FINGER
-  #145 = Utf8               TOOL_TYPE_STYLUS
-  #146 = Utf8               TOOL_TYPE_MOUSE
-  #147 = Utf8               TOOL_TYPE_ERASER
-  #148 = Utf8               CREATOR
-  #149 = Class              #303          //  android/os/Parcelable$Creator
-  #150 = Utf8               Creator
-  #151 = Utf8               Landroid/os/Parcelable$Creator;
-  #152 = Utf8               Signature
-  #153 = Utf8               Landroid/os/Parcelable$Creator<Landroid/view/MotionEvent;>;
-  #154 = Utf8               <init>
-  #155 = Utf8               ()V
-  #156 = Utf8               Code
-  #157 = Utf8               LineNumberTable
-  #158 = Utf8               LocalVariableTable
-  #159 = Utf8               this
-  #160 = Utf8               Landroid/view/MotionEvent;
-  #161 = Utf8               finalize
-  #162 = Utf8               Exceptions
-  #163 = Class              #304          //  java/lang/Throwable
-  #164 = Utf8               obtain
-  #165 = Utf8               (JJII[Landroid/view/MotionEvent$PointerProperties;[Landroid/view/MotionEvent$PointerCoords;IIFFIIII)Landroid/view/MotionEvent;
-  #166 = Utf8               downTime
-  #167 = Utf8               J
-  #168 = Utf8               eventTime
-  #169 = Utf8               action
-  #170 = Utf8               pointerCount
-  #171 = Utf8               pointerProperties
-  #172 = Utf8               [Landroid/view/MotionEvent$PointerProperties;
-  #173 = Utf8               pointerCoords
-  #174 = Utf8               [Landroid/view/MotionEvent$PointerCoords;
-  #175 = Utf8               metaState
-  #176 = Utf8               buttonState
-  #177 = Utf8               xPrecision
-  #178 = Utf8               F
-  #179 = Utf8               yPrecision
-  #180 = Utf8               deviceId
-  #181 = Utf8               edgeFlags
-  #182 = Utf8               source
-  #183 = Utf8               flags
-  #184 = Utf8               (JJII[I[Landroid/view/MotionEvent$PointerCoords;IFFIIII)Landroid/view/MotionEvent;
-  #185 = Utf8               pointerIds
-  #186 = Utf8               [I
-  #187 = Utf8               (JJIFFFFIFFII)Landroid/view/MotionEvent;
-  #188 = Utf8               x
-  #189 = Utf8               y
-  #190 = Utf8               pressure
-  #191 = Utf8               size
-  #192 = Utf8               (JJIIFFFFIFFII)Landroid/view/MotionEvent;
-  #193 = Utf8               (JJIFFI)Landroid/view/MotionEvent;
-  #194 = Utf8               (Landroid/view/MotionEvent;)Landroid/view/MotionEvent;
-  #195 = Utf8               other
-  #196 = Utf8               obtainNoHistory
-  #197 = Utf8               recycle
-  #198 = Utf8               getDeviceId
-  #199 = Utf8               ()I
-  #200 = Utf8               getSource
-  #201 = Utf8               setSource
-  #202 = Utf8               (I)V
-  #203 = Utf8               getAction
-  #204 = Utf8               getActionMasked
-  #205 = Utf8               getActionIndex
-  #206 = Utf8               getFlags
-  #207 = Utf8               getDownTime
-  #208 = Utf8               ()J
-  #209 = Utf8               getEventTime
-  #210 = Utf8               getX
-  #211 = Utf8               ()F
-  #212 = Utf8               getY
-  #213 = Utf8               getPressure
-  #214 = Utf8               getSize
-  #215 = Utf8               getTouchMajor
-  #216 = Utf8               getTouchMinor
-  #217 = Utf8               getToolMajor
-  #218 = Utf8               getToolMinor
-  #219 = Utf8               getOrientation
-  #220 = Utf8               getAxisValue
-  #221 = Utf8               (I)F
-  #222 = Utf8               axis
-  #223 = Utf8               getPointerCount
-  #224 = Utf8               getPointerId
-  #225 = Utf8               (I)I
-  #226 = Utf8               pointerIndex
-  #227 = Utf8               getToolType
-  #228 = Utf8               findPointerIndex
-  #229 = Utf8               pointerId
-  #230 = Utf8               (II)F
-  #231 = Utf8               getPointerCoords
-  #232 = Utf8               (ILandroid/view/MotionEvent$PointerCoords;)V
-  #233 = Utf8               outPointerCoords
-  #234 = Utf8               Landroid/view/MotionEvent$PointerCoords;
-  #235 = Utf8               getPointerProperties
-  #236 = Utf8               (ILandroid/view/MotionEvent$PointerProperties;)V
-  #237 = Utf8               outPointerProperties
-  #238 = Utf8               Landroid/view/MotionEvent$PointerProperties;
-  #239 = Utf8               getMetaState
-  #240 = Utf8               getButtonState
-  #241 = Utf8               getRawX
-  #242 = Utf8               getRawY
-  #243 = Utf8               getXPrecision
-  #244 = Utf8               getYPrecision
-  #245 = Utf8               getHistorySize
-  #246 = Utf8               getHistoricalEventTime
-  #247 = Utf8               (I)J
-  #248 = Utf8               pos
-  #249 = Utf8               getHistoricalX
-  #250 = Utf8               getHistoricalY
-  #251 = Utf8               getHistoricalPressure
-  #252 = Utf8               getHistoricalSize
-  #253 = Utf8               getHistoricalTouchMajor
-  #254 = Utf8               getHistoricalTouchMinor
-  #255 = Utf8               getHistoricalToolMajor
-  #256 = Utf8               getHistoricalToolMinor
-  #257 = Utf8               getHistoricalOrientation
-  #258 = Utf8               getHistoricalAxisValue
-  #259 = Utf8               (III)F
-  #260 = Utf8               getHistoricalPointerCoords
-  #261 = Utf8               (IILandroid/view/MotionEvent$PointerCoords;)V
-  #262 = Utf8               getEdgeFlags
-  #263 = Utf8               setEdgeFlags
-  #264 = Utf8               setAction
-  #265 = Utf8               offsetLocation
-  #266 = Utf8               (FF)V
-  #267 = Utf8               deltaX
-  #268 = Utf8               deltaY
-  #269 = Utf8               setLocation
-  #270 = Utf8               transform
-  #271 = Utf8               (Landroid/graphics/Matrix;)V
-  #272 = Utf8               matrix
-  #273 = Utf8               Landroid/graphics/Matrix;
-  #274 = Utf8               addBatch
-  #275 = Utf8               (JFFFFI)V
-  #276 = Utf8               (J[Landroid/view/MotionEvent$PointerCoords;I)V
-  #277 = Utf8               toString
-  #278 = Utf8               ()Ljava/lang/String;
-  #279 = Utf8               actionToString
-  #280 = Utf8               (I)Ljava/lang/String;
-  #281 = Utf8               axisToString
-  #282 = Utf8               axisFromString
-  #283 = Utf8               (Ljava/lang/String;)I
-  #284 = Utf8               symbolicName
-  #285 = Utf8               Ljava/lang/String;
-  #286 = Utf8               writeToParcel
-  #287 = Utf8               (Landroid/os/Parcel;I)V
-  #288 = Utf8               out
-  #289 = Utf8               Landroid/os/Parcel;
-  #290 = Utf8               <clinit>
-  #291 = Utf8               SourceFile
-  #292 = Utf8               MotionEvent.java
-  #293 = NameAndType        #154:#155     //  "<init>":()V
-  #294 = Utf8               java/lang/RuntimeException
-  #295 = Utf8               Stub!
-  #296 = NameAndType        #154:#305     //  "<init>":(Ljava/lang/String;)V
-  #297 = NameAndType        #148:#151     //  CREATOR:Landroid/os/Parcelable$Creator;
-  #298 = Utf8               android/view/MotionEvent
-  #299 = Utf8               android/view/InputEvent
-  #300 = Utf8               android/os/Parcelable
-  #301 = Utf8               android/view/MotionEvent$PointerProperties
-  #302 = Utf8               android/view/MotionEvent$PointerCoords
-  #303 = Utf8               android/os/Parcelable$Creator
-  #304 = Utf8               java/lang/Throwable
-  #305 = Utf8               (Ljava/lang/String;)V
-{
-  public static final int INVALID_POINTER_ID;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int -1
-
-
-  public static final int ACTION_MASK;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 255
-
-
-  public static final int ACTION_DOWN;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 0
-
-
-  public static final int ACTION_UP;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 1
-
-
-  public static final int ACTION_MOVE;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 2
-
-
-  public static final int ACTION_CANCEL;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 3
-
-
-  public static final int ACTION_OUTSIDE;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 4
-
-
-  public static final int ACTION_POINTER_DOWN;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 5
-
-
-  public static final int ACTION_POINTER_UP;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 6
-
-
-  public static final int ACTION_HOVER_MOVE;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 7
-
-
-  public static final int ACTION_SCROLL;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 8
-
-
-  public static final int ACTION_HOVER_ENTER;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 9
-
-
-  public static final int ACTION_HOVER_EXIT;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 10
-
-
-  public static final int ACTION_POINTER_INDEX_MASK;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 65280
-
-
-  public static final int ACTION_POINTER_INDEX_SHIFT;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 8
-
-
-  public static final int ACTION_POINTER_1_DOWN;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 5
-    Deprecated: true
-    RuntimeVisibleAnnotations:
-      0: #48()
-
-
-  public static final int ACTION_POINTER_2_DOWN;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 261
-    Deprecated: true
-    RuntimeVisibleAnnotations:
-      0: #48()
-
-
-  public static final int ACTION_POINTER_3_DOWN;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 517
-    Deprecated: true
-    RuntimeVisibleAnnotations:
-      0: #48()
-
-
-  public static final int ACTION_POINTER_1_UP;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 6
-    Deprecated: true
-    RuntimeVisibleAnnotations:
-      0: #48()
-
-
-  public static final int ACTION_POINTER_2_UP;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 262
-    Deprecated: true
-    RuntimeVisibleAnnotations:
-      0: #48()
-
-
-  public static final int ACTION_POINTER_3_UP;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 518
-    Deprecated: true
-    RuntimeVisibleAnnotations:
-      0: #48()
-
-
-  public static final int ACTION_POINTER_ID_MASK;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 65280
-    Deprecated: true
-    RuntimeVisibleAnnotations:
-      0: #48()
-
-
-  public static final int ACTION_POINTER_ID_SHIFT;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 8
-    Deprecated: true
-    RuntimeVisibleAnnotations:
-      0: #48()
-
-
-  public static final int FLAG_WINDOW_IS_OBSCURED;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 1
-
-
-  public static final int EDGE_TOP;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 1
-
-
-  public static final int EDGE_BOTTOM;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 2
-
-
-  public static final int EDGE_LEFT;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 4
-
-
-  public static final int EDGE_RIGHT;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 8
-
-
-  public static final int AXIS_X;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 0
-
-
-  public static final int AXIS_Y;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 1
-
-
-  public static final int AXIS_PRESSURE;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 2
-
-
-  public static final int AXIS_SIZE;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 3
-
-
-  public static final int AXIS_TOUCH_MAJOR;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 4
-
-
-  public static final int AXIS_TOUCH_MINOR;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 5
-
-
-  public static final int AXIS_TOOL_MAJOR;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 6
-
-
-  public static final int AXIS_TOOL_MINOR;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 7
-
-
-  public static final int AXIS_ORIENTATION;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 8
-
-
-  public static final int AXIS_VSCROLL;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 9
-
-
-  public static final int AXIS_HSCROLL;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 10
-
-
-  public static final int AXIS_Z;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 11
-
-
-  public static final int AXIS_RX;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 12
-
-
-  public static final int AXIS_RY;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 13
-
-
-  public static final int AXIS_RZ;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 14
-
-
-  public static final int AXIS_HAT_X;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 15
-
-
-  public static final int AXIS_HAT_Y;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 16
-
-
-  public static final int AXIS_LTRIGGER;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 17
-
-
-  public static final int AXIS_RTRIGGER;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 18
-
-
-  public static final int AXIS_THROTTLE;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 19
-
-
-  public static final int AXIS_RUDDER;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 20
-
-
-  public static final int AXIS_WHEEL;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 21
-
-
-  public static final int AXIS_GAS;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 22
-
-
-  public static final int AXIS_BRAKE;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 23
-
-
-  public static final int AXIS_DISTANCE;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 24
-
-
-  public static final int AXIS_TILT;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 25
-
-
-  public static final int AXIS_GENERIC_1;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 32
-
-
-  public static final int AXIS_GENERIC_2;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 33
-
-
-  public static final int AXIS_GENERIC_3;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 34
-
-
-  public static final int AXIS_GENERIC_4;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 35
-
-
-  public static final int AXIS_GENERIC_5;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 36
-
-
-  public static final int AXIS_GENERIC_6;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 37
-
-
-  public static final int AXIS_GENERIC_7;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 38
-
-
-  public static final int AXIS_GENERIC_8;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 39
-
-
-  public static final int AXIS_GENERIC_9;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 40
-
-
-  public static final int AXIS_GENERIC_10;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 41
-
-
-  public static final int AXIS_GENERIC_11;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 42
-
-
-  public static final int AXIS_GENERIC_12;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 43
-
-
-  public static final int AXIS_GENERIC_13;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 44
-
-
-  public static final int AXIS_GENERIC_14;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 45
-
-
-  public static final int AXIS_GENERIC_15;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 46
-
-
-  public static final int AXIS_GENERIC_16;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 47
-
-
-  public static final int BUTTON_PRIMARY;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 1
-
-
-  public static final int BUTTON_SECONDARY;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 2
-
-
-  public static final int BUTTON_TERTIARY;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 4
-
-
-  public static final int BUTTON_BACK;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 8
-
-
-  public static final int BUTTON_FORWARD;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 16
-
-
-  public static final int TOOL_TYPE_UNKNOWN;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 0
-
-
-  public static final int TOOL_TYPE_FINGER;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 1
-
-
-  public static final int TOOL_TYPE_STYLUS;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 2
-
-
-  public static final int TOOL_TYPE_MOUSE;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 3
-
-
-  public static final int TOOL_TYPE_ERASER;
-    Signature: I
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    ConstantValue: int 4
-
-
-  public static final android.os.Parcelable$Creator<android.view.MotionEvent> CREATOR;
-    Signature: Landroid/os/Parcelable$Creator;
-    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
-    Signature: #153                         // Landroid/os/Parcelable$Creator<Landroid/view/MotionEvent;>;
-
-
-  android.view.MotionEvent();
-    Signature: ()V
-    flags:
-    Code:
-      stack=3, locals=1, args_size=1
-         0: aload_0
-         1: invokespecial #1                  // Method android/view/InputEvent."<init>":()V
-         4: new           #2                  // class java/lang/RuntimeException
-         7: dup
-         8: ldc           #3                  // String Stub!
-        10: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-        13: athrow
-      LineNumberTable:
-        line 35: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      14     0  this   Landroid/view/MotionEvent;
-
-  protected void finalize() throws java.lang.Throwable;
-    Signature: ()V
-    flags: ACC_PROTECTED
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 36: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-    Exceptions:
-      throws java.lang.Throwable
-
-  public static android.view.MotionEvent obtain(long, long, int, int, android.view.MotionEvent$PointerProperties[], android.view.MotionEvent$PointerCoords[], int, int, float, float, int, int, int, int);
-    Signature: (JJII[Landroid/view/MotionEvent$PointerProperties;[Landroid/view/MotionEvent$PointerCoords;IIFFIIII)Landroid/view/MotionEvent;
-    flags: ACC_PUBLIC, ACC_STATIC
-    Code:
-      stack=3, locals=16, args_size=14
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 37: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0 downTime   J
-               0      10     2 eventTime   J
-               0      10     4 action   I
-               0      10     5 pointerCount   I
-               0      10     6 pointerProperties   [Landroid/view/MotionEvent$PointerProperties;
-               0      10     7 pointerCoords   [Landroid/view/MotionEvent$PointerCoords;
-               0      10     8 metaState   I
-               0      10     9 buttonState   I
-               0      10    10 xPrecision   F
-               0      10    11 yPrecision   F
-               0      10    12 deviceId   I
-               0      10    13 edgeFlags   I
-               0      10    14 source   I
-               0      10    15 flags   I
-
-  public static android.view.MotionEvent obtain(long, long, int, int, int[], android.view.MotionEvent$PointerCoords[], int, float, float, int, int, int, int);
-    Signature: (JJII[I[Landroid/view/MotionEvent$PointerCoords;IFFIIII)Landroid/view/MotionEvent;
-    flags: ACC_PUBLIC, ACC_STATIC
-    Code:
-      stack=3, locals=15, args_size=13
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 39: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0 downTime   J
-               0      10     2 eventTime   J
-               0      10     4 action   I
-               0      10     5 pointerCount   I
-               0      10     6 pointerIds   [I
-               0      10     7 pointerCoords   [Landroid/view/MotionEvent$PointerCoords;
-               0      10     8 metaState   I
-               0      10     9 xPrecision   F
-               0      10    10 yPrecision   F
-               0      10    11 deviceId   I
-               0      10    12 edgeFlags   I
-               0      10    13 source   I
-               0      10    14 flags   I
-    Deprecated: true
-    RuntimeVisibleAnnotations:
-      0: #48()
-
-  public static android.view.MotionEvent obtain(long, long, int, float, float, float, float, int, float, float, int, int);
-    Signature: (JJIFFFFIFFII)Landroid/view/MotionEvent;
-    flags: ACC_PUBLIC, ACC_STATIC
-    Code:
-      stack=3, locals=14, args_size=12
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 40: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0 downTime   J
-               0      10     2 eventTime   J
-               0      10     4 action   I
-               0      10     5     x   F
-               0      10     6     y   F
-               0      10     7 pressure   F
-               0      10     8  size   F
-               0      10     9 metaState   I
-               0      10    10 xPrecision   F
-               0      10    11 yPrecision   F
-               0      10    12 deviceId   I
-               0      10    13 edgeFlags   I
-
-  public static android.view.MotionEvent obtain(long, long, int, int, float, float, float, float, int, float, float, int, int);
-    Signature: (JJIIFFFFIFFII)Landroid/view/MotionEvent;
-    flags: ACC_PUBLIC, ACC_STATIC
-    Code:
-      stack=3, locals=15, args_size=13
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 42: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0 downTime   J
-               0      10     2 eventTime   J
-               0      10     4 action   I
-               0      10     5 pointerCount   I
-               0      10     6     x   F
-               0      10     7     y   F
-               0      10     8 pressure   F
-               0      10     9  size   F
-               0      10    10 metaState   I
-               0      10    11 xPrecision   F
-               0      10    12 yPrecision   F
-               0      10    13 deviceId   I
-               0      10    14 edgeFlags   I
-    Deprecated: true
-    RuntimeVisibleAnnotations:
-      0: #48()
-
-  public static android.view.MotionEvent obtain(long, long, int, float, float, int);
-    Signature: (JJIFFI)Landroid/view/MotionEvent;
-    flags: ACC_PUBLIC, ACC_STATIC
-    Code:
-      stack=3, locals=8, args_size=6
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 43: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0 downTime   J
-               0      10     2 eventTime   J
-               0      10     4 action   I
-               0      10     5     x   F
-               0      10     6     y   F
-               0      10     7 metaState   I
-
-  public static android.view.MotionEvent obtain(android.view.MotionEvent);
-    Signature: (Landroid/view/MotionEvent;)Landroid/view/MotionEvent;
-    flags: ACC_PUBLIC, ACC_STATIC
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 44: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0 other   Landroid/view/MotionEvent;
-
-  public static android.view.MotionEvent obtainNoHistory(android.view.MotionEvent);
-    Signature: (Landroid/view/MotionEvent;)Landroid/view/MotionEvent;
-    flags: ACC_PUBLIC, ACC_STATIC
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 45: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0 other   Landroid/view/MotionEvent;
-
-  public final void recycle();
-    Signature: ()V
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 46: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final int getDeviceId();
-    Signature: ()I
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 47: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final int getSource();
-    Signature: ()I
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 48: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final void setSource(int);
-    Signature: (I)V
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 49: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 source   I
-
-  public final int getAction();
-    Signature: ()I
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 50: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final int getActionMasked();
-    Signature: ()I
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 51: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final int getActionIndex();
-    Signature: ()I
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 52: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final int getFlags();
-    Signature: ()I
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 53: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final long getDownTime();
-    Signature: ()J
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 54: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final long getEventTime();
-    Signature: ()J
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 55: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final float getX();
-    Signature: ()F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 56: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final float getY();
-    Signature: ()F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 57: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final float getPressure();
-    Signature: ()F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 58: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final float getSize();
-    Signature: ()F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 59: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final float getTouchMajor();
-    Signature: ()F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 60: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final float getTouchMinor();
-    Signature: ()F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 61: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final float getToolMajor();
-    Signature: ()F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 62: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final float getToolMinor();
-    Signature: ()F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 63: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final float getOrientation();
-    Signature: ()F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 64: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final float getAxisValue(int);
-    Signature: (I)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 65: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1  axis   I
-
-  public final int getPointerCount();
-    Signature: ()I
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 66: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final int getPointerId(int);
-    Signature: (I)I
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 67: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-
-  public final int getToolType(int);
-    Signature: (I)I
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 68: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-
-  public final int findPointerIndex(int);
-    Signature: (I)I
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 69: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerId   I
-
-  public final float getX(int);
-    Signature: (I)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 70: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-
-  public final float getY(int);
-    Signature: (I)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 71: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-
-  public final float getPressure(int);
-    Signature: (I)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 72: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-
-  public final float getSize(int);
-    Signature: (I)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 73: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-
-  public final float getTouchMajor(int);
-    Signature: (I)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 74: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-
-  public final float getTouchMinor(int);
-    Signature: (I)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 75: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-
-  public final float getToolMajor(int);
-    Signature: (I)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 76: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-
-  public final float getToolMinor(int);
-    Signature: (I)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 77: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-
-  public final float getOrientation(int);
-    Signature: (I)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 78: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-
-  public final float getAxisValue(int, int);
-    Signature: (II)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=3, args_size=3
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 79: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1  axis   I
-               0      10     2 pointerIndex   I
-
-  public final void getPointerCoords(int, android.view.MotionEvent$PointerCoords);
-    Signature: (ILandroid/view/MotionEvent$PointerCoords;)V
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=3, args_size=3
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 80: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-               0      10     2 outPointerCoords   Landroid/view/MotionEvent$PointerCoords;
-
-  public final void getPointerProperties(int, android.view.MotionEvent$PointerProperties);
-    Signature: (ILandroid/view/MotionEvent$PointerProperties;)V
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=3, args_size=3
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 81: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-               0      10     2 outPointerProperties   Landroid/view/MotionEvent$PointerProperties;
-
-  public final int getMetaState();
-    Signature: ()I
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 82: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final int getButtonState();
-    Signature: ()I
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 83: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final float getRawX();
-    Signature: ()F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 84: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final float getRawY();
-    Signature: ()F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 85: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final float getXPrecision();
-    Signature: ()F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 86: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final float getYPrecision();
-    Signature: ()F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 87: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final int getHistorySize();
-    Signature: ()I
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 88: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final long getHistoricalEventTime(int);
-    Signature: (I)J
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 89: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1   pos   I
-
-  public final float getHistoricalX(int);
-    Signature: (I)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 90: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1   pos   I
-
-  public final float getHistoricalY(int);
-    Signature: (I)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 91: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1   pos   I
-
-  public final float getHistoricalPressure(int);
-    Signature: (I)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 92: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1   pos   I
-
-  public final float getHistoricalSize(int);
-    Signature: (I)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 93: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1   pos   I
-
-  public final float getHistoricalTouchMajor(int);
-    Signature: (I)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 94: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1   pos   I
-
-  public final float getHistoricalTouchMinor(int);
-    Signature: (I)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 95: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1   pos   I
-
-  public final float getHistoricalToolMajor(int);
-    Signature: (I)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 96: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1   pos   I
-
-  public final float getHistoricalToolMinor(int);
-    Signature: (I)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 97: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1   pos   I
-
-  public final float getHistoricalOrientation(int);
-    Signature: (I)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 98: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1   pos   I
-
-  public final float getHistoricalAxisValue(int, int);
-    Signature: (II)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=3, args_size=3
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 99: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1  axis   I
-               0      10     2   pos   I
-
-  public final float getHistoricalX(int, int);
-    Signature: (II)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=3, args_size=3
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 100: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-               0      10     2   pos   I
-
-  public final float getHistoricalY(int, int);
-    Signature: (II)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=3, args_size=3
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 101: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-               0      10     2   pos   I
-
-  public final float getHistoricalPressure(int, int);
-    Signature: (II)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=3, args_size=3
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 102: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-               0      10     2   pos   I
-
-  public final float getHistoricalSize(int, int);
-    Signature: (II)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=3, args_size=3
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 103: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-               0      10     2   pos   I
-
-  public final float getHistoricalTouchMajor(int, int);
-    Signature: (II)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=3, args_size=3
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 104: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-               0      10     2   pos   I
-
-  public final float getHistoricalTouchMinor(int, int);
-    Signature: (II)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=3, args_size=3
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 105: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-               0      10     2   pos   I
-
-  public final float getHistoricalToolMajor(int, int);
-    Signature: (II)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=3, args_size=3
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 106: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-               0      10     2   pos   I
-
-  public final float getHistoricalToolMinor(int, int);
-    Signature: (II)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=3, args_size=3
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 107: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-               0      10     2   pos   I
-
-  public final float getHistoricalOrientation(int, int);
-    Signature: (II)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=3, args_size=3
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 108: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-               0      10     2   pos   I
-
-  public final float getHistoricalAxisValue(int, int, int);
-    Signature: (III)F
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=4, args_size=4
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 109: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1  axis   I
-               0      10     2 pointerIndex   I
-               0      10     3   pos   I
-
-  public final void getHistoricalPointerCoords(int, int, android.view.MotionEvent$PointerCoords);
-    Signature: (IILandroid/view/MotionEvent$PointerCoords;)V
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=4, args_size=4
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 110: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 pointerIndex   I
-               0      10     2   pos   I
-               0      10     3 outPointerCoords   Landroid/view/MotionEvent$PointerCoords;
-
-  public final int getEdgeFlags();
-    Signature: ()I
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 111: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public final void setEdgeFlags(int);
-    Signature: (I)V
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 112: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 flags   I
-
-  public final void setAction(int);
-    Signature: (I)V
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 113: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 action   I
-
-  public final void offsetLocation(float, float);
-    Signature: (FF)V
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=3, args_size=3
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 114: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 deltaX   F
-               0      10     2 deltaY   F
-
-  public final void setLocation(float, float);
-    Signature: (FF)V
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=3, args_size=3
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 115: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1     x   F
-               0      10     2     y   F
-
-  public final void transform(android.graphics.Matrix);
-    Signature: (Landroid/graphics/Matrix;)V
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=2, args_size=2
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 116: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 matrix   Landroid/graphics/Matrix;
-
-  public final void addBatch(long, float, float, float, float, int);
-    Signature: (JFFFFI)V
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=8, args_size=7
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 117: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 eventTime   J
-               0      10     3     x   F
-               0      10     4     y   F
-               0      10     5 pressure   F
-               0      10     6  size   F
-               0      10     7 metaState   I
-
-  public final void addBatch(long, android.view.MotionEvent$PointerCoords[], int);
-    Signature: (J[Landroid/view/MotionEvent$PointerCoords;I)V
-    flags: ACC_PUBLIC, ACC_FINAL
-    Code:
-      stack=3, locals=5, args_size=4
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 118: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1 eventTime   J
-               0      10     3 pointerCoords   [Landroid/view/MotionEvent$PointerCoords;
-               0      10     4 metaState   I
-
-  public java.lang.String toString();
-    Signature: ()Ljava/lang/String;
-    flags: ACC_PUBLIC
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 119: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-
-  public static java.lang.String actionToString(int);
-    Signature: (I)Ljava/lang/String;
-    flags: ACC_PUBLIC, ACC_STATIC
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 120: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0 action   I
-
-  public static java.lang.String axisToString(int);
-    Signature: (I)Ljava/lang/String;
-    flags: ACC_PUBLIC, ACC_STATIC
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 121: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  axis   I
-
-  public static int axisFromString(java.lang.String);
-    Signature: (Ljava/lang/String;)I
-    flags: ACC_PUBLIC, ACC_STATIC
-    Code:
-      stack=3, locals=1, args_size=1
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 122: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0 symbolicName   Ljava/lang/String;
-
-  public void writeToParcel(android.os.Parcel, int);
-    Signature: (Landroid/os/Parcel;I)V
-    flags: ACC_PUBLIC
-    Code:
-      stack=3, locals=3, args_size=3
-         0: new           #2                  // class java/lang/RuntimeException
-         3: dup
-         4: ldc           #3                  // String Stub!
-         6: invokespecial #4                  // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
-         9: athrow
-      LineNumberTable:
-        line 123: 0
-      LocalVariableTable:
-        Start  Length  Slot  Name   Signature
-               0      10     0  this   Landroid/view/MotionEvent;
-               0      10     1   out   Landroid/os/Parcel;
-               0      10     2 flags   I
-
-  static {};
-    Signature: ()V
-    flags: ACC_STATIC
-    Code:
-      stack=1, locals=0, args_size=0
-         0: aconst_null
-         1: putstatic     #5                  // Field CREATOR:Landroid/os/Parcelable$Creator;
-         4: return
-      LineNumberTable:
-        line 213: 0
-}
diff --git a/base/android/jni_generator/testMultipleJNIAdditionalImport.golden b/base/android/jni_generator/testMultipleJNIAdditionalImport.golden
deleted file mode 100644
index 0eecb5a..0000000
--- a/base/android/jni_generator/testMultipleJNIAdditionalImport.golden
+++ /dev/null
@@ -1,95 +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.
-
-// This file is autogenerated by
-//     base/android/jni_generator/jni_generator.py
-// For
-//     org/chromium/foo/Foo
-
-#ifndef org_chromium_foo_Foo_JNI
-#define org_chromium_foo_Foo_JNI
-
-#include <jni.h>
-
-#include "base/android/jni_generator/jni_generator_helper.h"
-
-#include "base/android/jni_int_wrapper.h"
-
-// Step 1: forward declarations.
-namespace {
-const char kFooClassPath[] = "org/chromium/foo/Foo";
-// Leaking this jclass as we cannot use LazyInstance from some threads.
-base::subtle::AtomicWord g_Foo_clazz __attribute__((unused)) = 0;
-#define Foo_clazz(env) base::android::LazyGetClass(env, kFooClassPath, &g_Foo_clazz)
-
-}  // namespace
-
-// Step 2: method stubs.
-
-static void DoSomething(JNIEnv* env, const base::android::JavaParamRef<jclass>&
-    jcaller,
-    const base::android::JavaParamRef<jobject>& callback1,
-    const base::android::JavaParamRef<jobject>& callback2);
-
-JNI_GENERATOR_EXPORT void Java_org_chromium_foo_Foo_nativeDoSomething(JNIEnv*
-    env, jclass jcaller,
-    jobject callback1,
-    jobject callback2) {
-  return DoSomething(env, base::android::JavaParamRef<jclass>(env, jcaller),
-      base::android::JavaParamRef<jobject>(env, callback1),
-      base::android::JavaParamRef<jobject>(env, callback2));
-}
-
-static base::subtle::AtomicWord g_Foo_calledByNative = 0;
-static void Java_Foo_calledByNative(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& callback1,
-    const base::android::JavaRefOrBare<jobject>& callback2) {
-  CHECK_CLAZZ(env, Foo_clazz(env),
-      Foo_clazz(env));
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_STATIC>(
-      env, Foo_clazz(env),
-      "calledByNative",
-"("
-"Lorg/chromium/foo/Bar1$Callback;"
-"Lorg/chromium/foo/Bar2$Callback;"
-")"
-"V",
-      &g_Foo_calledByNative);
-
-     env->CallStaticVoidMethod(Foo_clazz(env),
-          method_id, callback1.obj(), callback2.obj());
-  jni_generator::CheckException(env);
-}
-
-// Step 3: RegisterNatives.
-
-static const JNINativeMethod kMethodsFoo[] = {
-    { "nativeDoSomething",
-"("
-"Lorg/chromium/foo/Bar1$Callback;"
-"Lorg/chromium/foo/Bar2$Callback;"
-")"
-"V", reinterpret_cast<void*>(Java_org_chromium_foo_Foo_nativeDoSomething) },
-};
-
-static bool RegisterNativesImpl(JNIEnv* env) {
-  if (jni_generator::ShouldSkipJniRegistration(false))
-    return true;
-
-  const int kMethodsFooSize = arraysize(kMethodsFoo);
-
-  if (env->RegisterNatives(Foo_clazz(env),
-                           kMethodsFoo,
-                           kMethodsFooSize) < 0) {
-    jni_generator::HandleRegistrationError(
-        env, Foo_clazz(env), __FILE__);
-    return false;
-  }
-
-  return true;
-}
-
-#endif  // org_chromium_foo_Foo_JNI
diff --git a/base/android/jni_generator/testNatives.golden b/base/android/jni_generator/testNatives.golden
deleted file mode 100644
index 3362c92..0000000
--- a/base/android/jni_generator/testNatives.golden
+++ /dev/null
@@ -1,340 +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.
-
-// This file is autogenerated by
-//     base/android/jni_generator/jni_generator.py
-// For
-//     org/chromium/TestJni
-
-#ifndef org_chromium_TestJni_JNI
-#define org_chromium_TestJni_JNI
-
-#include <jni.h>
-
-#include "base/android/jni_generator/jni_generator_helper.h"
-
-#include "base/android/jni_int_wrapper.h"
-
-// Step 1: forward declarations.
-namespace {
-const char kTestJniClassPath[] = "org/chromium/TestJni";
-// Leaking this jclass as we cannot use LazyInstance from some threads.
-base::subtle::AtomicWord g_TestJni_clazz __attribute__((unused)) = 0;
-#define TestJni_clazz(env) base::android::LazyGetClass(env, kTestJniClassPath, &g_TestJni_clazz)
-
-}  // namespace
-
-// Step 2: method stubs.
-
-static jint Init(JNIEnv* env, const base::android::JavaParamRef<jobject>&
-    jcaller);
-
-JNI_GENERATOR_EXPORT jint Java_org_chromium_TestJni_nativeInit(JNIEnv* env,
-    jobject jcaller) {
-  return Init(env, base::android::JavaParamRef<jobject>(env, jcaller));
-}
-
-JNI_GENERATOR_EXPORT void Java_org_chromium_TestJni_nativeDestroy(JNIEnv* env,
-    jobject jcaller,
-    jint nativeChromeBrowserProvider) {
-  ChromeBrowserProvider* native =
-      reinterpret_cast<ChromeBrowserProvider*>(nativeChromeBrowserProvider);
-  CHECK_NATIVE_PTR(env, jcaller, native, "Destroy");
-  return native->Destroy(env, base::android::JavaParamRef<jobject>(env,
-      jcaller));
-}
-
-JNI_GENERATOR_EXPORT jlong Java_org_chromium_TestJni_nativeAddBookmark(JNIEnv*
-    env, jobject jcaller,
-    jint nativeChromeBrowserProvider,
-    jstring url,
-    jstring title,
-    jboolean isFolder,
-    jlong parentId) {
-  ChromeBrowserProvider* native =
-      reinterpret_cast<ChromeBrowserProvider*>(nativeChromeBrowserProvider);
-  CHECK_NATIVE_PTR(env, jcaller, native, "AddBookmark", 0);
-  return native->AddBookmark(env, base::android::JavaParamRef<jobject>(env,
-      jcaller), base::android::JavaParamRef<jstring>(env, url),
-      base::android::JavaParamRef<jstring>(env, title), isFolder, parentId);
-}
-
-static base::android::ScopedJavaLocalRef<jstring> GetDomainAndRegistry(JNIEnv*
-    env, const base::android::JavaParamRef<jclass>& jcaller,
-    const base::android::JavaParamRef<jstring>& url);
-
-JNI_GENERATOR_EXPORT jstring
-    Java_org_chromium_TestJni_nativeGetDomainAndRegistry(JNIEnv* env, jclass
-    jcaller,
-    jstring url) {
-  return GetDomainAndRegistry(env, base::android::JavaParamRef<jclass>(env,
-      jcaller), base::android::JavaParamRef<jstring>(env, url)).Release();
-}
-
-static void CreateHistoricalTabFromState(JNIEnv* env, const
-    base::android::JavaParamRef<jclass>& jcaller,
-    const base::android::JavaParamRef<jbyteArray>& state,
-    jint tab_index);
-
-JNI_GENERATOR_EXPORT void
-    Java_org_chromium_TestJni_nativeCreateHistoricalTabFromState(JNIEnv* env,
-    jclass jcaller,
-    jbyteArray state,
-    jint tab_index) {
-  return CreateHistoricalTabFromState(env,
-      base::android::JavaParamRef<jclass>(env, jcaller),
-      base::android::JavaParamRef<jbyteArray>(env, state), tab_index);
-}
-
-static base::android::ScopedJavaLocalRef<jbyteArray> GetStateAsByteArray(JNIEnv*
-    env, const base::android::JavaParamRef<jobject>& jcaller,
-    const base::android::JavaParamRef<jobject>& view);
-
-JNI_GENERATOR_EXPORT jbyteArray
-    Java_org_chromium_TestJni_nativeGetStateAsByteArray(JNIEnv* env, jobject
-    jcaller,
-    jobject view) {
-  return GetStateAsByteArray(env, base::android::JavaParamRef<jobject>(env,
-      jcaller), base::android::JavaParamRef<jobject>(env, view)).Release();
-}
-
-static base::android::ScopedJavaLocalRef<jobjectArray>
-    GetAutofillProfileGUIDs(JNIEnv* env, const
-    base::android::JavaParamRef<jclass>& jcaller);
-
-JNI_GENERATOR_EXPORT jobjectArray
-    Java_org_chromium_TestJni_nativeGetAutofillProfileGUIDs(JNIEnv* env, jclass
-    jcaller) {
-  return GetAutofillProfileGUIDs(env, base::android::JavaParamRef<jclass>(env,
-      jcaller)).Release();
-}
-
-static void SetRecognitionResults(JNIEnv* env, const
-    base::android::JavaParamRef<jobject>& jcaller,
-    jint sessionId,
-    const base::android::JavaParamRef<jobjectArray>& results);
-
-JNI_GENERATOR_EXPORT void
-    Java_org_chromium_TestJni_nativeSetRecognitionResults(JNIEnv* env, jobject
-    jcaller,
-    jint sessionId,
-    jobjectArray results) {
-  return SetRecognitionResults(env, base::android::JavaParamRef<jobject>(env,
-      jcaller), sessionId, base::android::JavaParamRef<jobjectArray>(env,
-      results));
-}
-
-JNI_GENERATOR_EXPORT jlong
-    Java_org_chromium_TestJni_nativeAddBookmarkFromAPI(JNIEnv* env, jobject
-    jcaller,
-    jint nativeChromeBrowserProvider,
-    jstring url,
-    jobject created,
-    jobject isBookmark,
-    jobject date,
-    jbyteArray favicon,
-    jstring title,
-    jobject visits) {
-  ChromeBrowserProvider* native =
-      reinterpret_cast<ChromeBrowserProvider*>(nativeChromeBrowserProvider);
-  CHECK_NATIVE_PTR(env, jcaller, native, "AddBookmarkFromAPI", 0);
-  return native->AddBookmarkFromAPI(env,
-      base::android::JavaParamRef<jobject>(env, jcaller),
-      base::android::JavaParamRef<jstring>(env, url),
-      base::android::JavaParamRef<jobject>(env, created),
-      base::android::JavaParamRef<jobject>(env, isBookmark),
-      base::android::JavaParamRef<jobject>(env, date),
-      base::android::JavaParamRef<jbyteArray>(env, favicon),
-      base::android::JavaParamRef<jstring>(env, title),
-      base::android::JavaParamRef<jobject>(env, visits));
-}
-
-static jint FindAll(JNIEnv* env, const base::android::JavaParamRef<jobject>&
-    jcaller,
-    const base::android::JavaParamRef<jstring>& find);
-
-JNI_GENERATOR_EXPORT jint Java_org_chromium_TestJni_nativeFindAll(JNIEnv* env,
-    jobject jcaller,
-    jstring find) {
-  return FindAll(env, base::android::JavaParamRef<jobject>(env, jcaller),
-      base::android::JavaParamRef<jstring>(env, find));
-}
-
-static base::android::ScopedJavaLocalRef<jobject> GetInnerClass(JNIEnv* env,
-    const base::android::JavaParamRef<jclass>& jcaller);
-
-JNI_GENERATOR_EXPORT jobject
-    Java_org_chromium_TestJni_nativeGetInnerClass(JNIEnv* env, jclass jcaller) {
-  return GetInnerClass(env, base::android::JavaParamRef<jclass>(env,
-      jcaller)).Release();
-}
-
-JNI_GENERATOR_EXPORT jobject Java_org_chromium_TestJni_nativeQueryBitmap(JNIEnv*
-    env, jobject jcaller,
-    jint nativeChromeBrowserProvider,
-    jobjectArray projection,
-    jstring selection,
-    jobjectArray selectionArgs,
-    jstring sortOrder) {
-  ChromeBrowserProvider* native =
-      reinterpret_cast<ChromeBrowserProvider*>(nativeChromeBrowserProvider);
-  CHECK_NATIVE_PTR(env, jcaller, native, "QueryBitmap", NULL);
-  return native->QueryBitmap(env, base::android::JavaParamRef<jobject>(env,
-      jcaller), base::android::JavaParamRef<jobjectArray>(env, projection),
-      base::android::JavaParamRef<jstring>(env, selection),
-      base::android::JavaParamRef<jobjectArray>(env, selectionArgs),
-      base::android::JavaParamRef<jstring>(env, sortOrder)).Release();
-}
-
-JNI_GENERATOR_EXPORT void Java_org_chromium_TestJni_nativeGotOrientation(JNIEnv*
-    env, jobject jcaller,
-    jint nativeDataFetcherImplAndroid,
-    jdouble alpha,
-    jdouble beta,
-    jdouble gamma) {
-  DataFetcherImplAndroid* native =
-      reinterpret_cast<DataFetcherImplAndroid*>(nativeDataFetcherImplAndroid);
-  CHECK_NATIVE_PTR(env, jcaller, native, "GotOrientation");
-  return native->GotOrientation(env, base::android::JavaParamRef<jobject>(env,
-      jcaller), alpha, beta, gamma);
-}
-
-static base::android::ScopedJavaLocalRef<jthrowable>
-    MessWithJavaException(JNIEnv* env, const
-    base::android::JavaParamRef<jclass>& jcaller,
-    const base::android::JavaParamRef<jthrowable>& e);
-
-JNI_GENERATOR_EXPORT jthrowable
-    Java_org_chromium_TestJni_nativeMessWithJavaException(JNIEnv* env, jclass
-    jcaller,
-    jthrowable e) {
-  return MessWithJavaException(env, base::android::JavaParamRef<jclass>(env,
-      jcaller), base::android::JavaParamRef<jthrowable>(env, e)).Release();
-}
-
-// Step 3: RegisterNatives.
-
-static const JNINativeMethod kMethodsTestJni[] = {
-    { "nativeInit",
-"("
-")"
-"I", reinterpret_cast<void*>(Java_org_chromium_TestJni_nativeInit) },
-    { "nativeDestroy",
-"("
-"I"
-")"
-"V", reinterpret_cast<void*>(Java_org_chromium_TestJni_nativeDestroy) },
-    { "nativeAddBookmark",
-"("
-"I"
-"Ljava/lang/String;"
-"Ljava/lang/String;"
-"Z"
-"J"
-")"
-"J", reinterpret_cast<void*>(Java_org_chromium_TestJni_nativeAddBookmark) },
-    { "nativeGetDomainAndRegistry",
-"("
-"Ljava/lang/String;"
-")"
-"Ljava/lang/String;",
-    reinterpret_cast<void*>(Java_org_chromium_TestJni_nativeGetDomainAndRegistry)
-    },
-    { "nativeCreateHistoricalTabFromState",
-"("
-"[B"
-"I"
-")"
-"V",
-    reinterpret_cast<void*>(Java_org_chromium_TestJni_nativeCreateHistoricalTabFromState)
-    },
-    { "nativeGetStateAsByteArray",
-"("
-"Landroid/view/View;"
-")"
-"[B",
-    reinterpret_cast<void*>(Java_org_chromium_TestJni_nativeGetStateAsByteArray)
-    },
-    { "nativeGetAutofillProfileGUIDs",
-"("
-")"
-"[Ljava/lang/String;",
-    reinterpret_cast<void*>(Java_org_chromium_TestJni_nativeGetAutofillProfileGUIDs)
-    },
-    { "nativeSetRecognitionResults",
-"("
-"I"
-"[Ljava/lang/String;"
-")"
-"V",
-    reinterpret_cast<void*>(Java_org_chromium_TestJni_nativeSetRecognitionResults)
-    },
-    { "nativeAddBookmarkFromAPI",
-"("
-"I"
-"Ljava/lang/String;"
-"Ljava/lang/Long;"
-"Ljava/lang/Boolean;"
-"Ljava/lang/Long;"
-"[B"
-"Ljava/lang/String;"
-"Ljava/lang/Integer;"
-")"
-"J", reinterpret_cast<void*>(Java_org_chromium_TestJni_nativeAddBookmarkFromAPI)
-    },
-    { "nativeFindAll",
-"("
-"Ljava/lang/String;"
-")"
-"I", reinterpret_cast<void*>(Java_org_chromium_TestJni_nativeFindAll) },
-    { "nativeGetInnerClass",
-"("
-")"
-"Lorg/chromium/example/jni_generator/SampleForTests$OnFrameAvailableListener;",
-    reinterpret_cast<void*>(Java_org_chromium_TestJni_nativeGetInnerClass) },
-    { "nativeQueryBitmap",
-"("
-"I"
-"[Ljava/lang/String;"
-"Ljava/lang/String;"
-"[Ljava/lang/String;"
-"Ljava/lang/String;"
-")"
-"Landroid/graphics/Bitmap;",
-    reinterpret_cast<void*>(Java_org_chromium_TestJni_nativeQueryBitmap) },
-    { "nativeGotOrientation",
-"("
-"I"
-"D"
-"D"
-"D"
-")"
-"V", reinterpret_cast<void*>(Java_org_chromium_TestJni_nativeGotOrientation) },
-    { "nativeMessWithJavaException",
-"("
-"Ljava/lang/Throwable;"
-")"
-"Ljava/lang/Throwable;",
-    reinterpret_cast<void*>(Java_org_chromium_TestJni_nativeMessWithJavaException)
-    },
-};
-
-static bool RegisterNativesImpl(JNIEnv* env) {
-  if (jni_generator::ShouldSkipJniRegistration(false))
-    return true;
-
-  const int kMethodsTestJniSize = arraysize(kMethodsTestJni);
-
-  if (env->RegisterNatives(TestJni_clazz(env),
-                           kMethodsTestJni,
-                           kMethodsTestJniSize) < 0) {
-    jni_generator::HandleRegistrationError(
-        env, TestJni_clazz(env), __FILE__);
-    return false;
-  }
-
-  return true;
-}
-
-#endif  // org_chromium_TestJni_JNI
diff --git a/base/android/jni_generator/testNativesLong.golden b/base/android/jni_generator/testNativesLong.golden
deleted file mode 100644
index ec029ce..0000000
--- a/base/android/jni_generator/testNativesLong.golden
+++ /dev/null
@@ -1,66 +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.
-
-// This file is autogenerated by
-//     base/android/jni_generator/jni_generator.py
-// For
-//     org/chromium/TestJni
-
-#ifndef org_chromium_TestJni_JNI
-#define org_chromium_TestJni_JNI
-
-#include <jni.h>
-
-#include "base/android/jni_generator/jni_generator_helper.h"
-
-#include "base/android/jni_int_wrapper.h"
-
-// Step 1: forward declarations.
-namespace {
-const char kTestJniClassPath[] = "org/chromium/TestJni";
-// Leaking this jclass as we cannot use LazyInstance from some threads.
-base::subtle::AtomicWord g_TestJni_clazz __attribute__((unused)) = 0;
-#define TestJni_clazz(env) base::android::LazyGetClass(env, kTestJniClassPath, &g_TestJni_clazz)
-
-}  // namespace
-
-// Step 2: method stubs.
-JNI_GENERATOR_EXPORT void Java_org_chromium_TestJni_nativeDestroy(JNIEnv* env,
-    jobject jcaller,
-    jlong nativeChromeBrowserProvider) {
-  ChromeBrowserProvider* native =
-      reinterpret_cast<ChromeBrowserProvider*>(nativeChromeBrowserProvider);
-  CHECK_NATIVE_PTR(env, jcaller, native, "Destroy");
-  return native->Destroy(env, base::android::JavaParamRef<jobject>(env,
-      jcaller));
-}
-
-// Step 3: RegisterNatives.
-
-static const JNINativeMethod kMethodsTestJni[] = {
-    { "nativeDestroy",
-"("
-"J"
-")"
-"V", reinterpret_cast<void*>(Java_org_chromium_TestJni_nativeDestroy) },
-};
-
-static bool RegisterNativesImpl(JNIEnv* env) {
-  if (jni_generator::ShouldSkipJniRegistration(false))
-    return true;
-
-  const int kMethodsTestJniSize = arraysize(kMethodsTestJni);
-
-  if (env->RegisterNatives(TestJni_clazz(env),
-                           kMethodsTestJni,
-                           kMethodsTestJniSize) < 0) {
-    jni_generator::HandleRegistrationError(
-        env, TestJni_clazz(env), __FILE__);
-    return false;
-  }
-
-  return true;
-}
-
-#endif  // org_chromium_TestJni_JNI
diff --git a/base/android/jni_generator/testSingleJNIAdditionalImport.golden b/base/android/jni_generator/testSingleJNIAdditionalImport.golden
deleted file mode 100644
index ef618da..0000000
--- a/base/android/jni_generator/testSingleJNIAdditionalImport.golden
+++ /dev/null
@@ -1,89 +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.
-
-// This file is autogenerated by
-//     base/android/jni_generator/jni_generator.py
-// For
-//     org/chromium/foo/Foo
-
-#ifndef org_chromium_foo_Foo_JNI
-#define org_chromium_foo_Foo_JNI
-
-#include <jni.h>
-
-#include "base/android/jni_generator/jni_generator_helper.h"
-
-#include "base/android/jni_int_wrapper.h"
-
-// Step 1: forward declarations.
-namespace {
-const char kFooClassPath[] = "org/chromium/foo/Foo";
-// Leaking this jclass as we cannot use LazyInstance from some threads.
-base::subtle::AtomicWord g_Foo_clazz __attribute__((unused)) = 0;
-#define Foo_clazz(env) base::android::LazyGetClass(env, kFooClassPath, &g_Foo_clazz)
-
-}  // namespace
-
-// Step 2: method stubs.
-
-static void DoSomething(JNIEnv* env, const base::android::JavaParamRef<jclass>&
-    jcaller,
-    const base::android::JavaParamRef<jobject>& callback);
-
-JNI_GENERATOR_EXPORT void Java_org_chromium_foo_Foo_nativeDoSomething(JNIEnv*
-    env, jclass jcaller,
-    jobject callback) {
-  return DoSomething(env, base::android::JavaParamRef<jclass>(env, jcaller),
-      base::android::JavaParamRef<jobject>(env, callback));
-}
-
-static base::subtle::AtomicWord g_Foo_calledByNative = 0;
-static void Java_Foo_calledByNative(JNIEnv* env, const
-    base::android::JavaRefOrBare<jobject>& callback) {
-  CHECK_CLAZZ(env, Foo_clazz(env),
-      Foo_clazz(env));
-  jmethodID method_id =
-      base::android::MethodID::LazyGet<
-      base::android::MethodID::TYPE_STATIC>(
-      env, Foo_clazz(env),
-      "calledByNative",
-"("
-"Lorg/chromium/foo/Bar$Callback;"
-")"
-"V",
-      &g_Foo_calledByNative);
-
-     env->CallStaticVoidMethod(Foo_clazz(env),
-          method_id, callback.obj());
-  jni_generator::CheckException(env);
-}
-
-// Step 3: RegisterNatives.
-
-static const JNINativeMethod kMethodsFoo[] = {
-    { "nativeDoSomething",
-"("
-"Lorg/chromium/foo/Bar$Callback;"
-")"
-"V", reinterpret_cast<void*>(Java_org_chromium_foo_Foo_nativeDoSomething) },
-};
-
-static bool RegisterNativesImpl(JNIEnv* env) {
-  if (jni_generator::ShouldSkipJniRegistration(false))
-    return true;
-
-  const int kMethodsFooSize = arraysize(kMethodsFoo);
-
-  if (env->RegisterNatives(Foo_clazz(env),
-                           kMethodsFoo,
-                           kMethodsFooSize) < 0) {
-    jni_generator::HandleRegistrationError(
-        env, Foo_clazz(env), __FILE__);
-    return false;
-  }
-
-  return true;
-}
-
-#endif  // org_chromium_foo_Foo_JNI
diff --git a/base/android/jni_int_wrapper.h b/base/android/jni_int_wrapper.h
deleted file mode 100644
index fa0f3d5..0000000
--- a/base/android/jni_int_wrapper.h
+++ /dev/null
@@ -1,56 +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 BASE_ANDROID_JNI_INT_WRAPPER_H_
-#define BASE_ANDROID_JNI_INT_WRAPPER_H_
-
-// Wrapper used to receive int when calling Java from native.
-// The wrapper disallows automatic conversion of long to int.
-// This is to avoid a common anti-pattern where a Java int is used
-// to receive a native pointer. Please use a Java long to receive
-// native pointers, so that the code works on both 32-bit and 64-bit
-// platforms. Note the wrapper allows other lossy conversions into
-// jint that could be consider anti-patterns, such as from size_t.
-
-// Checking is only done in debugging builds.
-
-#ifdef NDEBUG
-
-typedef jint JniIntWrapper;
-
-// This inline is sufficiently trivial that it does not change the
-// final code generated by g++.
-inline jint as_jint(JniIntWrapper wrapper) {
-  return wrapper;
-}
-
-#else
-
-class JniIntWrapper {
- public:
-  JniIntWrapper() : i_(0) {}
-  JniIntWrapper(int i) : i_(i) {}
-  JniIntWrapper(const JniIntWrapper& ji) : i_(ji.i_) {}
-  template <class T> JniIntWrapper(const T& t) : i_(t) {}
-  jint as_jint() const { return i_; }
- private:
-  // If you get an "is private" error at the line below it is because you used
-  // an implicit conversion to convert a long to an int when calling Java.
-  // We disallow this, as a common anti-pattern allows converting a native
-  // pointer (intptr_t) to a Java int. Please use a Java long to represent
-  // a native pointer. If you want a lossy conversion, please use an
-  // explicit conversion in your C++ code. Note an error is only seen when
-  // compiling on a 64-bit platform, as intptr_t is indistinguishable from
-  // int on 32-bit platforms.
-  JniIntWrapper(long);
-  jint i_;
-};
-
-inline jint as_jint(const JniIntWrapper& wrapper) {
-  return wrapper.as_jint();
-}
-
-#endif  // NDEBUG
-
-#endif  // BASE_ANDROID_JNI_INT_WRAPPER_H_
diff --git a/base/android/jni_string.cc b/base/android/jni_string.cc
deleted file mode 100644
index f28f649..0000000
--- a/base/android/jni_string.cc
+++ /dev/null
@@ -1,121 +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 "base/android/jni_string.h"
-
-#include "base/android/jni_android.h"
-#include "base/logging.h"
-#include "base/strings/utf_string_conversions.h"
-
-namespace {
-
-// Internal version that does not use a scoped local pointer.
-jstring ConvertUTF16ToJavaStringImpl(JNIEnv* env,
-                                     const base::StringPiece16& str) {
-  jstring result = env->NewString(str.data(), str.length());
-  base::android::CheckException(env);
-  return result;
-}
-
-}  // namespace
-
-namespace base {
-namespace android {
-
-void ConvertJavaStringToUTF8(JNIEnv* env, jstring str, std::string* result) {
-  DCHECK(str);
-  if (!str) {
-    LOG(WARNING) << "ConvertJavaStringToUTF8 called with null string.";
-    result->clear();
-    return;
-  }
-  const jsize length = env->GetStringLength(str);
-  if (!length) {
-    result->clear();
-    CheckException(env);
-    return;
-  }
-  // JNI's GetStringUTFChars() returns strings in Java "modified" UTF8, so
-  // instead get the String in UTF16 and convert using chromium's conversion
-  // function that yields plain (non Java-modified) UTF8.
-  const jchar* chars = env->GetStringChars(str, NULL);
-  DCHECK(chars);
-  UTF16ToUTF8(chars, length, result);
-  env->ReleaseStringChars(str, chars);
-  CheckException(env);
-}
-
-std::string ConvertJavaStringToUTF8(JNIEnv* env, jstring str) {
-  std::string result;
-  ConvertJavaStringToUTF8(env, str, &result);
-  return result;
-}
-
-std::string ConvertJavaStringToUTF8(const JavaRef<jstring>& str) {
-  return ConvertJavaStringToUTF8(AttachCurrentThread(), str.obj());
-}
-
-std::string ConvertJavaStringToUTF8(JNIEnv* env, const JavaRef<jstring>& str) {
-  return ConvertJavaStringToUTF8(env, str.obj());
-}
-
-ScopedJavaLocalRef<jstring> ConvertUTF8ToJavaString(
-    JNIEnv* env,
-    const base::StringPiece& str) {
-  // JNI's NewStringUTF expects "modified" UTF8 so instead create the string
-  // via our own UTF16 conversion utility.
-  // Further, Dalvik requires the string passed into NewStringUTF() to come from
-  // a trusted source. We can't guarantee that all UTF8 will be sanitized before
-  // it gets here, so constructing via UTF16 side-steps this issue.
-  // (Dalvik stores strings internally as UTF16 anyway, so there shouldn't be
-  // a significant performance hit by doing it this way).
-  return ScopedJavaLocalRef<jstring>(env, ConvertUTF16ToJavaStringImpl(
-      env, UTF8ToUTF16(str)));
-}
-
-void ConvertJavaStringToUTF16(JNIEnv* env, jstring str, string16* result) {
-  DCHECK(str);
-  if (!str) {
-    LOG(WARNING) << "ConvertJavaStringToUTF16 called with null string.";
-    result->clear();
-    return;
-  }
-  const jsize length = env->GetStringLength(str);
-  if (!length) {
-    result->clear();
-    CheckException(env);
-    return;
-  }
-  const jchar* chars = env->GetStringChars(str, NULL);
-  DCHECK(chars);
-  // GetStringChars isn't required to NULL-terminate the strings
-  // it returns, so the length must be explicitly checked.
-  result->assign(chars, length);
-  env->ReleaseStringChars(str, chars);
-  CheckException(env);
-}
-
-string16 ConvertJavaStringToUTF16(JNIEnv* env, jstring str) {
-  string16 result;
-  ConvertJavaStringToUTF16(env, str, &result);
-  return result;
-}
-
-string16 ConvertJavaStringToUTF16(const JavaRef<jstring>& str) {
-  return ConvertJavaStringToUTF16(AttachCurrentThread(), str.obj());
-}
-
-string16 ConvertJavaStringToUTF16(JNIEnv* env, const JavaRef<jstring>& str) {
-  return ConvertJavaStringToUTF16(env, str.obj());
-}
-
-ScopedJavaLocalRef<jstring> ConvertUTF16ToJavaString(
-    JNIEnv* env,
-    const base::StringPiece16& str) {
-  return ScopedJavaLocalRef<jstring>(env,
-                                     ConvertUTF16ToJavaStringImpl(env, str));
-}
-
-}  // namespace android
-}  // namespace base
diff --git a/base/android/jni_string.h b/base/android/jni_string.h
deleted file mode 100644
index 09e85f3..0000000
--- a/base/android/jni_string.h
+++ /dev/null
@@ -1,49 +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.
-
-#ifndef BASE_ANDROID_JNI_STRING_H_
-#define BASE_ANDROID_JNI_STRING_H_
-
-#include <jni.h>
-#include <string>
-
-#include "base/android/scoped_java_ref.h"
-#include "base/base_export.h"
-#include "base/strings/string_piece.h"
-
-namespace base {
-namespace android {
-
-// Convert a Java string to UTF8. Returns a std string.
-BASE_EXPORT void ConvertJavaStringToUTF8(JNIEnv* env,
-                                         jstring str,
-                                         std::string* result);
-BASE_EXPORT std::string ConvertJavaStringToUTF8(JNIEnv* env, jstring str);
-BASE_EXPORT std::string ConvertJavaStringToUTF8(const JavaRef<jstring>& str);
-BASE_EXPORT std::string ConvertJavaStringToUTF8(JNIEnv* env,
-                                                const JavaRef<jstring>& str);
-
-// Convert a std string to Java string.
-BASE_EXPORT ScopedJavaLocalRef<jstring> ConvertUTF8ToJavaString(
-    JNIEnv* env,
-    const base::StringPiece& str);
-
-// Convert a Java string to UTF16. Returns a string16.
-BASE_EXPORT void ConvertJavaStringToUTF16(JNIEnv* env,
-                                          jstring str,
-                                          string16* result);
-BASE_EXPORT string16 ConvertJavaStringToUTF16(JNIEnv* env, jstring str);
-BASE_EXPORT string16 ConvertJavaStringToUTF16(const JavaRef<jstring>& str);
-BASE_EXPORT string16 ConvertJavaStringToUTF16(JNIEnv* env,
-                                              const JavaRef<jstring>& str);
-
-// Convert a string16 to a Java string.
-BASE_EXPORT ScopedJavaLocalRef<jstring> ConvertUTF16ToJavaString(
-    JNIEnv* env,
-    const base::StringPiece16& str);
-
-}  // namespace android
-}  // namespace base
-
-#endif  // BASE_ANDROID_JNI_STRING_H_
diff --git a/base/android/jni_string_unittest.cc b/base/android/jni_string_unittest.cc
deleted file mode 100644
index 3da8b87..0000000
--- a/base/android/jni_string_unittest.cc
+++ /dev/null
@@ -1,48 +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 "base/android/jni_string.h"
-
-#include "base/android/jni_android.h"
-#include "base/android/scoped_java_ref.h"
-#include "base/strings/utf_string_conversions.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace android {
-
-TEST(JniString, BasicConversionsUTF8) {
-  const std::string kSimpleString = "SimpleTest8";
-  JNIEnv* env = AttachCurrentThread();
-  std::string result =
-      ConvertJavaStringToUTF8(ConvertUTF8ToJavaString(env, kSimpleString));
-  EXPECT_EQ(kSimpleString, result);
-}
-
-TEST(JniString, BasicConversionsUTF16) {
-  const string16 kSimpleString = UTF8ToUTF16("SimpleTest16");
-  JNIEnv* env = AttachCurrentThread();
-  string16 result =
-      ConvertJavaStringToUTF16(ConvertUTF16ToJavaString(env, kSimpleString));
-  EXPECT_EQ(kSimpleString, result);
-}
-
-TEST(JniString, EmptyConversionUTF8) {
-  const std::string kEmptyString = "";
-  JNIEnv* env = AttachCurrentThread();
-  std::string result =
-      ConvertJavaStringToUTF8(ConvertUTF8ToJavaString(env, kEmptyString));
-  EXPECT_EQ(kEmptyString, result);
-}
-
-TEST(JniString, EmptyConversionUTF16) {
-  const string16 kEmptyString = UTF8ToUTF16("");
-  JNIEnv* env = AttachCurrentThread();
-  string16 result =
-      ConvertJavaStringToUTF16(ConvertUTF16ToJavaString(env, kEmptyString));
-  EXPECT_EQ(kEmptyString, result);
-}
-
-}  // namespace android
-}  // namespace base
diff --git a/base/android/scoped_java_ref.cc b/base/android/scoped_java_ref.cc
deleted file mode 100644
index 7d31a75..0000000
--- a/base/android/scoped_java_ref.cc
+++ /dev/null
@@ -1,92 +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 "base/android/scoped_java_ref.h"
-
-#include "base/android/jni_android.h"
-#include "base/logging.h"
-
-namespace base {
-namespace android {
-namespace {
-
-const int kDefaultLocalFrameCapacity = 16;
-
-}  // namespace
-
-ScopedJavaLocalFrame::ScopedJavaLocalFrame(JNIEnv* env) : env_(env) {
-  int failed = env_->PushLocalFrame(kDefaultLocalFrameCapacity);
-  DCHECK(!failed);
-}
-
-ScopedJavaLocalFrame::ScopedJavaLocalFrame(JNIEnv* env, int capacity)
-    : env_(env) {
-  int failed = env_->PushLocalFrame(capacity);
-  DCHECK(!failed);
-}
-
-ScopedJavaLocalFrame::~ScopedJavaLocalFrame() {
-  env_->PopLocalFrame(nullptr);
-}
-
-#if DCHECK_IS_ON()
-// This constructor is inlined when DCHECKs are disabled; don't add anything
-// else here.
-JavaRef<jobject>::JavaRef(JNIEnv* env, jobject obj) : obj_(obj) {
-  if (obj) {
-    DCHECK(env && env->GetObjectRefType(obj) == JNILocalRefType);
-  }
-}
-#endif
-
-JNIEnv* JavaRef<jobject>::SetNewLocalRef(JNIEnv* env, jobject obj) {
-  if (!env) {
-    env = AttachCurrentThread();
-  } else {
-    DCHECK_EQ(env, AttachCurrentThread());  // Is |env| on correct thread.
-  }
-  if (obj)
-    obj = env->NewLocalRef(obj);
-  if (obj_)
-    env->DeleteLocalRef(obj_);
-  obj_ = obj;
-  return env;
-}
-
-void JavaRef<jobject>::SetNewGlobalRef(JNIEnv* env, jobject obj) {
-  if (!env) {
-    env = AttachCurrentThread();
-  } else {
-    DCHECK_EQ(env, AttachCurrentThread());  // Is |env| on correct thread.
-  }
-  if (obj)
-    obj = env->NewGlobalRef(obj);
-  if (obj_)
-    env->DeleteGlobalRef(obj_);
-  obj_ = obj;
-}
-
-void JavaRef<jobject>::ResetLocalRef(JNIEnv* env) {
-  if (obj_) {
-    DCHECK_EQ(env, AttachCurrentThread());  // Is |env| on correct thread.
-    env->DeleteLocalRef(obj_);
-    obj_ = nullptr;
-  }
-}
-
-void JavaRef<jobject>::ResetGlobalRef() {
-  if (obj_) {
-    AttachCurrentThread()->DeleteGlobalRef(obj_);
-    obj_ = nullptr;
-  }
-}
-
-jobject JavaRef<jobject>::ReleaseInternal() {
-  jobject obj = obj_;
-  obj_ = nullptr;
-  return obj;
-}
-
-}  // namespace android
-}  // namespace base
diff --git a/base/android/scoped_java_ref.h b/base/android/scoped_java_ref.h
deleted file mode 100644
index 6d728e9..0000000
--- a/base/android/scoped_java_ref.h
+++ /dev/null
@@ -1,301 +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.
-
-#ifndef BASE_ANDROID_SCOPED_JAVA_REF_H_
-#define BASE_ANDROID_SCOPED_JAVA_REF_H_
-
-#include <jni.h>
-#include <stddef.h>
-
-#include <type_traits>
-#include <utility>
-
-#include "base/base_export.h"
-#include "base/logging.h"
-#include "base/macros.h"
-
-namespace base {
-namespace android {
-
-// Creates a new local reference frame, in which at least a given number of
-// local references can be created. Note that local references already created
-// in previous local frames are still valid in the current local frame.
-class BASE_EXPORT ScopedJavaLocalFrame {
- public:
-  explicit ScopedJavaLocalFrame(JNIEnv* env);
-  ScopedJavaLocalFrame(JNIEnv* env, int capacity);
-  ~ScopedJavaLocalFrame();
-
- private:
-  // This class is only good for use on the thread it was created on so
-  // it's safe to cache the non-threadsafe JNIEnv* inside this object.
-  JNIEnv* env_;
-
-  DISALLOW_COPY_AND_ASSIGN(ScopedJavaLocalFrame);
-};
-
-// Forward declare the generic java reference template class.
-template<typename T> class JavaRef;
-
-// Template specialization of JavaRef, which acts as the base class for all
-// other JavaRef<> template types. This allows you to e.g. pass
-// ScopedJavaLocalRef<jstring> into a function taking const JavaRef<jobject>&
-template<>
-class BASE_EXPORT JavaRef<jobject> {
- public:
-  // Initializes a null reference. Don't add anything else here; it's inlined.
-  JavaRef() : obj_(nullptr) {}
-
-  // Allow nullptr to be converted to JavaRef. This avoids having to declare an
-  // empty JavaRef just to pass null to a function, and makes C++ "nullptr" and
-  // Java "null" equivalent.
-  JavaRef(std::nullptr_t) : JavaRef() {}
-
-  // Public to allow destruction of null JavaRef objects.
-  // Don't add anything else here; it's inlined.
-  ~JavaRef() {}
-
-  jobject obj() const { return obj_; }
-
-  bool is_null() const { return obj_ == nullptr; }
-
- protected:
-  // Takes ownership of the |obj| reference passed; requires it to be a local
-  // reference type.
-#if DCHECK_IS_ON()
-  // Implementation contains a DCHECK; implement out-of-line when DCHECK_IS_ON.
-  JavaRef(JNIEnv* env, jobject obj);
-#else
-  // Don't add anything else here; it's inlined.
-  JavaRef(JNIEnv* env, jobject obj) : obj_(obj) {}
-#endif
-
-  void swap(JavaRef& other) { std::swap(obj_, other.obj_); }
-
-  // The following are implementation detail convenience methods, for
-  // use by the sub-classes.
-  JNIEnv* SetNewLocalRef(JNIEnv* env, jobject obj);
-  void SetNewGlobalRef(JNIEnv* env, jobject obj);
-  void ResetLocalRef(JNIEnv* env);
-  void ResetGlobalRef();
-  jobject ReleaseInternal();
-
- private:
-  jobject obj_;
-
-  DISALLOW_COPY_AND_ASSIGN(JavaRef);
-};
-
-// Generic base class for ScopedJavaLocalRef and ScopedJavaGlobalRef. Useful
-// for allowing functions to accept a reference without having to mandate
-// whether it is a local or global type.
-template<typename T>
-class JavaRef : public JavaRef<jobject> {
- public:
-  JavaRef() {}
-  JavaRef(std::nullptr_t) : JavaRef<jobject>(nullptr) {}
-  ~JavaRef() {}
-
-  T obj() const { return static_cast<T>(JavaRef<jobject>::obj()); }
-
- protected:
-  JavaRef(JNIEnv* env, T obj) : JavaRef<jobject>(env, obj) {}
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(JavaRef);
-};
-
-// Holds a local reference to a JNI method parameter.
-// Method parameters should not be deleted, and so this class exists purely to
-// wrap them as a JavaRef<T> in the JNI binding generator. Do not create
-// instances manually.
-template<typename T>
-class JavaParamRef : public JavaRef<T> {
- public:
-  // Assumes that |obj| is a parameter passed to a JNI method from Java.
-  // Does not assume ownership as parameters should not be deleted.
-  JavaParamRef(JNIEnv* env, T obj) : JavaRef<T>(env, obj) {}
-
-  // Allow nullptr to be converted to JavaParamRef. Some unit tests call JNI
-  // methods directly from C++ and pass null for objects which are not actually
-  // used by the implementation (e.g. the caller object); allow this to keep
-  // working.
-  JavaParamRef(std::nullptr_t) : JavaRef<T>(nullptr) {}
-
-  ~JavaParamRef() {}
-
-  // TODO(torne): remove this cast once we're using JavaRef consistently.
-  // http://crbug.com/506850
-  operator T() const { return JavaRef<T>::obj(); }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(JavaParamRef);
-};
-
-// Holds a local reference to a Java object. The local reference is scoped
-// to the lifetime of this object.
-// Instances of this class may hold onto any JNIEnv passed into it until
-// destroyed. Therefore, since a JNIEnv is only suitable for use on a single
-// thread, objects of this class must be created, used, and destroyed, on a
-// single thread.
-// Therefore, this class should only be used as a stack-based object and from a
-// single thread. If you wish to have the reference outlive the current
-// callstack (e.g. as a class member) or you wish to pass it across threads,
-// use a ScopedJavaGlobalRef instead.
-template<typename T>
-class ScopedJavaLocalRef : public JavaRef<T> {
- public:
-  ScopedJavaLocalRef() : env_(nullptr) {}
-  ScopedJavaLocalRef(std::nullptr_t) : env_(nullptr) {}
-
-  // Non-explicit copy constructor, to allow ScopedJavaLocalRef to be returned
-  // by value as this is the normal usage pattern.
-  ScopedJavaLocalRef(const ScopedJavaLocalRef<T>& other)
-      : env_(other.env_) {
-    this->SetNewLocalRef(env_, other.obj());
-  }
-
-  ScopedJavaLocalRef(ScopedJavaLocalRef<T>&& other) : env_(other.env_) {
-    this->swap(other);
-  }
-
-  explicit ScopedJavaLocalRef(const JavaRef<T>& other) : env_(nullptr) {
-    this->Reset(other);
-  }
-
-  // Assumes that |obj| is a local reference to a Java object and takes
-  // ownership  of this local reference.
-  // TODO(torne): this shouldn't be used outside of JNI helper functions but
-  // there are currently some cases where there aren't helpers for things.
-  ScopedJavaLocalRef(JNIEnv* env, T obj) : JavaRef<T>(env, obj), env_(env) {}
-
-  ~ScopedJavaLocalRef() {
-    this->Reset();
-  }
-
-  // Overloaded assignment operator defined for consistency with the implicit
-  // copy constructor.
-  void operator=(const ScopedJavaLocalRef<T>& other) {
-    this->Reset(other);
-  }
-
-  void operator=(ScopedJavaLocalRef<T>&& other) {
-    env_ = other.env_;
-    this->swap(other);
-  }
-
-  void Reset() {
-    this->ResetLocalRef(env_);
-  }
-
-  void Reset(const ScopedJavaLocalRef<T>& other) {
-    // We can copy over env_ here as |other| instance must be from the same
-    // thread as |this| local ref. (See class comment for multi-threading
-    // limitations, and alternatives).
-    this->Reset(other.env_, other.obj());
-  }
-
-  void Reset(const JavaRef<T>& other) {
-    // If |env_| was not yet set (is still null) it will be attached to the
-    // current thread in SetNewLocalRef().
-    this->Reset(env_, other.obj());
-  }
-
-  // Creates a new local reference to the Java object, unlike the constructor
-  // with the same parameters that takes ownership of the existing reference.
-  // TODO(torne): these should match as this is confusing.
-  void Reset(JNIEnv* env, T obj) { env_ = this->SetNewLocalRef(env, obj); }
-
-  // Releases the local reference to the caller. The caller *must* delete the
-  // local reference when it is done with it. Note that calling a Java method
-  // is *not* a transfer of ownership and Release() should not be used.
-  T Release() {
-    return static_cast<T>(this->ReleaseInternal());
-  }
-
- private:
-  // This class is only good for use on the thread it was created on so
-  // it's safe to cache the non-threadsafe JNIEnv* inside this object.
-  JNIEnv* env_;
-
-  // Prevent ScopedJavaLocalRef(JNIEnv*, T obj) from being used to take
-  // ownership of a JavaParamRef's underlying object - parameters are not
-  // allowed to be deleted and so should not be owned by ScopedJavaLocalRef.
-  // TODO(torne): this can be removed once JavaParamRef no longer has an
-  // implicit conversion back to T.
-  ScopedJavaLocalRef(JNIEnv* env, const JavaParamRef<T>& other);
-};
-
-// Holds a global reference to a Java object. The global reference is scoped
-// to the lifetime of this object. This class does not hold onto any JNIEnv*
-// passed to it, hence it is safe to use across threads (within the constraints
-// imposed by the underlying Java object that it references).
-template<typename T>
-class ScopedJavaGlobalRef : public JavaRef<T> {
- public:
-  ScopedJavaGlobalRef() {}
-  ScopedJavaGlobalRef(std::nullptr_t) {}
-
-  ScopedJavaGlobalRef(const ScopedJavaGlobalRef<T>& other) {
-    this->Reset(other);
-  }
-
-  ScopedJavaGlobalRef(ScopedJavaGlobalRef<T>&& other) { this->swap(other); }
-
-  ScopedJavaGlobalRef(JNIEnv* env, T obj) { this->Reset(env, obj); }
-
-  explicit ScopedJavaGlobalRef(const JavaRef<T>& other) { this->Reset(other); }
-
-  ~ScopedJavaGlobalRef() {
-    this->Reset();
-  }
-
-  // Overloaded assignment operator defined for consistency with the implicit
-  // copy constructor.
-  void operator=(const ScopedJavaGlobalRef<T>& other) {
-    this->Reset(other);
-  }
-
-  void operator=(ScopedJavaGlobalRef<T>&& other) { this->swap(other); }
-
-  void Reset() {
-    this->ResetGlobalRef();
-  }
-
-  void Reset(const JavaRef<T>& other) { this->Reset(nullptr, other.obj()); }
-
-  void Reset(JNIEnv* env, const JavaParamRef<T>& other) {
-    this->Reset(env, other.obj());
-  }
-
-  void Reset(JNIEnv* env, T obj) { this->SetNewGlobalRef(env, obj); }
-
-  // Releases the global reference to the caller. The caller *must* delete the
-  // global reference when it is done with it. Note that calling a Java method
-  // is *not* a transfer of ownership and Release() should not be used.
-  T Release() {
-    return static_cast<T>(this->ReleaseInternal());
-  }
-};
-
-// Temporary type for parameters to Java functions, to allow incremental
-// migration from bare jobject to JavaRef. Don't use outside JNI generator.
-template <typename T>
-class JavaRefOrBare {
- public:
-  JavaRefOrBare(std::nullptr_t) : obj_(nullptr) {}
-  JavaRefOrBare(const JavaRef<T>& ref) : obj_(ref.obj()) {}
-  JavaRefOrBare(T obj) : obj_(obj) {}
-  T obj() const { return obj_; }
-
- private:
-  T obj_;
-
-  DISALLOW_COPY_AND_ASSIGN(JavaRefOrBare);
-};
-
-}  // namespace android
-}  // namespace base
-
-#endif  // BASE_ANDROID_SCOPED_JAVA_REF_H_
diff --git a/base/android/scoped_java_ref_unittest.cc b/base/android/scoped_java_ref_unittest.cc
deleted file mode 100644
index 99d035b..0000000
--- a/base/android/scoped_java_ref_unittest.cc
+++ /dev/null
@@ -1,133 +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 "base/android/scoped_java_ref.h"
-
-#include "base/android/jni_android.h"
-#include "base/android/jni_string.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace android {
-
-namespace {
-int g_local_refs = 0;
-int g_global_refs = 0;
-
-const JNINativeInterface* g_previous_functions;
-
-jobject NewGlobalRef(JNIEnv* env, jobject obj) {
-  ++g_global_refs;
-  return g_previous_functions->NewGlobalRef(env, obj);
-}
-
-void DeleteGlobalRef(JNIEnv* env, jobject obj) {
-  --g_global_refs;
-  return g_previous_functions->DeleteGlobalRef(env, obj);
-}
-
-jobject NewLocalRef(JNIEnv* env, jobject obj) {
-  ++g_local_refs;
-  return g_previous_functions->NewLocalRef(env, obj);
-}
-
-void DeleteLocalRef(JNIEnv* env, jobject obj) {
-  --g_local_refs;
-  return g_previous_functions->DeleteLocalRef(env, obj);
-}
-}  // namespace
-
-class ScopedJavaRefTest : public testing::Test {
- protected:
-  void SetUp() override {
-    g_local_refs = 0;
-    g_global_refs = 0;
-    JNIEnv* env = AttachCurrentThread();
-    g_previous_functions = env->functions;
-    hooked_functions = *g_previous_functions;
-    env->functions = &hooked_functions;
-    // We inject our own functions in JNINativeInterface so we can keep track
-    // of the reference counting ourselves.
-    hooked_functions.NewGlobalRef = &NewGlobalRef;
-    hooked_functions.DeleteGlobalRef = &DeleteGlobalRef;
-    hooked_functions.NewLocalRef = &NewLocalRef;
-    hooked_functions.DeleteLocalRef = &DeleteLocalRef;
-  }
-
-  void TearDown() override {
-    JNIEnv* env = AttachCurrentThread();
-    env->functions = g_previous_functions;
-  }
-  // From JellyBean release, the instance of this struct provided in JNIEnv is
-  // read-only, so we deep copy it to allow individual functions to be hooked.
-  JNINativeInterface hooked_functions;
-};
-
-// The main purpose of this is testing the various conversions compile.
-TEST_F(ScopedJavaRefTest, Conversions) {
-  JNIEnv* env = AttachCurrentThread();
-  ScopedJavaLocalRef<jstring> str = ConvertUTF8ToJavaString(env, "string");
-  ScopedJavaGlobalRef<jstring> global(str);
-  {
-    ScopedJavaGlobalRef<jobject> global_obj(str);
-    ScopedJavaLocalRef<jobject> local_obj(global);
-    const JavaRef<jobject>& obj_ref1(str);
-    const JavaRef<jobject>& obj_ref2(global);
-    EXPECT_TRUE(env->IsSameObject(obj_ref1.obj(), obj_ref2.obj()));
-    EXPECT_TRUE(env->IsSameObject(global_obj.obj(), obj_ref2.obj()));
-  }
-  global.Reset(str);
-  const JavaRef<jstring>& str_ref = str;
-  EXPECT_EQ("string", ConvertJavaStringToUTF8(str_ref));
-  str.Reset();
-}
-
-TEST_F(ScopedJavaRefTest, RefCounts) {
-  JNIEnv* env = AttachCurrentThread();
-  ScopedJavaLocalRef<jstring> str;
-  // The ConvertJavaStringToUTF8 below creates a new string that would normally
-  // return a local ref. We simulate that by starting the g_local_refs count at
-  // 1.
-  g_local_refs = 1;
-  str.Reset(ConvertUTF8ToJavaString(env, "string"));
-  EXPECT_EQ(1, g_local_refs);
-  EXPECT_EQ(0, g_global_refs);
-  {
-    ScopedJavaGlobalRef<jstring> global_str(str);
-    ScopedJavaGlobalRef<jobject> global_obj(global_str);
-    EXPECT_EQ(1, g_local_refs);
-    EXPECT_EQ(2, g_global_refs);
-
-    ScopedJavaLocalRef<jstring> str2(env, str.Release());
-    EXPECT_EQ(1, g_local_refs);
-    {
-      ScopedJavaLocalRef<jstring> str3(str2);
-      EXPECT_EQ(2, g_local_refs);
-    }
-    EXPECT_EQ(1, g_local_refs);
-    {
-      ScopedJavaLocalRef<jstring> str4((ScopedJavaLocalRef<jstring>(str2)));
-      EXPECT_EQ(2, g_local_refs);
-    }
-    EXPECT_EQ(1, g_local_refs);
-    {
-      ScopedJavaLocalRef<jstring> str5;
-      str5 = ScopedJavaLocalRef<jstring>(str2);
-      EXPECT_EQ(2, g_local_refs);
-    }
-    EXPECT_EQ(1, g_local_refs);
-    str2.Reset();
-    EXPECT_EQ(0, g_local_refs);
-    global_str.Reset();
-    EXPECT_EQ(1, g_global_refs);
-    ScopedJavaGlobalRef<jobject> global_obj2(global_obj);
-    EXPECT_EQ(2, g_global_refs);
-  }
-
-  EXPECT_EQ(0, g_local_refs);
-  EXPECT_EQ(0, g_global_refs);
-}
-
-}  // namespace android
-}  // namespace base
diff --git a/build/android/gyp/util/__init__.py b/build/android/gyp/util/__init__.py
deleted file mode 100644
index 727e987..0000000
--- a/build/android/gyp/util/__init__.py
+++ /dev/null
@@ -1,4 +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.
-
diff --git a/build/android/gyp/util/build_utils.py b/build/android/gyp/util/build_utils.py
deleted file mode 100644
index abd2dfc..0000000
--- a/build/android/gyp/util/build_utils.py
+++ /dev/null
@@ -1,589 +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.
-
-import ast
-import contextlib
-import fnmatch
-import json
-import os
-import pipes
-import re
-import shlex
-import shutil
-import stat
-import subprocess
-import sys
-import tempfile
-import zipfile
-
-# Some clients do not add //build/android/gyp to PYTHONPATH.
-import md5_check  # pylint: disable=relative-import
-
-# pylib conflicts with mojo/public/tools/bindings/pylib. Prioritize
-# build/android/pylib.
-# PYTHONPATH wouldn't help in this case, because soong put source files under
-# temp directory for each build, so the abspath is unknown until the
-# execution.
-# sys.path.append(os.path.join(os.path.dirname(__file__), os.pardir, os.pardir))
-sys.path.insert(0, os.path.join(os.path.dirname(__file__), os.pardir, os.pardir))
-from pylib.constants import host_paths
-
-sys.path.append(os.path.join(os.path.dirname(__file__),
-                             os.pardir, os.pardir, os.pardir))
-import gn_helpers
-
-COLORAMA_ROOT = os.path.join(host_paths.DIR_SOURCE_ROOT,
-                             'third_party', 'colorama', 'src')
-# aapt should ignore OWNERS files in addition the default ignore pattern.
-AAPT_IGNORE_PATTERN = ('!OWNERS:!.svn:!.git:!.ds_store:!*.scc:.*:<dir>_*:' +
-                       '!CVS:!thumbs.db:!picasa.ini:!*~:!*.d.stamp')
-HERMETIC_TIMESTAMP = (2001, 1, 1, 0, 0, 0)
-_HERMETIC_FILE_ATTR = (0644 << 16L)
-
-
-@contextlib.contextmanager
-def TempDir():
-  dirname = tempfile.mkdtemp()
-  try:
-    yield dirname
-  finally:
-    shutil.rmtree(dirname)
-
-
-def MakeDirectory(dir_path):
-  try:
-    os.makedirs(dir_path)
-  except OSError:
-    pass
-
-
-def DeleteDirectory(dir_path):
-  if os.path.exists(dir_path):
-    shutil.rmtree(dir_path)
-
-
-def Touch(path, fail_if_missing=False):
-  if fail_if_missing and not os.path.exists(path):
-    raise Exception(path + ' doesn\'t exist.')
-
-  MakeDirectory(os.path.dirname(path))
-  with open(path, 'a'):
-    os.utime(path, None)
-
-
-def FindInDirectory(directory, filename_filter):
-  files = []
-  for root, _dirnames, filenames in os.walk(directory):
-    matched_files = fnmatch.filter(filenames, filename_filter)
-    files.extend((os.path.join(root, f) for f in matched_files))
-  return files
-
-
-def FindInDirectories(directories, filename_filter):
-  all_files = []
-  for directory in directories:
-    all_files.extend(FindInDirectory(directory, filename_filter))
-  return all_files
-
-
-def ParseGnList(gn_string):
-  """Converts a command-line parameter into a list.
-
-  If the input starts with a '[' it is assumed to be a GN-formatted list and
-  it will be parsed accordingly. When empty an empty list will be returned.
-  Otherwise, the parameter will be treated as a single raw string (not
-  GN-formatted in that it's not assumed to have literal quotes that must be
-  removed) and a list will be returned containing that string.
-
-  The common use for this behavior is in the Android build where things can
-  take lists of @FileArg references that are expanded via ExpandFileArgs.
-  """
-  if gn_string.startswith('['):
-    parser = gn_helpers.GNValueParser(gn_string)
-    return parser.ParseList()
-  if len(gn_string):
-    return [ gn_string ]
-  return []
-
-
-def CheckOptions(options, parser, required=None):
-  if not required:
-    return
-  for option_name in required:
-    if getattr(options, option_name) is None:
-      parser.error('--%s is required' % option_name.replace('_', '-'))
-
-
-def WriteJson(obj, path, only_if_changed=False):
-  old_dump = None
-  if os.path.exists(path):
-    with open(path, 'r') as oldfile:
-      old_dump = oldfile.read()
-
-  new_dump = json.dumps(obj, sort_keys=True, indent=2, separators=(',', ': '))
-
-  if not only_if_changed or old_dump != new_dump:
-    with open(path, 'w') as outfile:
-      outfile.write(new_dump)
-
-
-def ReadJson(path):
-  with open(path, 'r') as jsonfile:
-    return json.load(jsonfile)
-
-
-class CalledProcessError(Exception):
-  """This exception is raised when the process run by CheckOutput
-  exits with a non-zero exit code."""
-
-  def __init__(self, cwd, args, output):
-    super(CalledProcessError, self).__init__()
-    self.cwd = cwd
-    self.args = args
-    self.output = output
-
-  def __str__(self):
-    # A user should be able to simply copy and paste the command that failed
-    # into their shell.
-    copyable_command = '( cd {}; {} )'.format(os.path.abspath(self.cwd),
-        ' '.join(map(pipes.quote, self.args)))
-    return 'Command failed: {}\n{}'.format(copyable_command, self.output)
-
-
-# This can be used in most cases like subprocess.check_output(). The output,
-# particularly when the command fails, better highlights the command's failure.
-# If the command fails, raises a build_utils.CalledProcessError.
-def CheckOutput(args, cwd=None, env=None,
-                print_stdout=False, print_stderr=True,
-                stdout_filter=None,
-                stderr_filter=None,
-                fail_func=lambda returncode, stderr: returncode != 0):
-  if not cwd:
-    cwd = os.getcwd()
-
-  child = subprocess.Popen(args,
-      stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=cwd, env=env)
-  stdout, stderr = child.communicate()
-
-  if stdout_filter is not None:
-    stdout = stdout_filter(stdout)
-
-  if stderr_filter is not None:
-    stderr = stderr_filter(stderr)
-
-  if fail_func(child.returncode, stderr):
-    raise CalledProcessError(cwd, args, stdout + stderr)
-
-  if print_stdout:
-    sys.stdout.write(stdout)
-  if print_stderr:
-    sys.stderr.write(stderr)
-
-  return stdout
-
-
-def GetModifiedTime(path):
-  # For a symlink, the modified time should be the greater of the link's
-  # modified time and the modified time of the target.
-  return max(os.lstat(path).st_mtime, os.stat(path).st_mtime)
-
-
-def IsTimeStale(output, inputs):
-  if not os.path.exists(output):
-    return True
-
-  output_time = GetModifiedTime(output)
-  for i in inputs:
-    if GetModifiedTime(i) > output_time:
-      return True
-  return False
-
-
-def IsDeviceReady():
-  device_state = CheckOutput(['adb', 'get-state'])
-  return device_state.strip() == 'device'
-
-
-def CheckZipPath(name):
-  if os.path.normpath(name) != name:
-    raise Exception('Non-canonical zip path: %s' % name)
-  if os.path.isabs(name):
-    raise Exception('Absolute zip path: %s' % name)
-
-
-def IsSymlink(zip_file, name):
-  zi = zip_file.getinfo(name)
-
-  # The two high-order bytes of ZipInfo.external_attr represent
-  # UNIX permissions and file type bits.
-  return stat.S_ISLNK(zi.external_attr >> 16L)
-
-
-def ExtractAll(zip_path, path=None, no_clobber=True, pattern=None,
-               predicate=None):
-  if path is None:
-    path = os.getcwd()
-  elif not os.path.exists(path):
-    MakeDirectory(path)
-
-  if not zipfile.is_zipfile(zip_path):
-    raise Exception('Invalid zip file: %s' % zip_path)
-
-  extracted = []
-  with zipfile.ZipFile(zip_path) as z:
-    for name in z.namelist():
-      if name.endswith('/'):
-        continue
-      if pattern is not None:
-        if not fnmatch.fnmatch(name, pattern):
-          continue
-      if predicate and not predicate(name):
-        continue
-      CheckZipPath(name)
-      if no_clobber:
-        output_path = os.path.join(path, name)
-        if os.path.exists(output_path):
-          raise Exception(
-              'Path already exists from zip: %s %s %s'
-              % (zip_path, name, output_path))
-      if IsSymlink(z, name):
-        dest = os.path.join(path, name)
-        MakeDirectory(os.path.dirname(dest))
-        os.symlink(z.read(name), dest)
-        extracted.append(dest)
-      else:
-        z.extract(name, path)
-        extracted.append(os.path.join(path, name))
-
-  return extracted
-
-
-def AddToZipHermetic(zip_file, zip_path, src_path=None, data=None,
-                     compress=None):
-  """Adds a file to the given ZipFile with a hard-coded modified time.
-
-  Args:
-    zip_file: ZipFile instance to add the file to.
-    zip_path: Destination path within the zip file.
-    src_path: Path of the source file. Mutually exclusive with |data|.
-    data: File data as a string.
-    compress: Whether to enable compression. Default is take from ZipFile
-        constructor.
-  """
-  assert (src_path is None) != (data is None), (
-      '|src_path| and |data| are mutually exclusive.')
-  CheckZipPath(zip_path)
-  zipinfo = zipfile.ZipInfo(filename=zip_path, date_time=HERMETIC_TIMESTAMP)
-  zipinfo.external_attr = _HERMETIC_FILE_ATTR
-
-  if src_path and os.path.islink(src_path):
-    zipinfo.filename = zip_path
-    zipinfo.external_attr |= stat.S_IFLNK << 16L # mark as a symlink
-    zip_file.writestr(zipinfo, os.readlink(src_path))
-    return
-
-  if src_path:
-    with file(src_path) as f:
-      data = f.read()
-
-  # zipfile will deflate even when it makes the file bigger. To avoid
-  # growing files, disable compression at an arbitrary cut off point.
-  if len(data) < 16:
-    compress = False
-
-  # None converts to ZIP_STORED, when passed explicitly rather than the
-  # default passed to the ZipFile constructor.
-  compress_type = zip_file.compression
-  if compress is not None:
-    compress_type = zipfile.ZIP_DEFLATED if compress else zipfile.ZIP_STORED
-  zip_file.writestr(zipinfo, data, compress_type)
-
-
-def DoZip(inputs, output, base_dir=None):
-  """Creates a zip file from a list of files.
-
-  Args:
-    inputs: A list of paths to zip, or a list of (zip_path, fs_path) tuples.
-    output: Destination .zip file.
-    base_dir: Prefix to strip from inputs.
-  """
-  input_tuples = []
-  for tup in inputs:
-    if isinstance(tup, basestring):
-      tup = (os.path.relpath(tup, base_dir), tup)
-    input_tuples.append(tup)
-
-  # Sort by zip path to ensure stable zip ordering.
-  input_tuples.sort(key=lambda tup: tup[0])
-  with zipfile.ZipFile(output, 'w') as outfile:
-    for zip_path, fs_path in input_tuples:
-      AddToZipHermetic(outfile, zip_path, src_path=fs_path)
-
-
-def ZipDir(output, base_dir):
-  """Creates a zip file from a directory."""
-  inputs = []
-  for root, _, files in os.walk(base_dir):
-    for f in files:
-      inputs.append(os.path.join(root, f))
-  DoZip(inputs, output, base_dir)
-
-
-def MatchesGlob(path, filters):
-  """Returns whether the given path matches any of the given glob patterns."""
-  return filters and any(fnmatch.fnmatch(path, f) for f in filters)
-
-
-def MergeZips(output, inputs, exclude_patterns=None, path_transform=None):
-  path_transform = path_transform or (lambda p, z: p)
-  added_names = set()
-
-  output_is_already_open = not isinstance(output, basestring)
-  if output_is_already_open:
-    assert isinstance(output, zipfile.ZipFile)
-    out_zip = output
-  else:
-    out_zip = zipfile.ZipFile(output, 'w')
-
-  try:
-    for in_file in inputs:
-      with zipfile.ZipFile(in_file, 'r') as in_zip:
-        in_zip._expected_crc = None
-        for info in in_zip.infolist():
-          # Ignore directories.
-          if info.filename[-1] == '/':
-            continue
-          dst_name = path_transform(info.filename, in_file)
-          already_added = dst_name in added_names
-          if not already_added and not MatchesGlob(dst_name, exclude_patterns):
-            AddToZipHermetic(out_zip, dst_name, data=in_zip.read(info),
-                             compress=info.compress_type != zipfile.ZIP_STORED)
-            added_names.add(dst_name)
-  finally:
-    if not output_is_already_open:
-      out_zip.close()
-
-
-def PrintWarning(message):
-  print 'WARNING: ' + message
-
-
-def PrintBigWarning(message):
-  print '*****     ' * 8
-  PrintWarning(message)
-  print '*****     ' * 8
-
-
-def GetSortedTransitiveDependencies(top, deps_func):
-  """Gets the list of all transitive dependencies in sorted order.
-
-  There should be no cycles in the dependency graph.
-
-  Args:
-    top: a list of the top level nodes
-    deps_func: A function that takes a node and returns its direct dependencies.
-  Returns:
-    A list of all transitive dependencies of nodes in top, in order (a node will
-    appear in the list at a higher index than all of its dependencies).
-  """
-  def Node(dep):
-    return (dep, deps_func(dep))
-
-  # First: find all deps
-  unchecked_deps = list(top)
-  all_deps = set(top)
-  while unchecked_deps:
-    dep = unchecked_deps.pop()
-    new_deps = deps_func(dep).difference(all_deps)
-    unchecked_deps.extend(new_deps)
-    all_deps = all_deps.union(new_deps)
-
-  # Then: simple, slow topological sort.
-  sorted_deps = []
-  unsorted_deps = dict(map(Node, all_deps))
-  while unsorted_deps:
-    for library, dependencies in unsorted_deps.items():
-      if not dependencies.intersection(unsorted_deps.keys()):
-        sorted_deps.append(library)
-        del unsorted_deps[library]
-
-  return sorted_deps
-
-
-def GetPythonDependencies():
-  """Gets the paths of imported non-system python modules.
-
-  A path is assumed to be a "system" import if it is outside of chromium's
-  src/. The paths will be relative to the current directory.
-  """
-  module_paths = GetModulePaths()
-
-  abs_module_paths = map(os.path.abspath, module_paths)
-
-  assert os.path.isabs(host_paths.DIR_SOURCE_ROOT)
-  non_system_module_paths = [
-      p for p in abs_module_paths if p.startswith(host_paths.DIR_SOURCE_ROOT)]
-  def ConvertPycToPy(s):
-    if s.endswith('.pyc'):
-      return s[:-1]
-    return s
-
-  non_system_module_paths = map(ConvertPycToPy, non_system_module_paths)
-  non_system_module_paths = map(os.path.relpath, non_system_module_paths)
-  return sorted(set(non_system_module_paths))
-
-
-def GetModulePaths():
-  """Returns the paths to all of the modules in sys.modules."""
-  ForceLazyModulesToLoad()
-  return (m.__file__ for m in sys.modules.itervalues()
-          if m is not None and hasattr(m, '__file__'))
-
-
-def ForceLazyModulesToLoad():
-  """Forces any lazily imported modules to fully load themselves.
-
-  Inspecting the modules' __file__ attribute causes lazily imported modules
-  (e.g. from email) to get fully imported and update sys.modules. Iterate
-  over the values until sys.modules stabilizes so that no modules are missed.
-  """
-  while True:
-    num_modules_before = len(sys.modules.keys())
-    for m in sys.modules.values():
-      if m is not None and hasattr(m, '__file__'):
-        _ = m.__file__
-    num_modules_after = len(sys.modules.keys())
-    if num_modules_before == num_modules_after:
-      break
-
-
-def AddDepfileOption(parser):
-  # TODO(agrieve): Get rid of this once we've moved to argparse.
-  if hasattr(parser, 'add_option'):
-    func = parser.add_option
-  else:
-    func = parser.add_argument
-  func('--depfile',
-       help='Path to depfile (refer to `gn help depfile`)')
-
-
-def WriteDepfile(depfile_path, first_gn_output, inputs=None, add_pydeps=True):
-  assert depfile_path != first_gn_output  # http://crbug.com/646165
-  inputs = inputs or []
-  if add_pydeps:
-    inputs = GetPythonDependencies() + inputs
-  MakeDirectory(os.path.dirname(depfile_path))
-  # Ninja does not support multiple outputs in depfiles.
-  with open(depfile_path, 'w') as depfile:
-    depfile.write(first_gn_output.replace(' ', '\\ '))
-    depfile.write(': ')
-    depfile.write(' '.join(i.replace(' ', '\\ ') for i in inputs))
-    depfile.write('\n')
-
-
-def ExpandFileArgs(args):
-  """Replaces file-arg placeholders in args.
-
-  These placeholders have the form:
-    @FileArg(filename:key1:key2:...:keyn)
-
-  The value of such a placeholder is calculated by reading 'filename' as json.
-  And then extracting the value at [key1][key2]...[keyn].
-
-  Note: This intentionally does not return the list of files that appear in such
-  placeholders. An action that uses file-args *must* know the paths of those
-  files prior to the parsing of the arguments (typically by explicitly listing
-  them in the action's inputs in build files).
-  """
-  new_args = list(args)
-  file_jsons = dict()
-  r = re.compile('@FileArg\((.*?)\)')
-  for i, arg in enumerate(args):
-    match = r.search(arg)
-    if not match:
-      continue
-
-    if match.end() != len(arg):
-      raise Exception('Unexpected characters after FileArg: ' + arg)
-
-    lookup_path = match.group(1).split(':')
-    file_path = lookup_path[0]
-    if not file_path in file_jsons:
-      file_jsons[file_path] = ReadJson(file_path)
-
-    expansion = file_jsons[file_path]
-    for k in lookup_path[1:]:
-      expansion = expansion[k]
-
-    # This should match ParseGNList. The output is either a GN-formatted list
-    # or a literal (with no quotes).
-    if isinstance(expansion, list):
-      new_args[i] = arg[:match.start()] + gn_helpers.ToGNString(expansion)
-    else:
-      new_args[i] = arg[:match.start()] + str(expansion)
-
-  return new_args
-
-
-def ReadSourcesList(sources_list_file_name):
-  """Reads a GN-written file containing list of file names and returns a list.
-
-  Note that this function should not be used to parse response files.
-  """
-  with open(sources_list_file_name) as f:
-    return [file_name.strip() for file_name in f]
-
-
-def CallAndWriteDepfileIfStale(function, options, record_path=None,
-                               input_paths=None, input_strings=None,
-                               output_paths=None, force=False,
-                               pass_changes=False,
-                               depfile_deps=None):
-  """Wraps md5_check.CallAndRecordIfStale() and also writes dep & stamp files.
-
-  Depfiles and stamp files are automatically added to output_paths when present
-  in the |options| argument. They are then created after |function| is called.
-
-  By default, only python dependencies are added to the depfile. If there are
-  other input paths that are not captured by GN deps, then they should be listed
-  in depfile_deps. It's important to write paths to the depfile that are already
-  captured by GN deps since GN args can cause GN deps to change, and such
-  changes are not immediately reflected in depfiles (http://crbug.com/589311).
-  """
-  if not output_paths:
-    raise Exception('At least one output_path must be specified.')
-  input_paths = list(input_paths or [])
-  input_strings = list(input_strings or [])
-  output_paths = list(output_paths or [])
-
-  python_deps = None
-  if hasattr(options, 'depfile') and options.depfile:
-    python_deps = GetPythonDependencies()
-    input_paths += python_deps
-    output_paths += [options.depfile]
-
-  stamp_file = hasattr(options, 'stamp') and options.stamp
-  if stamp_file:
-    output_paths += [stamp_file]
-
-  def on_stale_md5(changes):
-    args = (changes,) if pass_changes else ()
-    function(*args)
-    if python_deps is not None:
-      all_depfile_deps = list(python_deps)
-      if depfile_deps:
-        all_depfile_deps.extend(depfile_deps)
-      WriteDepfile(options.depfile, output_paths[0], all_depfile_deps,
-                   add_pydeps=False)
-    if stamp_file:
-      Touch(stamp_file)
-
-  md5_check.CallAndRecordIfStale(
-      on_stale_md5,
-      record_path=record_path,
-      input_paths=input_paths,
-      input_strings=input_strings,
-      output_paths=output_paths,
-      force=force,
-      pass_changes=True)
diff --git a/build/android/gyp/util/md5_check.py b/build/android/gyp/util/md5_check.py
deleted file mode 100644
index 7659124..0000000
--- a/build/android/gyp/util/md5_check.py
+++ /dev/null
@@ -1,410 +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.
-
-import difflib
-import hashlib
-import itertools
-import json
-import os
-import sys
-import zipfile
-
-
-# When set and a difference is detected, a diff of what changed is printed.
-PRINT_EXPLANATIONS = int(os.environ.get('PRINT_BUILD_EXPLANATIONS', 0))
-
-# An escape hatch that causes all targets to be rebuilt.
-_FORCE_REBUILD = int(os.environ.get('FORCE_REBUILD', 0))
-
-
-def CallAndRecordIfStale(
-    function, record_path=None, input_paths=None, input_strings=None,
-    output_paths=None, force=False, pass_changes=False):
-  """Calls function if outputs are stale.
-
-  Outputs are considered stale if:
-  - any output_paths are missing, or
-  - the contents of any file within input_paths has changed, or
-  - the contents of input_strings has changed.
-
-  To debug which files are out-of-date, set the environment variable:
-      PRINT_MD5_DIFFS=1
-
-  Args:
-    function: The function to call.
-    record_path: Path to record metadata.
-      Defaults to output_paths[0] + '.md5.stamp'
-    input_paths: List of paths to calcualte an md5 sum on.
-    input_strings: List of strings to record verbatim.
-    output_paths: List of output paths.
-    force: Whether to treat outputs as missing regardless of whether they
-      actually are.
-    pass_changes: Whether to pass a Changes instance to |function|.
-  """
-  assert record_path or output_paths
-  input_paths = input_paths or []
-  input_strings = input_strings or []
-  output_paths = output_paths or []
-  record_path = record_path or output_paths[0] + '.md5.stamp'
-
-  assert record_path.endswith('.stamp'), (
-      'record paths must end in \'.stamp\' so that they are easy to find '
-      'and delete')
-
-  new_metadata = _Metadata()
-  new_metadata.AddStrings(input_strings)
-
-  for path in input_paths:
-    if _IsZipFile(path):
-      entries = _ExtractZipEntries(path)
-      new_metadata.AddZipFile(path, entries)
-    else:
-      new_metadata.AddFile(path, _Md5ForPath(path))
-
-  old_metadata = None
-  force = force or _FORCE_REBUILD
-  missing_outputs = [x for x in output_paths if force or not os.path.exists(x)]
-  # When outputs are missing, don't bother gathering change information.
-  if not missing_outputs and os.path.exists(record_path):
-    with open(record_path, 'r') as jsonfile:
-      try:
-        old_metadata = _Metadata.FromFile(jsonfile)
-      except:  # pylint: disable=bare-except
-        pass  # Not yet using new file format.
-
-  changes = Changes(old_metadata, new_metadata, force, missing_outputs)
-  if not changes.HasChanges():
-    return
-
-  if PRINT_EXPLANATIONS:
-    print '=' * 80
-    print 'Target is stale: %s' % record_path
-    print changes.DescribeDifference()
-    print '=' * 80
-
-  args = (changes,) if pass_changes else ()
-  function(*args)
-
-  with open(record_path, 'w') as f:
-    new_metadata.ToFile(f)
-
-
-class Changes(object):
-  """Provides and API for querying what changed between runs."""
-
-  def __init__(self, old_metadata, new_metadata, force, missing_outputs):
-    self.old_metadata = old_metadata
-    self.new_metadata = new_metadata
-    self.force = force
-    self.missing_outputs = missing_outputs
-
-  def _GetOldTag(self, path, subpath=None):
-    return self.old_metadata and self.old_metadata.GetTag(path, subpath)
-
-  def HasChanges(self):
-    """Returns whether any changes exist."""
-    return (self.force or
-            not self.old_metadata or
-            self.old_metadata.StringsMd5() != self.new_metadata.StringsMd5() or
-            self.old_metadata.FilesMd5() != self.new_metadata.FilesMd5())
-
-  def AddedOrModifiedOnly(self):
-    """Returns whether the only changes were from added or modified (sub)files.
-
-    No missing outputs, no removed paths/subpaths.
-    """
-    if (self.force or
-        not self.old_metadata or
-        self.old_metadata.StringsMd5() != self.new_metadata.StringsMd5()):
-      return False
-    if any(self.IterRemovedPaths()):
-      return False
-    for path in self.IterModifiedPaths():
-      if any(self.IterRemovedSubpaths(path)):
-        return False
-    return True
-
-  def IterAllPaths(self):
-    """Generator for paths."""
-    return self.new_metadata.IterPaths();
-
-  def IterAllSubpaths(self, path):
-    """Generator for subpaths."""
-    return self.new_metadata.IterSubpaths(path);
-
-  def IterAddedPaths(self):
-    """Generator for paths that were added."""
-    for path in self.new_metadata.IterPaths():
-      if self._GetOldTag(path) is None:
-        yield path
-
-  def IterAddedSubpaths(self, path):
-    """Generator for paths that were added within the given zip file."""
-    for subpath in self.new_metadata.IterSubpaths(path):
-      if self._GetOldTag(path, subpath) is None:
-        yield subpath
-
-  def IterRemovedPaths(self):
-    """Generator for paths that were removed."""
-    if self.old_metadata:
-      for path in self.old_metadata.IterPaths():
-        if self.new_metadata.GetTag(path) is None:
-          yield path
-
-  def IterRemovedSubpaths(self, path):
-    """Generator for paths that were removed within the given zip file."""
-    if self.old_metadata:
-      for subpath in self.old_metadata.IterSubpaths(path):
-        if self.new_metadata.GetTag(path, subpath) is None:
-          yield subpath
-
-  def IterModifiedPaths(self):
-    """Generator for paths whose contents have changed."""
-    for path in self.new_metadata.IterPaths():
-      old_tag = self._GetOldTag(path)
-      new_tag = self.new_metadata.GetTag(path)
-      if old_tag is not None and old_tag != new_tag:
-        yield path
-
-  def IterModifiedSubpaths(self, path):
-    """Generator for paths within a zip file whose contents have changed."""
-    for subpath in self.new_metadata.IterSubpaths(path):
-      old_tag = self._GetOldTag(path, subpath)
-      new_tag = self.new_metadata.GetTag(path, subpath)
-      if old_tag is not None and old_tag != new_tag:
-        yield subpath
-
-  def IterChangedPaths(self):
-    """Generator for all changed paths (added/removed/modified)."""
-    return itertools.chain(self.IterRemovedPaths(),
-                           self.IterModifiedPaths(),
-                           self.IterAddedPaths())
-
-  def IterChangedSubpaths(self, path):
-    """Generator for paths within a zip that were added/removed/modified."""
-    return itertools.chain(self.IterRemovedSubpaths(path),
-                           self.IterModifiedSubpaths(path),
-                           self.IterAddedSubpaths(path))
-
-  def DescribeDifference(self):
-    """Returns a human-readable description of what changed."""
-    if self.force:
-      return 'force=True'
-    elif self.missing_outputs:
-      return 'Outputs do not exist:\n  ' + '\n  '.join(self.missing_outputs)
-    elif self.old_metadata is None:
-      return 'Previous stamp file not found.'
-
-    if self.old_metadata.StringsMd5() != self.new_metadata.StringsMd5():
-      ndiff = difflib.ndiff(self.old_metadata.GetStrings(),
-                            self.new_metadata.GetStrings())
-      changed = [s for s in ndiff if not s.startswith(' ')]
-      return 'Input strings changed:\n  ' + '\n  '.join(changed)
-
-    if self.old_metadata.FilesMd5() == self.new_metadata.FilesMd5():
-      return "There's no difference."
-
-    lines = []
-    lines.extend('Added: ' + p for p in self.IterAddedPaths())
-    lines.extend('Removed: ' + p for p in self.IterRemovedPaths())
-    for path in self.IterModifiedPaths():
-      lines.append('Modified: ' + path)
-      lines.extend('  -> Subpath added: ' + p
-                   for p in self.IterAddedSubpaths(path))
-      lines.extend('  -> Subpath removed: ' + p
-                   for p in self.IterRemovedSubpaths(path))
-      lines.extend('  -> Subpath modified: ' + p
-                   for p in self.IterModifiedSubpaths(path))
-    if lines:
-      return 'Input files changed:\n  ' + '\n  '.join(lines)
-    return 'I have no idea what changed (there is a bug).'
-
-
-class _Metadata(object):
-  """Data model for tracking change metadata."""
-  # Schema:
-  # {
-  #   "files-md5": "VALUE",
-  #   "strings-md5": "VALUE",
-  #   "input-files": [
-  #     {
-  #       "path": "path.jar",
-  #       "tag": "{MD5 of entries}",
-  #       "entries": [
-  #         { "path": "org/chromium/base/Foo.class", "tag": "{CRC32}" }, ...
-  #       ]
-  #     }, {
-  #       "path": "path.txt",
-  #       "tag": "{MD5}",
-  #     }
-  #   ],
-  #   "input-strings": ["a", "b", ...],
-  # }
-  def __init__(self):
-    self._files_md5 = None
-    self._strings_md5 = None
-    self._files = []
-    self._strings = []
-    # Map of (path, subpath) -> entry. Created upon first call to _GetEntry().
-    self._file_map = None
-
-  @classmethod
-  def FromFile(cls, fileobj):
-    """Returns a _Metadata initialized from a file object."""
-    ret = cls()
-    obj = json.load(fileobj)
-    ret._files_md5 = obj['files-md5']
-    ret._strings_md5 = obj['strings-md5']
-    ret._files = obj['input-files']
-    ret._strings = obj['input-strings']
-    return ret
-
-  def ToFile(self, fileobj):
-    """Serializes metadata to the given file object."""
-    obj = {
-        "files-md5": self.FilesMd5(),
-        "strings-md5": self.StringsMd5(),
-        "input-files": self._files,
-        "input-strings": self._strings,
-    }
-    json.dump(obj, fileobj, indent=2)
-
-  def _AssertNotQueried(self):
-    assert self._files_md5 is None
-    assert self._strings_md5 is None
-    assert self._file_map is None
-
-  def AddStrings(self, values):
-    self._AssertNotQueried()
-    self._strings.extend(str(v) for v in values)
-
-  def AddFile(self, path, tag):
-    """Adds metadata for a non-zip file.
-
-    Args:
-      path: Path to the file.
-      tag: A short string representative of the file contents.
-    """
-    self._AssertNotQueried()
-    self._files.append({
-        'path': path,
-        'tag': tag,
-    })
-
-  def AddZipFile(self, path, entries):
-    """Adds metadata for a zip file.
-
-    Args:
-      path: Path to the file.
-      entries: List of (subpath, tag) tuples for entries within the zip.
-    """
-    self._AssertNotQueried()
-    tag = _ComputeInlineMd5(itertools.chain((e[0] for e in entries),
-                                            (e[1] for e in entries)))
-    self._files.append({
-        'path': path,
-        'tag': tag,
-        'entries': [{"path": e[0], "tag": e[1]} for e in entries],
-    })
-
-  def GetStrings(self):
-    """Returns the list of input strings."""
-    return self._strings
-
-  def FilesMd5(self):
-    """Lazily computes and returns the aggregate md5 of input files."""
-    if self._files_md5 is None:
-      # Omit paths from md5 since temporary files have random names.
-      self._files_md5 = _ComputeInlineMd5(
-          self.GetTag(p) for p in sorted(self.IterPaths()))
-    return self._files_md5
-
-  def StringsMd5(self):
-    """Lazily computes and returns the aggregate md5 of input strings."""
-    if self._strings_md5 is None:
-      self._strings_md5 = _ComputeInlineMd5(self._strings)
-    return self._strings_md5
-
-  def _GetEntry(self, path, subpath=None):
-    """Returns the JSON entry for the given path / subpath."""
-    if self._file_map is None:
-      self._file_map = {}
-      for entry in self._files:
-        self._file_map[(entry['path'], None)] = entry
-        for subentry in entry.get('entries', ()):
-          self._file_map[(entry['path'], subentry['path'])] = subentry
-    return self._file_map.get((path, subpath))
-
-  def GetTag(self, path, subpath=None):
-    """Returns the tag for the given path / subpath."""
-    ret = self._GetEntry(path, subpath)
-    return ret and ret['tag']
-
-  def IterPaths(self):
-    """Returns a generator for all top-level paths."""
-    return (e['path'] for e in self._files)
-
-  def IterSubpaths(self, path):
-    """Returns a generator for all subpaths in the given zip.
-
-    If the given path is not a zip file or doesn't exist, returns an empty
-    iterable.
-    """
-    outer_entry = self._GetEntry(path)
-    if not outer_entry:
-      return ()
-    subentries = outer_entry.get('entries', [])
-    return (entry['path'] for entry in subentries)
-
-
-def _UpdateMd5ForFile(md5, path, block_size=2**16):
-  with open(path, 'rb') as infile:
-    while True:
-      data = infile.read(block_size)
-      if not data:
-        break
-      md5.update(data)
-
-
-def _UpdateMd5ForDirectory(md5, dir_path):
-  for root, _, files in os.walk(dir_path):
-    for f in files:
-      _UpdateMd5ForFile(md5, os.path.join(root, f))
-
-
-def _Md5ForPath(path):
-  md5 = hashlib.md5()
-  if os.path.isdir(path):
-    _UpdateMd5ForDirectory(md5, path)
-  else:
-    _UpdateMd5ForFile(md5, path)
-  return md5.hexdigest()
-
-
-def _ComputeInlineMd5(iterable):
-  """Computes the md5 of the concatenated parameters."""
-  md5 = hashlib.md5()
-  for item in iterable:
-    md5.update(str(item))
-  return md5.hexdigest()
-
-
-def _IsZipFile(path):
-  """Returns whether to treat the given file as a zip file."""
-  # ijar doesn't set the CRC32 field.
-  if path.endswith('.interface.jar'):
-    return False
-  return path[-4:] in ('.zip', '.apk', '.jar') or path.endswith('.srcjar')
-
-
-def _ExtractZipEntries(path):
-  """Returns a list of (path, CRC32) of all files within |path|."""
-  entries = []
-  with zipfile.ZipFile(path) as zip_file:
-    for zip_info in zip_file.infolist():
-      # Skip directories and empty files.
-      if zip_info.CRC:
-        entries.append(
-            (zip_info.filename, zip_info.CRC + zip_info.compress_type))
-  return entries
diff --git a/build/android/pylib/__init__.py b/build/android/pylib/__init__.py
deleted file mode 100644
index b93eb4f..0000000
--- a/build/android/pylib/__init__.py
+++ /dev/null
@@ -1,31 +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.
-
-import os
-import sys
-
-
-_CATAPULT_PATH = os.path.abspath(os.path.join(
-    os.path.dirname(__file__), '..', '..', '..', 'third_party', 'catapult'))
-
-_DEVIL_PATH = os.path.join(_CATAPULT_PATH, 'devil')
-
-_PYTRACE_PATH = os.path.join(_CATAPULT_PATH, 'common', 'py_trace_event')
-
-_PY_UTILS_PATH = os.path.join(_CATAPULT_PATH, 'common', 'py_utils')
-
-_TRACE2HTML_PATH = os.path.join(_CATAPULT_PATH, 'tracing')
-
-
-if _DEVIL_PATH not in sys.path:
-  sys.path.append(_DEVIL_PATH)
-
-if _PYTRACE_PATH not in sys.path:
-  sys.path.append(_PYTRACE_PATH)
-
-if _PY_UTILS_PATH not in sys.path:
-  sys.path.append(_PY_UTILS_PATH)
-
-if _TRACE2HTML_PATH not in sys.path:
-  sys.path.append(_TRACE2HTML_PATH)
diff --git a/build/android/pylib/constants/__init__.py b/build/android/pylib/constants/__init__.py
deleted file mode 100644
index 916ee27..0000000
--- a/build/android/pylib/constants/__init__.py
+++ /dev/null
@@ -1,225 +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.
-
-"""Defines a set of constants shared by test runners and other scripts."""
-
-# TODO(jbudorick): Split these constants into coherent modules.
-
-# pylint: disable=W0212
-
-import collections
-import glob
-import logging
-import os
-import subprocess
-
-import devil.android.sdk.keyevent
-from devil.android.constants import chrome
-from devil.android.sdk import version_codes
-from devil.constants import exit_codes
-
-
-keyevent = devil.android.sdk.keyevent
-
-
-DIR_SOURCE_ROOT = os.environ.get('CHECKOUT_SOURCE_ROOT',
-    os.path.abspath(os.path.join(os.path.dirname(__file__),
-                                 os.pardir, os.pardir, os.pardir, os.pardir)))
-
-PACKAGE_INFO = dict(chrome.PACKAGE_INFO)
-PACKAGE_INFO.update({
-    'legacy_browser': chrome.PackageInfo(
-        'com.google.android.browser',
-        'com.android.browser.BrowserActivity',
-        None,
-        None),
-    'chromecast_shell': chrome.PackageInfo(
-        'com.google.android.apps.mediashell',
-        'com.google.android.apps.mediashell.MediaShellActivity',
-        'castshell-command-line',
-        None),
-    'android_webview_shell': chrome.PackageInfo(
-        'org.chromium.android_webview.shell',
-        'org.chromium.android_webview.shell.AwShellActivity',
-        'android-webview-command-line',
-        None),
-    'gtest': chrome.PackageInfo(
-        'org.chromium.native_test',
-        'org.chromium.native_test.NativeUnitTestActivity',
-        'chrome-native-tests-command-line',
-        None),
-    'components_browsertests': chrome.PackageInfo(
-        'org.chromium.components_browsertests_apk',
-        ('org.chromium.components_browsertests_apk' +
-         '.ComponentsBrowserTestsActivity'),
-        'chrome-native-tests-command-line',
-        None),
-    'content_browsertests': chrome.PackageInfo(
-        'org.chromium.content_browsertests_apk',
-        'org.chromium.content_browsertests_apk.ContentBrowserTestsActivity',
-        'chrome-native-tests-command-line',
-        None),
-    'chromedriver_webview_shell': chrome.PackageInfo(
-        'org.chromium.chromedriver_webview_shell',
-        'org.chromium.chromedriver_webview_shell.Main',
-        None,
-        None),
-})
-
-
-# Ports arrangement for various test servers used in Chrome for Android.
-# Lighttpd server will attempt to use 9000 as default port, if unavailable it
-# will find a free port from 8001 - 8999.
-LIGHTTPD_DEFAULT_PORT = 9000
-LIGHTTPD_RANDOM_PORT_FIRST = 8001
-LIGHTTPD_RANDOM_PORT_LAST = 8999
-TEST_SYNC_SERVER_PORT = 9031
-TEST_SEARCH_BY_IMAGE_SERVER_PORT = 9041
-TEST_POLICY_SERVER_PORT = 9051
-
-
-TEST_EXECUTABLE_DIR = '/data/local/tmp'
-# Directories for common java libraries for SDK build.
-# These constants are defined in build/android/ant/common.xml
-SDK_BUILD_JAVALIB_DIR = 'lib.java'
-SDK_BUILD_TEST_JAVALIB_DIR = 'test.lib.java'
-SDK_BUILD_APKS_DIR = 'apks'
-
-ADB_KEYS_FILE = '/data/misc/adb/adb_keys'
-
-PERF_OUTPUT_DIR = os.path.join(DIR_SOURCE_ROOT, 'out', 'step_results')
-# The directory on the device where perf test output gets saved to.
-DEVICE_PERF_OUTPUT_DIR = (
-    '/data/data/' + PACKAGE_INFO['chrome'].package + '/files')
-
-SCREENSHOTS_DIR = os.path.join(DIR_SOURCE_ROOT, 'out_screenshots')
-
-ANDROID_SDK_VERSION = version_codes.MARSHMALLOW
-ANDROID_SDK_BUILD_TOOLS_VERSION = '24.0.2'
-ANDROID_SDK_ROOT = os.path.join(DIR_SOURCE_ROOT,
-                                'third_party', 'android_tools', 'sdk')
-ANDROID_SDK_TOOLS = os.path.join(ANDROID_SDK_ROOT,
-                                 'build-tools', ANDROID_SDK_BUILD_TOOLS_VERSION)
-ANDROID_NDK_ROOT = os.path.join(DIR_SOURCE_ROOT,
-                                'third_party', 'android_tools', 'ndk')
-
-PROGUARD_SCRIPT_PATH = os.path.join(
-    ANDROID_SDK_ROOT, 'tools', 'proguard', 'bin', 'proguard.sh')
-
-PROGUARD_ROOT = os.path.join(DIR_SOURCE_ROOT, 'third_party', 'proguard')
-
-BAD_DEVICES_JSON = os.path.join(DIR_SOURCE_ROOT,
-                                os.environ.get('CHROMIUM_OUT_DIR', 'out'),
-                                'bad_devices.json')
-
-UPSTREAM_FLAKINESS_SERVER = 'test-results.appspot.com'
-
-# TODO(jbudorick): Remove once unused.
-DEVICE_LOCAL_PROPERTIES_PATH = '/data/local.prop'
-
-# TODO(jbudorick): Rework this into testing/buildbot/
-PYTHON_UNIT_TEST_SUITES = {
-  'pylib_py_unittests': {
-    'path': os.path.join(DIR_SOURCE_ROOT, 'build', 'android'),
-    'test_modules': [
-      'devil.android.device_utils_test',
-      'devil.android.md5sum_test',
-      'devil.utils.cmd_helper_test',
-      'pylib.results.json_results_test',
-      'pylib.utils.proguard_test',
-    ]
-  },
-  'gyp_py_unittests': {
-    'path': os.path.join(DIR_SOURCE_ROOT, 'build', 'android', 'gyp'),
-    'test_modules': [
-      'java_cpp_enum_tests',
-      'java_google_api_keys_tests',
-    ]
-  },
-}
-
-LOCAL_MACHINE_TESTS = ['junit', 'python']
-VALID_ENVIRONMENTS = ['local']
-VALID_TEST_TYPES = ['gtest', 'instrumentation', 'junit', 'linker', 'monkey',
-                    'perf', 'python']
-VALID_DEVICE_TYPES = ['Android', 'iOS']
-
-
-def GetBuildType():
-  try:
-    return os.environ['BUILDTYPE']
-  except KeyError:
-    raise EnvironmentError(
-        'The BUILDTYPE environment variable has not been set')
-
-
-def SetBuildType(build_type):
-  os.environ['BUILDTYPE'] = build_type
-
-
-def SetBuildDirectory(build_directory):
-  os.environ['CHROMIUM_OUT_DIR'] = build_directory
-
-
-def SetOutputDirectory(output_directory):
-  os.environ['CHROMIUM_OUTPUT_DIR'] = output_directory
-
-
-def GetOutDirectory(build_type=None):
-  """Returns the out directory where the output binaries are built.
-
-  Args:
-    build_type: Build type, generally 'Debug' or 'Release'. Defaults to the
-      globally set build type environment variable BUILDTYPE.
-  """
-  if 'CHROMIUM_OUTPUT_DIR' in os.environ:
-    return os.path.abspath(os.path.join(
-        DIR_SOURCE_ROOT, os.environ.get('CHROMIUM_OUTPUT_DIR')))
-
-  return os.path.abspath(os.path.join(
-      DIR_SOURCE_ROOT, os.environ.get('CHROMIUM_OUT_DIR', 'out'),
-      GetBuildType() if build_type is None else build_type))
-
-
-def CheckOutputDirectory():
-  """Checks that CHROMIUM_OUT_DIR or CHROMIUM_OUTPUT_DIR is set.
-
-  If neither are set, but the current working directory is a build directory,
-  then CHROMIUM_OUTPUT_DIR is set to the current working directory.
-
-  Raises:
-    Exception: If no output directory is detected.
-  """
-  output_dir = os.environ.get('CHROMIUM_OUTPUT_DIR')
-  out_dir = os.environ.get('CHROMIUM_OUT_DIR')
-  if not output_dir and not out_dir:
-    # If CWD is an output directory, then assume it's the desired one.
-    if os.path.exists('build.ninja'):
-      output_dir = os.getcwd()
-      SetOutputDirectory(output_dir)
-    elif os.environ.get('CHROME_HEADLESS'):
-      # When running on bots, see if the output directory is obvious.
-      dirs = glob.glob(os.path.join(DIR_SOURCE_ROOT, 'out', '*', 'build.ninja'))
-      if len(dirs) == 1:
-        SetOutputDirectory(dirs[0])
-      else:
-        raise Exception('Neither CHROMIUM_OUTPUT_DIR nor CHROMIUM_OUT_DIR '
-                        'has been set. CHROME_HEADLESS detected, but multiple '
-                        'out dirs exist: %r' % dirs)
-    else:
-      raise Exception('Neither CHROMIUM_OUTPUT_DIR nor CHROMIUM_OUT_DIR '
-                      'has been set')
-
-
-# TODO(jbudorick): Convert existing callers to AdbWrapper.GetAdbPath() and
-# remove this.
-def GetAdbPath():
-  from devil.android.sdk import adb_wrapper
-  return adb_wrapper.AdbWrapper.GetAdbPath()
-
-
-# Exit codes
-ERROR_EXIT_CODE = exit_codes.ERROR
-INFRA_EXIT_CODE = exit_codes.INFRA
-WARNING_EXIT_CODE = exit_codes.WARNING
diff --git a/build/android/pylib/constants/host_paths.py b/build/android/pylib/constants/host_paths.py
deleted file mode 100644
index 98aa53d..0000000
--- a/build/android/pylib/constants/host_paths.py
+++ /dev/null
@@ -1,38 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import contextlib
-import os
-import sys
-
-DIR_SOURCE_ROOT = os.environ.get(
-    'CHECKOUT_SOURCE_ROOT',
-    os.path.abspath(os.path.join(os.path.dirname(__file__),
-                                 os.pardir, os.pardir, os.pardir, os.pardir)))
-
-BUILD_COMMON_PATH = os.path.join(
-    DIR_SOURCE_ROOT, 'build', 'util', 'lib', 'common')
-
-# third-party libraries
-ANDROID_PLATFORM_DEVELOPMENT_SCRIPTS_PATH = os.path.join(
-    DIR_SOURCE_ROOT, 'third_party', 'android_platform', 'development',
-    'scripts')
-DEVIL_PATH = os.path.join(
-    DIR_SOURCE_ROOT, 'third_party', 'catapult', 'devil')
-PYMOCK_PATH = os.path.join(
-    DIR_SOURCE_ROOT, 'third_party', 'pymock')
-
-@contextlib.contextmanager
-def SysPath(path, position=None):
-  if position is None:
-    sys.path.append(path)
-  else:
-    sys.path.insert(position, path)
-  try:
-    yield
-  finally:
-    if sys.path[-1] == path:
-      sys.path.pop()
-    else:
-      sys.path.remove(path)
diff --git a/build/build_config.h b/build/build_config.h
deleted file mode 100644
index 5ee96b1..0000000
--- a/build/build_config.h
+++ /dev/null
@@ -1,229 +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 adds defines about the platform we're currently building on.
-//  Operating System:
-//    OS_WIN / OS_MACOSX / OS_LINUX / OS_POSIX (MACOSX or LINUX) /
-//    OS_NACL (NACL_SFI or NACL_NONSFI) / OS_NACL_SFI / OS_NACL_NONSFI
-//    OS_CHROMEOS is set by the build system
-//  Compiler:
-//    COMPILER_MSVC / COMPILER_GCC
-//  Processor:
-//    ARCH_CPU_X86 / ARCH_CPU_X86_64 / ARCH_CPU_X86_FAMILY (X86 or X86_64)
-//    ARCH_CPU_32_BITS / ARCH_CPU_64_BITS
-
-#ifndef BUILD_BUILD_CONFIG_H_
-#define BUILD_BUILD_CONFIG_H_
-
-// A brief primer on #defines:
-//
-// - __ANDROID__ is automatically defined by the Android toolchain (see
-//   https://goo.gl/v61lXa). It's not defined when building host code.
-// - __ANDROID_HOST__ is defined via -D by Android.mk when building host code
-//   within an Android checkout.
-// - ANDROID is defined via -D when building code for either Android targets or
-//   hosts. Use __ANDROID__ and __ANDROID_HOST__ instead.
-// - OS_ANDROID is a Chrome-specific define used to build Chrome for Android
-//   within the NDK.
-
-// Android targets and hosts don't use tcmalloc.
-#if defined(__ANDROID__) || defined(__ANDROID_HOST__)
-#define NO_TCMALLOC
-#endif  // defined(__ANDROID__) || defined(__ANDROID_HOST__)
-
-// Use the Chrome OS version of the code for both Android targets and Chrome OS builds.
-#if !defined(__ANDROID_HOST__)
-#define OS_CHROMEOS 1
-#endif  // !defined(__ANDROID_HOST__)
-
-#if defined(__ANDROID__)  // Android targets
-
-#define __linux__ 1
-
-#elif !defined(__ANDROID_HOST__)  // Chrome OS
-
-// TODO: Remove these once the GLib MessageLoopForUI isn't being used:
-// https://crbug.com/361635
-#define USE_GLIB 1
-#define USE_OZONE 1
-
-#endif  // defined(__ANDROID__)
-
-// A set of macros to use for platform detection.
-#if defined(__native_client__)
-// __native_client__ must be first, so that other OS_ defines are not set.
-#define OS_NACL 1
-// OS_NACL comes in two sandboxing technology flavors, SFI or Non-SFI.
-// PNaCl toolchain defines __native_client_nonsfi__ macro in Non-SFI build
-// mode, while it does not in SFI build mode.
-#if defined(__native_client_nonsfi__)
-#define OS_NACL_NONSFI
-#else
-#define OS_NACL_SFI
-#endif
-// Don't set OS_ANDROID; it's only used when building Chrome for Android.
-#elif defined(__APPLE__)
-// only include TargetConditions after testing ANDROID as some android builds
-// on mac don't have this header available and it's not needed unless the target
-// is really mac/ios.
-#include <TargetConditionals.h>
-#define OS_MACOSX 1
-#if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE
-#define OS_IOS 1
-#endif  // defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE
-#elif defined(__linux__)
-#define OS_LINUX 1
-// include a system header to pull in features.h for glibc/uclibc macros.
-#include <unistd.h>
-#if defined(__GLIBC__) && !defined(__UCLIBC__)
-// we really are using glibc, not uClibc pretending to be glibc
-#define LIBC_GLIBC 1
-#endif
-#elif defined(_WIN32)
-#define OS_WIN 1
-#elif defined(__FreeBSD__)
-#define OS_FREEBSD 1
-#elif defined(__NetBSD__)
-#define OS_NETBSD 1
-#elif defined(__OpenBSD__)
-#define OS_OPENBSD 1
-#elif defined(__sun)
-#define OS_SOLARIS 1
-#elif defined(__QNXNTO__)
-#define OS_QNX 1
-#else
-#error Please add support for your platform in build/build_config.h
-#endif
-
-#if defined(USE_OPENSSL_CERTS) && defined(USE_NSS_CERTS)
-#error Cannot use both OpenSSL and NSS for certificates
-#endif
-
-// For access to standard BSD features, use OS_BSD instead of a
-// more specific macro.
-#if defined(OS_FREEBSD) || defined(OS_NETBSD) || defined(OS_OPENBSD)
-#define OS_BSD 1
-#endif
-
-// For access to standard POSIXish features, use OS_POSIX instead of a
-// more specific macro.
-#if defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_FREEBSD) ||     \
-    defined(OS_NETBSD) || defined(OS_OPENBSD) || defined(OS_SOLARIS) ||   \
-    defined(OS_ANDROID) || defined(OS_OPENBSD) || defined(OS_SOLARIS) ||  \
-    defined(OS_ANDROID) || defined(OS_NACL) || defined(OS_QNX)
-#define OS_POSIX 1
-#endif
-
-// Use tcmalloc
-#if (defined(OS_WIN) || defined(OS_LINUX) || defined(OS_ANDROID)) && \
-    !defined(NO_TCMALLOC)
-#define USE_TCMALLOC 1
-#endif
-
-// Compiler detection.
-#if defined(__GNUC__)
-#define COMPILER_GCC 1
-#elif defined(_MSC_VER)
-#define COMPILER_MSVC 1
-#else
-#error Please add support for your compiler in build/build_config.h
-#endif
-
-// Processor architecture detection.  For more info on what's defined, see:
-//   http://msdn.microsoft.com/en-us/library/b0084kay.aspx
-//   http://www.agner.org/optimize/calling_conventions.pdf
-//   or with gcc, run: "echo | gcc -E -dM -"
-#if defined(_M_X64) || defined(__x86_64__)
-#define ARCH_CPU_X86_FAMILY 1
-#define ARCH_CPU_X86_64 1
-#define ARCH_CPU_64_BITS 1
-#define ARCH_CPU_LITTLE_ENDIAN 1
-#elif defined(_M_IX86) || defined(__i386__)
-#define ARCH_CPU_X86_FAMILY 1
-#define ARCH_CPU_X86 1
-#define ARCH_CPU_32_BITS 1
-#define ARCH_CPU_LITTLE_ENDIAN 1
-#elif defined(__s390x__)
-#define ARCH_CPU_S390_FAMILY 1
-#define ARCH_CPU_S390X 1
-#define ARCH_CPU_64_BITS 1
-#define ARCH_CPU_BIG_ENDIAN 1
-#elif defined(__s390__)
-#define ARCH_CPU_S390_FAMILY 1
-#define ARCH_CPU_S390 1
-#define ARCH_CPU_31_BITS 1
-#define ARCH_CPU_BIG_ENDIAN 1
-#elif defined(__PPC64__) && defined(__BIG_ENDIAN__)
-#define ARCH_CPU_PPC64_FAMILY 1
-#define ARCH_CPU_PPC64 1
-#define ARCH_CPU_64_BITS 1
-#define ARCH_CPU_BIG_ENDIAN 1
-#elif defined(__PPC64__) && defined(__LITTLE_ENDIAN__)
-#define ARCH_CPU_PPC64_FAMILY 1
-#define ARCH_CPU_PPC64 1
-#define ARCH_CPU_64_BITS 1
-#define ARCH_CPU_LITTLE_ENDIAN 1
-#elif defined(__PPC__)
-#define ARCH_CPU_PPC_FAMILY 1
-#define ARCH_CPU_PPC 1
-#define ARCH_CPU_32_BITS 1
-#define ARCH_CPU_BIG_ENDIAN 1
-#elif defined(__ARMEL__)
-#define ARCH_CPU_ARM_FAMILY 1
-#define ARCH_CPU_ARMEL 1
-#define ARCH_CPU_32_BITS 1
-#define ARCH_CPU_LITTLE_ENDIAN 1
-#elif defined(__aarch64__)
-#define ARCH_CPU_ARM_FAMILY 1
-#define ARCH_CPU_ARM64 1
-#define ARCH_CPU_64_BITS 1
-#define ARCH_CPU_LITTLE_ENDIAN 1
-#elif defined(__pnacl__)
-#define ARCH_CPU_32_BITS 1
-#define ARCH_CPU_LITTLE_ENDIAN 1
-#elif defined(__MIPSEL__)
-#if defined(__LP64__)
-#define ARCH_CPU_MIPS_FAMILY 1
-#define ARCH_CPU_MIPS64EL 1
-#define ARCH_CPU_64_BITS 1
-#define ARCH_CPU_LITTLE_ENDIAN 1
-#else
-#define ARCH_CPU_MIPS_FAMILY 1
-#define ARCH_CPU_MIPSEL 1
-#define ARCH_CPU_32_BITS 1
-#define ARCH_CPU_LITTLE_ENDIAN 1
-#endif
-#else
-#error Please add support for your architecture in build/build_config.h
-#endif
-
-// Type detection for wchar_t.
-#if defined(OS_WIN)
-#define WCHAR_T_IS_UTF16
-#elif defined(OS_POSIX) && defined(COMPILER_GCC) && \
-    defined(__WCHAR_MAX__) && \
-    (__WCHAR_MAX__ == 0x7fffffff || __WCHAR_MAX__ == 0xffffffff)
-#define WCHAR_T_IS_UTF32
-#elif defined(OS_POSIX) && defined(COMPILER_GCC) && \
-    defined(__WCHAR_MAX__) && \
-    (__WCHAR_MAX__ == 0x7fff || __WCHAR_MAX__ == 0xffff)
-// On Posix, we'll detect short wchar_t, but projects aren't guaranteed to
-// compile in this mode (in particular, Chrome doesn't). This is intended for
-// other projects using base who manage their own dependencies and make sure
-// short wchar works for them.
-#define WCHAR_T_IS_UTF16
-#else
-#error Please add support for your compiler in build/build_config.h
-#endif
-
-#if defined(OS_ANDROID)
-// The compiler thinks std::string::const_iterator and "const char*" are
-// equivalent types.
-#define STD_STRING_ITERATOR_IS_CHAR_POINTER
-// The compiler thinks base::string16::const_iterator and "char16*" are
-// equivalent types.
-#define BASE_STRING16_ITERATOR_IS_CHAR16_POINTER
-#endif
-
-#endif  // BUILD_BUILD_CONFIG_H_
diff --git a/build/gn_helpers.py b/build/gn_helpers.py
deleted file mode 100644
index 33cc578..0000000
--- a/build/gn_helpers.py
+++ /dev/null
@@ -1,351 +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.
-
-"""Helper functions useful when writing scripts that integrate with GN.
-
-The main functions are ToGNString and FromGNString which convert between
-serialized GN veriables and Python variables.
-
-To use in a random python file in the build:
-
-  import os
-  import sys
-
-  sys.path.append(os.path.join(os.path.dirname(__file__),
-                               os.pardir, os.pardir, "build"))
-  import gn_helpers
-
-Where the sequence of parameters to join is the relative path from your source
-file to the build directory."""
-
-class GNException(Exception):
-  pass
-
-
-def ToGNString(value, allow_dicts = True):
-  """Returns a stringified GN equivalent of the Python value.
-
-  allow_dicts indicates if this function will allow converting dictionaries
-  to GN scopes. This is only possible at the top level, you can't nest a
-  GN scope in a list, so this should be set to False for recursive calls."""
-  if isinstance(value, basestring):
-    if value.find('\n') >= 0:
-      raise GNException("Trying to print a string with a newline in it.")
-    return '"' + \
-        value.replace('\\', '\\\\').replace('"', '\\"').replace('$', '\\$') + \
-        '"'
-
-  if isinstance(value, unicode):
-    return ToGNString(value.encode('utf-8'))
-
-  if isinstance(value, bool):
-    if value:
-      return "true"
-    return "false"
-
-  if isinstance(value, list):
-    return '[ %s ]' % ', '.join(ToGNString(v) for v in value)
-
-  if isinstance(value, dict):
-    if not allow_dicts:
-      raise GNException("Attempting to recursively print a dictionary.")
-    result = ""
-    for key in sorted(value):
-      if not isinstance(key, basestring):
-        raise GNException("Dictionary key is not a string.")
-      result += "%s = %s\n" % (key, ToGNString(value[key], False))
-    return result
-
-  if isinstance(value, int):
-    return str(value)
-
-  raise GNException("Unsupported type when printing to GN.")
-
-
-def FromGNString(input_string):
-  """Converts the input string from a GN serialized value to Python values.
-
-  For details on supported types see GNValueParser.Parse() below.
-
-  If your GN script did:
-    something = [ "file1", "file2" ]
-    args = [ "--values=$something" ]
-  The command line would look something like:
-    --values="[ \"file1\", \"file2\" ]"
-  Which when interpreted as a command line gives the value:
-    [ "file1", "file2" ]
-
-  You can parse this into a Python list using GN rules with:
-    input_values = FromGNValues(options.values)
-  Although the Python 'ast' module will parse many forms of such input, it
-  will not handle GN escaping properly, nor GN booleans. You should use this
-  function instead.
-
-
-  A NOTE ON STRING HANDLING:
-
-  If you just pass a string on the command line to your Python script, or use
-  string interpolation on a string variable, the strings will not be quoted:
-    str = "asdf"
-    args = [ str, "--value=$str" ]
-  Will yield the command line:
-    asdf --value=asdf
-  The unquoted asdf string will not be valid input to this function, which
-  accepts only quoted strings like GN scripts. In such cases, you can just use
-  the Python string literal directly.
-
-  The main use cases for this is for other types, in particular lists. When
-  using string interpolation on a list (as in the top example) the embedded
-  strings will be quoted and escaped according to GN rules so the list can be
-  re-parsed to get the same result."""
-  parser = GNValueParser(input_string)
-  return parser.Parse()
-
-
-def FromGNArgs(input_string):
-  """Converts a string with a bunch of gn arg assignments into a Python dict.
-
-  Given a whitespace-separated list of
-
-    <ident> = (integer | string | boolean | <list of the former>)
-
-  gn assignments, this returns a Python dict, i.e.:
-
-    FromGNArgs("foo=true\nbar=1\n") -> { 'foo': True, 'bar': 1 }.
-
-  Only simple types and lists supported; variables, structs, calls
-  and other, more complicated things are not.
-
-  This routine is meant to handle only the simple sorts of values that
-  arise in parsing --args.
-  """
-  parser = GNValueParser(input_string)
-  return parser.ParseArgs()
-
-
-def UnescapeGNString(value):
-  """Given a string with GN escaping, returns the unescaped string.
-
-  Be careful not to feed with input from a Python parsing function like
-  'ast' because it will do Python unescaping, which will be incorrect when
-  fed into the GN unescaper."""
-  result = ''
-  i = 0
-  while i < len(value):
-    if value[i] == '\\':
-      if i < len(value) - 1:
-        next_char = value[i + 1]
-        if next_char in ('$', '"', '\\'):
-          # These are the escaped characters GN supports.
-          result += next_char
-          i += 1
-        else:
-          # Any other backslash is a literal.
-          result += '\\'
-    else:
-      result += value[i]
-    i += 1
-  return result
-
-
-def _IsDigitOrMinus(char):
-  return char in "-0123456789"
-
-
-class GNValueParser(object):
-  """Duplicates GN parsing of values and converts to Python types.
-
-  Normally you would use the wrapper function FromGNValue() below.
-
-  If you expect input as a specific type, you can also call one of the Parse*
-  functions directly. All functions throw GNException on invalid input. """
-  def __init__(self, string):
-    self.input = string
-    self.cur = 0
-
-  def IsDone(self):
-    return self.cur == len(self.input)
-
-  def ConsumeWhitespace(self):
-    while not self.IsDone() and self.input[self.cur] in ' \t\n':
-      self.cur += 1
-
-  def Parse(self):
-    """Converts a string representing a printed GN value to the Python type.
-
-    See additional usage notes on FromGNString above.
-
-    - GN booleans ('true', 'false') will be converted to Python booleans.
-
-    - GN numbers ('123') will be converted to Python numbers.
-
-    - GN strings (double-quoted as in '"asdf"') will be converted to Python
-      strings with GN escaping rules. GN string interpolation (embedded
-      variables preceeded by $) are not supported and will be returned as
-      literals.
-
-    - GN lists ('[1, "asdf", 3]') will be converted to Python lists.
-
-    - GN scopes ('{ ... }') are not supported."""
-    result = self._ParseAllowTrailing()
-    self.ConsumeWhitespace()
-    if not self.IsDone():
-      raise GNException("Trailing input after parsing:\n  " +
-                        self.input[self.cur:])
-    return result
-
-  def ParseArgs(self):
-    """Converts a whitespace-separated list of ident=literals to a dict.
-
-    See additional usage notes on FromGNArgs, above.
-    """
-    d = {}
-
-    self.ConsumeWhitespace()
-    while not self.IsDone():
-      ident = self._ParseIdent()
-      self.ConsumeWhitespace()
-      if self.input[self.cur] != '=':
-        raise GNException("Unexpected token: " + self.input[self.cur:])
-      self.cur += 1
-      self.ConsumeWhitespace()
-      val = self._ParseAllowTrailing()
-      self.ConsumeWhitespace()
-      d[ident] = val
-
-    return d
-
-  def _ParseAllowTrailing(self):
-    """Internal version of Parse that doesn't check for trailing stuff."""
-    self.ConsumeWhitespace()
-    if self.IsDone():
-      raise GNException("Expected input to parse.")
-
-    next_char = self.input[self.cur]
-    if next_char == '[':
-      return self.ParseList()
-    elif _IsDigitOrMinus(next_char):
-      return self.ParseNumber()
-    elif next_char == '"':
-      return self.ParseString()
-    elif self._ConstantFollows('true'):
-      return True
-    elif self._ConstantFollows('false'):
-      return False
-    else:
-      raise GNException("Unexpected token: " + self.input[self.cur:])
-
-  def _ParseIdent(self):
-    ident = ''
-
-    next_char = self.input[self.cur]
-    if not next_char.isalpha() and not next_char=='_':
-      raise GNException("Expected an identifier: " + self.input[self.cur:])
-
-    ident += next_char
-    self.cur += 1
-
-    next_char = self.input[self.cur]
-    while next_char.isalpha() or next_char.isdigit() or next_char=='_':
-      ident += next_char
-      self.cur += 1
-      next_char = self.input[self.cur]
-
-    return ident
-
-  def ParseNumber(self):
-    self.ConsumeWhitespace()
-    if self.IsDone():
-      raise GNException('Expected number but got nothing.')
-
-    begin = self.cur
-
-    # The first character can include a negative sign.
-    if not self.IsDone() and _IsDigitOrMinus(self.input[self.cur]):
-      self.cur += 1
-    while not self.IsDone() and self.input[self.cur].isdigit():
-      self.cur += 1
-
-    number_string = self.input[begin:self.cur]
-    if not len(number_string) or number_string == '-':
-      raise GNException("Not a valid number.")
-    return int(number_string)
-
-  def ParseString(self):
-    self.ConsumeWhitespace()
-    if self.IsDone():
-      raise GNException('Expected string but got nothing.')
-
-    if self.input[self.cur] != '"':
-      raise GNException('Expected string beginning in a " but got:\n  ' +
-                        self.input[self.cur:])
-    self.cur += 1  # Skip over quote.
-
-    begin = self.cur
-    while not self.IsDone() and self.input[self.cur] != '"':
-      if self.input[self.cur] == '\\':
-        self.cur += 1  # Skip over the backslash.
-        if self.IsDone():
-          raise GNException("String ends in a backslash in:\n  " +
-                            self.input)
-      self.cur += 1
-
-    if self.IsDone():
-      raise GNException('Unterminated string:\n  ' + self.input[begin:])
-
-    end = self.cur
-    self.cur += 1  # Consume trailing ".
-
-    return UnescapeGNString(self.input[begin:end])
-
-  def ParseList(self):
-    self.ConsumeWhitespace()
-    if self.IsDone():
-      raise GNException('Expected list but got nothing.')
-
-    # Skip over opening '['.
-    if self.input[self.cur] != '[':
-      raise GNException("Expected [ for list but got:\n  " +
-                        self.input[self.cur:])
-    self.cur += 1
-    self.ConsumeWhitespace()
-    if self.IsDone():
-      raise GNException("Unterminated list:\n  " + self.input)
-
-    list_result = []
-    previous_had_trailing_comma = True
-    while not self.IsDone():
-      if self.input[self.cur] == ']':
-        self.cur += 1  # Skip over ']'.
-        return list_result
-
-      if not previous_had_trailing_comma:
-        raise GNException("List items not separated by comma.")
-
-      list_result += [ self._ParseAllowTrailing() ]
-      self.ConsumeWhitespace()
-      if self.IsDone():
-        break
-
-      # Consume comma if there is one.
-      previous_had_trailing_comma = self.input[self.cur] == ','
-      if previous_had_trailing_comma:
-        # Consume comma.
-        self.cur += 1
-        self.ConsumeWhitespace()
-
-    raise GNException("Unterminated list:\n  " + self.input)
-
-  def _ConstantFollows(self, constant):
-    """Returns true if the given constant follows immediately at the current
-    location in the input. If it does, the text is consumed and the function
-    returns true. Otherwise, returns false and the current position is
-    unchanged."""
-    end = self.cur + len(constant)
-    if end > len(self.input):
-      return False  # Not enough room.
-    if self.input[self.cur:end] == constant:
-      self.cur = end
-      return True
-    return False
diff --git a/gen/mojo/common/common_custom_types__type_mappings b/gen/mojo/common/common_custom_types__type_mappings
deleted file mode 100644
index 1906049..0000000
--- a/gen/mojo/common/common_custom_types__type_mappings
+++ /dev/null
@@ -1,193 +0,0 @@
-{
-  "c++": {
-    "mojo.common.mojom.Value": {
-      "hashable": false, 
-      "typename": "std::unique_ptr<base::Value>", 
-      "traits_headers": [
-        "ipc/ipc_message_utils.h", 
-        "mojo/common/values_struct_traits.h"
-      ], 
-      "copyable_pass_by_value": false, 
-      "move_only": true, 
-      "nullable_is_same_type": true, 
-      "non_copyable_non_movable": false, 
-      "public_headers": [
-        "base/values.h"
-      ]
-    }, 
-    "mojo.common.mojom.UnguessableToken": {
-      "hashable": false, 
-      "typename": "base::UnguessableToken", 
-      "traits_headers": [
-        "mojo/common/common_custom_types_struct_traits.h"
-      ], 
-      "copyable_pass_by_value": false, 
-      "move_only": false, 
-      "nullable_is_same_type": false, 
-      "non_copyable_non_movable": false, 
-      "public_headers": [
-        "base/unguessable_token.h"
-      ]
-    }, 
-    "mojo.common.mojom.TextDirection": {
-      "hashable": false, 
-      "typename": "base::i18n::TextDirection", 
-      "traits_headers": [
-        "mojo/common/common_custom_types_struct_traits.h"
-      ], 
-      "copyable_pass_by_value": false, 
-      "move_only": false, 
-      "nullable_is_same_type": false, 
-      "non_copyable_non_movable": false, 
-      "public_headers": [
-        "base/i18n/rtl.h"
-      ]
-    }, 
-    "mojo.common.mojom.ListValue": {
-      "hashable": false, 
-      "typename": "std::unique_ptr<base::ListValue>", 
-      "traits_headers": [
-        "ipc/ipc_message_utils.h", 
-        "mojo/common/values_struct_traits.h"
-      ], 
-      "copyable_pass_by_value": false, 
-      "move_only": true, 
-      "nullable_is_same_type": true, 
-      "non_copyable_non_movable": false, 
-      "public_headers": [
-        "base/values.h"
-      ]
-    }, 
-    "mojo.common.mojom.String16": {
-      "hashable": false, 
-      "typename": "base::string16", 
-      "traits_headers": [
-        "mojo/common/common_custom_types_struct_traits.h"
-      ], 
-      "copyable_pass_by_value": false, 
-      "move_only": false, 
-      "nullable_is_same_type": false, 
-      "non_copyable_non_movable": false, 
-      "public_headers": [
-        "base/strings/string16.h"
-      ]
-    }, 
-    "mojo.common.mojom.Time": {
-      "hashable": false, 
-      "typename": "base::Time", 
-      "traits_headers": [
-        "ipc/ipc_message_utils.h", 
-        "mojo/common/common_custom_types_struct_traits.h"
-      ], 
-      "copyable_pass_by_value": true, 
-      "move_only": false, 
-      "nullable_is_same_type": false, 
-      "non_copyable_non_movable": false, 
-      "public_headers": [
-        "base/time/time.h"
-      ]
-    }, 
-    "mojo.common.mojom.TimeDelta": {
-      "hashable": false, 
-      "typename": "base::TimeDelta", 
-      "traits_headers": [
-        "ipc/ipc_message_utils.h", 
-        "mojo/common/common_custom_types_struct_traits.h"
-      ], 
-      "copyable_pass_by_value": true, 
-      "move_only": false, 
-      "nullable_is_same_type": false, 
-      "non_copyable_non_movable": false, 
-      "public_headers": [
-        "base/time/time.h"
-      ]
-    }, 
-    "mojo.common.mojom.TimeTicks": {
-      "hashable": false, 
-      "typename": "base::TimeTicks", 
-      "traits_headers": [
-        "ipc/ipc_message_utils.h", 
-        "mojo/common/common_custom_types_struct_traits.h"
-      ], 
-      "copyable_pass_by_value": true, 
-      "move_only": false, 
-      "nullable_is_same_type": false, 
-      "non_copyable_non_movable": false, 
-      "public_headers": [
-        "base/time/time.h"
-      ]
-    }, 
-    "mojo.common.mojom.LegacyListValue": {
-      "hashable": false, 
-      "typename": "base::ListValue", 
-      "traits_headers": [
-        "ipc/ipc_message_utils.h", 
-        "mojo/common/values_struct_traits.h"
-      ], 
-      "copyable_pass_by_value": false, 
-      "move_only": false, 
-      "nullable_is_same_type": false, 
-      "non_copyable_non_movable": true, 
-      "public_headers": [
-        "base/values.h"
-      ]
-    }, 
-    "mojo.common.mojom.File": {
-      "hashable": false, 
-      "typename": "base::File", 
-      "traits_headers": [
-        "mojo/common/common_custom_types_struct_traits.h"
-      ], 
-      "copyable_pass_by_value": false, 
-      "move_only": true, 
-      "nullable_is_same_type": true, 
-      "non_copyable_non_movable": false, 
-      "public_headers": [
-        "base/files/file.h"
-      ]
-    }, 
-    "mojo.common.mojom.FilePath": {
-      "hashable": false, 
-      "typename": "base::FilePath", 
-      "traits_headers": [
-        "ipc/ipc_message_utils.h"
-      ], 
-      "copyable_pass_by_value": false, 
-      "move_only": false, 
-      "nullable_is_same_type": false, 
-      "non_copyable_non_movable": false, 
-      "public_headers": [
-        "base/files/file_path.h"
-      ]
-    }, 
-    "mojo.common.mojom.DictionaryValue": {
-      "hashable": false, 
-      "typename": "std::unique_ptr<base::DictionaryValue>", 
-      "traits_headers": [
-        "ipc/ipc_message_utils.h", 
-        "mojo/common/values_struct_traits.h"
-      ], 
-      "copyable_pass_by_value": false, 
-      "move_only": true, 
-      "nullable_is_same_type": true, 
-      "non_copyable_non_movable": false, 
-      "public_headers": [
-        "base/values.h"
-      ]
-    }, 
-    "mojo.common.mojom.Version": {
-      "hashable": false, 
-      "typename": "base::Version", 
-      "traits_headers": [
-        "mojo/common/common_custom_types_struct_traits.h"
-      ], 
-      "copyable_pass_by_value": false, 
-      "move_only": false, 
-      "nullable_is_same_type": false, 
-      "non_copyable_non_movable": false, 
-      "public_headers": [
-        "base/version.h"
-      ]
-    }
-  }
-}
\ No newline at end of file
diff --git a/ipc/ipc.mojom b/ipc/ipc.mojom
deleted file mode 100644
index 0a4fcfa..0000000
--- a/ipc/ipc.mojom
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module IPC.mojom;
-
-// NOTE: This MUST match the value of MSG_ROUTING_NONE in src/ipc/ipc_message.h.
-const int32 kRoutingIdNone = -2;
-
-struct SerializedHandle {
-  handle the_handle;
-
-  enum Type {
-    MOJO_HANDLE,
-    PLATFORM_FILE,
-    WIN_HANDLE,
-    MACH_PORT,
-  };
-
-  Type type;
-};
-
-// A placeholder interface type since we don't yet support generic associated
-// message pipe handles.
-interface GenericInterface {};
-
-interface Channel {
-  // Informs the remote end of this client's PID. Must be called exactly once,
-  // before any calls to Receive() below.
-  SetPeerPid(int32 pid);
-
-  // Transmits a classical Chrome IPC message.
-  Receive(array<uint8> data, array<SerializedHandle>? handles);
-
-  // Requests a Channel-associated interface.
-  GetAssociatedInterface(string name, associated GenericInterface& request);
-};
-
-// A strictly nominal interface used to identify Channel bootstrap requests.
-interface ChannelBootstrap {};
diff --git a/ipc/ipc_channel_handle.h b/ipc/ipc_channel_handle.h
deleted file mode 100644
index ef31b84..0000000
--- a/ipc/ipc_channel_handle.h
+++ /dev/null
@@ -1,41 +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.
-
-#ifndef IPC_IPC_CHANNEL_HANDLE_H_
-#define IPC_IPC_CHANNEL_HANDLE_H_
-
-#include <string>
-
-#include "build/build_config.h"
-#include "mojo/public/cpp/system/message_pipe.h"
-
-#if defined(OS_NACL_SFI)
-#include "base/file_descriptor_posix.h"
-#endif  // defined (OS_NACL_SFI)
-
-namespace IPC {
-
-// Note that serialization for this object is defined in the ParamTraits
-// template specialization in ipc_message_utils.h.
-#if defined(OS_NACL_SFI)
-struct ChannelHandle {
-  ChannelHandle() {}
-  explicit ChannelHandle(const base::FileDescriptor& s) : socket(s) {}
-
-  base::FileDescriptor socket;
-};
-#else
-struct ChannelHandle {
-  ChannelHandle() {}
-  ChannelHandle(mojo::MessagePipeHandle h) : mojo_handle(h) {}
-
-  bool is_mojo_channel_handle() const { return mojo_handle.is_valid(); }
-
-  mojo::MessagePipeHandle mojo_handle;
-};
-#endif  // defined(OS_NACL_SFI)
-
-}  // namespace IPC
-
-#endif  // IPC_IPC_CHANNEL_HANDLE_H_
diff --git a/ipc/ipc_export.h b/ipc/ipc_export.h
deleted file mode 100644
index e1cbe88..0000000
--- a/ipc/ipc_export.h
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright (c) 2011 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 IPC_IPC_EXPORT_H_
-#define IPC_IPC_EXPORT_H_
-
-// Defines IPC_EXPORT so that functionality implemented by the IPC module can be
-// exported to consumers.
-
-#if defined(COMPONENT_BUILD)
-#if defined(WIN32)
-
-#if defined(IPC_IMPLEMENTATION)
-#define IPC_EXPORT __declspec(dllexport)
-#else
-#define IPC_EXPORT __declspec(dllimport)
-#endif  // defined(IPC_IMPLEMENTATION)
-
-#else  // defined(WIN32)
-
-#if defined(IPC_IMPLEMENTATION)
-#define IPC_EXPORT __attribute__((visibility("default")))
-#else
-#define IPC_EXPORT
-#endif
-
-#endif
-
-#else  // defined(COMPONENT_BUILD)
-#define IPC_EXPORT
-#endif
-
-#endif  // IPC_IPC_EXPORT_H_
diff --git a/ipc/ipc_listener.h b/ipc/ipc_listener.h
deleted file mode 100644
index d7ad75c..0000000
--- a/ipc/ipc_listener.h
+++ /dev/null
@@ -1,60 +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.
-
-#ifndef IPC_IPC_LISTENER_H_
-#define IPC_IPC_LISTENER_H_
-
-#include <stdint.h>
-
-#include <string>
-
-#include "build/build_config.h"
-#include "ipc/ipc_export.h"
-#include "mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h"
-
-namespace IPC {
-
-class Message;
-
-// Implemented by consumers of a Channel to receive messages.
-class IPC_EXPORT Listener {
- public:
-  // Called when a message is received.  Returns true iff the message was
-  // handled.
-  virtual bool OnMessageReceived(const Message& message) = 0;
-
-  // Called when the channel is connected and we have received the internal
-  // Hello message from the peer.
-  virtual void OnChannelConnected(int32_t peer_pid) {}
-
-  // Called when an error is detected that causes the channel to close.
-  // This method is not called when a channel is closed normally.
-  virtual void OnChannelError() {}
-
-  // Called when a message's deserialization failed.
-  virtual void OnBadMessageReceived(const Message& message) {}
-
-  // Called when an associated interface request is received on a Channel and
-  // the Channel has no registered handler for it.
-  virtual void OnAssociatedInterfaceRequest(
-      const std::string& interface_name,
-      mojo::ScopedInterfaceEndpointHandle handle) {}
-
-#if defined(OS_POSIX)
-  // Called on the server side when a channel that listens for connections
-  // denies an attempt to connect.
-  virtual void OnChannelDenied() {}
-
-  // Called on the server side when a channel that listens for connections
-  // has an error that causes the listening channel to close.
-  virtual void OnChannelListenError() {}
-#endif  // OS_POSIX
-
- protected:
-  virtual ~Listener() {}
-};
-
-}  // namespace IPC
-
-#endif  // IPC_IPC_LISTENER_H_
diff --git a/ipc/ipc_message.cc b/ipc/ipc_message.cc
deleted file mode 100644
index f5e9ac7..0000000
--- a/ipc/ipc_message.cc
+++ /dev/null
@@ -1,205 +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 "ipc/ipc_message.h"
-
-#include <limits.h>
-#include <stddef.h>
-#include <stdint.h>
-
-#include "base/atomic_sequence_num.h"
-#include "base/logging.h"
-#include "build/build_config.h"
-#include "ipc/ipc_message_attachment.h"
-#include "ipc/ipc_message_attachment_set.h"
-
-#if defined(OS_POSIX)
-#include "base/file_descriptor_posix.h"
-#include "ipc/ipc_platform_file_attachment_posix.h"
-#endif
-
-namespace {
-
-base::StaticAtomicSequenceNumber g_ref_num;
-
-// Create a reference number for identifying IPC messages in traces. The return
-// values has the reference number stored in the upper 24 bits, leaving the low
-// 8 bits set to 0 for use as flags.
-inline uint32_t GetRefNumUpper24() {
-  base::trace_event::TraceLog* trace_log =
-      base::trace_event::TraceLog::GetInstance();
-  uint32_t pid = trace_log ? trace_log->process_id() : 0;
-  uint32_t count = g_ref_num.GetNext();
-  // The 24 bit hash is composed of 14 bits of the count and 10 bits of the
-  // Process ID. With the current trace event buffer cap, the 14-bit count did
-  // not appear to wrap during a trace. Note that it is not a big deal if
-  // collisions occur, as this is only used for debugging and trace analysis.
-  return ((pid << 14) | (count & 0x3fff)) << 8;
-}
-
-}  // namespace
-
-namespace IPC {
-
-//------------------------------------------------------------------------------
-
-Message::~Message() {
-}
-
-Message::Message() : base::Pickle(sizeof(Header)) {
-  header()->routing = header()->type = 0;
-  header()->flags = GetRefNumUpper24();
-#if defined(OS_POSIX)
-  header()->num_fds = 0;
-  header()->pad = 0;
-#endif
-  Init();
-}
-
-Message::Message(int32_t routing_id, uint32_t type, PriorityValue priority)
-    : base::Pickle(sizeof(Header)) {
-  header()->routing = routing_id;
-  header()->type = type;
-  DCHECK((priority & 0xffffff00) == 0);
-  header()->flags = priority | GetRefNumUpper24();
-#if defined(OS_POSIX)
-  header()->num_fds = 0;
-  header()->pad = 0;
-#endif
-  Init();
-}
-
-Message::Message(const char* data, int data_len)
-    : base::Pickle(data, data_len) {
-  Init();
-}
-
-Message::Message(const Message& other) : base::Pickle(other) {
-  Init();
-  attachment_set_ = other.attachment_set_;
-}
-
-void Message::Init() {
-  dispatch_error_ = false;
-#ifdef IPC_MESSAGE_LOG_ENABLED
-  received_time_ = 0;
-  dont_log_ = false;
-  log_data_ = NULL;
-#endif
-}
-
-Message& Message::operator=(const Message& other) {
-  *static_cast<base::Pickle*>(this) = other;
-  attachment_set_ = other.attachment_set_;
-  return *this;
-}
-
-void Message::SetHeaderValues(int32_t routing, uint32_t type, uint32_t flags) {
-  // This should only be called when the message is already empty.
-  DCHECK(payload_size() == 0);
-
-  header()->routing = routing;
-  header()->type = type;
-  header()->flags = flags;
-}
-
-void Message::EnsureMessageAttachmentSet() {
-  if (attachment_set_.get() == NULL)
-    attachment_set_ = new MessageAttachmentSet;
-}
-
-#ifdef IPC_MESSAGE_LOG_ENABLED
-void Message::set_sent_time(int64_t time) {
-  DCHECK((header()->flags & HAS_SENT_TIME_BIT) == 0);
-  header()->flags |= HAS_SENT_TIME_BIT;
-  WriteInt64(time);
-}
-
-int64_t Message::sent_time() const {
-  if ((header()->flags & HAS_SENT_TIME_BIT) == 0)
-    return 0;
-
-  const char* data = end_of_payload();
-  data -= sizeof(int64_t);
-  return *(reinterpret_cast<const int64_t*>(data));
-}
-
-void Message::set_received_time(int64_t time) const {
-  received_time_ = time;
-}
-#endif
-
-Message::NextMessageInfo::NextMessageInfo()
-    : message_size(0), message_found(false), pickle_end(nullptr),
-      message_end(nullptr) {}
-Message::NextMessageInfo::~NextMessageInfo() {}
-
-// static
-void Message::FindNext(const char* range_start,
-                       const char* range_end,
-                       NextMessageInfo* info) {
-  DCHECK(info);
-  info->message_found = false;
-  info->message_size = 0;
-
-  size_t pickle_size = 0;
-  if (!base::Pickle::PeekNext(sizeof(Header),
-                              range_start, range_end, &pickle_size))
-    return;
-
-  bool have_entire_pickle =
-      static_cast<size_t>(range_end - range_start) >= pickle_size;
-
-  info->message_size = pickle_size;
-
-  if (!have_entire_pickle)
-    return;
-
-  const char* pickle_end = range_start + pickle_size;
-
-  info->message_end = pickle_end;
-
-  info->pickle_end = pickle_end;
-  info->message_found = true;
-}
-
-bool Message::WriteAttachment(
-    scoped_refptr<base::Pickle::Attachment> attachment) {
-  size_t index;
-  bool success = attachment_set()->AddAttachment(
-      make_scoped_refptr(static_cast<MessageAttachment*>(attachment.get())),
-      &index);
-  DCHECK(success);
-
-  // NOTE: If you add more data to the pickle, make sure to update
-  // PickleSizer::AddAttachment.
-
-  // Write the index of the descriptor so that we don't have to
-  // keep the current descriptor as extra decoding state when deserialising.
-  WriteInt(static_cast<int>(index));
-
-  return success;
-}
-
-bool Message::ReadAttachment(
-    base::PickleIterator* iter,
-    scoped_refptr<base::Pickle::Attachment>* attachment) const {
-  int index;
-  if (!iter->ReadInt(&index))
-    return false;
-
-  MessageAttachmentSet* attachment_set = attachment_set_.get();
-  if (!attachment_set)
-    return false;
-
-  *attachment = attachment_set->GetAttachmentAt(index);
-
-  return nullptr != attachment->get();
-}
-
-bool Message::HasAttachments() const {
-  return attachment_set_.get() && !attachment_set_->empty();
-}
-
-}  // namespace IPC
diff --git a/ipc/ipc_message.h b/ipc/ipc_message.h
deleted file mode 100644
index 43e9ae3..0000000
--- a/ipc/ipc_message.h
+++ /dev/null
@@ -1,305 +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.
-
-#ifndef IPC_IPC_MESSAGE_H_
-#define IPC_IPC_MESSAGE_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <string>
-
-#include "base/gtest_prod_util.h"
-#include "base/memory/ref_counted.h"
-#include "base/pickle.h"
-#include "base/trace_event/trace_event.h"
-#include "build/build_config.h"
-#include "ipc/ipc_export.h"
-
-#if !defined(NDEBUG)
-#define IPC_MESSAGE_LOG_ENABLED
-#endif
-
-namespace IPC {
-
-namespace internal {
-class ChannelReader;
-}  // namespace internal
-
-//------------------------------------------------------------------------------
-
-struct LogData;
-class MessageAttachmentSet;
-
-class IPC_EXPORT Message : public base::Pickle {
- public:
-  enum PriorityValue {
-    PRIORITY_LOW = 1,
-    PRIORITY_NORMAL,
-    PRIORITY_HIGH
-  };
-
-  // Bit values used in the flags field.
-  // Upper 24 bits of flags store a reference number, so this enum is limited to
-  // 8 bits.
-  enum {
-    PRIORITY_MASK     = 0x03,  // Low 2 bits of store the priority value.
-    SYNC_BIT          = 0x04,
-    REPLY_BIT         = 0x08,
-    REPLY_ERROR_BIT   = 0x10,
-    UNBLOCK_BIT       = 0x20,
-    PUMPING_MSGS_BIT  = 0x40,
-    HAS_SENT_TIME_BIT = 0x80,
-  };
-
-  ~Message() override;
-
-  Message();
-
-  // Initialize a message with a user-defined type, priority value, and
-  // destination WebView ID.
-  Message(int32_t routing_id, uint32_t type, PriorityValue priority);
-
-  // Initializes a message from a const block of data.  The data is not copied;
-  // instead the data is merely referenced by this message.  Only const methods
-  // should be used on the message when initialized this way.
-  Message(const char* data, int data_len);
-
-  Message(const Message& other);
-  Message& operator=(const Message& other);
-
-  PriorityValue priority() const {
-    return static_cast<PriorityValue>(header()->flags & PRIORITY_MASK);
-  }
-
-  // True if this is a synchronous message.
-  void set_sync() {
-    header()->flags |= SYNC_BIT;
-  }
-  bool is_sync() const {
-    return (header()->flags & SYNC_BIT) != 0;
-  }
-
-  // Set this on a reply to a synchronous message.
-  void set_reply() {
-    header()->flags |= REPLY_BIT;
-  }
-
-  bool is_reply() const {
-    return (header()->flags & REPLY_BIT) != 0;
-  }
-
-  // Set this on a reply to a synchronous message to indicate that no receiver
-  // was found.
-  void set_reply_error() {
-    header()->flags |= REPLY_ERROR_BIT;
-  }
-
-  bool is_reply_error() const {
-    return (header()->flags & REPLY_ERROR_BIT) != 0;
-  }
-
-  // Normally when a receiver gets a message and they're blocked on a
-  // synchronous message Send, they buffer a message.  Setting this flag causes
-  // the receiver to be unblocked and the message to be dispatched immediately.
-  void set_unblock(bool unblock) {
-    if (unblock) {
-      header()->flags |= UNBLOCK_BIT;
-    } else {
-      header()->flags &= ~UNBLOCK_BIT;
-    }
-  }
-
-  bool should_unblock() const {
-    return (header()->flags & UNBLOCK_BIT) != 0;
-  }
-
-  // Tells the receiver that the caller is pumping messages while waiting
-  // for the result.
-  bool is_caller_pumping_messages() const {
-    return (header()->flags & PUMPING_MSGS_BIT) != 0;
-  }
-
-  void set_dispatch_error() const {
-    dispatch_error_ = true;
-  }
-
-  bool dispatch_error() const {
-    return dispatch_error_;
-  }
-
-  uint32_t type() const {
-    return header()->type;
-  }
-
-  int32_t routing_id() const {
-    return header()->routing;
-  }
-
-  void set_routing_id(int32_t new_id) {
-    header()->routing = new_id;
-  }
-
-  uint32_t flags() const {
-    return header()->flags;
-  }
-
-  // Sets all the given header values. The message should be empty at this
-  // call.
-  void SetHeaderValues(int32_t routing, uint32_t type, uint32_t flags);
-
-  template<class T, class S, class P>
-  static bool Dispatch(const Message* msg, T* obj, S* sender, P* parameter,
-                       void (T::*func)()) {
-    (obj->*func)();
-    return true;
-  }
-
-  template<class T, class S, class P>
-  static bool Dispatch(const Message* msg, T* obj, S* sender, P* parameter,
-                       void (T::*func)(P*)) {
-    (obj->*func)(parameter);
-    return true;
-  }
-
-  // Used for async messages with no parameters.
-  static void Log(std::string* name, const Message* msg, std::string* l) {
-  }
-
-  // The static method FindNext() returns several pieces of information, which
-  // are aggregated into an instance of this struct.
-  struct IPC_EXPORT NextMessageInfo {
-    NextMessageInfo();
-    ~NextMessageInfo();
-
-    // Total message size. Always valid if |message_found| is true.
-    // If |message_found| is false but we could determine message size
-    // from the header, this field is non-zero. Otherwise it's zero.
-    size_t message_size;
-    // Whether an entire message was found in the given memory range.
-    bool message_found;
-    // Only filled in if |message_found| is true.
-    // The start address is passed into FindNext() by the caller, so isn't
-    // repeated in this struct. The end address of the pickle should be used to
-    // construct a base::Pickle.
-    const char* pickle_end;
-    // Only filled in if |message_found| is true.
-    // The end address of the message should be used to determine the start
-    // address of the next message.
-    const char* message_end;
-  };
-
-  // |info| is an output parameter and must not be nullptr.
-  static void FindNext(const char* range_start,
-                       const char* range_end,
-                       NextMessageInfo* info);
-
-  // WriteAttachment appends |attachment| to the end of the set. It returns
-  // false iff the set is full.
-  bool WriteAttachment(
-      scoped_refptr<base::Pickle::Attachment> attachment) override;
-  // ReadAttachment parses an attachment given the parsing state |iter| and
-  // writes it to |*attachment|. It returns true on success.
-  bool ReadAttachment(
-      base::PickleIterator* iter,
-      scoped_refptr<base::Pickle::Attachment>* attachment) const override;
-  // Returns true if there are any attachment in this message.
-  bool HasAttachments() const override;
-
-#ifdef IPC_MESSAGE_LOG_ENABLED
-  // Adds the outgoing time from Time::Now() at the end of the message and sets
-  // a bit to indicate that it's been added.
-  void set_sent_time(int64_t time);
-  int64_t sent_time() const;
-
-  void set_received_time(int64_t time) const;
-  int64_t received_time() const { return received_time_; }
-  void set_output_params(const std::string& op) const { output_params_ = op; }
-  const std::string& output_params() const { return output_params_; }
-  // The following four functions are needed so we can log sync messages with
-  // delayed replies.  We stick the log data from the sent message into the
-  // reply message, so that when it's sent and we have the output parameters
-  // we can log it.  As such, we set a flag on the sent message to not log it.
-  void set_sync_log_data(LogData* data) const { log_data_ = data; }
-  LogData* sync_log_data() const { return log_data_; }
-  void set_dont_log() const { dont_log_ = true; }
-  bool dont_log() const { return dont_log_; }
-#endif
-
- protected:
-  friend class Channel;
-  friend class ChannelMojo;
-  friend class ChannelNacl;
-  friend class ChannelPosix;
-  friend class ChannelWin;
-  friend class internal::ChannelReader;
-  friend class MessageReplyDeserializer;
-  friend class SyncMessage;
-
-#pragma pack(push, 4)
-  struct Header : base::Pickle::Header {
-    int32_t routing;  // ID of the view that this message is destined for
-    uint32_t type;    // specifies the user-defined message type
-    uint32_t flags;   // specifies control flags for the message
-#if defined(OS_POSIX)
-    uint16_t num_fds; // the number of descriptors included with this message
-    uint16_t pad;     // explicitly initialize this to appease valgrind
-#endif
-  };
-#pragma pack(pop)
-
-  Header* header() {
-    return headerT<Header>();
-  }
-  const Header* header() const {
-    return headerT<Header>();
-  }
-
-  void Init();
-
-  // Used internally to support IPC::Listener::OnBadMessageReceived.
-  mutable bool dispatch_error_;
-
-  // The set of file descriptors associated with this message.
-  scoped_refptr<MessageAttachmentSet> attachment_set_;
-
-  // Ensure that a MessageAttachmentSet is allocated
-  void EnsureMessageAttachmentSet();
-
-  MessageAttachmentSet* attachment_set() {
-    EnsureMessageAttachmentSet();
-    return attachment_set_.get();
-  }
-  const MessageAttachmentSet* attachment_set() const {
-    return attachment_set_.get();
-  }
-
-#ifdef IPC_MESSAGE_LOG_ENABLED
-  // Used for logging.
-  mutable int64_t received_time_;
-  mutable std::string output_params_;
-  mutable LogData* log_data_;
-  mutable bool dont_log_;
-#endif
-
-  FRIEND_TEST_ALL_PREFIXES(IPCMessageTest, FindNext);
-  FRIEND_TEST_ALL_PREFIXES(IPCMessageTest, FindNextOverflow);
-};
-
-//------------------------------------------------------------------------------
-
-}  // namespace IPC
-
-enum SpecialRoutingIDs {
-  // indicates that we don't have a routing ID yet.
-  MSG_ROUTING_NONE = -2,
-
-  // indicates a general message not sent to a particular tab.
-  MSG_ROUTING_CONTROL = INT32_MAX,
-};
-
-#define IPC_REPLY_ID 0xFFFFFFF0  // Special message id for replies
-#define IPC_LOGGING_ID 0xFFFFFFF1  // Special message id for logging
-
-#endif  // IPC_IPC_MESSAGE_H_
diff --git a/ipc/ipc_message_attachment.cc b/ipc/ipc_message_attachment.cc
deleted file mode 100644
index 83440ae..0000000
--- a/ipc/ipc_message_attachment.cc
+++ /dev/null
@@ -1,15 +0,0 @@
-// 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 "ipc/ipc_message_attachment.h"
-
-namespace IPC {
-
-MessageAttachment::MessageAttachment() {
-}
-
-MessageAttachment::~MessageAttachment() {
-}
-
-}  // namespace IPC
diff --git a/ipc/ipc_message_attachment.h b/ipc/ipc_message_attachment.h
deleted file mode 100644
index 9ff1de8..0000000
--- a/ipc/ipc_message_attachment.h
+++ /dev/null
@@ -1,36 +0,0 @@
-// 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 IPC_IPC_MESSAGE_ATTACHMENT_H_
-#define IPC_IPC_MESSAGE_ATTACHMENT_H_
-
-#include "base/files/file.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/pickle.h"
-#include "build/build_config.h"
-#include "ipc/ipc.mojom.h"
-#include "ipc/ipc_export.h"
-
-namespace IPC {
-
-// Auxiliary data sent with |Message|. This can be a platform file descriptor
-// or a mojo |MessagePipe|. |GetType()| returns the type of the subclass.
-class IPC_EXPORT MessageAttachment : public base::Pickle::Attachment {
- public:
-  using Type = mojom::SerializedHandle::Type;
-
-  virtual Type GetType() const = 0;
-
- protected:
-  friend class base::RefCountedThreadSafe<MessageAttachment>;
-  MessageAttachment();
-  ~MessageAttachment() override;
-
-  DISALLOW_COPY_AND_ASSIGN(MessageAttachment);
-};
-
-}  // namespace IPC
-
-#endif  // IPC_IPC_MESSAGE_ATTACHMENT_H_
diff --git a/ipc/ipc_message_attachment_set.cc b/ipc/ipc_message_attachment_set.cc
deleted file mode 100644
index b9a990d..0000000
--- a/ipc/ipc_message_attachment_set.cc
+++ /dev/null
@@ -1,136 +0,0 @@
-// Copyright (c) 2011 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 "ipc/ipc_message_attachment_set.h"
-
-#include <stddef.h>
-
-#include <algorithm>
-
-#include "base/logging.h"
-#include "base/posix/eintr_wrapper.h"
-#include "build/build_config.h"
-#include "ipc/ipc_message_attachment.h"
-
-namespace IPC {
-
-namespace {
-
-unsigned count_attachments_of_type(
-    const std::vector<scoped_refptr<MessageAttachment>>& attachments,
-    MessageAttachment::Type type) {
-  unsigned count = 0;
-  for (const scoped_refptr<MessageAttachment>& attachment : attachments) {
-    if (attachment->GetType() == type)
-      ++count;
-  }
-  return count;
-}
-
-}  // namespace
-
-MessageAttachmentSet::MessageAttachmentSet()
-    : consumed_descriptor_highwater_(0) {
-}
-
-MessageAttachmentSet::~MessageAttachmentSet() {
-  if (consumed_descriptor_highwater_ == size())
-    return;
-
-  // We close all the owning descriptors. If this message should have
-  // been transmitted, then closing those with close flags set mirrors
-  // the expected behaviour.
-  //
-  // If this message was received with more descriptors than expected
-  // (which could a DOS against the browser by a rogue renderer) then all
-  // the descriptors have their close flag set and we free all the extra
-  // kernel resources.
-  LOG(WARNING) << "MessageAttachmentSet destroyed with unconsumed attachments: "
-               << consumed_descriptor_highwater_ << "/" << size();
-}
-
-unsigned MessageAttachmentSet::num_descriptors() const {
-  return count_attachments_of_type(attachments_,
-                                   MessageAttachment::Type::PLATFORM_FILE);
-}
-
-unsigned MessageAttachmentSet::size() const {
-  return static_cast<unsigned>(attachments_.size());
-}
-
-bool MessageAttachmentSet::AddAttachment(
-    scoped_refptr<MessageAttachment> attachment,
-    size_t* index) {
-#if defined(OS_POSIX)
-  if (attachment->GetType() == MessageAttachment::Type::PLATFORM_FILE &&
-      num_descriptors() == kMaxDescriptorsPerMessage) {
-    DLOG(WARNING) << "Cannot add file descriptor. MessageAttachmentSet full.";
-    return false;
-  }
-#endif
-
-  switch (attachment->GetType()) {
-    case MessageAttachment::Type::PLATFORM_FILE:
-    case MessageAttachment::Type::MOJO_HANDLE:
-    case MessageAttachment::Type::WIN_HANDLE:
-    case MessageAttachment::Type::MACH_PORT:
-      attachments_.push_back(attachment);
-      *index = attachments_.size() - 1;
-      return true;
-  }
-  return false;
-}
-
-bool MessageAttachmentSet::AddAttachment(
-    scoped_refptr<MessageAttachment> attachment) {
-  size_t index;
-  return AddAttachment(attachment, &index);
-}
-
-scoped_refptr<MessageAttachment> MessageAttachmentSet::GetAttachmentAt(
-    unsigned index) {
-  if (index >= size()) {
-    DLOG(WARNING) << "Accessing out of bound index:" << index << "/" << size();
-    return scoped_refptr<MessageAttachment>();
-  }
-
-  // We should always walk the descriptors in order, so it's reasonable to
-  // enforce this. Consider the case where a compromised renderer sends us
-  // the following message:
-  //
-  //   ExampleMsg:
-  //     num_fds:2 msg:FD(index = 1) control:SCM_RIGHTS {n, m}
-  //
-  // Here the renderer sent us a message which should have a descriptor, but
-  // actually sent two in an attempt to fill our fd table and kill us. By
-  // setting the index of the descriptor in the message to 1 (it should be
-  // 0), we would record a highwater of 1 and then consider all the
-  // descriptors to have been used.
-  //
-  // So we can either track of the use of each descriptor in a bitset, or we
-  // can enforce that we walk the indexes strictly in order.
-  //
-  // There's one more wrinkle: When logging messages, we may reparse them. So
-  // we have an exception: When the consumed_descriptor_highwater_ is at the
-  // end of the array and index 0 is requested, we reset the highwater value.
-  // TODO(morrita): This is absurd. This "wringle" disallow to introduce clearer
-  // ownership model. Only client is NaclIPCAdapter. See crbug.com/415294
-  if (index == 0 && consumed_descriptor_highwater_ == size()) {
-    consumed_descriptor_highwater_ = 0;
-  }
-
-  if (index != consumed_descriptor_highwater_)
-    return scoped_refptr<MessageAttachment>();
-
-  consumed_descriptor_highwater_ = index + 1;
-
-  return attachments_[index];
-}
-
-void MessageAttachmentSet::CommitAllDescriptors() {
-  attachments_.clear();
-  consumed_descriptor_highwater_ = 0;
-}
-
-}  // namespace IPC
diff --git a/ipc/ipc_message_attachment_set.h b/ipc/ipc_message_attachment_set.h
deleted file mode 100644
index de37211..0000000
--- a/ipc/ipc_message_attachment_set.h
+++ /dev/null
@@ -1,96 +0,0 @@
-// Copyright (c) 2011 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 IPC_IPC_MESSAGE_ATTACHMENT_SET_H_
-#define IPC_IPC_MESSAGE_ATTACHMENT_SET_H_
-
-#include <stddef.h>
-
-#include <vector>
-
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "build/build_config.h"
-#include "ipc/ipc_export.h"
-
-namespace IPC {
-
-class MessageAttachment;
-
-// -----------------------------------------------------------------------------
-// A MessageAttachmentSet is an ordered set of MessageAttachment objects
-// associated with an IPC message. All attachments are wrapped in a mojo handle
-// if necessary and sent over the mojo message pipe.
-//
-// For ChannelNacl under SFI NaCl, only Type::PLATFORM_FILE is supported. In
-// that case, the FD is sent over socket.
-// -----------------------------------------------------------------------------
-class IPC_EXPORT MessageAttachmentSet
-    : public base::RefCountedThreadSafe<MessageAttachmentSet> {
- public:
-  MessageAttachmentSet();
-
-  // Return the number of attachments
-  unsigned size() const;
-
-  // Return true if no unconsumed descriptors remain
-  bool empty() const { return attachments_.empty(); }
-
-  // Returns whether the attachment was successfully added.
-  // |index| is an output variable. On success, it contains the index of the
-  // newly added attachment.
-  bool AddAttachment(scoped_refptr<MessageAttachment> attachment,
-                     size_t* index);
-
-  // Similar to the above method, but without output variables.
-  bool AddAttachment(scoped_refptr<MessageAttachment> attachment);
-
-  // Take the nth from the beginning of the vector, Code using this /must/
-  // access the attachments in order, and must do it at most once.
-  //
-  // This interface is designed for the deserialising code as it doesn't
-  // support close flags.
-  //   returns: an attachment, or nullptr on error
-  scoped_refptr<MessageAttachment> GetAttachmentAt(unsigned index);
-
-  // Marks all the descriptors as consumed and closes those which are
-  // auto-close.
-  void CommitAllDescriptors();
-
-#if defined(OS_POSIX)
-  // This is the maximum number of descriptors per message. We need to know this
-  // because the control message kernel interface has to be given a buffer which
-  // is large enough to store all the descriptor numbers. Otherwise the kernel
-  // tells us that it truncated the control data and the extra descriptors are
-  // lost.
-  //
-  // In debugging mode, it's a fatal error to try and add more than this number
-  // of descriptors to a MessageAttachmentSet.
-  static const size_t kMaxDescriptorsPerMessage = 7;
-#endif  // OS_POSIX
-
-  // ---------------------------------------------------------------------------
-
- private:
-  friend class base::RefCountedThreadSafe<MessageAttachmentSet>;
-
-  ~MessageAttachmentSet();
-
-  // Return the number of file descriptors
-  unsigned num_descriptors() const;
-
-  std::vector<scoped_refptr<MessageAttachment>> attachments_;
-
-  // This contains the index of the next descriptor which should be consumed.
-  // It's used in a couple of ways. Firstly, at destruction we can check that
-  // all the descriptors have been read (with GetNthDescriptor). Secondly, we
-  // can check that they are read in order.
-  unsigned consumed_descriptor_highwater_;
-
-  DISALLOW_COPY_AND_ASSIGN(MessageAttachmentSet);
-};
-
-}  // namespace IPC
-
-#endif  // IPC_IPC_MESSAGE_ATTACHMENT_SET_H_
diff --git a/ipc/ipc_message_start.h b/ipc/ipc_message_start.h
deleted file mode 100644
index 1368635..0000000
--- a/ipc/ipc_message_start.h
+++ /dev/null
@@ -1,126 +0,0 @@
-// Copyright 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.
-
-#ifndef IPC_IPC_MESSAGE_START_H_
-#define IPC_IPC_MESSAGE_START_H_
-
-// Used by IPC_BEGIN_MESSAGES so that each message class starts from a unique
-// base.  Messages have unique IDs across channels in order for the IPC logging
-// code to figure out the message class from its ID.
-enum IPCMessageStart {
-  AutomationMsgStart = 0,
-  FrameMsgStart,
-  PageMsgStart,
-  ViewMsgStart,
-  InputMsgStart,
-  ProfileImportMsgStart,
-  TestMsgStart,
-  DevToolsMsgStart,
-  WorkerMsgStart,
-  NaClMsgStart,
-  UtilityMsgStart,
-  GpuChannelMsgStart,
-  GpuMsgStart,
-  MediaMsgStart,
-  ServiceMsgStart,
-  PpapiMsgStart,
-  FirefoxImporterUnittestMsgStart,
-  FileUtilitiesMsgStart,
-  DatabaseMsgStart,
-  DOMStorageMsgStart,
-  SpeechRecognitionMsgStart,
-  SafeBrowsingMsgStart,
-  P2PMsgStart,
-  ResourceMsgStart,
-  FileSystemMsgStart,
-  ChildProcessMsgStart,
-  ClipboardMsgStart,
-  BlobMsgStart,
-  AppCacheMsgStart,
-  AudioMsgStart,
-  MidiMsgStart,
-  ChromeMsgStart,
-  DragMsgStart,
-  PrintMsgStart,
-  SpellCheckMsgStart,
-  ExtensionMsgStart,
-  VideoCaptureMsgStart,
-  QuotaMsgStart,
-  TextInputClientMsgStart,
-  ChromeUtilityMsgStart,
-  MediaStreamMsgStart,
-  ChromeBenchmarkingMsgStart,
-  JavaBridgeMsgStart,
-  GamepadMsgStart,
-  ShellMsgStart,
-  AccessibilityMsgStart,
-  PrefetchMsgStart,
-  PrerenderMsgStart,
-  ChromotingMsgStart,
-  BrowserPluginMsgStart,
-  AndroidWebViewMsgStart,
-  MetroViewerMsgStart,
-  CCMsgStart,
-  MediaPlayerMsgStart,
-  TracingMsgStart,
-  PeerConnectionTrackerMsgStart,
-  VisitedLinkMsgStart,
-  AppShimMsgStart,
-  WebRtcLoggingMsgStart,
-  TtsMsgStart,
-  WebSocketMsgStart,
-  NaClHostMsgStart,
-  WebRTCIdentityMsgStart,
-  PowerMonitorMsgStart,
-  EncryptedMediaMsgStart,
-  CacheStorageMsgStart,
-  ServiceWorkerMsgStart,
-  MessagePortMsgStart,
-  EmbeddedWorkerMsgStart,
-  EmbeddedWorkerContextMsgStart,
-  CastMsgStart,
-  CdmMsgStart,
-  MediaStreamTrackMetricsHostMsgStart,
-  ChromeExtensionMsgStart,
-  PushMessagingMsgStart,
-  GinJavaBridgeMsgStart,
-  ChromeUtilityPrintingMsgStart,
-  AecDumpMsgStart,
-  OzoneGpuMsgStart,
-  ChromeUtilityExtensionsMsgStart,
-  PlatformNotificationMsgStart,
-  PDFMsgStart,
-  ManifestManagerMsgStart,
-  LayoutTestMsgStart,
-  NetworkHintsMsgStart,
-  BluetoothMsgStart,
-  CastMediaMsgStart,
-  AwMessagePortMsgStart,
-  SyncCompositorMsgStart,
-  ExtensionsGuestViewMsgStart,
-  GuestViewMsgStart,
-  // Note: CastCryptoMsgStart and CastChannelMsgStart reserved for Chromecast
-  // internal code. Contact gunsch@ before changing/removing.
-  CastCryptoMsgStart,
-  CastChannelMsgStart,
-  DataReductionProxyStart,
-  ChromeAppBannerMsgStart,
-  AttachmentBrokerMsgStart,
-  RenderProcessMsgStart,
-  PageLoadMetricsMsgStart,
-  MemoryMsgStart,
-  IPCTestMsgStart,
-  ArcInstanceMsgStart,
-  ArcInstanceHostMsgStart,
-  DistillerMsgStart,
-  ArcCameraMsgStart,
-  DWriteFontProxyMsgStart,
-  MediaPlayerDelegateMsgStart,
-  SurfaceViewManagerMsgStart,
-  ExtensionWorkerMsgStart,
-  SubresourceFilterMsgStart,
-  LastIPCMsgStart  // Must come last.
-};
-
-#endif  // IPC_IPC_MESSAGE_START_H_
diff --git a/ipc/ipc_message_utils.cc b/ipc/ipc_message_utils.cc
deleted file mode 100644
index bf8daa5..0000000
--- a/ipc/ipc_message_utils.cc
+++ /dev/null
@@ -1,1238 +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 "ipc/ipc_message_utils.h"
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include "base/files/file_path.h"
-#include "base/json/json_writer.h"
-#include "base/strings/nullable_string16.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/utf_string_conversions.h"
-#include "base/time/time.h"
-#include "base/unguessable_token.h"
-#include "base/values.h"
-#include "build/build_config.h"
-#include "ipc/ipc_channel_handle.h"
-#include "ipc/ipc_message_attachment.h"
-#include "ipc/ipc_message_attachment_set.h"
-#include "ipc/ipc_mojo_param_traits.h"
-
-#if defined(OS_POSIX)
-#include "base/file_descriptor_posix.h"
-#include "ipc/ipc_platform_file_attachment_posix.h"
-#endif
-
-#if (defined(OS_MACOSX) && !defined(OS_IOS)) || defined(OS_WIN)
-#include "base/memory/shared_memory_handle.h"
-#endif  // (defined(OS_MACOSX) && !defined(OS_IOS)) || defined(OS_WIN)
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-#include "ipc/mach_port_mac.h"
-#endif
-
-#if defined(OS_WIN)
-#include <tchar.h>
-#include "ipc/handle_win.h"
-#endif
-
-namespace IPC {
-
-namespace {
-
-const int kMaxRecursionDepth = 200;
-
-template<typename CharType>
-void LogBytes(const std::vector<CharType>& data, std::string* out) {
-#if defined(OS_WIN)
-  // Windows has a GUI for logging, which can handle arbitrary binary data.
-  for (size_t i = 0; i < data.size(); ++i)
-    out->push_back(data[i]);
-#else
-  // On POSIX, we log to stdout, which we assume can display ASCII.
-  static const size_t kMaxBytesToLog = 100;
-  for (size_t i = 0; i < std::min(data.size(), kMaxBytesToLog); ++i) {
-    if (isprint(data[i]))
-      out->push_back(data[i]);
-    else
-      out->append(
-          base::StringPrintf("[%02X]", static_cast<unsigned char>(data[i])));
-  }
-  if (data.size() > kMaxBytesToLog) {
-    out->append(base::StringPrintf(
-        " and %u more bytes",
-        static_cast<unsigned>(data.size() - kMaxBytesToLog)));
-  }
-#endif
-}
-
-bool ReadValue(const base::Pickle* m,
-               base::PickleIterator* iter,
-               base::Value** value,
-               int recursion);
-
-void GetValueSize(base::PickleSizer* sizer,
-                  const base::Value* value,
-                  int recursion) {
-  if (recursion > kMaxRecursionDepth) {
-    LOG(ERROR) << "Max recursion depth hit in GetValueSize.";
-    return;
-  }
-
-  sizer->AddInt();
-  switch (value->GetType()) {
-    case base::Value::Type::NONE:
-      break;
-    case base::Value::Type::BOOLEAN:
-      sizer->AddBool();
-      break;
-    case base::Value::Type::INTEGER:
-      sizer->AddInt();
-      break;
-    case base::Value::Type::DOUBLE:
-      sizer->AddDouble();
-      break;
-    case base::Value::Type::STRING: {
-      const base::Value* result;
-      value->GetAsString(&result);
-      if (value->GetAsString(&result)) {
-        DCHECK(result);
-        GetParamSize(sizer, result->GetString());
-      } else {
-        std::string str;
-        bool as_string_result = value->GetAsString(&str);
-        DCHECK(as_string_result);
-        GetParamSize(sizer, str);
-      }
-      break;
-    }
-    case base::Value::Type::BINARY: {
-      sizer->AddData(static_cast<int>(value->GetSize()));
-      break;
-    }
-    case base::Value::Type::DICTIONARY: {
-      sizer->AddInt();
-      const base::DictionaryValue* dict =
-          static_cast<const base::DictionaryValue*>(value);
-      for (base::DictionaryValue::Iterator it(*dict); !it.IsAtEnd();
-           it.Advance()) {
-        GetParamSize(sizer, it.key());
-        GetValueSize(sizer, &it.value(), recursion + 1);
-      }
-      break;
-    }
-    case base::Value::Type::LIST: {
-      sizer->AddInt();
-      const base::ListValue* list = static_cast<const base::ListValue*>(value);
-      for (const auto& entry : *list) {
-        GetValueSize(sizer, entry.get(), recursion + 1);
-      }
-      break;
-    }
-    default:
-      NOTREACHED() << "Invalid base::Value type.";
-  }
-}
-
-void WriteValue(base::Pickle* m, const base::Value* value, int recursion) {
-  bool result;
-  if (recursion > kMaxRecursionDepth) {
-    LOG(ERROR) << "Max recursion depth hit in WriteValue.";
-    return;
-  }
-
-  m->WriteInt(static_cast<int>(value->GetType()));
-
-  switch (value->GetType()) {
-    case base::Value::Type::NONE:
-    break;
-    case base::Value::Type::BOOLEAN: {
-      bool val;
-      result = value->GetAsBoolean(&val);
-      DCHECK(result);
-      WriteParam(m, val);
-      break;
-    }
-    case base::Value::Type::INTEGER: {
-      int val;
-      result = value->GetAsInteger(&val);
-      DCHECK(result);
-      WriteParam(m, val);
-      break;
-    }
-    case base::Value::Type::DOUBLE: {
-      double val;
-      result = value->GetAsDouble(&val);
-      DCHECK(result);
-      WriteParam(m, val);
-      break;
-    }
-    case base::Value::Type::STRING: {
-      std::string val;
-      result = value->GetAsString(&val);
-      DCHECK(result);
-      WriteParam(m, val);
-      break;
-    }
-    case base::Value::Type::BINARY: {
-      m->WriteData(value->GetBuffer(), static_cast<int>(value->GetSize()));
-      break;
-    }
-    case base::Value::Type::DICTIONARY: {
-      const base::DictionaryValue* dict =
-          static_cast<const base::DictionaryValue*>(value);
-
-      WriteParam(m, static_cast<int>(dict->size()));
-
-      for (base::DictionaryValue::Iterator it(*dict); !it.IsAtEnd();
-           it.Advance()) {
-        WriteParam(m, it.key());
-        WriteValue(m, &it.value(), recursion + 1);
-      }
-      break;
-    }
-    case base::Value::Type::LIST: {
-      const base::ListValue* list = static_cast<const base::ListValue*>(value);
-      WriteParam(m, static_cast<int>(list->GetSize()));
-      for (const auto& entry : *list) {
-        WriteValue(m, entry.get(), recursion + 1);
-      }
-      break;
-    }
-  }
-}
-
-// Helper for ReadValue that reads a DictionaryValue into a pre-allocated
-// object.
-bool ReadDictionaryValue(const base::Pickle* m,
-                         base::PickleIterator* iter,
-                         base::DictionaryValue* value,
-                         int recursion) {
-  int size;
-  if (!ReadParam(m, iter, &size))
-    return false;
-
-  for (int i = 0; i < size; ++i) {
-    std::string key;
-    base::Value* subval;
-    if (!ReadParam(m, iter, &key) ||
-        !ReadValue(m, iter, &subval, recursion + 1))
-      return false;
-    value->SetWithoutPathExpansion(key, subval);
-  }
-
-  return true;
-}
-
-// Helper for ReadValue that reads a ReadListValue into a pre-allocated
-// object.
-bool ReadListValue(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   base::ListValue* value,
-                   int recursion) {
-  int size;
-  if (!ReadParam(m, iter, &size))
-    return false;
-
-  for (int i = 0; i < size; ++i) {
-    base::Value* subval;
-    if (!ReadValue(m, iter, &subval, recursion + 1))
-      return false;
-    value->Set(i, subval);
-  }
-
-  return true;
-}
-
-bool ReadValue(const base::Pickle* m,
-               base::PickleIterator* iter,
-               base::Value** value,
-               int recursion) {
-  if (recursion > kMaxRecursionDepth) {
-    LOG(ERROR) << "Max recursion depth hit in ReadValue.";
-    return false;
-  }
-
-  int type;
-  if (!ReadParam(m, iter, &type))
-    return false;
-
-  switch (static_cast<base::Value::Type>(type)) {
-    case base::Value::Type::NONE:
-      *value = base::Value::CreateNullValue().release();
-    break;
-    case base::Value::Type::BOOLEAN: {
-      bool val;
-      if (!ReadParam(m, iter, &val))
-        return false;
-      *value = new base::Value(val);
-      break;
-    }
-    case base::Value::Type::INTEGER: {
-      int val;
-      if (!ReadParam(m, iter, &val))
-        return false;
-      *value = new base::Value(val);
-      break;
-    }
-    case base::Value::Type::DOUBLE: {
-      double val;
-      if (!ReadParam(m, iter, &val))
-        return false;
-      *value = new base::Value(val);
-      break;
-    }
-    case base::Value::Type::STRING: {
-      std::string val;
-      if (!ReadParam(m, iter, &val))
-        return false;
-      *value = new base::Value(val);
-      break;
-    }
-    case base::Value::Type::BINARY: {
-      const char* data;
-      int length;
-      if (!iter->ReadData(&data, &length))
-        return false;
-      std::unique_ptr<base::BinaryValue> val =
-          base::BinaryValue::CreateWithCopiedBuffer(data, length);
-      *value = val.release();
-      break;
-    }
-    case base::Value::Type::DICTIONARY: {
-      std::unique_ptr<base::DictionaryValue> val(new base::DictionaryValue());
-      if (!ReadDictionaryValue(m, iter, val.get(), recursion))
-        return false;
-      *value = val.release();
-      break;
-    }
-    case base::Value::Type::LIST: {
-      std::unique_ptr<base::ListValue> val(new base::ListValue());
-      if (!ReadListValue(m, iter, val.get(), recursion))
-        return false;
-      *value = val.release();
-      break;
-    }
-    default:
-    return false;
-  }
-
-  return true;
-}
-
-}  // namespace
-
-// -----------------------------------------------------------------------------
-
-LogData::LogData()
-    : routing_id(0),
-      type(0),
-      sent(0),
-      receive(0),
-      dispatch(0) {
-}
-
-LogData::LogData(const LogData& other) = default;
-
-LogData::~LogData() {
-}
-
-void ParamTraits<bool>::Log(const param_type& p, std::string* l) {
-  l->append(p ? "true" : "false");
-}
-
-void ParamTraits<signed char>::GetSize(base::PickleSizer* sizer,
-                                       const param_type& p) {
-  sizer->AddBytes(sizeof(param_type));
-}
-
-void ParamTraits<signed char>::Write(base::Pickle* m, const param_type& p) {
-  m->WriteBytes(&p, sizeof(param_type));
-}
-
-bool ParamTraits<signed char>::Read(const base::Pickle* m,
-                                    base::PickleIterator* iter,
-                                    param_type* r) {
-  const char* data;
-  if (!iter->ReadBytes(&data, sizeof(param_type)))
-    return false;
-  memcpy(r, data, sizeof(param_type));
-  return true;
-}
-
-void ParamTraits<signed char>::Log(const param_type& p, std::string* l) {
-  l->append(base::IntToString(p));
-}
-
-void ParamTraits<unsigned char>::GetSize(base::PickleSizer* sizer,
-                                       const param_type& p) {
-  sizer->AddBytes(sizeof(param_type));
-}
-
-void ParamTraits<unsigned char>::Write(base::Pickle* m, const param_type& p) {
-  m->WriteBytes(&p, sizeof(param_type));
-}
-
-bool ParamTraits<unsigned char>::Read(const base::Pickle* m,
-                                      base::PickleIterator* iter,
-                                      param_type* r) {
-  const char* data;
-  if (!iter->ReadBytes(&data, sizeof(param_type)))
-    return false;
-  memcpy(r, data, sizeof(param_type));
-  return true;
-}
-
-void ParamTraits<unsigned char>::Log(const param_type& p, std::string* l) {
-  l->append(base::UintToString(p));
-}
-
-void ParamTraits<unsigned short>::GetSize(base::PickleSizer* sizer,
-                                          const param_type& p) {
-  sizer->AddBytes(sizeof(param_type));
-}
-
-void ParamTraits<unsigned short>::Write(base::Pickle* m, const param_type& p) {
-  m->WriteBytes(&p, sizeof(param_type));
-}
-
-bool ParamTraits<unsigned short>::Read(const base::Pickle* m,
-                                       base::PickleIterator* iter,
-                                       param_type* r) {
-  const char* data;
-  if (!iter->ReadBytes(&data, sizeof(param_type)))
-    return false;
-  memcpy(r, data, sizeof(param_type));
-  return true;
-}
-
-void ParamTraits<unsigned short>::Log(const param_type& p, std::string* l) {
-  l->append(base::UintToString(p));
-}
-
-void ParamTraits<int>::Log(const param_type& p, std::string* l) {
-  l->append(base::IntToString(p));
-}
-
-void ParamTraits<unsigned int>::Log(const param_type& p, std::string* l) {
-  l->append(base::UintToString(p));
-}
-
-#if defined(OS_WIN) || defined(OS_LINUX) || \
-    (defined(OS_ANDROID) && defined(ARCH_CPU_64_BITS))
-void ParamTraits<long>::Log(const param_type& p, std::string* l) {
-  l->append(base::Int64ToString(static_cast<int64_t>(p)));
-}
-
-void ParamTraits<unsigned long>::Log(const param_type& p, std::string* l) {
-  l->append(base::Uint64ToString(static_cast<uint64_t>(p)));
-}
-#endif
-
-void ParamTraits<long long>::Log(const param_type& p, std::string* l) {
-  l->append(base::Int64ToString(static_cast<int64_t>(p)));
-}
-
-void ParamTraits<unsigned long long>::Log(const param_type& p, std::string* l) {
-  l->append(base::Uint64ToString(p));
-}
-
-void ParamTraits<float>::Log(const param_type& p, std::string* l) {
-  l->append(base::StringPrintf("%e", p));
-}
-
-void ParamTraits<double>::GetSize(base::PickleSizer* sizer,
-                                  const param_type& p) {
-  sizer->AddBytes(sizeof(param_type));
-}
-
-void ParamTraits<double>::Write(base::Pickle* m, const param_type& p) {
-  m->WriteBytes(reinterpret_cast<const char*>(&p), sizeof(param_type));
-}
-
-bool ParamTraits<double>::Read(const base::Pickle* m,
-                               base::PickleIterator* iter,
-                               param_type* r) {
-  const char *data;
-  if (!iter->ReadBytes(&data, sizeof(*r))) {
-    NOTREACHED();
-    return false;
-  }
-  memcpy(r, data, sizeof(param_type));
-  return true;
-}
-
-void ParamTraits<double>::Log(const param_type& p, std::string* l) {
-  l->append(base::StringPrintf("%e", p));
-}
-
-
-void ParamTraits<std::string>::Log(const param_type& p, std::string* l) {
-  l->append(p);
-}
-
-void ParamTraits<base::string16>::Log(const param_type& p, std::string* l) {
-  l->append(base::UTF16ToUTF8(p));
-}
-
-void ParamTraits<std::vector<char>>::GetSize(base::PickleSizer* sizer,
-                                             const param_type& p) {
-  sizer->AddData(static_cast<int>(p.size()));
-}
-
-void ParamTraits<std::vector<char>>::Write(base::Pickle* m,
-                                           const param_type& p) {
-  if (p.empty()) {
-    m->WriteData(NULL, 0);
-  } else {
-    m->WriteData(&p.front(), static_cast<int>(p.size()));
-  }
-}
-
-bool ParamTraits<std::vector<char>>::Read(const base::Pickle* m,
-                                          base::PickleIterator* iter,
-                                          param_type* r) {
-  const char *data;
-  int data_size = 0;
-  if (!iter->ReadData(&data, &data_size) || data_size < 0)
-    return false;
-  r->resize(data_size);
-  if (data_size)
-    memcpy(&r->front(), data, data_size);
-  return true;
-}
-
-void ParamTraits<std::vector<char> >::Log(const param_type& p, std::string* l) {
-  LogBytes(p, l);
-}
-
-void ParamTraits<std::vector<unsigned char>>::GetSize(base::PickleSizer* sizer,
-                                                      const param_type& p) {
-  sizer->AddData(static_cast<int>(p.size()));
-}
-
-void ParamTraits<std::vector<unsigned char>>::Write(base::Pickle* m,
-                                                    const param_type& p) {
-  if (p.empty()) {
-    m->WriteData(NULL, 0);
-  } else {
-    m->WriteData(reinterpret_cast<const char*>(&p.front()),
-                 static_cast<int>(p.size()));
-  }
-}
-
-bool ParamTraits<std::vector<unsigned char>>::Read(const base::Pickle* m,
-                                                   base::PickleIterator* iter,
-                                                   param_type* r) {
-  const char *data;
-  int data_size = 0;
-  if (!iter->ReadData(&data, &data_size) || data_size < 0)
-    return false;
-  r->resize(data_size);
-  if (data_size)
-    memcpy(&r->front(), data, data_size);
-  return true;
-}
-
-void ParamTraits<std::vector<unsigned char> >::Log(const param_type& p,
-                                                   std::string* l) {
-  LogBytes(p, l);
-}
-
-void ParamTraits<std::vector<bool>>::GetSize(base::PickleSizer* sizer,
-                                             const param_type& p) {
-  GetParamSize(sizer, static_cast<int>(p.size()));
-  for (size_t i = 0; i < p.size(); ++i)
-    GetParamSize(sizer, static_cast<bool>(p[i]));
-}
-
-void ParamTraits<std::vector<bool>>::Write(base::Pickle* m,
-                                           const param_type& p) {
-  WriteParam(m, static_cast<int>(p.size()));
-  // Cast to bool below is required because libc++'s
-  // vector<bool>::const_reference is different from bool, and we want to avoid
-  // writing an extra specialization of ParamTraits for it.
-  for (size_t i = 0; i < p.size(); i++)
-    WriteParam(m, static_cast<bool>(p[i]));
-}
-
-bool ParamTraits<std::vector<bool>>::Read(const base::Pickle* m,
-                                          base::PickleIterator* iter,
-                                          param_type* r) {
-  int size;
-  // ReadLength() checks for < 0 itself.
-  if (!iter->ReadLength(&size))
-    return false;
-  r->resize(size);
-  for (int i = 0; i < size; i++) {
-    bool value;
-    if (!ReadParam(m, iter, &value))
-      return false;
-    (*r)[i] = value;
-  }
-  return true;
-}
-
-void ParamTraits<std::vector<bool> >::Log(const param_type& p, std::string* l) {
-  for (size_t i = 0; i < p.size(); ++i) {
-    if (i != 0)
-      l->push_back(' ');
-    LogParam(static_cast<bool>(p[i]), l);
-  }
-}
-
-void ParamTraits<base::DictionaryValue>::GetSize(base::PickleSizer* sizer,
-                                                 const param_type& p) {
-  GetValueSize(sizer, &p, 0);
-}
-
-void ParamTraits<base::DictionaryValue>::Write(base::Pickle* m,
-                                               const param_type& p) {
-  WriteValue(m, &p, 0);
-}
-
-bool ParamTraits<base::DictionaryValue>::Read(const base::Pickle* m,
-                                              base::PickleIterator* iter,
-                                              param_type* r) {
-  int type;
-  if (!ReadParam(m, iter, &type) ||
-      type != static_cast<int>(base::Value::Type::DICTIONARY))
-    return false;
-
-  return ReadDictionaryValue(m, iter, r, 0);
-}
-
-void ParamTraits<base::DictionaryValue>::Log(const param_type& p,
-                                             std::string* l) {
-  std::string json;
-  base::JSONWriter::Write(p, &json);
-  l->append(json);
-}
-
-#if defined(OS_POSIX)
-void ParamTraits<base::FileDescriptor>::GetSize(base::PickleSizer* sizer,
-                                                const param_type& p) {
-  GetParamSize(sizer, p.fd >= 0);
-  if (p.fd >= 0)
-    sizer->AddAttachment();
-}
-
-void ParamTraits<base::FileDescriptor>::Write(base::Pickle* m,
-                                              const param_type& p) {
-  const bool valid = p.fd >= 0;
-  WriteParam(m, valid);
-
-  if (!valid)
-    return;
-
-  if (p.auto_close) {
-    if (!m->WriteAttachment(
-            new internal::PlatformFileAttachment(base::ScopedFD(p.fd))))
-      NOTREACHED();
-  } else {
-    if (!m->WriteAttachment(new internal::PlatformFileAttachment(p.fd)))
-      NOTREACHED();
-  }
-}
-
-bool ParamTraits<base::FileDescriptor>::Read(const base::Pickle* m,
-                                             base::PickleIterator* iter,
-                                             param_type* r) {
-  *r = base::FileDescriptor();
-
-  bool valid;
-  if (!ReadParam(m, iter, &valid))
-    return false;
-
-  // TODO(morrita): Seems like this should return false.
-  if (!valid)
-    return true;
-
-  scoped_refptr<base::Pickle::Attachment> attachment;
-  if (!m->ReadAttachment(iter, &attachment))
-    return false;
-
-  if (static_cast<MessageAttachment*>(attachment.get())->GetType() !=
-      MessageAttachment::Type::PLATFORM_FILE) {
-    return false;
-  }
-
-  *r = base::FileDescriptor(
-      static_cast<internal::PlatformFileAttachment*>(attachment.get())
-          ->TakePlatformFile(),
-      true);
-  return true;
-}
-
-void ParamTraits<base::FileDescriptor>::Log(const param_type& p,
-                                            std::string* l) {
-  if (p.auto_close) {
-    l->append(base::StringPrintf("FD(%d auto-close)", p.fd));
-  } else {
-    l->append(base::StringPrintf("FD(%d)", p.fd));
-  }
-}
-#endif  // defined(OS_POSIX)
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-void ParamTraits<base::SharedMemoryHandle>::GetSize(base::PickleSizer* sizer,
-                                                    const param_type& p) {
-  GetParamSize(sizer, p.GetMemoryObject());
-  uint32_t dummy = 0;
-  GetParamSize(sizer, dummy);
-}
-
-void ParamTraits<base::SharedMemoryHandle>::Write(base::Pickle* m,
-                                                  const param_type& p) {
-  MachPortMac mach_port_mac(p.GetMemoryObject());
-  ParamTraits<MachPortMac>::Write(m, mach_port_mac);
-  size_t size = 0;
-  bool result = p.GetSize(&size);
-  DCHECK(result);
-  ParamTraits<uint32_t>::Write(m, static_cast<uint32_t>(size));
-
-  // If the caller intended to pass ownership to the IPC stack, release a
-  // reference.
-  if (p.OwnershipPassesToIPC())
-    p.Close();
-}
-
-bool ParamTraits<base::SharedMemoryHandle>::Read(const base::Pickle* m,
-                                                 base::PickleIterator* iter,
-                                                 param_type* r) {
-  MachPortMac mach_port_mac;
-  if (!ParamTraits<MachPortMac>::Read(m, iter, &mach_port_mac))
-    return false;
-
-  uint32_t size;
-  if (!ParamTraits<uint32_t>::Read(m, iter, &size))
-    return false;
-
-  *r = base::SharedMemoryHandle(mach_port_mac.get_mach_port(),
-                                static_cast<size_t>(size),
-                                base::GetCurrentProcId());
-  return true;
-}
-
-void ParamTraits<base::SharedMemoryHandle>::Log(const param_type& p,
-                                                std::string* l) {
-  l->append("Mach port: ");
-  LogParam(p.GetMemoryObject(), l);
-}
-
-#elif defined(OS_WIN)
-void ParamTraits<base::SharedMemoryHandle>::GetSize(base::PickleSizer* s,
-                                                    const param_type& p) {
-  GetParamSize(s, p.NeedsBrokering());
-  if (p.NeedsBrokering()) {
-    GetParamSize(s, p.GetHandle());
-  } else {
-    GetParamSize(s, HandleToLong(p.GetHandle()));
-  }
-}
-
-void ParamTraits<base::SharedMemoryHandle>::Write(base::Pickle* m,
-                                                  const param_type& p) {
-  m->WriteBool(p.NeedsBrokering());
-
-  if (p.NeedsBrokering()) {
-    HandleWin handle_win(p.GetHandle(), HandleWin::DUPLICATE);
-    ParamTraits<HandleWin>::Write(m, handle_win);
-
-    // If the caller intended to pass ownership to the IPC stack, release a
-    // reference.
-    if (p.OwnershipPassesToIPC() && p.BelongsToCurrentProcess())
-      p.Close();
-  } else {
-    m->WriteInt(HandleToLong(p.GetHandle()));
-  }
-}
-
-bool ParamTraits<base::SharedMemoryHandle>::Read(const base::Pickle* m,
-                                                 base::PickleIterator* iter,
-                                                 param_type* r) {
-  bool needs_brokering;
-  if (!iter->ReadBool(&needs_brokering))
-    return false;
-
-  if (needs_brokering) {
-    HandleWin handle_win;
-    if (!ParamTraits<HandleWin>::Read(m, iter, &handle_win))
-      return false;
-    *r = base::SharedMemoryHandle(handle_win.get_handle(),
-                                  base::GetCurrentProcId());
-    return true;
-  }
-
-  int handle_int;
-  if (!iter->ReadInt(&handle_int))
-    return false;
-  HANDLE handle = LongToHandle(handle_int);
-  *r = base::SharedMemoryHandle(handle, base::GetCurrentProcId());
-  return true;
-}
-
-void ParamTraits<base::SharedMemoryHandle>::Log(const param_type& p,
-                                                std::string* l) {
-  LogParam(p.GetHandle(), l);
-  l->append(" needs brokering: ");
-  LogParam(p.NeedsBrokering(), l);
-}
-#endif  // defined(OS_MACOSX) && !defined(OS_IOS)
-
-void ParamTraits<base::FilePath>::GetSize(base::PickleSizer* sizer,
-                                          const param_type& p) {
-  p.GetSizeForPickle(sizer);
-}
-
-void ParamTraits<base::FilePath>::Write(base::Pickle* m, const param_type& p) {
-  p.WriteToPickle(m);
-}
-
-bool ParamTraits<base::FilePath>::Read(const base::Pickle* m,
-                                       base::PickleIterator* iter,
-                                       param_type* r) {
-  return r->ReadFromPickle(iter);
-}
-
-void ParamTraits<base::FilePath>::Log(const param_type& p, std::string* l) {
-  ParamTraits<base::FilePath::StringType>::Log(p.value(), l);
-}
-
-void ParamTraits<base::ListValue>::GetSize(base::PickleSizer* sizer,
-                                           const param_type& p) {
-  GetValueSize(sizer, &p, 0);
-}
-
-void ParamTraits<base::ListValue>::Write(base::Pickle* m, const param_type& p) {
-  WriteValue(m, &p, 0);
-}
-
-bool ParamTraits<base::ListValue>::Read(const base::Pickle* m,
-                                        base::PickleIterator* iter,
-                                        param_type* r) {
-  int type;
-  if (!ReadParam(m, iter, &type) ||
-      type != static_cast<int>(base::Value::Type::LIST))
-    return false;
-
-  return ReadListValue(m, iter, r, 0);
-}
-
-void ParamTraits<base::ListValue>::Log(const param_type& p, std::string* l) {
-  std::string json;
-  base::JSONWriter::Write(p, &json);
-  l->append(json);
-}
-
-void ParamTraits<base::NullableString16>::GetSize(base::PickleSizer* sizer,
-                                                  const param_type& p) {
-  GetParamSize(sizer, p.string());
-  GetParamSize(sizer, p.is_null());
-}
-
-void ParamTraits<base::NullableString16>::Write(base::Pickle* m,
-                                                const param_type& p) {
-  WriteParam(m, p.string());
-  WriteParam(m, p.is_null());
-}
-
-bool ParamTraits<base::NullableString16>::Read(const base::Pickle* m,
-                                               base::PickleIterator* iter,
-                                               param_type* r) {
-  base::string16 string;
-  if (!ReadParam(m, iter, &string))
-    return false;
-  bool is_null;
-  if (!ReadParam(m, iter, &is_null))
-    return false;
-  *r = base::NullableString16(string, is_null);
-  return true;
-}
-
-void ParamTraits<base::NullableString16>::Log(const param_type& p,
-                                              std::string* l) {
-  l->append("(");
-  LogParam(p.string(), l);
-  l->append(", ");
-  LogParam(p.is_null(), l);
-  l->append(")");
-}
-
-void ParamTraits<base::File::Info>::GetSize(base::PickleSizer* sizer,
-                                            const param_type& p) {
-  GetParamSize(sizer, p.size);
-  GetParamSize(sizer, p.is_directory);
-  GetParamSize(sizer, p.last_modified.ToDoubleT());
-  GetParamSize(sizer, p.last_accessed.ToDoubleT());
-  GetParamSize(sizer, p.creation_time.ToDoubleT());
-}
-
-void ParamTraits<base::File::Info>::Write(base::Pickle* m,
-                                          const param_type& p) {
-  WriteParam(m, p.size);
-  WriteParam(m, p.is_directory);
-  WriteParam(m, p.last_modified.ToDoubleT());
-  WriteParam(m, p.last_accessed.ToDoubleT());
-  WriteParam(m, p.creation_time.ToDoubleT());
-}
-
-bool ParamTraits<base::File::Info>::Read(const base::Pickle* m,
-                                         base::PickleIterator* iter,
-                                         param_type* p) {
-  double last_modified, last_accessed, creation_time;
-  if (!ReadParam(m, iter, &p->size) ||
-      !ReadParam(m, iter, &p->is_directory) ||
-      !ReadParam(m, iter, &last_modified) ||
-      !ReadParam(m, iter, &last_accessed) ||
-      !ReadParam(m, iter, &creation_time))
-    return false;
-  p->last_modified = base::Time::FromDoubleT(last_modified);
-  p->last_accessed = base::Time::FromDoubleT(last_accessed);
-  p->creation_time = base::Time::FromDoubleT(creation_time);
-  return true;
-}
-
-void ParamTraits<base::File::Info>::Log(const param_type& p,
-                                        std::string* l) {
-  l->append("(");
-  LogParam(p.size, l);
-  l->append(",");
-  LogParam(p.is_directory, l);
-  l->append(",");
-  LogParam(p.last_modified.ToDoubleT(), l);
-  l->append(",");
-  LogParam(p.last_accessed.ToDoubleT(), l);
-  l->append(",");
-  LogParam(p.creation_time.ToDoubleT(), l);
-  l->append(")");
-}
-
-void ParamTraits<base::Time>::GetSize(base::PickleSizer* sizer,
-                                      const param_type& p) {
-  sizer->AddInt64();
-}
-
-void ParamTraits<base::Time>::Write(base::Pickle* m, const param_type& p) {
-  ParamTraits<int64_t>::Write(m, p.ToInternalValue());
-}
-
-bool ParamTraits<base::Time>::Read(const base::Pickle* m,
-                                   base::PickleIterator* iter,
-                                   param_type* r) {
-  int64_t value;
-  if (!ParamTraits<int64_t>::Read(m, iter, &value))
-    return false;
-  *r = base::Time::FromInternalValue(value);
-  return true;
-}
-
-void ParamTraits<base::Time>::Log(const param_type& p, std::string* l) {
-  ParamTraits<int64_t>::Log(p.ToInternalValue(), l);
-}
-
-void ParamTraits<base::TimeDelta>::GetSize(base::PickleSizer* sizer,
-                                           const param_type& p) {
-  sizer->AddInt64();
-}
-
-void ParamTraits<base::TimeDelta>::Write(base::Pickle* m, const param_type& p) {
-  ParamTraits<int64_t>::Write(m, p.ToInternalValue());
-}
-
-bool ParamTraits<base::TimeDelta>::Read(const base::Pickle* m,
-                                        base::PickleIterator* iter,
-                                        param_type* r) {
-  int64_t value;
-  bool ret = ParamTraits<int64_t>::Read(m, iter, &value);
-  if (ret)
-    *r = base::TimeDelta::FromInternalValue(value);
-
-  return ret;
-}
-
-void ParamTraits<base::TimeDelta>::Log(const param_type& p, std::string* l) {
-  ParamTraits<int64_t>::Log(p.ToInternalValue(), l);
-}
-
-void ParamTraits<base::TimeTicks>::GetSize(base::PickleSizer* sizer,
-                                           const param_type& p) {
-  sizer->AddInt64();
-}
-
-void ParamTraits<base::TimeTicks>::Write(base::Pickle* m, const param_type& p) {
-  ParamTraits<int64_t>::Write(m, p.ToInternalValue());
-}
-
-bool ParamTraits<base::TimeTicks>::Read(const base::Pickle* m,
-                                        base::PickleIterator* iter,
-                                        param_type* r) {
-  int64_t value;
-  bool ret = ParamTraits<int64_t>::Read(m, iter, &value);
-  if (ret)
-    *r = base::TimeTicks::FromInternalValue(value);
-
-  return ret;
-}
-
-void ParamTraits<base::TimeTicks>::Log(const param_type& p, std::string* l) {
-  ParamTraits<int64_t>::Log(p.ToInternalValue(), l);
-}
-
-// If base::UnguessableToken is no longer 128 bits, the IPC serialization logic
-// below should be updated.
-static_assert(sizeof(base::UnguessableToken) == 2 * sizeof(uint64_t),
-              "base::UnguessableToken should be of size 2 * sizeof(uint64_t).");
-
-void ParamTraits<base::UnguessableToken>::GetSize(base::PickleSizer* sizer,
-                                                  const param_type& p) {
-  sizer->AddBytes(2 * sizeof(uint64_t));
-}
-
-void ParamTraits<base::UnguessableToken>::Write(base::Pickle* m,
-                                                const param_type& p) {
-  DCHECK(!p.is_empty());
-
-  ParamTraits<uint64_t>::Write(m, p.GetHighForSerialization());
-  ParamTraits<uint64_t>::Write(m, p.GetLowForSerialization());
-}
-
-bool ParamTraits<base::UnguessableToken>::Read(const base::Pickle* m,
-                                               base::PickleIterator* iter,
-                                               param_type* r) {
-  uint64_t high, low;
-  if (!ParamTraits<uint64_t>::Read(m, iter, &high) ||
-      !ParamTraits<uint64_t>::Read(m, iter, &low))
-    return false;
-
-  // Receiving a zeroed UnguessableToken is a security issue.
-  if (high == 0 && low == 0)
-    return false;
-
-  *r = base::UnguessableToken::Deserialize(high, low);
-  return true;
-}
-
-void ParamTraits<base::UnguessableToken>::Log(const param_type& p,
-                                              std::string* l) {
-  l->append(p.ToString());
-}
-
-void ParamTraits<IPC::ChannelHandle>::GetSize(base::PickleSizer* sizer,
-                                              const param_type& p) {
-#if defined(OS_NACL_SFI)
-  GetParamSize(sizer, p.socket);
-#else
-  GetParamSize(sizer, p.mojo_handle);
-#endif
-}
-
-void ParamTraits<IPC::ChannelHandle>::Write(base::Pickle* m,
-                                            const param_type& p) {
-#if defined(OS_NACL_SFI)
-  WriteParam(m, p.socket);
-#else
-  WriteParam(m, p.mojo_handle);
-#endif
-}
-
-bool ParamTraits<IPC::ChannelHandle>::Read(const base::Pickle* m,
-                                           base::PickleIterator* iter,
-                                           param_type* r) {
-#if defined(OS_NACL_SFI)
-  return ReadParam(m, iter, &r->socket);
-#else
-  return ReadParam(m, iter, &r->mojo_handle);
-#endif
-}
-
-void ParamTraits<IPC::ChannelHandle>::Log(const param_type& p,
-                                          std::string* l) {
-  l->append("ChannelHandle(");
-#if defined(OS_NACL_SFI)
-  ParamTraits<base::FileDescriptor>::Log(p.socket, l);
-#else
-  LogParam(p.mojo_handle, l);
-#endif
-  l->append(")");
-}
-
-void ParamTraits<LogData>::GetSize(base::PickleSizer* sizer,
-                                   const param_type& p) {
-  GetParamSize(sizer, p.channel);
-  GetParamSize(sizer, p.routing_id);
-  GetParamSize(sizer, p.type);
-  GetParamSize(sizer, p.flags);
-  GetParamSize(sizer, p.sent);
-  GetParamSize(sizer, p.receive);
-  GetParamSize(sizer, p.dispatch);
-  GetParamSize(sizer, p.message_name);
-  GetParamSize(sizer, p.params);
-}
-
-void ParamTraits<LogData>::Write(base::Pickle* m, const param_type& p) {
-  WriteParam(m, p.channel);
-  WriteParam(m, p.routing_id);
-  WriteParam(m, p.type);
-  WriteParam(m, p.flags);
-  WriteParam(m, p.sent);
-  WriteParam(m, p.receive);
-  WriteParam(m, p.dispatch);
-  WriteParam(m, p.message_name);
-  WriteParam(m, p.params);
-}
-
-bool ParamTraits<LogData>::Read(const base::Pickle* m,
-                                base::PickleIterator* iter,
-                                param_type* r) {
-  return
-      ReadParam(m, iter, &r->channel) &&
-      ReadParam(m, iter, &r->routing_id) &&
-      ReadParam(m, iter, &r->type) &&
-      ReadParam(m, iter, &r->flags) &&
-      ReadParam(m, iter, &r->sent) &&
-      ReadParam(m, iter, &r->receive) &&
-      ReadParam(m, iter, &r->dispatch) &&
-      ReadParam(m, iter, &r->message_name) &&
-      ReadParam(m, iter, &r->params);
-}
-
-void ParamTraits<LogData>::Log(const param_type& p, std::string* l) {
-  // Doesn't make sense to implement this!
-}
-
-void ParamTraits<Message>::Write(base::Pickle* m, const Message& p) {
-#if defined(OS_POSIX)
-  // We don't serialize the file descriptors in the nested message, so there
-  // better not be any.
-  DCHECK(!p.HasAttachments());
-#endif
-
-  // Don't just write out the message. This is used to send messages between
-  // NaCl (Posix environment) and the browser (could be on Windows). The message
-  // header formats differ between these systems (so does handle sharing, but
-  // we already asserted we don't have any handles). So just write out the
-  // parts of the header we use.
-  //
-  // Be careful also to use only explicitly-sized types. The NaCl environment
-  // could be 64-bit and the host browser could be 32-bits. The nested message
-  // may or may not be safe to send between 32-bit and 64-bit systems, but we
-  // leave that up to the code sending the message to ensure.
-  m->WriteUInt32(static_cast<uint32_t>(p.routing_id()));
-  m->WriteUInt32(p.type());
-  m->WriteUInt32(p.flags());
-  m->WriteData(p.payload(), static_cast<uint32_t>(p.payload_size()));
-}
-
-bool ParamTraits<Message>::Read(const base::Pickle* m,
-                                base::PickleIterator* iter,
-                                Message* r) {
-  uint32_t routing_id, type, flags;
-  if (!iter->ReadUInt32(&routing_id) ||
-      !iter->ReadUInt32(&type) ||
-      !iter->ReadUInt32(&flags))
-    return false;
-
-  int payload_size;
-  const char* payload;
-  if (!iter->ReadData(&payload, &payload_size))
-    return false;
-
-  r->SetHeaderValues(static_cast<int32_t>(routing_id), type, flags);
-  return r->WriteBytes(payload, payload_size);
-}
-
-void ParamTraits<Message>::Log(const Message& p, std::string* l) {
-  l->append("<IPC::Message>");
-}
-
-#if defined(OS_WIN)
-void ParamTraits<HANDLE>::GetSize(base::PickleSizer* sizer,
-                                  const param_type& p) {
-  sizer->AddInt();
-}
-
-// Note that HWNDs/HANDLE/HCURSOR/HACCEL etc are always 32 bits, even on 64
-// bit systems. That's why we use the Windows macros to convert to 32 bits.
-void ParamTraits<HANDLE>::Write(base::Pickle* m, const param_type& p) {
-  m->WriteInt(HandleToLong(p));
-}
-
-bool ParamTraits<HANDLE>::Read(const base::Pickle* m,
-                               base::PickleIterator* iter,
-                               param_type* r) {
-  int32_t temp;
-  if (!iter->ReadInt(&temp))
-    return false;
-  *r = LongToHandle(temp);
-  return true;
-}
-
-void ParamTraits<HANDLE>::Log(const param_type& p, std::string* l) {
-  l->append(base::StringPrintf("0x%p", p));
-}
-
-void ParamTraits<LOGFONT>::GetSize(base::PickleSizer* sizer,
-                                   const param_type& p) {
-  sizer->AddData(sizeof(LOGFONT));
-}
-
-void ParamTraits<LOGFONT>::Write(base::Pickle* m, const param_type& p) {
-  m->WriteData(reinterpret_cast<const char*>(&p), sizeof(LOGFONT));
-}
-
-bool ParamTraits<LOGFONT>::Read(const base::Pickle* m,
-                                base::PickleIterator* iter,
-                                param_type* r) {
-  const char *data;
-  int data_size = 0;
-  if (iter->ReadData(&data, &data_size) && data_size == sizeof(LOGFONT)) {
-    const LOGFONT *font = reinterpret_cast<LOGFONT*>(const_cast<char*>(data));
-    if (_tcsnlen(font->lfFaceName, LF_FACESIZE) < LF_FACESIZE) {
-      memcpy(r, data, sizeof(LOGFONT));
-      return true;
-    }
-  }
-
-  NOTREACHED();
-  return false;
-}
-
-void ParamTraits<LOGFONT>::Log(const param_type& p, std::string* l) {
-  l->append(base::StringPrintf("<LOGFONT>"));
-}
-
-void ParamTraits<MSG>::GetSize(base::PickleSizer* sizer, const param_type& p) {
-  sizer->AddData(sizeof(MSG));
-}
-
-void ParamTraits<MSG>::Write(base::Pickle* m, const param_type& p) {
-  m->WriteData(reinterpret_cast<const char*>(&p), sizeof(MSG));
-}
-
-bool ParamTraits<MSG>::Read(const base::Pickle* m,
-                            base::PickleIterator* iter,
-                            param_type* r) {
-  const char *data;
-  int data_size = 0;
-  bool result = iter->ReadData(&data, &data_size);
-  if (result && data_size == sizeof(MSG)) {
-    memcpy(r, data, sizeof(MSG));
-  } else {
-    result = false;
-    NOTREACHED();
-  }
-
-  return result;
-}
-
-void ParamTraits<MSG>::Log(const param_type& p, std::string* l) {
-  l->append("<MSG>");
-}
-
-#endif  // OS_WIN
-
-}  // namespace IPC
diff --git a/ipc/ipc_message_utils.h b/ipc/ipc_message_utils.h
deleted file mode 100644
index 2d51c98..0000000
--- a/ipc/ipc_message_utils.h
+++ /dev/null
@@ -1,1145 +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.
-
-#ifndef IPC_IPC_MESSAGE_UTILS_H_
-#define IPC_IPC_MESSAGE_UTILS_H_
-
-#include <limits.h>
-#include <stddef.h>
-#include <stdint.h>
-
-#include <algorithm>
-#include <map>
-#include <memory>
-#include <set>
-#include <string>
-#include <tuple>
-#include <vector>
-
-#include "base/containers/small_map.h"
-#include "base/containers/stack_container.h"
-#include "base/files/file.h"
-#include "base/format_macros.h"
-#include "base/optional.h"
-#include "base/strings/string16.h"
-#include "base/strings/string_util.h"
-#include "base/strings/stringprintf.h"
-#include "build/build_config.h"
-#include "ipc/ipc_message_start.h"
-#include "ipc/ipc_param_traits.h"
-#include "ipc/ipc_sync_message.h"
-
-namespace base {
-class DictionaryValue;
-class FilePath;
-class ListValue;
-class NullableString16;
-class Time;
-class TimeDelta;
-class TimeTicks;
-class UnguessableToken;
-struct FileDescriptor;
-
-#if (defined(OS_MACOSX) && !defined(OS_IOS)) || defined(OS_WIN)
-class SharedMemoryHandle;
-#endif  // (defined(OS_MACOSX) && !defined(OS_IOS)) || defined(OS_WIN)
-}
-
-namespace IPC {
-
-struct ChannelHandle;
-
-// -----------------------------------------------------------------------------
-// How we send IPC message logs across channels.
-struct IPC_EXPORT LogData {
-  LogData();
-  LogData(const LogData& other);
-  ~LogData();
-
-  std::string channel;
-  int32_t routing_id;
-  uint32_t type;  // "User-defined" message type, from ipc_message.h.
-  std::string flags;
-  int64_t sent;  // Time that the message was sent (i.e. at Send()).
-  int64_t receive;  // Time before it was dispatched (i.e. before calling
-                    // OnMessageReceived).
-  int64_t dispatch;  // Time after it was dispatched (i.e. after calling
-                     // OnMessageReceived).
-  std::string message_name;
-  std::string params;
-};
-
-//-----------------------------------------------------------------------------
-
-// A dummy struct to place first just to allow leading commas for all
-// members in the macro-generated constructor initializer lists.
-struct NoParams {
-};
-
-// Specializations are checked by 'IPC checker' part of find-bad-constructs
-// Clang plugin (see WriteParam() below for the details).
-template <typename... Ts>
-struct CheckedTuple {
-  typedef std::tuple<Ts...> Tuple;
-};
-
-template <class P>
-static inline void GetParamSize(base::PickleSizer* sizer, const P& p) {
-  typedef typename SimilarTypeTraits<P>::Type Type;
-  ParamTraits<Type>::GetSize(sizer, static_cast<const Type&>(p));
-}
-
-// This function is checked by 'IPC checker' part of find-bad-constructs
-// Clang plugin to make it's not called on the following types:
-// 1. long / unsigned long (but not typedefs to)
-// 2. intmax_t, uintmax_t, intptr_t, uintptr_t, wint_t,
-//    size_t, rsize_t, ssize_t, ptrdiff_t, dev_t, off_t, clock_t,
-//    time_t, suseconds_t (including typedefs to)
-// 3. Any template referencing types above (e.g. std::vector<size_t>)
-template <class P>
-static inline void WriteParam(base::Pickle* m, const P& p) {
-  typedef typename SimilarTypeTraits<P>::Type Type;
-  ParamTraits<Type>::Write(m, static_cast<const Type& >(p));
-}
-
-template <class P>
-static inline bool WARN_UNUSED_RESULT ReadParam(const base::Pickle* m,
-                                                base::PickleIterator* iter,
-                                                P* p) {
-  typedef typename SimilarTypeTraits<P>::Type Type;
-  return ParamTraits<Type>::Read(m, iter, reinterpret_cast<Type* >(p));
-}
-
-template <class P>
-static inline void LogParam(const P& p, std::string* l) {
-  typedef typename SimilarTypeTraits<P>::Type Type;
-  ParamTraits<Type>::Log(static_cast<const Type& >(p), l);
-}
-
-// Primitive ParamTraits -------------------------------------------------------
-
-template <>
-struct ParamTraits<bool> {
-  typedef bool param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    sizer->AddBool();
-  }
-  static void Write(base::Pickle* m, const param_type& p) { m->WriteBool(p); }
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r) {
-    return iter->ReadBool(r);
-  }
-  IPC_EXPORT static void Log(const param_type& p, std::string* l);
-};
-
-template <>
-struct IPC_EXPORT ParamTraits<signed char> {
-  typedef signed char param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
-  static void Write(base::Pickle* m, const param_type& p);
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r);
-  static void Log(const param_type& p, std::string* l);
-};
-
-template <>
-struct IPC_EXPORT ParamTraits<unsigned char> {
-  typedef unsigned char param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
-  static void Write(base::Pickle* m, const param_type& p);
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r);
-  static void Log(const param_type& p, std::string* l);
-};
-
-template <>
-struct IPC_EXPORT ParamTraits<unsigned short> {
-  typedef unsigned short param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
-  static void Write(base::Pickle* m, const param_type& p);
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r);
-  static void Log(const param_type& p, std::string* l);
-};
-
-template <>
-struct ParamTraits<int> {
-  typedef int param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    sizer->AddInt();
-  }
-  static void Write(base::Pickle* m, const param_type& p) { m->WriteInt(p); }
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r) {
-    return iter->ReadInt(r);
-  }
-  IPC_EXPORT static void Log(const param_type& p, std::string* l);
-};
-
-template <>
-struct ParamTraits<unsigned int> {
-  typedef unsigned int param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    sizer->AddInt();
-  }
-  static void Write(base::Pickle* m, const param_type& p) { m->WriteInt(p); }
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r) {
-    return iter->ReadInt(reinterpret_cast<int*>(r));
-  }
-  IPC_EXPORT static void Log(const param_type& p, std::string* l);
-};
-
-// long isn't safe to send over IPC because it's 4 bytes on 32 bit builds but
-// 8 bytes on 64 bit builds. So if a 32 bit and 64 bit process have a channel
-// that would cause problem.
-// We need to keep this on for a few configs:
-//   1) Windows because DWORD is typedef'd to it, which is fine because we have
-//      very few IPCs that cross this boundary.
-//   2) We also need to keep it for Linux for two reasons: int64_t is typedef'd
-//      to long, and gfx::PluginWindow is long and is used in one GPU IPC.
-//   3) Android 64 bit also has int64_t typedef'd to long.
-// Since we want to support Android 32<>64 bit IPC, as long as we don't have
-// these traits for 32 bit ARM then that'll catch any errors.
-#if defined(OS_WIN) || defined(OS_LINUX) || \
-    (defined(OS_ANDROID) && defined(ARCH_CPU_64_BITS))
-template <>
-struct ParamTraits<long> {
-  typedef long param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    sizer->AddLong();
-  }
-  static void Write(base::Pickle* m, const param_type& p) {
-    m->WriteLong(p);
-  }
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r) {
-    return iter->ReadLong(r);
-  }
-  IPC_EXPORT static void Log(const param_type& p, std::string* l);
-};
-
-template <>
-struct ParamTraits<unsigned long> {
-  typedef unsigned long param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    sizer->AddLong();
-  }
-  static void Write(base::Pickle* m, const param_type& p) {
-    m->WriteLong(p);
-  }
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r) {
-    return iter->ReadLong(reinterpret_cast<long*>(r));
-  }
-  IPC_EXPORT static void Log(const param_type& p, std::string* l);
-};
-#endif
-
-template <>
-struct ParamTraits<long long> {
-  typedef long long param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    sizer->AddInt64();
-  }
-  static void Write(base::Pickle* m, const param_type& p) {
-    m->WriteInt64(static_cast<int64_t>(p));
-  }
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r) {
-    return iter->ReadInt64(reinterpret_cast<int64_t*>(r));
-  }
-  IPC_EXPORT static void Log(const param_type& p, std::string* l);
-};
-
-template <>
-struct ParamTraits<unsigned long long> {
-  typedef unsigned long long param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    sizer->AddInt64();
-  }
-  static void Write(base::Pickle* m, const param_type& p) { m->WriteInt64(p); }
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r) {
-    return iter->ReadInt64(reinterpret_cast<int64_t*>(r));
-  }
-  IPC_EXPORT static void Log(const param_type& p, std::string* l);
-};
-
-// Note that the IPC layer doesn't sanitize NaNs and +/- INF values.  Clients
-// should be sure to check the sanity of these values after receiving them over
-// IPC.
-template <>
-struct IPC_EXPORT ParamTraits<float> {
-  typedef float param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    sizer->AddFloat();
-  }
-  static void Write(base::Pickle* m, const param_type& p) { m->WriteFloat(p); }
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r) {
-    return iter->ReadFloat(r);
-  }
-  static void Log(const param_type& p, std::string* l);
-};
-
-template <>
-struct IPC_EXPORT ParamTraits<double> {
-  typedef double param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
-  static void Write(base::Pickle* m, const param_type& p);
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r);
-  static void Log(const param_type& p, std::string* l);
-};
-
-template <class P, size_t Size>
-struct ParamTraits<P[Size]> {
-  using param_type = P[Size];
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    for (const P& element : p)
-      GetParamSize(sizer, element);
-  }
-  static void Write(base::Pickle* m, const param_type& p) {
-    for (const P& element : p)
-      WriteParam(m, element);
-  }
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r) {
-    for (P& element : *r) {
-      if (!ReadParam(m, iter, &element))
-        return false;
-    }
-    return true;
-  }
-  static void Log(const param_type& p, std::string* l) {
-    l->append("[");
-    for (const P& element : p) {
-      if (&element != &p[0])
-        l->append(" ");
-      LogParam(element, l);
-    }
-    l->append("]");
-  }
-};
-
-// STL ParamTraits -------------------------------------------------------------
-
-template <>
-struct ParamTraits<std::string> {
-  typedef std::string param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    sizer->AddString(p);
-  }
-  static void Write(base::Pickle* m, const param_type& p) { m->WriteString(p); }
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r) {
-    return iter->ReadString(r);
-  }
-  IPC_EXPORT static void Log(const param_type& p, std::string* l);
-};
-
-template <>
-struct ParamTraits<base::string16> {
-  typedef base::string16 param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    sizer->AddString16(p);
-  }
-  static void Write(base::Pickle* m, const param_type& p) {
-    m->WriteString16(p);
-  }
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r) {
-    return iter->ReadString16(r);
-  }
-  IPC_EXPORT static void Log(const param_type& p, std::string* l);
-};
-
-template <>
-struct IPC_EXPORT ParamTraits<std::vector<char> > {
-  typedef std::vector<char> param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
-  static void Write(base::Pickle* m, const param_type& p);
-  static bool Read(const base::Pickle*,
-                   base::PickleIterator* iter,
-                   param_type* r);
-  static void Log(const param_type& p, std::string* l);
-};
-
-template <>
-struct IPC_EXPORT ParamTraits<std::vector<unsigned char> > {
-  typedef std::vector<unsigned char> param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
-  static void Write(base::Pickle* m, const param_type& p);
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r);
-  static void Log(const param_type& p, std::string* l);
-};
-
-template <>
-struct IPC_EXPORT ParamTraits<std::vector<bool> > {
-  typedef std::vector<bool> param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
-  static void Write(base::Pickle* m, const param_type& p);
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r);
-  static void Log(const param_type& p, std::string* l);
-};
-
-template <class P>
-struct ParamTraits<std::vector<P>> {
-  typedef std::vector<P> param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    GetParamSize(sizer, static_cast<int>(p.size()));
-    for (size_t i = 0; i < p.size(); i++)
-      GetParamSize(sizer, p[i]);
-  }
-  static void Write(base::Pickle* m, const param_type& p) {
-    WriteParam(m, static_cast<int>(p.size()));
-    for (size_t i = 0; i < p.size(); i++)
-      WriteParam(m, p[i]);
-  }
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r) {
-    int size;
-    // ReadLength() checks for < 0 itself.
-    if (!iter->ReadLength(&size))
-      return false;
-    // Resizing beforehand is not safe, see BUG 1006367 for details.
-    if (INT_MAX / sizeof(P) <= static_cast<size_t>(size))
-      return false;
-    r->resize(size);
-    for (int i = 0; i < size; i++) {
-      if (!ReadParam(m, iter, &(*r)[i]))
-        return false;
-    }
-    return true;
-  }
-  static void Log(const param_type& p, std::string* l) {
-    for (size_t i = 0; i < p.size(); ++i) {
-      if (i != 0)
-        l->append(" ");
-      LogParam((p[i]), l);
-    }
-  }
-};
-
-template <class P>
-struct ParamTraits<std::set<P> > {
-  typedef std::set<P> param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    GetParamSize(sizer, static_cast<int>(p.size()));
-    typename param_type::const_iterator iter;
-    for (iter = p.begin(); iter != p.end(); ++iter)
-      GetParamSize(sizer, *iter);
-  }
-  static void Write(base::Pickle* m, const param_type& p) {
-    WriteParam(m, static_cast<int>(p.size()));
-    typename param_type::const_iterator iter;
-    for (iter = p.begin(); iter != p.end(); ++iter)
-      WriteParam(m, *iter);
-  }
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r) {
-    int size;
-    if (!iter->ReadLength(&size))
-      return false;
-    for (int i = 0; i < size; ++i) {
-      P item;
-      if (!ReadParam(m, iter, &item))
-        return false;
-      r->insert(item);
-    }
-    return true;
-  }
-  static void Log(const param_type& p, std::string* l) {
-    l->append("<std::set>");
-  }
-};
-
-template <class K, class V, class C, class A>
-struct ParamTraits<std::map<K, V, C, A> > {
-  typedef std::map<K, V, C, A> param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    GetParamSize(sizer, static_cast<int>(p.size()));
-    typename param_type::const_iterator iter;
-    for (iter = p.begin(); iter != p.end(); ++iter) {
-      GetParamSize(sizer, iter->first);
-      GetParamSize(sizer, iter->second);
-    }
-  }
-  static void Write(base::Pickle* m, const param_type& p) {
-    WriteParam(m, static_cast<int>(p.size()));
-    typename param_type::const_iterator iter;
-    for (iter = p.begin(); iter != p.end(); ++iter) {
-      WriteParam(m, iter->first);
-      WriteParam(m, iter->second);
-    }
-  }
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r) {
-    int size;
-    if (!ReadParam(m, iter, &size) || size < 0)
-      return false;
-    for (int i = 0; i < size; ++i) {
-      K k;
-      if (!ReadParam(m, iter, &k))
-        return false;
-      V& value = (*r)[k];
-      if (!ReadParam(m, iter, &value))
-        return false;
-    }
-    return true;
-  }
-  static void Log(const param_type& p, std::string* l) {
-    l->append("<std::map>");
-  }
-};
-
-template <class A, class B>
-struct ParamTraits<std::pair<A, B> > {
-  typedef std::pair<A, B> param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    GetParamSize(sizer, p.first);
-    GetParamSize(sizer, p.second);
-  }
-  static void Write(base::Pickle* m, const param_type& p) {
-    WriteParam(m, p.first);
-    WriteParam(m, p.second);
-  }
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r) {
-    return ReadParam(m, iter, &r->first) && ReadParam(m, iter, &r->second);
-  }
-  static void Log(const param_type& p, std::string* l) {
-    l->append("(");
-    LogParam(p.first, l);
-    l->append(", ");
-    LogParam(p.second, l);
-    l->append(")");
-  }
-};
-
-// Base ParamTraits ------------------------------------------------------------
-
-template <>
-struct IPC_EXPORT ParamTraits<base::DictionaryValue> {
-  typedef base::DictionaryValue param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
-  static void Write(base::Pickle* m, const param_type& p);
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r);
-  static void Log(const param_type& p, std::string* l);
-};
-
-#if defined(OS_POSIX)
-// FileDescriptors may be serialised over IPC channels on POSIX. On the
-// receiving side, the FileDescriptor is a valid duplicate of the file
-// descriptor which was transmitted: *it is not just a copy of the integer like
-// HANDLEs on Windows*. The only exception is if the file descriptor is < 0. In
-// this case, the receiving end will see a value of -1. *Zero is a valid file
-// descriptor*.
-//
-// The received file descriptor will have the |auto_close| flag set to true. The
-// code which handles the message is responsible for taking ownership of it.
-// File descriptors are OS resources and must be closed when no longer needed.
-//
-// When sending a file descriptor, the file descriptor must be valid at the time
-// of transmission. Since transmission is not synchronous, one should consider
-// dup()ing any file descriptors to be transmitted and setting the |auto_close|
-// flag, which causes the file descriptor to be closed after writing.
-template<>
-struct IPC_EXPORT ParamTraits<base::FileDescriptor> {
-  typedef base::FileDescriptor param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
-  static void Write(base::Pickle* m, const param_type& p);
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r);
-  static void Log(const param_type& p, std::string* l);
-};
-#endif  // defined(OS_POSIX)
-
-#if (defined(OS_MACOSX) && !defined(OS_IOS)) || defined(OS_WIN)
-template <>
-struct IPC_EXPORT ParamTraits<base::SharedMemoryHandle> {
-  typedef base::SharedMemoryHandle param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
-  static void Write(base::Pickle* m, const param_type& p);
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r);
-  static void Log(const param_type& p, std::string* l);
-};
-#endif  // (defined(OS_MACOSX) && !defined(OS_IOS)) || defined(OS_WIN)
-
-template <>
-struct IPC_EXPORT ParamTraits<base::FilePath> {
-  typedef base::FilePath param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
-  static void Write(base::Pickle* m, const param_type& p);
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r);
-  static void Log(const param_type& p, std::string* l);
-};
-
-template <>
-struct IPC_EXPORT ParamTraits<base::ListValue> {
-  typedef base::ListValue param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
-  static void Write(base::Pickle* m, const param_type& p);
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r);
-  static void Log(const param_type& p, std::string* l);
-};
-
-template <>
-struct IPC_EXPORT ParamTraits<base::NullableString16> {
-  typedef base::NullableString16 param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
-  static void Write(base::Pickle* m, const param_type& p);
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r);
-  static void Log(const param_type& p, std::string* l);
-};
-
-template <>
-struct IPC_EXPORT ParamTraits<base::File::Info> {
-  typedef base::File::Info param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
-  static void Write(base::Pickle* m, const param_type& p);
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r);
-  static void Log(const param_type& p, std::string* l);
-};
-
-template <>
-struct SimilarTypeTraits<base::File::Error> {
-  typedef int Type;
-};
-
-#if defined(OS_WIN)
-template <>
-struct SimilarTypeTraits<HWND> {
-  typedef HANDLE Type;
-};
-#endif  // defined(OS_WIN)
-
-template <>
-struct IPC_EXPORT ParamTraits<base::Time> {
-  typedef base::Time param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
-  static void Write(base::Pickle* m, const param_type& p);
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r);
-  static void Log(const param_type& p, std::string* l);
-};
-
-template <>
-struct IPC_EXPORT ParamTraits<base::TimeDelta> {
-  typedef base::TimeDelta param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
-  static void Write(base::Pickle* m, const param_type& p);
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r);
-  static void Log(const param_type& p, std::string* l);
-};
-
-template <>
-struct IPC_EXPORT ParamTraits<base::TimeTicks> {
-  typedef base::TimeTicks param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
-  static void Write(base::Pickle* m, const param_type& p);
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r);
-  static void Log(const param_type& p, std::string* l);
-};
-
-template <>
-struct IPC_EXPORT ParamTraits<base::UnguessableToken> {
-  typedef base::UnguessableToken param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
-  static void Write(base::Pickle* m, const param_type& p);
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r);
-  static void Log(const param_type& p, std::string* l);
-};
-
-template <>
-struct ParamTraits<std::tuple<>> {
-  typedef std::tuple<> param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {}
-  static void Write(base::Pickle* m, const param_type& p) {}
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r) {
-    return true;
-  }
-  static void Log(const param_type& p, std::string* l) {
-  }
-};
-
-template <class A>
-struct ParamTraits<std::tuple<A>> {
-  typedef std::tuple<A> param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    GetParamSize(sizer, std::get<0>(p));
-  }
-  static void Write(base::Pickle* m, const param_type& p) {
-    WriteParam(m, std::get<0>(p));
-  }
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r) {
-    return ReadParam(m, iter, &std::get<0>(*r));
-  }
-  static void Log(const param_type& p, std::string* l) {
-    LogParam(std::get<0>(p), l);
-  }
-};
-
-template <class A, class B>
-struct ParamTraits<std::tuple<A, B>> {
-  typedef std::tuple<A, B> param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    GetParamSize(sizer, std::get<0>(p));
-    GetParamSize(sizer, std::get<1>(p));
-  }
-  static void Write(base::Pickle* m, const param_type& p) {
-    WriteParam(m, std::get<0>(p));
-    WriteParam(m, std::get<1>(p));
-  }
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r) {
-    return (ReadParam(m, iter, &std::get<0>(*r)) &&
-            ReadParam(m, iter, &std::get<1>(*r)));
-  }
-  static void Log(const param_type& p, std::string* l) {
-    LogParam(std::get<0>(p), l);
-    l->append(", ");
-    LogParam(std::get<1>(p), l);
-  }
-};
-
-template <class A, class B, class C>
-struct ParamTraits<std::tuple<A, B, C>> {
-  typedef std::tuple<A, B, C> param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    GetParamSize(sizer, std::get<0>(p));
-    GetParamSize(sizer, std::get<1>(p));
-    GetParamSize(sizer, std::get<2>(p));
-  }
-  static void Write(base::Pickle* m, const param_type& p) {
-    WriteParam(m, std::get<0>(p));
-    WriteParam(m, std::get<1>(p));
-    WriteParam(m, std::get<2>(p));
-  }
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r) {
-    return (ReadParam(m, iter, &std::get<0>(*r)) &&
-            ReadParam(m, iter, &std::get<1>(*r)) &&
-            ReadParam(m, iter, &std::get<2>(*r)));
-  }
-  static void Log(const param_type& p, std::string* l) {
-    LogParam(std::get<0>(p), l);
-    l->append(", ");
-    LogParam(std::get<1>(p), l);
-    l->append(", ");
-    LogParam(std::get<2>(p), l);
-  }
-};
-
-template <class A, class B, class C, class D>
-struct ParamTraits<std::tuple<A, B, C, D>> {
-  typedef std::tuple<A, B, C, D> param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    GetParamSize(sizer, std::get<0>(p));
-    GetParamSize(sizer, std::get<1>(p));
-    GetParamSize(sizer, std::get<2>(p));
-    GetParamSize(sizer, std::get<3>(p));
-  }
-  static void Write(base::Pickle* m, const param_type& p) {
-    WriteParam(m, std::get<0>(p));
-    WriteParam(m, std::get<1>(p));
-    WriteParam(m, std::get<2>(p));
-    WriteParam(m, std::get<3>(p));
-  }
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r) {
-    return (ReadParam(m, iter, &std::get<0>(*r)) &&
-            ReadParam(m, iter, &std::get<1>(*r)) &&
-            ReadParam(m, iter, &std::get<2>(*r)) &&
-            ReadParam(m, iter, &std::get<3>(*r)));
-  }
-  static void Log(const param_type& p, std::string* l) {
-    LogParam(std::get<0>(p), l);
-    l->append(", ");
-    LogParam(std::get<1>(p), l);
-    l->append(", ");
-    LogParam(std::get<2>(p), l);
-    l->append(", ");
-    LogParam(std::get<3>(p), l);
-  }
-};
-
-template <class A, class B, class C, class D, class E>
-struct ParamTraits<std::tuple<A, B, C, D, E>> {
-  typedef std::tuple<A, B, C, D, E> param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    GetParamSize(sizer, std::get<0>(p));
-    GetParamSize(sizer, std::get<1>(p));
-    GetParamSize(sizer, std::get<2>(p));
-    GetParamSize(sizer, std::get<3>(p));
-    GetParamSize(sizer, std::get<4>(p));
-  }
-  static void Write(base::Pickle* m, const param_type& p) {
-    WriteParam(m, std::get<0>(p));
-    WriteParam(m, std::get<1>(p));
-    WriteParam(m, std::get<2>(p));
-    WriteParam(m, std::get<3>(p));
-    WriteParam(m, std::get<4>(p));
-  }
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r) {
-    return (ReadParam(m, iter, &std::get<0>(*r)) &&
-            ReadParam(m, iter, &std::get<1>(*r)) &&
-            ReadParam(m, iter, &std::get<2>(*r)) &&
-            ReadParam(m, iter, &std::get<3>(*r)) &&
-            ReadParam(m, iter, &std::get<4>(*r)));
-  }
-  static void Log(const param_type& p, std::string* l) {
-    LogParam(std::get<0>(p), l);
-    l->append(", ");
-    LogParam(std::get<1>(p), l);
-    l->append(", ");
-    LogParam(std::get<2>(p), l);
-    l->append(", ");
-    LogParam(std::get<3>(p), l);
-    l->append(", ");
-    LogParam(std::get<4>(p), l);
-  }
-};
-
-template <class P, size_t stack_capacity>
-struct ParamTraits<base::StackVector<P, stack_capacity> > {
-  typedef base::StackVector<P, stack_capacity> param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    GetParamSize(sizer, static_cast<int>(p->size()));
-    for (size_t i = 0; i < p->size(); i++)
-      GetParamSize(sizer, p[i]);
-  }
-  static void Write(base::Pickle* m, const param_type& p) {
-    WriteParam(m, static_cast<int>(p->size()));
-    for (size_t i = 0; i < p->size(); i++)
-      WriteParam(m, p[i]);
-  }
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r) {
-    int size;
-    // ReadLength() checks for < 0 itself.
-    if (!iter->ReadLength(&size))
-      return false;
-    // Sanity check for the vector size.
-    if (INT_MAX / sizeof(P) <= static_cast<size_t>(size))
-      return false;
-    P value;
-    for (int i = 0; i < size; i++) {
-      if (!ReadParam(m, iter, &value))
-        return false;
-      (*r)->push_back(value);
-    }
-    return true;
-  }
-  static void Log(const param_type& p, std::string* l) {
-    for (size_t i = 0; i < p->size(); ++i) {
-      if (i != 0)
-        l->append(" ");
-      LogParam((p[i]), l);
-    }
-  }
-};
-
-template <typename NormalMap,
-          int kArraySize,
-          typename EqualKey,
-          typename MapInit>
-struct ParamTraits<base::SmallMap<NormalMap, kArraySize, EqualKey, MapInit> > {
-  typedef base::SmallMap<NormalMap, kArraySize, EqualKey, MapInit> param_type;
-  typedef typename param_type::key_type K;
-  typedef typename param_type::data_type V;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    GetParamSize(sizer, static_cast<int>(p.size()));
-    typename param_type::const_iterator iter;
-    for (iter = p.begin(); iter != p.end(); ++iter) {
-      GetParamSize(sizer, iter->first);
-      GetParamSize(sizer, iter->second);
-    }
-  }
-  static void Write(base::Pickle* m, const param_type& p) {
-    WriteParam(m, static_cast<int>(p.size()));
-    typename param_type::const_iterator iter;
-    for (iter = p.begin(); iter != p.end(); ++iter) {
-      WriteParam(m, iter->first);
-      WriteParam(m, iter->second);
-    }
-  }
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r) {
-    int size;
-    if (!iter->ReadLength(&size))
-      return false;
-    for (int i = 0; i < size; ++i) {
-      K key;
-      if (!ReadParam(m, iter, &key))
-        return false;
-      V& value = (*r)[key];
-      if (!ReadParam(m, iter, &value))
-        return false;
-    }
-    return true;
-  }
-  static void Log(const param_type& p, std::string* l) {
-    l->append("<base::SmallMap>");
-  }
-};
-
-template <class P>
-struct ParamTraits<std::unique_ptr<P>> {
-  typedef std::unique_ptr<P> param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    bool valid = !!p;
-    GetParamSize(sizer, valid);
-    if (valid)
-      GetParamSize(sizer, *p);
-  }
-  static void Write(base::Pickle* m, const param_type& p) {
-    bool valid = !!p;
-    WriteParam(m, valid);
-    if (valid)
-      WriteParam(m, *p);
-  }
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r) {
-    bool valid = false;
-    if (!ReadParam(m, iter, &valid))
-      return false;
-
-    if (!valid) {
-      r->reset();
-      return true;
-    }
-
-    param_type temp(new P());
-    if (!ReadParam(m, iter, temp.get()))
-      return false;
-
-    r->swap(temp);
-    return true;
-  }
-  static void Log(const param_type& p, std::string* l) {
-    if (p)
-      LogParam(*p, l);
-    else
-      l->append("NULL");
-  }
-};
-
-template <class P>
-struct ParamTraits<base::Optional<P>> {
-  typedef base::Optional<P> param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p) {
-    const bool is_set = static_cast<bool>(p);
-    GetParamSize(sizer, is_set);
-    if (is_set)
-      GetParamSize(sizer, p.value());
-  }
-  static void Write(base::Pickle* m, const param_type& p) {
-    const bool is_set = static_cast<bool>(p);
-    WriteParam(m, is_set);
-    if (is_set)
-      WriteParam(m, p.value());
-  }
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r) {
-    bool is_set = false;
-    if (!iter->ReadBool(&is_set))
-      return false;
-    if (is_set) {
-      P value;
-      if (!ReadParam(m, iter, &value))
-        return false;
-      *r = std::move(value);
-    }
-    return true;
-  }
-  static void Log(const param_type& p, std::string* l) {
-    if (p)
-      LogParam(p.value(), l);
-    else
-      l->append("(unset)");
-  }
-};
-
-// IPC types ParamTraits -------------------------------------------------------
-
-// A ChannelHandle is basically a platform-inspecific wrapper around the
-// fact that IPC endpoints are handled specially on POSIX.  See above comments
-// on FileDescriptor for more background.
-template<>
-struct IPC_EXPORT ParamTraits<IPC::ChannelHandle> {
-  typedef ChannelHandle param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
-  static void Write(base::Pickle* m, const param_type& p);
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r);
-  static void Log(const param_type& p, std::string* l);
-};
-
-template <>
-struct IPC_EXPORT ParamTraits<LogData> {
-  typedef LogData param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
-  static void Write(base::Pickle* m, const param_type& p);
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r);
-  static void Log(const param_type& p, std::string* l);
-};
-
-template <>
-struct IPC_EXPORT ParamTraits<Message> {
-  static void Write(base::Pickle* m, const Message& p);
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   Message* r);
-  static void Log(const Message& p, std::string* l);
-};
-
-// Windows ParamTraits ---------------------------------------------------------
-
-#if defined(OS_WIN)
-template <>
-struct IPC_EXPORT ParamTraits<HANDLE> {
-  typedef HANDLE param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
-  static void Write(base::Pickle* m, const param_type& p);
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r);
-  static void Log(const param_type& p, std::string* l);
-};
-
-template <>
-struct IPC_EXPORT ParamTraits<LOGFONT> {
-  typedef LOGFONT param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
-  static void Write(base::Pickle* m, const param_type& p);
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r);
-  static void Log(const param_type& p, std::string* l);
-};
-
-template <>
-struct IPC_EXPORT ParamTraits<MSG> {
-  typedef MSG param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
-  static void Write(base::Pickle* m, const param_type& p);
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r);
-  static void Log(const param_type& p, std::string* l);
-};
-#endif  // defined(OS_WIN)
-
-//-----------------------------------------------------------------------------
-// Generic message subclasses
-
-// defined in ipc_logging.cc
-IPC_EXPORT void GenerateLogData(const Message& message,
-                                LogData* data,
-                                bool get_params);
-
-#if defined(IPC_MESSAGE_LOG_ENABLED)
-inline void AddOutputParamsToLog(const Message* msg, std::string* l) {
-  const std::string& output_params = msg->output_params();
-  if (!l->empty() && !output_params.empty())
-    l->append(", ");
-
-  l->append(output_params);
-}
-
-template <class ReplyParamType>
-inline void LogReplyParamsToMessage(const ReplyParamType& reply_params,
-                                    const Message* msg) {
-  if (msg->received_time() != 0) {
-    std::string output_params;
-    LogParam(reply_params, &output_params);
-    msg->set_output_params(output_params);
-  }
-}
-
-inline void ConnectMessageAndReply(const Message* msg, Message* reply) {
-  if (msg->sent_time()) {
-    // Don't log the sync message after dispatch, as we don't have the
-    // output parameters at that point.  Instead, save its data and log it
-    // with the outgoing reply message when it's sent.
-    LogData* data = new LogData;
-    GenerateLogData(*msg, data, true);
-    msg->set_dont_log();
-    reply->set_sync_log_data(data);
-  }
-}
-#else
-inline void AddOutputParamsToLog(const Message* msg, std::string* l) {}
-
-template <class ReplyParamType>
-inline void LogReplyParamsToMessage(const ReplyParamType& reply_params,
-                                    const Message* msg) {}
-
-inline void ConnectMessageAndReply(const Message* msg, Message* reply) {}
-#endif
-
-}  // namespace IPC
-
-#endif  // IPC_IPC_MESSAGE_UTILS_H_
diff --git a/ipc/ipc_mojo_handle_attachment.cc b/ipc/ipc_mojo_handle_attachment.cc
deleted file mode 100644
index e3421c3..0000000
--- a/ipc/ipc_mojo_handle_attachment.cc
+++ /dev/null
@@ -1,29 +0,0 @@
-// 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 "ipc/ipc_mojo_handle_attachment.h"
-
-#include <utility>
-
-#include "build/build_config.h"
-
-namespace IPC {
-namespace internal {
-
-MojoHandleAttachment::MojoHandleAttachment(mojo::ScopedHandle handle)
-    : handle_(std::move(handle)) {}
-
-MojoHandleAttachment::~MojoHandleAttachment() {
-}
-
-MessageAttachment::Type MojoHandleAttachment::GetType() const {
-  return Type::MOJO_HANDLE;
-}
-
-mojo::ScopedHandle MojoHandleAttachment::TakeHandle() {
-  return std::move(handle_);
-}
-
-}  // namespace internal
-}  // namespace IPC
diff --git a/ipc/ipc_mojo_handle_attachment.h b/ipc/ipc_mojo_handle_attachment.h
deleted file mode 100644
index d615276..0000000
--- a/ipc/ipc_mojo_handle_attachment.h
+++ /dev/null
@@ -1,42 +0,0 @@
-// 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 IPC_IPC_MOJO_HANDLE_ATTACHMENT_H_
-#define IPC_IPC_MOJO_HANDLE_ATTACHMENT_H_
-
-#include "base/files/file.h"
-#include "base/macros.h"
-#include "build/build_config.h"
-#include "ipc/ipc_export.h"
-#include "ipc/ipc_message_attachment.h"
-#include "mojo/public/cpp/system/handle.h"
-
-namespace IPC {
-
-namespace internal {
-
-// A MessageAttachment that holds a MojoHandle.
-// This can hold any type of transferrable Mojo handle (i.e. message pipe, data
-// pipe, etc), but the receiver is expected to know what type of handle to
-// expect.
-class IPC_EXPORT MojoHandleAttachment : public MessageAttachment {
- public:
-  explicit MojoHandleAttachment(mojo::ScopedHandle handle);
-
-  Type GetType() const override;
-
-  // Returns the owning handle transferring the ownership.
-  mojo::ScopedHandle TakeHandle();
-
- private:
-  ~MojoHandleAttachment() override;
-  mojo::ScopedHandle handle_;
-
-  DISALLOW_COPY_AND_ASSIGN(MojoHandleAttachment);
-};
-
-}  // namespace internal
-}  // namespace IPC
-
-#endif  // IPC_IPC_MOJO_HANDLE_ATTACHMENT_H_
diff --git a/ipc/ipc_mojo_message_helper.cc b/ipc/ipc_mojo_message_helper.cc
deleted file mode 100644
index a87a2d6..0000000
--- a/ipc/ipc_mojo_message_helper.cc
+++ /dev/null
@@ -1,51 +0,0 @@
-// 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 "ipc/ipc_mojo_message_helper.h"
-
-#include <utility>
-
-#include "ipc/ipc_mojo_handle_attachment.h"
-
-namespace IPC {
-
-// static
-bool MojoMessageHelper::WriteMessagePipeTo(
-    base::Pickle* message,
-    mojo::ScopedMessagePipeHandle handle) {
-  message->WriteAttachment(new internal::MojoHandleAttachment(
-      mojo::ScopedHandle::From(std::move(handle))));
-  return true;
-}
-
-// static
-bool MojoMessageHelper::ReadMessagePipeFrom(
-    const base::Pickle* message,
-    base::PickleIterator* iter,
-    mojo::ScopedMessagePipeHandle* handle) {
-  scoped_refptr<base::Pickle::Attachment> attachment;
-  if (!message->ReadAttachment(iter, &attachment)) {
-    LOG(ERROR) << "Failed to read attachment for message pipe.";
-    return false;
-  }
-
-  MessageAttachment::Type type =
-      static_cast<MessageAttachment*>(attachment.get())->GetType();
-  if (type != MessageAttachment::Type::MOJO_HANDLE) {
-    LOG(ERROR) << "Unxpected attachment type:" << type;
-    return false;
-  }
-
-  handle->reset(mojo::MessagePipeHandle(
-      static_cast<internal::MojoHandleAttachment*>(attachment.get())
-          ->TakeHandle()
-          .release()
-          .value()));
-  return true;
-}
-
-MojoMessageHelper::MojoMessageHelper() {
-}
-
-}  // namespace IPC
diff --git a/ipc/ipc_mojo_message_helper.h b/ipc/ipc_mojo_message_helper.h
deleted file mode 100644
index 4a71b5c..0000000
--- a/ipc/ipc_mojo_message_helper.h
+++ /dev/null
@@ -1,29 +0,0 @@
-// 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 IPC_IPC_MOJO_MESSAGE_HELPER_H_
-#define IPC_IPC_MOJO_MESSAGE_HELPER_H_
-
-#include "ipc/ipc_export.h"
-#include "ipc/ipc_message.h"
-#include "mojo/public/cpp/system/message_pipe.h"
-
-namespace IPC {
-
-// Reads and writes |mojo::MessagePipe| from/to |Message|.
-class IPC_EXPORT MojoMessageHelper {
- public:
-  static bool WriteMessagePipeTo(base::Pickle* message,
-                                 mojo::ScopedMessagePipeHandle handle);
-  static bool ReadMessagePipeFrom(const base::Pickle* message,
-                                  base::PickleIterator* iter,
-                                  mojo::ScopedMessagePipeHandle* handle);
-
- private:
-  MojoMessageHelper();
-};
-
-}  // namespace IPC
-
-#endif  // IPC_IPC_MOJO_MESSAGE_HELPER_H_
diff --git a/ipc/ipc_mojo_param_traits.cc b/ipc/ipc_mojo_param_traits.cc
deleted file mode 100644
index 189af35..0000000
--- a/ipc/ipc_mojo_param_traits.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 "ipc/ipc_mojo_param_traits.h"
-
-#include "ipc/ipc_message_utils.h"
-#include "ipc/ipc_mojo_message_helper.h"
-
-namespace IPC {
-
-void ParamTraits<mojo::MessagePipeHandle>::GetSize(base::PickleSizer* sizer,
-                                                   const param_type& p) {
-  GetParamSize(sizer, p.is_valid());
-  if (p.is_valid())
-    sizer->AddAttachment();
-}
-
-void ParamTraits<mojo::MessagePipeHandle>::Write(base::Pickle* m,
-                                                 const param_type& p) {
-  WriteParam(m, p.is_valid());
-  if (p.is_valid())
-    MojoMessageHelper::WriteMessagePipeTo(m, mojo::ScopedMessagePipeHandle(p));
-}
-
-bool ParamTraits<mojo::MessagePipeHandle>::Read(const base::Pickle* m,
-                                                base::PickleIterator* iter,
-                                                param_type* r) {
-  bool is_valid;
-  if (!ReadParam(m, iter, &is_valid))
-    return false;
-  if (!is_valid)
-    return true;
-
-  mojo::ScopedMessagePipeHandle handle;
-  if (!MojoMessageHelper::ReadMessagePipeFrom(m, iter, &handle))
-    return false;
-  DCHECK(handle.is_valid());
-  *r = handle.release();
-  return true;
-}
-
-void ParamTraits<mojo::MessagePipeHandle>::Log(const param_type& p,
-                                               std::string* l) {
-  l->append("mojo::MessagePipeHandle(");
-  LogParam(p.value(), l);
-  l->append(")");
-}
-
-}  // namespace IPC
diff --git a/ipc/ipc_mojo_param_traits.h b/ipc/ipc_mojo_param_traits.h
deleted file mode 100644
index 39be43e..0000000
--- a/ipc/ipc_mojo_param_traits.h
+++ /dev/null
@@ -1,34 +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 IPC_IPC_MOJO_PARAM_TRAITS_H_
-#define IPC_IPC_MOJO_PARAM_TRAITS_H_
-
-#include <string>
-
-#include "ipc/ipc_export.h"
-#include "ipc/ipc_param_traits.h"
-#include "mojo/public/cpp/system/message_pipe.h"
-
-namespace base {
-class Pickle;
-class PickleIterator;
-class PickleSizer;
-}
-
-namespace IPC {
-
-template <>
-struct IPC_EXPORT ParamTraits<mojo::MessagePipeHandle> {
-  typedef mojo::MessagePipeHandle param_type;
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
-  static void Write(base::Pickle* m, const param_type& p);
-  static bool Read(const base::Pickle* m, base::PickleIterator* iter,
-                   param_type* r);
-  static void Log(const param_type& p, std::string* l);
-};
-
-}  // namespace IPC
-
-#endif  // IPC_IPC_MOJO_PARAM_TRAITS_H_
diff --git a/ipc/ipc_param_traits.h b/ipc/ipc_param_traits.h
deleted file mode 100644
index 45e975c..0000000
--- a/ipc/ipc_param_traits.h
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright (c) 2010 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 IPC_IPC_PARAM_TRAITS_H_
-#define IPC_IPC_PARAM_TRAITS_H_
-
-// Our IPC system uses the following partially specialized header to define how
-// a data type is read, written and logged in the IPC system.
-
-namespace IPC {
-
-template <class P> struct ParamTraits {
-};
-
-template <class P>
-struct SimilarTypeTraits {
-  typedef P Type;
-};
-
-}  // namespace IPC
-
-#endif  // IPC_IPC_PARAM_TRAITS_H_
diff --git a/ipc/ipc_platform_file_attachment_posix.cc b/ipc/ipc_platform_file_attachment_posix.cc
deleted file mode 100644
index 7111cfa..0000000
--- a/ipc/ipc_platform_file_attachment_posix.cc
+++ /dev/null
@@ -1,38 +0,0 @@
-// 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 "ipc/ipc_platform_file_attachment_posix.h"
-
-#include <utility>
-
-namespace IPC {
-namespace internal {
-
-PlatformFileAttachment::PlatformFileAttachment(base::PlatformFile file)
-    : file_(file) {
-}
-
-PlatformFileAttachment::PlatformFileAttachment(base::ScopedFD file)
-    : file_(file.get()), owning_(std::move(file)) {}
-
-PlatformFileAttachment::~PlatformFileAttachment() {
-}
-
-MessageAttachment::Type PlatformFileAttachment::GetType() const {
-  return Type::PLATFORM_FILE;
-}
-
-base::PlatformFile PlatformFileAttachment::TakePlatformFile() {
-  ignore_result(owning_.release());
-  return file_;
-}
-
-base::PlatformFile GetPlatformFile(
-    scoped_refptr<MessageAttachment> attachment) {
-  DCHECK_EQ(attachment->GetType(), MessageAttachment::Type::PLATFORM_FILE);
-  return static_cast<PlatformFileAttachment*>(attachment.get())->file();
-}
-
-}  // namespace internal
-}  // namespace IPC
diff --git a/ipc/ipc_platform_file_attachment_posix.h b/ipc/ipc_platform_file_attachment_posix.h
deleted file mode 100644
index 9b07900..0000000
--- a/ipc/ipc_platform_file_attachment_posix.h
+++ /dev/null
@@ -1,43 +0,0 @@
-// 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 IPC_IPC_PLATFORM_FILE_ATTACHMENT_H_
-#define IPC_IPC_PLATFORM_FILE_ATTACHMENT_H_
-
-#include "ipc/ipc_export.h"
-#include "ipc/ipc_message_attachment.h"
-
-namespace IPC {
-namespace internal {
-
-// A platform file that is sent over |Channel| as a part of |Message|.
-// PlatformFileAttachment optionally owns the file and |owning_| is set in that
-// case. Also, |file_| is not cleared even after the ownership is taken.
-// Some old clients require this strange behavior.
-class IPC_EXPORT PlatformFileAttachment : public MessageAttachment {
- public:
-  // Non-owning constructor
-  explicit PlatformFileAttachment(base::PlatformFile file);
-  // Owning constructor
-  explicit PlatformFileAttachment(base::ScopedFD file);
-
-  Type GetType() const override;
-  base::PlatformFile TakePlatformFile();
-
-  base::PlatformFile file() const { return file_; }
-  bool Owns() const { return owning_.is_valid(); }
-
- private:
-  ~PlatformFileAttachment() override;
-
-  base::PlatformFile file_;
-  base::ScopedFD owning_;
-};
-
-base::PlatformFile GetPlatformFile(scoped_refptr<MessageAttachment> attachment);
-
-}  // namespace internal
-}  // namespace IPC
-
-#endif  // IPC_IPC_PLATFORM_FILE_ATTACHMENT_H_
diff --git a/ipc/ipc_sync_message.h b/ipc/ipc_sync_message.h
deleted file mode 100644
index 7f05551..0000000
--- a/ipc/ipc_sync_message.h
+++ /dev/null
@@ -1,107 +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.
-
-#ifndef IPC_IPC_SYNC_MESSAGE_H_
-#define IPC_IPC_SYNC_MESSAGE_H_
-
-#include <stdint.h>
-
-#if defined(OS_WIN)
-#include <windows.h>
-#endif
-
-#include <memory>
-#include <string>
-
-#include "build/build_config.h"
-#include "ipc/ipc_message.h"
-
-namespace base {
-class WaitableEvent;
-}
-
-namespace IPC {
-
-class MessageReplyDeserializer;
-
-class IPC_EXPORT SyncMessage : public Message {
- public:
-  SyncMessage(int32_t routing_id,
-              uint32_t type,
-              PriorityValue priority,
-              MessageReplyDeserializer* deserializer);
-  ~SyncMessage() override;
-
-  // Call this to get a deserializer for the output parameters.
-  // Note that this can only be called once, and the caller is responsible
-  // for deleting the deserializer when they're done.
-  MessageReplyDeserializer* GetReplyDeserializer();
-
-  // If this message can cause the receiver to block while waiting for user
-  // input (i.e. by calling MessageBox), then the caller needs to pump window
-  // messages and dispatch asynchronous messages while waiting for the reply.
-  // This call enables message pumping behavior while waiting for a reply to
-  // this message.
-  void EnableMessagePumping() {
-    header()->flags |= PUMPING_MSGS_BIT;
-  }
-
-  // Indicates whether window messages should be pumped while waiting for a
-  // reply to this message.
-  bool ShouldPumpMessages() const {
-    return (header()->flags & PUMPING_MSGS_BIT) != 0;
-  }
-
-  // Returns true if the message is a reply to the given request id.
-  static bool IsMessageReplyTo(const Message& msg, int request_id);
-
-  // Given a reply message, returns an iterator to the beginning of the data
-  // (i.e. skips over the synchronous specific data).
-  static base::PickleIterator GetDataIterator(const Message* msg);
-
-  // Given a synchronous message (or its reply), returns its id.
-  static int GetMessageId(const Message& msg);
-
-  // Generates a reply message to the given message.
-  static Message* GenerateReply(const Message* msg);
-
- private:
-  struct SyncHeader {
-    // unique ID (unique per sender)
-    int message_id;
-  };
-
-  static bool ReadSyncHeader(const Message& msg, SyncHeader* header);
-  static bool WriteSyncHeader(Message* msg, const SyncHeader& header);
-
-  std::unique_ptr<MessageReplyDeserializer> deserializer_;
-};
-
-// Used to deserialize parameters from a reply to a synchronous message
-class IPC_EXPORT MessageReplyDeserializer {
- public:
-  virtual ~MessageReplyDeserializer() {}
-  bool SerializeOutputParameters(const Message& msg);
- private:
-  // Derived classes need to implement this, using the given iterator (which
-  // is skipped past the header for synchronous messages).
-  virtual bool SerializeOutputParameters(const Message& msg,
-                                         base::PickleIterator iter) = 0;
-};
-
-// When sending a synchronous message, this structure contains an object
-// that knows how to deserialize the response.
-struct PendingSyncMsg {
-  PendingSyncMsg(int id, MessageReplyDeserializer* d, base::WaitableEvent* e)
-      : id(id), deserializer(d), done_event(e), send_result(false) {}
-
-  int id;
-  MessageReplyDeserializer* deserializer;
-  base::WaitableEvent* done_event;
-  bool send_result;
-};
-
-}  // namespace IPC
-
-#endif  // IPC_IPC_SYNC_MESSAGE_H_
diff --git a/libmojo.pc.in b/libmojo.pc.in
deleted file mode 100644
index a750bdd..0000000
--- a/libmojo.pc.in
+++ /dev/null
@@ -1,13 +0,0 @@
-bslot=@BSLOT@
-prefix=/usr
-exec_prefix=${prefix}
-libdir=${exec_prefix}/@LIB@
-includedir=${prefix}/include
-
-Name: libmojo
-Description: Chrome Mojo IPC library
-Requires.private:
-Version: ${bslot}
-Libs: -lmojo-${bslot}.pic
-Libs.private:
-Cflags: -I${includedir}/libmojo-${bslot} -Wno-cast-qual -Wno-cast-align
diff --git a/mojo/BUILD.gn b/mojo/BUILD.gn
deleted file mode 100644
index 070e2d1..0000000
--- a/mojo/BUILD.gn
+++ /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.
-
-import("//build/config/ui.gni")
-
-group("mojo") {
-  # Meta-target, don't link into production code.
-  testonly = true
-  deps = [
-    ":tests",
-    "//mojo/common",
-  ]
-
-  if (!(is_linux && current_cpu == "x86")) {
-    deps += [ "//mojo/public" ]
-  }
-
-  if (is_android) {
-    deps += [ "//mojo/android" ]
-  }
-
-  deps += [ "//services/service_manager:all" ]
-}
-
-group("tests") {
-  testonly = true
-  deps = [
-    "//ipc:ipc_tests",
-    "//mojo/common:mojo_common_unittests",
-    "//mojo/edk/js/tests",
-    "//mojo/edk/system:mojo_message_pipe_perftests",
-    "//mojo/edk/system:mojo_system_unittests",
-    "//mojo/edk/test:mojo_public_bindings_perftests",
-    "//mojo/edk/test:mojo_public_bindings_unittests",
-    "//mojo/edk/test:mojo_public_system_perftests",
-    "//mojo/edk/test:mojo_public_system_unittests",
-    "//services/service_manager/public/cpp/tests:mojo_public_application_unittests",
-    "//services/service_manager/tests",
-  ]
-}
diff --git a/mojo/DEPS b/mojo/DEPS
deleted file mode 100644
index 49d7fd3..0000000
--- a/mojo/DEPS
+++ /dev/null
@@ -1,7 +0,0 @@
-include_rules = [
-  "+base",
-  "+build",
-  "+testing",
-
-  "+services/service_manager",
-]
diff --git a/mojo/PRESUBMIT.py b/mojo/PRESUBMIT.py
deleted file mode 100644
index 2766055..0000000
--- a/mojo/PRESUBMIT.py
+++ /dev/null
@@ -1,44 +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.
-
-"""Presubmit script for mojo
-
-See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts
-for more details about the presubmit API built into depot_tools.
-"""
-
-import os.path
-
-def CheckChangeOnUpload(input_api, output_api):
-  # Additional python module paths (we're in src/mojo/); not everyone needs
-  # them, but it's easiest to add them to everyone's path.
-  # For ply and jinja2:
-  third_party_path = os.path.join(
-      input_api.PresubmitLocalPath(), "..", "third_party")
-  # For the bindings generator:
-  mojo_public_bindings_pylib_path = os.path.join(
-      input_api.PresubmitLocalPath(), "public", "tools", "bindings", "pylib")
-  # For the python bindings:
-  mojo_python_bindings_path = os.path.join(
-      input_api.PresubmitLocalPath(), "public", "python")
-  # TODO(vtl): Don't lint these files until the (many) problems are fixed
-  # (possibly by deleting/rewriting some files).
-  temporary_black_list = input_api.DEFAULT_BLACK_LIST + \
-      (r".*\bpublic[\\\/]tools[\\\/]bindings[\\\/]pylib[\\\/]mojom[\\\/]"
-           r"generate[\\\/].+\.py$",
-       r".*\bpublic[\\\/]tools[\\\/]bindings[\\\/]generators[\\\/].+\.py$",
-       r".*\bspy[\\\/]ui[\\\/].+\.py$",
-       r".*\btools[\\\/]pylib[\\\/]transitive_hash\.py$",
-       r".*\btools[\\\/]test_runner\.py$")
-
-  results = []
-  pylint_extra_paths = [
-      third_party_path,
-      mojo_public_bindings_pylib_path,
-      mojo_python_bindings_path,
-  ]
-  results += input_api.canned_checks.RunPylint(
-      input_api, output_api, extra_paths_list=pylint_extra_paths,
-      black_list=temporary_black_list)
-  return results
diff --git a/mojo/README.md b/mojo/README.md
deleted file mode 100644
index e1e7583..0000000
--- a/mojo/README.md
+++ /dev/null
@@ -1,142 +0,0 @@
-# ![Mojo Graphic](https://goo.gl/6CdlbH) Mojo
-This document is a subset of the [Mojo documentation](/mojo).
-
-[TOC]
-
-## Getting Started With Mojo
-
-To get started using Mojo in applications which already support it (such as
-Chrome), the fastest path forward will be to look at the bindings documentation
-for your language of choice ([**C++**](#C_Bindings),
-[**JavaScript**](#JavaScript-Bindings), or [**Java**](#Java-Bindings)) as well
-as the documentation for the
-[**Mojom IDL and bindings generator**](/mojo/public/tools/bindings).
-
-If you're looking for information on creating and/or connecting to services, see
-the top-level [Services documentation](/services).
-
-For specific details regarding the conversion of old things to new things, check
-out [Converting Legacy Chrome IPC To Mojo](/ipc).
-
-## System Overview
-
-Mojo is a layered collection of runtime libraries providing a platform-agnostic
-abstraction of common IPC primitives, a message IDL format, and a bindings
-library with code generation for multiple target languages to facilitate
-convenient message passing across arbitrary inter- and intra-process boundaries.
-
-The documentation here is segmented according to the different isolated layers
-and libraries comprising the system. The basic hierarchy of features is as
-follows:
-
-![Mojo Library Layering: EDK on bottom, different language bindings on top, public system support APIs in the middle](https://docs.google.com/drawings/d/1aNbLfF-fejgzxCxH_b8xAaCVvftW8BGTH_EHD7nvU1w/pub?w=570&h=327)
-
-## Embedder Development Kit (EDK)
-Every process to be interconnected via Mojo IPC is called a **Mojo embedder**
-and needs to embed the
-[**Embedder Development Kit (EDK)**](/mojo/edk/embedder) library. The EDK
-exposes the means for an embedder to physically connect one process to another
-using any supported native IPC primitive (*e.g.,* a UNIX domain socket or
-Windows named pipe) on the host platform.
-
-Details regarding where and how an application process actually embeds and
-configures the EDK are generaly hidden from the rest of the application code,
-and applications instead use the public System and Bindings APIs to get things
-done within processes that embed Mojo.
-
-## C System API
-Once the EDK is initialized within a process, the public
-[**C System API**](/mojo/public/c/system) is usable on any thread for the
-remainder of the process's lifetime. This is a lightweight API with a relatively
-small (and eventually stable) ABI. Typically this API is not used directly, but
-it is the foundation upon which all remaining upper layers are built. It exposes
-the fundamental capabilities to create and interact with various types of Mojo
-handles including **message pipes**, **data pipes**, and **shared buffers**.
-
-## High-Level System APIs
-
-There is a relatively small, higher-level system API for each supported
-language, built upon the low-level C API. Like the C API, direct usage of these
-system APIs is rare compared to the bindings APIs, but it is sometimes desirable
-or necessary.
-
-### C++
-The [**C++ System API**](/mojo/public/cpp/system) provides a layer of
-C++ helper classes and functions to make safe System API usage easier:
-strongly-typed handle scopers, synchronous waiting operations, system handle
-wrapping and unwrapping helpers, common handle operations, and utilities for
-more easily watching handle state changes.
-
-### JavaScript
-The [**JavaScript APIs**](/mojo/public/js) are WIP. :)
-
-### Java
-The [**Java System API**](/mojo/public/java/system) provides helper classes for
-working with Mojo primitives, covering all basic functionality of the low-level
-C API.
-
-## High-Level Bindings APIs
-Typically developers do not use raw message pipe I/O directly, but instead
-define some set of interfaces which are used to generate code that message pipe
-usage feel like a more idiomatic method-calling interface in the target
-language of choice. This is the bindings layer.
-
-### Mojom IDL and Bindings Generator
-Interfaces are defined using the [**Mojom IDL**](/mojo/public/tools/bindings),
-which can be fed to the [**bindings generator**](/mojo/public/tools/bindings) to
-generate code in various supported languages. Generated code manages
-serialization and deserialization of messages between interface clients and
-implementations, simplifying the code -- and ultimately hiding the message pipe
--- on either side of an interface connection.
-
-### C++ Bindings
-By far the most commonly used API defined by Mojo, the
-[**C++ Bindings API**](/mojo/public/cpp/bindings) exposes a robust set of
-features for interacting with message pipes via generated C++ bindings code,
-including support for sets of related bindings endpoints, associated interfaces,
-nested sync IPC, versioning, bad-message reporting, arbitrary message filter
-injection, and convenient test facilities.
-
-### JavaScript Bindings
-The [**JavaScript APIs**](/mojo/public/js) are WIP. :)
-
-### Java Bindings
-The [**Java Bindings API**](/mojo/public/java/bindings) provides helper classes
-for working with Java code emitted by the bindings generator.
-
-## FAQ
-
-### Why not protobuf? Why a new thing?
-There are number of potentially decent answers to this question, but the
-deal-breaker is that a useful IPC mechanism must support transfer of native
-object handles (*e.g.* file descriptors) across process boundaries. Other
-non-new IPC things that do support this capability (*e.g.* D-Bus) have their own
-substantial deficiencies.
-
-### Are message pipes expensive?
-No. As an implementation detail, creating a message pipe is essentially
-generating two random numbers and stuffing them into a hash table, along with a
-few tiny heap allocations.
-
-### So really, can I create like, thousands of them?
-Yes! Nobody will mind. Create millions if you like. (OK but maybe don't.)
-
-### Can I use in-process message pipes?
-Yes, and message pipe usage is identical regardless of whether the pipe actually
-crosses a process boundary -- in fact this detail is intentionally obscured.
-
-Message pipes which don't cross a process boundary are efficient: sent messages
-are never copied, and a write on one end will synchronously modify the message
-queue on the other end. When working with generated C++ bindings, for example,
-the net result is that an `InterfacePtr` on one thread sending a message to a
-`Binding` on another thread (or even the same thread) is effectively a
-`PostTask` to the `Binding`'s `TaskRunner` with the added -- but often small --
-costs of serialization, deserialization, validation, and some internal routing
-logic.
-
-### What about ____?
-
-Please post questions to
-[`chromium-mojo@chromium.org`](https://groups.google.com/a/chromium.org/forum/#!forum/chromium-mojo)!
-The list is quite responsive.
-
diff --git a/mojo/android/BUILD.gn b/mojo/android/BUILD.gn
deleted file mode 100644
index 1a8cdbd..0000000
--- a/mojo/android/BUILD.gn
+++ /dev/null
@@ -1,155 +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.
-
-import("//build/config/android/rules.gni")
-
-group("android") {
-  testonly = true
-  deps = [
-    ":mojo_javatests",
-    ":mojo_test_apk",
-    ":system_java",
-  ]
-}
-
-generate_jni("jni_headers") {
-  sources = [
-    "javatests/src/org/chromium/mojo/MojoTestCase.java",
-    "javatests/src/org/chromium/mojo/bindings/ValidationTestUtil.java",
-  ]
-  public_deps = [
-    ":system_java_jni_headers",
-  ]
-
-  jni_package = "mojo"
-}
-
-generate_jni("system_java_jni_headers") {
-  sources = [
-    "system/src/org/chromium/mojo/system/impl/BaseRunLoop.java",
-    "system/src/org/chromium/mojo/system/impl/CoreImpl.java",
-    "system/src/org/chromium/mojo/system/impl/WatcherImpl.java",
-  ]
-
-  jni_package = "mojo"
-}
-
-source_set("libsystem_java") {
-  sources = [
-    "system/base_run_loop.cc",
-    "system/base_run_loop.h",
-    "system/core_impl.cc",
-    "system/core_impl.h",
-    "system/watcher_impl.cc",
-    "system/watcher_impl.h",
-  ]
-
-  deps = [
-    ":system_java_jni_headers",
-    "//base",
-    "//mojo/public/c/system",
-    "//mojo/public/cpp/system",
-  ]
-}
-
-android_library("system_java") {
-  java_files = [
-    "system/src/org/chromium/mojo/system/impl/BaseRunLoop.java",
-    "system/src/org/chromium/mojo/system/impl/CoreImpl.java",
-    "system/src/org/chromium/mojo/system/impl/DataPipeConsumerHandleImpl.java",
-    "system/src/org/chromium/mojo/system/impl/DataPipeProducerHandleImpl.java",
-    "system/src/org/chromium/mojo/system/impl/HandleBase.java",
-    "system/src/org/chromium/mojo/system/impl/MessagePipeHandleImpl.java",
-    "system/src/org/chromium/mojo/system/impl/SharedBufferHandleImpl.java",
-    "system/src/org/chromium/mojo/system/impl/UntypedHandleImpl.java",
-    "system/src/org/chromium/mojo/system/impl/WatcherImpl.java",
-  ]
-
-  deps = [
-    "//base:base_java",
-    "//mojo/public/java:system_java",
-  ]
-}
-
-android_library("mojo_javatests") {
-  testonly = true
-  java_files = [
-    "javatests/src/org/chromium/mojo/HandleMock.java",
-    "javatests/src/org/chromium/mojo/MojoTestCase.java",
-    "javatests/src/org/chromium/mojo/TestUtils.java",
-    "javatests/src/org/chromium/mojo/bindings/BindingsHelperTest.java",
-    "javatests/src/org/chromium/mojo/bindings/BindingsTest.java",
-    "javatests/src/org/chromium/mojo/bindings/BindingsTestUtils.java",
-    "javatests/src/org/chromium/mojo/bindings/BindingsVersioningTest.java",
-    "javatests/src/org/chromium/mojo/bindings/CallbacksTest.java",
-    "javatests/src/org/chromium/mojo/bindings/ConnectorTest.java",
-    "javatests/src/org/chromium/mojo/bindings/ExecutorFactoryTest.java",
-    "javatests/src/org/chromium/mojo/bindings/InterfacesTest.java",
-    "javatests/src/org/chromium/mojo/bindings/MessageHeaderTest.java",
-    "javatests/src/org/chromium/mojo/bindings/ReadAndDispatchMessageTest.java",
-    "javatests/src/org/chromium/mojo/bindings/RouterTest.java",
-    "javatests/src/org/chromium/mojo/bindings/SerializationTest.java",
-    "javatests/src/org/chromium/mojo/bindings/test/mojom/mojo/IntegrationTestInterfaceTestHelper.java",
-    "javatests/src/org/chromium/mojo/bindings/ValidationTest.java",
-    "javatests/src/org/chromium/mojo/bindings/ValidationTestUtil.java",
-    "javatests/src/org/chromium/mojo/bindings/ValidationTestUtilTest.java",
-    "javatests/src/org/chromium/mojo/system/impl/CoreImplTest.java",
-    "javatests/src/org/chromium/mojo/system/impl/WatcherImplTest.java",
-  ]
-
-  deps = [
-    ":system_java",
-    "//base:base_java",
-    "//base:base_java_test_support",
-    "//mojo/public/interfaces/bindings/tests:test_interfaces_java",
-    "//mojo/public/interfaces/bindings/tests:test_mojom_import2_java",
-    "//mojo/public/interfaces/bindings/tests:test_mojom_import_java",
-    "//mojo/public/java:bindings_java",
-    "//mojo/public/java:system_java",
-    "//third_party/android_support_test_runner:runner_java",
-  ]
-
-  data = [
-    "//mojo/public/interfaces/bindings/tests/data/validation/",
-  ]
-}
-
-shared_library("mojo_java_unittests") {
-  testonly = true
-
-  sources = [
-    "javatests/init_library.cc",
-    "javatests/mojo_test_case.cc",
-    "javatests/mojo_test_case.h",
-    "javatests/validation_test_util.cc",
-    "javatests/validation_test_util.h",
-  ]
-
-  deps = [
-    ":jni_headers",
-    ":libsystem_java",
-    ":system_java_jni_headers",
-    "//base",
-    "//base/test:test_support",
-    "//build/config/sanitizers:deps",
-    "//mojo/edk/system",
-    "//mojo/public/cpp/bindings/tests:mojo_public_bindings_test_utils",
-    "//mojo/public/cpp/test_support:test_utils",
-  ]
-  defines = [ "UNIT_TEST" ]
-}
-
-instrumentation_test_apk("mojo_test_apk") {
-  deps = [
-    ":mojo_javatests",
-    ":system_java",
-    "//base:base_java",
-    "//mojo/public/interfaces/bindings/tests:test_interfaces",
-    "//mojo/public/java:bindings_java",
-    "//third_party/android_support_test_runner:runner_java",
-  ]
-  shared_libraries = [ ":mojo_java_unittests" ]
-  apk_name = "MojoTest"
-  android_manifest = "javatests/AndroidManifest.xml"
-}
diff --git a/mojo/android/DEPS b/mojo/android/DEPS
deleted file mode 100644
index c80012b..0000000
--- a/mojo/android/DEPS
+++ /dev/null
@@ -1,3 +0,0 @@
-include_rules = [
-  "+jni",
-]
diff --git a/mojo/android/javatests/AndroidManifest.xml b/mojo/android/javatests/AndroidManifest.xml
deleted file mode 100644
index 32a3927..0000000
--- a/mojo/android/javatests/AndroidManifest.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-  <!-- 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. -->
-  <!-- package name must be unique so suffix with "tests" so package loader
-       doesn't ignore this. -->
-  <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-      xmlns:tools="http://schemas.android.com/tools"
-      package="org.chromium.mojo.tests">
-
-    <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="21" />
-
-    <uses-permission android:name="android.permission.INJECT_EVENTS"
-        tools:ignore="ProtectedPermissions"/>
-    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
-    <uses-permission android:name="android.permission.RUN_INSTRUMENTATION" />
-
-    <!-- We add an application tag here just so that we can indicate that this
-         package needs to link against the android.test library, which is
-         needed when building test cases. -->
-    <application>
-        <uses-library android:name="android.test.runner" />
-    </application>
-
-    <instrumentation android:name="android.test.InstrumentationTestRunner"
-        android:targetPackage="org.chromium.mojo.tests"
-        android:label="Tests for org.chromium.mojo"/>
-
-</manifest>
diff --git a/mojo/android/javatests/DEPS b/mojo/android/javatests/DEPS
deleted file mode 100644
index 78cf465..0000000
--- a/mojo/android/javatests/DEPS
+++ /dev/null
@@ -1,4 +0,0 @@
-include_rules = [
-  # out should be allowed by default, but bots are failing on this.
-  "+out",
-]
diff --git a/mojo/android/javatests/apk/.empty b/mojo/android/javatests/apk/.empty
deleted file mode 100644
index e69de29..0000000
--- a/mojo/android/javatests/apk/.empty
+++ /dev/null
diff --git a/mojo/android/javatests/init_library.cc b/mojo/android/javatests/init_library.cc
deleted file mode 100644
index 9e1a593..0000000
--- a/mojo/android/javatests/init_library.cc
+++ /dev/null
@@ -1,50 +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 "base/android/base_jni_onload.h"
-#include "base/android/base_jni_registrar.h"
-#include "base/android/jni_android.h"
-#include "base/android/jni_registrar.h"
-#include "base/android/library_loader/library_loader_hooks.h"
-#include "base/bind.h"
-#include "mojo/android/javatests/mojo_test_case.h"
-#include "mojo/android/javatests/validation_test_util.h"
-#include "mojo/android/system/core_impl.h"
-#include "mojo/android/system/watcher_impl.h"
-#include "mojo/edk/embedder/embedder.h"
-
-namespace {
-
-base::android::RegistrationMethod kMojoRegisteredMethods[] = {
-    {"CoreImpl", mojo::android::RegisterCoreImpl},
-    {"MojoTestCase", mojo::android::RegisterMojoTestCase},
-    {"ValidationTestUtil", mojo::android::RegisterValidationTestUtil},
-    {"WatcherImpl", mojo::android::RegisterWatcherImpl},
-};
-
-bool RegisterJNI(JNIEnv* env) {
-  return base::android::RegisterJni(env) &&
-         RegisterNativeMethods(env, kMojoRegisteredMethods,
-                               arraysize(kMojoRegisteredMethods));
-}
-
-bool NativeInit() {
-  if (!base::android::OnJNIOnLoadInit())
-    return false;
-
-  mojo::edk::Init();
-  return true;
-}
-
-}  // namespace
-
-JNI_EXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved) {
-  base::android::InitVM(vm);
-  JNIEnv* env = base::android::AttachCurrentThread();
-  if (!base::android::OnJNIOnLoadRegisterJNI(env) || !RegisterJNI(env) ||
-      !NativeInit()) {
-    return -1;
-  }
-  return JNI_VERSION_1_4;
-}
diff --git a/mojo/android/javatests/mojo_test_case.cc b/mojo/android/javatests/mojo_test_case.cc
deleted file mode 100644
index fc59009..0000000
--- a/mojo/android/javatests/mojo_test_case.cc
+++ /dev/null
@@ -1,70 +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 "mojo/android/javatests/mojo_test_case.h"
-
-#include "base/android/jni_android.h"
-#include "base/android/scoped_java_ref.h"
-#include "base/at_exit.h"
-#include "base/bind.h"
-#include "base/location.h"
-#include "base/logging.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "base/single_thread_task_runner.h"
-#include "base/test/test_support_android.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "jni/MojoTestCase_jni.h"
-
-using base::android::JavaParamRef;
-
-namespace {
-
-struct TestEnvironment {
-  TestEnvironment() {}
-
-  base::ShadowingAtExitManager at_exit;
-  base::MessageLoop message_loop;
-};
-
-}  // namespace
-
-namespace mojo {
-namespace android {
-
-static void Init(JNIEnv* env, const JavaParamRef<jobject>& jcaller) {
-  base::InitAndroidTestMessageLoop();
-}
-
-static jlong SetupTestEnvironment(JNIEnv* env,
-                                  const JavaParamRef<jobject>& jcaller) {
-  return reinterpret_cast<intptr_t>(new TestEnvironment());
-}
-
-static void TearDownTestEnvironment(JNIEnv* env,
-                                    const JavaParamRef<jobject>& jcaller,
-                                    jlong test_environment) {
-  delete reinterpret_cast<TestEnvironment*>(test_environment);
-}
-
-static void RunLoop(JNIEnv* env,
-                    const JavaParamRef<jobject>& jcaller,
-                    jlong timeout_ms) {
-  base::RunLoop run_loop;
-  if (timeout_ms) {
-    base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
-        FROM_HERE, base::MessageLoop::QuitWhenIdleClosure(),
-        base::TimeDelta::FromMilliseconds(timeout_ms));
-    run_loop.Run();
-  } else {
-    run_loop.RunUntilIdle();
-  }
-}
-
-bool RegisterMojoTestCase(JNIEnv* env) {
-  return RegisterNativesImpl(env);
-}
-
-}  // namespace android
-}  // namespace mojo
diff --git a/mojo/android/javatests/mojo_test_case.h b/mojo/android/javatests/mojo_test_case.h
deleted file mode 100644
index 2ce3428..0000000
--- a/mojo/android/javatests/mojo_test_case.h
+++ /dev/null
@@ -1,20 +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 MOJO_ANDROID_JAVATESTS_CORE_TEST_H_
-#define MOJO_ANDROID_JAVATESTS_CORE_TEST_H_
-
-#include <jni.h>
-
-#include "base/android/jni_android.h"
-
-namespace mojo {
-namespace android {
-
-JNI_EXPORT bool RegisterMojoTestCase(JNIEnv* env);
-
-}  // namespace android
-}  // namespace mojo
-
-#endif  // MOJO_SYSTEM_ANDROID_JAVATESTS_CORE_TEST_H_
diff --git a/mojo/android/javatests/src/org/chromium/mojo/HandleMock.java b/mojo/android/javatests/src/org/chromium/mojo/HandleMock.java
deleted file mode 100644
index 1f8de94..0000000
--- a/mojo/android/javatests/src/org/chromium/mojo/HandleMock.java
+++ /dev/null
@@ -1,226 +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.
-
-package org.chromium.mojo;
-
-import org.chromium.mojo.system.Core;
-import org.chromium.mojo.system.Core.HandleSignalsState;
-import org.chromium.mojo.system.DataPipe;
-import org.chromium.mojo.system.DataPipe.ConsumerHandle;
-import org.chromium.mojo.system.DataPipe.ProducerHandle;
-import org.chromium.mojo.system.Handle;
-import org.chromium.mojo.system.MessagePipeHandle;
-import org.chromium.mojo.system.MojoResult;
-import org.chromium.mojo.system.ResultAnd;
-import org.chromium.mojo.system.SharedBufferHandle;
-import org.chromium.mojo.system.UntypedHandle;
-import org.chromium.mojo.system.impl.CoreImpl;
-
-import java.nio.ByteBuffer;
-import java.util.List;
-
-/**
- * A mock handle, that does nothing.
- */
-public class HandleMock implements UntypedHandle, MessagePipeHandle,
-        ProducerHandle, ConsumerHandle, SharedBufferHandle {
-
-    /**
-     * @see Handle#close()
-     */
-    @Override
-    public void close() {
-        // Do nothing.
-    }
-
-    /**
-     * @see Handle#querySignalsState()
-     */
-    @Override
-    public HandleSignalsState querySignalsState() {
-        return null;
-    }
-
-    /**
-     * @see Handle#isValid()
-     */
-    @Override
-    public boolean isValid() {
-        return true;
-    }
-
-    /**
-     * @see Handle#toUntypedHandle()
-     */
-    @Override
-    public UntypedHandle toUntypedHandle() {
-        return this;
-    }
-
-    /**
-     * @see org.chromium.mojo.system.Handle#getCore()
-     */
-    @Override
-    public Core getCore() {
-        return CoreImpl.getInstance();
-    }
-
-    /**
-     * @see org.chromium.mojo.system.UntypedHandle#pass()
-     */
-    @Override
-    public HandleMock pass() {
-        return this;
-    }
-
-    /**
-     * @see Handle#releaseNativeHandle()
-     */
-    @Override
-    public int releaseNativeHandle() {
-        return 0;
-    }
-
-    /**
-     * @see ConsumerHandle#discardData(int, DataPipe.ReadFlags)
-     */
-    @Override
-    public int discardData(int numBytes, DataPipe.ReadFlags flags) {
-        // Do nothing.
-        return 0;
-    }
-
-    /**
-     * @see ConsumerHandle#readData(java.nio.ByteBuffer, DataPipe.ReadFlags)
-     */
-    @Override
-    public ResultAnd<Integer> readData(ByteBuffer elements, DataPipe.ReadFlags flags) {
-        // Do nothing.
-        return new ResultAnd<Integer>(MojoResult.OK, 0);
-    }
-
-    /**
-     * @see ConsumerHandle#beginReadData(int, DataPipe.ReadFlags)
-     */
-    @Override
-    public ByteBuffer beginReadData(int numBytes,
-            DataPipe.ReadFlags flags) {
-        // Do nothing.
-        return null;
-    }
-
-    /**
-     * @see ConsumerHandle#endReadData(int)
-     */
-    @Override
-    public void endReadData(int numBytesRead) {
-        // Do nothing.
-    }
-
-    /**
-     * @see ProducerHandle#writeData(java.nio.ByteBuffer, DataPipe.WriteFlags)
-     */
-    @Override
-    public ResultAnd<Integer> writeData(ByteBuffer elements, DataPipe.WriteFlags flags) {
-        // Do nothing.
-        return new ResultAnd<Integer>(MojoResult.OK, 0);
-    }
-
-    /**
-     * @see ProducerHandle#beginWriteData(int, DataPipe.WriteFlags)
-     */
-    @Override
-    public ByteBuffer beginWriteData(int numBytes,
-            DataPipe.WriteFlags flags) {
-        // Do nothing.
-        return null;
-    }
-
-    /**
-     * @see ProducerHandle#endWriteData(int)
-     */
-    @Override
-    public void endWriteData(int numBytesWritten) {
-        // Do nothing.
-    }
-
-    /**
-     * @see MessagePipeHandle#writeMessage(java.nio.ByteBuffer, java.util.List,
-     *      MessagePipeHandle.WriteFlags)
-     */
-    @Override
-    public void writeMessage(ByteBuffer bytes, List<? extends Handle> handles,
-            WriteFlags flags) {
-        // Do nothing.
-    }
-
-    /**
-     * @see MessagePipeHandle#readMessage(java.nio.ByteBuffer, int, MessagePipeHandle.ReadFlags)
-     */
-    @Override
-    public ResultAnd<ReadMessageResult> readMessage(
-            ByteBuffer bytes, int maxNumberOfHandles, ReadFlags flags) {
-        // Do nothing.
-        return new ResultAnd<ReadMessageResult>(MojoResult.OK, new ReadMessageResult());
-    }
-
-    /**
-     * @see UntypedHandle#toMessagePipeHandle()
-     */
-    @Override
-    public MessagePipeHandle toMessagePipeHandle() {
-        return this;
-    }
-
-    /**
-     * @see UntypedHandle#toDataPipeConsumerHandle()
-     */
-    @Override
-    public ConsumerHandle toDataPipeConsumerHandle() {
-        return this;
-    }
-
-    /**
-     * @see UntypedHandle#toDataPipeProducerHandle()
-     */
-    @Override
-    public ProducerHandle toDataPipeProducerHandle() {
-        return this;
-    }
-
-    /**
-     * @see UntypedHandle#toSharedBufferHandle()
-     */
-    @Override
-    public SharedBufferHandle toSharedBufferHandle() {
-        return this;
-    }
-
-    /**
-     * @see SharedBufferHandle#duplicate(SharedBufferHandle.DuplicateOptions)
-     */
-    @Override
-    public SharedBufferHandle duplicate(DuplicateOptions options) {
-        // Do nothing.
-        return null;
-    }
-
-    /**
-     * @see SharedBufferHandle#map(long, long, SharedBufferHandle.MapFlags)
-     */
-    @Override
-    public ByteBuffer map(long offset, long numBytes, MapFlags flags) {
-        // Do nothing.
-        return null;
-    }
-
-    /**
-     * @see SharedBufferHandle#unmap(java.nio.ByteBuffer)
-     */
-    @Override
-    public void unmap(ByteBuffer buffer) {
-        // Do nothing.
-    }
-
-}
diff --git a/mojo/android/javatests/src/org/chromium/mojo/MojoTestCase.java b/mojo/android/javatests/src/org/chromium/mojo/MojoTestCase.java
deleted file mode 100644
index f4d7ab7..0000000
--- a/mojo/android/javatests/src/org/chromium/mojo/MojoTestCase.java
+++ /dev/null
@@ -1,66 +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.
-
-package org.chromium.mojo;
-
-import android.test.InstrumentationTestCase;
-
-import org.chromium.base.ContextUtils;
-import org.chromium.base.annotations.JNINamespace;
-import org.chromium.base.library_loader.LibraryLoader;
-import org.chromium.base.library_loader.LibraryProcessType;
-
-/**
- * Base class to test mojo. Setup the environment.
- */
-@JNINamespace("mojo::android")
-public class MojoTestCase extends InstrumentationTestCase {
-
-    private long mTestEnvironmentPointer;
-
-    /**
-     * @see junit.framework.TestCase#setUp()
-     */
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        ContextUtils.initApplicationContext(
-                getInstrumentation().getTargetContext().getApplicationContext());
-        LibraryLoader.get(LibraryProcessType.PROCESS_BROWSER).ensureInitialized();
-        nativeInit();
-        mTestEnvironmentPointer = nativeSetupTestEnvironment();
-    }
-
-    /**
-     * @see android.test.InstrumentationTestCase#tearDown()
-     */
-    @Override
-    protected void tearDown() throws Exception {
-        nativeTearDownTestEnvironment(mTestEnvironmentPointer);
-        super.tearDown();
-    }
-
-    /**
-     * Runs the run loop for the given time.
-     */
-    protected void runLoop(long timeoutMS) {
-        nativeRunLoop(timeoutMS);
-    }
-
-    /**
-     * Runs the run loop until no handle or task are immediately available.
-     */
-    protected void runLoopUntilIdle() {
-        nativeRunLoop(0);
-    }
-
-    private native void nativeInit();
-
-    private native long nativeSetupTestEnvironment();
-
-    private native void nativeTearDownTestEnvironment(long testEnvironment);
-
-    private native void nativeRunLoop(long timeoutMS);
-
-}
diff --git a/mojo/android/javatests/src/org/chromium/mojo/TestUtils.java b/mojo/android/javatests/src/org/chromium/mojo/TestUtils.java
deleted file mode 100644
index d10d0d7..0000000
--- a/mojo/android/javatests/src/org/chromium/mojo/TestUtils.java
+++ /dev/null
@@ -1,32 +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.
-
-package org.chromium.mojo;
-
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import java.util.Random;
-
-/**
- * Utilities methods for tests.
- */
-public final class TestUtils {
-
-    private static final Random RANDOM = new Random();
-
-    /**
-     * Returns a new direct ByteBuffer of the given size with random (but reproducible) data.
-     */
-    public static ByteBuffer newRandomBuffer(int size) {
-        byte bytes[] = new byte[size];
-        RANDOM.setSeed(size);
-        RANDOM.nextBytes(bytes);
-        ByteBuffer data = ByteBuffer.allocateDirect(size);
-        data.order(ByteOrder.LITTLE_ENDIAN);
-        data.put(bytes);
-        data.flip();
-        return data;
-    }
-
-}
diff --git a/mojo/android/javatests/src/org/chromium/mojo/bindings/BindingsHelperTest.java b/mojo/android/javatests/src/org/chromium/mojo/bindings/BindingsHelperTest.java
deleted file mode 100644
index 38bd348..0000000
--- a/mojo/android/javatests/src/org/chromium/mojo/bindings/BindingsHelperTest.java
+++ /dev/null
@@ -1,55 +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.
-
-package org.chromium.mojo.bindings;
-
-import android.support.test.filters.SmallTest;
-
-import junit.framework.TestCase;
-
-import java.nio.charset.Charset;
-
-/**
- * Testing {@link BindingsHelper}.
- */
-public class BindingsHelperTest extends TestCase {
-
-    /**
-     * Testing {@link BindingsHelper#utf8StringSizeInBytes(String)}.
-     */
-    @SmallTest
-    public void testUTF8StringLength() {
-        String[] stringsToTest = {
-            "",
-            "a",
-            "hello world",
-            "éléphant",
-            "𠜎𠜱𠝹𠱓𠱸𠲖𠳏𠳕",
-            "你午饭想吃什么",
-            "你午饭想吃什么\0éléphant",
-        };
-        for (String s : stringsToTest) {
-            assertEquals(s.getBytes(Charset.forName("utf8")).length,
-                    BindingsHelper.utf8StringSizeInBytes(s));
-        }
-        assertEquals(1, BindingsHelper.utf8StringSizeInBytes("\0"));
-        String s = new StringBuilder().appendCodePoint(0x0).appendCodePoint(0x80)
-                .appendCodePoint(0x800).appendCodePoint(0x10000).toString();
-        assertEquals(10, BindingsHelper.utf8StringSizeInBytes(s));
-        assertEquals(10, s.getBytes(Charset.forName("utf8")).length);
-    }
-
-    /**
-     * Testing {@link BindingsHelper#align(int)}.
-     */
-    @SmallTest
-    public void testAlign() {
-        for (int i = 0; i < 3 * BindingsHelper.ALIGNMENT; ++i) {
-            int j = BindingsHelper.align(i);
-            assertTrue(j >= i);
-            assertTrue(j % BindingsHelper.ALIGNMENT == 0);
-            assertTrue(j - i < BindingsHelper.ALIGNMENT);
-        }
-    }
-}
diff --git a/mojo/android/javatests/src/org/chromium/mojo/bindings/BindingsTest.java b/mojo/android/javatests/src/org/chromium/mojo/bindings/BindingsTest.java
deleted file mode 100644
index d280c77..0000000
--- a/mojo/android/javatests/src/org/chromium/mojo/bindings/BindingsTest.java
+++ /dev/null
@@ -1,241 +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.
-
-package org.chromium.mojo.bindings;
-
-import android.support.test.filters.SmallTest;
-
-import junit.framework.TestCase;
-
-import org.chromium.mojo.HandleMock;
-import org.chromium.mojo.bindings.test.mojom.imported.Color;
-import org.chromium.mojo.bindings.test.mojom.imported.Point;
-import org.chromium.mojo.bindings.test.mojom.imported.Shape;
-import org.chromium.mojo.bindings.test.mojom.imported.Thing;
-import org.chromium.mojo.bindings.test.mojom.sample.Bar;
-import org.chromium.mojo.bindings.test.mojom.sample.Bar.Type;
-import org.chromium.mojo.bindings.test.mojom.sample.DefaultsTest;
-import org.chromium.mojo.bindings.test.mojom.sample.Enum;
-import org.chromium.mojo.bindings.test.mojom.sample.Foo;
-import org.chromium.mojo.bindings.test.mojom.sample.InterfaceConstants;
-import org.chromium.mojo.bindings.test.mojom.sample.SampleServiceConstants;
-import org.chromium.mojo.bindings.test.mojom.test_structs.EmptyStruct;
-import org.chromium.mojo.bindings.test.mojom.test_structs.Rect;
-import org.chromium.mojo.system.DataPipe.ConsumerHandle;
-import org.chromium.mojo.system.DataPipe.ProducerHandle;
-import org.chromium.mojo.system.MessagePipeHandle;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Testing generated classes and associated features.
- */
-public class BindingsTest extends TestCase {
-
-    /**
-     * Create a new typical Bar instance.
-     */
-    private static Bar newBar() {
-        Bar bar = new Bar();
-        bar.alpha = (byte) 0x01;
-        bar.beta = (byte) 0x02;
-        bar.gamma = (byte) 0x03;
-        bar.type = Type.BOTH;
-        return bar;
-    }
-
-    /**
-     * Create a new typical Foo instance.
-     */
-    private static Foo createFoo() {
-        Foo foo = new Foo();
-        foo.name = "HELLO WORLD";
-        foo.arrayOfArrayOfBools = new boolean[][] {
-            { true, false, true }, { }, { }, { false }, { true } };
-        foo.bar = newBar();
-        foo.a = true;
-        foo.c = true;
-        foo.data = new byte[] { 0x01, 0x02, 0x03 };
-        foo.extraBars = new Bar[] { newBar(), newBar() };
-        String[][][] strings = new String[3][2][1];
-        for (int i0 = 0; i0 < strings.length; ++i0) {
-            for (int i1 = 0; i1 < strings[i0].length; ++i1) {
-                for (int i2 = 0; i2 < strings[i0][i1].length; ++i2) {
-                    strings[i0][i1][i2] = "Hello(" + i0 + ", " + i1 + ", " + i2 + ")";
-                }
-            }
-        }
-        foo.multiArrayOfStrings = strings;
-        ConsumerHandle[] inputStreams = new ConsumerHandle[5];
-        for (int i = 0; i < inputStreams.length; ++i) {
-            inputStreams[i] = new HandleMock();
-        }
-        foo.inputStreams = inputStreams;
-        ProducerHandle[] outputStreams = new ProducerHandle[3];
-        for (int i = 0; i < outputStreams.length; ++i) {
-            outputStreams[i] = new HandleMock();
-        }
-        foo.outputStreams = outputStreams;
-        foo.source = new HandleMock();
-        return foo;
-    }
-
-    private static Rect createRect(int x, int y, int width, int height) {
-        Rect rect = new Rect();
-        rect.x = x;
-        rect.y = y;
-        rect.width = width;
-        rect.height = height;
-        return rect;
-    }
-
-    private static <T> void checkConstantField(
-            Field field, Class<T> expectedClass, T value) throws IllegalAccessException {
-        assertEquals(expectedClass, field.getType());
-        assertEquals(Modifier.FINAL, field.getModifiers() & Modifier.FINAL);
-        assertEquals(Modifier.STATIC, field.getModifiers() & Modifier.STATIC);
-        assertEquals(value, field.get(null));
-    }
-
-    private static <T> void checkField(Field field, Class<T> expectedClass,
-            Object object, T value) throws IllegalArgumentException, IllegalAccessException {
-        assertEquals(expectedClass, field.getType());
-        assertEquals(0, field.getModifiers() & Modifier.FINAL);
-        assertEquals(0, field.getModifiers() & Modifier.STATIC);
-        assertEquals(value, field.get(object));
-    }
-
-    /**
-     * Testing constants are correctly generated.
-     */
-    @SmallTest
-    public void testConstants() throws NoSuchFieldException, SecurityException,
-            IllegalAccessException {
-        checkConstantField(SampleServiceConstants.class.getField("TWELVE"), byte.class, (byte) 12);
-        checkConstantField(InterfaceConstants.class.getField("LONG"), long.class, 4405L);
-    }
-
-    /**
-     * Testing enums are correctly generated.
-     */
-    @SmallTest
-    public void testEnums() throws NoSuchFieldException, SecurityException,
-            IllegalAccessException {
-        checkConstantField(Color.class.getField("RED"), int.class, 0);
-        checkConstantField(Color.class.getField("BLACK"), int.class, 1);
-
-        checkConstantField(Enum.class.getField("VALUE"), int.class, 0);
-
-        checkConstantField(Shape.class.getField("RECTANGLE"), int.class, 1);
-        checkConstantField(Shape.class.getField("CIRCLE"), int.class, 2);
-        checkConstantField(Shape.class.getField("TRIANGLE"), int.class, 3);
-    }
-
-    /**
-     * Testing default values on structs.
-     *
-     * @throws IllegalAccessException
-     * @throws IllegalArgumentException
-     */
-    @SmallTest
-    public void testStructDefaults() throws NoSuchFieldException, SecurityException,
-            IllegalArgumentException, IllegalAccessException {
-        // Check default values.
-        DefaultsTest test = new DefaultsTest();
-
-        checkField(DefaultsTest.class.getField("a0"), byte.class, test, (byte) -12);
-        checkField(DefaultsTest.class.getField("a1"), byte.class, test, (byte) 12);
-        checkField(DefaultsTest.class.getField("a2"), short.class, test, (short) 1234);
-        checkField(DefaultsTest.class.getField("a3"), short.class, test, (short) 34567);
-        checkField(DefaultsTest.class.getField("a4"), int.class, test, 123456);
-        checkField(DefaultsTest.class.getField("a5"), int.class, test, (int) 3456789012L);
-        checkField(DefaultsTest.class.getField("a6"), long.class, test, -111111111111L);
-        // -8446744073709551617 == 9999999999999999999 - 2 ^ 64.
-        checkField(DefaultsTest.class.getField("a7"), long.class, test, -8446744073709551617L);
-        checkField(DefaultsTest.class.getField("a8"), int.class, test, 0x12345);
-        checkField(DefaultsTest.class.getField("a9"), int.class, test, -0x12345);
-        checkField(DefaultsTest.class.getField("a10"), int.class, test, 1234);
-        checkField(DefaultsTest.class.getField("a11"), boolean.class, test, true);
-        checkField(DefaultsTest.class.getField("a12"), boolean.class, test, false);
-        checkField(DefaultsTest.class.getField("a13"), float.class, test, (float) 123.25);
-        checkField(DefaultsTest.class.getField("a14"), double.class, test, 1234567890.123);
-        checkField(DefaultsTest.class.getField("a15"), double.class, test, 1E10);
-        checkField(DefaultsTest.class.getField("a16"), double.class, test, -1.2E+20);
-        checkField(DefaultsTest.class.getField("a17"), double.class, test, +1.23E-20);
-        checkField(DefaultsTest.class.getField("a18"), byte[].class, test, null);
-        checkField(DefaultsTest.class.getField("a19"), String.class, test, null);
-        checkField(DefaultsTest.class.getField("a20"), int.class, test, Bar.Type.BOTH);
-        checkField(DefaultsTest.class.getField("a21"), Point.class, test, null);
-
-        assertNotNull(test.a22);
-        checkField(DefaultsTest.class.getField("a22"), Thing.class, test, test.a22);
-        checkField(DefaultsTest.class.getField("a23"), long.class, test, -1L);
-        checkField(DefaultsTest.class.getField("a24"), long.class, test, 0x123456789L);
-        checkField(DefaultsTest.class.getField("a25"), long.class, test, -0x123456789L);
-    }
-
-    /**
-     * Testing generation of the Foo class.
-     *
-     * @throws IllegalAccessException
-     */
-    @SmallTest
-    public void testFooGeneration() throws NoSuchFieldException, SecurityException,
-            IllegalAccessException {
-        // Checking Foo constants.
-        checkConstantField(Foo.class.getField("FOOBY"), String.class, "Fooby");
-
-        // Checking Foo default values.
-        Foo foo = new Foo();
-        checkField(Foo.class.getField("name"), String.class, foo, Foo.FOOBY);
-
-        assertNotNull(foo.source);
-        assertFalse(foo.source.isValid());
-        checkField(Foo.class.getField("source"), MessagePipeHandle.class, foo, foo.source);
-    }
-
-    /**
-     * Testing serialization of the Foo class.
-     */
-    @SmallTest
-    public void testFooSerialization() {
-        // Checking serialization and deserialization of a Foo object.
-        Foo typicalFoo = createFoo();
-        Message serializedFoo = typicalFoo.serialize(null);
-        Foo deserializedFoo = Foo.deserialize(serializedFoo);
-        assertEquals(typicalFoo, deserializedFoo);
-    }
-
-    /**
-     * Testing serialization of the EmptyStruct class.
-     */
-    @SmallTest
-    public void testEmptyStructSerialization() {
-        // Checking serialization and deserialization of a EmptyStruct object.
-        Message serializedStruct = new EmptyStruct().serialize(null);
-        EmptyStruct emptyStruct = EmptyStruct.deserialize(serializedStruct);
-        assertNotNull(emptyStruct);
-    }
-
-    // In testing maps we want to make sure that the key used when inserting an
-    // item the key used when looking it up again are different objects. Java
-    // has default implementations of equals and hashCode that use reference
-    // equality and hashing, respectively, and that's not what we want for our
-    // mojom values.
-    @SmallTest
-    public void testHashMapStructKey() {
-        Map<Rect, Integer> map = new HashMap<>();
-        map.put(createRect(1, 2, 3, 4), 123);
-
-        Rect key = createRect(1, 2, 3, 4);
-        assertNotNull(map.get(key));
-        assertEquals(123, map.get(key).intValue());
-
-        map.remove(key);
-        assertTrue(map.isEmpty());
-    }
-}
diff --git a/mojo/android/javatests/src/org/chromium/mojo/bindings/BindingsTestUtils.java b/mojo/android/javatests/src/org/chromium/mojo/bindings/BindingsTestUtils.java
deleted file mode 100644
index 5554f80..0000000
--- a/mojo/android/javatests/src/org/chromium/mojo/bindings/BindingsTestUtils.java
+++ /dev/null
@@ -1,108 +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.
-
-package org.chromium.mojo.bindings;
-
-import org.chromium.mojo.TestUtils;
-import org.chromium.mojo.system.Handle;
-import org.chromium.mojo.system.MessagePipeHandle;
-import org.chromium.mojo.system.MojoException;
-import org.chromium.mojo.system.Pair;
-import org.chromium.mojo.system.impl.CoreImpl;
-
-import java.io.Closeable;
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Utility class for bindings tests.
- */
-public class BindingsTestUtils {
-
-    /**
-     * {@link MessageReceiver} that records any message it receives.
-     */
-    public static class RecordingMessageReceiver extends SideEffectFreeCloseable
-            implements MessageReceiver {
-
-        public final List<Message> messages = new ArrayList<Message>();
-
-        /**
-         * @see MessageReceiver#accept(Message)
-         */
-        @Override
-        public boolean accept(Message message) {
-            messages.add(message);
-            return true;
-        }
-    }
-
-    /**
-     * {@link MessageReceiverWithResponder} that records any message it receives.
-     */
-    public static class RecordingMessageReceiverWithResponder extends RecordingMessageReceiver
-            implements MessageReceiverWithResponder {
-
-        public final List<Pair<Message, MessageReceiver>> messagesWithReceivers =
-                new ArrayList<Pair<Message, MessageReceiver>>();
-
-        /**
-         * @see MessageReceiverWithResponder#acceptWithResponder(Message, MessageReceiver)
-         */
-        @Override
-        public boolean acceptWithResponder(Message message, MessageReceiver responder) {
-            messagesWithReceivers.add(Pair.create(message, responder));
-            return true;
-        }
-    }
-
-    /**
-     * {@link ConnectionErrorHandler} that records any error it received.
-     */
-    public static class CapturingErrorHandler implements ConnectionErrorHandler {
-
-        private MojoException mLastMojoException = null;
-
-        /**
-         * @see ConnectionErrorHandler#onConnectionError(MojoException)
-         */
-        @Override
-        public void onConnectionError(MojoException e) {
-            mLastMojoException = e;
-        }
-
-        /**
-         * Returns the last recorded exception.
-         */
-        public MojoException getLastMojoException() {
-            return mLastMojoException;
-        }
-
-    }
-
-    /**
-     * Creates a new valid {@link Message}. The message will have a valid header.
-     */
-    public static Message newRandomMessage(int size) {
-        assert size > 16;
-        ByteBuffer message = TestUtils.newRandomBuffer(size);
-        int[] headerAsInts = {16, 2, 0, 0};
-        for (int i = 0; i < 4; ++i) {
-            message.putInt(4 * i, headerAsInts[i]);
-        }
-        message.position(0);
-        return new Message(message, new ArrayList<Handle>());
-    }
-
-    public static <I extends Interface, P extends Interface.Proxy> P newProxyOverPipe(
-            Interface.Manager<I, P> manager, I impl, List<Closeable> toClose) {
-        Pair<MessagePipeHandle, MessagePipeHandle> handles =
-                CoreImpl.getInstance().createMessagePipe(null);
-        P proxy = manager.attachProxy(handles.first, 0);
-        toClose.add(proxy);
-        manager.bind(impl, handles.second);
-        return proxy;
-    }
-}
diff --git a/mojo/android/javatests/src/org/chromium/mojo/bindings/BindingsVersioningTest.java b/mojo/android/javatests/src/org/chromium/mojo/bindings/BindingsVersioningTest.java
deleted file mode 100644
index eea92ab..0000000
--- a/mojo/android/javatests/src/org/chromium/mojo/bindings/BindingsVersioningTest.java
+++ /dev/null
@@ -1,211 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.bindings;
-
-import android.support.test.filters.SmallTest;
-
-import org.chromium.mojo.MojoTestCase;
-import org.chromium.mojo.bindings.test.mojom.test_structs.MultiVersionStruct;
-import org.chromium.mojo.bindings.test.mojom.test_structs.MultiVersionStructV0;
-import org.chromium.mojo.bindings.test.mojom.test_structs.MultiVersionStructV1;
-import org.chromium.mojo.bindings.test.mojom.test_structs.MultiVersionStructV3;
-import org.chromium.mojo.bindings.test.mojom.test_structs.MultiVersionStructV5;
-import org.chromium.mojo.bindings.test.mojom.test_structs.MultiVersionStructV7;
-import org.chromium.mojo.bindings.test.mojom.test_structs.Rect;
-import org.chromium.mojo.system.impl.CoreImpl;
-
-/**
- * Testing generated classes with the [MinVersion] annotation. Struct in this test are from:
- * mojo/public/interfaces/bindings/tests/rect.mojom and
- * mojo/public/interfaces/bindings/tests/test_structs.mojom
- */
-public class BindingsVersioningTest extends MojoTestCase {
-    private static Rect newRect(int factor) {
-        Rect rect = new Rect();
-        rect.x = factor;
-        rect.y = 2 * factor;
-        rect.width = 10 * factor;
-        rect.height = 20 * factor;
-        return rect;
-    }
-
-    private static MultiVersionStruct newStruct() {
-        MultiVersionStruct struct = new MultiVersionStruct();
-        struct.fInt32 = 123;
-        struct.fRect = newRect(5);
-        struct.fString = "hello";
-        struct.fArray = new byte[] {10, 9, 8};
-        struct.fBool = true;
-        struct.fInt16 = 256;
-        return struct;
-    }
-
-    /**
-     * Testing serializing old struct version to newer one.
-     */
-    @SmallTest
-    public void testOldToNew() {
-        {
-            MultiVersionStructV0 v0 = new MultiVersionStructV0();
-            v0.fInt32 = 123;
-            MultiVersionStruct expected = new MultiVersionStruct();
-            expected.fInt32 = 123;
-
-            MultiVersionStruct output = MultiVersionStruct.deserialize(v0.serialize(null));
-            assertEquals(expected, output);
-            assertEquals(0, v0.getVersion());
-            assertEquals(0, output.getVersion());
-        }
-
-        {
-            MultiVersionStructV1 v1 = new MultiVersionStructV1();
-            v1.fInt32 = 123;
-            v1.fRect = newRect(5);
-            MultiVersionStruct expected = new MultiVersionStruct();
-            expected.fInt32 = 123;
-            expected.fRect = newRect(5);
-
-            MultiVersionStruct output = MultiVersionStruct.deserialize(v1.serialize(null));
-            assertEquals(expected, output);
-            assertEquals(1, v1.getVersion());
-            assertEquals(1, output.getVersion());
-        }
-
-        {
-            MultiVersionStructV3 v3 = new MultiVersionStructV3();
-            v3.fInt32 = 123;
-            v3.fRect = newRect(5);
-            v3.fString = "hello";
-            MultiVersionStruct expected = new MultiVersionStruct();
-            expected.fInt32 = 123;
-            expected.fRect = newRect(5);
-            expected.fString = "hello";
-
-            MultiVersionStruct output = MultiVersionStruct.deserialize(v3.serialize(null));
-            assertEquals(expected, output);
-            assertEquals(3, v3.getVersion());
-            assertEquals(3, output.getVersion());
-        }
-
-        {
-            MultiVersionStructV5 v5 = new MultiVersionStructV5();
-            v5.fInt32 = 123;
-            v5.fRect = newRect(5);
-            v5.fString = "hello";
-            v5.fArray = new byte[] {10, 9, 8};
-            MultiVersionStruct expected = new MultiVersionStruct();
-            expected.fInt32 = 123;
-            expected.fRect = newRect(5);
-            expected.fString = "hello";
-            expected.fArray = new byte[] {10, 9, 8};
-
-            MultiVersionStruct output = MultiVersionStruct.deserialize(v5.serialize(null));
-            assertEquals(expected, output);
-            assertEquals(5, v5.getVersion());
-            assertEquals(5, output.getVersion());
-        }
-
-        {
-            int expectedHandle = 42;
-            MultiVersionStructV7 v7 = new MultiVersionStructV7();
-            v7.fInt32 = 123;
-            v7.fRect = newRect(5);
-            v7.fString = "hello";
-            v7.fArray = new byte[] {10, 9, 8};
-            v7.fMessagePipe = CoreImpl.getInstance()
-                                      .acquireNativeHandle(expectedHandle)
-                                      .toMessagePipeHandle();
-            v7.fBool = true;
-            MultiVersionStruct expected = new MultiVersionStruct();
-            expected.fInt32 = 123;
-            expected.fRect = newRect(5);
-            expected.fString = "hello";
-            expected.fArray = new byte[] {10, 9, 8};
-            expected.fBool = true;
-
-            MultiVersionStruct output = MultiVersionStruct.deserialize(v7.serialize(null));
-
-            // Handles must be tested separately.
-            assertEquals(expectedHandle, output.fMessagePipe.releaseNativeHandle());
-            output.fMessagePipe = expected.fMessagePipe;
-
-            assertEquals(expected, output);
-            assertEquals(7, v7.getVersion());
-            assertEquals(7, output.getVersion());
-        }
-    }
-
-    /**
-     * Testing serializing new struct version to older one.
-     */
-    @SmallTest
-    public void testNewToOld() {
-        MultiVersionStruct struct = newStruct();
-        {
-            MultiVersionStructV0 expected = new MultiVersionStructV0();
-            expected.fInt32 = 123;
-
-            MultiVersionStructV0 output = MultiVersionStructV0.deserialize(struct.serialize(null));
-            assertEquals(expected, output);
-            assertEquals(9, output.getVersion());
-        }
-
-        {
-            MultiVersionStructV1 expected = new MultiVersionStructV1();
-            expected.fInt32 = 123;
-            expected.fRect = newRect(5);
-
-            MultiVersionStructV1 output = MultiVersionStructV1.deserialize(struct.serialize(null));
-            assertEquals(expected, output);
-            assertEquals(9, output.getVersion());
-        }
-
-        {
-            MultiVersionStructV3 expected = new MultiVersionStructV3();
-            expected.fInt32 = 123;
-            expected.fRect = newRect(5);
-            expected.fString = "hello";
-
-            MultiVersionStructV3 output = MultiVersionStructV3.deserialize(struct.serialize(null));
-            assertEquals(expected, output);
-            assertEquals(9, output.getVersion());
-        }
-
-        {
-            MultiVersionStructV5 expected = new MultiVersionStructV5();
-            expected.fInt32 = 123;
-            expected.fRect = newRect(5);
-            expected.fString = "hello";
-            expected.fArray = new byte[] {10, 9, 8};
-
-            MultiVersionStructV5 output = MultiVersionStructV5.deserialize(struct.serialize(null));
-            assertEquals(expected, output);
-            assertEquals(9, output.getVersion());
-        }
-
-        {
-            int expectedHandle = 42;
-            MultiVersionStructV7 expected = new MultiVersionStructV7();
-            expected.fInt32 = 123;
-            expected.fRect = newRect(5);
-            expected.fString = "hello";
-            expected.fArray = new byte[] {10, 9, 8};
-            expected.fBool = true;
-
-            MultiVersionStruct input = struct;
-            input.fMessagePipe = CoreImpl.getInstance()
-                                         .acquireNativeHandle(expectedHandle)
-                                         .toMessagePipeHandle();
-
-            MultiVersionStructV7 output = MultiVersionStructV7.deserialize(input.serialize(null));
-
-            assertEquals(expectedHandle, output.fMessagePipe.releaseNativeHandle());
-            output.fMessagePipe = expected.fMessagePipe;
-
-            assertEquals(expected, output);
-            assertEquals(9, output.getVersion());
-        }
-    }
-}
diff --git a/mojo/android/javatests/src/org/chromium/mojo/bindings/CallbacksTest.java b/mojo/android/javatests/src/org/chromium/mojo/bindings/CallbacksTest.java
deleted file mode 100644
index 497be65..0000000
--- a/mojo/android/javatests/src/org/chromium/mojo/bindings/CallbacksTest.java
+++ /dev/null
@@ -1,59 +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.
-
-package org.chromium.mojo.bindings;
-
-import android.support.test.filters.SmallTest;
-
-import junit.framework.TestCase;
-
-import org.chromium.mojo.bindings.Callbacks.Callback1;
-import org.chromium.mojo.bindings.Callbacks.Callback7;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * Testing generated callbacks
- */
-public class CallbacksTest extends TestCase {
-
-    /**
-     * Testing {@link Callback1}.
-     */
-    @SmallTest
-    public void testCallback1() {
-        final List<Integer> parameters = new ArrayList<Integer>();
-        new Callback1<Integer>() {
-            @Override
-            public void call(Integer i1) {
-                parameters.add(i1);
-            }
-        }.call(1);
-        assertEquals(Arrays.asList(1), parameters);
-    }
-
-    /**
-     * Testing {@link Callback7}.
-     */
-    @SmallTest
-    public void testCallback7() {
-        final List<Integer> parameters = new ArrayList<Integer>();
-        new Callback7<Integer, Integer, Integer, Integer, Integer, Integer, Integer>() {
-            @Override
-            public void call(Integer i1, Integer i2, Integer i3, Integer i4, Integer i5, Integer i6,
-                    Integer i7) {
-                parameters.add(i1);
-                parameters.add(i2);
-                parameters.add(i3);
-                parameters.add(i4);
-                parameters.add(i5);
-                parameters.add(i6);
-                parameters.add(i7);
-            }
-        }.call(1, 2, 3, 4, 5, 6, 7);
-        assertEquals(Arrays.asList(1, 2, 3, 4, 5, 6, 7), parameters);
-    }
-}
diff --git a/mojo/android/javatests/src/org/chromium/mojo/bindings/ConnectorTest.java b/mojo/android/javatests/src/org/chromium/mojo/bindings/ConnectorTest.java
deleted file mode 100644
index 15f9f1f..0000000
--- a/mojo/android/javatests/src/org/chromium/mojo/bindings/ConnectorTest.java
+++ /dev/null
@@ -1,108 +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.
-
-package org.chromium.mojo.bindings;
-
-import android.support.test.filters.SmallTest;
-
-import org.chromium.mojo.MojoTestCase;
-import org.chromium.mojo.bindings.BindingsTestUtils.CapturingErrorHandler;
-import org.chromium.mojo.bindings.BindingsTestUtils.RecordingMessageReceiver;
-import org.chromium.mojo.system.Core;
-import org.chromium.mojo.system.Handle;
-import org.chromium.mojo.system.MessagePipeHandle;
-import org.chromium.mojo.system.MojoResult;
-import org.chromium.mojo.system.Pair;
-import org.chromium.mojo.system.ResultAnd;
-import org.chromium.mojo.system.impl.CoreImpl;
-
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-
-/**
- * Testing the {@link Connector} class.
- */
-public class ConnectorTest extends MojoTestCase {
-
-    private static final int DATA_LENGTH = 1024;
-
-    private MessagePipeHandle mHandle;
-    private Connector mConnector;
-    private Message mTestMessage;
-    private RecordingMessageReceiver mReceiver;
-    private CapturingErrorHandler mErrorHandler;
-
-    /**
-     * @see MojoTestCase#setUp()
-     */
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        Core core = CoreImpl.getInstance();
-        Pair<MessagePipeHandle, MessagePipeHandle> handles = core.createMessagePipe(
-                new MessagePipeHandle.CreateOptions());
-        mHandle = handles.first;
-        mConnector = new Connector(handles.second);
-        mReceiver = new RecordingMessageReceiver();
-        mConnector.setIncomingMessageReceiver(mReceiver);
-        mErrorHandler = new CapturingErrorHandler();
-        mConnector.setErrorHandler(mErrorHandler);
-        mConnector.start();
-        mTestMessage = BindingsTestUtils.newRandomMessage(DATA_LENGTH);
-        assertNull(mErrorHandler.getLastMojoException());
-        assertEquals(0, mReceiver.messages.size());
-    }
-
-    /**
-     * @see MojoTestCase#tearDown()
-     */
-    @Override
-    protected void tearDown() throws Exception {
-        mConnector.close();
-        mHandle.close();
-        super.tearDown();
-    }
-
-    /**
-     * Test sending a message through a {@link Connector}.
-     */
-    @SmallTest
-    public void testSendingMessage() {
-        mConnector.accept(mTestMessage);
-        assertNull(mErrorHandler.getLastMojoException());
-        ByteBuffer received = ByteBuffer.allocateDirect(DATA_LENGTH);
-        ResultAnd<MessagePipeHandle.ReadMessageResult> result =
-                mHandle.readMessage(received, 0, MessagePipeHandle.ReadFlags.NONE);
-        assertEquals(MojoResult.OK, result.getMojoResult());
-        assertEquals(DATA_LENGTH, result.getValue().getMessageSize());
-        assertEquals(mTestMessage.getData(), received);
-    }
-
-    /**
-     * Test receiving a message through a {@link Connector}
-     */
-    @SmallTest
-    public void testReceivingMessage() {
-        mHandle.writeMessage(mTestMessage.getData(), new ArrayList<Handle>(),
-                MessagePipeHandle.WriteFlags.NONE);
-        runLoopUntilIdle();
-        assertNull(mErrorHandler.getLastMojoException());
-        assertEquals(1, mReceiver.messages.size());
-        Message received = mReceiver.messages.get(0);
-        assertEquals(0, received.getHandles().size());
-        assertEquals(mTestMessage.getData(), received.getData());
-    }
-
-    /**
-     * Test receiving an error through a {@link Connector}.
-     */
-    @SmallTest
-    public void testErrors() {
-        mHandle.close();
-        runLoopUntilIdle();
-        assertNotNull(mErrorHandler.getLastMojoException());
-        assertEquals(MojoResult.FAILED_PRECONDITION,
-                mErrorHandler.getLastMojoException().getMojoResult());
-    }
-}
diff --git a/mojo/android/javatests/src/org/chromium/mojo/bindings/ExecutorFactoryTest.java b/mojo/android/javatests/src/org/chromium/mojo/bindings/ExecutorFactoryTest.java
deleted file mode 100644
index cabe230..0000000
--- a/mojo/android/javatests/src/org/chromium/mojo/bindings/ExecutorFactoryTest.java
+++ /dev/null
@@ -1,104 +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.
-
-package org.chromium.mojo.bindings;
-
-import android.support.test.filters.SmallTest;
-
-import org.chromium.mojo.MojoTestCase;
-import org.chromium.mojo.system.impl.CoreImpl;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.BrokenBarrierException;
-import java.util.concurrent.CyclicBarrier;
-import java.util.concurrent.Executor;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-
-/**
- * Testing the executor factory.
- */
-public class ExecutorFactoryTest extends MojoTestCase {
-
-    private static final long RUN_LOOP_TIMEOUT_MS = 50;
-    private static final int CONCURRENCY_LEVEL = 5;
-    private static final ExecutorService WORKERS = Executors.newFixedThreadPool(CONCURRENCY_LEVEL);
-
-    private Executor mExecutor;
-    private List<Thread> mThreadContainer;
-
-    /**
-     * @see MojoTestCase#setUp()
-     */
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        mExecutor = ExecutorFactory.getExecutorForCurrentThread(CoreImpl.getInstance());
-        mThreadContainer = new ArrayList<Thread>();
-    }
-
-    /**
-     * Testing the {@link Executor} when called from the executor thread.
-     */
-    @SmallTest
-    public void testExecutorOnCurrentThread() {
-        Runnable action = new Runnable() {
-            @Override
-            public void run() {
-                mThreadContainer.add(Thread.currentThread());
-            }
-        };
-        mExecutor.execute(action);
-        mExecutor.execute(action);
-        assertEquals(0, mThreadContainer.size());
-        runLoop(RUN_LOOP_TIMEOUT_MS);
-        assertEquals(2, mThreadContainer.size());
-        for (Thread thread : mThreadContainer) {
-            assertEquals(Thread.currentThread(), thread);
-        }
-    }
-
-    /**
-     * Testing the {@link Executor} when called from another thread.
-     */
-    @SmallTest
-    public void testExecutorOnOtherThread() {
-        final CyclicBarrier barrier = new CyclicBarrier(CONCURRENCY_LEVEL + 1);
-        for (int i = 0; i < CONCURRENCY_LEVEL; ++i) {
-            WORKERS.execute(new Runnable() {
-                @Override
-                public void run() {
-                    mExecutor.execute(new Runnable() {
-
-                        @Override
-                        public void run() {
-                            mThreadContainer.add(Thread.currentThread());
-                        }
-                    });
-                    try {
-                        barrier.await();
-                    } catch (InterruptedException e) {
-                        fail("Unexpected exception: " + e.getMessage());
-                    } catch (BrokenBarrierException e) {
-                        fail("Unexpected exception: " + e.getMessage());
-                    }
-                }
-            });
-        }
-        try {
-            barrier.await();
-        } catch (InterruptedException e) {
-            fail("Unexpected exception: " + e.getMessage());
-        } catch (BrokenBarrierException e) {
-            fail("Unexpected exception: " + e.getMessage());
-        }
-        assertEquals(0, mThreadContainer.size());
-        runLoop(RUN_LOOP_TIMEOUT_MS);
-        assertEquals(CONCURRENCY_LEVEL, mThreadContainer.size());
-        for (Thread thread : mThreadContainer) {
-            assertEquals(Thread.currentThread(), thread);
-        }
-    }
-}
diff --git a/mojo/android/javatests/src/org/chromium/mojo/bindings/InterfaceControlMessageTest.java b/mojo/android/javatests/src/org/chromium/mojo/bindings/InterfaceControlMessageTest.java
deleted file mode 100644
index 8cdd4ab..0000000
--- a/mojo/android/javatests/src/org/chromium/mojo/bindings/InterfaceControlMessageTest.java
+++ /dev/null
@@ -1,129 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.bindings;
-
-import android.support.test.filters.SmallTest;
-
-import org.chromium.mojo.MojoTestCase;
-import org.chromium.mojo.bindings.Callbacks.Callback1;
-import org.chromium.mojo.bindings.test.mojom.sample.Enum;
-import org.chromium.mojo.bindings.test.mojom.sample.IntegerAccessor;
-import org.chromium.mojo.system.MojoException;
-
-import java.io.Closeable;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Tests for interface control messages.
- */
-public class InterfaceControlMessageTest extends MojoTestCase {
-    private final List<Closeable> mCloseablesToClose = new ArrayList<Closeable>();
-
-    /**
-     * See mojo/public/interfaces/bindings/tests/sample_interfaces.mojom.
-     */
-    class IntegerAccessorImpl extends SideEffectFreeCloseable implements IntegerAccessor {
-        private long mValue = 0;
-        private int mEnum = 0;
-        private boolean mEncounteredError = false;
-
-        /**
-         * @see ConnectionErrorHandler#onConnectionError(MojoException)
-         */
-        @Override
-        public void onConnectionError(MojoException e) {
-            mEncounteredError = true;
-        }
-
-        /**
-         * @see IntegerAccessor#getInteger(IntegerAccessor.GetIntegerResponse)
-         */
-        @Override
-        public void getInteger(GetIntegerResponse response) {
-            response.call(mValue, mEnum);
-        }
-
-        /**
-         * @see IntegerAccessor#setInteger(long, int)
-         */
-        @Override
-        public void setInteger(long value, int enumValue) {
-            mValue = value;
-            mEnum = enumValue;
-        }
-
-        public long getValue() {
-            return mValue;
-        }
-
-        public boolean encounteredError() {
-            return mEncounteredError;
-        }
-    }
-
-    /**
-     * @see MojoTestCase#tearDown()
-     */
-    @Override
-    protected void tearDown() throws Exception {
-        // Close the elements in the reverse order they were added. This is needed because it is an
-        // error to close the handle of a proxy without closing the proxy first.
-        Collections.reverse(mCloseablesToClose);
-        for (Closeable c : mCloseablesToClose) {
-            c.close();
-        }
-        super.tearDown();
-    }
-
-    @SmallTest
-    public void testQueryVersion() {
-        IntegerAccessor.Proxy p = BindingsTestUtils.newProxyOverPipe(
-                IntegerAccessor.MANAGER, new IntegerAccessorImpl(), mCloseablesToClose);
-        assertEquals(0, p.getProxyHandler().getVersion());
-        p.getProxyHandler().queryVersion(new Callback1<Integer>() {
-            @Override
-            public void call(Integer version) {
-                assertEquals(3, version.intValue());
-            }
-        });
-        runLoopUntilIdle();
-        assertEquals(3, p.getProxyHandler().getVersion());
-    }
-
-    @SmallTest
-    public void testRequireVersion() {
-        IntegerAccessorImpl impl = new IntegerAccessorImpl();
-        IntegerAccessor.Proxy p = BindingsTestUtils.newProxyOverPipe(
-                IntegerAccessor.MANAGER, impl, mCloseablesToClose);
-
-        assertEquals(0, p.getProxyHandler().getVersion());
-
-        p.getProxyHandler().requireVersion(1);
-        assertEquals(1, p.getProxyHandler().getVersion());
-        p.setInteger(123, Enum.VALUE);
-        runLoopUntilIdle();
-        assertFalse(impl.encounteredError());
-        assertEquals(123, impl.getValue());
-
-        p.getProxyHandler().requireVersion(3);
-        assertEquals(3, p.getProxyHandler().getVersion());
-        p.setInteger(456, Enum.VALUE);
-        runLoopUntilIdle();
-        assertFalse(impl.encounteredError());
-        assertEquals(456, impl.getValue());
-
-        // Require a version that is not supported by the implementation side.
-        p.getProxyHandler().requireVersion(4);
-        // getVersion() is updated synchronously.
-        assertEquals(4, p.getProxyHandler().getVersion());
-        p.setInteger(789, Enum.VALUE);
-        runLoopUntilIdle();
-        assertTrue(impl.encounteredError());
-        // The call to setInteger() after requireVersion() is ignored.
-        assertEquals(456, impl.getValue());
-    }
-}
diff --git a/mojo/android/javatests/src/org/chromium/mojo/bindings/InterfacesTest.java b/mojo/android/javatests/src/org/chromium/mojo/bindings/InterfacesTest.java
deleted file mode 100644
index d8bd3e8..0000000
--- a/mojo/android/javatests/src/org/chromium/mojo/bindings/InterfacesTest.java
+++ /dev/null
@@ -1,284 +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.
-
-package org.chromium.mojo.bindings;
-
-import android.support.test.filters.SmallTest;
-
-import org.chromium.mojo.MojoTestCase;
-import org.chromium.mojo.bindings.BindingsTestUtils.CapturingErrorHandler;
-import org.chromium.mojo.bindings.test.mojom.imported.ImportedInterface;
-import org.chromium.mojo.bindings.test.mojom.sample.Factory;
-import org.chromium.mojo.bindings.test.mojom.sample.NamedObject;
-import org.chromium.mojo.bindings.test.mojom.sample.NamedObject.GetNameResponse;
-import org.chromium.mojo.bindings.test.mojom.sample.Request;
-import org.chromium.mojo.bindings.test.mojom.sample.Response;
-import org.chromium.mojo.system.DataPipe.ConsumerHandle;
-import org.chromium.mojo.system.MessagePipeHandle;
-import org.chromium.mojo.system.Pair;
-import org.chromium.mojo.system.impl.CoreImpl;
-
-import java.io.Closeable;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Tests for interfaces / proxies / stubs generated for sample_factory.mojom.
- */
-public class InterfacesTest extends MojoTestCase {
-
-    private static final String OBJECT_NAME = "hello world";
-
-    private final List<Closeable> mCloseablesToClose = new ArrayList<Closeable>();
-
-    /**
-     * Basic implementation of {@link NamedObject}.
-     */
-    public static class MockNamedObjectImpl extends CapturingErrorHandler implements NamedObject {
-
-        private String mName = "";
-
-        /**
-         * @see org.chromium.mojo.bindings.Interface#close()
-         */
-        @Override
-        public void close() {
-        }
-
-        @Override
-        public void setName(String name) {
-            mName = name;
-        }
-
-        @Override
-        public void getName(GetNameResponse callback) {
-            callback.call(mName);
-        }
-
-        public String getNameSynchronously() {
-            return mName;
-        }
-    }
-
-    /**
-     * Implementation of {@link GetNameResponse} keeping track of usage.
-     */
-    public static class RecordingGetNameResponse implements GetNameResponse {
-        private String mName;
-        private boolean mCalled;
-
-        public RecordingGetNameResponse() {
-            reset();
-        }
-
-        @Override
-        public void call(String name) {
-            mName = name;
-            mCalled = true;
-        }
-
-        public String getName() {
-            return mName;
-        }
-
-        public boolean wasCalled() {
-            return mCalled;
-        }
-
-        public void reset() {
-            mName = null;
-            mCalled = false;
-        }
-    }
-
-    /**
-     * Basic implementation of {@link Factory}.
-     */
-    public class MockFactoryImpl extends CapturingErrorHandler implements Factory {
-
-        private boolean mClosed = false;
-
-        public boolean isClosed() {
-            return mClosed;
-        }
-
-        /**
-         * @see org.chromium.mojo.bindings.Interface#close()
-         */
-        @Override
-        public void close() {
-            mClosed = true;
-        }
-
-        @Override
-        public void doStuff(Request request, MessagePipeHandle pipe, DoStuffResponse callback) {
-            if (pipe != null) {
-                pipe.close();
-            }
-            Response response = new Response();
-            response.x = 42;
-            callback.call(response, "Hello");
-        }
-
-        @Override
-        public void doStuff2(ConsumerHandle pipe, DoStuff2Response callback) {
-            callback.call("World");
-        }
-
-        @Override
-        public void createNamedObject(InterfaceRequest<NamedObject> obj) {
-            NamedObject.MANAGER.bind(new MockNamedObjectImpl(), obj);
-        }
-
-        @Override
-        public void requestImportedInterface(InterfaceRequest<ImportedInterface> obj,
-                RequestImportedInterfaceResponse callback) {
-            throw new UnsupportedOperationException("Not implemented.");
-        }
-
-        @Override
-        public void takeImportedInterface(ImportedInterface obj,
-                TakeImportedInterfaceResponse callback) {
-            throw new UnsupportedOperationException("Not implemented.");
-        }
-    }
-
-    /**
-     * Implementation of DoStuffResponse that keeps track of if the response is called.
-     */
-    public static class DoStuffResponseImpl implements Factory.DoStuffResponse {
-        private boolean mResponseCalled = false;
-
-        public boolean wasResponseCalled() {
-            return mResponseCalled;
-        }
-
-        @Override
-        public void call(Response response, String string) {
-            mResponseCalled = true;
-        }
-    }
-
-    /**
-     * @see MojoTestCase#tearDown()
-     */
-    @Override
-    protected void tearDown() throws Exception {
-        // Close the elements in the reverse order they were added. This is needed because it is an
-        // error to close the handle of a proxy without closing the proxy first.
-        Collections.reverse(mCloseablesToClose);
-        for (Closeable c : mCloseablesToClose) {
-            c.close();
-        }
-        super.tearDown();
-    }
-
-    /**
-     * Check that the given proxy receives the calls. If |impl| is not null, also check that the
-     * calls are forwared to |impl|.
-     */
-    private void checkProxy(NamedObject.Proxy proxy, MockNamedObjectImpl impl) {
-        RecordingGetNameResponse callback = new RecordingGetNameResponse();
-        CapturingErrorHandler errorHandler = new CapturingErrorHandler();
-        proxy.getProxyHandler().setErrorHandler(errorHandler);
-
-        if (impl != null) {
-            assertNull(impl.getLastMojoException());
-            assertEquals("", impl.getNameSynchronously());
-        }
-
-        proxy.getName(callback);
-        runLoopUntilIdle();
-
-        assertNull(errorHandler.getLastMojoException());
-        assertTrue(callback.wasCalled());
-        assertEquals("", callback.getName());
-
-        callback.reset();
-        proxy.setName(OBJECT_NAME);
-        runLoopUntilIdle();
-
-        assertNull(errorHandler.getLastMojoException());
-        if (impl != null) {
-            assertNull(impl.getLastMojoException());
-            assertEquals(OBJECT_NAME, impl.getNameSynchronously());
-        }
-
-        proxy.getName(callback);
-        runLoopUntilIdle();
-
-        assertNull(errorHandler.getLastMojoException());
-        assertTrue(callback.wasCalled());
-        assertEquals(OBJECT_NAME, callback.getName());
-    }
-
-    @SmallTest
-    public void testName() {
-        assertEquals("sample::NamedObject", NamedObject.MANAGER.getName());
-    }
-
-    @SmallTest
-    public void testProxyAndStub() {
-        MockNamedObjectImpl impl = new MockNamedObjectImpl();
-        NamedObject.Proxy proxy =
-                NamedObject.MANAGER.buildProxy(null, NamedObject.MANAGER.buildStub(null, impl));
-
-        checkProxy(proxy, impl);
-    }
-
-    @SmallTest
-    public void testProxyAndStubOverPipe() {
-        MockNamedObjectImpl impl = new MockNamedObjectImpl();
-        NamedObject.Proxy proxy =
-                BindingsTestUtils.newProxyOverPipe(NamedObject.MANAGER, impl, mCloseablesToClose);
-
-        checkProxy(proxy, impl);
-    }
-
-    @SmallTest
-    public void testFactoryOverPipe() {
-        Factory.Proxy proxy = BindingsTestUtils.newProxyOverPipe(
-                Factory.MANAGER, new MockFactoryImpl(), mCloseablesToClose);
-        Pair<NamedObject.Proxy, InterfaceRequest<NamedObject>> request =
-                NamedObject.MANAGER.getInterfaceRequest(CoreImpl.getInstance());
-        mCloseablesToClose.add(request.first);
-        proxy.createNamedObject(request.second);
-
-        checkProxy(request.first, null);
-    }
-
-    @SmallTest
-    public void testInterfaceClosing() {
-        MockFactoryImpl impl = new MockFactoryImpl();
-        Factory.Proxy proxy =
-                BindingsTestUtils.newProxyOverPipe(Factory.MANAGER, impl, mCloseablesToClose);
-
-        assertFalse(impl.isClosed());
-
-        proxy.close();
-        runLoopUntilIdle();
-
-        assertTrue(impl.isClosed());
-    }
-
-    @SmallTest
-    public void testResponse() {
-        MockFactoryImpl impl = new MockFactoryImpl();
-        Factory.Proxy proxy =
-                BindingsTestUtils.newProxyOverPipe(Factory.MANAGER, impl, mCloseablesToClose);
-        Request request = new Request();
-        request.x = 42;
-        Pair<MessagePipeHandle, MessagePipeHandle> handles =
-                CoreImpl.getInstance().createMessagePipe(null);
-        DoStuffResponseImpl response = new DoStuffResponseImpl();
-        proxy.doStuff(request, handles.first, response);
-
-        assertFalse(response.wasResponseCalled());
-
-        runLoopUntilIdle();
-
-        assertTrue(response.wasResponseCalled());
-    }
-}
diff --git a/mojo/android/javatests/src/org/chromium/mojo/bindings/MessageHeaderTest.java b/mojo/android/javatests/src/org/chromium/mojo/bindings/MessageHeaderTest.java
deleted file mode 100644
index b2e6ac8..0000000
--- a/mojo/android/javatests/src/org/chromium/mojo/bindings/MessageHeaderTest.java
+++ /dev/null
@@ -1,69 +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.
-
-package org.chromium.mojo.bindings;
-
-import android.support.test.filters.SmallTest;
-
-import junit.framework.TestCase;
-
-import org.chromium.mojo.bindings.test.mojom.imported.Point;
-
-/**
- * Testing internal classes of interfaces.
- */
-public class MessageHeaderTest extends TestCase {
-
-    /**
-     * Testing that headers are identical after being serialized/deserialized.
-     */
-    @SmallTest
-    public void testSimpleMessageHeader() {
-        final int xValue = 1;
-        final int yValue = 2;
-        final int type = 6;
-        Point p = new Point();
-        p.x = xValue;
-        p.y = yValue;
-        ServiceMessage message = p.serializeWithHeader(null, new MessageHeader(type));
-
-        MessageHeader header = message.getHeader();
-        assertTrue(header.validateHeader(type, 0));
-        assertEquals(type, header.getType());
-        assertEquals(0, header.getFlags());
-
-        Point p2 = Point.deserialize(message.getPayload());
-        assertNotNull(p2);
-        assertEquals(p.x, p2.x);
-        assertEquals(p.y, p2.y);
-    }
-
-    /**
-     * Testing that headers are identical after being serialized/deserialized.
-     */
-    @SmallTest
-    public void testMessageWithRequestIdHeader() {
-        final int xValue = 1;
-        final int yValue = 2;
-        final int type = 6;
-        final long requestId = 0x1deadbeafL;
-        Point p = new Point();
-        p.x = xValue;
-        p.y = yValue;
-        ServiceMessage message = p.serializeWithHeader(null,
-                new MessageHeader(type, MessageHeader.MESSAGE_EXPECTS_RESPONSE_FLAG, 0));
-        message.setRequestId(requestId);
-
-        MessageHeader header = message.getHeader();
-        assertTrue(header.validateHeader(type, MessageHeader.MESSAGE_EXPECTS_RESPONSE_FLAG));
-        assertEquals(type, header.getType());
-        assertEquals(MessageHeader.MESSAGE_EXPECTS_RESPONSE_FLAG, header.getFlags());
-        assertEquals(requestId, header.getRequestId());
-
-        Point p2 = Point.deserialize(message.getPayload());
-        assertNotNull(p2);
-        assertEquals(p.x, p2.x);
-        assertEquals(p.y, p2.y);
-    }
-}
diff --git a/mojo/android/javatests/src/org/chromium/mojo/bindings/ReadAndDispatchMessageTest.java b/mojo/android/javatests/src/org/chromium/mojo/bindings/ReadAndDispatchMessageTest.java
deleted file mode 100644
index 51dbd22..0000000
--- a/mojo/android/javatests/src/org/chromium/mojo/bindings/ReadAndDispatchMessageTest.java
+++ /dev/null
@@ -1,109 +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.
-
-package org.chromium.mojo.bindings;
-
-import android.support.test.filters.SmallTest;
-
-import org.chromium.mojo.MojoTestCase;
-import org.chromium.mojo.bindings.BindingsTestUtils.RecordingMessageReceiver;
-import org.chromium.mojo.system.Core;
-import org.chromium.mojo.system.DataPipe;
-import org.chromium.mojo.system.Handle;
-import org.chromium.mojo.system.MessagePipeHandle;
-import org.chromium.mojo.system.MojoException;
-import org.chromium.mojo.system.MojoResult;
-import org.chromium.mojo.system.Pair;
-import org.chromium.mojo.system.impl.CoreImpl;
-
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * Testing {@link Connector#readAndDispatchMessage}.
- */
-public class ReadAndDispatchMessageTest extends MojoTestCase {
-
-    private static final int DATA_SIZE = 1024;
-
-    private ByteBuffer mData;
-    private Pair<MessagePipeHandle, MessagePipeHandle> mHandles;
-    private List<Handle> mHandlesToSend = new ArrayList<Handle>();
-    private List<Handle> mHandlesToClose = new ArrayList<Handle>();
-    private RecordingMessageReceiver mMessageReceiver;
-
-    /**
-     * @see org.chromium.mojo.MojoTestCase#setUp()
-     */
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        Core core = CoreImpl.getInstance();
-        mData = BindingsTestUtils.newRandomMessage(DATA_SIZE).getData();
-        mMessageReceiver = new RecordingMessageReceiver();
-        mHandles = core.createMessagePipe(new MessagePipeHandle.CreateOptions());
-        Pair<DataPipe.ProducerHandle, DataPipe.ConsumerHandle> datapipe = core.createDataPipe(null);
-        mHandlesToSend.addAll(Arrays.asList(datapipe.first, datapipe.second));
-        mHandlesToClose.addAll(Arrays.asList(mHandles.first, mHandles.second));
-        mHandlesToClose.addAll(mHandlesToSend);
-    }
-
-    /**
-     * @see org.chromium.mojo.MojoTestCase#tearDown()
-     */
-    @Override
-    protected void tearDown() throws Exception {
-        for (Handle handle : mHandlesToClose) {
-            handle.close();
-        }
-        super.tearDown();
-    }
-
-    /**
-     * Testing {@link Connector#readAndDispatchMessage(MessagePipeHandle, MessageReceiver)}
-     */
-    @SmallTest
-    public void testReadAndDispatchMessage() {
-        mHandles.first.writeMessage(mData, mHandlesToSend, MessagePipeHandle.WriteFlags.NONE);
-        assertEquals(MojoResult.OK, Connector.readAndDispatchMessage(mHandles.second,
-                                                      mMessageReceiver).getMojoResult());
-        assertEquals(1, mMessageReceiver.messages.size());
-        Message message = mMessageReceiver.messages.get(0);
-        mHandlesToClose.addAll(message.getHandles());
-        assertEquals(mData, message.getData());
-        assertEquals(2, message.getHandles().size());
-        for (Handle handle : message.getHandles()) {
-            assertTrue(handle.isValid());
-        }
-    }
-
-    /**
-     * Testing {@link Connector#readAndDispatchMessage(MessagePipeHandle, MessageReceiver)}
-     * with no message available.
-     */
-    @SmallTest
-    public void testReadAndDispatchMessageOnEmptyHandle() {
-        assertEquals(MojoResult.SHOULD_WAIT, Connector.readAndDispatchMessage(mHandles.second,
-                                                               mMessageReceiver).getMojoResult());
-        assertEquals(0, mMessageReceiver.messages.size());
-    }
-
-    /**
-     * Testing {@link Connector#readAndDispatchMessage(MessagePipeHandle, MessageReceiver)}
-     * on closed handle.
-     */
-    @SmallTest
-    public void testReadAndDispatchMessageOnClosedHandle() {
-        mHandles.first.close();
-        try {
-            Connector.readAndDispatchMessage(mHandles.second, mMessageReceiver);
-            fail("MojoException should have been thrown");
-        } catch (MojoException expected) {
-            assertEquals(MojoResult.FAILED_PRECONDITION, expected.getMojoResult());
-        }
-        assertEquals(0, mMessageReceiver.messages.size());
-    }
-}
diff --git a/mojo/android/javatests/src/org/chromium/mojo/bindings/RouterTest.java b/mojo/android/javatests/src/org/chromium/mojo/bindings/RouterTest.java
deleted file mode 100644
index 6aa1726..0000000
--- a/mojo/android/javatests/src/org/chromium/mojo/bindings/RouterTest.java
+++ /dev/null
@@ -1,231 +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.
-
-package org.chromium.mojo.bindings;
-
-import android.support.test.filters.SmallTest;
-
-import org.chromium.base.annotations.SuppressFBWarnings;
-import org.chromium.mojo.MojoTestCase;
-import org.chromium.mojo.bindings.BindingsTestUtils.CapturingErrorHandler;
-import org.chromium.mojo.bindings.BindingsTestUtils.RecordingMessageReceiverWithResponder;
-import org.chromium.mojo.system.Core;
-import org.chromium.mojo.system.Core.HandleSignals;
-import org.chromium.mojo.system.Handle;
-import org.chromium.mojo.system.MessagePipeHandle;
-import org.chromium.mojo.system.MojoResult;
-import org.chromium.mojo.system.Pair;
-import org.chromium.mojo.system.ResultAnd;
-import org.chromium.mojo.system.impl.CoreImpl;
-
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-
-/**
- * Testing {@link Router}
- */
-public class RouterTest extends MojoTestCase {
-
-    private MessagePipeHandle mHandle;
-    private Router mRouter;
-    private RecordingMessageReceiverWithResponder mReceiver;
-    private CapturingErrorHandler mErrorHandler;
-
-    /**
-     * @see MojoTestCase#setUp()
-     */
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        Core core = CoreImpl.getInstance();
-        Pair<MessagePipeHandle, MessagePipeHandle> handles = core.createMessagePipe(null);
-        mHandle = handles.first;
-        mRouter = new RouterImpl(handles.second);
-        mReceiver = new RecordingMessageReceiverWithResponder();
-        mRouter.setIncomingMessageReceiver(mReceiver);
-        mErrorHandler = new CapturingErrorHandler();
-        mRouter.setErrorHandler(mErrorHandler);
-        mRouter.start();
-    }
-
-    /**
-     * Testing sending a message via the router that expected a response.
-     */
-    @SmallTest
-    public void testSendingToRouterWithResponse() {
-        final int requestMessageType = 0xdead;
-        final int responseMessageType = 0xbeaf;
-
-        // Sending a message expecting a response.
-        MessageHeader header = new MessageHeader(requestMessageType,
-                MessageHeader.MESSAGE_EXPECTS_RESPONSE_FLAG, 0);
-        Encoder encoder = new Encoder(CoreImpl.getInstance(), header.getSize());
-        header.encode(encoder);
-        mRouter.acceptWithResponder(encoder.getMessage(), mReceiver);
-        ByteBuffer receiveBuffer = ByteBuffer.allocateDirect(header.getSize());
-        ResultAnd<MessagePipeHandle.ReadMessageResult> result =
-                mHandle.readMessage(receiveBuffer, 0, MessagePipeHandle.ReadFlags.NONE);
-
-        assertEquals(MojoResult.OK, result.getMojoResult());
-        MessageHeader receivedHeader = new Message(
-                receiveBuffer, new ArrayList<Handle>()).asServiceMessage().getHeader();
-
-        assertEquals(header.getType(), receivedHeader.getType());
-        assertEquals(header.getFlags(), receivedHeader.getFlags());
-        assertTrue(receivedHeader.getRequestId() != 0);
-
-        // Sending the response.
-        MessageHeader responseHeader = new MessageHeader(responseMessageType,
-                MessageHeader.MESSAGE_IS_RESPONSE_FLAG, receivedHeader.getRequestId());
-        encoder = new Encoder(CoreImpl.getInstance(), header.getSize());
-        responseHeader.encode(encoder);
-        Message responseMessage = encoder.getMessage();
-        mHandle.writeMessage(responseMessage.getData(), new ArrayList<Handle>(),
-                MessagePipeHandle.WriteFlags.NONE);
-        runLoopUntilIdle();
-
-        assertEquals(1, mReceiver.messages.size());
-        ServiceMessage receivedResponseMessage = mReceiver.messages.get(0).asServiceMessage();
-        assertEquals(MessageHeader.MESSAGE_IS_RESPONSE_FLAG,
-                receivedResponseMessage.getHeader().getFlags());
-        assertEquals(responseMessage.getData(), receivedResponseMessage.getData());
-    }
-
-    /**
-     * Sends a message to the Router.
-     *
-     * @param messageIndex Used when sending multiple messages to indicate the index of this
-     * message.
-     * @param requestMessageType The message type to use in the header of the sent message.
-     * @param requestId The requestId to use in the header of the sent message.
-     */
-    private void sendMessageToRouter(int messageIndex, int requestMessageType, int requestId) {
-        MessageHeader header = new MessageHeader(
-                requestMessageType, MessageHeader.MESSAGE_EXPECTS_RESPONSE_FLAG, requestId);
-        Encoder encoder = new Encoder(CoreImpl.getInstance(), header.getSize());
-        header.encode(encoder);
-        Message headerMessage = encoder.getMessage();
-        mHandle.writeMessage(headerMessage.getData(), new ArrayList<Handle>(),
-                MessagePipeHandle.WriteFlags.NONE);
-        runLoopUntilIdle();
-
-        assertEquals(messageIndex + 1, mReceiver.messagesWithReceivers.size());
-        Pair<Message, MessageReceiver> receivedMessage =
-                mReceiver.messagesWithReceivers.get(messageIndex);
-        assertEquals(headerMessage.getData(), receivedMessage.first.getData());
-    }
-
-    /**
-     * Sends a response message from the Router.
-     *
-     * @param messageIndex Used when sending responses to multiple messages to indicate the index
-     * of the message that this message is a response to.
-     * @param responseMessageType The message type to use in the header of the response message.
-     */
-    private void sendResponseFromRouter(int messageIndex, int responseMessageType) {
-        Pair<Message, MessageReceiver> receivedMessage =
-                mReceiver.messagesWithReceivers.get(messageIndex);
-
-        long requestId = receivedMessage.first.asServiceMessage().getHeader().getRequestId();
-
-        MessageHeader responseHeader = new MessageHeader(
-                responseMessageType, MessageHeader.MESSAGE_IS_RESPONSE_FLAG, requestId);
-        Encoder encoder = new Encoder(CoreImpl.getInstance(), responseHeader.getSize());
-        responseHeader.encode(encoder);
-        Message message = encoder.getMessage();
-        receivedMessage.second.accept(message);
-
-        ByteBuffer receivedResponseMessage = ByteBuffer.allocateDirect(responseHeader.getSize());
-        ResultAnd<MessagePipeHandle.ReadMessageResult> result =
-                mHandle.readMessage(receivedResponseMessage, 0, MessagePipeHandle.ReadFlags.NONE);
-
-        assertEquals(MojoResult.OK, result.getMojoResult());
-        assertEquals(message.getData(), receivedResponseMessage);
-    }
-
-    /**
-     * Clears {@code mReceiver.messagesWithReceivers} allowing all message receivers to be
-     * finalized.
-     * <p>
-     * Since there is no way to force the Garbage Collector to actually call finalize and we want to
-     * test the effects of the finalize() method, we explicitly call finalize() on all of the
-     * message receivers. We do this in a custom thread to better approximate what the JVM does.
-     */
-    private void clearAllMessageReceivers() {
-        Thread myFinalizerThread = new Thread() {
-            @Override
-            @SuppressFBWarnings("FI_EXPLICIT_INVOCATION")
-            public void run() {
-                for (Pair<Message, MessageReceiver> receivedMessage :
-                        mReceiver.messagesWithReceivers) {
-                    RouterImpl.ResponderThunk thunk =
-                            (RouterImpl.ResponderThunk) receivedMessage.second;
-                    try {
-                        thunk.finalize();
-                    } catch (Throwable e) {
-                        throw new RuntimeException(e);
-                    }
-                }
-            }
-        };
-        myFinalizerThread.start();
-        try {
-            myFinalizerThread.join();
-        } catch (InterruptedException e) {
-            // ignore.
-        }
-        mReceiver.messagesWithReceivers.clear();
-    }
-
-    /**
-     * Testing receiving a message via the router that expected a response.
-     */
-    @SmallTest
-    public void testReceivingViaRouterWithResponse() {
-        final int requestMessageType = 0xdead;
-        final int responseMessageType = 0xbeef;
-        final int requestId = 0xdeadbeaf;
-
-        // Send a message expecting a response.
-        sendMessageToRouter(0, requestMessageType, requestId);
-
-        // Sending the response.
-        sendResponseFromRouter(0, responseMessageType);
-    }
-
-    /**
-     * Tests that if a callback is dropped (i.e. becomes unreachable and is finalized
-     * without being used), then the message pipe will be closed.
-     */
-    @SmallTest
-    public void testDroppingReceiverWithoutUsingIt() {
-        // Send 10 messages to the router without sending a response.
-        for (int i = 0; i < 10; i++) {
-            sendMessageToRouter(i, i, i);
-        }
-
-        // Now send the 10 responses. This should work fine.
-        for (int i = 0; i < 10; i++) {
-            sendResponseFromRouter(i, i);
-        }
-
-        // Clear all MessageRecievers so that the ResponderThunks will
-        // be finalized.
-        clearAllMessageReceivers();
-
-        // Send another  message to the router without sending a response.
-        sendMessageToRouter(0, 0, 0);
-
-        // Clear the MessageReciever so that the ResponderThunk will
-        // be finalized. Since the RespondeThunk was never used, this
-        // should close the pipe.
-        clearAllMessageReceivers();
-        // The close() occurs asynchronously on this thread.
-        runLoopUntilIdle();
-
-        // Confirm that the pipe was closed on the Router side.
-        HandleSignals closedFlag = HandleSignals.none().setPeerClosed(true);
-        assertEquals(closedFlag, mHandle.querySignalsState().getSatisfiedSignals());
-    }
-}
diff --git a/mojo/android/javatests/src/org/chromium/mojo/bindings/SerializationTest.java b/mojo/android/javatests/src/org/chromium/mojo/bindings/SerializationTest.java
deleted file mode 100644
index 2c17e3a..0000000
--- a/mojo/android/javatests/src/org/chromium/mojo/bindings/SerializationTest.java
+++ /dev/null
@@ -1,175 +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.
-
-package org.chromium.mojo.bindings;
-
-import android.support.test.filters.SmallTest;
-
-import junit.framework.TestCase;
-
-import org.chromium.mojo.HandleMock;
-import org.chromium.mojo.bindings.test.mojom.mojo.Struct1;
-import org.chromium.mojo.bindings.test.mojom.mojo.Struct2;
-import org.chromium.mojo.bindings.test.mojom.mojo.Struct3;
-import org.chromium.mojo.bindings.test.mojom.mojo.Struct4;
-import org.chromium.mojo.bindings.test.mojom.mojo.Struct5;
-import org.chromium.mojo.bindings.test.mojom.mojo.Struct6;
-import org.chromium.mojo.bindings.test.mojom.mojo.StructOfNullables;
-
-import java.nio.ByteBuffer;
-
-/**
- * Tests for the serialization logic of the generated structs, using structs defined in
- * mojo/public/interfaces/bindings/tests/serialization_test_structs.mojom .
- */
-public class SerializationTest extends TestCase {
-
-    private static void assertThrowsSerializationException(Struct struct) {
-        try {
-            struct.serialize(null);
-            fail("Serialization of invalid struct should have thrown an exception.");
-        } catch (SerializationException ex) {
-            // Expected.
-        }
-    }
-
-    /**
-     * Verifies that serializing a struct with an invalid handle of a non-nullable type throws an
-     * exception.
-     */
-    @SmallTest
-    public void testHandle() {
-        Struct2 struct = new Struct2();
-        assertFalse(struct.hdl.isValid());
-        assertThrowsSerializationException(struct);
-
-        // Make the struct valid and verify that it serializes without an exception.
-        struct.hdl = new HandleMock();
-        struct.serialize(null);
-    }
-
-    /**
-     * Verifies that serializing a struct with a null struct pointer throws an exception.
-     */
-    @SmallTest
-    public void testStructPointer() {
-        Struct3 struct = new Struct3();
-        assertNull(struct.struct1);
-        assertThrowsSerializationException(struct);
-
-        // Make the struct valid and verify that it serializes without an exception.
-        struct.struct1 = new Struct1();
-        struct.serialize(null);
-    }
-
-    /**
-     * Verifies that serializing a struct with an array of structs throws an exception when the
-     * struct is invalid.
-     */
-    @SmallTest
-    public void testStructArray() {
-        Struct4 struct = new Struct4();
-        assertNull(struct.data);
-        assertThrowsSerializationException(struct);
-
-        // Create the (1-element) array but have the element null.
-        struct.data = new Struct1[1];
-        assertThrowsSerializationException(struct);
-
-        // Create the array element, struct should serialize now.
-        struct.data[0] = new Struct1();
-        struct.serialize(null);
-    }
-
-    /**
-     * Verifies that serializing a struct with a fixed-size array of incorrect length throws an
-     * exception.
-     */
-    @SmallTest
-    public void testFixedSizeArray() {
-        Struct5 struct = new Struct5();
-        assertNull(struct.pair);
-        assertThrowsSerializationException(struct);
-
-        // Create the (1-element) array, 2-element array is required.
-        struct.pair = new Struct1[1];
-        struct.pair[0] = new Struct1();
-        assertThrowsSerializationException(struct);
-
-        // Create the array of a correct size, struct should serialize now.
-        struct.pair = new Struct1[2];
-        struct.pair[0] = new Struct1();
-        struct.pair[1] = new Struct1();
-        struct.serialize(null);
-    }
-
-    /**
-     * Verifies that serializing a struct with a null string throws an exception.
-     */
-    @SmallTest
-    public void testString() {
-        Struct6 struct = new Struct6();
-        assertNull(struct.str);
-        assertThrowsSerializationException(struct);
-
-        // Make the struct valid and verify that it serializes without an exception.
-        struct.str = "";
-        struct.serialize(null);
-    }
-
-    /**
-     * Verifies that a struct with an invalid nullable handle, null nullable struct pointer and null
-     * nullable string serializes without an exception.
-     */
-    @SmallTest
-    public void testNullableFields() {
-        StructOfNullables struct = new StructOfNullables();
-        assertFalse(struct.hdl.isValid());
-        assertNull(struct.struct1);
-        assertNull(struct.str);
-        struct.serialize(null);
-    }
-
-    /**
-     * Verifies that a struct can be serialized to and deserialized from a ByteBuffer.
-     */
-    @SmallTest
-    public void testByteBufferSerialization() {
-        Struct1 input = new Struct1();
-        input.i = 0x7F;
-
-        ByteBuffer buf = input.serialize();
-
-        byte[] expected_raw_bytes = {16, 0, 0, 0, 0, 0, 0, 0, 0x7F, 0, 0, 0, 0, 0, 0, 0};
-        ByteBuffer expected_buf = ByteBuffer.wrap(expected_raw_bytes);
-        assertEquals(expected_buf, buf);
-
-        Struct1 output = Struct1.deserialize(buf);
-        assertEquals(0x7F, output.i);
-    }
-
-    /**
-     * Verifies that a struct with handles cannot be serialized to a ByteBuffer.
-     */
-    @SmallTest
-    public void testByteBufferSerializationWithHandles() {
-        StructOfNullables struct = new StructOfNullables();
-        assertFalse(struct.hdl.isValid());
-        assertNull(struct.struct1);
-        assertNull(struct.str);
-
-        // It is okay to serialize invalid handles.
-        struct.serialize();
-
-        struct.hdl = new HandleMock();
-
-        try {
-            struct.serialize();
-            fail("Serializing a struct with handles to a ByteBuffer should have thrown an "
-                    + "exception.");
-        } catch (UnsupportedOperationException ex) {
-            // Expected.
-        }
-    }
-}
diff --git a/mojo/android/javatests/src/org/chromium/mojo/bindings/ValidationTest.java b/mojo/android/javatests/src/org/chromium/mojo/bindings/ValidationTest.java
deleted file mode 100644
index 8424618..0000000
--- a/mojo/android/javatests/src/org/chromium/mojo/bindings/ValidationTest.java
+++ /dev/null
@@ -1,237 +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.
-
-package org.chromium.mojo.bindings;
-
-import android.support.test.filters.SmallTest;
-
-import org.chromium.base.test.util.UrlUtils;
-import org.chromium.mojo.HandleMock;
-import org.chromium.mojo.MojoTestCase;
-import org.chromium.mojo.bindings.test.mojom.mojo.ConformanceTestInterface;
-import org.chromium.mojo.bindings.test.mojom.mojo.IntegrationTestInterface;
-import org.chromium.mojo.bindings.test.mojom.mojo.IntegrationTestInterfaceTestHelper;
-import org.chromium.mojo.system.Handle;
-import org.chromium.mojo.system.impl.CoreImpl;
-
-import java.io.File;
-import java.io.FileFilter;
-import java.io.FileNotFoundException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Scanner;
-
-/**
- * Testing validation upon deserialization using the interfaces defined in the
- * mojo/public/interfaces/bindings/tests/validation_test_interfaces.mojom file.
- * <p>
- * One needs to pass '--test_data=bindings:{path to mojo/public/interfaces/bindings/tests/data}' to
- * the test_runner script for this test to find the validation data it needs.
- */
-public class ValidationTest extends MojoTestCase {
-
-    /**
-     * The path where validation test data is.
-     */
-    private static final File VALIDATION_TEST_DATA_PATH =
-            new File(UrlUtils.getIsolatedTestFilePath(
-                "mojo/public/interfaces/bindings/tests/data/validation"));
-
-    /**
-     * The data needed for a validation test.
-     */
-    private static class TestData {
-        public File dataFile;
-        public ValidationTestUtil.Data inputData;
-        public String expectedResult;
-    }
-
-    private static class DataFileFilter implements FileFilter {
-        private final String mPrefix;
-
-        public DataFileFilter(String prefix) {
-            this.mPrefix = prefix;
-        }
-
-        @Override
-        public boolean accept(File pathname) {
-            // TODO(yzshen, qsr): skip some interface versioning tests.
-            if (pathname.getName().startsWith("conformance_mthd13_good_2")) {
-                return false;
-            }
-            return pathname.isFile() && pathname.getName().startsWith(mPrefix)
-                    && pathname.getName().endsWith(".data");
-        }
-    }
-
-    private static String getStringContent(File f) throws FileNotFoundException {
-        try (Scanner scanner = new Scanner(f)) {
-            scanner.useDelimiter("\\Z");
-            StringBuilder result = new StringBuilder();
-            while (scanner.hasNext()) {
-                result.append(scanner.next());
-            }
-            return result.toString().trim();
-        }
-    }
-
-    private static List<TestData> getTestData(String prefix)
-            throws FileNotFoundException {
-        List<TestData> results = new ArrayList<TestData>();
-
-        // Fail if the test data is not present.
-        if (!VALIDATION_TEST_DATA_PATH.isDirectory()) {
-            fail("No test data directory found. "
-                    + "Expected directory at: " + VALIDATION_TEST_DATA_PATH);
-        }
-
-        File[] files = VALIDATION_TEST_DATA_PATH.listFiles(new DataFileFilter(prefix));
-        if (files != null) {
-            for (File dataFile : files) {
-                File resultFile = new File(dataFile.getParent(),
-                        dataFile.getName().replaceFirst("\\.data$", ".expected"));
-                TestData testData = new TestData();
-                testData.dataFile = dataFile;
-                testData.inputData = ValidationTestUtil.parseData(getStringContent(dataFile));
-                testData.expectedResult = getStringContent(resultFile);
-                results.add(testData);
-            }
-        }
-        return results;
-    }
-
-    /**
-     * Runs all the test with the given prefix on the given {@link MessageReceiver}.
-     */
-    private static void runTest(String prefix, MessageReceiver messageReceiver)
-            throws FileNotFoundException {
-        List<TestData> testData = getTestData(prefix);
-        for (TestData test : testData) {
-            assertNull("Unable to read: " + test.dataFile.getName()
-                    + ": " + test.inputData.getErrorMessage(),
-                    test.inputData.getErrorMessage());
-            List<Handle> handles = new ArrayList<Handle>();
-            for (int i = 0; i < test.inputData.getHandlesCount(); ++i) {
-                handles.add(new HandleMock());
-            }
-            Message message = new Message(test.inputData.getData(), handles);
-            boolean passed = messageReceiver.accept(message);
-            if (passed && !test.expectedResult.equals("PASS")) {
-                fail("Input: " + test.dataFile.getName()
-                        + ": The message should have been refused. Expected error: "
-                        + test.expectedResult);
-            }
-            if (!passed && test.expectedResult.equals("PASS")) {
-                fail("Input: " + test.dataFile.getName()
-                        + ": The message should have been accepted.");
-            }
-        }
-    }
-
-    private static class RoutingMessageReceiver implements MessageReceiver {
-        private final MessageReceiverWithResponder mRequest;
-        private final MessageReceiver mResponse;
-
-        private RoutingMessageReceiver(MessageReceiverWithResponder request,
-                MessageReceiver response) {
-            this.mRequest = request;
-            this.mResponse = response;
-        }
-
-        /**
-         * @see MessageReceiver#accept(Message)
-         */
-        @Override
-        public boolean accept(Message message) {
-            try {
-                MessageHeader header = message.asServiceMessage().getHeader();
-                if (header.hasFlag(MessageHeader.MESSAGE_IS_RESPONSE_FLAG)) {
-                    return mResponse.accept(message);
-                } else {
-                    return mRequest.acceptWithResponder(message, new SinkMessageReceiver());
-                }
-            } catch (DeserializationException e) {
-                return false;
-            }
-        }
-
-        /**
-         * @see MessageReceiver#close()
-         */
-        @Override
-        public void close() {
-        }
-
-    }
-
-    /**
-     * A trivial message receiver that refuses all messages it receives.
-     */
-    private static class SinkMessageReceiver implements MessageReceiverWithResponder {
-
-        @Override
-        public boolean accept(Message message) {
-            return true;
-        }
-
-        @Override
-        public void close() {
-        }
-
-        @Override
-        public boolean acceptWithResponder(Message message, MessageReceiver responder) {
-            return true;
-        }
-    }
-
-    /**
-     * Testing the conformance suite.
-     */
-    @SmallTest
-    public void testConformance() throws FileNotFoundException {
-        runTest("conformance_",
-                ConformanceTestInterface.MANAGER.buildStub(CoreImpl.getInstance(),
-                        ConformanceTestInterface.MANAGER.buildProxy(
-                                CoreImpl.getInstance(), new SinkMessageReceiver())));
-    }
-
-    /**
-     * Testing the integration suite for message headers.
-     */
-    @SmallTest
-    public void testIntegrationMessageHeader() throws FileNotFoundException {
-        runTest("integration_msghdr_",
-                new RoutingMessageReceiver(IntegrationTestInterface.MANAGER.buildStub(null,
-                        IntegrationTestInterface.MANAGER.buildProxy(null,
-                                new SinkMessageReceiver())),
-                        IntegrationTestInterfaceTestHelper
-                                .newIntegrationTestInterfaceMethodCallback()));
-    }
-
-    /**
-     * Testing the integration suite for request messages.
-     */
-    @SmallTest
-    public void testIntegrationRequestMessage() throws FileNotFoundException {
-        runTest("integration_intf_rqst_",
-                new RoutingMessageReceiver(IntegrationTestInterface.MANAGER.buildStub(null,
-                        IntegrationTestInterface.MANAGER.buildProxy(null,
-                                new SinkMessageReceiver())),
-                        IntegrationTestInterfaceTestHelper
-                                .newIntegrationTestInterfaceMethodCallback()));
-    }
-
-    /**
-     * Testing the integration suite for response messages.
-     */
-    @SmallTest
-    public void testIntegrationResponseMessage() throws FileNotFoundException {
-        runTest("integration_intf_resp_",
-                new RoutingMessageReceiver(IntegrationTestInterface.MANAGER.buildStub(null,
-                        IntegrationTestInterface.MANAGER.buildProxy(null,
-                                new SinkMessageReceiver())),
-                        IntegrationTestInterfaceTestHelper
-                                .newIntegrationTestInterfaceMethodCallback()));
-    }
-}
diff --git a/mojo/android/javatests/src/org/chromium/mojo/bindings/ValidationTestUtil.java b/mojo/android/javatests/src/org/chromium/mojo/bindings/ValidationTestUtil.java
deleted file mode 100644
index 91b993c..0000000
--- a/mojo/android/javatests/src/org/chromium/mojo/bindings/ValidationTestUtil.java
+++ /dev/null
@@ -1,68 +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.
-
-package org.chromium.mojo.bindings;
-
-import org.chromium.base.annotations.CalledByNative;
-import org.chromium.base.annotations.JNINamespace;
-
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-
-/**
- * Utility class for testing message validation. The file format used to describe a message is
- * described in The format is described in
- * mojo/public/cpp/bindings/tests/validation_test_input_parser.h
- */
-@JNINamespace("mojo::android")
-public class ValidationTestUtil {
-
-    /**
-     * Content of a '.data' file.
-     */
-    public static class Data {
-        private final ByteBuffer mData;
-        private final int mHandlesCount;
-        private final String mErrorMessage;
-
-        public ByteBuffer getData() {
-            return mData;
-        }
-
-        public int getHandlesCount() {
-            return mHandlesCount;
-        }
-
-        public String getErrorMessage() {
-            return mErrorMessage;
-        }
-
-        private Data(ByteBuffer data, int handlesCount, String errorMessage) {
-            this.mData = data;
-            this.mHandlesCount = handlesCount;
-            this.mErrorMessage = errorMessage;
-        }
-    }
-
-    /**
-     * Parse a '.data' file.
-     */
-    public static Data parseData(String dataAsString) {
-        return nativeParseData(dataAsString);
-    }
-
-    private static native Data nativeParseData(String dataAsString);
-
-    @CalledByNative
-    private static Data buildData(ByteBuffer data, int handlesCount, String errorMessage) {
-        ByteBuffer copiedData = null;
-        if (data != null) {
-            copiedData = ByteBuffer.allocateDirect(data.limit());
-            copiedData.order(ByteOrder.LITTLE_ENDIAN);
-            copiedData.put(data);
-            copiedData.flip();
-        }
-        return new Data(copiedData, handlesCount, errorMessage);
-    }
-}
diff --git a/mojo/android/javatests/src/org/chromium/mojo/bindings/ValidationTestUtilTest.java b/mojo/android/javatests/src/org/chromium/mojo/bindings/ValidationTestUtilTest.java
deleted file mode 100644
index 623abc3..0000000
--- a/mojo/android/javatests/src/org/chromium/mojo/bindings/ValidationTestUtilTest.java
+++ /dev/null
@@ -1,151 +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.
-
-package org.chromium.mojo.bindings;
-
-import android.support.test.filters.SmallTest;
-
-import org.chromium.mojo.MojoTestCase;
-
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-
-/**
- * Testing {@link ValidationTestUtil}.
- */
-public class ValidationTestUtilTest extends MojoTestCase {
-
-    /**
-     * Check that the input parser is correct on a given input.
-     */
-    public static void checkInputParser(
-            String input, boolean isInputValid, ByteBuffer expectedData, int expectedHandlesCount) {
-        ValidationTestUtil.Data data = ValidationTestUtil.parseData(input);
-        if (isInputValid) {
-            assertNull(data.getErrorMessage());
-            assertEquals(expectedData, data.getData());
-            assertEquals(expectedHandlesCount, data.getHandlesCount());
-        } else {
-            assertNotNull(data.getErrorMessage());
-            assertNull(data.getData());
-        }
-    }
-
-    /**
-     * Testing {@link ValidationTestUtil#parseData(String)}.
-     */
-    @SmallTest
-    public void testCorrectMessageParsing() {
-        {
-            // Test empty input.
-            String input = "";
-            ByteBuffer expected = ByteBuffer.allocateDirect(0);
-            expected.order(ByteOrder.LITTLE_ENDIAN);
-
-            checkInputParser(input, true, expected, 0);
-        }
-        {
-            // Test input that only consists of comments and whitespaces.
-            String input = "    \t  // hello world \n\r \t// the answer is 42   ";
-            ByteBuffer expected = ByteBuffer.allocateDirect(0);
-            expected.order(ByteOrder.nativeOrder());
-
-            checkInputParser(input, true, expected, 0);
-        }
-        {
-            String input = "[u1]0x10// hello world !! \n\r  \t [u2]65535 \n"
-                    + "[u4]65536 [u8]0xFFFFFFFFFFFFFFFF 0 0Xff";
-            ByteBuffer expected = ByteBuffer.allocateDirect(17);
-            expected.order(ByteOrder.nativeOrder());
-            expected.put((byte) 0x10);
-            expected.putShort((short) 65535);
-            expected.putInt(65536);
-            expected.putLong(-1);
-            expected.put((byte) 0);
-            expected.put((byte) 0xff);
-            expected.flip();
-
-            checkInputParser(input, true, expected, 0);
-        }
-        {
-            String input = "[s8]-0x800 [s1]-128\t[s2]+0 [s4]-40";
-            ByteBuffer expected = ByteBuffer.allocateDirect(15);
-            expected.order(ByteOrder.nativeOrder());
-            expected.putLong(-0x800);
-            expected.put((byte) -128);
-            expected.putShort((short) 0);
-            expected.putInt(-40);
-            expected.flip();
-
-            checkInputParser(input, true, expected, 0);
-        }
-        {
-            String input = "[b]00001011 [b]10000000  // hello world\r [b]00000000";
-            ByteBuffer expected = ByteBuffer.allocateDirect(3);
-            expected.order(ByteOrder.nativeOrder());
-            expected.put((byte) 11);
-            expected.put((byte) 128);
-            expected.put((byte) 0);
-            expected.flip();
-
-            checkInputParser(input, true, expected, 0);
-        }
-        {
-            String input = "[f]+.3e9 [d]-10.03";
-            ByteBuffer expected = ByteBuffer.allocateDirect(12);
-            expected.order(ByteOrder.nativeOrder());
-            expected.putFloat(+.3e9f);
-            expected.putDouble(-10.03);
-            expected.flip();
-
-            checkInputParser(input, true, expected, 0);
-        }
-        {
-            String input = "[dist4]foo 0 [dist8]bar 0 [anchr]foo [anchr]bar";
-            ByteBuffer expected = ByteBuffer.allocateDirect(14);
-            expected.order(ByteOrder.nativeOrder());
-            expected.putInt(14);
-            expected.put((byte) 0);
-            expected.putLong(9);
-            expected.put((byte) 0);
-            expected.flip();
-
-            checkInputParser(input, true, expected, 0);
-        }
-        {
-            String input = "// This message has handles! \n[handles]50 [u8]2";
-            ByteBuffer expected = ByteBuffer.allocateDirect(8);
-            expected.order(ByteOrder.nativeOrder());
-            expected.putLong(2);
-            expected.flip();
-
-            checkInputParser(input, true, expected, 50);
-        }
-
-        // Test some failure cases.
-        {
-            String error_inputs[] = {
-                "/ hello world",
-                "[u1]x",
-                "[u2]-1000",
-                "[u1]0x100",
-                "[s2]-0x8001",
-                "[b]1",
-                "[b]1111111k",
-                "[dist4]unmatched",
-                "[anchr]hello [dist8]hello",
-                "[dist4]a [dist4]a [anchr]a",
-                "[dist4]a [anchr]a [dist4]a [anchr]a",
-                "0 [handles]50"
-            };
-
-            for (String input : error_inputs) {
-                ByteBuffer expected = ByteBuffer.allocateDirect(0);
-                expected.order(ByteOrder.nativeOrder());
-                checkInputParser(input, false, expected, 0);
-            }
-        }
-
-    }
-}
diff --git a/mojo/android/javatests/src/org/chromium/mojo/bindings/test/mojom/mojo/IntegrationTestInterfaceTestHelper.java b/mojo/android/javatests/src/org/chromium/mojo/bindings/test/mojom/mojo/IntegrationTestInterfaceTestHelper.java
deleted file mode 100644
index 8fb79d7..0000000
--- a/mojo/android/javatests/src/org/chromium/mojo/bindings/test/mojom/mojo/IntegrationTestInterfaceTestHelper.java
+++ /dev/null
@@ -1,31 +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.
-
-package org.chromium.mojo.bindings.test.mojom.mojo;
-
-import org.chromium.mojo.bindings.MessageReceiver;
-import org.chromium.mojo.bindings.test.mojom.mojo.IntegrationTestInterface.Method0Response;
-import org.chromium.mojo.bindings.test.mojom.mojo.IntegrationTestInterface_Internal.IntegrationTestInterfaceMethod0ResponseParamsForwardToCallback;
-
-/**
- * Helper class to access {@link IntegrationTestInterface_Internal} package protected method for
- * tests.
- */
-public class IntegrationTestInterfaceTestHelper {
-
-    private static final class SinkMethod0Response implements Method0Response {
-        @Override
-        public void call(byte[] arg1) {
-        }
-    }
-
-    /**
-     * Creates a new {@link MessageReceiver} to use for the callback of
-     * |IntegrationTestInterface#method0(Method0Response)|.
-     */
-    public static MessageReceiver newIntegrationTestInterfaceMethodCallback() {
-        return new IntegrationTestInterfaceMethod0ResponseParamsForwardToCallback(
-                new SinkMethod0Response());
-    }
-}
diff --git a/mojo/android/javatests/src/org/chromium/mojo/system/impl/CoreImplTest.java b/mojo/android/javatests/src/org/chromium/mojo/system/impl/CoreImplTest.java
deleted file mode 100644
index 5120198..0000000
--- a/mojo/android/javatests/src/org/chromium/mojo/system/impl/CoreImplTest.java
+++ /dev/null
@@ -1,545 +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.
-
-package org.chromium.mojo.system.impl;
-
-import android.support.test.filters.SmallTest;
-
-import org.chromium.mojo.MojoTestCase;
-import org.chromium.mojo.system.Core;
-import org.chromium.mojo.system.Core.HandleSignals;
-import org.chromium.mojo.system.DataPipe;
-import org.chromium.mojo.system.Handle;
-import org.chromium.mojo.system.InvalidHandle;
-import org.chromium.mojo.system.MessagePipeHandle;
-import org.chromium.mojo.system.MojoException;
-import org.chromium.mojo.system.MojoResult;
-import org.chromium.mojo.system.Pair;
-import org.chromium.mojo.system.ResultAnd;
-import org.chromium.mojo.system.SharedBufferHandle;
-
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.Random;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-
-/**
- * Testing the core API.
- */
-public class CoreImplTest extends MojoTestCase {
-    private static final long RUN_LOOP_TIMEOUT_MS = 5;
-
-    private static final ScheduledExecutorService WORKER =
-            Executors.newSingleThreadScheduledExecutor();
-
-    private static final HandleSignals ALL_SIGNALS =
-            HandleSignals.none().setPeerClosed(true).setReadable(true).setWritable(true);
-
-    private List<Handle> mHandlesToClose = new ArrayList<Handle>();
-
-    /**
-     * @see MojoTestCase#tearDown()
-     */
-    @Override
-    protected void tearDown() throws Exception {
-        MojoException toThrow = null;
-        for (Handle handle : mHandlesToClose) {
-            try {
-                handle.close();
-            } catch (MojoException e) {
-                if (toThrow == null) {
-                    toThrow = e;
-                }
-            }
-        }
-        if (toThrow != null) {
-            throw toThrow;
-        }
-        super.tearDown();
-    }
-
-    private void addHandleToClose(Handle handle) {
-        mHandlesToClose.add(handle);
-    }
-
-    private void addHandlePairToClose(Pair<? extends Handle, ? extends Handle> handles) {
-        mHandlesToClose.add(handles.first);
-        mHandlesToClose.add(handles.second);
-    }
-
-    private static void checkSendingMessage(MessagePipeHandle in, MessagePipeHandle out) {
-        Random random = new Random();
-
-        // Writing a random 8 bytes message.
-        byte[] bytes = new byte[8];
-        random.nextBytes(bytes);
-        ByteBuffer buffer = ByteBuffer.allocateDirect(bytes.length);
-        buffer.put(bytes);
-        in.writeMessage(buffer, null, MessagePipeHandle.WriteFlags.NONE);
-
-        // Try to read into a small buffer.
-        ByteBuffer receiveBuffer = ByteBuffer.allocateDirect(bytes.length / 2);
-        ResultAnd<MessagePipeHandle.ReadMessageResult> result =
-                out.readMessage(receiveBuffer, 0, MessagePipeHandle.ReadFlags.NONE);
-        assertEquals(MojoResult.RESOURCE_EXHAUSTED, result.getMojoResult());
-        assertEquals(bytes.length, result.getValue().getMessageSize());
-        assertEquals(0, result.getValue().getHandlesCount());
-
-        // Read into a correct buffer.
-        receiveBuffer = ByteBuffer.allocateDirect(bytes.length);
-        result = out.readMessage(receiveBuffer, 0, MessagePipeHandle.ReadFlags.NONE);
-        assertEquals(MojoResult.OK, result.getMojoResult());
-        assertEquals(bytes.length, result.getValue().getMessageSize());
-        assertEquals(0, result.getValue().getHandlesCount());
-        assertEquals(0, receiveBuffer.position());
-        assertEquals(result.getValue().getMessageSize(), receiveBuffer.limit());
-        byte[] receivedBytes = new byte[result.getValue().getMessageSize()];
-        receiveBuffer.get(receivedBytes);
-        assertTrue(Arrays.equals(bytes, receivedBytes));
-    }
-
-    private static void checkSendingData(DataPipe.ProducerHandle in, DataPipe.ConsumerHandle out) {
-        Random random = new Random();
-
-        // Writing a random 8 bytes message.
-        byte[] bytes = new byte[8];
-        random.nextBytes(bytes);
-        ByteBuffer buffer = ByteBuffer.allocateDirect(bytes.length);
-        buffer.put(bytes);
-        ResultAnd<Integer> result = in.writeData(buffer, DataPipe.WriteFlags.NONE);
-        assertEquals(MojoResult.OK, result.getMojoResult());
-        assertEquals(bytes.length, result.getValue().intValue());
-
-        // Query number of bytes available.
-        ResultAnd<Integer> readResult = out.readData(null, DataPipe.ReadFlags.none().query(true));
-        assertEquals(MojoResult.OK, readResult.getMojoResult());
-        assertEquals(bytes.length, readResult.getValue().intValue());
-
-        // Peek data into a buffer.
-        ByteBuffer peekBuffer = ByteBuffer.allocateDirect(bytes.length);
-        readResult = out.readData(peekBuffer, DataPipe.ReadFlags.none().peek(true));
-        assertEquals(MojoResult.OK, readResult.getMojoResult());
-        assertEquals(bytes.length, readResult.getValue().intValue());
-        assertEquals(bytes.length, peekBuffer.limit());
-        byte[] peekBytes = new byte[bytes.length];
-        peekBuffer.get(peekBytes);
-        assertTrue(Arrays.equals(bytes, peekBytes));
-
-        // Read into a buffer.
-        ByteBuffer receiveBuffer = ByteBuffer.allocateDirect(bytes.length);
-        readResult = out.readData(receiveBuffer, DataPipe.ReadFlags.NONE);
-        assertEquals(MojoResult.OK, readResult.getMojoResult());
-        assertEquals(bytes.length, readResult.getValue().intValue());
-        assertEquals(0, receiveBuffer.position());
-        assertEquals(bytes.length, receiveBuffer.limit());
-        byte[] receivedBytes = new byte[bytes.length];
-        receiveBuffer.get(receivedBytes);
-        assertTrue(Arrays.equals(bytes, receivedBytes));
-    }
-
-    private static void checkSharing(SharedBufferHandle in, SharedBufferHandle out) {
-        Random random = new Random();
-
-        ByteBuffer buffer1 = in.map(0, 8, SharedBufferHandle.MapFlags.NONE);
-        assertEquals(8, buffer1.capacity());
-        ByteBuffer buffer2 = out.map(0, 8, SharedBufferHandle.MapFlags.NONE);
-        assertEquals(8, buffer2.capacity());
-
-        byte[] bytes = new byte[8];
-        random.nextBytes(bytes);
-        buffer1.put(bytes);
-
-        byte[] receivedBytes = new byte[bytes.length];
-        buffer2.get(receivedBytes);
-
-        assertTrue(Arrays.equals(bytes, receivedBytes));
-
-        in.unmap(buffer1);
-        out.unmap(buffer2);
-    }
-
-    /**
-     * Testing that Core can be retrieved from a handle.
-     */
-    @SmallTest
-    public void testGetCore() {
-        Core core = CoreImpl.getInstance();
-
-        Pair<? extends Handle, ? extends Handle> handles = core.createMessagePipe(null);
-        addHandlePairToClose(handles);
-        assertEquals(core, handles.first.getCore());
-        assertEquals(core, handles.second.getCore());
-
-        handles = core.createDataPipe(null);
-        addHandlePairToClose(handles);
-        assertEquals(core, handles.first.getCore());
-        assertEquals(core, handles.second.getCore());
-
-        SharedBufferHandle handle = core.createSharedBuffer(null, 100);
-        SharedBufferHandle handle2 = handle.duplicate(null);
-        addHandleToClose(handle);
-        addHandleToClose(handle2);
-        assertEquals(core, handle.getCore());
-        assertEquals(core, handle2.getCore());
-    }
-
-    private static void createAndCloseMessagePipe(MessagePipeHandle.CreateOptions options) {
-        Core core = CoreImpl.getInstance();
-        Pair<MessagePipeHandle, MessagePipeHandle> handles = core.createMessagePipe(options);
-        handles.first.close();
-        handles.second.close();
-    }
-
-    /**
-     * Testing {@link MessagePipeHandle} creation.
-     */
-    @SmallTest
-    public void testMessagePipeCreation() {
-        // Test creation with null options.
-        createAndCloseMessagePipe(null);
-        // Test creation with default options.
-        createAndCloseMessagePipe(new MessagePipeHandle.CreateOptions());
-    }
-
-    /**
-     * Testing {@link MessagePipeHandle}.
-     */
-    @SmallTest
-    public void testMessagePipeEmpty() {
-        Core core = CoreImpl.getInstance();
-        Pair<MessagePipeHandle, MessagePipeHandle> handles = core.createMessagePipe(null);
-        addHandlePairToClose(handles);
-
-        // Testing read on an empty pipe.
-        ResultAnd<MessagePipeHandle.ReadMessageResult> readResult =
-                handles.first.readMessage(null, 0, MessagePipeHandle.ReadFlags.NONE);
-        assertEquals(MojoResult.SHOULD_WAIT, readResult.getMojoResult());
-
-        handles.first.close();
-        handles.second.close();
-    }
-
-    /**
-     * Testing {@link MessagePipeHandle}.
-     */
-    @SmallTest
-    public void testMessagePipeSend() {
-        Core core = CoreImpl.getInstance();
-        Pair<MessagePipeHandle, MessagePipeHandle> handles = core.createMessagePipe(null);
-        addHandlePairToClose(handles);
-
-        checkSendingMessage(handles.first, handles.second);
-        checkSendingMessage(handles.second, handles.first);
-    }
-
-    /**
-     * Testing {@link MessagePipeHandle}.
-     */
-    @SmallTest
-    public void testMessagePipeReceiveOnSmallBuffer() {
-        Random random = new Random();
-        Core core = CoreImpl.getInstance();
-        Pair<MessagePipeHandle, MessagePipeHandle> handles = core.createMessagePipe(null);
-        addHandlePairToClose(handles);
-
-        // Writing a random 8 bytes message.
-        byte[] bytes = new byte[8];
-        random.nextBytes(bytes);
-        ByteBuffer buffer = ByteBuffer.allocateDirect(bytes.length);
-        buffer.put(bytes);
-        handles.first.writeMessage(buffer, null, MessagePipeHandle.WriteFlags.NONE);
-
-        ByteBuffer receiveBuffer = ByteBuffer.allocateDirect(1);
-        ResultAnd<MessagePipeHandle.ReadMessageResult> result =
-                handles.second.readMessage(receiveBuffer, 0, MessagePipeHandle.ReadFlags.NONE);
-        assertEquals(MojoResult.RESOURCE_EXHAUSTED, result.getMojoResult());
-        assertEquals(bytes.length, result.getValue().getMessageSize());
-        assertEquals(0, result.getValue().getHandlesCount());
-    }
-
-    /**
-     * Testing {@link MessagePipeHandle}.
-     */
-    @SmallTest
-    public void testMessagePipeSendHandles() {
-        Core core = CoreImpl.getInstance();
-        Pair<MessagePipeHandle, MessagePipeHandle> handles = core.createMessagePipe(null);
-        Pair<MessagePipeHandle, MessagePipeHandle> handlesToShare = core.createMessagePipe(null);
-        addHandlePairToClose(handles);
-        addHandlePairToClose(handlesToShare);
-
-        handles.first.writeMessage(null, Collections.<Handle>singletonList(handlesToShare.second),
-                MessagePipeHandle.WriteFlags.NONE);
-        assertFalse(handlesToShare.second.isValid());
-        ResultAnd<MessagePipeHandle.ReadMessageResult> readMessageResult =
-                handles.second.readMessage(null, 1, MessagePipeHandle.ReadFlags.NONE);
-        assertEquals(1, readMessageResult.getValue().getHandlesCount());
-        MessagePipeHandle newHandle =
-                readMessageResult.getValue().getHandles().get(0).toMessagePipeHandle();
-        addHandleToClose(newHandle);
-        assertTrue(newHandle.isValid());
-        checkSendingMessage(handlesToShare.first, newHandle);
-        checkSendingMessage(newHandle, handlesToShare.first);
-    }
-
-    private static void createAndCloseDataPipe(DataPipe.CreateOptions options) {
-        Core core = CoreImpl.getInstance();
-        Pair<DataPipe.ProducerHandle, DataPipe.ConsumerHandle> handles =
-                core.createDataPipe(options);
-        handles.first.close();
-        handles.second.close();
-    }
-
-    /**
-     * Testing {@link DataPipe}.
-     */
-    @SmallTest
-    public void testDataPipeCreation() {
-        // Create datapipe with null options.
-        createAndCloseDataPipe(null);
-        DataPipe.CreateOptions options = new DataPipe.CreateOptions();
-        // Create datapipe with element size set.
-        options.setElementNumBytes(24);
-        createAndCloseDataPipe(options);
-        // Create datapipe with capacity set.
-        options.setCapacityNumBytes(1024 * options.getElementNumBytes());
-        createAndCloseDataPipe(options);
-    }
-
-    /**
-     * Testing {@link DataPipe}.
-     */
-    @SmallTest
-    public void testDataPipeSend() {
-        Core core = CoreImpl.getInstance();
-
-        Pair<DataPipe.ProducerHandle, DataPipe.ConsumerHandle> handles = core.createDataPipe(null);
-        addHandlePairToClose(handles);
-
-        checkSendingData(handles.first, handles.second);
-    }
-
-    /**
-     * Testing {@link DataPipe}.
-     */
-    @SmallTest
-    public void testDataPipeTwoPhaseSend() {
-        Random random = new Random();
-        Core core = CoreImpl.getInstance();
-        Pair<DataPipe.ProducerHandle, DataPipe.ConsumerHandle> handles = core.createDataPipe(null);
-        addHandlePairToClose(handles);
-
-        // Writing a random 8 bytes message.
-        byte[] bytes = new byte[8];
-        random.nextBytes(bytes);
-        ByteBuffer buffer = handles.first.beginWriteData(bytes.length, DataPipe.WriteFlags.NONE);
-        assertTrue(buffer.capacity() >= bytes.length);
-        buffer.put(bytes);
-        handles.first.endWriteData(bytes.length);
-
-        // Read into a buffer.
-        ByteBuffer receiveBuffer =
-                handles.second.beginReadData(bytes.length, DataPipe.ReadFlags.NONE);
-        assertEquals(0, receiveBuffer.position());
-        assertEquals(bytes.length, receiveBuffer.limit());
-        byte[] receivedBytes = new byte[bytes.length];
-        receiveBuffer.get(receivedBytes);
-        assertTrue(Arrays.equals(bytes, receivedBytes));
-        handles.second.endReadData(bytes.length);
-    }
-
-    /**
-     * Testing {@link DataPipe}.
-     */
-    @SmallTest
-    public void testDataPipeDiscard() {
-        Random random = new Random();
-        Core core = CoreImpl.getInstance();
-        Pair<DataPipe.ProducerHandle, DataPipe.ConsumerHandle> handles = core.createDataPipe(null);
-        addHandlePairToClose(handles);
-
-        // Writing a random 8 bytes message.
-        byte[] bytes = new byte[8];
-        random.nextBytes(bytes);
-        ByteBuffer buffer = ByteBuffer.allocateDirect(bytes.length);
-        buffer.put(bytes);
-        ResultAnd<Integer> result = handles.first.writeData(buffer, DataPipe.WriteFlags.NONE);
-        assertEquals(MojoResult.OK, result.getMojoResult());
-        assertEquals(bytes.length, result.getValue().intValue());
-
-        // Discard bytes.
-        final int nbBytesToDiscard = 4;
-        assertEquals(nbBytesToDiscard,
-                handles.second.discardData(nbBytesToDiscard, DataPipe.ReadFlags.NONE));
-
-        // Read into a buffer.
-        ByteBuffer receiveBuffer = ByteBuffer.allocateDirect(bytes.length - nbBytesToDiscard);
-        ResultAnd<Integer> readResult =
-                handles.second.readData(receiveBuffer, DataPipe.ReadFlags.NONE);
-        assertEquals(MojoResult.OK, readResult.getMojoResult());
-        assertEquals(bytes.length - nbBytesToDiscard, readResult.getValue().intValue());
-        assertEquals(0, receiveBuffer.position());
-        assertEquals(bytes.length - nbBytesToDiscard, receiveBuffer.limit());
-        byte[] receivedBytes = new byte[bytes.length - nbBytesToDiscard];
-        receiveBuffer.get(receivedBytes);
-        assertTrue(Arrays.equals(
-                Arrays.copyOfRange(bytes, nbBytesToDiscard, bytes.length), receivedBytes));
-    }
-
-    /**
-     * Testing {@link SharedBufferHandle}.
-     */
-    @SmallTest
-    public void testSharedBufferCreation() {
-        Core core = CoreImpl.getInstance();
-        // Test creation with empty options.
-        core.createSharedBuffer(null, 8).close();
-        // Test creation with default options.
-        core.createSharedBuffer(new SharedBufferHandle.CreateOptions(), 8).close();
-    }
-
-    /**
-     * Testing {@link SharedBufferHandle}.
-     */
-    @SmallTest
-    public void testSharedBufferDuplication() {
-        Core core = CoreImpl.getInstance();
-        SharedBufferHandle handle = core.createSharedBuffer(null, 8);
-        addHandleToClose(handle);
-
-        // Test duplication with empty options.
-        handle.duplicate(null).close();
-        // Test creation with default options.
-        handle.duplicate(new SharedBufferHandle.DuplicateOptions()).close();
-    }
-
-    /**
-     * Testing {@link SharedBufferHandle}.
-     */
-    @SmallTest
-    public void testSharedBufferSending() {
-        Core core = CoreImpl.getInstance();
-        SharedBufferHandle handle = core.createSharedBuffer(null, 8);
-        addHandleToClose(handle);
-        SharedBufferHandle newHandle = handle.duplicate(null);
-        addHandleToClose(newHandle);
-
-        checkSharing(handle, newHandle);
-        checkSharing(newHandle, handle);
-    }
-
-    /**
-     * Testing that invalid handle can be used with this implementation.
-     */
-    @SmallTest
-    public void testInvalidHandle() {
-        Core core = CoreImpl.getInstance();
-        Handle handle = InvalidHandle.INSTANCE;
-
-        // Checking sending an invalid handle.
-        // Until the behavior is changed on the C++ side, handle gracefully 2 different use case:
-        // - Receive a INVALID_ARGUMENT exception
-        // - Receive an invalid handle on the other side.
-        Pair<MessagePipeHandle, MessagePipeHandle> handles = core.createMessagePipe(null);
-        addHandlePairToClose(handles);
-        try {
-            handles.first.writeMessage(null, Collections.<Handle>singletonList(handle),
-                    MessagePipeHandle.WriteFlags.NONE);
-            ResultAnd<MessagePipeHandle.ReadMessageResult> readMessageResult =
-                    handles.second.readMessage(null, 1, MessagePipeHandle.ReadFlags.NONE);
-            assertEquals(1, readMessageResult.getValue().getHandlesCount());
-            assertFalse(readMessageResult.getValue().getHandles().get(0).isValid());
-        } catch (MojoException e) {
-            assertEquals(MojoResult.INVALID_ARGUMENT, e.getMojoResult());
-        }
-    }
-
-    /**
-     * Testing the pass method on message pipes.
-     */
-    @SmallTest
-    public void testMessagePipeHandlePass() {
-        Core core = CoreImpl.getInstance();
-        Pair<MessagePipeHandle, MessagePipeHandle> handles = core.createMessagePipe(null);
-        addHandlePairToClose(handles);
-
-        assertTrue(handles.first.isValid());
-        MessagePipeHandle handleClone = handles.first.pass();
-
-        addHandleToClose(handleClone);
-
-        assertFalse(handles.first.isValid());
-        assertTrue(handleClone.isValid());
-        checkSendingMessage(handleClone, handles.second);
-        checkSendingMessage(handles.second, handleClone);
-    }
-
-    /**
-     * Testing the pass method on data pipes.
-     */
-    @SmallTest
-    public void testDataPipeHandlePass() {
-        Core core = CoreImpl.getInstance();
-        Pair<DataPipe.ProducerHandle, DataPipe.ConsumerHandle> handles = core.createDataPipe(null);
-        addHandlePairToClose(handles);
-
-        DataPipe.ProducerHandle producerClone = handles.first.pass();
-        DataPipe.ConsumerHandle consumerClone = handles.second.pass();
-
-        addHandleToClose(producerClone);
-        addHandleToClose(consumerClone);
-
-        assertFalse(handles.first.isValid());
-        assertFalse(handles.second.isValid());
-        assertTrue(producerClone.isValid());
-        assertTrue(consumerClone.isValid());
-        checkSendingData(producerClone, consumerClone);
-    }
-
-    /**
-     * Testing the pass method on shared buffers.
-     */
-    @SmallTest
-    public void testSharedBufferPass() {
-        Core core = CoreImpl.getInstance();
-        SharedBufferHandle handle = core.createSharedBuffer(null, 8);
-        addHandleToClose(handle);
-        SharedBufferHandle newHandle = handle.duplicate(null);
-        addHandleToClose(newHandle);
-
-        SharedBufferHandle handleClone = handle.pass();
-        SharedBufferHandle newHandleClone = newHandle.pass();
-
-        addHandleToClose(handleClone);
-        addHandleToClose(newHandleClone);
-
-        assertFalse(handle.isValid());
-        assertTrue(handleClone.isValid());
-        checkSharing(handleClone, newHandleClone);
-        checkSharing(newHandleClone, handleClone);
-    }
-
-    /**
-     * esting handle conversion to native and back.
-     */
-    @SmallTest
-    public void testHandleConversion() {
-        Core core = CoreImpl.getInstance();
-        Pair<MessagePipeHandle, MessagePipeHandle> handles = core.createMessagePipe(null);
-        addHandlePairToClose(handles);
-
-        MessagePipeHandle converted =
-                core.acquireNativeHandle(handles.first.releaseNativeHandle()).toMessagePipeHandle();
-        addHandleToClose(converted);
-
-        assertFalse(handles.first.isValid());
-
-        checkSendingMessage(converted, handles.second);
-        checkSendingMessage(handles.second, converted);
-    }
-}
diff --git a/mojo/android/javatests/src/org/chromium/mojo/system/impl/WatcherImplTest.java b/mojo/android/javatests/src/org/chromium/mojo/system/impl/WatcherImplTest.java
deleted file mode 100644
index e14adb1..0000000
--- a/mojo/android/javatests/src/org/chromium/mojo/system/impl/WatcherImplTest.java
+++ /dev/null
@@ -1,255 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.system.impl;
-
-import android.support.test.filters.SmallTest;
-
-import org.chromium.mojo.MojoTestCase;
-import org.chromium.mojo.system.Core;
-import org.chromium.mojo.system.Handle;
-import org.chromium.mojo.system.InvalidHandle;
-import org.chromium.mojo.system.MessagePipeHandle;
-import org.chromium.mojo.system.MojoException;
-import org.chromium.mojo.system.MojoResult;
-import org.chromium.mojo.system.Pair;
-import org.chromium.mojo.system.Watcher;
-import org.chromium.mojo.system.Watcher.Callback;
-
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Testing the Watcher.
- */
-public class WatcherImplTest extends MojoTestCase {
-    private List<Handle> mHandlesToClose = new ArrayList<Handle>();
-    private Watcher mWatcher;
-    private Core mCore;
-
-    /**
-     * @see MojoTestCase#setUp()
-     */
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        mWatcher = new WatcherImpl();
-        mCore = CoreImpl.getInstance();
-    }
-
-    /**
-     * @see MojoTestCase#tearDown()
-     */
-    @Override
-    protected void tearDown() throws Exception {
-        mWatcher.destroy();
-        MojoException toThrow = null;
-        for (Handle handle : mHandlesToClose) {
-            try {
-                handle.close();
-            } catch (MojoException e) {
-                if (toThrow == null) {
-                    toThrow = e;
-                }
-            }
-        }
-        if (toThrow != null) {
-            throw toThrow;
-        }
-        super.tearDown();
-    }
-
-    private void addHandlePairToClose(Pair<? extends Handle, ? extends Handle> handles) {
-        mHandlesToClose.add(handles.first);
-        mHandlesToClose.add(handles.second);
-    }
-
-    private static class WatcherResult implements Callback {
-        private int mResult = Integer.MIN_VALUE;
-        private MessagePipeHandle mReadPipe;
-
-        /**
-         * @param readPipe A MessagePipeHandle to read from when onResult triggers success.
-         */
-        public WatcherResult(MessagePipeHandle readPipe) {
-            mReadPipe = readPipe;
-        }
-        public WatcherResult() {
-            this(null);
-        }
-
-        /**
-         * @see Callback#onResult(int)
-         */
-        @Override
-        public void onResult(int result) {
-            this.mResult = result;
-
-            if (result == MojoResult.OK && mReadPipe != null) {
-                mReadPipe.readMessage(
-                        null, 0, MessagePipeHandle.ReadFlags.none().setMayDiscard(true));
-            }
-        }
-
-        /**
-         * @return the result
-         */
-        public int getResult() {
-            return mResult;
-        }
-    }
-
-    /**
-     * Testing {@link Watcher} implementation.
-     */
-    @SmallTest
-    public void testCorrectResult() {
-        // Checking a correct result.
-        Pair<MessagePipeHandle, MessagePipeHandle> handles = mCore.createMessagePipe(null);
-        addHandlePairToClose(handles);
-        final WatcherResult watcherResult = new WatcherResult(handles.first);
-        assertEquals(Integer.MIN_VALUE, watcherResult.getResult());
-
-        mWatcher.start(handles.first, Core.HandleSignals.READABLE, watcherResult);
-        assertEquals(Integer.MIN_VALUE, watcherResult.getResult());
-
-        handles.second.writeMessage(
-                ByteBuffer.allocateDirect(1), null, MessagePipeHandle.WriteFlags.NONE);
-        runLoopUntilIdle();
-        assertEquals(MojoResult.OK, watcherResult.getResult());
-    }
-
-    /**
-     * Testing {@link Watcher} implementation.
-     */
-    @SmallTest
-    public void testClosingPeerHandle() {
-        // Closing the peer handle.
-        Pair<MessagePipeHandle, MessagePipeHandle> handles = mCore.createMessagePipe(null);
-        addHandlePairToClose(handles);
-
-        final WatcherResult watcherResult = new WatcherResult();
-        assertEquals(Integer.MIN_VALUE, watcherResult.getResult());
-
-        mWatcher.start(handles.first, Core.HandleSignals.READABLE, watcherResult);
-        assertEquals(Integer.MIN_VALUE, watcherResult.getResult());
-
-        runLoopUntilIdle();
-        assertEquals(Integer.MIN_VALUE, watcherResult.getResult());
-
-        handles.second.close();
-        runLoopUntilIdle();
-        assertEquals(MojoResult.FAILED_PRECONDITION, watcherResult.getResult());
-    }
-
-    /**
-     * Testing {@link Watcher} implementation.
-     */
-    @SmallTest
-    public void testClosingWatchedHandle() {
-        // Closing the peer handle.
-        Pair<MessagePipeHandle, MessagePipeHandle> handles = mCore.createMessagePipe(null);
-        addHandlePairToClose(handles);
-
-        final WatcherResult watcherResult = new WatcherResult();
-        assertEquals(Integer.MIN_VALUE, watcherResult.getResult());
-
-        mWatcher.start(handles.first, Core.HandleSignals.READABLE, watcherResult);
-        assertEquals(Integer.MIN_VALUE, watcherResult.getResult());
-
-        runLoopUntilIdle();
-        assertEquals(Integer.MIN_VALUE, watcherResult.getResult());
-
-        handles.first.close();
-        runLoopUntilIdle();
-        assertEquals(MojoResult.CANCELLED, watcherResult.getResult());
-    }
-
-    /**
-     * Testing {@link Watcher} implementation.
-     */
-    @SmallTest
-    public void testInvalidHandle() {
-        // Closing the peer handle.
-        Pair<MessagePipeHandle, MessagePipeHandle> handles = mCore.createMessagePipe(null);
-        addHandlePairToClose(handles);
-
-        final WatcherResult watcherResult = new WatcherResult();
-        assertEquals(Integer.MIN_VALUE, watcherResult.getResult());
-
-        handles.first.close();
-        assertEquals(MojoResult.INVALID_ARGUMENT,
-                mWatcher.start(handles.first, Core.HandleSignals.READABLE, watcherResult));
-        assertEquals(Integer.MIN_VALUE, watcherResult.getResult());
-
-        runLoopUntilIdle();
-        assertEquals(Integer.MIN_VALUE, watcherResult.getResult());
-    }
-
-    /**
-     * Testing {@link Watcher} implementation.
-     */
-    @SmallTest
-    public void testDefaultInvalidHandle() {
-        final WatcherResult watcherResult = new WatcherResult();
-        assertEquals(Integer.MIN_VALUE, watcherResult.getResult());
-
-        assertEquals(MojoResult.INVALID_ARGUMENT,
-                mWatcher.start(InvalidHandle.INSTANCE, Core.HandleSignals.READABLE, watcherResult));
-        assertEquals(Integer.MIN_VALUE, watcherResult.getResult());
-
-        runLoopUntilIdle();
-        assertEquals(Integer.MIN_VALUE, watcherResult.getResult());
-    }
-
-    /**
-     * Testing {@link Watcher} implementation.
-     */
-    @SmallTest
-    public void testCancel() {
-        // Closing the peer handle.
-        Pair<MessagePipeHandle, MessagePipeHandle> handles = mCore.createMessagePipe(null);
-        addHandlePairToClose(handles);
-
-        final WatcherResult watcherResult = new WatcherResult();
-        assertEquals(Integer.MIN_VALUE, watcherResult.getResult());
-
-        mWatcher.start(handles.first, Core.HandleSignals.READABLE, watcherResult);
-        assertEquals(Integer.MIN_VALUE, watcherResult.getResult());
-
-        runLoopUntilIdle();
-        assertEquals(Integer.MIN_VALUE, watcherResult.getResult());
-
-        mWatcher.cancel();
-        runLoopUntilIdle();
-        assertEquals(Integer.MIN_VALUE, watcherResult.getResult());
-
-        handles.second.writeMessage(
-                ByteBuffer.allocateDirect(1), null, MessagePipeHandle.WriteFlags.NONE);
-        runLoopUntilIdle();
-        assertEquals(Integer.MIN_VALUE, watcherResult.getResult());
-    }
-
-    /**
-     * Testing {@link Watcher} implementation.
-     */
-    @SmallTest
-    public void testImmediateCancelOnInvalidHandle() {
-        // Closing the peer handle.
-        Pair<MessagePipeHandle, MessagePipeHandle> handles = mCore.createMessagePipe(null);
-        addHandlePairToClose(handles);
-
-        final WatcherResult watcherResult = new WatcherResult();
-        handles.first.close();
-        assertEquals(Integer.MIN_VALUE, watcherResult.getResult());
-
-        mWatcher.start(handles.first, Core.HandleSignals.READABLE, watcherResult);
-        assertEquals(Integer.MIN_VALUE, watcherResult.getResult());
-        mWatcher.cancel();
-
-        runLoopUntilIdle();
-        assertEquals(Integer.MIN_VALUE, watcherResult.getResult());
-    }
-}
diff --git a/mojo/android/javatests/validation_test_util.cc b/mojo/android/javatests/validation_test_util.cc
deleted file mode 100644
index 75f79b3..0000000
--- a/mojo/android/javatests/validation_test_util.cc
+++ /dev/null
@@ -1,54 +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 "mojo/android/javatests/validation_test_util.h"
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include "base/android/jni_android.h"
-#include "base/android/jni_string.h"
-#include "base/android/scoped_java_ref.h"
-#include "base/test/test_support_android.h"
-#include "jni/ValidationTestUtil_jni.h"
-#include "mojo/public/cpp/bindings/tests/validation_test_input_parser.h"
-
-using base::android::JavaParamRef;
-using base::android::ScopedJavaLocalRef;
-
-namespace mojo {
-namespace android {
-
-bool RegisterValidationTestUtil(JNIEnv* env) {
-  return RegisterNativesImpl(env);
-}
-
-ScopedJavaLocalRef<jobject> ParseData(
-    JNIEnv* env,
-    const JavaParamRef<jclass>& jcaller,
-    const JavaParamRef<jstring>& data_as_string) {
-  std::string input =
-      base::android::ConvertJavaStringToUTF8(env, data_as_string);
-  std::vector<uint8_t> data;
-  size_t num_handles;
-  std::string error_message;
-  if (!test::ParseValidationTestInput(
-          input, &data, &num_handles, &error_message)) {
-    ScopedJavaLocalRef<jstring> j_error_message =
-        base::android::ConvertUTF8ToJavaString(env, error_message);
-    return Java_ValidationTestUtil_buildData(env, nullptr, 0, j_error_message);
-  }
-  void* data_ptr = &data[0];
-  if (!data_ptr) {
-    DCHECK(!data.size());
-    data_ptr = &data;
-  }
-  jobject byte_buffer =
-      env->NewDirectByteBuffer(data_ptr, data.size());
-  return Java_ValidationTestUtil_buildData(env, byte_buffer, num_handles,
-                                           nullptr);
-}
-
-}  // namespace android
-}  // namespace mojo
diff --git a/mojo/android/javatests/validation_test_util.h b/mojo/android/javatests/validation_test_util.h
deleted file mode 100644
index f58dc07..0000000
--- a/mojo/android/javatests/validation_test_util.h
+++ /dev/null
@@ -1,20 +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 MOJO_ANDROID_JAVATESTS_VALIDATION_TEST_UTIL_H_
-#define MOJO_ANDROID_JAVATESTS_VALIDATION_TEST_UTIL_H_
-
-#include <jni.h>
-
-#include "base/android/jni_android.h"
-
-namespace mojo {
-namespace android {
-
-JNI_EXPORT bool RegisterValidationTestUtil(JNIEnv* env);
-
-}  // namespace android
-}  // namespace mojo
-
-#endif  // MOJO_SYSTEM_ANDROID_JAVATESTS_VALIDATION_TEST_UTIL_H_
diff --git a/mojo/android/system/base_run_loop.cc b/mojo/android/system/base_run_loop.cc
deleted file mode 100644
index 7993ba8..0000000
--- a/mojo/android/system/base_run_loop.cc
+++ /dev/null
@@ -1,82 +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 "mojo/android/system/base_run_loop.h"
-
-#include <jni.h>
-
-// Removed unused headers. TODO(hidehiko): Upstream.
-// #include "base/android/base_jni_registrar.h"
-#include "base/android/jni_android.h"
-// #include "base/android/jni_registrar.h"
-#include "base/bind.h"
-#include "base/logging.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "base/single_thread_task_runner.h"
-#include "jni/BaseRunLoop_jni.h"
-
-using base::android::JavaParamRef;
-
-namespace mojo {
-namespace android {
-
-static jlong CreateBaseRunLoop(JNIEnv* env,
-                               const JavaParamRef<jobject>& jcaller) {
-  base::MessageLoop* message_loop = new base::MessageLoop;
-  return reinterpret_cast<uintptr_t>(message_loop);
-}
-
-static void Run(JNIEnv* env,
-                const JavaParamRef<jobject>& jcaller) {
-  base::RunLoop().Run();
-}
-
-static void RunUntilIdle(JNIEnv* env,
-                         const JavaParamRef<jobject>& jcaller) {
-  base::RunLoop().RunUntilIdle();
-}
-
-static void Quit(JNIEnv* env,
-                 const JavaParamRef<jobject>& jcaller,
-                 jlong runLoopID) {
-  reinterpret_cast<base::MessageLoop*>(runLoopID)->QuitWhenIdle();
-}
-
-static void RunJavaRunnable(
-    const base::android::ScopedJavaGlobalRef<jobject>& runnable_ref) {
-  Java_BaseRunLoop_runRunnable(base::android::AttachCurrentThread(),
-                               runnable_ref);
-}
-
-static void PostDelayedTask(JNIEnv* env,
-                            const JavaParamRef<jobject>& jcaller,
-                            jlong runLoopID,
-                            const JavaParamRef<jobject>& runnable,
-                            jlong delay) {
-  base::android::ScopedJavaGlobalRef<jobject> runnable_ref;
-  // ScopedJavaGlobalRef do not hold onto the env reference, so it is safe to
-  // use it across threads. |RunJavaRunnable| will acquire a new JNIEnv before
-  // running the Runnable.
-  runnable_ref.Reset(env, runnable);
-  reinterpret_cast<base::MessageLoop*>(runLoopID)
-      ->task_runner()
-      ->PostDelayedTask(FROM_HERE, base::Bind(&RunJavaRunnable, runnable_ref),
-                        base::TimeDelta::FromMicroseconds(delay));
-}
-
-static void DeleteMessageLoop(JNIEnv* env,
-                              const JavaParamRef<jobject>& jcaller,
-                              jlong runLoopID) {
-  base::MessageLoop* message_loop =
-      reinterpret_cast<base::MessageLoop*>(runLoopID);
-  delete message_loop;
-}
-
-bool RegisterBaseRunLoop(JNIEnv* env) {
-  return RegisterNativesImpl(env);
-}
-
-}  // namespace android
-}  // namespace mojo
diff --git a/mojo/android/system/base_run_loop.h b/mojo/android/system/base_run_loop.h
deleted file mode 100644
index f225c65..0000000
--- a/mojo/android/system/base_run_loop.h
+++ /dev/null
@@ -1,20 +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 MOJO_ANDROID_SYSTEM_BASE_RUN_LOOP_H_
-#define MOJO_ANDROID_SYSTEM_BASE_RUN_LOOP_H_
-
-#include <jni.h>
-
-#include "base/android/jni_android.h"
-
-namespace mojo {
-namespace android {
-
-JNI_EXPORT bool RegisterBaseRunLoop(JNIEnv* env);
-
-}  // namespace android
-}  // namespace mojo
-
-#endif  // MOJO_ANDROID_SYSTEM_BASE_RUN_LOOP_H_
diff --git a/mojo/android/system/core_impl.cc b/mojo/android/system/core_impl.cc
deleted file mode 100644
index 7d5a402..0000000
--- a/mojo/android/system/core_impl.cc
+++ /dev/null
@@ -1,310 +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 "mojo/android/system/core_impl.h"
-
-#include <stddef.h>
-#include <stdint.h>
-
-// Removed unused headers. TODO(hidehiko): Upstream.
-// #include "base/android/base_jni_registrar.h"
-#include "base/android/jni_android.h"
-// #include "base/android/jni_registrar.h"
-// #include "base/android/library_loader/library_loader_hooks.h"
-#include "base/android/scoped_java_ref.h"
-#include "jni/CoreImpl_jni.h"
-#include "mojo/public/c/system/core.h"
-
-namespace mojo {
-namespace android {
-
-using base::android::JavaParamRef;
-using base::android::ScopedJavaLocalRef;
-
-static jlong GetTimeTicksNow(JNIEnv* env,
-                             const JavaParamRef<jobject>& jcaller) {
-  return MojoGetTimeTicksNow();
-}
-
-static ScopedJavaLocalRef<jobject> CreateMessagePipe(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& jcaller,
-    const JavaParamRef<jobject>& options_buffer) {
-  const MojoCreateMessagePipeOptions* options = NULL;
-  if (options_buffer) {
-    const void* buffer_start = env->GetDirectBufferAddress(options_buffer);
-    DCHECK(buffer_start);
-    DCHECK_EQ(reinterpret_cast<const uintptr_t>(buffer_start) % 8, 0u);
-    const size_t buffer_size = env->GetDirectBufferCapacity(options_buffer);
-    DCHECK_EQ(buffer_size, sizeof(MojoCreateMessagePipeOptions));
-    options = static_cast<const MojoCreateMessagePipeOptions*>(buffer_start);
-    DCHECK_EQ(options->struct_size, buffer_size);
-  }
-  MojoHandle handle1;
-  MojoHandle handle2;
-  MojoResult result = MojoCreateMessagePipe(options, &handle1, &handle2);
-  return Java_CoreImpl_newNativeCreationResult(env, result, handle1, handle2);
-}
-
-static ScopedJavaLocalRef<jobject> CreateDataPipe(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& jcaller,
-    const JavaParamRef<jobject>& options_buffer) {
-  const MojoCreateDataPipeOptions* options = NULL;
-  if (options_buffer) {
-    const void* buffer_start = env->GetDirectBufferAddress(options_buffer);
-    DCHECK(buffer_start);
-    DCHECK_EQ(reinterpret_cast<const uintptr_t>(buffer_start) % 8, 0u);
-    const size_t buffer_size = env->GetDirectBufferCapacity(options_buffer);
-    DCHECK_EQ(buffer_size, sizeof(MojoCreateDataPipeOptions));
-    options = static_cast<const MojoCreateDataPipeOptions*>(buffer_start);
-    DCHECK_EQ(options->struct_size, buffer_size);
-  }
-  MojoHandle handle1;
-  MojoHandle handle2;
-  MojoResult result = MojoCreateDataPipe(options, &handle1, &handle2);
-  return Java_CoreImpl_newNativeCreationResult(env, result, handle1, handle2);
-}
-
-static ScopedJavaLocalRef<jobject> CreateSharedBuffer(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& jcaller,
-    const JavaParamRef<jobject>& options_buffer,
-    jlong num_bytes) {
-  const MojoCreateSharedBufferOptions* options = 0;
-  if (options_buffer) {
-    const void* buffer_start = env->GetDirectBufferAddress(options_buffer);
-    DCHECK(buffer_start);
-    DCHECK_EQ(reinterpret_cast<const uintptr_t>(buffer_start) % 8, 0u);
-    const size_t buffer_size = env->GetDirectBufferCapacity(options_buffer);
-    DCHECK_EQ(buffer_size, sizeof(MojoCreateSharedBufferOptions));
-    options = static_cast<const MojoCreateSharedBufferOptions*>(buffer_start);
-    DCHECK_EQ(options->struct_size, buffer_size);
-  }
-  MojoHandle handle;
-  MojoResult result = MojoCreateSharedBuffer(options, num_bytes, &handle);
-  return Java_CoreImpl_newResultAndInteger(env, result, handle);
-}
-
-static jint Close(JNIEnv* env,
-                  const JavaParamRef<jobject>& jcaller,
-                  jint mojo_handle) {
-  return MojoClose(mojo_handle);
-}
-
-static jint QueryHandleSignalsState(JNIEnv* env,
-                                    const JavaParamRef<jobject>& jcaller,
-                                    jint mojo_handle,
-                                    const JavaParamRef<jobject>& buffer) {
-  MojoHandleSignalsState* signals_state =
-      static_cast<MojoHandleSignalsState*>(env->GetDirectBufferAddress(buffer));
-  DCHECK(signals_state);
-  DCHECK_EQ(sizeof(MojoHandleSignalsState),
-            static_cast<size_t>(env->GetDirectBufferCapacity(buffer)));
-  return MojoQueryHandleSignalsState(mojo_handle, signals_state);
-}
-
-static jint WriteMessage(JNIEnv* env,
-                         const JavaParamRef<jobject>& jcaller,
-                         jint mojo_handle,
-                         const JavaParamRef<jobject>& bytes,
-                         jint num_bytes,
-                         const JavaParamRef<jobject>& handles_buffer,
-                         jint flags) {
-  const void* buffer_start = 0;
-  uint32_t buffer_size = 0;
-  if (bytes) {
-    buffer_start = env->GetDirectBufferAddress(bytes);
-    DCHECK(buffer_start);
-    DCHECK(env->GetDirectBufferCapacity(bytes) >= num_bytes);
-    buffer_size = num_bytes;
-  }
-  const MojoHandle* handles = 0;
-  uint32_t num_handles = 0;
-  if (handles_buffer) {
-    handles =
-        static_cast<MojoHandle*>(env->GetDirectBufferAddress(handles_buffer));
-    num_handles = env->GetDirectBufferCapacity(handles_buffer) / 4;
-  }
-  // Java code will handle invalidating handles if the write succeeded.
-  return MojoWriteMessage(
-      mojo_handle, buffer_start, buffer_size, handles, num_handles, flags);
-}
-
-static ScopedJavaLocalRef<jobject> ReadMessage(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& jcaller,
-    jint mojo_handle,
-    const JavaParamRef<jobject>& bytes,
-    const JavaParamRef<jobject>& handles_buffer,
-    jint flags) {
-  void* buffer_start = 0;
-  uint32_t buffer_size = 0;
-  if (bytes) {
-    buffer_start = env->GetDirectBufferAddress(bytes);
-    DCHECK(buffer_start);
-    buffer_size = env->GetDirectBufferCapacity(bytes);
-  }
-  MojoHandle* handles = 0;
-  uint32_t num_handles = 0;
-  if (handles_buffer) {
-    handles =
-        static_cast<MojoHandle*>(env->GetDirectBufferAddress(handles_buffer));
-    num_handles = env->GetDirectBufferCapacity(handles_buffer) / 4;
-  }
-  MojoResult result = MojoReadMessage(
-      mojo_handle, buffer_start, &buffer_size, handles, &num_handles, flags);
-  // Jave code will handle taking ownership of any received handle.
-  return Java_CoreImpl_newReadMessageResult(env, result, buffer_size,
-                                            num_handles);
-}
-
-static ScopedJavaLocalRef<jobject> ReadData(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& jcaller,
-    jint mojo_handle,
-    const JavaParamRef<jobject>& elements,
-    jint elements_capacity,
-    jint flags) {
-  void* buffer_start = 0;
-  uint32_t buffer_size = elements_capacity;
-  if (elements) {
-    buffer_start = env->GetDirectBufferAddress(elements);
-    DCHECK(buffer_start);
-    DCHECK(elements_capacity <= env->GetDirectBufferCapacity(elements));
-  }
-  MojoResult result =
-      MojoReadData(mojo_handle, buffer_start, &buffer_size, flags);
-  return Java_CoreImpl_newResultAndInteger(
-      env, result, (result == MOJO_RESULT_OK) ? buffer_size : 0);
-}
-
-static ScopedJavaLocalRef<jobject> BeginReadData(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& jcaller,
-    jint mojo_handle,
-    jint num_bytes,
-    jint flags) {
-  void const* buffer = 0;
-  uint32_t buffer_size = num_bytes;
-  MojoResult result =
-      MojoBeginReadData(mojo_handle, &buffer, &buffer_size, flags);
-  jobject byte_buffer = 0;
-  if (result == MOJO_RESULT_OK) {
-    byte_buffer =
-        env->NewDirectByteBuffer(const_cast<void*>(buffer), buffer_size);
-  }
-  return Java_CoreImpl_newResultAndBuffer(env, result, byte_buffer);
-}
-
-static jint EndReadData(JNIEnv* env,
-                        const JavaParamRef<jobject>& jcaller,
-                        jint mojo_handle,
-                        jint num_bytes_read) {
-  return MojoEndReadData(mojo_handle, num_bytes_read);
-}
-
-static ScopedJavaLocalRef<jobject> WriteData(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& jcaller,
-    jint mojo_handle,
-    const JavaParamRef<jobject>& elements,
-    jint limit,
-    jint flags) {
-  void* buffer_start = env->GetDirectBufferAddress(elements);
-  DCHECK(buffer_start);
-  DCHECK(limit <= env->GetDirectBufferCapacity(elements));
-  uint32_t buffer_size = limit;
-  MojoResult result =
-      MojoWriteData(mojo_handle, buffer_start, &buffer_size, flags);
-  return Java_CoreImpl_newResultAndInteger(
-      env, result, (result == MOJO_RESULT_OK) ? buffer_size : 0);
-}
-
-static ScopedJavaLocalRef<jobject> BeginWriteData(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& jcaller,
-    jint mojo_handle,
-    jint num_bytes,
-    jint flags) {
-  void* buffer = 0;
-  uint32_t buffer_size = num_bytes;
-  MojoResult result =
-      MojoBeginWriteData(mojo_handle, &buffer, &buffer_size, flags);
-  jobject byte_buffer = 0;
-  if (result == MOJO_RESULT_OK) {
-    byte_buffer = env->NewDirectByteBuffer(buffer, buffer_size);
-  }
-  return Java_CoreImpl_newResultAndBuffer(env, result, byte_buffer);
-}
-
-static jint EndWriteData(JNIEnv* env,
-                         const JavaParamRef<jobject>& jcaller,
-                         jint mojo_handle,
-                         jint num_bytes_written) {
-  return MojoEndWriteData(mojo_handle, num_bytes_written);
-}
-
-static ScopedJavaLocalRef<jobject> Duplicate(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& jcaller,
-    jint mojo_handle,
-    const JavaParamRef<jobject>& options_buffer) {
-  const MojoDuplicateBufferHandleOptions* options = 0;
-  if (options_buffer) {
-    const void* buffer_start = env->GetDirectBufferAddress(options_buffer);
-    DCHECK(buffer_start);
-    const size_t buffer_size = env->GetDirectBufferCapacity(options_buffer);
-    DCHECK_EQ(buffer_size, sizeof(MojoDuplicateBufferHandleOptions));
-    options =
-        static_cast<const MojoDuplicateBufferHandleOptions*>(buffer_start);
-    DCHECK_EQ(options->struct_size, buffer_size);
-  }
-  MojoHandle handle;
-  MojoResult result = MojoDuplicateBufferHandle(mojo_handle, options, &handle);
-  return Java_CoreImpl_newResultAndInteger(env, result, handle);
-}
-
-static ScopedJavaLocalRef<jobject> Map(JNIEnv* env,
-                                       const JavaParamRef<jobject>& jcaller,
-                                       jint mojo_handle,
-                                       jlong offset,
-                                       jlong num_bytes,
-                                       jint flags) {
-  void* buffer = 0;
-  MojoResult result =
-      MojoMapBuffer(mojo_handle, offset, num_bytes, &buffer, flags);
-  jobject byte_buffer = 0;
-  if (result == MOJO_RESULT_OK) {
-    byte_buffer = env->NewDirectByteBuffer(buffer, num_bytes);
-  }
-  return Java_CoreImpl_newResultAndBuffer(env, result, byte_buffer);
-}
-
-static int Unmap(JNIEnv* env,
-                 const JavaParamRef<jobject>& jcaller,
-                 const JavaParamRef<jobject>& buffer) {
-  void* buffer_start = env->GetDirectBufferAddress(buffer);
-  DCHECK(buffer_start);
-  return MojoUnmapBuffer(buffer_start);
-}
-
-static jint GetNativeBufferOffset(JNIEnv* env,
-                                  const JavaParamRef<jobject>& jcaller,
-                                  const JavaParamRef<jobject>& buffer,
-                                  jint alignment) {
-  jint offset =
-      reinterpret_cast<uintptr_t>(env->GetDirectBufferAddress(buffer)) %
-      alignment;
-  if (offset == 0)
-    return 0;
-  return alignment - offset;
-}
-
-bool RegisterCoreImpl(JNIEnv* env) {
-  return RegisterNativesImpl(env);
-}
-
-}  // namespace android
-}  // namespace mojo
diff --git a/mojo/android/system/core_impl.h b/mojo/android/system/core_impl.h
deleted file mode 100644
index c624999..0000000
--- a/mojo/android/system/core_impl.h
+++ /dev/null
@@ -1,20 +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 MOJO_ANDROID_SYSTEM_CORE_IMPL_H_
-#define MOJO_ANDROID_SYSTEM_CORE_IMPL_H_
-
-#include <jni.h>
-
-#include "base/android/jni_android.h"
-
-namespace mojo {
-namespace android {
-
-JNI_EXPORT bool RegisterCoreImpl(JNIEnv* env);
-
-}  // namespace android
-}  // namespace mojo
-
-#endif  // MOJO_ANDROID_SYSTEM_CORE_IMPL_H_
diff --git a/mojo/android/system/src/org/chromium/mojo/system/impl/BaseRunLoop.java b/mojo/android/system/src/org/chromium/mojo/system/impl/BaseRunLoop.java
deleted file mode 100644
index 3db6670..0000000
--- a/mojo/android/system/src/org/chromium/mojo/system/impl/BaseRunLoop.java
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.system.impl;
-
-import org.chromium.base.annotations.CalledByNative;
-import org.chromium.base.annotations.JNINamespace;
-import org.chromium.mojo.system.RunLoop;
-
-/**
- * Implementation of {@link RunLoop} suitable for the base:: message loop implementation.
- */
-@JNINamespace("mojo::android")
-class BaseRunLoop implements RunLoop {
-    /**
-     * Pointer to the C run loop.
-     */
-    private long mRunLoopID;
-    private final CoreImpl mCore;
-
-    BaseRunLoop(CoreImpl core) {
-        this.mCore = core;
-        this.mRunLoopID = nativeCreateBaseRunLoop();
-    }
-
-    @Override
-    public void run() {
-        assert mRunLoopID != 0 : "The run loop cannot run once closed";
-        nativeRun();
-    }
-
-    @Override
-    public void runUntilIdle() {
-        assert mRunLoopID != 0 : "The run loop cannot run once closed";
-        nativeRunUntilIdle();
-    }
-
-    @Override
-    public void quit() {
-        assert mRunLoopID != 0 : "The run loop cannot be quitted run once closed";
-        nativeQuit(mRunLoopID);
-    }
-
-    @Override
-    public void postDelayedTask(Runnable runnable, long delay) {
-        assert mRunLoopID != 0 : "The run loop cannot run tasks once closed";
-        nativePostDelayedTask(mRunLoopID, runnable, delay);
-    }
-
-    @Override
-    public void close() {
-        if (mRunLoopID == 0) {
-            return;
-        }
-        // We don't want to de-register a different run loop!
-        assert mCore.getCurrentRunLoop() == this : "Only the current run loop can be closed";
-        mCore.clearCurrentRunLoop();
-        nativeDeleteMessageLoop(mRunLoopID);
-        mRunLoopID = 0;
-    }
-
-    @CalledByNative
-    private static void runRunnable(Runnable runnable) {
-        runnable.run();
-    }
-
-    private native long nativeCreateBaseRunLoop();
-    private native void nativeRun();
-    private native void nativeRunUntilIdle();
-    private native void nativeQuit(long runLoopID);
-    private native void nativePostDelayedTask(long runLoopID, Runnable runnable, long delay);
-    private native void nativeDeleteMessageLoop(long runLoopID);
-}
diff --git a/mojo/android/system/src/org/chromium/mojo/system/impl/CoreImpl.java b/mojo/android/system/src/org/chromium/mojo/system/impl/CoreImpl.java
deleted file mode 100644
index 173f801..0000000
--- a/mojo/android/system/src/org/chromium/mojo/system/impl/CoreImpl.java
+++ /dev/null
@@ -1,522 +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.
-
-package org.chromium.mojo.system.impl;
-
-import org.chromium.base.annotations.CalledByNative;
-import org.chromium.base.annotations.JNINamespace;
-import org.chromium.base.annotations.MainDex;
-import org.chromium.mojo.system.Core;
-import org.chromium.mojo.system.Core.HandleSignalsState;
-import org.chromium.mojo.system.DataPipe;
-import org.chromium.mojo.system.DataPipe.ConsumerHandle;
-import org.chromium.mojo.system.DataPipe.ProducerHandle;
-import org.chromium.mojo.system.Handle;
-import org.chromium.mojo.system.MessagePipeHandle;
-import org.chromium.mojo.system.MojoException;
-import org.chromium.mojo.system.MojoResult;
-import org.chromium.mojo.system.Pair;
-import org.chromium.mojo.system.ResultAnd;
-import org.chromium.mojo.system.RunLoop;
-import org.chromium.mojo.system.SharedBufferHandle;
-import org.chromium.mojo.system.SharedBufferHandle.DuplicateOptions;
-import org.chromium.mojo.system.SharedBufferHandle.MapFlags;
-import org.chromium.mojo.system.UntypedHandle;
-import org.chromium.mojo.system.Watcher;
-
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Implementation of {@link Core}.
- */
-@JNINamespace("mojo::android")
-@MainDex
-public class CoreImpl implements Core {
-    /**
-     * Discard flag for the |MojoReadData| operation.
-     */
-    private static final int MOJO_READ_DATA_FLAG_DISCARD = 1 << 1;
-
-    /**
-     * the size of a handle, in bytes.
-     */
-    private static final int HANDLE_SIZE = 4;
-
-    /**
-     * the size of a flag, in bytes.
-     */
-    private static final int FLAG_SIZE = 4;
-
-    /**
-     * The mojo handle for an invalid handle.
-     */
-    static final int INVALID_HANDLE = 0;
-
-    private static class LazyHolder { private static final Core INSTANCE = new CoreImpl(); }
-
-    /**
-     * The run loop for the current thread.
-     */
-    private final ThreadLocal<BaseRunLoop> mCurrentRunLoop = new ThreadLocal<BaseRunLoop>();
-
-    /**
-     * The offset needed to get an aligned buffer.
-     */
-    private final int mByteBufferOffset;
-
-    /**
-     * @return the instance.
-     */
-    public static Core getInstance() {
-        return LazyHolder.INSTANCE;
-    }
-
-    private CoreImpl() {
-        // Fix for the ART runtime, before:
-        // https://android.googlesource.com/platform/libcore/+/fb6c80875a8a8d0a9628562f89c250b6a962e824%5E!/
-        // This assumes consistent allocation.
-        mByteBufferOffset = nativeGetNativeBufferOffset(ByteBuffer.allocateDirect(8), 8);
-    }
-
-    /**
-     * @see Core#getTimeTicksNow()
-     */
-    @Override
-    public long getTimeTicksNow() {
-        return nativeGetTimeTicksNow();
-    }
-
-    /**
-     * @see Core#createMessagePipe(MessagePipeHandle.CreateOptions)
-     */
-    @Override
-    public Pair<MessagePipeHandle, MessagePipeHandle> createMessagePipe(
-            MessagePipeHandle.CreateOptions options) {
-        ByteBuffer optionsBuffer = null;
-        if (options != null) {
-            optionsBuffer = allocateDirectBuffer(8);
-            optionsBuffer.putInt(0, 8);
-            optionsBuffer.putInt(4, options.getFlags().getFlags());
-        }
-        ResultAnd<IntegerPair> result = nativeCreateMessagePipe(optionsBuffer);
-        if (result.getMojoResult() != MojoResult.OK) {
-            throw new MojoException(result.getMojoResult());
-        }
-        return Pair.<MessagePipeHandle, MessagePipeHandle>create(
-                new MessagePipeHandleImpl(this, result.getValue().first),
-                new MessagePipeHandleImpl(this, result.getValue().second));
-    }
-
-    /**
-     * @see Core#createDataPipe(DataPipe.CreateOptions)
-     */
-    @Override
-    public Pair<ProducerHandle, ConsumerHandle> createDataPipe(DataPipe.CreateOptions options) {
-        ByteBuffer optionsBuffer = null;
-        if (options != null) {
-            optionsBuffer = allocateDirectBuffer(16);
-            optionsBuffer.putInt(0, 16);
-            optionsBuffer.putInt(4, options.getFlags().getFlags());
-            optionsBuffer.putInt(8, options.getElementNumBytes());
-            optionsBuffer.putInt(12, options.getCapacityNumBytes());
-        }
-        ResultAnd<IntegerPair> result = nativeCreateDataPipe(optionsBuffer);
-        if (result.getMojoResult() != MojoResult.OK) {
-            throw new MojoException(result.getMojoResult());
-        }
-        return Pair.<ProducerHandle, ConsumerHandle>create(
-                new DataPipeProducerHandleImpl(this, result.getValue().first),
-                new DataPipeConsumerHandleImpl(this, result.getValue().second));
-    }
-
-    /**
-     * @see Core#createSharedBuffer(SharedBufferHandle.CreateOptions, long)
-     */
-    @Override
-    public SharedBufferHandle createSharedBuffer(
-            SharedBufferHandle.CreateOptions options, long numBytes) {
-        ByteBuffer optionsBuffer = null;
-        if (options != null) {
-            optionsBuffer = allocateDirectBuffer(8);
-            optionsBuffer.putInt(0, 8);
-            optionsBuffer.putInt(4, options.getFlags().getFlags());
-        }
-        ResultAnd<Integer> result = nativeCreateSharedBuffer(optionsBuffer, numBytes);
-        if (result.getMojoResult() != MojoResult.OK) {
-            throw new MojoException(result.getMojoResult());
-        }
-        return new SharedBufferHandleImpl(this, result.getValue());
-    }
-
-    /**
-     * @see org.chromium.mojo.system.Core#acquireNativeHandle(int)
-     */
-    @Override
-    public UntypedHandle acquireNativeHandle(int handle) {
-        return new UntypedHandleImpl(this, handle);
-    }
-
-    /**
-     * @see Core#getWatcher()
-     */
-    @Override
-    public Watcher getWatcher() {
-        return new WatcherImpl();
-    }
-
-    /**
-     * @see Core#createDefaultRunLoop()
-     */
-    @Override
-    public RunLoop createDefaultRunLoop() {
-        if (mCurrentRunLoop.get() != null) {
-            throw new MojoException(MojoResult.FAILED_PRECONDITION);
-        }
-        BaseRunLoop runLoop = new BaseRunLoop(this);
-        mCurrentRunLoop.set(runLoop);
-        return runLoop;
-    }
-
-    /**
-     * @see Core#getCurrentRunLoop()
-     */
-    @Override
-    public RunLoop getCurrentRunLoop() {
-        return mCurrentRunLoop.get();
-    }
-
-    /**
-     * Remove the current run loop.
-     */
-    void clearCurrentRunLoop() {
-        mCurrentRunLoop.remove();
-    }
-
-    int closeWithResult(int mojoHandle) {
-        return nativeClose(mojoHandle);
-    }
-
-    void close(int mojoHandle) {
-        int mojoResult = nativeClose(mojoHandle);
-        if (mojoResult != MojoResult.OK) {
-            throw new MojoException(mojoResult);
-        }
-    }
-
-    HandleSignalsState queryHandleSignalsState(int mojoHandle) {
-        ByteBuffer buffer = allocateDirectBuffer(8);
-        int result = nativeQueryHandleSignalsState(mojoHandle, buffer);
-        if (result != MojoResult.OK) throw new MojoException(result);
-        return new HandleSignalsState(
-                new HandleSignals(buffer.getInt(0)), new HandleSignals(buffer.getInt(4)));
-    }
-
-    /**
-     * @see MessagePipeHandle#writeMessage(ByteBuffer, List, MessagePipeHandle.WriteFlags)
-     */
-    void writeMessage(MessagePipeHandleImpl pipeHandle, ByteBuffer bytes,
-            List<? extends Handle> handles, MessagePipeHandle.WriteFlags flags) {
-        ByteBuffer handlesBuffer = null;
-        if (handles != null && !handles.isEmpty()) {
-            handlesBuffer = allocateDirectBuffer(handles.size() * HANDLE_SIZE);
-            for (Handle handle : handles) {
-                handlesBuffer.putInt(getMojoHandle(handle));
-            }
-            handlesBuffer.position(0);
-        }
-        int mojoResult = nativeWriteMessage(pipeHandle.getMojoHandle(), bytes,
-                bytes == null ? 0 : bytes.limit(), handlesBuffer, flags.getFlags());
-        if (mojoResult != MojoResult.OK) {
-            throw new MojoException(mojoResult);
-        }
-        // Success means the handles have been invalidated.
-        if (handles != null) {
-            for (Handle handle : handles) {
-                if (handle.isValid()) {
-                    ((HandleBase) handle).invalidateHandle();
-                }
-            }
-        }
-    }
-
-    /**
-     * @see MessagePipeHandle#readMessage(ByteBuffer, int, MessagePipeHandle.ReadFlags)
-     */
-    ResultAnd<MessagePipeHandle.ReadMessageResult> readMessage(MessagePipeHandleImpl handle,
-            ByteBuffer bytes, int maxNumberOfHandles, MessagePipeHandle.ReadFlags flags) {
-        ByteBuffer handlesBuffer = null;
-        if (maxNumberOfHandles > 0) {
-            handlesBuffer = allocateDirectBuffer(maxNumberOfHandles * HANDLE_SIZE);
-        }
-        ResultAnd<MessagePipeHandle.ReadMessageResult> result =
-                nativeReadMessage(handle.getMojoHandle(), bytes, handlesBuffer, flags.getFlags());
-        if (result.getMojoResult() != MojoResult.OK
-                && result.getMojoResult() != MojoResult.RESOURCE_EXHAUSTED
-                && result.getMojoResult() != MojoResult.SHOULD_WAIT) {
-            throw new MojoException(result.getMojoResult());
-        }
-
-        if (result.getMojoResult() == MojoResult.OK) {
-            MessagePipeHandle.ReadMessageResult readResult = result.getValue();
-            if (bytes != null) {
-                bytes.position(0);
-                bytes.limit(readResult.getMessageSize());
-            }
-
-            List<UntypedHandle> handles =
-                    new ArrayList<UntypedHandle>(readResult.getHandlesCount());
-            for (int i = 0; i < readResult.getHandlesCount(); ++i) {
-                int mojoHandle = handlesBuffer.getInt(HANDLE_SIZE * i);
-                handles.add(new UntypedHandleImpl(this, mojoHandle));
-            }
-            readResult.setHandles(handles);
-        }
-        return result;
-    }
-
-    /**
-     * @see ConsumerHandle#discardData(int, DataPipe.ReadFlags)
-     */
-    int discardData(DataPipeConsumerHandleImpl handle, int numBytes, DataPipe.ReadFlags flags) {
-        ResultAnd<Integer> result = nativeReadData(handle.getMojoHandle(), null, numBytes,
-                flags.getFlags() | MOJO_READ_DATA_FLAG_DISCARD);
-        if (result.getMojoResult() != MojoResult.OK) {
-            throw new MojoException(result.getMojoResult());
-        }
-        return result.getValue();
-    }
-
-    /**
-     * @see ConsumerHandle#readData(ByteBuffer, DataPipe.ReadFlags)
-     */
-    ResultAnd<Integer> readData(
-            DataPipeConsumerHandleImpl handle, ByteBuffer elements, DataPipe.ReadFlags flags) {
-        ResultAnd<Integer> result = nativeReadData(handle.getMojoHandle(), elements,
-                elements == null ? 0 : elements.capacity(), flags.getFlags());
-        if (result.getMojoResult() != MojoResult.OK
-                && result.getMojoResult() != MojoResult.SHOULD_WAIT) {
-            throw new MojoException(result.getMojoResult());
-        }
-        if (result.getMojoResult() == MojoResult.OK) {
-            if (elements != null) {
-                elements.limit(result.getValue());
-            }
-        }
-        return result;
-    }
-
-    /**
-     * @see ConsumerHandle#beginReadData(int, DataPipe.ReadFlags)
-     */
-    ByteBuffer beginReadData(
-            DataPipeConsumerHandleImpl handle, int numBytes, DataPipe.ReadFlags flags) {
-        ResultAnd<ByteBuffer> result =
-                nativeBeginReadData(handle.getMojoHandle(), numBytes, flags.getFlags());
-        if (result.getMojoResult() != MojoResult.OK) {
-            throw new MojoException(result.getMojoResult());
-        }
-        return result.getValue().asReadOnlyBuffer();
-    }
-
-    /**
-     * @see ConsumerHandle#endReadData(int)
-     */
-    void endReadData(DataPipeConsumerHandleImpl handle, int numBytesRead) {
-        int result = nativeEndReadData(handle.getMojoHandle(), numBytesRead);
-        if (result != MojoResult.OK) {
-            throw new MojoException(result);
-        }
-    }
-
-    /**
-     * @see ProducerHandle#writeData(ByteBuffer, DataPipe.WriteFlags)
-     */
-    ResultAnd<Integer> writeData(
-            DataPipeProducerHandleImpl handle, ByteBuffer elements, DataPipe.WriteFlags flags) {
-        return nativeWriteData(
-                handle.getMojoHandle(), elements, elements.limit(), flags.getFlags());
-    }
-
-    /**
-     * @see ProducerHandle#beginWriteData(int, DataPipe.WriteFlags)
-     */
-    ByteBuffer beginWriteData(
-            DataPipeProducerHandleImpl handle, int numBytes, DataPipe.WriteFlags flags) {
-        ResultAnd<ByteBuffer> result =
-                nativeBeginWriteData(handle.getMojoHandle(), numBytes, flags.getFlags());
-        if (result.getMojoResult() != MojoResult.OK) {
-            throw new MojoException(result.getMojoResult());
-        }
-        return result.getValue();
-    }
-
-    /**
-     * @see ProducerHandle#endWriteData(int)
-     */
-    void endWriteData(DataPipeProducerHandleImpl handle, int numBytesWritten) {
-        int result = nativeEndWriteData(handle.getMojoHandle(), numBytesWritten);
-        if (result != MojoResult.OK) {
-            throw new MojoException(result);
-        }
-    }
-
-    /**
-     * @see SharedBufferHandle#duplicate(DuplicateOptions)
-     */
-    SharedBufferHandle duplicate(SharedBufferHandleImpl handle, DuplicateOptions options) {
-        ByteBuffer optionsBuffer = null;
-        if (options != null) {
-            optionsBuffer = allocateDirectBuffer(8);
-            optionsBuffer.putInt(0, 8);
-            optionsBuffer.putInt(4, options.getFlags().getFlags());
-        }
-        ResultAnd<Integer> result = nativeDuplicate(handle.getMojoHandle(), optionsBuffer);
-        if (result.getMojoResult() != MojoResult.OK) {
-            throw new MojoException(result.getMojoResult());
-        }
-        return new SharedBufferHandleImpl(this, result.getValue());
-    }
-
-    /**
-     * @see SharedBufferHandle#map(long, long, MapFlags)
-     */
-    ByteBuffer map(SharedBufferHandleImpl handle, long offset, long numBytes, MapFlags flags) {
-        ResultAnd<ByteBuffer> result =
-                nativeMap(handle.getMojoHandle(), offset, numBytes, flags.getFlags());
-        if (result.getMojoResult() != MojoResult.OK) {
-            throw new MojoException(result.getMojoResult());
-        }
-        return result.getValue();
-    }
-
-    /**
-     * @see SharedBufferHandle#unmap(ByteBuffer)
-     */
-    void unmap(ByteBuffer buffer) {
-        int result = nativeUnmap(buffer);
-        if (result != MojoResult.OK) {
-            throw new MojoException(result);
-        }
-    }
-
-    /**
-     * @return the mojo handle associated to the given handle, considering invalid handles.
-     */
-    private int getMojoHandle(Handle handle) {
-        if (handle.isValid()) {
-            return ((HandleBase) handle).getMojoHandle();
-        }
-        return 0;
-    }
-
-    private static boolean isUnrecoverableError(int code) {
-        switch (code) {
-            case MojoResult.OK:
-            case MojoResult.DEADLINE_EXCEEDED:
-            case MojoResult.CANCELLED:
-            case MojoResult.FAILED_PRECONDITION:
-                return false;
-            default:
-                return true;
-        }
-    }
-
-    private static int filterMojoResultForWait(int code) {
-        if (isUnrecoverableError(code)) {
-            throw new MojoException(code);
-        }
-        return code;
-    }
-
-    private ByteBuffer allocateDirectBuffer(int capacity) {
-        ByteBuffer buffer = ByteBuffer.allocateDirect(capacity + mByteBufferOffset);
-        if (mByteBufferOffset != 0) {
-            buffer.position(mByteBufferOffset);
-            buffer = buffer.slice();
-        }
-        return buffer.order(ByteOrder.nativeOrder());
-    }
-
-    @CalledByNative
-    private static ResultAnd<ByteBuffer> newResultAndBuffer(int mojoResult, ByteBuffer buffer) {
-        return new ResultAnd<>(mojoResult, buffer);
-    }
-
-    /**
-     * Trivial alias for Pair<Integer, Integer>. This is needed because our jni generator is unable
-     * to handle class that contains space.
-     */
-    private static final class IntegerPair extends Pair<Integer, Integer> {
-        public IntegerPair(Integer first, Integer second) {
-            super(first, second);
-        }
-    }
-
-    @CalledByNative
-    private static ResultAnd<MessagePipeHandle.ReadMessageResult> newReadMessageResult(
-            int mojoResult, int messageSize, int handlesCount) {
-        MessagePipeHandle.ReadMessageResult result = new MessagePipeHandle.ReadMessageResult();
-        result.setMessageSize(messageSize);
-        result.setHandlesCount(handlesCount);
-        return new ResultAnd<>(mojoResult, result);
-    }
-
-    @CalledByNative
-    private static ResultAnd<Integer> newResultAndInteger(int mojoResult, int numBytesRead) {
-        return new ResultAnd<>(mojoResult, numBytesRead);
-    }
-
-    @CalledByNative
-    private static ResultAnd<IntegerPair> newNativeCreationResult(
-            int mojoResult, int mojoHandle1, int mojoHandle2) {
-        return new ResultAnd<>(mojoResult, new IntegerPair(mojoHandle1, mojoHandle2));
-    }
-
-    private native long nativeGetTimeTicksNow();
-
-    private native ResultAnd<IntegerPair> nativeCreateMessagePipe(ByteBuffer optionsBuffer);
-
-    private native ResultAnd<IntegerPair> nativeCreateDataPipe(ByteBuffer optionsBuffer);
-
-    private native ResultAnd<Integer> nativeCreateSharedBuffer(
-            ByteBuffer optionsBuffer, long numBytes);
-
-    private native int nativeClose(int mojoHandle);
-
-    private native int nativeQueryHandleSignalsState(int mojoHandle, ByteBuffer signalsStateBuffer);
-
-    private native int nativeWriteMessage(
-            int mojoHandle, ByteBuffer bytes, int numBytes, ByteBuffer handlesBuffer, int flags);
-
-    private native ResultAnd<MessagePipeHandle.ReadMessageResult> nativeReadMessage(
-            int mojoHandle, ByteBuffer bytes, ByteBuffer handlesBuffer, int flags);
-
-    private native ResultAnd<Integer> nativeReadData(
-            int mojoHandle, ByteBuffer elements, int elementsSize, int flags);
-
-    private native ResultAnd<ByteBuffer> nativeBeginReadData(
-            int mojoHandle, int numBytes, int flags);
-
-    private native int nativeEndReadData(int mojoHandle, int numBytesRead);
-
-    private native ResultAnd<Integer> nativeWriteData(
-            int mojoHandle, ByteBuffer elements, int limit, int flags);
-
-    private native ResultAnd<ByteBuffer> nativeBeginWriteData(
-            int mojoHandle, int numBytes, int flags);
-
-    private native int nativeEndWriteData(int mojoHandle, int numBytesWritten);
-
-    private native ResultAnd<Integer> nativeDuplicate(int mojoHandle, ByteBuffer optionsBuffer);
-
-    private native ResultAnd<ByteBuffer> nativeMap(
-            int mojoHandle, long offset, long numBytes, int flags);
-
-    private native int nativeUnmap(ByteBuffer buffer);
-
-    private native int nativeGetNativeBufferOffset(ByteBuffer buffer, int alignment);
-}
diff --git a/mojo/android/system/src/org/chromium/mojo/system/impl/DataPipeConsumerHandleImpl.java b/mojo/android/system/src/org/chromium/mojo/system/impl/DataPipeConsumerHandleImpl.java
deleted file mode 100644
index 83097d7..0000000
--- a/mojo/android/system/src/org/chromium/mojo/system/impl/DataPipeConsumerHandleImpl.java
+++ /dev/null
@@ -1,72 +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.
-
-package org.chromium.mojo.system.impl;
-
-import org.chromium.mojo.system.DataPipe.ConsumerHandle;
-import org.chromium.mojo.system.DataPipe.ReadFlags;
-import org.chromium.mojo.system.ResultAnd;
-
-import java.nio.ByteBuffer;
-
-/**
- * Implementation of {@link ConsumerHandle}.
- */
-class DataPipeConsumerHandleImpl extends HandleBase implements ConsumerHandle {
-
-    /**
-     * @see HandleBase#HandleBase(CoreImpl, int)
-     */
-    DataPipeConsumerHandleImpl(CoreImpl core, int mojoHandle) {
-        super(core, mojoHandle);
-    }
-
-    /**
-     * @see HandleBase#HandleBase(HandleBase)
-     */
-    DataPipeConsumerHandleImpl(HandleBase other) {
-        super(other);
-    }
-
-    /**
-     * @see org.chromium.mojo.system.Handle#pass()
-     */
-    @Override
-    public ConsumerHandle pass() {
-        return new DataPipeConsumerHandleImpl(this);
-    }
-
-    /**
-     * @see ConsumerHandle#discardData(int, ReadFlags)
-     */
-    @Override
-    public int discardData(int numBytes, ReadFlags flags) {
-        return mCore.discardData(this, numBytes, flags);
-    }
-
-    /**
-     * @see ConsumerHandle#readData(ByteBuffer, ReadFlags)
-     */
-    @Override
-    public ResultAnd<Integer> readData(ByteBuffer elements, ReadFlags flags) {
-        return mCore.readData(this, elements, flags);
-    }
-
-    /**
-     * @see ConsumerHandle#beginReadData(int, ReadFlags)
-     */
-    @Override
-    public ByteBuffer beginReadData(int numBytes, ReadFlags flags) {
-        return mCore.beginReadData(this, numBytes, flags);
-    }
-
-    /**
-     * @see ConsumerHandle#endReadData(int)
-     */
-    @Override
-    public void endReadData(int numBytesRead) {
-        mCore.endReadData(this, numBytesRead);
-    }
-
-}
diff --git a/mojo/android/system/src/org/chromium/mojo/system/impl/DataPipeProducerHandleImpl.java b/mojo/android/system/src/org/chromium/mojo/system/impl/DataPipeProducerHandleImpl.java
deleted file mode 100644
index 901f26c..0000000
--- a/mojo/android/system/src/org/chromium/mojo/system/impl/DataPipeProducerHandleImpl.java
+++ /dev/null
@@ -1,64 +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.
-
-package org.chromium.mojo.system.impl;
-
-import org.chromium.mojo.system.DataPipe.ProducerHandle;
-import org.chromium.mojo.system.DataPipe.WriteFlags;
-import org.chromium.mojo.system.ResultAnd;
-
-import java.nio.ByteBuffer;
-
-/**
- * Implementation of {@link ProducerHandle}.
- */
-class DataPipeProducerHandleImpl extends HandleBase implements ProducerHandle {
-
-    /**
-     * @see HandleBase#HandleBase(CoreImpl, int)
-     */
-    DataPipeProducerHandleImpl(CoreImpl core, int mojoHandle) {
-        super(core, mojoHandle);
-    }
-
-    /**
-     * @see HandleBase#HandleBase(HandleBase)
-     */
-    DataPipeProducerHandleImpl(HandleBase handle) {
-        super(handle);
-    }
-
-    /**
-     * @see org.chromium.mojo.system.DataPipe.ProducerHandle#pass()
-     */
-    @Override
-    public ProducerHandle pass() {
-        return new DataPipeProducerHandleImpl(this);
-    }
-
-    /**
-     * @see ProducerHandle#writeData(ByteBuffer, WriteFlags)
-     */
-    @Override
-    public ResultAnd<Integer> writeData(ByteBuffer elements, WriteFlags flags) {
-        return mCore.writeData(this, elements, flags);
-    }
-
-    /**
-     * @see ProducerHandle#beginWriteData(int, WriteFlags)
-     */
-    @Override
-    public ByteBuffer beginWriteData(int numBytes, WriteFlags flags) {
-        return mCore.beginWriteData(this, numBytes, flags);
-    }
-
-    /**
-     * @see ProducerHandle#endWriteData(int)
-     */
-    @Override
-    public void endWriteData(int numBytesWritten) {
-        mCore.endWriteData(this, numBytesWritten);
-    }
-
-}
diff --git a/mojo/android/system/src/org/chromium/mojo/system/impl/HandleBase.java b/mojo/android/system/src/org/chromium/mojo/system/impl/HandleBase.java
deleted file mode 100644
index 4d149a4..0000000
--- a/mojo/android/system/src/org/chromium/mojo/system/impl/HandleBase.java
+++ /dev/null
@@ -1,140 +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.
-
-package org.chromium.mojo.system.impl;
-
-import android.util.Log;
-
-import org.chromium.mojo.system.Core;
-import org.chromium.mojo.system.Core.HandleSignalsState;
-import org.chromium.mojo.system.Handle;
-import org.chromium.mojo.system.UntypedHandle;
-
-/**
- * Implementation of {@link Handle}.
- */
-abstract class HandleBase implements Handle {
-
-    private static final String TAG = "HandleImpl";
-
-    /**
-     * The pointer to the scoped handle owned by this object.
-     */
-    private int mMojoHandle;
-
-    /**
-     * The core implementation. Will be used to delegate all behavior.
-     */
-    protected CoreImpl mCore;
-
-    /**
-     * Base constructor. Takes ownership of the passed handle.
-     */
-    HandleBase(CoreImpl core, int mojoHandle) {
-        mCore = core;
-        mMojoHandle = mojoHandle;
-    }
-
-    /**
-     * Constructor for transforming {@link HandleBase} into a specific one. It is used to transform
-     * an {@link UntypedHandle} into a typed one, or any handle into an {@link UntypedHandle}.
-     */
-    protected HandleBase(HandleBase other) {
-        mCore = other.mCore;
-        HandleBase otherAsHandleImpl = other;
-        int mojoHandle = otherAsHandleImpl.mMojoHandle;
-        otherAsHandleImpl.mMojoHandle = CoreImpl.INVALID_HANDLE;
-        mMojoHandle = mojoHandle;
-    }
-
-    /**
-     * @see org.chromium.mojo.system.Handle#close()
-     */
-    @Override
-    public void close() {
-        if (mMojoHandle != CoreImpl.INVALID_HANDLE) {
-            // After a close, the handle is invalid whether the close succeed or not.
-            int handle = mMojoHandle;
-            mMojoHandle = CoreImpl.INVALID_HANDLE;
-            mCore.close(handle);
-        }
-    }
-
-    /**
-     * @see org.chromium.mojo.system.Handle#querySignalsState()
-     */
-    @Override
-    public HandleSignalsState querySignalsState() {
-        return mCore.queryHandleSignalsState(mMojoHandle);
-    }
-
-    /**
-     * @see org.chromium.mojo.system.Handle#isValid()
-     */
-    @Override
-    public boolean isValid() {
-        return mMojoHandle != CoreImpl.INVALID_HANDLE;
-    }
-
-    /**
-     * @see org.chromium.mojo.system.Handle#toUntypedHandle()
-     */
-    @Override
-    public UntypedHandle toUntypedHandle() {
-        return new UntypedHandleImpl(this);
-    }
-
-    /**
-     * @see org.chromium.mojo.system.Handle#getCore()
-     */
-    @Override
-    public Core getCore() {
-        return mCore;
-    }
-
-    /**
-     * @see Handle#releaseNativeHandle()
-     */
-    @Override
-    public int releaseNativeHandle() {
-        int result = mMojoHandle;
-        mMojoHandle = CoreImpl.INVALID_HANDLE;
-        return result;
-    }
-
-    /**
-     * Getter for the native scoped handle.
-     *
-     * @return the native scoped handle.
-     */
-    int getMojoHandle() {
-        return mMojoHandle;
-    }
-
-    /**
-     * invalidate the handle. The caller must ensures that the handle does not leak.
-     */
-    void invalidateHandle() {
-        mMojoHandle = CoreImpl.INVALID_HANDLE;
-    }
-
-    /**
-     * Close the handle if it is valid. Necessary because we cannot let handle leak, and we cannot
-     * ensure that every handle will be manually closed.
-     *
-     * @see java.lang.Object#finalize()
-     */
-    @Override
-    protected final void finalize() throws Throwable {
-        if (isValid()) {
-            // This should not happen, as the user of this class should close the handle. Adding a
-            // warning.
-            Log.w(TAG, "Handle was not closed.");
-            // Ignore result at this point.
-            mCore.closeWithResult(mMojoHandle);
-        }
-        super.finalize();
-    }
-
-}
diff --git a/mojo/android/system/src/org/chromium/mojo/system/impl/MessagePipeHandleImpl.java b/mojo/android/system/src/org/chromium/mojo/system/impl/MessagePipeHandleImpl.java
deleted file mode 100644
index b3df0ae..0000000
--- a/mojo/android/system/src/org/chromium/mojo/system/impl/MessagePipeHandleImpl.java
+++ /dev/null
@@ -1,58 +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.
-
-package org.chromium.mojo.system.impl;
-
-import org.chromium.mojo.system.Handle;
-import org.chromium.mojo.system.MessagePipeHandle;
-import org.chromium.mojo.system.ResultAnd;
-
-import java.nio.ByteBuffer;
-import java.util.List;
-
-/**
- * Implementation of {@link MessagePipeHandle}.
- */
-class MessagePipeHandleImpl extends HandleBase implements MessagePipeHandle {
-
-    /**
-     * @see HandleBase#HandleBase(CoreImpl, int)
-     */
-    MessagePipeHandleImpl(CoreImpl core, int mojoHandle) {
-        super(core, mojoHandle);
-    }
-
-    /**
-     * @see HandleBase#HandleBase(HandleBase)
-     */
-    MessagePipeHandleImpl(HandleBase handle) {
-        super(handle);
-    }
-
-    /**
-     * @see org.chromium.mojo.system.MessagePipeHandle#pass()
-     */
-    @Override
-    public MessagePipeHandle pass() {
-        return new MessagePipeHandleImpl(this);
-    }
-
-    /**
-     * @see MessagePipeHandle#writeMessage(ByteBuffer, List, WriteFlags)
-     */
-    @Override
-    public void writeMessage(ByteBuffer bytes, List<? extends Handle> handles, WriteFlags flags) {
-        mCore.writeMessage(this, bytes, handles, flags);
-    }
-
-    /**
-     * @see MessagePipeHandle#readMessage(ByteBuffer, int, ReadFlags)
-     */
-    @Override
-    public ResultAnd<ReadMessageResult> readMessage(
-            ByteBuffer bytes, int maxNumberOfHandles, ReadFlags flags) {
-        return mCore.readMessage(this, bytes, maxNumberOfHandles, flags);
-    }
-
-}
diff --git a/mojo/android/system/src/org/chromium/mojo/system/impl/SharedBufferHandleImpl.java b/mojo/android/system/src/org/chromium/mojo/system/impl/SharedBufferHandleImpl.java
deleted file mode 100644
index 76ef739..0000000
--- a/mojo/android/system/src/org/chromium/mojo/system/impl/SharedBufferHandleImpl.java
+++ /dev/null
@@ -1,62 +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.
-
-package org.chromium.mojo.system.impl;
-
-import org.chromium.mojo.system.SharedBufferHandle;
-
-import java.nio.ByteBuffer;
-
-/**
- * Implementation of {@link SharedBufferHandle}.
- */
-class SharedBufferHandleImpl extends HandleBase implements SharedBufferHandle {
-
-    /**
-     * @see HandleBase#HandleBase(CoreImpl, int)
-     */
-    SharedBufferHandleImpl(CoreImpl core, int mojoHandle) {
-        super(core, mojoHandle);
-    }
-
-    /**
-     * @see HandleBase#HandleBase(HandleBase)
-     */
-    SharedBufferHandleImpl(HandleBase handle) {
-        super(handle);
-    }
-
-    /**
-     * @see org.chromium.mojo.system.SharedBufferHandle#pass()
-     */
-    @Override
-    public SharedBufferHandle pass() {
-        return new SharedBufferHandleImpl(this);
-    }
-
-    /**
-     * @see SharedBufferHandle#duplicate(DuplicateOptions)
-     */
-    @Override
-    public SharedBufferHandle duplicate(DuplicateOptions options) {
-        return mCore.duplicate(this, options);
-    }
-
-    /**
-     * @see SharedBufferHandle#map(long, long, MapFlags)
-     */
-    @Override
-    public ByteBuffer map(long offset, long numBytes, MapFlags flags) {
-        return mCore.map(this, offset, numBytes, flags);
-    }
-
-    /**
-     * @see SharedBufferHandle#unmap(ByteBuffer)
-     */
-    @Override
-    public void unmap(ByteBuffer buffer) {
-        mCore.unmap(buffer);
-    }
-
-}
diff --git a/mojo/android/system/src/org/chromium/mojo/system/impl/UntypedHandleImpl.java b/mojo/android/system/src/org/chromium/mojo/system/impl/UntypedHandleImpl.java
deleted file mode 100644
index 4774ab8..0000000
--- a/mojo/android/system/src/org/chromium/mojo/system/impl/UntypedHandleImpl.java
+++ /dev/null
@@ -1,72 +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.
-
-package org.chromium.mojo.system.impl;
-
-import org.chromium.mojo.system.DataPipe.ConsumerHandle;
-import org.chromium.mojo.system.DataPipe.ProducerHandle;
-import org.chromium.mojo.system.MessagePipeHandle;
-import org.chromium.mojo.system.SharedBufferHandle;
-import org.chromium.mojo.system.UntypedHandle;
-
-/**
- * Implementation of {@link UntypedHandle}.
- */
-class UntypedHandleImpl extends HandleBase implements UntypedHandle {
-
-    /**
-     * @see HandleBase#HandleBase(CoreImpl, int)
-     */
-    UntypedHandleImpl(CoreImpl core, int mojoHandle) {
-        super(core, mojoHandle);
-    }
-
-    /**
-     * @see HandleBase#HandleBase(HandleBase)
-     */
-    UntypedHandleImpl(HandleBase handle) {
-        super(handle);
-    }
-
-    /**
-     * @see org.chromium.mojo.system.UntypedHandle#pass()
-     */
-    @Override
-    public UntypedHandle pass() {
-        return new UntypedHandleImpl(this);
-    }
-
-    /**
-     * @see org.chromium.mojo.system.UntypedHandle#toMessagePipeHandle()
-     */
-    @Override
-    public MessagePipeHandle toMessagePipeHandle() {
-        return new MessagePipeHandleImpl(this);
-    }
-
-    /**
-     * @see org.chromium.mojo.system.UntypedHandle#toDataPipeConsumerHandle()
-     */
-    @Override
-    public ConsumerHandle toDataPipeConsumerHandle() {
-        return new DataPipeConsumerHandleImpl(this);
-    }
-
-    /**
-     * @see org.chromium.mojo.system.UntypedHandle#toDataPipeProducerHandle()
-     */
-    @Override
-    public ProducerHandle toDataPipeProducerHandle() {
-        return new DataPipeProducerHandleImpl(this);
-    }
-
-    /**
-     * @see org.chromium.mojo.system.UntypedHandle#toSharedBufferHandle()
-     */
-    @Override
-    public SharedBufferHandle toSharedBufferHandle() {
-        return new SharedBufferHandleImpl(this);
-    }
-
-}
diff --git a/mojo/android/system/src/org/chromium/mojo/system/impl/WatcherImpl.java b/mojo/android/system/src/org/chromium/mojo/system/impl/WatcherImpl.java
deleted file mode 100644
index 094ad90..0000000
--- a/mojo/android/system/src/org/chromium/mojo/system/impl/WatcherImpl.java
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.system.impl;
-
-import org.chromium.base.annotations.CalledByNative;
-import org.chromium.base.annotations.JNINamespace;
-import org.chromium.mojo.system.Core;
-import org.chromium.mojo.system.Handle;
-import org.chromium.mojo.system.MojoResult;
-import org.chromium.mojo.system.Watcher;
-
-@JNINamespace("mojo::android")
-class WatcherImpl implements Watcher {
-    private long mImplPtr = nativeCreateWatcher();
-    private Callback mCallback;
-
-    @Override
-    public int start(Handle handle, Core.HandleSignals signals, Callback callback) {
-        if (mImplPtr == 0) {
-            return MojoResult.INVALID_ARGUMENT;
-        }
-        if (!(handle instanceof HandleBase)) {
-            return MojoResult.INVALID_ARGUMENT;
-        }
-        int result =
-                nativeStart(mImplPtr, ((HandleBase) handle).getMojoHandle(), signals.getFlags());
-        if (result == MojoResult.OK) mCallback = callback;
-        return result;
-    }
-
-    @Override
-    public void cancel() {
-        if (mImplPtr == 0) {
-            return;
-        }
-        mCallback = null;
-        nativeCancel(mImplPtr);
-    }
-
-    @Override
-    public void destroy() {
-        if (mImplPtr == 0) {
-            return;
-        }
-        nativeDelete(mImplPtr);
-        mImplPtr = 0;
-    }
-
-    @CalledByNative
-    private void onHandleReady(int result) {
-        mCallback.onResult(result);
-    }
-
-    private native long nativeCreateWatcher();
-
-    private native int nativeStart(long implPtr, int mojoHandle, int flags);
-
-    private native void nativeCancel(long implPtr);
-
-    private native void nativeDelete(long implPtr);
-}
diff --git a/mojo/android/system/watcher_impl.cc b/mojo/android/system/watcher_impl.cc
deleted file mode 100644
index 3344447..0000000
--- a/mojo/android/system/watcher_impl.cc
+++ /dev/null
@@ -1,109 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/android/system/watcher_impl.h"
-
-#include <stddef.h>
-#include <stdint.h>
-
-// Removed unused headers. TODO(hidehiko): Upstream.
-// #include "base/android/base_jni_registrar.h"
-#include "base/android/jni_android.h"
-// #include "base/android/jni_registrar.h"
-// #include "base/android/library_loader/library_loader_hooks.h"
-#include "base/android/scoped_java_ref.h"
-#include "base/bind.h"
-#include "jni/WatcherImpl_jni.h"
-#include "mojo/public/cpp/system/handle.h"
-#include "mojo/public/cpp/system/simple_watcher.h"
-
-namespace mojo {
-namespace android {
-
-using base::android::JavaParamRef;
-
-namespace {
-
-class WatcherImpl {
- public:
-  WatcherImpl() : watcher_(FROM_HERE, SimpleWatcher::ArmingPolicy::AUTOMATIC) {}
-
-  ~WatcherImpl() = default;
-
-  jint Start(JNIEnv* env,
-             const JavaParamRef<jobject>& jcaller,
-             jint mojo_handle,
-             jint signals) {
-    java_watcher_.Reset(env, jcaller);
-
-    auto ready_callback =
-        base::Bind(&WatcherImpl::OnHandleReady, base::Unretained(this));
-
-    MojoResult result =
-        watcher_.Watch(mojo::Handle(static_cast<MojoHandle>(mojo_handle)),
-                       static_cast<MojoHandleSignals>(signals), ready_callback);
-    if (result != MOJO_RESULT_OK)
-      java_watcher_.Reset();
-
-    return result;
-  }
-
-  void Cancel() {
-    java_watcher_.Reset();
-    watcher_.Cancel();
-  }
-
- private:
-  void OnHandleReady(MojoResult result) {
-    DCHECK(!java_watcher_.is_null());
-
-    base::android::ScopedJavaGlobalRef<jobject> java_watcher_preserver;
-    if (result == MOJO_RESULT_CANCELLED)
-      java_watcher_preserver = std::move(java_watcher_);
-
-    Java_WatcherImpl_onHandleReady(
-        base::android::AttachCurrentThread(),
-        java_watcher_.is_null() ? java_watcher_preserver : java_watcher_,
-        result);
-  }
-
-  SimpleWatcher watcher_;
-  base::android::ScopedJavaGlobalRef<jobject> java_watcher_;
-
-  DISALLOW_COPY_AND_ASSIGN(WatcherImpl);
-};
-
-}  // namespace
-
-static jlong CreateWatcher(JNIEnv* env, const JavaParamRef<jobject>& jcaller) {
-  return reinterpret_cast<jlong>(new WatcherImpl);
-}
-
-static jint Start(JNIEnv* env,
-                  const JavaParamRef<jobject>& jcaller,
-                  jlong watcher_ptr,
-                  jint mojo_handle,
-                  jint signals) {
-  auto* watcher = reinterpret_cast<WatcherImpl*>(watcher_ptr);
-  return watcher->Start(env, jcaller, mojo_handle, signals);
-}
-
-static void Cancel(JNIEnv* env,
-                   const JavaParamRef<jobject>& jcaller,
-                   jlong watcher_ptr) {
-  reinterpret_cast<WatcherImpl*>(watcher_ptr)->Cancel();
-}
-
-static void Delete(JNIEnv* env,
-                   const JavaParamRef<jobject>& jcaller,
-                   jlong watcher_ptr) {
-  delete reinterpret_cast<WatcherImpl*>(watcher_ptr);
-}
-
-bool RegisterWatcherImpl(JNIEnv* env) {
-  return RegisterNativesImpl(env);
-}
-
-}  // namespace android
-}  // namespace mojo
diff --git a/mojo/android/system/watcher_impl.h b/mojo/android/system/watcher_impl.h
deleted file mode 100644
index 784f007..0000000
--- a/mojo/android/system/watcher_impl.h
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_ANDROID_SYSTEM_WATCHER_IMPL_H_
-#define MOJO_ANDROID_SYSTEM_WATCHER_IMPL_H_
-
-#include <jni.h>
-
-#include "base/android/jni_android.h"
-
-namespace mojo {
-namespace android {
-
-JNI_EXPORT bool RegisterWatcherImpl(JNIEnv* env);
-
-}  // namespace android
-}  // namespace mojo
-
-#endif  // MOJO_ANDROID_SYSTEM_WATCHER_IMPL_H_
diff --git a/mojo/common/BUILD.gn b/mojo/common/BUILD.gn
deleted file mode 100644
index 9e74e58..0000000
--- a/mojo/common/BUILD.gn
+++ /dev/null
@@ -1,93 +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.
-
-import("//mojo/public/tools/bindings/mojom.gni")
-import("//testing/test.gni")
-
-group("common") {
-  public_deps = [
-    ":common_base",
-    ":common_custom_types",
-  ]
-}
-
-mojom("common_custom_types") {
-  sources = [
-    "file.mojom",
-    "file_path.mojom",
-    "string16.mojom",
-    "text_direction.mojom",
-    "time.mojom",
-    "unguessable_token.mojom",
-    "values.mojom",
-    "version.mojom",
-  ]
-}
-
-component("common_base") {
-  output_name = "mojo_common_lib"
-
-  sources = [
-    "data_pipe_drainer.cc",
-    "data_pipe_drainer.h",
-    "data_pipe_utils.cc",
-    "data_pipe_utils.h",
-  ]
-
-  defines = [ "MOJO_COMMON_IMPLEMENTATION" ]
-
-  public_deps = [
-    "//base",
-    "//mojo/public/cpp/bindings",
-    "//mojo/public/cpp/system",
-  ]
-}
-
-mojom("test_common_custom_types") {
-  sources = [
-    "test_common_custom_types.mojom",
-    "traits_test_service.mojom",
-  ]
-  public_deps = [
-    ":common_custom_types",
-  ]
-}
-
-test("mojo_common_unittests") {
-  deps = [
-    ":common",
-    ":common_custom_types",
-    ":struct_traits",
-    ":test_common_custom_types",
-    "//base",
-    "//base:message_loop_tests",
-    "//base/test:test_support",
-    "//mojo/edk/test:run_all_unittests",
-    "//mojo/edk/test:test_support",
-    "//mojo/public/cpp/bindings",
-    "//mojo/public/cpp/test_support:test_utils",
-    "//testing/gtest",
-    "//url",
-  ]
-
-  sources = [
-    "common_custom_types_unittest.cc",
-    "struct_traits_unittest.cc",
-  ]
-}
-
-source_set("struct_traits") {
-  sources = [
-    "common_custom_types_struct_traits.cc",
-    "common_custom_types_struct_traits.h",
-  ]
-  deps = [
-    ":common_custom_types_shared_cpp_sources",
-    "//base:base",
-    "//mojo/public/cpp/system",
-  ]
-  public_deps = [
-    "//base:i18n",
-  ]
-}
diff --git a/mojo/common/DEPS b/mojo/common/DEPS
deleted file mode 100644
index e8ac428..0000000
--- a/mojo/common/DEPS
+++ /dev/null
@@ -1,6 +0,0 @@
-include_rules = [
-  # common must not depend on embedder.
-  "-mojo",
-  "+mojo/common",
-  "+mojo/public",
-]
diff --git a/mojo/common/common_custom_types_struct_traits.cc b/mojo/common/common_custom_types_struct_traits.cc
deleted file mode 100644
index 6289504..0000000
--- a/mojo/common/common_custom_types_struct_traits.cc
+++ /dev/null
@@ -1,108 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/common/common_custom_types_struct_traits.h"
-
-#include "mojo/public/cpp/system/platform_handle.h"
-
-namespace mojo {
-
-// static
-bool StructTraits<common::mojom::String16DataView, base::string16>::Read(
-    common::mojom::String16DataView data,
-    base::string16* out) {
-  ArrayDataView<uint16_t> view;
-  data.GetDataDataView(&view);
-  out->assign(reinterpret_cast<const base::char16*>(view.data()), view.size());
-  return true;
-}
-
-// static
-const std::vector<uint32_t>&
-StructTraits<common::mojom::VersionDataView, base::Version>::components(
-    const base::Version& version) {
-  return version.components();
-}
-
-// static
-bool StructTraits<common::mojom::VersionDataView, base::Version>::Read(
-    common::mojom::VersionDataView data,
-    base::Version* out) {
-  std::vector<uint32_t> components;
-  if (!data.ReadComponents(&components))
-    return false;
-
-  *out = base::Version(base::Version(std::move(components)));
-  return out->IsValid();
-}
-
-// static
-bool StructTraits<
-    common::mojom::UnguessableTokenDataView,
-    base::UnguessableToken>::Read(common::mojom::UnguessableTokenDataView data,
-                                  base::UnguessableToken* out) {
-  uint64_t high = data.high();
-  uint64_t low = data.low();
-
-  // Receiving a zeroed UnguessableToken is a security issue.
-  if (high == 0 && low == 0)
-    return false;
-
-  *out = base::UnguessableToken::Deserialize(high, low);
-  return true;
-}
-
-mojo::ScopedHandle StructTraits<common::mojom::FileDataView, base::File>::fd(
-    base::File& file) {
-  DCHECK(file.IsValid());
-  return mojo::WrapPlatformFile(file.TakePlatformFile());
-}
-
-bool StructTraits<common::mojom::FileDataView, base::File>::Read(
-    common::mojom::FileDataView data,
-    base::File* file) {
-  base::PlatformFile platform_handle = base::kInvalidPlatformFile;
-  if (mojo::UnwrapPlatformFile(data.TakeFd(), &platform_handle) !=
-      MOJO_RESULT_OK) {
-    return false;
-  }
-  *file = base::File(platform_handle);
-  return true;
-}
-
-// static
-common::mojom::TextDirection
-EnumTraits<common::mojom::TextDirection, base::i18n::TextDirection>::ToMojom(
-    base::i18n::TextDirection text_direction) {
-  switch (text_direction) {
-    case base::i18n::UNKNOWN_DIRECTION:
-      return common::mojom::TextDirection::UNKNOWN_DIRECTION;
-    case base::i18n::RIGHT_TO_LEFT:
-      return common::mojom::TextDirection::RIGHT_TO_LEFT;
-    case base::i18n::LEFT_TO_RIGHT:
-      return common::mojom::TextDirection::LEFT_TO_RIGHT;
-  }
-  NOTREACHED();
-  return common::mojom::TextDirection::UNKNOWN_DIRECTION;
-}
-
-// static
-bool EnumTraits<common::mojom::TextDirection, base::i18n::TextDirection>::
-    FromMojom(common::mojom::TextDirection input,
-              base::i18n::TextDirection* out) {
-  switch (input) {
-    case common::mojom::TextDirection::UNKNOWN_DIRECTION:
-      *out = base::i18n::UNKNOWN_DIRECTION;
-      return true;
-    case common::mojom::TextDirection::RIGHT_TO_LEFT:
-      *out = base::i18n::RIGHT_TO_LEFT;
-      return true;
-    case common::mojom::TextDirection::LEFT_TO_RIGHT:
-      *out = base::i18n::LEFT_TO_RIGHT;
-      return true;
-  }
-  return false;
-}
-
-}  // namespace mojo
diff --git a/mojo/common/common_custom_types_struct_traits.h b/mojo/common/common_custom_types_struct_traits.h
deleted file mode 100644
index 85815ff..0000000
--- a/mojo/common/common_custom_types_struct_traits.h
+++ /dev/null
@@ -1,85 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_COMMON_COMMON_CUSTOM_TYPES_STRUCT_TRAITS_H_
-#define MOJO_COMMON_COMMON_CUSTOM_TYPES_STRUCT_TRAITS_H_
-
-#include "base/files/file.h"
-#include "base/i18n/rtl.h"
-#include "base/strings/utf_string_conversions.h"
-#include "base/unguessable_token.h"
-#include "base/version.h"
-#include "mojo/common/file.mojom-shared.h"
-#include "mojo/common/mojo_common_export.h"
-#include "mojo/common/string16.mojom-shared.h"
-#include "mojo/common/text_direction.mojom-shared.h"
-#include "mojo/common/time.mojom-shared.h"
-#include "mojo/common/unguessable_token.mojom-shared.h"
-#include "mojo/common/version.mojom-shared.h"
-
-namespace mojo {
-
-template <>
-struct StructTraits<common::mojom::String16DataView, base::string16> {
-  static ConstCArray<uint16_t> data(const base::string16& str) {
-    return ConstCArray<uint16_t>(str.size(),
-                                 reinterpret_cast<const uint16_t*>(str.data()));
-  }
-
-  static bool Read(common::mojom::String16DataView data, base::string16* out);
-};
-
-template <>
-struct StructTraits<common::mojom::VersionDataView, base::Version> {
-  static bool IsNull(const base::Version& version) {
-    return !version.IsValid();
-  }
-  static void SetToNull(base::Version* out) {
-    *out = base::Version(std::string());
-  }
-  static const std::vector<uint32_t>& components(const base::Version& version);
-  static bool Read(common::mojom::VersionDataView data, base::Version* out);
-};
-
-// If base::UnguessableToken is no longer 128 bits, the logic below and the
-// mojom::UnguessableToken type should be updated.
-static_assert(sizeof(base::UnguessableToken) == 2 * sizeof(uint64_t),
-              "base::UnguessableToken should be of size 2 * sizeof(uint64_t).");
-
-template <>
-struct StructTraits<common::mojom::UnguessableTokenDataView,
-                    base::UnguessableToken> {
-  static uint64_t high(const base::UnguessableToken& token) {
-    return token.GetHighForSerialization();
-  }
-
-  static uint64_t low(const base::UnguessableToken& token) {
-    return token.GetLowForSerialization();
-  }
-
-  static bool Read(common::mojom::UnguessableTokenDataView data,
-                   base::UnguessableToken* out);
-};
-
-template <>
-struct StructTraits<common::mojom::FileDataView, base::File> {
-  static bool IsNull(const base::File& file) { return !file.IsValid(); }
-
-  static void SetToNull(base::File* file) { *file = base::File(); }
-
-  static mojo::ScopedHandle fd(base::File& file);
-  static bool Read(common::mojom::FileDataView data, base::File* file);
-};
-
-template <>
-struct EnumTraits<common::mojom::TextDirection, base::i18n::TextDirection> {
-  static common::mojom::TextDirection ToMojom(
-      base::i18n::TextDirection text_direction);
-  static bool FromMojom(common::mojom::TextDirection input,
-                        base::i18n::TextDirection* out);
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_COMMON_COMMON_CUSTOM_TYPES_STRUCT_TRAITS_H_
diff --git a/mojo/common/common_custom_types_unittest.cc b/mojo/common/common_custom_types_unittest.cc
deleted file mode 100644
index e3571d9..0000000
--- a/mojo/common/common_custom_types_unittest.cc
+++ /dev/null
@@ -1,433 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/files/file_path.h"
-#include "base/files/scoped_temp_dir.h"
-#include "base/memory/ptr_util.h"
-#include "base/message_loop/message_loop.h"
-#include "base/numerics/safe_math.h"
-#include "base/run_loop.h"
-#include "base/strings/utf_string_conversions.h"
-#include "base/values.h"
-#include "mojo/common/test_common_custom_types.mojom.h"
-#include "mojo/public/cpp/bindings/binding.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace common {
-namespace test {
-namespace {
-
-template <typename T>
-struct BounceTestTraits {
-  static void ExpectEquality(const T& a, const T& b) {
-    EXPECT_EQ(a, b);
-  }
-};
-
-template <typename T>
-struct PassTraits {
-  using Type = const T&;
-};
-
-template <>
-struct PassTraits<base::Time> {
-  using Type = base::Time;
-};
-
-template <>
-struct PassTraits<base::TimeDelta> {
-  using Type = base::TimeDelta;
-};
-
-template <>
-struct PassTraits<base::TimeTicks> {
-  using Type = base::TimeTicks;
-};
-
-template <typename T>
-void DoExpectResponse(T* expected_value,
-                      const base::Closure& closure,
-                      typename PassTraits<T>::Type value) {
-  BounceTestTraits<T>::ExpectEquality(*expected_value, value);
-  closure.Run();
-}
-
-template <typename T>
-base::Callback<void(typename PassTraits<T>::Type)> ExpectResponse(
-    T* expected_value,
-    const base::Closure& closure) {
-  return base::Bind(&DoExpectResponse<T>, expected_value, closure);
-}
-
-class TestFilePathImpl : public TestFilePath {
- public:
-  explicit TestFilePathImpl(TestFilePathRequest request)
-      : binding_(this, std::move(request)) {}
-
-  // TestFilePath implementation:
-  void BounceFilePath(const base::FilePath& in,
-                      const BounceFilePathCallback& callback) override {
-    callback.Run(in);
-  }
-
- private:
-  mojo::Binding<TestFilePath> binding_;
-};
-
-class TestUnguessableTokenImpl : public TestUnguessableToken {
- public:
-  explicit TestUnguessableTokenImpl(TestUnguessableTokenRequest request)
-      : binding_(this, std::move(request)) {}
-
-  // TestUnguessableToken implementation:
-  void BounceNonce(const base::UnguessableToken& in,
-                   const BounceNonceCallback& callback) override {
-    callback.Run(in);
-  }
-
- private:
-  mojo::Binding<TestUnguessableToken> binding_;
-};
-
-class TestTimeImpl : public TestTime {
- public:
-  explicit TestTimeImpl(TestTimeRequest request)
-      : binding_(this, std::move(request)) {}
-
-  // TestTime implementation:
-  void BounceTime(base::Time in, const BounceTimeCallback& callback) override {
-    callback.Run(in);
-  }
-
-  void BounceTimeDelta(base::TimeDelta in,
-                       const BounceTimeDeltaCallback& callback) override {
-    callback.Run(in);
-  }
-
-  void BounceTimeTicks(base::TimeTicks in,
-                       const BounceTimeTicksCallback& callback) override {
-    callback.Run(in);
-  }
-
- private:
-  mojo::Binding<TestTime> binding_;
-};
-
-class TestValueImpl : public TestValue {
- public:
-  explicit TestValueImpl(TestValueRequest request)
-      : binding_(this, std::move(request)) {}
-
-  // TestValue implementation:
-  void BounceDictionaryValue(
-      std::unique_ptr<base::DictionaryValue> in,
-      const BounceDictionaryValueCallback& callback) override {
-    callback.Run(std::move(in));
-  }
-
-  void BounceListValue(std::unique_ptr<base::ListValue> in,
-                       const BounceListValueCallback& callback) override {
-    callback.Run(std::move(in));
-  }
-
-  void BounceValue(std::unique_ptr<base::Value> in,
-                   const BounceValueCallback& callback) override {
-    callback.Run(std::move(in));
-  }
-
- private:
-  mojo::Binding<TestValue> binding_;
-};
-
-class TestString16Impl : public TestString16 {
- public:
-  explicit TestString16Impl(TestString16Request request)
-      : binding_(this, std::move(request)) {}
-
-  // TestString16 implementation:
-  void BounceString16(const base::string16& in,
-                      const BounceString16Callback& callback) override {
-    callback.Run(in);
-  }
-
- private:
-  mojo::Binding<TestString16> binding_;
-};
-
-class TestFileImpl : public TestFile {
- public:
-  explicit TestFileImpl(TestFileRequest request)
-      : binding_(this, std::move(request)) {}
-
-  // TestFile implementation:
-  void BounceFile(base::File in, const BounceFileCallback& callback) override {
-    callback.Run(std::move(in));
-  }
-
- private:
-  mojo::Binding<TestFile> binding_;
-};
-
-class TestTextDirectionImpl : public TestTextDirection {
- public:
-  explicit TestTextDirectionImpl(TestTextDirectionRequest request)
-      : binding_(this, std::move(request)) {}
-
-  // TestTextDirection:
-  void BounceTextDirection(
-      base::i18n::TextDirection in,
-      const BounceTextDirectionCallback& callback) override {
-    callback.Run(in);
-  }
-
- private:
-  mojo::Binding<TestTextDirection> binding_;
-};
-
-class CommonCustomTypesTest : public testing::Test {
- protected:
-  CommonCustomTypesTest() {}
-  ~CommonCustomTypesTest() override {}
-
- private:
-  base::MessageLoop message_loop_;
-
-  DISALLOW_COPY_AND_ASSIGN(CommonCustomTypesTest);
-};
-
-}  // namespace
-
-TEST_F(CommonCustomTypesTest, FilePath) {
-  base::RunLoop run_loop;
-
-  TestFilePathPtr ptr;
-  TestFilePathImpl impl(MakeRequest(&ptr));
-
-  base::FilePath dir(FILE_PATH_LITERAL("hello"));
-  base::FilePath file = dir.Append(FILE_PATH_LITERAL("world"));
-
-  ptr->BounceFilePath(file, ExpectResponse(&file, run_loop.QuitClosure()));
-
-  run_loop.Run();
-}
-
-TEST_F(CommonCustomTypesTest, UnguessableToken) {
-  base::RunLoop run_loop;
-
-  TestUnguessableTokenPtr ptr;
-  TestUnguessableTokenImpl impl(MakeRequest(&ptr));
-
-  base::UnguessableToken token = base::UnguessableToken::Create();
-
-  ptr->BounceNonce(token, ExpectResponse(&token, run_loop.QuitClosure()));
-
-  run_loop.Run();
-}
-
-TEST_F(CommonCustomTypesTest, Time) {
-  base::RunLoop run_loop;
-
-  TestTimePtr ptr;
-  TestTimeImpl impl(MakeRequest(&ptr));
-
-  base::Time t = base::Time::Now();
-
-  ptr->BounceTime(t, ExpectResponse(&t, run_loop.QuitClosure()));
-
-  run_loop.Run();
-}
-
-TEST_F(CommonCustomTypesTest, TimeDelta) {
-  base::RunLoop run_loop;
-
-  TestTimePtr ptr;
-  TestTimeImpl impl(MakeRequest(&ptr));
-
-  base::TimeDelta t = base::TimeDelta::FromDays(123);
-
-  ptr->BounceTimeDelta(t, ExpectResponse(&t, run_loop.QuitClosure()));
-
-  run_loop.Run();
-}
-
-TEST_F(CommonCustomTypesTest, TimeTicks) {
-  base::RunLoop run_loop;
-
-  TestTimePtr ptr;
-  TestTimeImpl impl(MakeRequest(&ptr));
-
-  base::TimeTicks t = base::TimeTicks::Now();
-
-  ptr->BounceTimeTicks(t, ExpectResponse(&t, run_loop.QuitClosure()));
-
-  run_loop.Run();
-}
-
-TEST_F(CommonCustomTypesTest, Value) {
-  TestValuePtr ptr;
-  TestValueImpl impl(MakeRequest(&ptr));
-
-  std::unique_ptr<base::Value> output;
-
-  ASSERT_TRUE(ptr->BounceValue(nullptr, &output));
-  EXPECT_FALSE(output);
-
-  std::unique_ptr<base::Value> input = base::Value::CreateNullValue();
-  ASSERT_TRUE(ptr->BounceValue(input->CreateDeepCopy(), &output));
-  EXPECT_TRUE(base::Value::Equals(input.get(), output.get()));
-
-  input = base::MakeUnique<base::Value>(123);
-  ASSERT_TRUE(ptr->BounceValue(input->CreateDeepCopy(), &output));
-  EXPECT_TRUE(base::Value::Equals(input.get(), output.get()));
-
-  input = base::MakeUnique<base::Value>(1.23);
-  ASSERT_TRUE(ptr->BounceValue(input->CreateDeepCopy(), &output));
-  EXPECT_TRUE(base::Value::Equals(input.get(), output.get()));
-
-  input = base::MakeUnique<base::Value>(false);
-  ASSERT_TRUE(ptr->BounceValue(input->CreateDeepCopy(), &output));
-  EXPECT_TRUE(base::Value::Equals(input.get(), output.get()));
-
-  input = base::MakeUnique<base::Value>("test string");
-  ASSERT_TRUE(ptr->BounceValue(input->CreateDeepCopy(), &output));
-  EXPECT_TRUE(base::Value::Equals(input.get(), output.get()));
-
-  input = base::BinaryValue::CreateWithCopiedBuffer("mojo", 4);
-  ASSERT_TRUE(ptr->BounceValue(input->CreateDeepCopy(), &output));
-  EXPECT_TRUE(base::Value::Equals(input.get(), output.get()));
-
-  auto dict = base::MakeUnique<base::DictionaryValue>();
-  dict->SetBoolean("bool", false);
-  dict->SetInteger("int", 2);
-  dict->SetString("string", "some string");
-  dict->SetBoolean("nested.bool", true);
-  dict->SetInteger("nested.int", 9);
-  dict->Set("some_binary",
-            base::BinaryValue::CreateWithCopiedBuffer("mojo", 4));
-  dict->Set("null_value", base::Value::CreateNullValue());
-  dict->SetIntegerWithoutPathExpansion("non_nested.int", 10);
-  {
-    std::unique_ptr<base::ListValue> dict_list(new base::ListValue());
-    dict_list->AppendString("string");
-    dict_list->AppendBoolean(true);
-    dict->Set("list", std::move(dict_list));
-  }
-
-  std::unique_ptr<base::DictionaryValue> dict_output;
-  ASSERT_TRUE(ptr->BounceDictionaryValue(dict->CreateDeepCopy(), &dict_output));
-  EXPECT_TRUE(base::Value::Equals(dict.get(), dict_output.get()));
-
-  input = std::move(dict);
-  ASSERT_TRUE(ptr->BounceValue(input->CreateDeepCopy(), &output));
-  EXPECT_TRUE(base::Value::Equals(input.get(), output.get()));
-
-  auto list = base::MakeUnique<base::ListValue>();
-  list->AppendString("string");
-  list->AppendDouble(42.1);
-  list->AppendBoolean(true);
-  list->Append(base::BinaryValue::CreateWithCopiedBuffer("mojo", 4));
-  list->Append(base::Value::CreateNullValue());
-  {
-    std::unique_ptr<base::DictionaryValue> list_dict(
-        new base::DictionaryValue());
-    list_dict->SetString("string", "str");
-    list->Append(std::move(list_dict));
-  }
-  std::unique_ptr<base::ListValue> list_output;
-  ASSERT_TRUE(ptr->BounceListValue(list->CreateDeepCopy(), &list_output));
-  EXPECT_TRUE(base::Value::Equals(list.get(), list_output.get()));
-
-  input = std::move(list);
-  ASSERT_TRUE(ptr->BounceValue(input->CreateDeepCopy(), &output));
-  ASSERT_TRUE(base::Value::Equals(input.get(), output.get()));
-}
-
-TEST_F(CommonCustomTypesTest, String16) {
-  base::RunLoop run_loop;
-
-  TestString16Ptr ptr;
-  TestString16Impl impl(MakeRequest(&ptr));
-
-  base::string16 str16 = base::ASCIIToUTF16("hello world");
-
-  ptr->BounceString16(str16, ExpectResponse(&str16, run_loop.QuitClosure()));
-
-  run_loop.Run();
-}
-
-TEST_F(CommonCustomTypesTest, EmptyString16) {
-  base::RunLoop run_loop;
-
-  TestString16Ptr ptr;
-  TestString16Impl impl(MakeRequest(&ptr));
-
-  base::string16 str16;
-
-  ptr->BounceString16(str16, ExpectResponse(&str16, run_loop.QuitClosure()));
-
-  run_loop.Run();
-}
-
-TEST_F(CommonCustomTypesTest, File) {
-  base::ScopedTempDir temp_dir;
-  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-
-  TestFilePtr ptr;
-  TestFileImpl impl(MakeRequest(&ptr));
-
-  base::File file(
-      temp_dir.GetPath().AppendASCII("test_file.txt"),
-      base::File::FLAG_CREATE | base::File::FLAG_WRITE | base::File::FLAG_READ);
-  const base::StringPiece test_content =
-      "A test string to be stored in a test file";
-  file.WriteAtCurrentPos(
-      test_content.data(),
-      base::CheckedNumeric<int>(test_content.size()).ValueOrDie());
-
-  base::File file_out;
-  ASSERT_TRUE(ptr->BounceFile(std::move(file), &file_out));
-  std::vector<char> content(test_content.size());
-  ASSERT_TRUE(file_out.IsValid());
-  ASSERT_EQ(static_cast<int>(test_content.size()),
-            file_out.Read(
-                0, content.data(),
-                base::CheckedNumeric<int>(test_content.size()).ValueOrDie()));
-  EXPECT_EQ(test_content,
-            base::StringPiece(content.data(), test_content.size()));
-}
-
-TEST_F(CommonCustomTypesTest, InvalidFile) {
-  TestFilePtr ptr;
-  TestFileImpl impl(MakeRequest(&ptr));
-
-  base::ScopedTempDir temp_dir;
-  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-  // Test that |file_out| is set to an invalid file.
-  base::File file_out(
-      temp_dir.GetPath().AppendASCII("test_file.txt"),
-      base::File::FLAG_CREATE | base::File::FLAG_WRITE | base::File::FLAG_READ);
-
-  ASSERT_TRUE(ptr->BounceFile(base::File(), &file_out));
-  EXPECT_FALSE(file_out.IsValid());
-}
-
-TEST_F(CommonCustomTypesTest, TextDirection) {
-  base::i18n::TextDirection kTestDirections[] = {base::i18n::LEFT_TO_RIGHT,
-                                                 base::i18n::RIGHT_TO_LEFT,
-                                                 base::i18n::UNKNOWN_DIRECTION};
-
-  TestTextDirectionPtr ptr;
-  TestTextDirectionImpl impl(MakeRequest(&ptr));
-
-  for (size_t i = 0; i < arraysize(kTestDirections); i++) {
-    base::i18n::TextDirection direction_out;
-    ASSERT_TRUE(ptr->BounceTextDirection(kTestDirections[i], &direction_out));
-    EXPECT_EQ(kTestDirections[i], direction_out);
-  }
-}
-
-}  // namespace test
-}  // namespace common
-}  // namespace mojo
diff --git a/mojo/common/data_pipe_drainer.cc b/mojo/common/data_pipe_drainer.cc
deleted file mode 100644
index e705c8d..0000000
--- a/mojo/common/data_pipe_drainer.cc
+++ /dev/null
@@ -1,50 +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 "mojo/common/data_pipe_drainer.h"
-
-#include <stdint.h>
-
-#include <utility>
-
-#include "base/bind.h"
-
-namespace mojo {
-namespace common {
-
-DataPipeDrainer::DataPipeDrainer(Client* client,
-                                 mojo::ScopedDataPipeConsumerHandle source)
-    : client_(client),
-      source_(std::move(source)),
-      handle_watcher_(FROM_HERE, SimpleWatcher::ArmingPolicy::AUTOMATIC),
-      weak_factory_(this) {
-  DCHECK(client_);
-  handle_watcher_.Watch(
-      source_.get(), MOJO_HANDLE_SIGNAL_READABLE,
-      base::Bind(&DataPipeDrainer::WaitComplete, weak_factory_.GetWeakPtr()));
-}
-
-DataPipeDrainer::~DataPipeDrainer() {}
-
-void DataPipeDrainer::ReadData() {
-  const void* buffer = nullptr;
-  uint32_t num_bytes = 0;
-  MojoResult rv = BeginReadDataRaw(source_.get(), &buffer, &num_bytes,
-                                   MOJO_READ_DATA_FLAG_NONE);
-  if (rv == MOJO_RESULT_OK) {
-    client_->OnDataAvailable(buffer, num_bytes);
-    EndReadDataRaw(source_.get(), num_bytes);
-  } else if (rv == MOJO_RESULT_FAILED_PRECONDITION) {
-    client_->OnDataComplete();
-  } else if (rv != MOJO_RESULT_SHOULD_WAIT) {
-    DCHECK(false) << "Unhandled MojoResult: " << rv;
-  }
-}
-
-void DataPipeDrainer::WaitComplete(MojoResult result) {
-  ReadData();
-}
-
-}  // namespace common
-}  // namespace mojo
diff --git a/mojo/common/data_pipe_drainer.h b/mojo/common/data_pipe_drainer.h
deleted file mode 100644
index 5cff820..0000000
--- a/mojo/common/data_pipe_drainer.h
+++ /dev/null
@@ -1,49 +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 MOJO_COMMON_DATA_PIPE_DRAINER_H_
-#define MOJO_COMMON_DATA_PIPE_DRAINER_H_
-
-#include <stddef.h>
-
-#include "base/macros.h"
-#include "base/memory/weak_ptr.h"
-#include "mojo/common/mojo_common_export.h"
-#include "mojo/public/cpp/system/core.h"
-#include "mojo/public/cpp/system/simple_watcher.h"
-
-namespace mojo {
-namespace common {
-
-class MOJO_COMMON_EXPORT DataPipeDrainer {
- public:
-  class Client {
-   public:
-    virtual void OnDataAvailable(const void* data, size_t num_bytes) = 0;
-    virtual void OnDataComplete() = 0;
-
-   protected:
-    virtual ~Client() {}
-  };
-
-  DataPipeDrainer(Client*, mojo::ScopedDataPipeConsumerHandle source);
-  ~DataPipeDrainer();
-
- private:
-  void ReadData();
-  void WaitComplete(MojoResult result);
-
-  Client* client_;
-  mojo::ScopedDataPipeConsumerHandle source_;
-  mojo::SimpleWatcher handle_watcher_;
-
-  base::WeakPtrFactory<DataPipeDrainer> weak_factory_;
-
-  DISALLOW_COPY_AND_ASSIGN(DataPipeDrainer);
-};
-
-}  // namespace common
-}  // namespace mojo
-
-#endif  // MOJO_COMMON_DATA_PIPE_DRAINER_H_
diff --git a/mojo/common/data_pipe_utils.cc b/mojo/common/data_pipe_utils.cc
deleted file mode 100644
index 9b069b8..0000000
--- a/mojo/common/data_pipe_utils.cc
+++ /dev/null
@@ -1,96 +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 "mojo/common/data_pipe_utils.h"
-
-#include <utility>
-
-#include "base/bind.h"
-#include "mojo/public/cpp/system/wait.h"
-
-namespace mojo {
-namespace common {
-namespace {
-
-bool BlockingCopyHelper(ScopedDataPipeConsumerHandle source,
-    const base::Callback<size_t(const void*, uint32_t)>& write_bytes) {
-  for (;;) {
-    const void* buffer;
-    uint32_t num_bytes;
-    MojoResult result = BeginReadDataRaw(
-        source.get(), &buffer, &num_bytes, MOJO_READ_DATA_FLAG_NONE);
-    if (result == MOJO_RESULT_OK) {
-      size_t bytes_written = write_bytes.Run(buffer, num_bytes);
-      result = EndReadDataRaw(source.get(), num_bytes);
-      if (bytes_written < num_bytes || result != MOJO_RESULT_OK)
-        return false;
-    } else if (result == MOJO_RESULT_SHOULD_WAIT) {
-      result = Wait(source.get(), MOJO_HANDLE_SIGNAL_READABLE);
-      if (result != MOJO_RESULT_OK) {
-        // If the producer handle was closed, then treat as EOF.
-        return result == MOJO_RESULT_FAILED_PRECONDITION;
-      }
-    } else if (result == MOJO_RESULT_FAILED_PRECONDITION) {
-      // If the producer handle was closed, then treat as EOF.
-      return true;
-    } else {
-      // Some other error occurred.
-      break;
-    }
-  }
-
-  return false;
-}
-
-size_t CopyToStringHelper(
-    std::string* result, const void* buffer, uint32_t num_bytes) {
-  result->append(static_cast<const char*>(buffer), num_bytes);
-  return num_bytes;
-}
-
-}  // namespace
-
-// TODO(hansmuller): Add a max_size parameter.
-bool BlockingCopyToString(ScopedDataPipeConsumerHandle source,
-                          std::string* result) {
-  CHECK(result);
-  result->clear();
-  return BlockingCopyHelper(std::move(source),
-                            base::Bind(&CopyToStringHelper, result));
-}
-
-bool MOJO_COMMON_EXPORT BlockingCopyFromString(
-    const std::string& source,
-    const ScopedDataPipeProducerHandle& destination) {
-  auto it = source.begin();
-  for (;;) {
-    void* buffer = nullptr;
-    uint32_t buffer_num_bytes = 0;
-    MojoResult result =
-        BeginWriteDataRaw(destination.get(), &buffer, &buffer_num_bytes,
-                          MOJO_WRITE_DATA_FLAG_NONE);
-    if (result == MOJO_RESULT_OK) {
-      char* char_buffer = static_cast<char*>(buffer);
-      uint32_t byte_index = 0;
-      while (it != source.end() && byte_index < buffer_num_bytes) {
-        char_buffer[byte_index++] = *it++;
-      }
-      EndWriteDataRaw(destination.get(), byte_index);
-      if (it == source.end())
-        return true;
-    } else if (result == MOJO_RESULT_SHOULD_WAIT) {
-      result = Wait(destination.get(), MOJO_HANDLE_SIGNAL_WRITABLE);
-      if (result != MOJO_RESULT_OK) {
-        // If the consumer handle was closed, then treat as EOF.
-        return result == MOJO_RESULT_FAILED_PRECONDITION;
-      }
-    } else {
-      // If the consumer handle was closed, then treat as EOF.
-      return result == MOJO_RESULT_FAILED_PRECONDITION;
-    }
-  }
-}
-
-}  // namespace common
-}  // namespace mojo
diff --git a/mojo/common/data_pipe_utils.h b/mojo/common/data_pipe_utils.h
deleted file mode 100644
index a3f7c09..0000000
--- a/mojo/common/data_pipe_utils.h
+++ /dev/null
@@ -1,32 +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 MOJO_COMMON_DATA_PIPE_UTILS_H_
-#define MOJO_COMMON_DATA_PIPE_UTILS_H_
-
-#include <stdint.h>
-
-#include <string>
-
-#include "mojo/common/mojo_common_export.h"
-#include "mojo/public/cpp/system/data_pipe.h"
-
-namespace mojo {
-namespace common {
-
-// Copies the data from |source| into |contents| and returns true on success and
-// false on error.  In case of I/O error, |contents| holds the data that could
-// be read from source before the error occurred.
-bool MOJO_COMMON_EXPORT BlockingCopyToString(
-    ScopedDataPipeConsumerHandle source,
-    std::string* contents);
-
-bool MOJO_COMMON_EXPORT BlockingCopyFromString(
-    const std::string& source,
-    const ScopedDataPipeProducerHandle& destination);
-
-}  // namespace common
-}  // namespace mojo
-
-#endif  // MOJO_COMMON_DATA_PIPE_UTILS_H_
diff --git a/mojo/common/file.mojom b/mojo/common/file.mojom
deleted file mode 100644
index fe22473..0000000
--- a/mojo/common/file.mojom
+++ /dev/null
@@ -1,10 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module mojo.common.mojom;
-
-// Corresponds to |base::File| in base/files/file.h
-struct File {
-  handle fd;
-};
diff --git a/mojo/common/file.typemap b/mojo/common/file.typemap
deleted file mode 100644
index 26d4941..0000000
--- a/mojo/common/file.typemap
+++ /dev/null
@@ -1,13 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-mojom = "//mojo/common/file.mojom"
-public_headers = [ "//base/files/file.h" ]
-traits_headers = [ "//mojo/common/common_custom_types_struct_traits.h" ]
-public_deps = [
-  "//mojo/common:struct_traits",
-]
-
-type_mappings =
-    [ "mojo.common.mojom.File=base::File[move_only,nullable_is_same_type]" ]
diff --git a/mojo/common/file_path.mojom b/mojo/common/file_path.mojom
deleted file mode 100644
index 10ebe05..0000000
--- a/mojo/common/file_path.mojom
+++ /dev/null
@@ -1,8 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module mojo.common.mojom;
-
-[Native]
-struct FilePath;
diff --git a/mojo/common/file_path.typemap b/mojo/common/file_path.typemap
deleted file mode 100644
index 66d8c54..0000000
--- a/mojo/common/file_path.typemap
+++ /dev/null
@@ -1,12 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-mojom = "//mojo/common/file_path.mojom"
-public_headers = [ "//base/files/file_path.h" ]
-traits_headers = [ "//ipc/ipc_message_utils.h" ]
-public_deps = [
-  "//ipc",
-]
-
-type_mappings = [ "mojo.common.mojom.FilePath=base::FilePath" ]
diff --git a/mojo/common/mojo_common_export.h b/mojo/common/mojo_common_export.h
deleted file mode 100644
index 48d21d0..0000000
--- a/mojo/common/mojo_common_export.h
+++ /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.
-
-#ifndef MOJO_COMMON_MOJO_COMMON_EXPORT_H_
-#define MOJO_COMMON_MOJO_COMMON_EXPORT_H_
-
-#if defined(COMPONENT_BUILD)
-
-#if defined(WIN32)
-
-#if defined(MOJO_COMMON_IMPLEMENTATION)
-#define MOJO_COMMON_EXPORT __declspec(dllexport)
-#else
-#define MOJO_COMMON_EXPORT __declspec(dllimport)
-#endif
-
-#else  // !defined(WIN32)
-
-#if defined(MOJO_COMMON_IMPLEMENTATION)
-#define MOJO_COMMON_EXPORT __attribute__((visibility("default")))
-#else
-#define MOJO_COMMON_EXPORT
-#endif
-
-#endif  // defined(WIN32)
-
-#else  // !defined(COMPONENT_BUILD)
-#define MOJO_COMMON_EXPORT
-#endif
-
-#endif  // MOJO_COMMON_MOJO_COMMON_EXPORT_H_
diff --git a/mojo/common/string16.mojom b/mojo/common/string16.mojom
deleted file mode 100644
index 173c867..0000000
--- a/mojo/common/string16.mojom
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module mojo.common.mojom;
-
-// Corresponds to |base::string16| in base/strings/string16.h
-// Corresponds to |WTF::String| in
-// third_party/WebKit/Source/wtf/text/WTFString.h.
-struct String16 {
-  array<uint16> data;
-};
diff --git a/mojo/common/string16.typemap b/mojo/common/string16.typemap
deleted file mode 100644
index 223de29..0000000
--- a/mojo/common/string16.typemap
+++ /dev/null
@@ -1,12 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-mojom = "//mojo/common/string16.mojom"
-public_headers = [ "//base/strings/string16.h" ]
-traits_headers = [ "//mojo/common/common_custom_types_struct_traits.h" ]
-public_deps = [
-  "//mojo/common:struct_traits",
-]
-
-type_mappings = [ "mojo.common.mojom.String16=base::string16" ]
diff --git a/mojo/common/struct_traits_unittest.cc b/mojo/common/struct_traits_unittest.cc
deleted file mode 100644
index 5ac4bc9..0000000
--- a/mojo/common/struct_traits_unittest.cc
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/message_loop/message_loop.h"
-#include "mojo/common/traits_test_service.mojom.h"
-#include "mojo/public/cpp/bindings/binding_set.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace common {
-namespace {
-
-class StructTraitsTest : public testing::Test, public mojom::TraitsTestService {
- public:
-  StructTraitsTest() {}
-
- protected:
-  mojom::TraitsTestServicePtr GetTraitsTestProxy() {
-    return traits_test_bindings_.CreateInterfacePtrAndBind(this);
-  }
-
- private:
-  // TraitsTestService:
-  void EchoVersion(const base::Optional<base::Version>& m,
-                   const EchoVersionCallback& callback) override {
-    callback.Run(m);
-  }
-
-  base::MessageLoop loop_;
-  mojo::BindingSet<TraitsTestService> traits_test_bindings_;
-
-  DISALLOW_COPY_AND_ASSIGN(StructTraitsTest);
-};
-
-TEST_F(StructTraitsTest, Version) {
-  const std::string& version_str = "1.2.3.4";
-  base::Version input(version_str);
-  mojom::TraitsTestServicePtr proxy = GetTraitsTestProxy();
-  base::Optional<base::Version> output;
-  proxy->EchoVersion(input, &output);
-  EXPECT_TRUE(output.has_value());
-  EXPECT_EQ(version_str, output->GetString());
-}
-
-TEST_F(StructTraitsTest, InvalidVersion) {
-  const std::string invalid_version_str;
-  base::Version input(invalid_version_str);
-  mojom::TraitsTestServicePtr proxy = GetTraitsTestProxy();
-  base::Optional<base::Version> output;
-  proxy->EchoVersion(input, &output);
-  EXPECT_FALSE(output.has_value());
-}
-
-}  // namespace
-}  // namespace common
-}  // namespace mojo
diff --git a/mojo/common/test_common_custom_types.mojom b/mojo/common/test_common_custom_types.mojom
deleted file mode 100644
index 0f13680..0000000
--- a/mojo/common/test_common_custom_types.mojom
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module mojo.common.test;
-
-import "mojo/common/file.mojom";
-import "mojo/common/file_path.mojom";
-import "mojo/common/string16.mojom";
-import "mojo/common/text_direction.mojom";
-import "mojo/common/time.mojom";
-import "mojo/common/unguessable_token.mojom";
-import "mojo/common/values.mojom";
-
-interface TestFilePath {
-  BounceFilePath(mojo.common.mojom.FilePath in)
-      => (mojo.common.mojom.FilePath out);
-};
-
-interface TestUnguessableToken {
-  BounceNonce(mojo.common.mojom.UnguessableToken in)
-      => (mojo.common.mojom.UnguessableToken out);
-};
-
-interface TestTime {
-  BounceTime(mojo.common.mojom.Time time) => (mojo.common.mojom.Time time);
-  BounceTimeDelta(mojo.common.mojom.TimeDelta time_delta)
-      => (mojo.common.mojom.TimeDelta time_delta);
-  BounceTimeTicks(mojo.common.mojom.TimeTicks time_ticks)
-      => (mojo.common.mojom.TimeTicks time_ticks);
-};
-
-interface TestValue {
-  [Sync]
-  BounceDictionaryValue(mojo.common.mojom.DictionaryValue in)
-      => (mojo.common.mojom.DictionaryValue out);
-  [Sync]
-  BounceListValue(mojo.common.mojom.ListValue in)
-      => (mojo.common.mojom.ListValue out);
-  [Sync]
-  BounceValue(mojo.common.mojom.Value? in)
-      => (mojo.common.mojom.Value? out);
-};
-
-interface TestString16 {
-  [Sync]
-  BounceString16(mojo.common.mojom.String16 in)
-      => (mojo.common.mojom.String16 out);
-};
-
-interface TestFile {
-  [Sync]
-  BounceFile(mojo.common.mojom.File? in)
-      => (mojo.common.mojom.File? out);
-};
-
-interface TestTextDirection {
-  [Sync]
-  BounceTextDirection(mojo.common.mojom.TextDirection in)
-      => (mojo.common.mojom.TextDirection out);
-};
diff --git a/mojo/common/text_direction.mojom b/mojo/common/text_direction.mojom
deleted file mode 100644
index 7d65124..0000000
--- a/mojo/common/text_direction.mojom
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module mojo.common.mojom;
-
-// Corresponds to |base::i18n::TextDirection| in base/i18n/rtl.h
-enum TextDirection {	
-  UNKNOWN_DIRECTION,	
-  RIGHT_TO_LEFT,	
-  LEFT_TO_RIGHT	
-};	
diff --git a/mojo/common/text_direction.typemap b/mojo/common/text_direction.typemap
deleted file mode 100644
index 1f5be8e..0000000
--- a/mojo/common/text_direction.typemap
+++ /dev/null
@@ -1,12 +0,0 @@
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-mojom = "//mojo/common/text_direction.mojom"
-public_headers = [ "//base/i18n/rtl.h" ]
-traits_headers = [ "//mojo/common/common_custom_types_struct_traits.h" ]
-public_deps = [
-  "//base:i18n",
-  "//mojo/common:struct_traits",
-]
-type_mappings = [ "mojo.common.mojom.TextDirection=base::i18n::TextDirection" ]
diff --git a/mojo/common/time.mojom b/mojo/common/time.mojom
deleted file mode 100644
index b403bca..0000000
--- a/mojo/common/time.mojom
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module mojo.common.mojom;
-
-struct Time {
-  // The internal value is expressed in terms of microseconds since a fixed but
-  // intentionally unspecified epoch.
-  int64 internal_value;
-};
-
-struct TimeDelta {
-  int64 microseconds;
-};
-
-struct TimeTicks {
-  // The internal value is expressed in terms of microseconds since a fixed but
-  // intentionally unspecified epoch.
-  int64 internal_value;
-};
diff --git a/mojo/common/time.typemap b/mojo/common/time.typemap
deleted file mode 100644
index 99e9e3a..0000000
--- a/mojo/common/time.typemap
+++ /dev/null
@@ -1,20 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-mojom = "//mojo/common/time.mojom"
-public_headers = [ "//base/time/time.h" ]
-traits_headers = [
-  "//ipc/ipc_message_utils.h",
-  "//mojo/common/common_custom_types_struct_traits.h",
-]
-public_deps = [
-  "//ipc",
-  "//mojo/common:struct_traits",
-]
-
-type_mappings = [
-  "mojo.common.mojom.Time=base::Time[copyable_pass_by_value]",
-  "mojo.common.mojom.TimeDelta=base::TimeDelta[copyable_pass_by_value]",
-  "mojo.common.mojom.TimeTicks=base::TimeTicks[copyable_pass_by_value]",
-]
diff --git a/mojo/common/time_struct_traits.h b/mojo/common/time_struct_traits.h
deleted file mode 100644
index b480edb..0000000
--- a/mojo/common/time_struct_traits.h
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_COMMON_TIME_STRUCT_TRAITS_H_
-#define MOJO_COMMON_TIME_STRUCT_TRAITS_H_
-
-#include "base/time/time.h"
-#include "mojo/common/time.mojom-shared.h"
-
-namespace mojo {
-
-template <>
-struct StructTraits<common::mojom::TimeDataView, base::Time> {
-  static int64_t internal_value(const base::Time& time) {
-    return time.since_origin().InMicroseconds();
-  }
-
-  static bool Read(common::mojom::TimeDataView data, base::Time* time) {
-    *time =
-        base::Time() + base::TimeDelta::FromMicroseconds(data.internal_value());
-    return true;
-  }
-};
-
-template <>
-struct StructTraits<common::mojom::TimeDeltaDataView, base::TimeDelta> {
-  static int64_t microseconds(const base::TimeDelta& delta) {
-    return delta.InMicroseconds();
-  }
-
-  static bool Read(common::mojom::TimeDeltaDataView data,
-                   base::TimeDelta* delta) {
-    *delta = base::TimeDelta::FromMicroseconds(data.microseconds());
-    return true;
-  }
-};
-
-template <>
-struct StructTraits<common::mojom::TimeTicksDataView, base::TimeTicks> {
-  static int64_t internal_value(const base::TimeTicks& time) {
-    return time.since_origin().InMicroseconds();
-  }
-
-  static bool Read(common::mojom::TimeTicksDataView data,
-                   base::TimeTicks* time) {
-    *time = base::TimeTicks() +
-            base::TimeDelta::FromMicroseconds(data.internal_value());
-    return true;
-  }
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_COMMON_TIME_STRUCT_TRAITS_H_
diff --git a/mojo/common/traits_test_service.mojom b/mojo/common/traits_test_service.mojom
deleted file mode 100644
index 7659eea..0000000
--- a/mojo/common/traits_test_service.mojom
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module mojo.common.mojom;
-
-import "mojo/common/version.mojom";
-
-// All functions on this interface echo their arguments to test StructTraits
-// serialization and deserialization.
-interface TraitsTestService {
-  [Sync]
-  EchoVersion(Version? v) => (Version? pass);
-};
diff --git a/mojo/common/typemaps.gni b/mojo/common/typemaps.gni
deleted file mode 100644
index ae36031..0000000
--- a/mojo/common/typemaps.gni
+++ /dev/null
@@ -1,14 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-typemaps = [
-  "//mojo/common/file.typemap",
-  "//mojo/common/file_path.typemap",
-  "//mojo/common/string16.typemap",
-  "//mojo/common/text_direction.typemap",
-  "//mojo/common/time.typemap",
-  "//mojo/common/unguessable_token.typemap",
-  "//mojo/common/values.typemap",
-  "//mojo/common/version.typemap",
-]
diff --git a/mojo/common/unguessable_token.mojom b/mojo/common/unguessable_token.mojom
deleted file mode 100644
index 3279717..0000000
--- a/mojo/common/unguessable_token.mojom
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module mojo.common.mojom;
-
-// Corresponds to |base::UnguessableToken| in base/unguessable_token.h
-struct UnguessableToken {
-  uint64 high;
-  uint64 low;
-};
diff --git a/mojo/common/unguessable_token.typemap b/mojo/common/unguessable_token.typemap
deleted file mode 100644
index ec7b194..0000000
--- a/mojo/common/unguessable_token.typemap
+++ /dev/null
@@ -1,12 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-mojom = "//mojo/common/unguessable_token.mojom"
-public_headers = [ "//base/unguessable_token.h" ]
-traits_headers = [ "//mojo/common/common_custom_types_struct_traits.h" ]
-public_deps = [
-  "//mojo/common:struct_traits",
-]
-
-type_mappings = [ "mojo.common.mojom.UnguessableToken=base::UnguessableToken" ]
diff --git a/mojo/common/values.mojom b/mojo/common/values.mojom
deleted file mode 100644
index 722198c..0000000
--- a/mojo/common/values.mojom
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module mojo.common.mojom;
-
-union Value {
-  NullValue? null_value;
-  bool bool_value;
-  int32 int_value;
-  double double_value;
-  string string_value;
-  array<uint8> binary_value;
-  DictionaryValue dictionary_value;
-  ListValue list_value;
-};
-
-struct ListValue {
-  array<Value> values;
-};
-
-struct DictionaryValue {
-  map<string, Value> values;
-};
-
-// An empty struct representing a null base::Value.
-struct NullValue {
-};
-
-// To avoid versioning problems for arc. TODO(sammc): Remove ASAP.
-[Native]
-struct LegacyListValue;
diff --git a/mojo/common/values.typemap b/mojo/common/values.typemap
deleted file mode 100644
index f1f3fc2..0000000
--- a/mojo/common/values.typemap
+++ /dev/null
@@ -1,25 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-mojom = "//mojo/common/values.mojom"
-public_headers = [ "//base/values.h" ]
-traits_headers = [
-  "//ipc/ipc_message_utils.h",
-  "//mojo/common/values_struct_traits.h",
-]
-public_deps = [
-  "//base",
-  "//ipc",
-]
-sources = [
-  "values_struct_traits.cc",
-  "values_struct_traits.h",
-]
-
-type_mappings = [
-  "mojo.common.mojom.DictionaryValue=std::unique_ptr<base::DictionaryValue>[move_only,nullable_is_same_type]",
-  "mojo.common.mojom.LegacyListValue=base::ListValue[non_copyable_non_movable]",
-  "mojo.common.mojom.ListValue=std::unique_ptr<base::ListValue>[move_only,nullable_is_same_type]",
-  "mojo.common.mojom.Value=std::unique_ptr<base::Value>[move_only,nullable_is_same_type]",
-]
diff --git a/mojo/common/values_struct_traits.cc b/mojo/common/values_struct_traits.cc
deleted file mode 100644
index 6af7a39..0000000
--- a/mojo/common/values_struct_traits.cc
+++ /dev/null
@@ -1,109 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/memory/ptr_util.h"
-#include "mojo/common/values_struct_traits.h"
-
-namespace mojo {
-
-bool StructTraits<common::mojom::ListValueDataView,
-                  std::unique_ptr<base::ListValue>>::
-    Read(common::mojom::ListValueDataView data,
-         std::unique_ptr<base::ListValue>* value_out) {
-  mojo::ArrayDataView<common::mojom::ValueDataView> view;
-  data.GetValuesDataView(&view);
-
-  auto list_value = base::MakeUnique<base::ListValue>();
-  for (size_t i = 0; i < view.size(); ++i) {
-    std::unique_ptr<base::Value> value;
-    if (!view.Read(i, &value))
-      return false;
-
-    list_value->Append(std::move(value));
-  }
-  *value_out = std::move(list_value);
-  return true;
-}
-
-bool StructTraits<common::mojom::DictionaryValueDataView,
-                  std::unique_ptr<base::DictionaryValue>>::
-    Read(common::mojom::DictionaryValueDataView data,
-         std::unique_ptr<base::DictionaryValue>* value_out) {
-  mojo::MapDataView<mojo::StringDataView, common::mojom::ValueDataView> view;
-  data.GetValuesDataView(&view);
-  auto dictionary_value = base::MakeUnique<base::DictionaryValue>();
-  for (size_t i = 0; i < view.size(); ++i) {
-    base::StringPiece key;
-    std::unique_ptr<base::Value> value;
-    if (!view.keys().Read(i, &key) || !view.values().Read(i, &value))
-      return false;
-
-    dictionary_value->SetWithoutPathExpansion(key, std::move(value));
-  }
-  *value_out = std::move(dictionary_value);
-  return true;
-}
-
-std::unique_ptr<base::DictionaryValue>
-CloneTraits<std::unique_ptr<base::DictionaryValue>, false>::Clone(
-    const std::unique_ptr<base::DictionaryValue>& input) {
-  auto result = base::MakeUnique<base::DictionaryValue>();
-  result->MergeDictionary(input.get());
-  return result;
-}
-
-bool UnionTraits<common::mojom::ValueDataView, std::unique_ptr<base::Value>>::
-    Read(common::mojom::ValueDataView data,
-         std::unique_ptr<base::Value>* value_out) {
-  switch (data.tag()) {
-    case common::mojom::ValueDataView::Tag::NULL_VALUE: {
-      *value_out = base::Value::CreateNullValue();
-      return true;
-    }
-    case common::mojom::ValueDataView::Tag::BOOL_VALUE: {
-      *value_out = base::MakeUnique<base::Value>(data.bool_value());
-      return true;
-    }
-    case common::mojom::ValueDataView::Tag::INT_VALUE: {
-      *value_out = base::MakeUnique<base::Value>(data.int_value());
-      return true;
-    }
-    case common::mojom::ValueDataView::Tag::DOUBLE_VALUE: {
-      *value_out = base::MakeUnique<base::Value>(data.double_value());
-      return true;
-    }
-    case common::mojom::ValueDataView::Tag::STRING_VALUE: {
-      base::StringPiece string_value;
-      if (!data.ReadStringValue(&string_value))
-        return false;
-      *value_out = base::MakeUnique<base::Value>(string_value);
-      return true;
-    }
-    case common::mojom::ValueDataView::Tag::BINARY_VALUE: {
-      mojo::ArrayDataView<uint8_t> binary_data;
-      data.GetBinaryValueDataView(&binary_data);
-      *value_out = base::BinaryValue::CreateWithCopiedBuffer(
-          reinterpret_cast<const char*>(binary_data.data()),
-          binary_data.size());
-      return true;
-    }
-    case common::mojom::ValueDataView::Tag::DICTIONARY_VALUE: {
-      std::unique_ptr<base::DictionaryValue> dictionary_value;
-      if (!data.ReadDictionaryValue(&dictionary_value))
-        return false;
-      *value_out = std::move(dictionary_value);
-      return true;
-    }
-    case common::mojom::ValueDataView::Tag::LIST_VALUE: {
-      std::unique_ptr<base::ListValue> list_value;
-      if (!data.ReadListValue(&list_value))
-        return false;
-      *value_out = std::move(list_value);
-      return true;
-    }
-  }
-  return false;
-}
-
-}  // namespace mojo
diff --git a/mojo/common/values_struct_traits.h b/mojo/common/values_struct_traits.h
deleted file mode 100644
index befcf3a..0000000
--- a/mojo/common/values_struct_traits.h
+++ /dev/null
@@ -1,257 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_COMMON_VALUES_STRUCT_TRAITS_H_
-#define MOJO_COMMON_VALUES_STRUCT_TRAITS_H_
-
-#include "base/values.h"
-#include "mojo/common/values.mojom.h"
-#include "mojo/public/cpp/bindings/array_traits.h"
-#include "mojo/public/cpp/bindings/clone_traits.h"
-#include "mojo/public/cpp/bindings/map_traits.h"
-#include "mojo/public/cpp/bindings/struct_traits.h"
-#include "mojo/public/cpp/bindings/union_traits.h"
-
-namespace mojo {
-
-template <>
-struct ArrayTraits<base::ListValue> {
-  using Element = std::unique_ptr<base::Value>;
-  using ConstIterator = base::ListValue::const_iterator;
-
-  static size_t GetSize(const base::ListValue& input) {
-    return input.GetSize();
-  }
-
-  static ConstIterator GetBegin(const base::ListValue& input) {
-    return input.begin();
-  }
-
-  static void AdvanceIterator(ConstIterator& iterator) { ++iterator; }
-
-  static const Element& GetValue(ConstIterator& iterator) { return *iterator; }
-};
-
-template <>
-struct StructTraits<common::mojom::ListValueDataView, base::ListValue> {
-  static const base::ListValue& values(const base::ListValue& value) {
-    return value;
-  }
-};
-
-template <>
-struct StructTraits<common::mojom::ListValueDataView,
-                    std::unique_ptr<base::ListValue>> {
-  static bool IsNull(const std::unique_ptr<base::ListValue>& value) {
-    return !value;
-  }
-
-  static void SetToNull(std::unique_ptr<base::ListValue>* value) {
-    value->reset();
-  }
-
-  static const base::ListValue& values(
-      const std::unique_ptr<base::ListValue>& value) {
-    return *value;
-  }
-
-  static bool Read(common::mojom::ListValueDataView data,
-                   std::unique_ptr<base::ListValue>* value);
-};
-
-template <>
-struct MapTraits<base::DictionaryValue> {
-  using Key = std::string;
-  using Value = base::Value;
-  using Iterator = base::DictionaryValue::Iterator;
-
-  static size_t GetSize(const base::DictionaryValue& input) {
-    return input.size();
-  }
-
-  static Iterator GetBegin(const base::DictionaryValue& input) {
-    return Iterator(input);
-  }
-
-  static void AdvanceIterator(Iterator& iterator) { iterator.Advance(); }
-
-  static const Key& GetKey(Iterator& iterator) { return iterator.key(); }
-
-  static const Value& GetValue(Iterator& iterator) { return iterator.value(); }
-};
-
-template <>
-struct StructTraits<common::mojom::DictionaryValueDataView,
-                    base::DictionaryValue> {
-  static const base::DictionaryValue& values(
-      const base::DictionaryValue& value) {
-    return value;
-  }
-};
-
-template <>
-struct StructTraits<common::mojom::DictionaryValueDataView,
-                    std::unique_ptr<base::DictionaryValue>> {
-  static bool IsNull(const std::unique_ptr<base::DictionaryValue>& value) {
-    return !value;
-  }
-
-  static void SetToNull(std::unique_ptr<base::DictionaryValue>* value) {
-    value->reset();
-  }
-
-  static const base::DictionaryValue& values(
-      const std::unique_ptr<base::DictionaryValue>& value) {
-    return *value;
-  }
-  static bool Read(common::mojom::DictionaryValueDataView data,
-                   std::unique_ptr<base::DictionaryValue>* value);
-};
-
-template <>
-struct CloneTraits<std::unique_ptr<base::DictionaryValue>, false> {
-  static std::unique_ptr<base::DictionaryValue> Clone(
-      const std::unique_ptr<base::DictionaryValue>& input);
-};
-
-template <>
-struct UnionTraits<common::mojom::ValueDataView, base::Value> {
-  static common::mojom::ValueDataView::Tag GetTag(const base::Value& data) {
-    switch (data.GetType()) {
-      case base::Value::Type::NONE:
-        return common::mojom::ValueDataView::Tag::NULL_VALUE;
-      case base::Value::Type::BOOLEAN:
-        return common::mojom::ValueDataView::Tag::BOOL_VALUE;
-      case base::Value::Type::INTEGER:
-        return common::mojom::ValueDataView::Tag::INT_VALUE;
-      case base::Value::Type::DOUBLE:
-        return common::mojom::ValueDataView::Tag::DOUBLE_VALUE;
-      case base::Value::Type::STRING:
-        return common::mojom::ValueDataView::Tag::STRING_VALUE;
-      case base::Value::Type::BINARY:
-        return common::mojom::ValueDataView::Tag::BINARY_VALUE;
-      case base::Value::Type::DICTIONARY:
-        return common::mojom::ValueDataView::Tag::DICTIONARY_VALUE;
-      case base::Value::Type::LIST:
-        return common::mojom::ValueDataView::Tag::LIST_VALUE;
-    }
-    NOTREACHED();
-    return common::mojom::ValueDataView::Tag::NULL_VALUE;
-  }
-
-  static common::mojom::NullValuePtr null_value(const base::Value& value) {
-    return common::mojom::NullValuePtr();
-  }
-
-  static bool bool_value(const base::Value& value) {
-    bool bool_value{};
-    if (!value.GetAsBoolean(&bool_value))
-      NOTREACHED();
-    return bool_value;
-  }
-
-  static int32_t int_value(const base::Value& value) {
-    int int_value{};
-    if (!value.GetAsInteger(&int_value))
-      NOTREACHED();
-    return int_value;
-  }
-
-  static double double_value(const base::Value& value) {
-    double double_value{};
-    if (!value.GetAsDouble(&double_value))
-      NOTREACHED();
-    return double_value;
-  }
-
-  static base::StringPiece string_value(const base::Value& value) {
-    base::StringPiece string_piece;
-    if (!value.GetAsString(&string_piece))
-      NOTREACHED();
-    return string_piece;
-  }
-
-  static mojo::ConstCArray<uint8_t> binary_value(const base::Value& value) {
-    const base::BinaryValue* binary_value = nullptr;
-    if (!value.GetAsBinary(&binary_value))
-      NOTREACHED();
-    return mojo::ConstCArray<uint8_t>(
-        binary_value->GetSize(),
-        reinterpret_cast<const uint8_t*>(binary_value->GetBuffer()));
-  }
-
-  static const base::ListValue& list_value(const base::Value& value) {
-    const base::ListValue* list_value = nullptr;
-    if (!value.GetAsList(&list_value))
-      NOTREACHED();
-    return *list_value;
-  }
-  static const base::DictionaryValue& dictionary_value(
-      const base::Value& value) {
-    const base::DictionaryValue* dictionary_value = nullptr;
-    if (!value.GetAsDictionary(&dictionary_value))
-      NOTREACHED();
-    return *dictionary_value;
-  }
-};
-
-template <>
-struct UnionTraits<common::mojom::ValueDataView, std::unique_ptr<base::Value>> {
-  static bool IsNull(const std::unique_ptr<base::Value>& value) {
-    return !value;
-  }
-
-  static void SetToNull(std::unique_ptr<base::Value>* value) { value->reset(); }
-
-  static common::mojom::ValueDataView::Tag GetTag(
-      const std::unique_ptr<base::Value>& value) {
-    return UnionTraits<common::mojom::ValueDataView, base::Value>::GetTag(
-        *value);
-  }
-
-  static common::mojom::NullValuePtr null_value(
-      const std::unique_ptr<base::Value>& value) {
-    return UnionTraits<common::mojom::ValueDataView, base::Value>::null_value(
-        *value);
-  }
-  static bool bool_value(const std::unique_ptr<base::Value>& value) {
-    return UnionTraits<common::mojom::ValueDataView, base::Value>::bool_value(
-        *value);
-  }
-  static int32_t int_value(const std::unique_ptr<base::Value>& value) {
-    return UnionTraits<common::mojom::ValueDataView, base::Value>::int_value(
-        *value);
-  }
-  static double double_value(const std::unique_ptr<base::Value>& value) {
-    return UnionTraits<common::mojom::ValueDataView, base::Value>::double_value(
-        *value);
-  }
-  static base::StringPiece string_value(
-      const std::unique_ptr<base::Value>& value) {
-    return UnionTraits<common::mojom::ValueDataView, base::Value>::string_value(
-        *value);
-  }
-  static mojo::ConstCArray<uint8_t> binary_value(
-      const std::unique_ptr<base::Value>& value) {
-    return UnionTraits<common::mojom::ValueDataView, base::Value>::binary_value(
-        *value);
-  }
-  static const base::ListValue& list_value(
-      const std::unique_ptr<base::Value>& value) {
-    return UnionTraits<common::mojom::ValueDataView, base::Value>::list_value(
-        *value);
-  }
-  static const base::DictionaryValue& dictionary_value(
-      const std::unique_ptr<base::Value>& value) {
-    return UnionTraits<common::mojom::ValueDataView,
-                       base::Value>::dictionary_value(*value);
-  }
-
-  static bool Read(common::mojom::ValueDataView data,
-                   std::unique_ptr<base::Value>* value);
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_COMMON_VALUES_STRUCT_TRAITS_H_
diff --git a/mojo/common/version.mojom b/mojo/common/version.mojom
deleted file mode 100644
index 6ddf6e6..0000000
--- a/mojo/common/version.mojom
+++ /dev/null
@@ -1,10 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module mojo.common.mojom;
-
-// Corresponds to |base::Version| in base/version.h
-struct Version {
-  array<uint32> components;
-};
diff --git a/mojo/common/version.typemap b/mojo/common/version.typemap
deleted file mode 100644
index fa7fed9..0000000
--- a/mojo/common/version.typemap
+++ /dev/null
@@ -1,12 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-mojom = "//mojo/common/version.mojom"
-public_headers = [ "//base/version.h" ]
-traits_headers = [ "//mojo/common/common_custom_types_struct_traits.h" ]
-public_deps = [
-  "//mojo/common:struct_traits",
-]
-
-type_mappings = [ "mojo.common.mojom.Version=base::Version" ]
diff --git a/mojo/edk/DEPS b/mojo/edk/DEPS
deleted file mode 100644
index 77abb21..0000000
--- a/mojo/edk/DEPS
+++ /dev/null
@@ -1,14 +0,0 @@
-include_rules = [
-  # This code is checked into the chromium repo so it's fine to depend on this.
-  "+base",
-  "+crypto",
-  "+build",
-  "+gin",
-  "+native_client/src/public",
-  "+testing",
-  "+third_party/ashmem",
-  "+v8",
-
-  # internal includes.
-  "+mojo",
-]
diff --git a/mojo/edk/embedder/BUILD.gn b/mojo/edk/embedder/BUILD.gn
deleted file mode 100644
index 8105bed..0000000
--- a/mojo/edk/embedder/BUILD.gn
+++ /dev/null
@@ -1,147 +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.
-
-import("//build/config/nacl/config.gni")
-
-source_set("headers") {
-  sources = [
-    "configuration.h",
-    "connection_params.h",
-    "embedder.h",
-    "embedder_internal.h",
-    "named_platform_channel_pair.h",
-    "named_platform_handle.h",
-    "named_platform_handle_utils.h",
-    "pending_process_connection.h",
-    "platform_channel_pair.h",
-    "platform_handle.h",
-    "platform_handle_utils.h",
-    "scoped_platform_handle.h",
-  ]
-
-  public_deps = [
-    "//base",
-    "//mojo/public/cpp/system",
-  ]
-}
-
-source_set("embedder") {
-  # This isn't really a standalone target; it must be linked into the
-  # mojo_system_impl component.
-  visibility = [
-    "//mojo/edk/system",
-    "//components/nacl:nacl",
-  ]
-
-  sources = [
-    "configuration.h",
-    "connection_params.cc",
-    "connection_params.h",
-    "embedder.cc",
-    "embedder.h",
-    "embedder_internal.h",
-    "entrypoints.cc",
-    "entrypoints.h",
-    "pending_process_connection.cc",
-    "scoped_ipc_support.cc",
-    "scoped_ipc_support.h",
-
-    # Test-only code:
-    # TODO(vtl): It's a little unfortunate that these end up in the same
-    # component as non-test-only code. In the static build, this code should
-    # hopefully be dead-stripped.
-    "test_embedder.cc",
-    "test_embedder.h",
-  ]
-
-  defines = [ "MOJO_SYSTEM_IMPL_IMPLEMENTATION" ]
-
-  public_deps = [
-    ":headers",
-    ":platform",
-    "//base",
-    "//mojo/public/cpp/system",
-  ]
-
-  if (!is_nacl) {
-    deps = [
-      "//crypto",
-    ]
-  }
-}
-
-source_set("platform") {
-  # This isn't really a standalone target; it must be linked into the
-  # mojo_system_impl component.
-  visibility = [
-    ":embedder",
-    "//mojo/edk/system",
-  ]
-
-  sources = [
-    "named_platform_channel_pair.h",
-    "named_platform_channel_pair_win.cc",
-    "named_platform_handle.h",
-    "named_platform_handle_utils.h",
-    "named_platform_handle_utils_win.cc",
-    "platform_channel_pair.cc",
-    "platform_channel_pair.h",
-    "platform_channel_pair_posix.cc",
-    "platform_channel_pair_win.cc",
-    "platform_channel_utils_posix.cc",
-    "platform_channel_utils_posix.h",
-    "platform_handle.cc",
-    "platform_handle.h",
-    "platform_handle_utils.h",
-    "platform_handle_utils_posix.cc",
-    "platform_handle_utils_win.cc",
-    "platform_handle_vector.h",
-    "platform_shared_buffer.cc",
-    "platform_shared_buffer.h",
-    "scoped_platform_handle.h",
-  ]
-  if (!is_nacl) {
-    sources += [ "named_platform_handle_utils_posix.cc" ]
-  }
-
-  defines = [ "MOJO_SYSTEM_IMPL_IMPLEMENTATION" ]
-
-  public_deps = [
-    "//mojo/public/cpp/system",
-  ]
-
-  deps = [
-    "//base",
-  ]
-
-  if (is_android) {
-    deps += [ "//third_party/ashmem" ]
-  }
-
-  if (is_nacl && !is_nacl_nonsfi) {
-    sources -= [ "platform_channel_utils_posix.cc" ]
-  }
-}
-
-source_set("embedder_unittests") {
-  testonly = true
-
-  # TODO: Figure out why this visibility check fails on Android.
-  # visibility = [ "//mojo/edk/system:mojo_system_unittests" ]
-
-  sources = [
-    "embedder_unittest.cc",
-    "platform_channel_pair_posix_unittest.cc",
-    "platform_shared_buffer_unittest.cc",
-  ]
-
-  deps = [
-    "//base",
-    "//base/test:test_support",
-    "//mojo/edk/system",
-    "//mojo/edk/system:test_utils",
-    "//mojo/edk/test:test_support",
-    "//testing/gtest",
-  ]
-}
diff --git a/mojo/edk/embedder/README.md b/mojo/edk/embedder/README.md
deleted file mode 100644
index fc53bec..0000000
--- a/mojo/edk/embedder/README.md
+++ /dev/null
@@ -1,346 +0,0 @@
-# ![Mojo Graphic](https://goo.gl/6CdlbH) Mojo Embedder Development Kit (EDK)
-This document is a subset of the [Mojo documentation](/mojo).
-
-[TOC]
-
-## Overview
-
-The Mojo EDK is a (binary-unstable) API which enables a process to use Mojo both
-internally and for IPC to other Mojo-embedding processes.
-
-Using any of the API surface in `//mojo/edk/embedder` requires (somewhat
-confusingly) a direct dependency on the GN `//mojo/edk/system` target. Despite
-this fact, you should never reference any of the headers in `mojo/edk/system`
-directly, as everything there is considered to be an internal detail of the EDK.
-
-**NOTE:** Unless you are introducing a new binary entry point into the system
-(*e.g.,* a new executable with a new `main()` definition), you probably don't
-need to know anything about the EDK API. Most processes defined in the Chrome
-repo today already fully initialize the EDK so that Mojo's other public APIs
-"just work" out of the box.
-
-## Basic Initialization
-
-In order to use Mojo in a given process, it's necessary to call
-`mojo::edk::Init` exactly once:
-
-```
-#include "mojo/edk/embedder/embedder.h"
-
-int main(int argc, char** argv) {
-  mojo::edk::Init();
-
-  // Now you can create message pipes, write messages, etc
-
-  return 0;
-}
-```
-
-As it happens though, Mojo is less useful without some kind of IPC support as
-well, and that's a second initialization step.
-
-## IPC Initialization
-
-You also need to provide the system with a background TaskRunner on which it can
-watch for inbound I/O from any of the various other processes you will later
-connect to it.
-
-Here we'll just create a new background thread for IPC and let Mojo use that.
-Note that in Chromium, we use the existing "IO thread" in the browser process
-and content child processes.
-
-```
-#include "base/threading/thread.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/embedder/scoped_ipc_support.h"
-
-int main(int argc, char** argv) {
-  mojo::edk::Init();
-
-  base::Thread ipc_thread("ipc!");
-  ipc_thread.StartWithOptions(
-      base::Thread::Options(base::MessageLoop::TYPE_IO));
-
-  // As long as this object is alive, all EDK API surface relevant to IPC
-  // connections is usable and message pipes which span a process boundary will
-  // continue to function.
-  mojo::edk::ScopedIPCSupport ipc_support(
-      ipc_thread.task_runner(),
-      mojo::edk::ScopedIPCSupport::ShutdownPolicy::CLEAN);
-
-  return 0;
-}
-```
-
-This process is now fully prepared to use Mojo IPC!
-
-Note that all existing process types in Chromium already perform this setup
-very early during startup.
-
-## Connecting Two Processes
-
-Now suppose you're running a process which has initialized Mojo IPC, and you
-want to launch another process which you know will also initialize Mojo IPC.
-You want to be able to connect Mojo interfaces between these two processes.
-Rejoice, because this section was written just for you.
-
-NOTE: For legacy reasons, some API terminology may refer to concepts of "parent"
-and "child" as a relationship between processes being connected by Mojo. This
-relationship is today completely orthogonal to any notion of process hierarchy
-in the OS, and so use of these APIs is not constrained by an adherence to any
-such hierarchy.
-
-Mojo requires you to bring your own OS pipe to the party, and it will do the
-rest. It also provides a convenient mechanism for creating such pipes, known as
-a `PlatformChannelPair`.
-
-You provide one end of this pipe to the EDK in the local process via
-`PendingProcessConnection` - which can also be used to create cross-process
-message pipes (see the next section) - and you're responsible for getting the
-other end into the remote process.
-
-```
-#include "base/process/process_handle.h"
-#include "base/threading/thread.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/embedder/pending_process_connection.h"
-#include "mojo/edk/embedder/platform_channel_pair.h"
-#include "mojo/edk/embedder/scoped_ipc_support.h"
-
-// You write this. It launches a new process, passing the pipe handle
-// encapsulated by |channel| by any means possible (e.g. on Windows or POSIX
-// you may inhert the file descriptor/HANDLE at launch and pass a commandline
-// argument to indicate its numeric value). Returns the handle of the new
-// process.
-base::ProcessHandle LaunchCoolChildProcess(
-    mojo::edk::ScopedPlatformHandle channel);
-
-int main(int argc, char** argv) {
-  mojo::edk::Init();
-
-  base::Thread ipc_thread("ipc!");
-  ipc_thread.StartWithOptions(
-      base::Thread::Options(base::MessageLoop::TYPE_IO));
-
-  mojo::edk::ScopedIPCSupport ipc_support(
-      ipc_thread.task_runner(),
-      mojo::edk::ScopedIPCSupport::ShutdownPolicy::CLEAN);
-
-  // This is essentially always an OS pipe (domain socket pair, Windows named
-  // pipe, etc.)
-  mojo::edk::PlatformChannelPair channel;
-
-  // This is a scoper which encapsulates the intent to connect to another
-  // process. It exists because process connection is inherently asynchronous,
-  // things may go wrong, and the lifetime of any associated resources is bound
-  // by the lifetime of this object regardless of success or failure.
-  mojo::edk::PendingProcessConnection child;
-
-  base::ProcessHandle child_handle =
-      LaunchCoolChildProcess(channel.PassClientHandle());
-
-  // At this point it's safe for |child| to go out of scope and nothing will
-  // break.
-  child.Connect(child_handle, channel.PassServerHandle());
-
-  return 0;
-}
-```
-
-The launched process code uses `SetParentPipeHandle` to get connected, and might
-look something like:
-
-```
-#include "base/threading/thread.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/embedder/scoped_ipc_support.h"
-
-// You write this. It acquires the ScopedPlatformHandle that was passed by
-// whomever launched this process (i.e. LaunchCoolChildProcess above).
-mojo::edk::ScopedPlatformHandle GetChannelHandle();
-
-int main(int argc, char** argv) {
-  mojo::edk::Init();
-
-  base::Thread ipc_thread("ipc!");
-  ipc_thread.StartWithOptions(
-      base::Thread::Options(base::MessageLoop::TYPE_IO));
-
-  mojo::edk::ScopedIPCSupport ipc_support(
-      ipc_thread.task_runner(),
-      mojo::edk::ScopedIPCSupport::ShutdownPolicy::CLEAN);
-
-  mojo::edk::SetParentPipeHandle(GetChannelHandle());
-
-  return 0;
-}
-```
-
-Now you have IPC initialized between two processes. For some practical examples
-of how this is done, you can dig into the various multiprocess tests in the
-`mojo_system_unittests` test suite.
-
-## Bootstrapping Cross-Process Message Pipes
-
-Having internal Mojo IPC support initialized is pretty useless if you don't have
-any message pipes spanning the process boundary. Fortunately, this is made
-trivial by the EDK: `PendingProcessConnection` has a
-`CreateMessagePipe` method which synthesizes a new solitary message pipe
-endpoint for your immediate use, while also generating a magic token string that
-can be exchanged for the other end of the pipe via
-`mojo::edk::CreateChildMessagePipe`.
-
-The token exchange can be done by the same process (which is sometimes useful),
-or by the process that is eventually connected via `Connect()` on that
-`PendingProcessConnection`. This means that you can effectively pass message
-pipes on the commandline by passing a token string.
-
-We can modify our existing sample code as follows:
-
-```
-#include "base/command_line.h"
-#include "base/process/process_handle.h"
-#include "base/threading/thread.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/embedder/pending_process_connection.h"
-#include "mojo/edk/embedder/platform_channel_pair.h"
-#include "mojo/edk/embedder/scoped_ipc_support.h"
-#include "mojo/public/cpp/system/message_pipe.h"
-#include "local/foo.mojom.h"  // You provide this
-
-base::ProcessHandle LaunchCoolChildProcess(
-    const base::CommandLine& command_line,
-    mojo::edk::ScopedPlatformHandle channel);
-
-int main(int argc, char** argv) {
-  mojo::edk::Init();
-
-  base::Thread ipc_thread("ipc!");
-  ipc_thread.StartWithOptions(
-      base::Thread::Options(base::MessageLoop::TYPE_IO));
-
-  mojo::edk::ScopedIPCSupport ipc_support(
-      ipc_thread.task_runner(),
-      mojo::edk::ScopedIPCSupport::ShutdownPolicy::CLEAN);
-
-  mojo::edk::PlatformChannelPair channel;
-
-  mojo::edk::PendingProcessConnection child;
-
-  base::CommandLine command_line;  // Assume this is appropriately initialized
-
-  // Create a new message pipe with one end being retrievable in the new
-  // process. Note that it doesn't matter whether we call CreateMessagePipe()
-  // before or after Connect(), and we can create as many different pipes as
-  // we like.
-  std::string pipe_token;
-  mojo::ScopedMessagePipeHandle my_pipe = child.CreateMessagePipe(&pipe_token);
-  command_line.AppendSwitchASCII("primordial-pipe", pipe_token);
-
-  base::ProcessHandle child_handle =
-      LaunchCoolChildProcess(command_line, channel.PassClientHandle());
-
-  child.Connect(child_handle, channel.PassServerHandle());
-
-  // We can start using our end of the pipe immediately. Here we assume the
-  // other end will eventually be bound to a local::mojom::Foo implementation,
-  // so we can start making calls on that interface.
-  //
-  // Note that this could even be done before the child process is launched and
-  // it would still work as expected.
-  local::mojom::FooPtr foo;
-  foo.Bind(local::mojom::FooPtrInfo(std::move(my_pipe), 0));
-  foo->DoSomeStuff(42);
-
-  return 0;
-}
-```
-
-and for the launched process:
-
-
-```
-#include "base/command_line.h"
-#include "base/run_loop/run_loop.h"
-#include "base/threading/thread.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/embedder/scoped_ipc_support.h"
-#include "mojo/public/cpp/bindings/binding.h"
-#include "mojo/public/cpp/system/message_pipe.h"
-#include "local/foo.mojom.h"  // You provide this
-
-mojo::edk::ScopedPlatformHandle GetChannelHandle();
-
-class FooImpl : local::mojom::Foo {
- public:
-  explicit FooImpl(local::mojom::FooRequest request)
-      : binding_(this, std::move(request)) {}
-  ~FooImpl() override {}
-
-  void DoSomeStuff(int32_t n) override {
-    // ...
-  }
-
- private:
-  mojo::Binding<local::mojom::Foo> binding_;
-
-  DISALLOW_COPY_AND_ASSIGN(FooImpl);
-};
-
-int main(int argc, char** argv) {
-  base::CommandLine::Init(argc, argv);
-
-  mojo::edk::Init();
-
-  base::Thread ipc_thread("ipc!");
-  ipc_thread.StartWithOptions(
-      base::Thread::Options(base::MessageLoop::TYPE_IO));
-
-  mojo::edk::ScopedIPCSupport ipc_support(
-      ipc_thread.task_runner(),
-      mojo::edk::ScopedIPCSupport::ShutdownPolicy::CLEAN);
-
-  mojo::edk::SetParentPipeHandle(GetChannelHandle());
-
-  mojo::ScopedMessagePipeHandle my_pipe = mojo::edk::CreateChildMessagePipe(
-      base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
-          "primordial-pipe"));
-
-  local::mojom::FooRequest foo_request;
-  foo_request.Bind(std::move(my_pipe));
-  FooImpl impl(std::move(foo_request));
-
-  // Run forever!
-  base::RunLoop().Run();
-
-  return 0;
-}
-```
-
-Note that the above samples assume an interface definition in
-`//local/test.mojom` which would look something like:
-
-```
-module local.mojom;
-
-interface Foo {
-  DoSomeStuff(int32 n);
-};
-```
-
-Once you've bootstrapped your process connection with a real mojom interface,
-you can avoid any further mucking around with EDK APIs or raw message pipe
-handles, as everything beyond this point - including the passing of other
-interface pipes - can be handled eloquently using
-[public bindings APIs](/mojo#High-Level-Bindings-APIs).
-
-## Setting System Properties
-
-The public Mojo C System API exposes a
-[**`MojoGetProperty`**](/mojo/public/c/system#MojoGetProperty) function for
-querying global, embedder-defined property values. These can be set by calling:
-
-```
-mojo::edk::SetProperty(MojoPropertyType type, const void* value)
-```
-
diff --git a/mojo/edk/embedder/configuration.h b/mojo/edk/embedder/configuration.h
deleted file mode 100644
index 1990fb1..0000000
--- a/mojo/edk/embedder/configuration.h
+++ /dev/null
@@ -1,65 +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 MOJO_EDK_EMBEDDER_CONFIGURATION_H_
-#define MOJO_EDK_EMBEDDER_CONFIGURATION_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-namespace mojo {
-namespace edk {
-
-// A set of constants that the Mojo system internally uses. These values should
-// be consistent across all processes on the same system.
-//
-// In general, there should be no need to change these values from their
-// defaults. However, if you do change them, you must do so before
-// initialization.
-struct Configuration {
-  // Maximum number of open (Mojo) handles. The default is 1,000,000.
-  //
-  // TODO(vtl): This doesn't count "live" handles, some of which may live in
-  // messages.
-  size_t max_handle_table_size;
-
-  // Maximum number of active memory mappings. The default is 1,000,000.
-  size_t max_mapping_table_sze;
-
-  // Maximum data size of messages sent over message pipes, in bytes. The
-  // default is 4MB.
-  size_t max_message_num_bytes;
-
-  // Maximum number of handles that can be attached to messages sent over
-  // message pipes. The default is 10,000.
-  size_t max_message_num_handles;
-
-  // Maximum capacity of a data pipe, in bytes. The default is 256MB. This value
-  // must fit into a |uint32_t|. WARNING: If you bump it closer to 2^32, you
-  // must audit all the code to check that we don't overflow (2^31 would
-  // definitely be risky; up to 2^30 is probably okay).
-  size_t max_data_pipe_capacity_bytes;
-
-  // Default data pipe capacity, if not specified explicitly in the creation
-  // options. The default is 1MB.
-  size_t default_data_pipe_capacity_bytes;
-
-  // Alignment for the "start" of the data buffer used by data pipes. (The
-  // alignment of elements will depend on this and the element size.)  The
-  // default is 16 bytes.
-  size_t data_pipe_buffer_alignment_bytes;
-
-  // Maximum size of a single shared memory segment, in bytes. The default is
-  // 1GB.
-  //
-  // TODO(vtl): Set this hard limit appropriately (e.g., higher on 64-bit).
-  // (This will also entail some auditing to make sure I'm not messing up my
-  // checks anywhere.)
-  size_t max_shared_memory_num_bytes;
-};
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_EMBEDDER_CONFIGURATION_H_
diff --git a/mojo/edk/embedder/connection_params.cc b/mojo/edk/embedder/connection_params.cc
deleted file mode 100644
index 9b7ec54..0000000
--- a/mojo/edk/embedder/connection_params.cc
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/embedder/connection_params.h"
-
-#include <utility>
-
-namespace mojo {
-namespace edk {
-
-ConnectionParams::ConnectionParams(ScopedPlatformHandle channel)
-    : channel_(std::move(channel)) {}
-
-ConnectionParams::ConnectionParams(ConnectionParams&& param)
-    : channel_(std::move(param.channel_)) {}
-
-ConnectionParams& ConnectionParams::operator=(ConnectionParams&& param) {
-  channel_ = std::move(param.channel_);
-  return *this;
-}
-
-ScopedPlatformHandle ConnectionParams::TakeChannelHandle() {
-  return std::move(channel_);
-}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/embedder/connection_params.h b/mojo/edk/embedder/connection_params.h
deleted file mode 100644
index 25ffdde..0000000
--- a/mojo/edk/embedder/connection_params.h
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_EMBEDDER_CONNECTION_PARAMS_H_
-#define MOJO_EDK_EMBEDDER_CONNECTION_PARAMS_H_
-
-#include "base/macros.h"
-#include "build/build_config.h"
-#include "mojo/edk/embedder/scoped_platform_handle.h"
-#include "mojo/edk/system/system_impl_export.h"
-
-namespace mojo {
-namespace edk {
-
-class MOJO_SYSTEM_IMPL_EXPORT ConnectionParams {
- public:
-  explicit ConnectionParams(ScopedPlatformHandle channel);
-
-  ConnectionParams(ConnectionParams&& param);
-  ConnectionParams& operator=(ConnectionParams&& param);
-
-  ScopedPlatformHandle TakeChannelHandle();
-
- private:
-  ScopedPlatformHandle channel_;
-
-  DISALLOW_COPY_AND_ASSIGN(ConnectionParams);
-};
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_EMBEDDER_CONNECTION_PARAMS_H_
diff --git a/mojo/edk/embedder/embedder.cc b/mojo/edk/embedder/embedder.cc
deleted file mode 100644
index 0fdda5c..0000000
--- a/mojo/edk/embedder/embedder.cc
+++ /dev/null
@@ -1,158 +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 "mojo/edk/embedder/embedder.h"
-
-#include <stdint.h>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/location.h"
-#include "base/logging.h"
-#include "base/memory/ref_counted.h"
-#include "base/rand_util.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/task_runner.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "mojo/edk/embedder/embedder_internal.h"
-#include "mojo/edk/embedder/entrypoints.h"
-#include "mojo/edk/embedder/platform_channel_pair.h"
-#include "mojo/edk/system/core.h"
-#include "mojo/edk/system/node_controller.h"
-
-#if !defined(OS_NACL)
-#include "crypto/random.h"
-#endif
-
-namespace mojo {
-namespace edk {
-
-class Core;
-class PlatformSupport;
-
-namespace internal {
-
-Core* g_core;
-
-Core* GetCore() { return g_core; }
-
-}  // namespace internal
-
-void SetMaxMessageSize(size_t bytes) {
-}
-
-void SetParentPipeHandle(ScopedPlatformHandle pipe) {
-  CHECK(internal::g_core);
-  internal::g_core->InitChild(ConnectionParams(std::move(pipe)));
-}
-
-void SetParentPipeHandleFromCommandLine() {
-  ScopedPlatformHandle platform_channel =
-      PlatformChannelPair::PassClientHandleFromParentProcess(
-          *base::CommandLine::ForCurrentProcess());
-  CHECK(platform_channel.is_valid());
-  SetParentPipeHandle(std::move(platform_channel));
-}
-
-ScopedMessagePipeHandle ConnectToPeerProcess(ScopedPlatformHandle pipe) {
-  return ConnectToPeerProcess(std::move(pipe), GenerateRandomToken());
-}
-
-ScopedMessagePipeHandle ConnectToPeerProcess(ScopedPlatformHandle pipe,
-                                             const std::string& peer_token) {
-  DCHECK(pipe.is_valid());
-  DCHECK(!peer_token.empty());
-  return internal::g_core->ConnectToPeerProcess(std::move(pipe), peer_token);
-}
-
-void ClosePeerConnection(const std::string& peer_token) {
-  return internal::g_core->ClosePeerConnection(peer_token);
-}
-
-void Init() {
-  MojoSystemThunks thunks = MakeSystemThunks();
-  size_t expected_size = MojoEmbedderSetSystemThunks(&thunks);
-  DCHECK_EQ(expected_size, sizeof(thunks));
-
-  internal::g_core = new Core();
-}
-
-void SetDefaultProcessErrorCallback(const ProcessErrorCallback& callback) {
-  internal::g_core->SetDefaultProcessErrorCallback(callback);
-}
-
-MojoResult CreatePlatformHandleWrapper(
-    ScopedPlatformHandle platform_handle,
-    MojoHandle* platform_handle_wrapper_handle) {
-  return internal::g_core->CreatePlatformHandleWrapper(
-      std::move(platform_handle), platform_handle_wrapper_handle);
-}
-
-MojoResult PassWrappedPlatformHandle(MojoHandle platform_handle_wrapper_handle,
-                                     ScopedPlatformHandle* platform_handle) {
-  return internal::g_core->PassWrappedPlatformHandle(
-      platform_handle_wrapper_handle, platform_handle);
-}
-
-MojoResult CreateSharedBufferWrapper(
-    base::SharedMemoryHandle shared_memory_handle,
-    size_t num_bytes,
-    bool read_only,
-    MojoHandle* mojo_wrapper_handle) {
-  return internal::g_core->CreateSharedBufferWrapper(
-      shared_memory_handle, num_bytes, read_only, mojo_wrapper_handle);
-}
-
-MojoResult PassSharedMemoryHandle(
-    MojoHandle mojo_handle,
-    base::SharedMemoryHandle* shared_memory_handle,
-    size_t* num_bytes,
-    bool* read_only) {
-  return internal::g_core->PassSharedMemoryHandle(
-      mojo_handle, shared_memory_handle, num_bytes, read_only);
-}
-
-void InitIPCSupport(scoped_refptr<base::TaskRunner> io_thread_task_runner) {
-  CHECK(internal::g_core);
-  internal::g_core->SetIOTaskRunner(io_thread_task_runner);
-}
-
-scoped_refptr<base::TaskRunner> GetIOTaskRunner() {
-  return internal::g_core->GetNodeController()->io_task_runner();
-}
-
-void ShutdownIPCSupport(const base::Closure& callback) {
-  CHECK(internal::g_core);
-  internal::g_core->RequestShutdown(callback);
-}
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-void SetMachPortProvider(base::PortProvider* port_provider) {
-  DCHECK(port_provider);
-  internal::g_core->SetMachPortProvider(port_provider);
-}
-#endif
-
-ScopedMessagePipeHandle CreateChildMessagePipe(const std::string& token) {
-  return internal::g_core->CreateChildMessagePipe(token);
-}
-
-std::string GenerateRandomToken() {
-  char random_bytes[16];
-#if defined(OS_NACL)
-  // Not secure. For NaCl only!
-  base::RandBytes(random_bytes, 16);
-#else
-  crypto::RandBytes(random_bytes, 16);
-#endif
-  return base::HexEncode(random_bytes, 16);
-}
-
-MojoResult SetProperty(MojoPropertyType type, const void* value) {
-  CHECK(internal::g_core);
-  return internal::g_core->SetProperty(type, value);
-}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/embedder/embedder.h b/mojo/edk/embedder/embedder.h
deleted file mode 100644
index 97258e5..0000000
--- a/mojo/edk/embedder/embedder.h
+++ /dev/null
@@ -1,173 +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 MOJO_EDK_EMBEDDER_EMBEDDER_H_
-#define MOJO_EDK_EMBEDDER_EMBEDDER_H_
-
-#include <stddef.h>
-
-#include <memory>
-#include <string>
-
-#include "base/callback.h"
-#include "base/command_line.h"
-#include "base/memory/ref_counted.h"
-#include "base/memory/shared_memory_handle.h"
-#include "base/process/process_handle.h"
-#include "base/task_runner.h"
-#include "mojo/edk/embedder/pending_process_connection.h"
-#include "mojo/edk/embedder/scoped_platform_handle.h"
-#include "mojo/edk/system/system_impl_export.h"
-#include "mojo/public/cpp/system/message_pipe.h"
-
-namespace base {
-class PortProvider;
-}
-
-namespace mojo {
-namespace edk {
-
-// Basic configuration/initialization ------------------------------------------
-
-// |Init()| sets up the basic Mojo system environment, making the |Mojo...()|
-// functions available and functional. This is never shut down (except in tests
-// -- see test_embedder.h).
-
-// Allows changing the default max message size. Must be called before Init.
-MOJO_SYSTEM_IMPL_EXPORT void SetMaxMessageSize(size_t bytes);
-
-// Should be called as early as possible in a child process with a handle to the
-// other end of a pipe provided in the parent to
-// PendingProcessConnection::Connect.
-MOJO_SYSTEM_IMPL_EXPORT void SetParentPipeHandle(ScopedPlatformHandle pipe);
-
-// Same as above but extracts the pipe handle from the command line. See
-// PlatformChannelPair for details.
-MOJO_SYSTEM_IMPL_EXPORT void SetParentPipeHandleFromCommandLine();
-
-// Called to connect to a peer process. This should be called only if there
-// is no common ancestor for the processes involved within this mojo system.
-// Both processes must call this function, each passing one end of a platform
-// channel. This returns one end of a message pipe to each process.
-MOJO_SYSTEM_IMPL_EXPORT ScopedMessagePipeHandle
-ConnectToPeerProcess(ScopedPlatformHandle pipe);
-
-// Called to connect to a peer process. This should be called only if there
-// is no common ancestor for the processes involved within this mojo system.
-// Both processes must call this function, each passing one end of a platform
-// channel. This returns one end of a message pipe to each process. |peer_token|
-// may be passed to ClosePeerConnection() to close the connection.
-MOJO_SYSTEM_IMPL_EXPORT ScopedMessagePipeHandle
-ConnectToPeerProcess(ScopedPlatformHandle pipe, const std::string& peer_token);
-
-// Closes a connection to a peer process created by ConnectToPeerProcess()
-// where the same |peer_token| was used.
-MOJO_SYSTEM_IMPL_EXPORT void ClosePeerConnection(const std::string& peer_token);
-
-// Must be called first, or just after setting configuration parameters, to
-// initialize the (global, singleton) system.
-MOJO_SYSTEM_IMPL_EXPORT void Init();
-
-// Sets a default callback to invoke when an internal error is reported but
-// cannot be associated with a specific child process.
-MOJO_SYSTEM_IMPL_EXPORT void SetDefaultProcessErrorCallback(
-    const ProcessErrorCallback& callback);
-
-// Basic functions -------------------------------------------------------------
-
-// The functions in this section are available once |Init()| has been called.
-
-// Creates a |MojoHandle| that wraps the given |PlatformHandle| (taking
-// ownership of it). This |MojoHandle| can then, e.g., be passed through message
-// pipes. Note: This takes ownership (and thus closes) |platform_handle| even on
-// failure, which is different from what you'd expect from a Mojo API, but it
-// makes for a more convenient embedder API.
-MOJO_SYSTEM_IMPL_EXPORT MojoResult
-CreatePlatformHandleWrapper(ScopedPlatformHandle platform_handle,
-                            MojoHandle* platform_handle_wrapper_handle);
-
-// Retrieves the |PlatformHandle| that was wrapped into a |MojoHandle| (using
-// |CreatePlatformHandleWrapper()| above). Note that the |MojoHandle| is closed
-// on success.
-MOJO_SYSTEM_IMPL_EXPORT MojoResult
-PassWrappedPlatformHandle(MojoHandle platform_handle_wrapper_handle,
-                          ScopedPlatformHandle* platform_handle);
-
-// Creates a |MojoHandle| that wraps the given |SharedMemoryHandle| (taking
-// ownership of it). |num_bytes| is the size of the shared memory object, and
-// |read_only| is whether the handle is a read-only handle to shared memory.
-// This |MojoHandle| is a Mojo shared buffer and can be manipulated using the
-// shared buffer functions and transferred over a message pipe.
-MOJO_SYSTEM_IMPL_EXPORT MojoResult
-CreateSharedBufferWrapper(base::SharedMemoryHandle shared_memory_handle,
-                          size_t num_bytes,
-                          bool read_only,
-                          MojoHandle* mojo_wrapper_handle);
-
-// Retrieves the underlying |SharedMemoryHandle| from a shared buffer
-// |MojoHandle| and closes the handle. If successful, |num_bytes| will contain
-// the size of the shared memory buffer and |read_only| will contain whether the
-// buffer handle is read-only. Both |num_bytes| and |read_only| may be null.
-// Note: The value of |shared_memory_handle| may be
-// base::SharedMemory::NULLHandle(), even if this function returns success.
-// Callers should perform appropriate checks.
-MOJO_SYSTEM_IMPL_EXPORT MojoResult
-PassSharedMemoryHandle(MojoHandle mojo_handle,
-                       base::SharedMemoryHandle* shared_memory_handle,
-                       size_t* num_bytes,
-                       bool* read_only);
-
-// Initialialization/shutdown for interprocess communication (IPC) -------------
-
-// |InitIPCSupport()| sets up the subsystem for interprocess communication,
-// making the IPC functions (in the following section) available and functional.
-// (This may only be done after |Init()|.)
-//
-// This subsystem may be shut down using |ShutdownIPCSupport()|. None of the IPC
-// functions may be called after this is called.
-//
-// |io_thread_task_runner| should live at least until |ShutdownIPCSupport()|'s
-// callback has been run.
-MOJO_SYSTEM_IMPL_EXPORT void InitIPCSupport(
-    scoped_refptr<base::TaskRunner> io_thread_task_runner);
-
-// Retrieves the TaskRunner used for IPC I/O, as set by InitIPCSupport.
-MOJO_SYSTEM_IMPL_EXPORT scoped_refptr<base::TaskRunner> GetIOTaskRunner();
-
-// Shuts down the subsystem initialized by |InitIPCSupport()|. It be called from
-// any thread and will attempt to complete shutdown on the I/O thread with which
-// the system was initialized. Upon completion, |callback| is invoked on an
-// arbitrary thread.
-MOJO_SYSTEM_IMPL_EXPORT void ShutdownIPCSupport(const base::Closure& callback);
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-// Set the |base::PortProvider| for this process. Can be called on any thread,
-// but must be set in the root process before any Mach ports can be transferred.
-MOJO_SYSTEM_IMPL_EXPORT void SetMachPortProvider(
-    base::PortProvider* port_provider);
-#endif
-
-// Creates a message pipe from a token in a child process. This token must have
-// been acquired by a corresponding call to
-// PendingProcessConnection::CreateMessagePipe.
-MOJO_SYSTEM_IMPL_EXPORT ScopedMessagePipeHandle
-CreateChildMessagePipe(const std::string& token);
-
-// Generates a random ASCII token string for use with various APIs that expect
-// a globally unique token string.
-MOJO_SYSTEM_IMPL_EXPORT std::string GenerateRandomToken();
-
-// Sets system properties that can be read by the MojoGetProperty() API. See the
-// documentation for MojoPropertyType for supported property types and their
-// corresponding value type.
-//
-// Default property values:
-//   |MOJO_PROPERTY_TYPE_SYNC_CALL_ALLOWED| - true
-MOJO_SYSTEM_IMPL_EXPORT MojoResult SetProperty(MojoPropertyType type,
-                                               const void* value);
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_EMBEDDER_EMBEDDER_H_
diff --git a/mojo/edk/embedder/embedder_internal.h b/mojo/edk/embedder/embedder_internal.h
deleted file mode 100644
index 7deeca1..0000000
--- a/mojo/edk/embedder/embedder_internal.h
+++ /dev/null
@@ -1,44 +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.
-
-// This header contains internal details for the *implementation* of the
-// embedder API. It should not be included by any public header (nor by users of
-// the embedder API).
-
-#ifndef MOJO_EDK_EMBEDDER_EMBEDDER_INTERNAL_H_
-#define MOJO_EDK_EMBEDDER_EMBEDDER_INTERNAL_H_
-
-#include <stdint.h>
-
-#include "mojo/edk/system/system_impl_export.h"
-
-namespace base {
-class TaskRunner;
-}
-
-namespace mojo {
-
-namespace edk {
-
-class Broker;
-class Core;
-class ProcessDelegate;
-
-namespace internal {
-
-// Instance of |Broker| to use.
-extern Broker* g_broker;
-
-// Instance of |Core| used by the system functions (|Mojo...()|).
-extern MOJO_SYSTEM_IMPL_EXPORT Core* g_core;
-extern base::TaskRunner* g_delegate_thread_task_runner;
-extern ProcessDelegate* g_process_delegate;
-
-}  // namespace internal
-
-}  // namepace edk
-
-}  // namespace mojo
-
-#endif  // MOJO_EDK_EMBEDDER_EMBEDDER_INTERNAL_H_
diff --git a/mojo/edk/embedder/embedder_unittest.cc b/mojo/edk/embedder/embedder_unittest.cc
deleted file mode 100644
index 388b45c..0000000
--- a/mojo/edk/embedder/embedder_unittest.cc
+++ /dev/null
@@ -1,603 +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 "mojo/edk/embedder/embedder.h"
-
-#include <stddef.h>
-#include <stdint.h>
-#include <string.h>
-
-#include <utility>
-
-#include "base/base_paths.h"
-#include "base/bind.h"
-#include "base/command_line.h"
-#include "base/files/file.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "base/memory/shared_memory.h"
-#include "base/message_loop/message_loop.h"
-#include "base/path_service.h"
-#include "base/process/process_handle.h"
-#include "base/run_loop.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/test/test_timeouts.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/embedder/named_platform_handle.h"
-#include "mojo/edk/embedder/named_platform_handle_utils.h"
-#include "mojo/edk/embedder/pending_process_connection.h"
-#include "mojo/edk/embedder/platform_channel_pair.h"
-#include "mojo/edk/embedder/test_embedder.h"
-#include "mojo/edk/system/test_utils.h"
-#include "mojo/edk/test/mojo_test_base.h"
-#include "mojo/public/c/system/core.h"
-#include "mojo/public/cpp/system/handle.h"
-#include "mojo/public/cpp/system/message_pipe.h"
-#include "mojo/public/cpp/system/wait.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace edk {
-namespace {
-
-// The multiprocess tests that use these don't compile on iOS.
-#if !defined(OS_IOS)
-const char kHelloWorld[] = "hello world";
-const char kByeWorld[] = "bye world";
-#endif
-
-using EmbedderTest = test::MojoTestBase;
-
-TEST_F(EmbedderTest, ChannelBasic) {
-  MojoHandle server_mp, client_mp;
-  CreateMessagePipe(&server_mp, &client_mp);
-
-  const std::string kHello = "hello";
-
-  // We can write to a message pipe handle immediately.
-  WriteMessage(server_mp, kHello);
-  EXPECT_EQ(kHello, ReadMessage(client_mp));
-
-  ASSERT_EQ(MOJO_RESULT_OK, MojoClose(server_mp));
-  ASSERT_EQ(MOJO_RESULT_OK, MojoClose(client_mp));
-}
-
-// Verifies that a MP with pending messages to be written can be sent and the
-// pending messages aren't dropped.
-TEST_F(EmbedderTest, SendMessagePipeWithWriteQueue) {
-  MojoHandle server_mp, client_mp;
-  CreateMessagePipe(&server_mp, &client_mp);
-
-  MojoHandle server_mp2, client_mp2;
-  CreateMessagePipe(&server_mp2, &client_mp2);
-
-  static const size_t kNumMessages = 1001;
-  for (size_t i = 1; i <= kNumMessages; i++)
-    WriteMessage(client_mp2, std::string(i, 'A' + (i % 26)));
-
-  // Now send client2.
-  WriteMessageWithHandles(server_mp, "hey", &client_mp2, 1);
-  client_mp2 = MOJO_HANDLE_INVALID;
-
-  // Read client2 just so we can close it later.
-  EXPECT_EQ("hey", ReadMessageWithHandles(client_mp, &client_mp2, 1));
-  EXPECT_NE(MOJO_HANDLE_INVALID, client_mp2);
-
-  // Now verify that all the messages that were written were sent correctly.
-  for (size_t i = 1; i <= kNumMessages; i++)
-    ASSERT_EQ(std::string(i, 'A' + (i % 26)), ReadMessage(server_mp2));
-
-  ASSERT_EQ(MOJO_RESULT_OK, MojoClose(server_mp2));
-  ASSERT_EQ(MOJO_RESULT_OK, MojoClose(client_mp2));
-  ASSERT_EQ(MOJO_RESULT_OK, MojoClose(server_mp));
-  ASSERT_EQ(MOJO_RESULT_OK, MojoClose(client_mp));
-}
-
-TEST_F(EmbedderTest, ChannelsHandlePassing) {
-  MojoHandle server_mp, client_mp;
-  CreateMessagePipe(&server_mp, &client_mp);
-  EXPECT_NE(server_mp, MOJO_HANDLE_INVALID);
-  EXPECT_NE(client_mp, MOJO_HANDLE_INVALID);
-
-  MojoHandle h0, h1;
-  CreateMessagePipe(&h0, &h1);
-
-  // Write a message to |h0| (attaching nothing).
-  const std::string kHello = "hello";
-  WriteMessage(h0, kHello);
-
-  // Write one message to |server_mp|, attaching |h1|.
-  const std::string kWorld = "world!!!";
-  WriteMessageWithHandles(server_mp, kWorld, &h1, 1);
-  h1 = MOJO_HANDLE_INVALID;
-
-  // Write another message to |h0|.
-  const std::string kFoo = "foo";
-  WriteMessage(h0, kFoo);
-
-  // Wait for |client_mp| to become readable and read a message from it.
-  EXPECT_EQ(kWorld, ReadMessageWithHandles(client_mp, &h1, 1));
-  EXPECT_NE(h1, MOJO_HANDLE_INVALID);
-
-  // Wait for |h1| to become readable and read a message from it.
-  EXPECT_EQ(kHello, ReadMessage(h1));
-
-  // Wait for |h1| to become readable (again) and read its second message.
-  EXPECT_EQ(kFoo, ReadMessage(h1));
-
-  // Write a message to |h1|.
-  const std::string kBarBaz = "barbaz";
-  WriteMessage(h1, kBarBaz);
-
-  // Wait for |h0| to become readable and read a message from it.
-  EXPECT_EQ(kBarBaz, ReadMessage(h0));
-
-  ASSERT_EQ(MOJO_RESULT_OK, MojoClose(server_mp));
-  ASSERT_EQ(MOJO_RESULT_OK, MojoClose(client_mp));
-  ASSERT_EQ(MOJO_RESULT_OK, MojoClose(h0));
-  ASSERT_EQ(MOJO_RESULT_OK, MojoClose(h1));
-}
-
-TEST_F(EmbedderTest, PipeSetup) {
-  // Ensures that a pending process connection's message pipe can be claimed by
-  // the host process itself.
-  PendingProcessConnection process;
-  std::string pipe_token;
-  ScopedMessagePipeHandle parent_mp = process.CreateMessagePipe(&pipe_token);
-  ScopedMessagePipeHandle child_mp = CreateChildMessagePipe(pipe_token);
-
-  const std::string kHello = "hello";
-  WriteMessage(parent_mp.get().value(), kHello);
-
-  EXPECT_EQ(kHello, ReadMessage(child_mp.get().value()));
-}
-
-TEST_F(EmbedderTest, PipeSetup_LaunchDeath) {
-  PlatformChannelPair pair;
-
-  PendingProcessConnection process;
-  std::string pipe_token;
-  ScopedMessagePipeHandle parent_mp = process.CreateMessagePipe(&pipe_token);
-  process.Connect(base::GetCurrentProcessHandle(),
-                  ConnectionParams(pair.PassServerHandle()));
-
-  // Close the remote end, simulating child death before the child connects to
-  // the reserved port.
-  ignore_result(pair.PassClientHandle());
-
-  EXPECT_EQ(MOJO_RESULT_OK, WaitForSignals(parent_mp.get().value(),
-                                           MOJO_HANDLE_SIGNAL_PEER_CLOSED));
-}
-
-TEST_F(EmbedderTest, PipeSetup_LaunchFailure) {
-  PlatformChannelPair pair;
-
-  auto process = base::MakeUnique<PendingProcessConnection>();
-  std::string pipe_token;
-  ScopedMessagePipeHandle parent_mp = process->CreateMessagePipe(&pipe_token);
-
-  // Ensure that if a PendingProcessConnection goes away before Connect() is
-  // called, any message pipes associated with it detect peer closure.
-  process.reset();
-
-  EXPECT_EQ(MOJO_RESULT_OK, WaitForSignals(parent_mp.get().value(),
-                                           MOJO_HANDLE_SIGNAL_PEER_CLOSED));
-}
-
-// The sequence of messages sent is:
-//       server_mp   client_mp   mp0         mp1         mp2         mp3
-//   1.  "hello"
-//   2.              "world!"
-//   3.                          "FOO"
-//   4.  "Bar"+mp1
-//   5.  (close)
-//   6.              (close)
-//   7.                                                              "baz"
-//   8.                                                              (closed)
-//   9.                                      "quux"+mp2
-//  10.                          (close)
-//  11.                                      (wait/cl.)
-//  12.                                                  (wait/cl.)
-
-#if !defined(OS_IOS)
-
-TEST_F(EmbedderTest, MultiprocessChannels) {
-  RUN_CHILD_ON_PIPE(MultiprocessChannelsClient, server_mp)
-    // 1. Write a message to |server_mp| (attaching nothing).
-    WriteMessage(server_mp, "hello");
-
-    // 2. Read a message from |server_mp|.
-    EXPECT_EQ("world!", ReadMessage(server_mp));
-
-    // 3. Create a new message pipe (endpoints |mp0| and |mp1|).
-    MojoHandle mp0, mp1;
-    CreateMessagePipe(&mp0, &mp1);
-
-    // 4. Write something to |mp0|.
-    WriteMessage(mp0, "FOO");
-
-    // 5. Write a message to |server_mp|, attaching |mp1|.
-    WriteMessageWithHandles(server_mp, "Bar", &mp1, 1);
-    mp1 = MOJO_HANDLE_INVALID;
-
-    // 6. Read a message from |mp0|, which should have |mp2| attached.
-    MojoHandle mp2 = MOJO_HANDLE_INVALID;
-    EXPECT_EQ("quux", ReadMessageWithHandles(mp0, &mp2, 1));
-
-    // 7. Read a message from |mp2|.
-    EXPECT_EQ("baz", ReadMessage(mp2));
-
-    // 8. Close |mp0|.
-    ASSERT_EQ(MOJO_RESULT_OK, MojoClose(mp0));
-
-    // 9. Tell the client to quit.
-    WriteMessage(server_mp, "quit");
-
-    // 10. Wait on |mp2| (which should eventually fail) and then close it.
-    MojoHandleSignalsState state;
-    ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-              WaitForSignals(mp2, MOJO_HANDLE_SIGNAL_READABLE, &state));
-    ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, state.satisfied_signals);
-    ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, state.satisfiable_signals);
-
-    ASSERT_EQ(MOJO_RESULT_OK, MojoClose(mp2));
-  END_CHILD()
-}
-
-DEFINE_TEST_CLIENT_TEST_WITH_PIPE(MultiprocessChannelsClient, EmbedderTest,
-                                  client_mp) {
-  // 1. Read the first message from |client_mp|.
-  EXPECT_EQ("hello", ReadMessage(client_mp));
-
-  // 2. Write a message to |client_mp| (attaching nothing).
-  WriteMessage(client_mp, "world!");
-
-  // 4. Read a message from |client_mp|, which should have |mp1| attached.
-  MojoHandle mp1;
-  EXPECT_EQ("Bar", ReadMessageWithHandles(client_mp, &mp1, 1));
-
-  // 5. Create a new message pipe (endpoints |mp2| and |mp3|).
-  MojoHandle mp2, mp3;
-  CreateMessagePipe(&mp2, &mp3);
-
-  // 6. Write a message to |mp3|.
-  WriteMessage(mp3, "baz");
-
-  // 7. Close |mp3|.
-  ASSERT_EQ(MOJO_RESULT_OK, MojoClose(mp3));
-
-  // 8. Write a message to |mp1|, attaching |mp2|.
-  WriteMessageWithHandles(mp1, "quux", &mp2, 1);
-  mp2 = MOJO_HANDLE_INVALID;
-
-  // 9. Read a message from |mp1|.
-  EXPECT_EQ("FOO", ReadMessage(mp1));
-
-  EXPECT_EQ("quit", ReadMessage(client_mp));
-
-  // 10. Wait on |mp1| (which should eventually fail) and then close it.
-  MojoHandleSignalsState state;
-  ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-            WaitForSignals(mp1, MOJO_HANDLE_SIGNAL_READABLE, &state));
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, state.satisfied_signals);
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, state.satisfiable_signals);
-  ASSERT_EQ(MOJO_RESULT_OK, MojoClose(mp1));
-}
-
-TEST_F(EmbedderTest, MultiprocessBaseSharedMemory) {
-  RUN_CHILD_ON_PIPE(MultiprocessSharedMemoryClient, server_mp)
-    // 1. Create a base::SharedMemory object and create a mojo shared buffer
-    // from it.
-    base::SharedMemoryCreateOptions options;
-    options.size = 123;
-    base::SharedMemory shared_memory;
-    ASSERT_TRUE(shared_memory.Create(options));
-    base::SharedMemoryHandle shm_handle = base::SharedMemory::DuplicateHandle(
-        shared_memory.handle());
-    MojoHandle sb1;
-    ASSERT_EQ(MOJO_RESULT_OK,
-              CreateSharedBufferWrapper(shm_handle, 123, false, &sb1));
-
-    // 2. Map |sb1| and write something into it.
-    char* buffer = nullptr;
-    ASSERT_EQ(MOJO_RESULT_OK,
-              MojoMapBuffer(sb1, 0, 123, reinterpret_cast<void**>(&buffer), 0));
-    ASSERT_TRUE(buffer);
-    memcpy(buffer, kHelloWorld, sizeof(kHelloWorld));
-
-    // 3. Duplicate |sb1| into |sb2| and pass to |server_mp|.
-    MojoHandle sb2 = MOJO_HANDLE_INVALID;
-    EXPECT_EQ(MOJO_RESULT_OK, MojoDuplicateBufferHandle(sb1, 0, &sb2));
-    EXPECT_NE(MOJO_HANDLE_INVALID, sb2);
-    WriteMessageWithHandles(server_mp, "hello", &sb2, 1);
-
-    // 4. Read a message from |server_mp|.
-    EXPECT_EQ("bye", ReadMessage(server_mp));
-
-    // 5. Expect that the contents of the shared buffer have changed.
-    EXPECT_EQ(kByeWorld, std::string(buffer));
-
-    // 6. Map the original base::SharedMemory and expect it contains the
-    // expected value.
-    ASSERT_TRUE(shared_memory.Map(123));
-    EXPECT_EQ(kByeWorld,
-              std::string(static_cast<char*>(shared_memory.memory())));
-
-    ASSERT_EQ(MOJO_RESULT_OK, MojoClose(sb1));
-  END_CHILD()
-}
-
-DEFINE_TEST_CLIENT_TEST_WITH_PIPE(MultiprocessSharedMemoryClient, EmbedderTest,
-                                  client_mp) {
-  // 1. Read the first message from |client_mp|, which should have |sb1| which
-  // should be a shared buffer handle.
-  MojoHandle sb1;
-  EXPECT_EQ("hello", ReadMessageWithHandles(client_mp, &sb1, 1));
-
-  // 2. Map |sb1|.
-  char* buffer = nullptr;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            MojoMapBuffer(sb1, 0, 123, reinterpret_cast<void**>(&buffer), 0));
-  ASSERT_TRUE(buffer);
-
-  // 3. Ensure |buffer| contains the values we expect.
-  EXPECT_EQ(kHelloWorld, std::string(buffer));
-
-  // 4. Write into |buffer| and send a message back.
-  memcpy(buffer, kByeWorld, sizeof(kByeWorld));
-  WriteMessage(client_mp, "bye");
-
-  // 5. Extract the shared memory handle and ensure we can map it and read the
-  // contents.
-  base::SharedMemoryHandle shm_handle;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            PassSharedMemoryHandle(sb1, &shm_handle, nullptr, nullptr));
-  base::SharedMemory shared_memory(shm_handle, false);
-  ASSERT_TRUE(shared_memory.Map(123));
-  EXPECT_NE(buffer, shared_memory.memory());
-  EXPECT_EQ(kByeWorld, std::string(static_cast<char*>(shared_memory.memory())));
-
-  // 6. Close |sb1|. Should fail because |PassSharedMemoryHandle()| should have
-  // closed the handle.
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(sb1));
-}
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-TEST_F(EmbedderTest, MultiprocessMachSharedMemory) {
-  RUN_CHILD_ON_PIPE(MultiprocessSharedMemoryClient, server_mp)
-    // 1. Create a Mach base::SharedMemory object and create a mojo shared
-    // buffer from it.
-    base::SharedMemoryCreateOptions options;
-    options.size = 123;
-    base::SharedMemory shared_memory;
-    ASSERT_TRUE(shared_memory.Create(options));
-    base::SharedMemoryHandle shm_handle = base::SharedMemory::DuplicateHandle(
-        shared_memory.handle());
-    MojoHandle sb1;
-    ASSERT_EQ(MOJO_RESULT_OK,
-              CreateSharedBufferWrapper(shm_handle, 123, false, &sb1));
-
-    // 2. Map |sb1| and write something into it.
-    char* buffer = nullptr;
-    ASSERT_EQ(MOJO_RESULT_OK,
-              MojoMapBuffer(sb1, 0, 123, reinterpret_cast<void**>(&buffer), 0));
-    ASSERT_TRUE(buffer);
-    memcpy(buffer, kHelloWorld, sizeof(kHelloWorld));
-
-    // 3. Duplicate |sb1| into |sb2| and pass to |server_mp|.
-    MojoHandle sb2 = MOJO_HANDLE_INVALID;
-    EXPECT_EQ(MOJO_RESULT_OK, MojoDuplicateBufferHandle(sb1, 0, &sb2));
-    EXPECT_NE(MOJO_HANDLE_INVALID, sb2);
-    WriteMessageWithHandles(server_mp, "hello", &sb2, 1);
-
-    // 4. Read a message from |server_mp|.
-    EXPECT_EQ("bye", ReadMessage(server_mp));
-
-    // 5. Expect that the contents of the shared buffer have changed.
-    EXPECT_EQ(kByeWorld, std::string(buffer));
-
-    // 6. Map the original base::SharedMemory and expect it contains the
-    // expected value.
-    ASSERT_TRUE(shared_memory.Map(123));
-    EXPECT_EQ(kByeWorld,
-              std::string(static_cast<char*>(shared_memory.memory())));
-
-    ASSERT_EQ(MOJO_RESULT_OK, MojoClose(sb1));
-  END_CHILD()
-}
-
-enum class HandleType {
-  POSIX,
-  MACH,
-  MACH_NULL,
-};
-
-const HandleType kTestHandleTypes[] = {
-  HandleType::MACH,
-  HandleType::MACH_NULL,
-  HandleType::POSIX,
-  HandleType::POSIX,
-  HandleType::MACH,
-};
-
-// Test that we can mix file descriptors and mach port handles.
-TEST_F(EmbedderTest, MultiprocessMixMachAndFds) {
-  const size_t kShmSize = 1234;
-  RUN_CHILD_ON_PIPE(MultiprocessMixMachAndFdsClient, server_mp)
-    // 1. Create fds or Mach objects and mojo handles from them.
-    MojoHandle platform_handles[arraysize(kTestHandleTypes)];
-    for (size_t i = 0; i < arraysize(kTestHandleTypes); i++) {
-      const auto type = kTestHandleTypes[i];
-      ScopedPlatformHandle scoped_handle;
-      if (type == HandleType::POSIX) {
-        // The easiest source of fds is opening /dev/null.
-        base::File file(base::FilePath("/dev/null"),
-                        base::File::FLAG_OPEN | base::File::FLAG_WRITE);
-        ASSERT_TRUE(file.IsValid());
-        scoped_handle.reset(PlatformHandle(file.TakePlatformFile()));
-        EXPECT_EQ(PlatformHandle::Type::POSIX, scoped_handle.get().type);
-      } else if (type == HandleType::MACH_NULL) {
-        scoped_handle.reset(PlatformHandle(
-            static_cast<mach_port_t>(MACH_PORT_NULL)));
-        EXPECT_EQ(PlatformHandle::Type::MACH, scoped_handle.get().type);
-      } else {
-        base::SharedMemoryCreateOptions options;
-        options.size = kShmSize;
-        base::SharedMemory shared_memory;
-        ASSERT_TRUE(shared_memory.Create(options));
-        base::SharedMemoryHandle shm_handle =
-            base::SharedMemory::DuplicateHandle(shared_memory.handle());
-        scoped_handle.reset(PlatformHandle(shm_handle.GetMemoryObject()));
-        EXPECT_EQ(PlatformHandle::Type::MACH, scoped_handle.get().type);
-      }
-      ASSERT_EQ(MOJO_RESULT_OK, CreatePlatformHandleWrapper(
-          std::move(scoped_handle), platform_handles + i));
-    }
-
-    // 2. Send all the handles to the child.
-    WriteMessageWithHandles(server_mp, "hello", platform_handles,
-                            arraysize(kTestHandleTypes));
-
-    // 3. Read a message from |server_mp|.
-    EXPECT_EQ("bye", ReadMessage(server_mp));
-  END_CHILD()
-}
-
-DEFINE_TEST_CLIENT_TEST_WITH_PIPE(MultiprocessMixMachAndFdsClient, EmbedderTest,
-                                  client_mp) {
-  const int kNumHandles = arraysize(kTestHandleTypes);
-  MojoHandle platform_handles[kNumHandles];
-
-  // 1. Read from |client_mp|, which should have a message containing
-  // |kNumHandles| handles.
-  EXPECT_EQ("hello",
-            ReadMessageWithHandles(client_mp, platform_handles, kNumHandles));
-
-  // 2. Extract each handle, and verify the type.
-  for (int i = 0; i < kNumHandles; i++) {
-    const auto type = kTestHandleTypes[i];
-    ScopedPlatformHandle scoped_handle;
-    ASSERT_EQ(MOJO_RESULT_OK,
-              PassWrappedPlatformHandle(platform_handles[i], &scoped_handle));
-    if (type == HandleType::POSIX) {
-      EXPECT_NE(0, scoped_handle.get().handle);
-      EXPECT_EQ(PlatformHandle::Type::POSIX, scoped_handle.get().type);
-    } else if (type == HandleType::MACH_NULL) {
-      EXPECT_EQ(static_cast<mach_port_t>(MACH_PORT_NULL),
-                scoped_handle.get().port);
-      EXPECT_EQ(PlatformHandle::Type::MACH, scoped_handle.get().type);
-    } else {
-      EXPECT_NE(static_cast<mach_port_t>(MACH_PORT_NULL),
-                scoped_handle.get().port);
-      EXPECT_EQ(PlatformHandle::Type::MACH, scoped_handle.get().type);
-    }
-  }
-
-  // 3. Say bye!
-  WriteMessage(client_mp, "bye");
-}
-
-#endif  // defined(OS_MACOSX) && !defined(OS_IOS)
-
-// TODO(vtl): Test immediate write & close.
-// TODO(vtl): Test broken-connection cases.
-
-#endif  // !defined(OS_IOS)
-
-NamedPlatformHandle GenerateChannelName() {
-#if defined(OS_POSIX)
-  base::FilePath temp_dir;
-  CHECK(base::PathService::Get(base::DIR_TEMP, &temp_dir));
-  return NamedPlatformHandle(
-      temp_dir.AppendASCII(GenerateRandomToken()).value());
-#else
-  return NamedPlatformHandle(GenerateRandomToken());
-#endif
-}
-
-void CreateClientHandleOnIoThread(const NamedPlatformHandle& named_handle,
-                                  ScopedPlatformHandle* output) {
-  *output = CreateClientHandle(named_handle);
-}
-
-TEST_F(EmbedderTest, ClosePendingPeerConnection) {
-  NamedPlatformHandle named_handle = GenerateChannelName();
-  std::string peer_token = GenerateRandomToken();
-  ScopedMessagePipeHandle server_pipe =
-      ConnectToPeerProcess(CreateServerHandle(named_handle), peer_token);
-  ClosePeerConnection(peer_token);
-  EXPECT_EQ(MOJO_RESULT_OK,
-            Wait(server_pipe.get(), MOJO_HANDLE_SIGNAL_PEER_CLOSED));
-  base::MessageLoop message_loop;
-  base::RunLoop run_loop;
-  ScopedPlatformHandle client_handle;
-  // Closing the channel involves posting a task to the IO thread to do the
-  // work. By the time the local message pipe has been observerd as closed,
-  // that task will have been posted. Therefore, a task to create the client
-  // connection should be handled after the channel is closed.
-  GetIOTaskRunner()->PostTaskAndReply(
-      FROM_HERE,
-      base::Bind(&CreateClientHandleOnIoThread, named_handle, &client_handle),
-      run_loop.QuitClosure());
-  run_loop.Run();
-  EXPECT_FALSE(client_handle.is_valid());
-}
-
-#if !defined(OS_IOS)
-
-TEST_F(EmbedderTest, ClosePipeToConnectedPeer) {
-  set_launch_type(LaunchType::PEER);
-  auto& controller = StartClient("ClosePipeToConnectedPeerClient");
-  MojoHandle server_mp = controller.pipe();
-  // 1. Write a message to |server_mp| (attaching nothing).
-  WriteMessage(server_mp, "hello");
-
-  // 2. Read a message from |server_mp|.
-  EXPECT_EQ("world!", ReadMessage(server_mp));
-
-  controller.ClosePeerConnection();
-
-  EXPECT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(server_mp, MOJO_HANDLE_SIGNAL_PEER_CLOSED));
-
-  EXPECT_EQ(0, controller.WaitForShutdown());
-}
-
-DEFINE_TEST_CLIENT_TEST_WITH_PIPE(ClosePipeToConnectedPeerClient, EmbedderTest,
-                                  client_mp) {
-  // 1. Read the first message from |client_mp|.
-  EXPECT_EQ("hello", ReadMessage(client_mp));
-
-  // 2. Write a message to |client_mp| (attaching nothing).
-  WriteMessage(client_mp, "world!");
-
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(client_mp, MOJO_HANDLE_SIGNAL_PEER_CLOSED));
-}
-
-TEST_F(EmbedderTest, ClosePipeToConnectingPeer) {
-  set_launch_type(LaunchType::PEER);
-  auto& controller = StartClient("ClosePipeToConnectingPeerClient");
-  controller.ClosePeerConnection();
-
-  MojoHandle server_mp = controller.pipe();
-
-  EXPECT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(server_mp, MOJO_HANDLE_SIGNAL_PEER_CLOSED));
-
-  EXPECT_EQ(0, controller.WaitForShutdown());
-}
-
-DEFINE_TEST_CLIENT_TEST_WITH_PIPE(ClosePipeToConnectingPeerClient, EmbedderTest,
-                                  client_mp) {
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(client_mp, MOJO_HANDLE_SIGNAL_PEER_CLOSED));
-}
-
-#endif  // !defined(OS_IOS)
-
-}  // namespace
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/embedder/entrypoints.cc b/mojo/edk/embedder/entrypoints.cc
deleted file mode 100644
index 9081368..0000000
--- a/mojo/edk/embedder/entrypoints.cc
+++ /dev/null
@@ -1,283 +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 "mojo/edk/embedder/entrypoints.h"
-
-#include <stdint.h>
-
-#include "mojo/edk/embedder/embedder_internal.h"
-#include "mojo/edk/system/core.h"
-#include "mojo/public/c/system/buffer.h"
-#include "mojo/public/c/system/data_pipe.h"
-#include "mojo/public/c/system/functions.h"
-#include "mojo/public/c/system/message_pipe.h"
-#include "mojo/public/c/system/platform_handle.h"
-
-using mojo::edk::internal::g_core;
-
-// Definitions of the system functions.
-extern "C" {
-
-MojoTimeTicks MojoGetTimeTicksNowImpl() {
-  return g_core->GetTimeTicksNow();
-}
-
-MojoResult MojoCloseImpl(MojoHandle handle) {
-  return g_core->Close(handle);
-}
-
-MojoResult MojoQueryHandleSignalsStateImpl(
-    MojoHandle handle,
-    MojoHandleSignalsState* signals_state) {
-  return g_core->QueryHandleSignalsState(handle, signals_state);
-}
-
-MojoResult MojoCreateWatcherImpl(MojoWatcherCallback callback,
-                                 MojoHandle* watcher_handle) {
-  return g_core->CreateWatcher(callback, watcher_handle);
-}
-
-MojoResult MojoArmWatcherImpl(MojoHandle watcher_handle,
-                              uint32_t* num_ready_contexts,
-                              uintptr_t* ready_contexts,
-                              MojoResult* ready_results,
-                              MojoHandleSignalsState* ready_signals_states) {
-  return g_core->ArmWatcher(watcher_handle, num_ready_contexts, ready_contexts,
-                            ready_results, ready_signals_states);
-}
-
-MojoResult MojoWatchImpl(MojoHandle watcher_handle,
-                         MojoHandle handle,
-                         MojoHandleSignals signals,
-                         uintptr_t context) {
-  return g_core->Watch(watcher_handle, handle, signals, context);
-}
-
-MojoResult MojoCancelWatchImpl(MojoHandle watcher_handle, uintptr_t context) {
-  return g_core->CancelWatch(watcher_handle, context);
-}
-
-MojoResult MojoAllocMessageImpl(uint32_t num_bytes,
-                                const MojoHandle* handles,
-                                uint32_t num_handles,
-                                MojoAllocMessageFlags flags,
-                                MojoMessageHandle* message) {
-  return g_core->AllocMessage(num_bytes, handles, num_handles, flags, message);
-}
-
-MojoResult MojoFreeMessageImpl(MojoMessageHandle message) {
-  return g_core->FreeMessage(message);
-}
-
-MojoResult MojoGetMessageBufferImpl(MojoMessageHandle message, void** buffer) {
-  return g_core->GetMessageBuffer(message, buffer);
-}
-
-MojoResult MojoCreateMessagePipeImpl(
-    const MojoCreateMessagePipeOptions* options,
-    MojoHandle* message_pipe_handle0,
-    MojoHandle* message_pipe_handle1) {
-  return g_core->CreateMessagePipe(options, message_pipe_handle0,
-                                   message_pipe_handle1);
-}
-
-MojoResult MojoWriteMessageImpl(MojoHandle message_pipe_handle,
-                                const void* bytes,
-                                uint32_t num_bytes,
-                                const MojoHandle* handles,
-                                uint32_t num_handles,
-                                MojoWriteMessageFlags flags) {
-  return g_core->WriteMessage(message_pipe_handle, bytes, num_bytes, handles,
-                              num_handles, flags);
-}
-
-MojoResult MojoWriteMessageNewImpl(MojoHandle message_pipe_handle,
-                                   MojoMessageHandle message,
-                                   MojoWriteMessageFlags flags) {
-  return g_core->WriteMessageNew(message_pipe_handle, message, flags);
-}
-
-MojoResult MojoReadMessageImpl(MojoHandle message_pipe_handle,
-                               void* bytes,
-                               uint32_t* num_bytes,
-                               MojoHandle* handles,
-                               uint32_t* num_handles,
-                               MojoReadMessageFlags flags) {
-  return g_core->ReadMessage(
-      message_pipe_handle, bytes, num_bytes, handles, num_handles, flags);
-}
-
-MojoResult MojoReadMessageNewImpl(MojoHandle message_pipe_handle,
-                                  MojoMessageHandle* message,
-                                  uint32_t* num_bytes,
-                                  MojoHandle* handles,
-                                  uint32_t* num_handles,
-                                  MojoReadMessageFlags flags) {
-  return g_core->ReadMessageNew(
-      message_pipe_handle, message, num_bytes, handles, num_handles, flags);
-}
-
-MojoResult MojoFuseMessagePipesImpl(MojoHandle handle0, MojoHandle handle1) {
-  return g_core->FuseMessagePipes(handle0, handle1);
-}
-
-MojoResult MojoCreateDataPipeImpl(const MojoCreateDataPipeOptions* options,
-                                  MojoHandle* data_pipe_producer_handle,
-                                  MojoHandle* data_pipe_consumer_handle) {
-  return g_core->CreateDataPipe(options, data_pipe_producer_handle,
-                                data_pipe_consumer_handle);
-}
-
-MojoResult MojoWriteDataImpl(MojoHandle data_pipe_producer_handle,
-                             const void* elements,
-                             uint32_t* num_elements,
-                             MojoWriteDataFlags flags) {
-  return g_core->WriteData(data_pipe_producer_handle, elements, num_elements,
-                           flags);
-}
-
-MojoResult MojoBeginWriteDataImpl(MojoHandle data_pipe_producer_handle,
-                                  void** buffer,
-                                  uint32_t* buffer_num_elements,
-                                  MojoWriteDataFlags flags) {
-  return g_core->BeginWriteData(data_pipe_producer_handle, buffer,
-                                buffer_num_elements, flags);
-}
-
-MojoResult MojoEndWriteDataImpl(MojoHandle data_pipe_producer_handle,
-                                uint32_t num_elements_written) {
-  return g_core->EndWriteData(data_pipe_producer_handle, num_elements_written);
-}
-
-MojoResult MojoReadDataImpl(MojoHandle data_pipe_consumer_handle,
-                            void* elements,
-                            uint32_t* num_elements,
-                            MojoReadDataFlags flags) {
-  return g_core->ReadData(data_pipe_consumer_handle, elements, num_elements,
-                          flags);
-}
-
-MojoResult MojoBeginReadDataImpl(MojoHandle data_pipe_consumer_handle,
-                                 const void** buffer,
-                                 uint32_t* buffer_num_elements,
-                                 MojoReadDataFlags flags) {
-  return g_core->BeginReadData(data_pipe_consumer_handle, buffer,
-                               buffer_num_elements, flags);
-}
-
-MojoResult MojoEndReadDataImpl(MojoHandle data_pipe_consumer_handle,
-                               uint32_t num_elements_read) {
-  return g_core->EndReadData(data_pipe_consumer_handle, num_elements_read);
-}
-
-MojoResult MojoCreateSharedBufferImpl(
-    const struct MojoCreateSharedBufferOptions* options,
-    uint64_t num_bytes,
-    MojoHandle* shared_buffer_handle) {
-  return g_core->CreateSharedBuffer(options, num_bytes, shared_buffer_handle);
-}
-
-MojoResult MojoDuplicateBufferHandleImpl(
-    MojoHandle buffer_handle,
-    const struct MojoDuplicateBufferHandleOptions* options,
-    MojoHandle* new_buffer_handle) {
-  return g_core->DuplicateBufferHandle(buffer_handle, options,
-                                       new_buffer_handle);
-}
-
-MojoResult MojoMapBufferImpl(MojoHandle buffer_handle,
-                             uint64_t offset,
-                             uint64_t num_bytes,
-                             void** buffer,
-                             MojoMapBufferFlags flags) {
-  return g_core->MapBuffer(buffer_handle, offset, num_bytes, buffer, flags);
-}
-
-MojoResult MojoUnmapBufferImpl(void* buffer) {
-  return g_core->UnmapBuffer(buffer);
-}
-
-MojoResult MojoWrapPlatformHandleImpl(const MojoPlatformHandle* platform_handle,
-                                      MojoHandle* mojo_handle) {
-  return g_core->WrapPlatformHandle(platform_handle, mojo_handle);
-}
-
-MojoResult MojoUnwrapPlatformHandleImpl(MojoHandle mojo_handle,
-                                        MojoPlatformHandle* platform_handle) {
-  return g_core->UnwrapPlatformHandle(mojo_handle, platform_handle);
-}
-
-MojoResult MojoWrapPlatformSharedBufferHandleImpl(
-    const MojoPlatformHandle* platform_handle,
-    size_t num_bytes,
-    MojoPlatformSharedBufferHandleFlags flags,
-    MojoHandle* mojo_handle) {
-  return g_core->WrapPlatformSharedBufferHandle(platform_handle, num_bytes,
-                                                flags, mojo_handle);
-}
-
-MojoResult MojoUnwrapPlatformSharedBufferHandleImpl(
-    MojoHandle mojo_handle,
-    MojoPlatformHandle* platform_handle,
-    size_t* num_bytes,
-    MojoPlatformSharedBufferHandleFlags* flags) {
-  return g_core->UnwrapPlatformSharedBufferHandle(mojo_handle, platform_handle,
-                                                  num_bytes, flags);
-}
-
-MojoResult MojoNotifyBadMessageImpl(MojoMessageHandle message,
-                                    const char* error,
-                                    size_t error_num_bytes) {
-  return g_core->NotifyBadMessage(message, error, error_num_bytes);
-}
-
-MojoResult MojoGetPropertyImpl(MojoPropertyType type, void* value) {
-  return g_core->GetProperty(type, value);
-}
-
-}  // extern "C"
-
-namespace mojo {
-namespace edk {
-
-MojoSystemThunks MakeSystemThunks() {
-  MojoSystemThunks system_thunks = {sizeof(MojoSystemThunks),
-                                    MojoGetTimeTicksNowImpl,
-                                    MojoCloseImpl,
-                                    MojoQueryHandleSignalsStateImpl,
-                                    MojoCreateMessagePipeImpl,
-                                    MojoWriteMessageImpl,
-                                    MojoReadMessageImpl,
-                                    MojoCreateDataPipeImpl,
-                                    MojoWriteDataImpl,
-                                    MojoBeginWriteDataImpl,
-                                    MojoEndWriteDataImpl,
-                                    MojoReadDataImpl,
-                                    MojoBeginReadDataImpl,
-                                    MojoEndReadDataImpl,
-                                    MojoCreateSharedBufferImpl,
-                                    MojoDuplicateBufferHandleImpl,
-                                    MojoMapBufferImpl,
-                                    MojoUnmapBufferImpl,
-                                    MojoCreateWatcherImpl,
-                                    MojoWatchImpl,
-                                    MojoCancelWatchImpl,
-                                    MojoArmWatcherImpl,
-                                    MojoFuseMessagePipesImpl,
-                                    MojoWriteMessageNewImpl,
-                                    MojoReadMessageNewImpl,
-                                    MojoAllocMessageImpl,
-                                    MojoFreeMessageImpl,
-                                    MojoGetMessageBufferImpl,
-                                    MojoWrapPlatformHandleImpl,
-                                    MojoUnwrapPlatformHandleImpl,
-                                    MojoWrapPlatformSharedBufferHandleImpl,
-                                    MojoUnwrapPlatformSharedBufferHandleImpl,
-                                    MojoNotifyBadMessageImpl,
-                                    MojoGetPropertyImpl};
-  return system_thunks;
-}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/embedder/entrypoints.h b/mojo/edk/embedder/entrypoints.h
deleted file mode 100644
index 8e448c1..0000000
--- a/mojo/edk/embedder/entrypoints.h
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_EMBEDDER_ENTRYPOINTS_H_
-#define MOJO_EDK_EMBEDDER_ENTRYPOINTS_H_
-
-#include "mojo/edk/system/system_impl_export.h"
-#include "mojo/public/c/system/thunks.h"
-
-namespace mojo {
-namespace edk {
-
-// Creates a MojoSystemThunks struct populated with the EDK's implementation of
-// each function. This may be used by embedders to populate thunks for
-// application loading.
-MOJO_SYSTEM_IMPL_EXPORT MojoSystemThunks MakeSystemThunks();
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_EMBEDDER_ENTRYPOINTS_H_
diff --git a/mojo/edk/embedder/named_platform_channel_pair.h b/mojo/edk/embedder/named_platform_channel_pair.h
deleted file mode 100644
index 5a83ae3..0000000
--- a/mojo/edk/embedder/named_platform_channel_pair.h
+++ /dev/null
@@ -1,73 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_EMBEDDER_NAMED_PLATFORM_CHANNEL_PAIR_H_
-#define MOJO_EDK_EMBEDDER_NAMED_PLATFORM_CHANNEL_PAIR_H_
-
-#include <string>
-
-#include "base/macros.h"
-#include "base/strings/string16.h"
-#include "build/build_config.h"
-#include "mojo/edk/embedder/named_platform_handle.h"
-#include "mojo/edk/embedder/scoped_platform_handle.h"
-#include "mojo/edk/system/system_impl_export.h"
-
-namespace base {
-class CommandLine;
-}
-
-namespace mojo {
-namespace edk {
-
-// This is used to create a named bidirectional pipe to connect new child
-// processes. The resulting server handle should be passed to the EDK, and the
-// child end passed as a pipe name on the command line to the child process. The
-// child process can then retrieve the pipe name from the command line and
-// resolve it into a client handle.
-class MOJO_SYSTEM_IMPL_EXPORT NamedPlatformChannelPair {
- public:
-  struct Options {
-#if defined(OS_WIN)
-    // If non-empty, a security descriptor to use when creating the pipe. If
-    // empty, a default security descriptor will be used. See
-    // kDefaultSecurityDescriptor in named_platform_handle_utils_win.cc.
-    base::string16 security_descriptor;
-#endif
-  };
-
-  NamedPlatformChannelPair(const Options& options = {});
-  ~NamedPlatformChannelPair();
-
-  // Note: It is NOT acceptable to use this handle as a generic pipe channel. It
-  // MUST be passed to PendingProcessConnection::Connect() only.
-  ScopedPlatformHandle PassServerHandle();
-
-  // To be called in the child process, after the parent process called
-  // |PrepareToPassClientHandleToChildProcess()| and launched the child (using
-  // the provided data), to create a client handle connected to the server
-  // handle (in the parent process).
-  static ScopedPlatformHandle PassClientHandleFromParentProcess(
-      const base::CommandLine& command_line);
-
-  // Prepares to pass the client channel to a new child process, to be launched
-  // using |LaunchProcess()| (from base/launch.h). Modifies |*command_line| and
-  // |*handle_passing_info| as needed.
-  // Note: For Windows, this method only works on Vista and later.
-  void PrepareToPassClientHandleToChildProcess(
-      base::CommandLine* command_line) const;
-
-  const NamedPlatformHandle& handle() const { return pipe_handle_; }
-
- private:
-  NamedPlatformHandle pipe_handle_;
-  ScopedPlatformHandle server_handle_;
-
-  DISALLOW_COPY_AND_ASSIGN(NamedPlatformChannelPair);
-};
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_EMBEDDER_NAMED_PLATFORM_CHANNEL_PAIR_H_
diff --git a/mojo/edk/embedder/named_platform_channel_pair_win.cc b/mojo/edk/embedder/named_platform_channel_pair_win.cc
deleted file mode 100644
index 96589ff..0000000
--- a/mojo/edk/embedder/named_platform_channel_pair_win.cc
+++ /dev/null
@@ -1,89 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/embedder/named_platform_channel_pair.h"
-
-#include <windows.h>
-
-#include <memory>
-#include <string>
-#include <utility>
-
-#include "base/command_line.h"
-#include "base/logging.h"
-#include "base/rand_util.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/stringprintf.h"
-#include "base/strings/utf_string_conversions.h"
-#include "base/win/windows_version.h"
-#include "mojo/edk/embedder/named_platform_handle_utils.h"
-#include "mojo/edk/embedder/platform_handle.h"
-
-namespace mojo {
-namespace edk {
-
-namespace {
-
-const char kMojoNamedPlatformChannelPipeSwitch[] =
-    "mojo-named-platform-channel-pipe";
-
-std::wstring GeneratePipeName() {
-  return base::StringPrintf(L"%u.%u.%I64u", GetCurrentProcessId(),
-                            GetCurrentThreadId(), base::RandUint64());
-}
-
-}  // namespace
-
-NamedPlatformChannelPair::NamedPlatformChannelPair(
-    const NamedPlatformChannelPair::Options& options)
-    : pipe_handle_(GeneratePipeName()) {
-  CreateServerHandleOptions server_handle_options;
-  server_handle_options.security_descriptor = options.security_descriptor;
-  server_handle_options.enforce_uniqueness = true;
-  server_handle_ = CreateServerHandle(pipe_handle_, server_handle_options);
-  PCHECK(server_handle_.is_valid());
-}
-
-NamedPlatformChannelPair::~NamedPlatformChannelPair() {}
-
-ScopedPlatformHandle NamedPlatformChannelPair::PassServerHandle() {
-  return std::move(server_handle_);
-}
-
-// static
-ScopedPlatformHandle
-NamedPlatformChannelPair::PassClientHandleFromParentProcess(
-    const base::CommandLine& command_line) {
-  // In order to support passing the pipe name on the command line, the pipe
-  // handle is lazily created from the pipe name when requested.
-  NamedPlatformHandle handle(
-      command_line.GetSwitchValueNative(kMojoNamedPlatformChannelPipeSwitch));
-
-  if (!handle.is_valid())
-    return ScopedPlatformHandle();
-
-  return CreateClientHandle(handle);
-}
-
-void NamedPlatformChannelPair::PrepareToPassClientHandleToChildProcess(
-    base::CommandLine* command_line) const {
-  DCHECK(command_line);
-
-  // Log a warning if the command line already has the switch, but "clobber" it
-  // anyway, since it's reasonably likely that all the switches were just copied
-  // from the parent.
-  LOG_IF(WARNING,
-         command_line->HasSwitch(kMojoNamedPlatformChannelPipeSwitch))
-      << "Child command line already has switch --"
-      << kMojoNamedPlatformChannelPipeSwitch << "="
-      << command_line->GetSwitchValueNative(
-          kMojoNamedPlatformChannelPipeSwitch);
-  // (Any existing switch won't actually be removed from the command line, but
-  // the last one appended takes precedence.)
-  command_line->AppendSwitchNative(kMojoNamedPlatformChannelPipeSwitch,
-                                   pipe_handle_.name);
-}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/embedder/named_platform_handle.h b/mojo/edk/embedder/named_platform_handle.h
deleted file mode 100644
index 15ca656..0000000
--- a/mojo/edk/embedder/named_platform_handle.h
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_EMBEDDER_NAMED_PLATFORM_HANDLE_H_
-#define MOJO_EDK_EMBEDDER_NAMED_PLATFORM_HANDLE_H_
-
-#include <string>
-
-#include "base/strings/string16.h"
-#include "base/strings/string_piece.h"
-#include "base/strings/utf_string_conversions.h"
-#include "build/build_config.h"
-#include "mojo/edk/system/system_impl_export.h"
-
-namespace mojo {
-namespace edk {
-
-#if defined(OS_POSIX)
-struct MOJO_SYSTEM_IMPL_EXPORT NamedPlatformHandle {
-  NamedPlatformHandle() {}
-  explicit NamedPlatformHandle(const base::StringPiece& name)
-      : name(name.as_string()) {}
-
-  bool is_valid() const { return !name.empty(); }
-
-  std::string name;
-};
-#elif defined(OS_WIN)
-struct MOJO_SYSTEM_IMPL_EXPORT NamedPlatformHandle {
-  NamedPlatformHandle() {}
-  explicit NamedPlatformHandle(const base::StringPiece& name)
-      : name(base::UTF8ToUTF16(name)) {}
-
-  explicit NamedPlatformHandle(const base::StringPiece16& name)
-      : name(name.as_string()) {}
-
-  bool is_valid() const { return !name.empty(); }
-
-  base::string16 pipe_name() const { return L"\\\\.\\pipe\\mojo." + name; }
-
-  base::string16 name;
-};
-#else
-#error "Platform not yet supported."
-#endif
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_EMBEDDER_NAMED_PLATFORM_HANDLE_H_
diff --git a/mojo/edk/embedder/named_platform_handle_utils.h b/mojo/edk/embedder/named_platform_handle_utils.h
deleted file mode 100644
index b767ea0..0000000
--- a/mojo/edk/embedder/named_platform_handle_utils.h
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_EMBEDDER_NAMED_PLATFORM_HANDLE_UTILS_H_
-#define MOJO_EDK_EMBEDDER_NAMED_PLATFORM_HANDLE_UTILS_H_
-
-#include "build/build_config.h"
-#include "mojo/edk/embedder/scoped_platform_handle.h"
-#include "mojo/edk/system/system_impl_export.h"
-
-#if defined(OS_WIN)
-#include "base/strings/string16.h"
-#endif
-
-namespace mojo {
-namespace edk {
-
-struct NamedPlatformHandle;
-
-#if defined(OS_POSIX)
-
-// The maximum length of the name of a unix domain socket. The standard size on
-// linux is 108, mac is 104. To maintain consistency across platforms we
-// standardize on the smaller value.
-const size_t kMaxSocketNameLength = 104;
-
-#endif
-
-struct CreateServerHandleOptions {
-#if defined(OS_WIN)
-  // If true, creating a server handle will fail if another pipe with the same
-  // name exists.
-  bool enforce_uniqueness = true;
-
-  // If non-empty, a security descriptor to use when creating the pipe. If
-  // empty, a default security descriptor will be used. See
-  // kDefaultSecurityDescriptor in named_platform_handle_utils_win.cc.
-  base::string16 security_descriptor;
-#endif
-};
-
-// Creates a client platform handle from |handle|. This may block until |handle|
-// is ready to receive connections.
-MOJO_SYSTEM_IMPL_EXPORT ScopedPlatformHandle
-CreateClientHandle(const NamedPlatformHandle& handle);
-
-// Creates a server platform handle from |handle|.
-MOJO_SYSTEM_IMPL_EXPORT ScopedPlatformHandle
-CreateServerHandle(const NamedPlatformHandle& handle,
-                   const CreateServerHandleOptions& options = {});
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_EMBEDDER_NAMED_PLATFORM_HANDLE_UTILS_H_
diff --git a/mojo/edk/embedder/named_platform_handle_utils_posix.cc b/mojo/edk/embedder/named_platform_handle_utils_posix.cc
deleted file mode 100644
index 056f4d6..0000000
--- a/mojo/edk/embedder/named_platform_handle_utils_posix.cc
+++ /dev/null
@@ -1,141 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/embedder/named_platform_handle_utils.h"
-
-#include <errno.h>
-#include <sys/socket.h>
-#include <sys/un.h>
-#include <unistd.h>
-
-#include "base/files/file_path.h"
-#include "base/files/file_util.h"
-#include "base/logging.h"
-#include "base/posix/eintr_wrapper.h"
-#include "mojo/edk/embedder/named_platform_handle.h"
-
-namespace mojo {
-namespace edk {
-namespace {
-
-// This function fills in |unix_addr| with the appropriate data for the socket,
-// and sets |unix_addr_len| to the length of the data therein.
-// Returns true on success, or false on failure (typically because |handle.name|
-// violated the naming rules).
-bool MakeUnixAddr(const NamedPlatformHandle& handle,
-                  struct sockaddr_un* unix_addr,
-                  size_t* unix_addr_len) {
-  DCHECK(unix_addr);
-  DCHECK(unix_addr_len);
-  DCHECK(handle.is_valid());
-
-  // We reject handle.name.length() == kMaxSocketNameLength to make room for the
-  // NUL terminator at the end of the string.
-  if (handle.name.length() >= kMaxSocketNameLength) {
-    LOG(ERROR) << "Socket name too long: " << handle.name;
-    return false;
-  }
-
-  // Create unix_addr structure.
-  memset(unix_addr, 0, sizeof(struct sockaddr_un));
-  unix_addr->sun_family = AF_UNIX;
-  strncpy(unix_addr->sun_path, handle.name.c_str(), kMaxSocketNameLength);
-  *unix_addr_len =
-      offsetof(struct sockaddr_un, sun_path) + handle.name.length();
-  return true;
-}
-
-// This function creates a unix domain socket, and set it as non-blocking.
-// If successful, this returns a ScopedPlatformHandle containing the socket.
-// Otherwise, this returns an invalid ScopedPlatformHandle.
-ScopedPlatformHandle CreateUnixDomainSocket(bool needs_connection) {
-  // Create the unix domain socket.
-  PlatformHandle socket_handle(socket(AF_UNIX, SOCK_STREAM, 0));
-  socket_handle.needs_connection = needs_connection;
-  ScopedPlatformHandle handle(socket_handle);
-  if (!handle.is_valid()) {
-    PLOG(ERROR) << "Failed to create AF_UNIX socket.";
-    return ScopedPlatformHandle();
-  }
-
-  // Now set it as non-blocking.
-  if (!base::SetNonBlocking(handle.get().handle)) {
-    PLOG(ERROR) << "base::SetNonBlocking() failed " << handle.get().handle;
-    return ScopedPlatformHandle();
-  }
-  return handle;
-}
-
-}  // namespace
-
-ScopedPlatformHandle CreateClientHandle(
-    const NamedPlatformHandle& named_handle) {
-  if (!named_handle.is_valid())
-    return ScopedPlatformHandle();
-
-  struct sockaddr_un unix_addr;
-  size_t unix_addr_len;
-  if (!MakeUnixAddr(named_handle, &unix_addr, &unix_addr_len))
-    return ScopedPlatformHandle();
-
-  ScopedPlatformHandle handle = CreateUnixDomainSocket(false);
-  if (!handle.is_valid())
-    return ScopedPlatformHandle();
-
-  if (HANDLE_EINTR(connect(handle.get().handle,
-                           reinterpret_cast<sockaddr*>(&unix_addr),
-                           unix_addr_len)) < 0) {
-    PLOG(ERROR) << "connect " << named_handle.name;
-    return ScopedPlatformHandle();
-  }
-
-  return handle;
-}
-
-ScopedPlatformHandle CreateServerHandle(
-    const NamedPlatformHandle& named_handle,
-    const CreateServerHandleOptions& options) {
-  if (!named_handle.is_valid())
-    return ScopedPlatformHandle();
-
-  // Make sure the path we need exists.
-  base::FilePath socket_dir = base::FilePath(named_handle.name).DirName();
-  if (!base::CreateDirectory(socket_dir)) {
-    LOG(ERROR) << "Couldn't create directory: " << socket_dir.value();
-    return ScopedPlatformHandle();
-  }
-
-  // Delete any old FS instances.
-  if (unlink(named_handle.name.c_str()) < 0 && errno != ENOENT) {
-    PLOG(ERROR) << "unlink " << named_handle.name;
-    return ScopedPlatformHandle();
-  }
-
-  struct sockaddr_un unix_addr;
-  size_t unix_addr_len;
-  if (!MakeUnixAddr(named_handle, &unix_addr, &unix_addr_len))
-    return ScopedPlatformHandle();
-
-  ScopedPlatformHandle handle = CreateUnixDomainSocket(true);
-  if (!handle.is_valid())
-    return ScopedPlatformHandle();
-
-  // Bind the socket.
-  if (bind(handle.get().handle, reinterpret_cast<const sockaddr*>(&unix_addr),
-           unix_addr_len) < 0) {
-    PLOG(ERROR) << "bind " << named_handle.name;
-    return ScopedPlatformHandle();
-  }
-
-  // Start listening on the socket.
-  if (listen(handle.get().handle, SOMAXCONN) < 0) {
-    PLOG(ERROR) << "listen " << named_handle.name;
-    unlink(named_handle.name.c_str());
-    return ScopedPlatformHandle();
-  }
-  return handle;
-}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/embedder/named_platform_handle_utils_win.cc b/mojo/edk/embedder/named_platform_handle_utils_win.cc
deleted file mode 100644
index a145847..0000000
--- a/mojo/edk/embedder/named_platform_handle_utils_win.cc
+++ /dev/null
@@ -1,95 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/embedder/named_platform_handle_utils.h"
-
-#include <sddl.h>
-#include <windows.h>
-
-#include <memory>
-
-#include "base/logging.h"
-#include "base/win/windows_version.h"
-#include "mojo/edk/embedder/named_platform_handle.h"
-
-namespace mojo {
-namespace edk {
-namespace {
-
-// A DACL to grant:
-// GA = Generic All
-// access to:
-// SY = LOCAL_SYSTEM
-// BA = BUILTIN_ADMINISTRATORS
-// OW = OWNER_RIGHTS
-constexpr base::char16 kDefaultSecurityDescriptor[] =
-    L"D:(A;;GA;;;SY)(A;;GA;;;BA)(A;;GA;;;OW)";
-
-}  // namespace
-
-ScopedPlatformHandle CreateClientHandle(
-    const NamedPlatformHandle& named_handle) {
-  if (!named_handle.is_valid())
-    return ScopedPlatformHandle();
-
-  base::string16 pipe_name = named_handle.pipe_name();
-
-  // Note: This may block.
-  if (!WaitNamedPipeW(pipe_name.c_str(), NMPWAIT_USE_DEFAULT_WAIT))
-    return ScopedPlatformHandle();
-
-  const DWORD kDesiredAccess = GENERIC_READ | GENERIC_WRITE;
-  // The SECURITY_ANONYMOUS flag means that the server side cannot impersonate
-  // the client.
-  const DWORD kFlags =
-      SECURITY_SQOS_PRESENT | SECURITY_ANONYMOUS | FILE_FLAG_OVERLAPPED;
-  ScopedPlatformHandle handle(
-      PlatformHandle(CreateFileW(pipe_name.c_str(), kDesiredAccess,
-                                 0,  // No sharing.
-                                 nullptr, OPEN_EXISTING, kFlags,
-                                 nullptr)));  // No template file.
-  // The server may have stopped accepting a connection between the
-  // WaitNamedPipe() and CreateFile(). If this occurs, an invalid handle is
-  // returned.
-  DPLOG_IF(ERROR, !handle.is_valid())
-      << "Named pipe " << named_handle.pipe_name()
-      << " could not be opened after WaitNamedPipe succeeded";
-  return handle;
-}
-
-ScopedPlatformHandle CreateServerHandle(
-    const NamedPlatformHandle& named_handle,
-    const CreateServerHandleOptions& options) {
-  if (!named_handle.is_valid())
-    return ScopedPlatformHandle();
-
-  PSECURITY_DESCRIPTOR security_desc = nullptr;
-  ULONG security_desc_len = 0;
-  PCHECK(ConvertStringSecurityDescriptorToSecurityDescriptor(
-      options.security_descriptor.empty() ? kDefaultSecurityDescriptor
-                                          : options.security_descriptor.c_str(),
-      SDDL_REVISION_1, &security_desc, &security_desc_len));
-  std::unique_ptr<void, decltype(::LocalFree)*> p(security_desc, ::LocalFree);
-  SECURITY_ATTRIBUTES security_attributes = {sizeof(SECURITY_ATTRIBUTES),
-                                             security_desc, FALSE};
-
-  const DWORD kOpenMode = options.enforce_uniqueness
-                              ? PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED |
-                                    FILE_FLAG_FIRST_PIPE_INSTANCE
-                              : PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED;
-  const DWORD kPipeMode =
-      PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_REJECT_REMOTE_CLIENTS;
-  PlatformHandle handle(
-      CreateNamedPipeW(named_handle.pipe_name().c_str(), kOpenMode, kPipeMode,
-                       options.enforce_uniqueness ? 1 : 255,  // Max instances.
-                       4096,  // Out buffer size.
-                       4096,  // In buffer size.
-                       5000,  // Timeout in milliseconds.
-                       &security_attributes));
-  handle.needs_connection = true;
-  return ScopedPlatformHandle(handle);
-}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/embedder/pending_process_connection.cc b/mojo/edk/embedder/pending_process_connection.cc
deleted file mode 100644
index d6be76e..0000000
--- a/mojo/edk/embedder/pending_process_connection.cc
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/embedder/pending_process_connection.h"
-
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/embedder/embedder_internal.h"
-#include "mojo/edk/system/core.h"
-
-namespace mojo {
-namespace edk {
-
-PendingProcessConnection::PendingProcessConnection()
-    : process_token_(GenerateRandomToken()) {
-  DCHECK(internal::g_core);
-}
-
-PendingProcessConnection::~PendingProcessConnection() {
-  if (has_message_pipes_ && !connected_) {
-    DCHECK(internal::g_core);
-    internal::g_core->ChildLaunchFailed(process_token_);
-  }
-}
-
-ScopedMessagePipeHandle PendingProcessConnection::CreateMessagePipe(
-    std::string* token) {
-  has_message_pipes_ = true;
-  DCHECK(internal::g_core);
-  *token = GenerateRandomToken();
-  return internal::g_core->CreateParentMessagePipe(*token, process_token_);
-}
-
-void PendingProcessConnection::Connect(
-    base::ProcessHandle process,
-    ConnectionParams connection_params,
-    const ProcessErrorCallback& error_callback) {
-  // It's now safe to avoid cleanup in the destructor, as the lifetime of any
-  // associated resources is effectively bound to the |channel| passed to
-  // AddChild() below.
-  DCHECK(!connected_);
-  connected_ = true;
-
-  DCHECK(internal::g_core);
-  internal::g_core->AddChild(process, std::move(connection_params),
-                             process_token_, error_callback);
-}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/embedder/pending_process_connection.h b/mojo/edk/embedder/pending_process_connection.h
deleted file mode 100644
index ca18227..0000000
--- a/mojo/edk/embedder/pending_process_connection.h
+++ /dev/null
@@ -1,124 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_EMBEDDER_PENDING_PROCESS_CONNECTION_H_
-#define MOJO_EDK_EMBEDDER_PENDING_PROCESS_CONNECTION_H_
-
-#include <string>
-
-#include "base/callback.h"
-#include "base/macros.h"
-#include "base/process/process_handle.h"
-#include "mojo/edk/embedder/connection_params.h"
-#include "mojo/edk/embedder/scoped_platform_handle.h"
-#include "mojo/edk/system/system_impl_export.h"
-#include "mojo/public/cpp/system/message_pipe.h"
-
-namespace mojo {
-namespace edk {
-
-using ProcessErrorCallback = base::Callback<void(const std::string& error)>;
-
-// Represents a potential connection to an external process. Use this object
-// to make other processes reachable from this one via Mojo IPC. Typical usage
-// might look something like:
-//
-//     PendingProcessConnection connection;
-//
-//     std::string pipe_token;
-//     ScopedMessagePipeHandle pipe = connection.CreateMessagePipe(&pipe_token);
-//
-//     // New pipes to the process are fully functional and can be used right
-//     // away, even if the process doesn't exist yet.
-//     GoDoSomethingInteresting(std::move(pipe));
-//
-//     ScopedPlatformChannelPair channel;
-//
-//     // Give the pipe token to the child process via command-line.
-//     child_command_line.AppendSwitchASCII("yer-pipe", pipe_token);
-//
-//     // Magic child process launcher which gives one end of the pipe to the
-//     // new process.
-//     LaunchProcess(child_command_line, channel.PassClientHandle());
-//
-//     // Some time later...
-//     connection.Connect(new_process, channel.PassServerHandle());
-//
-// If at any point during the above process, |connection| is destroyed before
-// Connect() can be called, |pipe| will imminently behave as if its peer has
-// been closed.
-//
-// Otherwise, if the remote process in this example eventually calls:
-//
-//     mojo::edk::SetParentPipeHandle(std::move(client_channel_handle));
-//
-//     std::string token = command_line.GetSwitchValueASCII("yer-pipe");
-//     ScopedMessagePipeHandle pipe = mojo::edk::CreateChildMessagePipe(token);
-//
-// it will be connected to this process, and its |pipe| will be connected to
-// this process's |pipe|.
-//
-// If the remote process exits or otherwise closes its client channel handle
-// before calling CreateChildMessagePipe for a given message pipe token,
-// this process's end of the corresponding message pipe will imminently behave
-// as if its peer has been closed.
-//
-class MOJO_SYSTEM_IMPL_EXPORT PendingProcessConnection {
- public:
-  PendingProcessConnection();
-  ~PendingProcessConnection();
-
-  // Creates a message pipe associated with a new globally unique string value
-  // which will be placed in |*token|.
-  //
-  // The other end of the new pipe is obtainable in the remote process (or in
-  // this process, to facilitate "single-process mode" in some applications) by
-  // passing the new |*token| value to mojo::edk::CreateChildMessagePipe. It's
-  // the caller's responsibility to communicate the value of |*token| to the
-  // remote process by any means available, e.g. a command-line argument on
-  // process launch, or some other out-of-band communication channel for an
-  // existing process.
-  //
-  // NOTES: This may be called any number of times to create multiple message
-  // pipes to the same remote process. This call ALWAYS succeeds, returning
-  // a valid message pipe handle and populating |*token| with a new unique
-  // string value.
-  ScopedMessagePipeHandle CreateMessagePipe(std::string* token);
-
-  // Connects to the process. This must be called at most once, with the process
-  // handle in |process|.
-  //
-  // |connection_param| contains the platform handle of an OS pipe which can be
-  // used to communicate with the connected process. The other end of that pipe
-  // must ultimately be passed to mojo::edk::SetParentPipeHandle in the remote
-  // process, and getting that end of the pipe into the other process is the
-  // embedder's responsibility.
-  //
-  // If this method is not called by the time the PendingProcessConnection is
-  // destroyed, it's assumed that the process is unavailable (e.g. process
-  // launch failed or the process has otherwise been terminated early), and
-  // any associated resources, such as remote endpoints of messages pipes
-  // created by CreateMessagePipe above) will be cleaned up at that time.
-  void Connect(
-      base::ProcessHandle process,
-      ConnectionParams connection_params,
-      const ProcessErrorCallback& error_callback = ProcessErrorCallback());
-
- private:
-  // A GUID representing a potential new process to be connected to this one.
-  const std::string process_token_;
-
-  // Indicates whether this object has been used to create new message pipes.
-  bool has_message_pipes_ = false;
-
-  // Indicates whether Connect() has been called yet.
-  bool connected_ = false;
-
-  DISALLOW_COPY_AND_ASSIGN(PendingProcessConnection);
-};
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_EMBEDDER_PENDING_PROCESS_CONNECTION_H_
diff --git a/mojo/edk/embedder/platform_channel_pair.cc b/mojo/edk/embedder/platform_channel_pair.cc
deleted file mode 100644
index ee1905a..0000000
--- a/mojo/edk/embedder/platform_channel_pair.cc
+++ /dev/null
@@ -1,34 +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 "mojo/edk/embedder/platform_channel_pair.h"
-
-#include <utility>
-
-#include "base/logging.h"
-
-namespace mojo {
-namespace edk {
-
-const char PlatformChannelPair::kMojoPlatformChannelHandleSwitch[] =
-    "mojo-platform-channel-handle";
-
-PlatformChannelPair::~PlatformChannelPair() {
-}
-
-ScopedPlatformHandle PlatformChannelPair::PassServerHandle() {
-  return std::move(server_handle_);
-}
-
-ScopedPlatformHandle PlatformChannelPair::PassClientHandle() {
-  return std::move(client_handle_);
-}
-
-void PlatformChannelPair::ChildProcessLaunched() {
-  DCHECK(client_handle_.is_valid());
-  client_handle_.reset();
-}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/embedder/platform_channel_pair.h b/mojo/edk/embedder/platform_channel_pair.h
deleted file mode 100644
index 9c93f76..0000000
--- a/mojo/edk/embedder/platform_channel_pair.h
+++ /dev/null
@@ -1,106 +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 MOJO_EDK_EMBEDDER_PLATFORM_CHANNEL_PAIR_H_
-#define MOJO_EDK_EMBEDDER_PLATFORM_CHANNEL_PAIR_H_
-
-#include <memory>
-
-#include "base/macros.h"
-#include "base/process/launch.h"
-#include "build/build_config.h"
-#include "mojo/edk/embedder/scoped_platform_handle.h"
-#include "mojo/edk/system/system_impl_export.h"
-
-namespace base {
-class CommandLine;
-}
-
-namespace mojo {
-namespace edk {
-
-// It would be nice to refactor base/process/launch.h to have a more platform-
-// independent way of representing handles that are passed to child processes.
-#if defined(OS_WIN)
-using HandlePassingInformation = base::HandlesToInheritVector;
-#elif defined(OS_POSIX)
-using HandlePassingInformation = base::FileHandleMappingVector;
-#else
-#error "Unsupported."
-#endif
-
-// This is used to create a pair of |PlatformHandle|s that are connected by a
-// suitable (platform-specific) bidirectional "pipe" (e.g., socket on POSIX,
-// named pipe on Windows). The resulting handles can then be used in the same
-// process (e.g., in tests) or between processes. (The "server" handle is the
-// one that will be used in the process that created the pair, whereas the
-// "client" handle is the one that will be used in a different process.)
-//
-// This class provides facilities for passing the client handle to a child
-// process. The parent should call |PrepareToPassClientHandlelToChildProcess()|
-// to get the data needed to do this, spawn the child using that data, and then
-// call |ChildProcessLaunched()|. Note that on Windows this facility (will) only
-// work on Vista and later (TODO(vtl)).
-//
-// Note: |PlatformChannelPair()|, |PassClientHandleFromParentProcess()| and
-// |PrepareToPassClientHandleToChildProcess()| have platform-specific
-// implementations.
-//
-// Note: On POSIX platforms, to write to the "pipe", use
-// |PlatformChannel{Write,Writev}()| (from platform_channel_utils_posix.h)
-// instead of |write()|, |writev()|, etc. Otherwise, you have to worry about
-// platform differences in suppressing |SIGPIPE|.
-class MOJO_SYSTEM_IMPL_EXPORT PlatformChannelPair {
- public:
-  static const char kMojoPlatformChannelHandleSwitch[];
-
-  // If |client_is_blocking| is true, then the client handle only supports
-  // blocking reads and writes. The default is nonblocking.
-  PlatformChannelPair(bool client_is_blocking = false);
-  ~PlatformChannelPair();
-
-  ScopedPlatformHandle PassServerHandle();
-
-  // For in-process use (e.g., in tests or to pass over another channel).
-  ScopedPlatformHandle PassClientHandle();
-
-  // To be called in the child process, after the parent process called
-  // |PrepareToPassClientHandleToChildProcess()| and launched the child (using
-  // the provided data), to create a client handle connected to the server
-  // handle (in the parent process).
-  // TODO(jcivelli): remove the command_line param. http://crbug.com/670106
-  static ScopedPlatformHandle PassClientHandleFromParentProcess(
-      const base::CommandLine& command_line);
-
-  // Like above, but gets the handle from the passed in string.
-  static ScopedPlatformHandle PassClientHandleFromParentProcessFromString(
-      const std::string& value);
-
-  // Prepares to pass the client channel to a new child process, to be launched
-  // using |LaunchProcess()| (from base/launch.h). Modifies |*command_line| and
-  // |*handle_passing_info| as needed.
-  // Note: For Windows, this method only works on Vista and later.
-  void PrepareToPassClientHandleToChildProcess(
-      base::CommandLine* command_line,
-      HandlePassingInformation* handle_passing_info) const;
-
-  // Like above, but returns a string instead of changing the command line.
-  std::string PrepareToPassClientHandleToChildProcessAsString(
-      HandlePassingInformation* handle_passing_info) const;
-
-  // To be called once the child process has been successfully launched, to do
-  // any cleanup necessary.
-  void ChildProcessLaunched();
-
- private:
-  ScopedPlatformHandle server_handle_;
-  ScopedPlatformHandle client_handle_;
-
-  DISALLOW_COPY_AND_ASSIGN(PlatformChannelPair);
-};
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_EMBEDDER_PLATFORM_CHANNEL_PAIR_H_
diff --git a/mojo/edk/embedder/platform_channel_pair_posix.cc b/mojo/edk/embedder/platform_channel_pair_posix.cc
deleted file mode 100644
index fe9f8f5..0000000
--- a/mojo/edk/embedder/platform_channel_pair_posix.cc
+++ /dev/null
@@ -1,172 +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 "mojo/edk/embedder/platform_channel_pair.h"
-
-#include <fcntl.h>
-#include <stddef.h>
-#include <stdint.h>
-#include <sys/types.h>
-#include <unistd.h>
-
-#include <limits>
-
-#include "base/command_line.h"
-#include "base/logging.h"
-#include "base/posix/global_descriptors.h"
-#include "base/rand_util.h"
-#include "base/strings/string_number_conversions.h"
-#include "build/build_config.h"
-#include "mojo/edk/embedder/platform_handle.h"
-
-#if !defined(OS_NACL_SFI)
-#include <sys/socket.h>
-#else
-#include "native_client/src/public/imc_syscalls.h"
-#endif
-
-#if !defined(SO_PEEK_OFF)
-#define SO_PEEK_OFF 42
-#endif
-
-namespace mojo {
-namespace edk {
-
-namespace {
-
-#if defined(OS_ANDROID) || defined(__ANDROID__)
-enum {
-  // Leave room for any other descriptors defined in content for example.
-  // TODO(jcivelli): consider changing base::GlobalDescriptors to generate a
-  //   key when setting the file descriptor (http://crbug.com/676442).
-  kAndroidClientHandleDescriptor =
-      base::GlobalDescriptors::kBaseDescriptor + 10000,
-};
-#else
-bool IsTargetDescriptorUsed(
-    const base::FileHandleMappingVector& file_handle_mapping,
-    int target_fd) {
-  for (size_t i = 0; i < file_handle_mapping.size(); i++) {
-    if (file_handle_mapping[i].second == target_fd)
-      return true;
-  }
-  return false;
-}
-#endif
-
-}  // namespace
-
-PlatformChannelPair::PlatformChannelPair(bool client_is_blocking) {
-  // Create the Unix domain socket.
-  int fds[2];
-  // TODO(vtl): Maybe fail gracefully if |socketpair()| fails.
-
-#if defined(OS_NACL_SFI)
-  PCHECK(imc_socketpair(fds) == 0);
-#else
-  PCHECK(socketpair(AF_UNIX, SOCK_STREAM, 0, fds) == 0);
-
-  // Set the ends to nonblocking.
-  PCHECK(fcntl(fds[0], F_SETFL, O_NONBLOCK) == 0);
-  if (!client_is_blocking)
-    PCHECK(fcntl(fds[1], F_SETFL, O_NONBLOCK) == 0);
-
-#if defined(OS_MACOSX)
-  // This turns off |SIGPIPE| when writing to a closed socket (causing it to
-  // fail with |EPIPE| instead). On Linux, we have to use |send...()| with
-  // |MSG_NOSIGNAL| -- which is not supported on Mac -- instead.
-  int no_sigpipe = 1;
-  PCHECK(setsockopt(fds[0], SOL_SOCKET, SO_NOSIGPIPE, &no_sigpipe,
-                    sizeof(no_sigpipe)) == 0);
-  PCHECK(setsockopt(fds[1], SOL_SOCKET, SO_NOSIGPIPE, &no_sigpipe,
-                    sizeof(no_sigpipe)) == 0);
-#endif  // defined(OS_MACOSX)
-#endif  // defined(OS_NACL_SFI)
-
-  server_handle_.reset(PlatformHandle(fds[0]));
-  DCHECK(server_handle_.is_valid());
-  client_handle_.reset(PlatformHandle(fds[1]));
-  DCHECK(client_handle_.is_valid());
-}
-
-// static
-ScopedPlatformHandle PlatformChannelPair::PassClientHandleFromParentProcess(
-    const base::CommandLine& command_line) {
-  std::string client_fd_string =
-      command_line.GetSwitchValueASCII(kMojoPlatformChannelHandleSwitch);
-  return PassClientHandleFromParentProcessFromString(client_fd_string);
-}
-
-ScopedPlatformHandle
-PlatformChannelPair::PassClientHandleFromParentProcessFromString(
-    const std::string& value) {
-  int client_fd = -1;
-#if defined(OS_ANDROID) || defined(__ANDROID__)
-  base::GlobalDescriptors::Key key = -1;
-  if (value.empty() || !base::StringToUint(value, &key)) {
-    LOG(ERROR) << "Missing or invalid --" << kMojoPlatformChannelHandleSwitch;
-    return ScopedPlatformHandle();
-  }
-  client_fd = base::GlobalDescriptors::GetInstance()->Get(key);
-#else
-  if (value.empty() ||
-      !base::StringToInt(value, &client_fd) ||
-      client_fd < base::GlobalDescriptors::kBaseDescriptor) {
-    LOG(ERROR) << "Missing or invalid --" << kMojoPlatformChannelHandleSwitch;
-    return ScopedPlatformHandle();
-  }
-#endif
-  return ScopedPlatformHandle(PlatformHandle(client_fd));
-}
-
-void PlatformChannelPair::PrepareToPassClientHandleToChildProcess(
-    base::CommandLine* command_line,
-    base::FileHandleMappingVector* handle_passing_info) const {
-  DCHECK(command_line);
-
-  // Log a warning if the command line already has the switch, but "clobber" it
-  // anyway, since it's reasonably likely that all the switches were just copied
-  // from the parent.
-  LOG_IF(WARNING, command_line->HasSwitch(kMojoPlatformChannelHandleSwitch))
-      << "Child command line already has switch --"
-      << kMojoPlatformChannelHandleSwitch << "="
-      << command_line->GetSwitchValueASCII(kMojoPlatformChannelHandleSwitch);
-  // (Any existing switch won't actually be removed from the command line, but
-  // the last one appended takes precedence.)
-  command_line->AppendSwitchASCII(
-      kMojoPlatformChannelHandleSwitch,
-      PrepareToPassClientHandleToChildProcessAsString(handle_passing_info));
-}
-
-std::string
-PlatformChannelPair::PrepareToPassClientHandleToChildProcessAsString(
-      HandlePassingInformation* handle_passing_info) const {
-#if defined(OS_ANDROID) || defined(__ANDROID__)
-  int fd = client_handle_.get().handle;
-  handle_passing_info->push_back(
-      std::pair<int, int>(fd, kAndroidClientHandleDescriptor));
-  return base::UintToString(kAndroidClientHandleDescriptor);
-#else
-  DCHECK(handle_passing_info);
-  // This is an arbitrary sanity check. (Note that this guarantees that the loop
-  // below will terminate sanely.)
-  CHECK_LT(handle_passing_info->size(), 1000u);
-
-  DCHECK(client_handle_.is_valid());
-
-  // Find a suitable FD to map our client handle to in the child process.
-  // This has quadratic time complexity in the size of |*handle_passing_info|,
-  // but |*handle_passing_info| should be very small (usually/often empty).
-  int target_fd = base::GlobalDescriptors::kBaseDescriptor;
-  while (IsTargetDescriptorUsed(*handle_passing_info, target_fd))
-    target_fd++;
-
-  handle_passing_info->push_back(
-      std::pair<int, int>(client_handle_.get().handle, target_fd));
-  return base::IntToString(target_fd);
-#endif
-}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/embedder/platform_channel_pair_posix_unittest.cc b/mojo/edk/embedder/platform_channel_pair_posix_unittest.cc
deleted file mode 100644
index a3fd275..0000000
--- a/mojo/edk/embedder/platform_channel_pair_posix_unittest.cc
+++ /dev/null
@@ -1,261 +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 "mojo/edk/embedder/platform_channel_pair.h"
-
-#include <errno.h>
-#include <poll.h>
-#include <signal.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <sys/socket.h>
-#include <sys/types.h>
-#include <sys/uio.h>
-#include <unistd.h>
-#include <deque>
-#include <utility>
-
-#include "base/files/file_path.h"
-#include "base/files/file_util.h"
-#include "base/files/scoped_file.h"
-#include "base/files/scoped_temp_dir.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "mojo/edk/embedder/platform_channel_utils_posix.h"
-#include "mojo/edk/embedder/platform_handle.h"
-#include "mojo/edk/embedder/platform_handle_vector.h"
-#include "mojo/edk/embedder/scoped_platform_handle.h"
-#include "mojo/edk/test/test_utils.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace edk {
-namespace {
-
-void WaitReadable(PlatformHandle h) {
-  struct pollfd pfds = {};
-  pfds.fd = h.handle;
-  pfds.events = POLLIN;
-  CHECK_EQ(poll(&pfds, 1, -1), 1);
-}
-
-class PlatformChannelPairPosixTest : public testing::Test {
- public:
-  PlatformChannelPairPosixTest() {}
-  ~PlatformChannelPairPosixTest() override {}
-
-  void SetUp() override {
-    // Make sure |SIGPIPE| isn't being ignored.
-    struct sigaction action = {};
-    action.sa_handler = SIG_DFL;
-    ASSERT_EQ(0, sigaction(SIGPIPE, &action, &old_action_));
-  }
-
-  void TearDown() override {
-    // Restore the |SIGPIPE| handler.
-    ASSERT_EQ(0, sigaction(SIGPIPE, &old_action_, nullptr));
-  }
-
- private:
-  struct sigaction old_action_;
-
-  DISALLOW_COPY_AND_ASSIGN(PlatformChannelPairPosixTest);
-};
-
-TEST_F(PlatformChannelPairPosixTest, NoSigPipe) {
-  PlatformChannelPair channel_pair;
-  ScopedPlatformHandle server_handle = channel_pair.PassServerHandle();
-  ScopedPlatformHandle client_handle = channel_pair.PassClientHandle();
-
-  // Write to the client.
-  static const char kHello[] = "hello";
-  EXPECT_EQ(static_cast<ssize_t>(sizeof(kHello)),
-            write(client_handle.get().handle, kHello, sizeof(kHello)));
-
-  // Close the client.
-  client_handle.reset();
-
-  // Read from the server; this should be okay.
-  char buffer[100] = {};
-  EXPECT_EQ(static_cast<ssize_t>(sizeof(kHello)),
-            read(server_handle.get().handle, buffer, sizeof(buffer)));
-  EXPECT_STREQ(kHello, buffer);
-
-  // Try reading again.
-  ssize_t result = read(server_handle.get().handle, buffer, sizeof(buffer));
-  // We should probably get zero (for "end of file"), but -1 would also be okay.
-  EXPECT_TRUE(result == 0 || result == -1);
-  if (result == -1)
-    PLOG(WARNING) << "read (expected 0 for EOF)";
-
-  // Test our replacement for |write()|/|send()|.
-  result = PlatformChannelWrite(server_handle.get(), kHello, sizeof(kHello));
-  EXPECT_EQ(-1, result);
-  if (errno != EPIPE)
-    PLOG(WARNING) << "write (expected EPIPE)";
-
-  // Test our replacement for |writev()|/|sendv()|.
-  struct iovec iov[2] = {{const_cast<char*>(kHello), sizeof(kHello)},
-                         {const_cast<char*>(kHello), sizeof(kHello)}};
-  result = PlatformChannelWritev(server_handle.get(), iov, 2);
-  EXPECT_EQ(-1, result);
-  if (errno != EPIPE)
-    PLOG(WARNING) << "write (expected EPIPE)";
-}
-
-TEST_F(PlatformChannelPairPosixTest, SendReceiveData) {
-  PlatformChannelPair channel_pair;
-  ScopedPlatformHandle server_handle = channel_pair.PassServerHandle();
-  ScopedPlatformHandle client_handle = channel_pair.PassClientHandle();
-
-  for (size_t i = 0; i < 10; i++) {
-    std::string send_string(1 << i, 'A' + i);
-
-    EXPECT_EQ(static_cast<ssize_t>(send_string.size()),
-              PlatformChannelWrite(server_handle.get(), send_string.data(),
-                                   send_string.size()));
-
-    WaitReadable(client_handle.get());
-
-    char buf[10000] = {};
-    std::deque<PlatformHandle> received_handles;
-    ssize_t result = PlatformChannelRecvmsg(client_handle.get(), buf,
-                                            sizeof(buf), &received_handles);
-    EXPECT_EQ(static_cast<ssize_t>(send_string.size()), result);
-    EXPECT_EQ(send_string, std::string(buf, static_cast<size_t>(result)));
-    EXPECT_TRUE(received_handles.empty());
-  }
-}
-
-TEST_F(PlatformChannelPairPosixTest, SendReceiveFDs) {
-  base::ScopedTempDir temp_dir;
-  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-
-  static const char kHello[] = "hello";
-
-  PlatformChannelPair channel_pair;
-  ScopedPlatformHandle server_handle = channel_pair.PassServerHandle();
-  ScopedPlatformHandle client_handle = channel_pair.PassClientHandle();
-
-// Reduce the number of FDs opened on OS X to avoid test flake.
-#if defined(OS_MACOSX)
-  const size_t kNumHandlesToSend = kPlatformChannelMaxNumHandles / 2;
-#else
-  const size_t kNumHandlesToSend = kPlatformChannelMaxNumHandles;
-#endif
-
-  for (size_t i = 1; i < kNumHandlesToSend; i++) {
-    // Make |i| files, with the j-th file consisting of j copies of the digit
-    // |c|.
-    const char c = '0' + (i % 10);
-    ScopedPlatformHandleVectorPtr platform_handles(new PlatformHandleVector);
-    for (size_t j = 1; j <= i; j++) {
-      base::FilePath unused;
-      base::ScopedFILE fp(
-          base::CreateAndOpenTemporaryFileInDir(temp_dir.GetPath(), &unused));
-      ASSERT_TRUE(fp);
-      ASSERT_EQ(j, fwrite(std::string(j, c).data(), 1, j, fp.get()));
-      platform_handles->push_back(
-          test::PlatformHandleFromFILE(std::move(fp)).release());
-      ASSERT_TRUE(platform_handles->back().is_valid());
-    }
-
-    // Send the FDs (+ "hello").
-    struct iovec iov = {const_cast<char*>(kHello), sizeof(kHello)};
-    // We assume that the |sendmsg()| actually sends all the data.
-    EXPECT_EQ(static_cast<ssize_t>(sizeof(kHello)),
-              PlatformChannelSendmsgWithHandles(server_handle.get(), &iov, 1,
-                                                &platform_handles->at(0),
-                                                platform_handles->size()));
-
-    WaitReadable(client_handle.get());
-
-    char buf[10000] = {};
-    std::deque<PlatformHandle> received_handles;
-    // We assume that the |recvmsg()| actually reads all the data.
-    EXPECT_EQ(static_cast<ssize_t>(sizeof(kHello)),
-              PlatformChannelRecvmsg(client_handle.get(), buf, sizeof(buf),
-                                     &received_handles));
-    EXPECT_STREQ(kHello, buf);
-    EXPECT_EQ(i, received_handles.size());
-
-    for (size_t j = 0; !received_handles.empty(); j++) {
-      base::ScopedFILE fp(test::FILEFromPlatformHandle(
-          ScopedPlatformHandle(received_handles.front()), "rb"));
-      received_handles.pop_front();
-      ASSERT_TRUE(fp);
-      rewind(fp.get());
-      char read_buf[kNumHandlesToSend];
-      size_t bytes_read = fread(read_buf, 1, sizeof(read_buf), fp.get());
-      EXPECT_EQ(j + 1, bytes_read);
-      EXPECT_EQ(std::string(j + 1, c), std::string(read_buf, bytes_read));
-    }
-  }
-}
-
-TEST_F(PlatformChannelPairPosixTest, AppendReceivedFDs) {
-  base::ScopedTempDir temp_dir;
-  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-
-  static const char kHello[] = "hello";
-
-  PlatformChannelPair channel_pair;
-  ScopedPlatformHandle server_handle = channel_pair.PassServerHandle();
-  ScopedPlatformHandle client_handle = channel_pair.PassClientHandle();
-
-  const std::string file_contents("hello world");
-
-  {
-    base::FilePath unused;
-    base::ScopedFILE fp(
-        base::CreateAndOpenTemporaryFileInDir(temp_dir.GetPath(), &unused));
-    ASSERT_TRUE(fp);
-    ASSERT_EQ(file_contents.size(),
-              fwrite(file_contents.data(), 1, file_contents.size(), fp.get()));
-    ScopedPlatformHandleVectorPtr platform_handles(new PlatformHandleVector);
-    platform_handles->push_back(
-        test::PlatformHandleFromFILE(std::move(fp)).release());
-    ASSERT_TRUE(platform_handles->back().is_valid());
-
-    // Send the FD (+ "hello").
-    struct iovec iov = {const_cast<char*>(kHello), sizeof(kHello)};
-    // We assume that the |sendmsg()| actually sends all the data.
-    EXPECT_EQ(static_cast<ssize_t>(sizeof(kHello)),
-              PlatformChannelSendmsgWithHandles(server_handle.get(), &iov, 1,
-                                                &platform_handles->at(0),
-                                                platform_handles->size()));
-  }
-
-  WaitReadable(client_handle.get());
-
-  // Start with an invalid handle in the deque.
-  std::deque<PlatformHandle> received_handles;
-  received_handles.push_back(PlatformHandle());
-
-  char buf[100] = {};
-  // We assume that the |recvmsg()| actually reads all the data.
-  EXPECT_EQ(static_cast<ssize_t>(sizeof(kHello)),
-            PlatformChannelRecvmsg(client_handle.get(), buf, sizeof(buf),
-                                   &received_handles));
-  EXPECT_STREQ(kHello, buf);
-  ASSERT_EQ(2u, received_handles.size());
-  EXPECT_FALSE(received_handles[0].is_valid());
-  EXPECT_TRUE(received_handles[1].is_valid());
-
-  {
-    base::ScopedFILE fp(test::FILEFromPlatformHandle(
-        ScopedPlatformHandle(received_handles[1]), "rb"));
-    received_handles[1] = PlatformHandle();
-    ASSERT_TRUE(fp);
-    rewind(fp.get());
-    char read_buf[100];
-    size_t bytes_read = fread(read_buf, 1, sizeof(read_buf), fp.get());
-    EXPECT_EQ(file_contents.size(), bytes_read);
-    EXPECT_EQ(file_contents, std::string(read_buf, bytes_read));
-  }
-}
-
-}  // namespace
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/embedder/platform_channel_pair_win.cc b/mojo/edk/embedder/platform_channel_pair_win.cc
deleted file mode 100644
index f523ade..0000000
--- a/mojo/edk/embedder/platform_channel_pair_win.cc
+++ /dev/null
@@ -1,123 +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 "mojo/edk/embedder/platform_channel_pair.h"
-
-#include <windows.h>
-
-#include <string>
-
-#include "base/command_line.h"
-#include "base/logging.h"
-#include "base/rand_util.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/stringprintf.h"
-#include "base/win/windows_version.h"
-#include "mojo/edk/embedder/platform_handle.h"
-
-namespace mojo {
-namespace edk {
-
-namespace {
-
-std::wstring GeneratePipeName() {
-  return base::StringPrintf(L"\\\\.\\pipe\\mojo.%u.%u.%I64u",
-                            GetCurrentProcessId(), GetCurrentThreadId(),
-                            base::RandUint64());
-}
-
-}  // namespace
-
-PlatformChannelPair::PlatformChannelPair(bool client_is_blocking) {
-  std::wstring pipe_name = GeneratePipeName();
-
-  DWORD kOpenMode =
-      PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED | FILE_FLAG_FIRST_PIPE_INSTANCE;
-  const DWORD kPipeMode = PIPE_TYPE_BYTE | PIPE_READMODE_BYTE;
-  server_handle_.reset(PlatformHandle(
-      CreateNamedPipeW(pipe_name.c_str(), kOpenMode, kPipeMode,
-                       1,           // Max instances.
-                       4096,        // Out buffer size.
-                       4096,        // In buffer size.
-                       5000,        // Timeout in milliseconds.
-                       nullptr)));  // Default security descriptor.
-  PCHECK(server_handle_.is_valid());
-
-  const DWORD kDesiredAccess = GENERIC_READ | GENERIC_WRITE;
-  // The SECURITY_ANONYMOUS flag means that the server side cannot impersonate
-  // the client.
-  DWORD kFlags = SECURITY_SQOS_PRESENT | SECURITY_ANONYMOUS;
-  if (!client_is_blocking)
-    kFlags |= FILE_FLAG_OVERLAPPED;
-  // Allow the handle to be inherited by child processes.
-  SECURITY_ATTRIBUTES security_attributes = {
-      sizeof(SECURITY_ATTRIBUTES), nullptr, TRUE};
-  client_handle_.reset(
-      PlatformHandle(CreateFileW(pipe_name.c_str(), kDesiredAccess,
-                                 0,  // No sharing.
-                                 &security_attributes, OPEN_EXISTING, kFlags,
-                                 nullptr)));  // No template file.
-  PCHECK(client_handle_.is_valid());
-
-  // Since a client has connected, ConnectNamedPipe() should return zero and
-  // GetLastError() should return ERROR_PIPE_CONNECTED.
-  CHECK(!ConnectNamedPipe(server_handle_.get().handle, nullptr));
-  PCHECK(GetLastError() == ERROR_PIPE_CONNECTED);
-}
-
-// static
-ScopedPlatformHandle PlatformChannelPair::PassClientHandleFromParentProcess(
-    const base::CommandLine& command_line) {
-  std::string client_handle_string =
-      command_line.GetSwitchValueASCII(kMojoPlatformChannelHandleSwitch);
-  return PassClientHandleFromParentProcessFromString(client_handle_string);
-}
-
-ScopedPlatformHandle
-PlatformChannelPair::PassClientHandleFromParentProcessFromString(
-    const std::string& value) {
-  int client_handle_value = 0;
-  if (value.empty() ||
-      !base::StringToInt(value, &client_handle_value)) {
-    LOG(ERROR) << "Missing or invalid --" << kMojoPlatformChannelHandleSwitch;
-    return ScopedPlatformHandle();
-  }
-
-  return ScopedPlatformHandle(
-      PlatformHandle(LongToHandle(client_handle_value)));
-}
-
-void PlatformChannelPair::PrepareToPassClientHandleToChildProcess(
-    base::CommandLine* command_line,
-    base::HandlesToInheritVector* handle_passing_info) const {
-  DCHECK(command_line);
-
-  // Log a warning if the command line already has the switch, but "clobber" it
-  // anyway, since it's reasonably likely that all the switches were just copied
-  // from the parent.
-  LOG_IF(WARNING, command_line->HasSwitch(kMojoPlatformChannelHandleSwitch))
-      << "Child command line already has switch --"
-      << kMojoPlatformChannelHandleSwitch << "="
-      << command_line->GetSwitchValueASCII(kMojoPlatformChannelHandleSwitch);
-  // (Any existing switch won't actually be removed from the command line, but
-  // the last one appended takes precedence.)
-  command_line->AppendSwitchASCII(
-      kMojoPlatformChannelHandleSwitch,
-      PrepareToPassClientHandleToChildProcessAsString(handle_passing_info));
-}
-
-std::string
-PlatformChannelPair::PrepareToPassClientHandleToChildProcessAsString(
-    HandlePassingInformation* handle_passing_info) const {
-  DCHECK(handle_passing_info);
-  DCHECK(client_handle_.is_valid());
-
-  if (base::win::GetVersion() >= base::win::VERSION_VISTA)
-    handle_passing_info->push_back(client_handle_.get().handle);
-
-  return base::IntToString(HandleToLong(client_handle_.get().handle));
-}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/embedder/platform_channel_utils_posix.cc b/mojo/edk/embedder/platform_channel_utils_posix.cc
deleted file mode 100644
index 689b6ee..0000000
--- a/mojo/edk/embedder/platform_channel_utils_posix.cc
+++ /dev/null
@@ -1,282 +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 "mojo/edk/embedder/platform_channel_utils_posix.h"
-
-#include <stddef.h>
-#include <sys/socket.h>
-#include <unistd.h>
-
-#include <utility>
-
-#include "base/files/file_util.h"
-#include "base/logging.h"
-#include "base/posix/eintr_wrapper.h"
-#include "build/build_config.h"
-#include "mojo/edk/embedder/scoped_platform_handle.h"
-
-#if !defined(OS_NACL)
-#include <sys/uio.h>
-#endif
-
-#if !defined(SO_PEEK_OFF)
-#define SO_PEEK_OFF 42
-#endif
-
-namespace mojo {
-namespace edk {
-namespace {
-
-#if !defined(OS_NACL)
-bool IsRecoverableError() {
-  return errno == ECONNABORTED || errno == EMFILE || errno == ENFILE ||
-         errno == ENOMEM || errno == ENOBUFS;
-}
-
-bool GetPeerEuid(PlatformHandle handle, uid_t* peer_euid) {
-  DCHECK(peer_euid);
-#if defined(OS_MACOSX) || defined(OS_OPENBSD) || defined(OS_FREEBSD)
-  uid_t socket_euid;
-  gid_t socket_gid;
-  if (getpeereid(handle.handle, &socket_euid, &socket_gid) < 0) {
-    PLOG(ERROR) << "getpeereid " << handle.handle;
-    return false;
-  }
-  *peer_euid = socket_euid;
-  return true;
-#else
-  struct ucred cred;
-  socklen_t cred_len = sizeof(cred);
-  if (getsockopt(handle.handle, SOL_SOCKET, SO_PEERCRED, &cred, &cred_len) <
-      0) {
-    PLOG(ERROR) << "getsockopt " << handle.handle;
-    return false;
-  }
-  if (static_cast<unsigned>(cred_len) < sizeof(cred)) {
-    NOTREACHED() << "Truncated ucred from SO_PEERCRED?";
-    return false;
-  }
-  *peer_euid = cred.uid;
-  return true;
-#endif
-}
-
-bool IsPeerAuthorized(PlatformHandle peer_handle) {
-  uid_t peer_euid;
-  if (!GetPeerEuid(peer_handle, &peer_euid))
-    return false;
-  if (peer_euid != geteuid()) {
-    DLOG(ERROR) << "Client euid is not authorised";
-    return false;
-  }
-  return true;
-}
-#endif  // !defined(OS_NACL)
-
-}  // namespace
-
-// On Linux, |SIGPIPE| is suppressed by passing |MSG_NOSIGNAL| to
-// |send()|/|sendmsg()|. (There is no way of suppressing |SIGPIPE| on
-// |write()|/|writev().) On Mac, |SIGPIPE| is suppressed by setting the
-// |SO_NOSIGPIPE| option on the socket.
-//
-// Performance notes:
-//  - On Linux, we have to use |send()|/|sendmsg()| rather than
-//    |write()|/|writev()| in order to suppress |SIGPIPE|. This is okay, since
-//    |send()| is (slightly) faster than |write()| (!), while |sendmsg()| is
-//    quite comparable to |writev()|.
-//  - On Mac, we may use |write()|/|writev()|. Here, |write()| is considerably
-//    faster than |send()|, whereas |sendmsg()| is quite comparable to
-//    |writev()|.
-//  - On both platforms, an appropriate |sendmsg()|/|writev()| is considerably
-//    faster than two |send()|s/|write()|s.
-//  - Relative numbers (minimum real times from 10 runs) for one |write()| of
-//    1032 bytes, one |send()| of 1032 bytes, one |writev()| of 32+1000 bytes,
-//    one |sendmsg()| of 32+1000 bytes, two |write()|s of 32 and 1000 bytes, two
-//    |send()|s of 32 and 1000 bytes:
-//    - Linux: 0.81 s, 0.77 s, 0.87 s, 0.89 s, 1.31 s, 1.22 s
-//    - Mac: 2.21 s, 2.91 s, 2.98 s, 3.08 s, 3.59 s, 4.74 s
-
-// Flags to use with calling |send()| or |sendmsg()| (see above).
-#if defined(OS_MACOSX)
-const int kSendFlags = 0;
-#else
-const int kSendFlags = MSG_NOSIGNAL;
-#endif
-
-ssize_t PlatformChannelWrite(PlatformHandle h,
-                             const void* bytes,
-                             size_t num_bytes) {
-  DCHECK(h.is_valid());
-  DCHECK(bytes);
-  DCHECK_GT(num_bytes, 0u);
-
-#if defined(OS_MACOSX) || defined(OS_NACL_NONSFI)
-  // send() is not available under NaCl-nonsfi.
-  return HANDLE_EINTR(write(h.handle, bytes, num_bytes));
-#else
-  return send(h.handle, bytes, num_bytes, kSendFlags);
-#endif
-}
-
-ssize_t PlatformChannelWritev(PlatformHandle h,
-                              struct iovec* iov,
-                              size_t num_iov) {
-  DCHECK(h.is_valid());
-  DCHECK(iov);
-  DCHECK_GT(num_iov, 0u);
-
-#if defined(OS_MACOSX)
-  return HANDLE_EINTR(writev(h.handle, iov, static_cast<int>(num_iov)));
-#else
-  struct msghdr msg = {};
-  msg.msg_iov = iov;
-  msg.msg_iovlen = num_iov;
-  return HANDLE_EINTR(sendmsg(h.handle, &msg, kSendFlags));
-#endif
-}
-
-ssize_t PlatformChannelSendmsgWithHandles(PlatformHandle h,
-                                          struct iovec* iov,
-                                          size_t num_iov,
-                                          PlatformHandle* platform_handles,
-                                          size_t num_platform_handles) {
-  DCHECK(iov);
-  DCHECK_GT(num_iov, 0u);
-  DCHECK(platform_handles);
-  DCHECK_GT(num_platform_handles, 0u);
-  DCHECK_LE(num_platform_handles, kPlatformChannelMaxNumHandles);
-
-  char cmsg_buf[CMSG_SPACE(kPlatformChannelMaxNumHandles * sizeof(int))];
-  struct msghdr msg = {};
-  msg.msg_iov = iov;
-  msg.msg_iovlen = num_iov;
-  msg.msg_control = cmsg_buf;
-  msg.msg_controllen = CMSG_LEN(num_platform_handles * sizeof(int));
-  struct cmsghdr* cmsg = CMSG_FIRSTHDR(&msg);
-  cmsg->cmsg_level = SOL_SOCKET;
-  cmsg->cmsg_type = SCM_RIGHTS;
-  cmsg->cmsg_len = CMSG_LEN(num_platform_handles * sizeof(int));
-  for (size_t i = 0; i < num_platform_handles; i++) {
-    DCHECK(platform_handles[i].is_valid());
-    reinterpret_cast<int*>(CMSG_DATA(cmsg))[i] = platform_handles[i].handle;
-  }
-
-  return HANDLE_EINTR(sendmsg(h.handle, &msg, kSendFlags));
-}
-
-bool PlatformChannelSendHandles(PlatformHandle h,
-                                PlatformHandle* handles,
-                                size_t num_handles) {
-  DCHECK(handles);
-  DCHECK_GT(num_handles, 0u);
-  DCHECK_LE(num_handles, kPlatformChannelMaxNumHandles);
-
-  // Note: |sendmsg()| fails on Mac if we don't write at least one character.
-  struct iovec iov = {const_cast<char*>(""), 1};
-  char cmsg_buf[CMSG_SPACE(kPlatformChannelMaxNumHandles * sizeof(int))];
-  struct msghdr msg = {};
-  msg.msg_iov = &iov;
-  msg.msg_iovlen = 1;
-  msg.msg_control = cmsg_buf;
-  msg.msg_controllen = CMSG_LEN(num_handles * sizeof(int));
-  struct cmsghdr* cmsg = CMSG_FIRSTHDR(&msg);
-  cmsg->cmsg_level = SOL_SOCKET;
-  cmsg->cmsg_type = SCM_RIGHTS;
-  cmsg->cmsg_len = CMSG_LEN(num_handles * sizeof(int));
-  for (size_t i = 0; i < num_handles; i++) {
-    DCHECK(handles[i].is_valid());
-    reinterpret_cast<int*>(CMSG_DATA(cmsg))[i] = handles[i].handle;
-  }
-
-  ssize_t result = HANDLE_EINTR(sendmsg(h.handle, &msg, kSendFlags));
-  if (result < 1) {
-    DCHECK_EQ(result, -1);
-    return false;
-  }
-
-  for (size_t i = 0; i < num_handles; i++)
-    handles[i].CloseIfNecessary();
-  return true;
-}
-
-ssize_t PlatformChannelRecvmsg(PlatformHandle h,
-                               void* buf,
-                               size_t num_bytes,
-                               std::deque<PlatformHandle>* platform_handles,
-                               bool block) {
-  DCHECK(buf);
-  DCHECK_GT(num_bytes, 0u);
-  DCHECK(platform_handles);
-
-  struct iovec iov = {buf, num_bytes};
-  char cmsg_buf[CMSG_SPACE(kPlatformChannelMaxNumHandles * sizeof(int))];
-  struct msghdr msg = {};
-  msg.msg_iov = &iov;
-  msg.msg_iovlen = 1;
-  msg.msg_control = cmsg_buf;
-  msg.msg_controllen = sizeof(cmsg_buf);
-
-  ssize_t result =
-      HANDLE_EINTR(recvmsg(h.handle, &msg, block ? 0 : MSG_DONTWAIT));
-  if (result < 0)
-    return result;
-
-  // Success; no control messages.
-  if (msg.msg_controllen == 0)
-    return result;
-
-  DCHECK(!(msg.msg_flags & MSG_CTRUNC));
-
-  for (cmsghdr* cmsg = CMSG_FIRSTHDR(&msg); cmsg;
-       cmsg = CMSG_NXTHDR(&msg, cmsg)) {
-    if (cmsg->cmsg_level == SOL_SOCKET && cmsg->cmsg_type == SCM_RIGHTS) {
-      size_t payload_length = cmsg->cmsg_len - CMSG_LEN(0);
-      DCHECK_EQ(payload_length % sizeof(int), 0u);
-      size_t num_fds = payload_length / sizeof(int);
-      const int* fds = reinterpret_cast<int*>(CMSG_DATA(cmsg));
-      for (size_t i = 0; i < num_fds; i++) {
-        platform_handles->push_back(PlatformHandle(fds[i]));
-        DCHECK(platform_handles->back().is_valid());
-      }
-    }
-  }
-
-  return result;
-}
-
-bool ServerAcceptConnection(PlatformHandle server_handle,
-                            ScopedPlatformHandle* connection_handle,
-                            bool check_peer_user) {
-  DCHECK(server_handle.is_valid());
-  connection_handle->reset();
-#if defined(OS_NACL)
-  NOTREACHED();
-  return false;
-#else
-  ScopedPlatformHandle accept_handle(
-      PlatformHandle(HANDLE_EINTR(accept(server_handle.handle, NULL, 0))));
-  if (!accept_handle.is_valid())
-    return IsRecoverableError();
-
-  // Verify that the IPC channel peer is running as the same user.
-  if (check_peer_user && !IsPeerAuthorized(accept_handle.get())) {
-    return true;
-  }
-
-  if (!base::SetNonBlocking(accept_handle.get().handle)) {
-    PLOG(ERROR) << "base::SetNonBlocking() failed "
-                << accept_handle.get().handle;
-    // It's safe to keep listening on |server_handle| even if the attempt to set
-    // O_NONBLOCK failed on the client fd.
-    return true;
-  }
-
-  *connection_handle = std::move(accept_handle);
-  return true;
-#endif  // defined(OS_NACL)
-}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/embedder/platform_channel_utils_posix.h b/mojo/edk/embedder/platform_channel_utils_posix.h
deleted file mode 100644
index 23cfa92..0000000
--- a/mojo/edk/embedder/platform_channel_utils_posix.h
+++ /dev/null
@@ -1,87 +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 MOJO_EDK_EMBEDDER_PLATFORM_CHANNEL_UTILS_POSIX_H_
-#define MOJO_EDK_EMBEDDER_PLATFORM_CHANNEL_UTILS_POSIX_H_
-
-#include <stddef.h>
-#include <sys/types.h>  // For |ssize_t|.
-
-#include <deque>
-#include <memory>
-
-#include "mojo/edk/embedder/platform_handle.h"
-#include "mojo/edk/system/system_impl_export.h"
-
-struct iovec;  // Declared in <sys/uio.h>.
-
-namespace mojo {
-namespace edk {
-class ScopedPlatformHandle;
-
-// The maximum number of handles that can be sent "at once" using
-// |PlatformChannelSendmsgWithHandles()|. This must be less than the Linux
-// kernel's SCM_MAX_FD which is 253.
-const size_t kPlatformChannelMaxNumHandles = 128;
-
-// Use these to write to a socket created using |PlatformChannelPair| (or
-// equivalent). These are like |write()| and |writev()|, but handle |EINTR| and
-// never raise |SIGPIPE|. (Note: On Mac, the suppression of |SIGPIPE| is set up
-// by |PlatformChannelPair|.)
-MOJO_SYSTEM_IMPL_EXPORT ssize_t
-PlatformChannelWrite(PlatformHandle h, const void* bytes, size_t num_bytes);
-MOJO_SYSTEM_IMPL_EXPORT ssize_t
-PlatformChannelWritev(PlatformHandle h, struct iovec* iov, size_t num_iov);
-
-// Writes data, and the given set of |PlatformHandle|s (i.e., file descriptors)
-// over the Unix domain socket given by |h| (e.g., created using
-// |PlatformChannelPair()|). All the handles must be valid, and there must be at
-// least one and at most |kPlatformChannelMaxNumHandles| handles. The return
-// value is as for |sendmsg()|, namely -1 on failure and otherwise the number of
-// bytes of data sent on success (note that this may not be all the data
-// specified by |iov|). (The handles are not closed, regardless of success or
-// failure.)
-MOJO_SYSTEM_IMPL_EXPORT ssize_t
-PlatformChannelSendmsgWithHandles(PlatformHandle h,
-                                  struct iovec* iov,
-                                  size_t num_iov,
-                                  PlatformHandle* platform_handles,
-                                  size_t num_platform_handles);
-
-// TODO(vtl): Remove this once I've switched things over to
-// |PlatformChannelSendmsgWithHandles()|.
-// Sends |PlatformHandle|s (i.e., file descriptors) over the Unix domain socket
-// (e.g., created using PlatformChannelPair|). (These will be sent in a single
-// message having one null byte of data and one control message header with all
-// the file descriptors.) All of the handles must be valid, and there must be at
-// most |kPlatformChannelMaxNumHandles| (and at least one handle). Returns true
-// on success, in which case it closes all the handles.
-MOJO_SYSTEM_IMPL_EXPORT bool PlatformChannelSendHandles(PlatformHandle h,
-                                                        PlatformHandle* handles,
-                                                        size_t num_handles);
-
-// Wrapper around |recvmsg()|, which will extract any attached file descriptors
-// (in the control message) to |PlatformHandle|s (and append them to
-// |platform_handles|). (This also handles |EINTR|.)
-MOJO_SYSTEM_IMPL_EXPORT ssize_t
-PlatformChannelRecvmsg(PlatformHandle h,
-                       void* buf,
-                       size_t num_bytes,
-                       std::deque<PlatformHandle>* platform_handles,
-                       bool block = false);
-
-// Returns false if |server_handle| encounters an unrecoverable error.
-// Returns true if it's valid to keep listening on |server_handle|. In this
-// case, it's possible that a connection wasn't successfully established; then,
-// |connection_handle| will be invalid. If |check_peer_user| is True, the
-// connection will be rejected if the peer is running as a different user.
-MOJO_SYSTEM_IMPL_EXPORT bool ServerAcceptConnection(
-    PlatformHandle server_handle,
-    ScopedPlatformHandle* connection_handle,
-    bool check_peer_user = true);
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_EMBEDDER_PLATFORM_CHANNEL_UTILS_POSIX_H_
diff --git a/mojo/edk/embedder/platform_handle.cc b/mojo/edk/embedder/platform_handle.cc
deleted file mode 100644
index b6b2cd2..0000000
--- a/mojo/edk/embedder/platform_handle.cc
+++ /dev/null
@@ -1,74 +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 "mojo/edk/embedder/platform_handle.h"
-
-#include "build/build_config.h"
-#if defined(OS_POSIX)
-#include <unistd.h>
-#elif defined(OS_WIN)
-#include <windows.h>
-#else
-#error "Platform not yet supported."
-#endif
-
-#include "base/logging.h"
-
-namespace mojo {
-namespace edk {
-
-void PlatformHandle::CloseIfNecessary() {
-  if (!is_valid())
-    return;
-
-#if defined(OS_POSIX)
-  if (type == Type::POSIX) {
-    bool success = (close(handle) == 0);
-    DPCHECK(success);
-    handle = -1;
-  }
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-  else if (type == Type::MACH) {
-    kern_return_t rv = mach_port_deallocate(mach_task_self(), port);
-    DPCHECK(rv == KERN_SUCCESS);
-    port = MACH_PORT_NULL;
-  }
-#endif  // defined(OS_MACOSX) && !defined(OS_IOS)
-#elif defined(OS_WIN)
-  if (owning_process != base::GetCurrentProcessHandle()) {
-    // This handle may have been duplicated to a new target process but not yet
-    // sent there. In this case CloseHandle should NOT be called. From MSDN
-    // documentation for DuplicateHandle[1]:
-    //
-    //    Normally the target process closes a duplicated handle when that
-    //    process is finished using the handle. To close a duplicated handle
-    //    from the source process, call DuplicateHandle with the following
-    //    parameters:
-    //
-    //    * Set hSourceProcessHandle to the target process from the
-    //      call that created the handle.
-    //    * Set hSourceHandle to the duplicated handle to close.
-    //    * Set lpTargetHandle to NULL.
-    //    * Set dwOptions to DUPLICATE_CLOSE_SOURCE.
-    //
-    // [1] https://msdn.microsoft.com/en-us/library/windows/desktop/ms724251
-    //
-    // NOTE: It's possible for this operation to fail if the owning process
-    // was terminated or is in the process of being terminated. Either way,
-    // there is nothing we can reasonably do about failure, so we ignore it.
-    DuplicateHandle(owning_process, handle, NULL, &handle, 0, FALSE,
-                    DUPLICATE_CLOSE_SOURCE);
-    return;
-  }
-
-  bool success = !!CloseHandle(handle);
-  DPCHECK(success);
-  handle = INVALID_HANDLE_VALUE;
-#else
-#error "Platform not yet supported."
-#endif
-}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/embedder/platform_handle.h b/mojo/edk/embedder/platform_handle.h
deleted file mode 100644
index 4866e75..0000000
--- a/mojo/edk/embedder/platform_handle.h
+++ /dev/null
@@ -1,90 +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 MOJO_EDK_EMBEDDER_PLATFORM_HANDLE_H_
-#define MOJO_EDK_EMBEDDER_PLATFORM_HANDLE_H_
-
-#include "build/build_config.h"
-#include "mojo/edk/system/system_impl_export.h"
-
-#if defined(OS_WIN)
-#include <windows.h>
-
-#include "base/process/process_handle.h"
-#elif defined(OS_MACOSX) && !defined(OS_IOS)
-#include <mach/mach.h>
-#endif
-
-namespace mojo {
-namespace edk {
-
-#if defined(OS_POSIX)
-struct MOJO_SYSTEM_IMPL_EXPORT PlatformHandle {
-  PlatformHandle() {}
-  explicit PlatformHandle(int handle) : handle(handle) {}
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-  explicit PlatformHandle(mach_port_t port)
-      : type(Type::MACH), port(port) {}
-#endif
-
-  void CloseIfNecessary();
-
-  bool is_valid() const {
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-    if (type == Type::MACH || type == Type::MACH_NAME)
-      return port != MACH_PORT_NULL;
-#endif
-    return handle != -1;
-  }
-
-  enum class Type {
-    POSIX,
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-    MACH,
-    // MACH_NAME isn't a real Mach port. But rather the "name" of one that can
-    // be resolved to a real port later. This distinction is needed so that the
-    // "port" doesn't try to be closed if CloseIfNecessary() is called. Having
-    // this also allows us to do checks in other places.
-    MACH_NAME,
-#endif
-  };
-  Type type = Type::POSIX;
-
-  int handle = -1;
-
-  // A POSIX handle may be a listen handle that can accept a connection.
-  bool needs_connection = false;
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-  mach_port_t port = MACH_PORT_NULL;
-#endif
-};
-#elif defined(OS_WIN)
-struct MOJO_SYSTEM_IMPL_EXPORT PlatformHandle {
-  PlatformHandle() : PlatformHandle(INVALID_HANDLE_VALUE) {}
-  explicit PlatformHandle(HANDLE handle)
-      : handle(handle), owning_process(base::GetCurrentProcessHandle()) {}
-
-  void CloseIfNecessary();
-
-  bool is_valid() const { return handle != INVALID_HANDLE_VALUE; }
-
-  HANDLE handle;
-
-  // A Windows HANDLE may be duplicated to another process but not yet sent to
-  // that process. This tracks the handle's owning process.
-  base::ProcessHandle owning_process;
-
-  // A Windows HANDLE may be an unconnected named pipe. In this case, we need to
-  // wait for a connection before communicating on the pipe.
-  bool needs_connection = false;
-};
-#else
-#error "Platform not yet supported."
-#endif
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_EMBEDDER_PLATFORM_HANDLE_H_
diff --git a/mojo/edk/embedder/platform_handle_utils.h b/mojo/edk/embedder/platform_handle_utils.h
deleted file mode 100644
index fa683e4..0000000
--- a/mojo/edk/embedder/platform_handle_utils.h
+++ /dev/null
@@ -1,33 +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 MOJO_EDK_EMBEDDER_PLATFORM_HANDLE_UTILS_H_
-#define MOJO_EDK_EMBEDDER_PLATFORM_HANDLE_UTILS_H_
-
-#include "mojo/edk/embedder/platform_handle.h"
-#include "mojo/edk/embedder/scoped_platform_handle.h"
-#include "mojo/edk/system/system_impl_export.h"
-
-namespace mojo {
-namespace edk {
-
-// Closes all the |PlatformHandle|s in the given container.
-template <typename PlatformHandleContainer>
-MOJO_SYSTEM_IMPL_EXPORT inline void CloseAllPlatformHandles(
-    PlatformHandleContainer* platform_handles) {
-  for (typename PlatformHandleContainer::iterator it =
-           platform_handles->begin();
-       it != platform_handles->end(); ++it)
-    it->CloseIfNecessary();
-}
-
-// Duplicates the given |PlatformHandle| (which must be valid). (Returns an
-// invalid |ScopedPlatformHandle| on failure.)
-MOJO_SYSTEM_IMPL_EXPORT ScopedPlatformHandle
-DuplicatePlatformHandle(PlatformHandle platform_handle);
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_EMBEDDER_PLATFORM_HANDLE_UTILS_H_
diff --git a/mojo/edk/embedder/platform_handle_utils_posix.cc b/mojo/edk/embedder/platform_handle_utils_posix.cc
deleted file mode 100644
index 5604f96..0000000
--- a/mojo/edk/embedder/platform_handle_utils_posix.cc
+++ /dev/null
@@ -1,24 +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 "mojo/edk/embedder/platform_handle_utils.h"
-
-#include <unistd.h>
-
-#include "base/logging.h"
-
-namespace mojo {
-namespace edk {
-
-ScopedPlatformHandle DuplicatePlatformHandle(PlatformHandle platform_handle) {
-  DCHECK(platform_handle.is_valid());
-  // Note that |dup()| returns -1 on error (which is exactly the value we use
-  // for invalid |PlatformHandle| FDs).
-  PlatformHandle duped(dup(platform_handle.handle));
-  duped.needs_connection = platform_handle.needs_connection;
-  return ScopedPlatformHandle(duped);
-}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/embedder/platform_handle_utils_win.cc b/mojo/edk/embedder/platform_handle_utils_win.cc
deleted file mode 100644
index 32ed49a..0000000
--- a/mojo/edk/embedder/platform_handle_utils_win.cc
+++ /dev/null
@@ -1,28 +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 "mojo/edk/embedder/platform_handle_utils.h"
-
-#include <windows.h>
-
-#include "base/logging.h"
-
-namespace mojo {
-namespace edk {
-
-ScopedPlatformHandle DuplicatePlatformHandle(PlatformHandle platform_handle) {
-  DCHECK(platform_handle.is_valid());
-
-  HANDLE new_handle;
-  CHECK_NE(platform_handle.handle, INVALID_HANDLE_VALUE);
-  if (!DuplicateHandle(GetCurrentProcess(), platform_handle.handle,
-                       GetCurrentProcess(), &new_handle, 0, TRUE,
-                       DUPLICATE_SAME_ACCESS))
-    return ScopedPlatformHandle();
-  DCHECK_NE(new_handle, INVALID_HANDLE_VALUE);
-  return ScopedPlatformHandle(PlatformHandle(new_handle));
-}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/embedder/platform_handle_vector.h b/mojo/edk/embedder/platform_handle_vector.h
deleted file mode 100644
index 9892b23..0000000
--- a/mojo/edk/embedder/platform_handle_vector.h
+++ /dev/null
@@ -1,35 +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 MOJO_EDK_EMBEDDER_PLATFORM_HANDLE_VECTOR_H_
-#define MOJO_EDK_EMBEDDER_PLATFORM_HANDLE_VECTOR_H_
-
-#include <memory>
-#include <vector>
-
-#include "mojo/edk/embedder/platform_handle.h"
-#include "mojo/edk/embedder/platform_handle_utils.h"
-#include "mojo/edk/system/system_impl_export.h"
-
-namespace mojo {
-namespace edk {
-
-using PlatformHandleVector = std::vector<PlatformHandle>;
-
-// A deleter (for use with |scoped_ptr|) which closes all handles and then
-// |delete|s the |PlatformHandleVector|.
-struct MOJO_SYSTEM_IMPL_EXPORT PlatformHandleVectorDeleter {
-  void operator()(PlatformHandleVector* platform_handles) const {
-    CloseAllPlatformHandles(platform_handles);
-    delete platform_handles;
-  }
-};
-
-using ScopedPlatformHandleVectorPtr =
-    std::unique_ptr<PlatformHandleVector, PlatformHandleVectorDeleter>;
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_EMBEDDER_PLATFORM_HANDLE_VECTOR_H_
diff --git a/mojo/edk/embedder/platform_shared_buffer.cc b/mojo/edk/embedder/platform_shared_buffer.cc
deleted file mode 100644
index 58af44d..0000000
--- a/mojo/edk/embedder/platform_shared_buffer.cc
+++ /dev/null
@@ -1,325 +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 "mojo/edk/embedder/platform_shared_buffer.h"
-
-#include <stddef.h>
-
-#include <utility>
-
-#include "base/logging.h"
-#include "base/memory/ptr_util.h"
-#include "base/memory/shared_memory.h"
-#include "base/process/process_handle.h"
-#include "base/sys_info.h"
-#include "mojo/edk/embedder/platform_handle_utils.h"
-
-#if defined(OS_NACL)
-// For getpagesize() on NaCl.
-#include <unistd.h>
-#endif
-
-namespace mojo {
-namespace edk {
-
-namespace {
-
-// Takes ownership of |memory_handle|.
-ScopedPlatformHandle SharedMemoryToPlatformHandle(
-    base::SharedMemoryHandle memory_handle) {
-#if defined(OS_POSIX) && !(defined(OS_MACOSX) && !defined(OS_IOS))
-  return ScopedPlatformHandle(PlatformHandle(memory_handle.fd));
-#elif defined(OS_WIN)
-  return ScopedPlatformHandle(PlatformHandle(memory_handle.GetHandle()));
-#else
-  return ScopedPlatformHandle(PlatformHandle(memory_handle.GetMemoryObject()));
-#endif
-}
-
-}  // namespace
-
-// static
-PlatformSharedBuffer* PlatformSharedBuffer::Create(size_t num_bytes) {
-  DCHECK_GT(num_bytes, 0u);
-
-  PlatformSharedBuffer* rv = new PlatformSharedBuffer(num_bytes, false);
-  if (!rv->Init()) {
-    // We can't just delete it directly, due to the "in destructor" (debug)
-    // check.
-    scoped_refptr<PlatformSharedBuffer> deleter(rv);
-    return nullptr;
-  }
-
-  return rv;
-}
-
-// static
-PlatformSharedBuffer* PlatformSharedBuffer::CreateFromPlatformHandle(
-    size_t num_bytes,
-    bool read_only,
-    ScopedPlatformHandle platform_handle) {
-  DCHECK_GT(num_bytes, 0u);
-
-  PlatformSharedBuffer* rv = new PlatformSharedBuffer(num_bytes, read_only);
-  if (!rv->InitFromPlatformHandle(std::move(platform_handle))) {
-    // We can't just delete it directly, due to the "in destructor" (debug)
-    // check.
-    scoped_refptr<PlatformSharedBuffer> deleter(rv);
-    return nullptr;
-  }
-
-  return rv;
-}
-
-// static
-PlatformSharedBuffer* PlatformSharedBuffer::CreateFromPlatformHandlePair(
-    size_t num_bytes,
-    ScopedPlatformHandle rw_platform_handle,
-    ScopedPlatformHandle ro_platform_handle) {
-  DCHECK_GT(num_bytes, 0u);
-  DCHECK(rw_platform_handle.is_valid());
-  DCHECK(ro_platform_handle.is_valid());
-
-  PlatformSharedBuffer* rv = new PlatformSharedBuffer(num_bytes, false);
-  if (!rv->InitFromPlatformHandlePair(std::move(rw_platform_handle),
-                                      std::move(ro_platform_handle))) {
-    // We can't just delete it directly, due to the "in destructor" (debug)
-    // check.
-    scoped_refptr<PlatformSharedBuffer> deleter(rv);
-    return nullptr;
-  }
-
-  return rv;
-}
-
-// static
-PlatformSharedBuffer* PlatformSharedBuffer::CreateFromSharedMemoryHandle(
-    size_t num_bytes,
-    bool read_only,
-    base::SharedMemoryHandle handle) {
-  DCHECK_GT(num_bytes, 0u);
-
-  PlatformSharedBuffer* rv = new PlatformSharedBuffer(num_bytes, read_only);
-  rv->InitFromSharedMemoryHandle(handle);
-
-  return rv;
-}
-
-size_t PlatformSharedBuffer::GetNumBytes() const {
-  return num_bytes_;
-}
-
-bool PlatformSharedBuffer::IsReadOnly() const {
-  return read_only_;
-}
-
-std::unique_ptr<PlatformSharedBufferMapping> PlatformSharedBuffer::Map(
-    size_t offset,
-    size_t length) {
-  if (!IsValidMap(offset, length))
-    return nullptr;
-
-  return MapNoCheck(offset, length);
-}
-
-bool PlatformSharedBuffer::IsValidMap(size_t offset, size_t length) {
-  if (offset > num_bytes_ || length == 0)
-    return false;
-
-  // Note: This is an overflow-safe check of |offset + length > num_bytes_|
-  // (that |num_bytes >= offset| is verified above).
-  if (length > num_bytes_ - offset)
-    return false;
-
-  return true;
-}
-
-std::unique_ptr<PlatformSharedBufferMapping> PlatformSharedBuffer::MapNoCheck(
-    size_t offset,
-    size_t length) {
-  DCHECK(IsValidMap(offset, length));
-  DCHECK(shared_memory_);
-  base::SharedMemoryHandle handle;
-  {
-    base::AutoLock locker(lock_);
-    handle = base::SharedMemory::DuplicateHandle(shared_memory_->handle());
-  }
-  if (handle == base::SharedMemory::NULLHandle())
-    return nullptr;
-
-  std::unique_ptr<PlatformSharedBufferMapping> mapping(
-      new PlatformSharedBufferMapping(handle, read_only_, offset, length));
-  if (mapping->Map())
-    return base::WrapUnique(mapping.release());
-
-  return nullptr;
-}
-
-ScopedPlatformHandle PlatformSharedBuffer::DuplicatePlatformHandle() {
-  DCHECK(shared_memory_);
-  base::SharedMemoryHandle handle;
-  {
-    base::AutoLock locker(lock_);
-    handle = base::SharedMemory::DuplicateHandle(shared_memory_->handle());
-  }
-  if (handle == base::SharedMemory::NULLHandle())
-    return ScopedPlatformHandle();
-
-  return SharedMemoryToPlatformHandle(handle);
-}
-
-ScopedPlatformHandle PlatformSharedBuffer::PassPlatformHandle() {
-  DCHECK(HasOneRef());
-
-  // The only way to pass a handle from base::SharedMemory is to duplicate it
-  // and close the original.
-  ScopedPlatformHandle handle = DuplicatePlatformHandle();
-
-  base::AutoLock locker(lock_);
-  shared_memory_->Close();
-  return handle;
-}
-
-base::SharedMemoryHandle PlatformSharedBuffer::DuplicateSharedMemoryHandle() {
-  DCHECK(shared_memory_);
-
-  base::AutoLock locker(lock_);
-  return base::SharedMemory::DuplicateHandle(shared_memory_->handle());
-}
-
-PlatformSharedBuffer* PlatformSharedBuffer::CreateReadOnlyDuplicate() {
-  DCHECK(shared_memory_);
-
-  if (ro_shared_memory_) {
-    base::AutoLock locker(lock_);
-    base::SharedMemoryHandle handle;
-    handle = base::SharedMemory::DuplicateHandle(ro_shared_memory_->handle());
-    if (handle == base::SharedMemory::NULLHandle())
-      return nullptr;
-    return CreateFromSharedMemoryHandle(num_bytes_, true, handle);
-  }
-
-  base::SharedMemoryHandle handle;
-  bool success;
-  {
-    base::AutoLock locker(lock_);
-    success = shared_memory_->ShareReadOnlyToProcess(
-        base::GetCurrentProcessHandle(), &handle);
-  }
-  if (!success || handle == base::SharedMemory::NULLHandle())
-      return nullptr;
-
-  return CreateFromSharedMemoryHandle(num_bytes_, true, handle);
-}
-
-PlatformSharedBuffer::PlatformSharedBuffer(size_t num_bytes, bool read_only)
-    : num_bytes_(num_bytes), read_only_(read_only) {}
-
-PlatformSharedBuffer::~PlatformSharedBuffer() {}
-
-bool PlatformSharedBuffer::Init() {
-  DCHECK(!shared_memory_);
-  DCHECK(!read_only_);
-
-  base::SharedMemoryCreateOptions options;
-  options.size = num_bytes_;
-  // By default, we can share as read-only.
-  options.share_read_only = true;
-
-  shared_memory_.reset(new base::SharedMemory);
-  return shared_memory_->Create(options);
-}
-
-bool PlatformSharedBuffer::InitFromPlatformHandle(
-    ScopedPlatformHandle platform_handle) {
-  DCHECK(!shared_memory_);
-
-#if defined(OS_WIN)
-  base::SharedMemoryHandle handle(platform_handle.release().handle,
-                                  base::GetCurrentProcId());
-#elif defined(OS_MACOSX) && !defined(OS_IOS)
-  base::SharedMemoryHandle handle;
-  handle = base::SharedMemoryHandle(platform_handle.release().port, num_bytes_,
-                                    base::GetCurrentProcId());
-#else
-  base::SharedMemoryHandle handle(platform_handle.release().handle, false);
-#endif
-
-  shared_memory_.reset(new base::SharedMemory(handle, read_only_));
-  return true;
-}
-
-bool PlatformSharedBuffer::InitFromPlatformHandlePair(
-    ScopedPlatformHandle rw_platform_handle,
-    ScopedPlatformHandle ro_platform_handle) {
-#if defined(OS_MACOSX)
-  NOTREACHED();
-  return false;
-#else  // defined(OS_MACOSX)
-
-#if defined(OS_WIN)
-  base::SharedMemoryHandle handle(rw_platform_handle.release().handle,
-                                  base::GetCurrentProcId());
-  base::SharedMemoryHandle ro_handle(ro_platform_handle.release().handle,
-                                     base::GetCurrentProcId());
-#else  // defined(OS_WIN)
-  base::SharedMemoryHandle handle(rw_platform_handle.release().handle, false);
-  base::SharedMemoryHandle ro_handle(ro_platform_handle.release().handle,
-                                     false);
-#endif  // defined(OS_WIN)
-
-  DCHECK(!shared_memory_);
-  shared_memory_.reset(new base::SharedMemory(handle, false));
-  ro_shared_memory_.reset(new base::SharedMemory(ro_handle, true));
-  return true;
-
-#endif  // defined(OS_MACOSX)
-}
-
-void PlatformSharedBuffer::InitFromSharedMemoryHandle(
-    base::SharedMemoryHandle handle) {
-  DCHECK(!shared_memory_);
-
-  shared_memory_.reset(new base::SharedMemory(handle, read_only_));
-}
-
-PlatformSharedBufferMapping::~PlatformSharedBufferMapping() {
-  Unmap();
-}
-
-void* PlatformSharedBufferMapping::GetBase() const {
-  return base_;
-}
-
-size_t PlatformSharedBufferMapping::GetLength() const {
-  return length_;
-}
-
-bool PlatformSharedBufferMapping::Map() {
-  // Mojo shared buffers can be mapped at any offset. However,
-  // base::SharedMemory must be mapped at a page boundary. So calculate what the
-  // nearest whole page offset is, and build a mapping that's offset from that.
-#if defined(OS_NACL)
-  // base::SysInfo isn't available under NaCl.
-  size_t page_size = getpagesize();
-#else
-  size_t page_size = base::SysInfo::VMAllocationGranularity();
-#endif
-  size_t offset_rounding = offset_ % page_size;
-  size_t real_offset = offset_ - offset_rounding;
-  size_t real_length = length_ + offset_rounding;
-
-  if (!shared_memory_.MapAt(static_cast<off_t>(real_offset), real_length))
-    return false;
-
-  base_ = static_cast<char*>(shared_memory_.memory()) + offset_rounding;
-  return true;
-}
-
-void PlatformSharedBufferMapping::Unmap() {
-  shared_memory_.Unmap();
-}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/embedder/platform_shared_buffer.h b/mojo/edk/embedder/platform_shared_buffer.h
deleted file mode 100644
index 45be723..0000000
--- a/mojo/edk/embedder/platform_shared_buffer.h
+++ /dev/null
@@ -1,178 +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 MOJO_EDK_EMBEDDER_PLATFORM_SHARED_BUFFER_H_
-#define MOJO_EDK_EMBEDDER_PLATFORM_SHARED_BUFFER_H_
-
-#include <stddef.h>
-
-#include <memory>
-
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/memory/shared_memory.h"
-#include "base/memory/shared_memory_handle.h"
-#include "base/synchronization/lock.h"
-#include "mojo/edk/embedder/scoped_platform_handle.h"
-#include "mojo/edk/system/system_impl_export.h"
-
-namespace mojo {
-namespace edk {
-
-class PlatformSharedBufferMapping;
-
-// |PlatformSharedBuffer| is a thread-safe, ref-counted wrapper around
-// OS-specific shared memory. It has the following features:
-//   - A |PlatformSharedBuffer| simply represents a piece of shared memory that
-//     *may* be mapped and *may* be shared to another process.
-//   - A single |PlatformSharedBuffer| may be mapped multiple times. The
-//     lifetime of the mapping (owned by |PlatformSharedBufferMapping|) is
-//     separate from the lifetime of the |PlatformSharedBuffer|.
-//   - Sizes/offsets (of the shared memory and mappings) are arbitrary, and not
-//     restricted by page size. However, more memory may actually be mapped than
-//     requested.
-class MOJO_SYSTEM_IMPL_EXPORT PlatformSharedBuffer
-    : public base::RefCountedThreadSafe<PlatformSharedBuffer> {
- public:
-  // Creates a shared buffer of size |num_bytes| bytes (initially zero-filled).
-  // |num_bytes| must be nonzero. Returns null on failure.
-  static PlatformSharedBuffer* Create(size_t num_bytes);
-
-  // Creates a shared buffer of size |num_bytes| from the existing platform
-  // handle |platform_handle|. Returns null on failure.
-  static PlatformSharedBuffer* CreateFromPlatformHandle(
-      size_t num_bytes,
-      bool read_only,
-      ScopedPlatformHandle platform_handle);
-
-  // Creates a shared buffer of size |num_bytes| from the existing pair of
-  // read/write and read-only handles |rw_platform_handle| and
-  // |ro_platform_handle|. Returns null on failure.
-  static PlatformSharedBuffer* CreateFromPlatformHandlePair(
-      size_t num_bytes,
-      ScopedPlatformHandle rw_platform_handle,
-      ScopedPlatformHandle ro_platform_handle);
-
-  // Creates a shared buffer of size |num_bytes| from the existing shared memory
-  // handle |handle|.
-  static PlatformSharedBuffer* CreateFromSharedMemoryHandle(
-      size_t num_bytes,
-      bool read_only,
-      base::SharedMemoryHandle handle);
-
-  // Gets the size of shared buffer (in number of bytes).
-  size_t GetNumBytes() const;
-
-  // Returns whether this shared buffer is read-only.
-  bool IsReadOnly() const;
-
-  // Maps (some) of the shared buffer into memory; [|offset|, |offset + length|]
-  // must be contained in [0, |num_bytes|], and |length| must be at least 1.
-  // Returns null on failure.
-  std::unique_ptr<PlatformSharedBufferMapping> Map(size_t offset,
-                                                   size_t length);
-
-  // Checks if |offset| and |length| are valid arguments.
-  bool IsValidMap(size_t offset, size_t length);
-
-  // Like |Map()|, but doesn't check its arguments (which should have been
-  // preflighted using |IsValidMap()|).
-  std::unique_ptr<PlatformSharedBufferMapping> MapNoCheck(size_t offset,
-                                                          size_t length);
-
-  // Duplicates the underlying platform handle and passes it to the caller.
-  ScopedPlatformHandle DuplicatePlatformHandle();
-
-  // Duplicates the underlying shared memory handle and passes it to the caller.
-  base::SharedMemoryHandle DuplicateSharedMemoryHandle();
-
-  // Passes the underlying platform handle to the caller. This should only be
-  // called if there's a unique reference to this object (owned by the caller).
-  // After calling this, this object should no longer be used, but should only
-  // be disposed of.
-  ScopedPlatformHandle PassPlatformHandle();
-
-  // Create and return a read-only duplicate of this shared buffer. If this
-  // shared buffer isn't capable of returning a read-only duplicate, then
-  // nullptr will be returned.
-  PlatformSharedBuffer* CreateReadOnlyDuplicate();
-
- private:
-  friend class base::RefCountedThreadSafe<PlatformSharedBuffer>;
-
-  PlatformSharedBuffer(size_t num_bytes, bool read_only);
-  ~PlatformSharedBuffer();
-
-  // This is called by |Create()| before this object is given to anyone.
-  bool Init();
-
-  // This is like |Init()|, but for |CreateFromPlatformHandle()|. (Note: It
-  // should verify that |platform_handle| is an appropriate handle for the
-  // claimed |num_bytes_|.)
-  bool InitFromPlatformHandle(ScopedPlatformHandle platform_handle);
-
-  bool InitFromPlatformHandlePair(ScopedPlatformHandle rw_platform_handle,
-                                  ScopedPlatformHandle ro_platform_handle);
-
-  void InitFromSharedMemoryHandle(base::SharedMemoryHandle handle);
-
-  const size_t num_bytes_;
-  const bool read_only_;
-
-  base::Lock lock_;
-  std::unique_ptr<base::SharedMemory> shared_memory_;
-
-  // A separate read-only shared memory for platforms that need it (i.e. Linux
-  // with sync broker).
-  std::unique_ptr<base::SharedMemory> ro_shared_memory_;
-
-  DISALLOW_COPY_AND_ASSIGN(PlatformSharedBuffer);
-};
-
-// A mapping of a |PlatformSharedBuffer| (compararable to a "file view" in
-// Windows); see above. Created by |PlatformSharedBuffer::Map()|. Automatically
-// unmaps memory on destruction.
-//
-// Mappings are NOT thread-safe.
-//
-// Note: This is an entirely separate class (instead of
-// |PlatformSharedBuffer::Mapping|) so that it can be forward-declared.
-class MOJO_SYSTEM_IMPL_EXPORT PlatformSharedBufferMapping {
- public:
-  ~PlatformSharedBufferMapping();
-
-  void* GetBase() const;
-  size_t GetLength() const;
-
- private:
-  friend class PlatformSharedBuffer;
-
-  PlatformSharedBufferMapping(base::SharedMemoryHandle handle,
-                              bool read_only,
-                              size_t offset,
-                              size_t length)
-      : offset_(offset),
-        length_(length),
-        base_(nullptr),
-        shared_memory_(handle, read_only) {}
-
-  bool Map();
-  void Unmap();
-
-  const size_t offset_;
-  const size_t length_;
-  void* base_;
-
-  // Since mapping life cycles are separate from PlatformSharedBuffer and a
-  // buffer can be mapped multiple times, we have our own SharedMemory object
-  // created from a duplicate handle.
-  base::SharedMemory shared_memory_;
-
-  DISALLOW_COPY_AND_ASSIGN(PlatformSharedBufferMapping);
-};
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_EMBEDDER_PLATFORM_SHARED_BUFFER_H_
diff --git a/mojo/edk/embedder/platform_shared_buffer_unittest.cc b/mojo/edk/embedder/platform_shared_buffer_unittest.cc
deleted file mode 100644
index f1593f0..0000000
--- a/mojo/edk/embedder/platform_shared_buffer_unittest.cc
+++ /dev/null
@@ -1,227 +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 "mojo/edk/embedder/platform_shared_buffer.h"
-
-#include <stddef.h>
-
-#include <limits>
-#include <memory>
-
-#include "base/memory/ref_counted.h"
-#include "base/memory/shared_memory.h"
-#include "base/sys_info.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-#if defined(OS_WIN)
-#include "base/win/windows_version.h"
-#endif
-
-namespace mojo {
-namespace edk {
-namespace {
-
-TEST(PlatformSharedBufferTest, Basic) {
-  const size_t kNumInts = 100;
-  const size_t kNumBytes = kNumInts * sizeof(int);
-  // A fudge so that we're not just writing zero bytes 75% of the time.
-  const int kFudge = 1234567890;
-
-  // Make some memory.
-  scoped_refptr<PlatformSharedBuffer> buffer(
-      PlatformSharedBuffer::Create(kNumBytes));
-  ASSERT_TRUE(buffer);
-
-  // Map it all, scribble some stuff, and then unmap it.
-  {
-    EXPECT_TRUE(buffer->IsValidMap(0, kNumBytes));
-    std::unique_ptr<PlatformSharedBufferMapping> mapping(
-        buffer->Map(0, kNumBytes));
-    ASSERT_TRUE(mapping);
-    ASSERT_TRUE(mapping->GetBase());
-    int* stuff = static_cast<int*>(mapping->GetBase());
-    for (size_t i = 0; i < kNumInts; i++)
-      stuff[i] = static_cast<int>(i) + kFudge;
-  }
-
-  // Map it all again, check that our scribbling is still there, then do a
-  // partial mapping and scribble on that, check that everything is coherent,
-  // unmap the first mapping, scribble on some of the second mapping, and then
-  // unmap it.
-  {
-    ASSERT_TRUE(buffer->IsValidMap(0, kNumBytes));
-    // Use |MapNoCheck()| this time.
-    std::unique_ptr<PlatformSharedBufferMapping> mapping1(
-        buffer->MapNoCheck(0, kNumBytes));
-    ASSERT_TRUE(mapping1);
-    ASSERT_TRUE(mapping1->GetBase());
-    int* stuff1 = static_cast<int*>(mapping1->GetBase());
-    for (size_t i = 0; i < kNumInts; i++)
-      EXPECT_EQ(static_cast<int>(i) + kFudge, stuff1[i]) << i;
-
-    std::unique_ptr<PlatformSharedBufferMapping> mapping2(
-        buffer->Map((kNumInts / 2) * sizeof(int), 2 * sizeof(int)));
-    ASSERT_TRUE(mapping2);
-    ASSERT_TRUE(mapping2->GetBase());
-    int* stuff2 = static_cast<int*>(mapping2->GetBase());
-    EXPECT_EQ(static_cast<int>(kNumInts / 2) + kFudge, stuff2[0]);
-    EXPECT_EQ(static_cast<int>(kNumInts / 2) + 1 + kFudge, stuff2[1]);
-
-    stuff2[0] = 123;
-    stuff2[1] = 456;
-    EXPECT_EQ(123, stuff1[kNumInts / 2]);
-    EXPECT_EQ(456, stuff1[kNumInts / 2 + 1]);
-
-    mapping1.reset();
-
-    EXPECT_EQ(123, stuff2[0]);
-    EXPECT_EQ(456, stuff2[1]);
-    stuff2[1] = 789;
-  }
-
-  // Do another partial mapping and check that everything is the way we expect
-  // it to be.
-  {
-    EXPECT_TRUE(buffer->IsValidMap(sizeof(int), kNumBytes - sizeof(int)));
-    std::unique_ptr<PlatformSharedBufferMapping> mapping(
-        buffer->Map(sizeof(int), kNumBytes - sizeof(int)));
-    ASSERT_TRUE(mapping);
-    ASSERT_TRUE(mapping->GetBase());
-    int* stuff = static_cast<int*>(mapping->GetBase());
-
-    for (size_t j = 0; j < kNumInts - 1; j++) {
-      int i = static_cast<int>(j) + 1;
-      if (i == kNumInts / 2) {
-        EXPECT_EQ(123, stuff[j]);
-      } else if (i == kNumInts / 2 + 1) {
-        EXPECT_EQ(789, stuff[j]);
-      } else {
-        EXPECT_EQ(i + kFudge, stuff[j]) << i;
-      }
-    }
-  }
-}
-
-// TODO(vtl): Bigger buffers.
-
-TEST(PlatformSharedBufferTest, InvalidMappings) {
-  scoped_refptr<PlatformSharedBuffer> buffer(PlatformSharedBuffer::Create(100));
-  ASSERT_TRUE(buffer);
-
-  // Zero length not allowed.
-  EXPECT_FALSE(buffer->Map(0, 0));
-  EXPECT_FALSE(buffer->IsValidMap(0, 0));
-
-  // Okay:
-  EXPECT_TRUE(buffer->Map(0, 100));
-  EXPECT_TRUE(buffer->IsValidMap(0, 100));
-  // Offset + length too big.
-  EXPECT_FALSE(buffer->Map(0, 101));
-  EXPECT_FALSE(buffer->IsValidMap(0, 101));
-  EXPECT_FALSE(buffer->Map(1, 100));
-  EXPECT_FALSE(buffer->IsValidMap(1, 100));
-
-  // Okay:
-  EXPECT_TRUE(buffer->Map(50, 50));
-  EXPECT_TRUE(buffer->IsValidMap(50, 50));
-  // Offset + length too big.
-  EXPECT_FALSE(buffer->Map(50, 51));
-  EXPECT_FALSE(buffer->IsValidMap(50, 51));
-  EXPECT_FALSE(buffer->Map(51, 50));
-  EXPECT_FALSE(buffer->IsValidMap(51, 50));
-}
-
-TEST(PlatformSharedBufferTest, TooBig) {
-  // If |size_t| is 32-bit, it's quite possible/likely that |Create()| succeeds
-  // (since it only involves creating a 4 GB file).
-  size_t max_size = std::numeric_limits<size_t>::max();
-  if (base::SysInfo::AmountOfVirtualMemory() &&
-      max_size > static_cast<size_t>(base::SysInfo::AmountOfVirtualMemory()))
-    max_size = static_cast<size_t>(base::SysInfo::AmountOfVirtualMemory());
-  scoped_refptr<PlatformSharedBuffer> buffer(
-      PlatformSharedBuffer::Create(max_size));
-  // But, assuming |sizeof(size_t) == sizeof(void*)|, mapping all of it should
-  // always fail.
-  if (buffer)
-    EXPECT_FALSE(buffer->Map(0, max_size));
-}
-
-// Tests that separate mappings get distinct addresses.
-// Note: It's not inconceivable that the OS could ref-count identical mappings
-// and reuse the same address, in which case we'd have to be more careful about
-// using the address as the key for unmapping.
-TEST(PlatformSharedBufferTest, MappingsDistinct) {
-  scoped_refptr<PlatformSharedBuffer> buffer(PlatformSharedBuffer::Create(100));
-  std::unique_ptr<PlatformSharedBufferMapping> mapping1(buffer->Map(0, 100));
-  std::unique_ptr<PlatformSharedBufferMapping> mapping2(buffer->Map(0, 100));
-  EXPECT_NE(mapping1->GetBase(), mapping2->GetBase());
-}
-
-TEST(PlatformSharedBufferTest, BufferZeroInitialized) {
-  static const size_t kSizes[] = {10, 100, 1000, 10000, 100000};
-  for (size_t i = 0; i < arraysize(kSizes); i++) {
-    scoped_refptr<PlatformSharedBuffer> buffer(
-        PlatformSharedBuffer::Create(kSizes[i]));
-    std::unique_ptr<PlatformSharedBufferMapping> mapping(
-        buffer->Map(0, kSizes[i]));
-    for (size_t j = 0; j < kSizes[i]; j++) {
-      // "Assert" instead of "expect" so we don't spam the output with thousands
-      // of failures if we fail.
-      ASSERT_EQ('\0', static_cast<char*>(mapping->GetBase())[j])
-          << "size " << kSizes[i] << ", offset " << j;
-    }
-  }
-}
-
-TEST(PlatformSharedBufferTest, MappingsOutliveBuffer) {
-  std::unique_ptr<PlatformSharedBufferMapping> mapping1;
-  std::unique_ptr<PlatformSharedBufferMapping> mapping2;
-
-  {
-    scoped_refptr<PlatformSharedBuffer> buffer(
-        PlatformSharedBuffer::Create(100));
-    mapping1 = buffer->Map(0, 100);
-    mapping2 = buffer->Map(50, 50);
-    static_cast<char*>(mapping1->GetBase())[50] = 'x';
-  }
-
-  EXPECT_EQ('x', static_cast<char*>(mapping2->GetBase())[0]);
-
-  static_cast<char*>(mapping2->GetBase())[1] = 'y';
-  EXPECT_EQ('y', static_cast<char*>(mapping1->GetBase())[51]);
-}
-
-TEST(PlatformSharedBufferTest, FromSharedMemoryHandle) {
-  const size_t kBufferSize = 1234;
-  base::SharedMemoryCreateOptions options;
-  options.size = kBufferSize;
-  base::SharedMemory shared_memory;
-  ASSERT_TRUE(shared_memory.Create(options));
-  ASSERT_TRUE(shared_memory.Map(kBufferSize));
-
-  base::SharedMemoryHandle shm_handle =
-      base::SharedMemory::DuplicateHandle(shared_memory.handle());
-  scoped_refptr<PlatformSharedBuffer> simple_buffer(
-      PlatformSharedBuffer::CreateFromSharedMemoryHandle(
-          kBufferSize, false /* read_only */, shm_handle));
-  ASSERT_TRUE(simple_buffer);
-
-  std::unique_ptr<PlatformSharedBufferMapping> mapping =
-      simple_buffer->Map(0, kBufferSize);
-  ASSERT_TRUE(mapping);
-
-  const int kOffset = 123;
-  char* base_memory = static_cast<char*>(shared_memory.memory());
-  char* mojo_memory = static_cast<char*>(mapping->GetBase());
-  base_memory[kOffset] = 0;
-  EXPECT_EQ(0, mojo_memory[kOffset]);
-  base_memory[kOffset] = 'a';
-  EXPECT_EQ('a', mojo_memory[kOffset]);
-  mojo_memory[kOffset] = 'z';
-  EXPECT_EQ('z', base_memory[kOffset]);
-}
-
-}  // namespace
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/embedder/scoped_ipc_support.cc b/mojo/edk/embedder/scoped_ipc_support.cc
deleted file mode 100644
index f67210a..0000000
--- a/mojo/edk/embedder/scoped_ipc_support.cc
+++ /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.
-
-#include "mojo/edk/embedder/scoped_ipc_support.h"
-
-#include "base/bind.h"
-#include "base/bind_helpers.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/threading/thread_restrictions.h"
-#include "mojo/edk/embedder/embedder.h"
-
-namespace mojo {
-namespace edk {
-
-ScopedIPCSupport::ScopedIPCSupport(
-    scoped_refptr<base::TaskRunner> io_thread_task_runner,
-    ShutdownPolicy shutdown_policy) : shutdown_policy_(shutdown_policy) {
-  InitIPCSupport(io_thread_task_runner);
-}
-
-ScopedIPCSupport::~ScopedIPCSupport() {
-  if (shutdown_policy_ == ShutdownPolicy::FAST) {
-    ShutdownIPCSupport(base::Bind(&base::DoNothing));
-    return;
-  }
-
-  base::WaitableEvent shutdown_event(
-      base::WaitableEvent::ResetPolicy::MANUAL,
-      base::WaitableEvent::InitialState::NOT_SIGNALED);
-  ShutdownIPCSupport(base::Bind(&base::WaitableEvent::Signal,
-                                base::Unretained(&shutdown_event)));
-
-  base::ThreadRestrictions::ScopedAllowWait allow_io;
-  shutdown_event.Wait();
-}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/embedder/scoped_ipc_support.h b/mojo/edk/embedder/scoped_ipc_support.h
deleted file mode 100644
index 22d8e50..0000000
--- a/mojo/edk/embedder/scoped_ipc_support.h
+++ /dev/null
@@ -1,118 +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 MOJO_EDK_EMBEDDER_SCOPED_IPC_SUPPORT_H_
-#define MOJO_EDK_EMBEDDER_SCOPED_IPC_SUPPORT_H_
-
-#include "base/memory/ref_counted.h"
-#include "mojo/edk/system/system_impl_export.h"
-
-namespace base {
-class TaskRunner;
-}
-
-namespace mojo {
-namespace edk {
-
-// A simple class that calls |InitIPCSupport()| on construction and
-// |ShutdownIPCSupport()| on destruction, blocking the destructor on clean IPC
-// shutdown completion.
-class MOJO_SYSTEM_IMPL_EXPORT ScopedIPCSupport {
- public:
-  // ShutdownPolicy is a type for specifying the desired Mojo IPC support
-  // shutdown behavior used during ScopedIPCSupport destruction.
-  //
-  // What follows is a quick overview of why shutdown behavior is interesting
-  // and how you might decide which behavior is right for your use case.
-  //
-  // BACKGROUND
-  // ==========
-  //
-  // In order to facilitate efficient and reliable transfer of Mojo message pipe
-  // endpoints across process boundaries, the underlying model for a message
-  // pipe is actually a self-collapsing cycle of "ports." See
-  // //mojo/edk/system/ports for gritty implementation details.
-  //
-  // Ports are essentially globally unique identifiers used for system-wide
-  // message routing. Every message pipe consists of at least two such ports:
-  // the pipe's two concrete endpoints.
-  //
-  // When a message pipe endpoint is transferred over another message pipe, that
-  // endpoint's port (which subsequently exists only internally with no
-  // publicly-reachable handle) enters a transient proxying state for the
-  // remainder of its lifetime. Once sufficient information has been
-  // proagated throughout the system and this proxying port can be safely
-  // bypassed, it is garbage-collected.
-  //
-  // If a process is terminated while hosting any active proxy ports, this
-  // will necessarily break the message pipe(s) to which those ports belong.
-  //
-  // WHEN TO USE CLEAN SHUTDOWN
-  // ==========================
-  //
-  // Consider three processes, A, B, and C. Suppose A creates a message pipe,
-  // sending one end to B and the other to C. For some brief period of time,
-  // messages sent by B or C over this pipe may be proxied through A.
-  //
-  // If A is suddenly terminated, there may be no way for B's messages to reach
-  // C (and vice versa), since the message pipe state may not have been fully
-  // propagated to all concerned processes in the system. As such, both B and C
-  // may have no choice but to signal peer closure on their respective ends of
-  // the pipe, and thus the pipe may be broken despite a lack of intent by
-  // either B or C.
-  //
-  // This can also happen if A creates a pipe and passes one end to B, who then
-  // passes it along to C. B may temporarily proxy messages for this pipe
-  // between A and C, and B's sudden demise will in turn beget the pipe's
-  // own sudden demise.
-  //
-  // In situations where these sort of arrangements may occur, potentially
-  // proxying processes must ensure they are shut down cleanly in order to avoid
-  // flaky system behavior.
-  //
-  // WHEN TO USE FAST SHUTDOWN
-  // =========================
-  //
-  // As a general rule of thumb, if your process never creates a message pipe
-  // where both ends are passed to other processes, or never forwards a pipe
-  // endpoint from one process to another, fast shutdown is safe. Satisfaction
-  // of these constraints can be difficult to prove though, so clean shutdown is
-  // a safe default choice.
-  //
-  // Content renderer processes are a good example of a case where fast shutdown
-  // is safe, because as a matter of security and stability, a renderer cannot
-  // be trusted to do any proxying on behalf of two other processes anyway.
-  //
-  // There are other practical scenarios where fast shutdown is safe even if
-  // the process may have live proxies. For example, content's browser process
-  // is treated as a sort of master process in the system, in the sense that if
-  // the browser is terminated, no other part of the system is expected to
-  // continue normal operation anyway. In this case the side-effects of fast
-  // shutdown are irrelevant, so fast shutdown is preferred.
-  enum class ShutdownPolicy {
-    // Clean shutdown. This causes the ScopedIPCSupport destructor to *block*
-    // the calling thread until clean shutdown is complete. See explanation
-    // above for details.
-    CLEAN,
-
-    // Fast shutdown. In this case a cheap best-effort attempt is made to
-    // shut down the IPC system, but no effort is made to wait for its
-    // completion. See explanation above for details.
-    FAST,
-  };
-
-  ScopedIPCSupport(scoped_refptr<base::TaskRunner> io_thread_task_runner,
-                   ShutdownPolicy shutdown_policy);
-  ~ScopedIPCSupport();
-
- private:
-  const ShutdownPolicy shutdown_policy_;
-
-  DISALLOW_COPY_AND_ASSIGN(ScopedIPCSupport);
-};
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_EMBEDDER_SCOPED_IPC_SUPPORT_H_
diff --git a/mojo/edk/embedder/scoped_platform_handle.h b/mojo/edk/embedder/scoped_platform_handle.h
deleted file mode 100644
index 15b80ea..0000000
--- a/mojo/edk/embedder/scoped_platform_handle.h
+++ /dev/null
@@ -1,63 +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 MOJO_EDK_EMBEDDER_SCOPED_PLATFORM_HANDLE_H_
-#define MOJO_EDK_EMBEDDER_SCOPED_PLATFORM_HANDLE_H_
-
-#include "base/compiler_specific.h"
-#include "base/macros.h"
-#include "mojo/edk/embedder/platform_handle.h"
-#include "mojo/edk/system/system_impl_export.h"
-#include "mojo/public/c/system/macros.h"
-
-namespace mojo {
-namespace edk {
-
-class MOJO_SYSTEM_IMPL_EXPORT ScopedPlatformHandle {
- public:
-  ScopedPlatformHandle() {}
-  explicit ScopedPlatformHandle(PlatformHandle handle) : handle_(handle) {}
-  ~ScopedPlatformHandle() { handle_.CloseIfNecessary(); }
-
-  // Move-only constructor and operator=.
-  ScopedPlatformHandle(ScopedPlatformHandle&& other)
-      : handle_(other.release()) {}
-
-  ScopedPlatformHandle& operator=(ScopedPlatformHandle&& other) {
-    if (this != &other)
-      handle_ = other.release();
-    return *this;
-  }
-
-  const PlatformHandle& get() const { return handle_; }
-
-  void swap(ScopedPlatformHandle& other) {
-    PlatformHandle temp = handle_;
-    handle_ = other.handle_;
-    other.handle_ = temp;
-  }
-
-  PlatformHandle release() WARN_UNUSED_RESULT {
-    PlatformHandle rv = handle_;
-    handle_ = PlatformHandle();
-    return rv;
-  }
-
-  void reset(PlatformHandle handle = PlatformHandle()) {
-    handle_.CloseIfNecessary();
-    handle_ = handle;
-  }
-
-  bool is_valid() const { return handle_.is_valid(); }
-
- private:
-  PlatformHandle handle_;
-
-  DISALLOW_COPY_AND_ASSIGN(ScopedPlatformHandle);
-};
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_EMBEDDER_SCOPED_PLATFORM_HANDLE_H_
diff --git a/mojo/edk/embedder/test_embedder.cc b/mojo/edk/embedder/test_embedder.cc
deleted file mode 100644
index 9658010..0000000
--- a/mojo/edk/embedder/test_embedder.cc
+++ /dev/null
@@ -1,46 +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 "mojo/edk/embedder/test_embedder.h"
-
-#include <memory>
-
-#include "base/logging.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/embedder/embedder_internal.h"
-#include "mojo/edk/system/core.h"
-#include "mojo/edk/system/handle_table.h"
-
-namespace mojo {
-
-namespace edk {
-namespace internal {
-
-bool ShutdownCheckNoLeaks(Core* core) {
-  std::vector<MojoHandle> leaked_handles;
-  core->GetActiveHandlesForTest(&leaked_handles);
-  if (leaked_handles.empty())
-    return true;
-  for (auto handle : leaked_handles)
-    LOG(ERROR) << "Mojo embedder shutdown: Leaking handle " << handle;
-  return false;
-}
-
-}  // namespace internal
-
-namespace test {
-
-bool Shutdown() {
-  CHECK(internal::g_core);
-  bool rv = internal::ShutdownCheckNoLeaks(internal::g_core);
-  delete internal::g_core;
-  internal::g_core = nullptr;
-
-  return rv;
-}
-
-}  // namespace test
-}  // namespace edk
-
-}  // namespace mojo
diff --git a/mojo/edk/embedder/test_embedder.h b/mojo/edk/embedder/test_embedder.h
deleted file mode 100644
index c64ba17..0000000
--- a/mojo/edk/embedder/test_embedder.h
+++ /dev/null
@@ -1,28 +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 MOJO_EDK_EMBEDDER_TEST_EMBEDDER_H_
-#define MOJO_EDK_EMBEDDER_TEST_EMBEDDER_H_
-
-#include "mojo/edk/system/system_impl_export.h"
-
-namespace mojo {
-namespace edk {
-namespace test {
-
-// This shuts down the global, singleton instance. (Note: "Real" embedders are
-// not expected to ever shut down this instance. This |Shutdown()| function will
-// do more work to ensure that tests don't leak, etc.) Returns true if there
-// were no problems, false if there were leaks -- i.e., handles still open -- or
-// any other problems.
-//
-// Note: It is up to the caller to ensure that there are not outstanding
-// callbacks from |CreateChannel()| before calling this.
-MOJO_SYSTEM_IMPL_EXPORT bool Shutdown();
-
-}  // namespace test
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_EMBEDDER_TEST_EMBEDDER_H_
diff --git a/mojo/edk/js/BUILD.gn b/mojo/edk/js/BUILD.gn
deleted file mode 100644
index fc1e03c..0000000
--- a/mojo/edk/js/BUILD.gn
+++ /dev/null
@@ -1,35 +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.
-
-component("js") {
-  sources = [
-    "core.cc",
-    "core.h",
-    "drain_data.cc",
-    "drain_data.h",
-    "handle.cc",
-    "handle.h",
-    "handle_close_observer.h",
-    "js_export.h",
-    "mojo_runner_delegate.cc",
-    "mojo_runner_delegate.h",
-    "support.cc",
-    "support.h",
-    "threading.cc",
-    "threading.h",
-    "waiting_callback.cc",
-    "waiting_callback.h",
-  ]
-
-  public_deps = [
-    "//base",
-    "//gin",
-    "//v8",
-  ]
-
-  deps = [
-    "//mojo/public/cpp/system",
-  ]
-  defines = [ "MOJO_JS_IMPLEMENTATION" ]
-}
diff --git a/mojo/edk/js/core.cc b/mojo/edk/js/core.cc
deleted file mode 100644
index baccc4c..0000000
--- a/mojo/edk/js/core.cc
+++ /dev/null
@@ -1,454 +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 "mojo/edk/js/core.h"
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include "base/bind.h"
-#include "base/logging.h"
-#include "gin/arguments.h"
-#include "gin/array_buffer.h"
-#include "gin/converter.h"
-#include "gin/dictionary.h"
-#include "gin/function_template.h"
-#include "gin/handle.h"
-#include "gin/object_template_builder.h"
-#include "gin/per_isolate_data.h"
-#include "gin/public/wrapper_info.h"
-#include "gin/wrappable.h"
-#include "mojo/edk/js/drain_data.h"
-#include "mojo/edk/js/handle.h"
-#include "mojo/public/cpp/system/wait.h"
-
-namespace mojo {
-namespace edk {
-namespace js {
-
-namespace {
-
-MojoResult CloseHandle(gin::Handle<HandleWrapper> handle) {
-  if (!handle->get().is_valid())
-    return MOJO_RESULT_INVALID_ARGUMENT;
-  handle->Close();
-  return MOJO_RESULT_OK;
-}
-
-gin::Dictionary QueryHandleSignalsState(const gin::Arguments& args,
-                                        mojo::Handle handle) {
-  gin::Dictionary dictionary = gin::Dictionary::CreateEmpty(args.isolate());
-  if (!handle.is_valid()) {
-    dictionary.Set("result", MOJO_RESULT_INVALID_ARGUMENT);
-  } else {
-    HandleSignalsState state = handle.QuerySignalsState();
-    dictionary.Set("result", MOJO_RESULT_OK);
-    dictionary.Set("satisfiedSignals", state.satisfied_signals);
-    dictionary.Set("satisfiableSignals", state.satisfiable_signals);
-  }
-  return dictionary;
-}
-
-gin::Dictionary WaitHandle(const gin::Arguments& args,
-                           mojo::Handle handle,
-                           MojoHandleSignals signals) {
-  v8::Isolate* isolate = args.isolate();
-  gin::Dictionary dictionary = gin::Dictionary::CreateEmpty(isolate);
-
-  MojoHandleSignalsState signals_state;
-  MojoResult result = Wait(handle, signals, &signals_state);
-  dictionary.Set("result", result);
-
-  if (result != MOJO_RESULT_OK && result != MOJO_RESULT_FAILED_PRECONDITION) {
-    dictionary.Set("signalsState", v8::Null(isolate).As<v8::Value>());
-  } else {
-    gin::Dictionary signalsStateDict = gin::Dictionary::CreateEmpty(isolate);
-    signalsStateDict.Set("satisfiedSignals", signals_state.satisfied_signals);
-    signalsStateDict.Set("satisfiableSignals",
-                         signals_state.satisfiable_signals);
-    dictionary.Set("signalsState", signalsStateDict);
-  }
-
-  return dictionary;
-}
-
-gin::Dictionary CreateMessagePipe(const gin::Arguments& args) {
-  gin::Dictionary dictionary = gin::Dictionary::CreateEmpty(args.isolate());
-  dictionary.Set("result", MOJO_RESULT_INVALID_ARGUMENT);
-
-  MojoHandle handle0 = MOJO_HANDLE_INVALID;
-  MojoHandle handle1 = MOJO_HANDLE_INVALID;
-  MojoResult result = MOJO_RESULT_OK;
-
-  v8::Handle<v8::Value> options_value = args.PeekNext();
-  if (options_value.IsEmpty() || options_value->IsNull() ||
-      options_value->IsUndefined()) {
-    result = MojoCreateMessagePipe(NULL, &handle0, &handle1);
-  } else if (options_value->IsObject()) {
-    gin::Dictionary options_dict(args.isolate(), options_value->ToObject());
-    MojoCreateMessagePipeOptions options;
-    // For future struct_size, we can probably infer that from the presence of
-    // properties in options_dict. For now, it's always 8.
-    options.struct_size = 8;
-    // Ideally these would be optional. But the interface makes it hard to
-    // typecheck them then.
-    if (!options_dict.Get("flags", &options.flags)) {
-      return dictionary;
-    }
-
-    result = MojoCreateMessagePipe(&options, &handle0, &handle1);
-  } else {
-      return dictionary;
-  }
-
-  CHECK_EQ(MOJO_RESULT_OK, result);
-
-  dictionary.Set("result", result);
-  dictionary.Set("handle0", mojo::Handle(handle0));
-  dictionary.Set("handle1", mojo::Handle(handle1));
-  return dictionary;
-}
-
-MojoResult WriteMessage(
-    mojo::Handle handle,
-    const gin::ArrayBufferView& buffer,
-    const std::vector<gin::Handle<HandleWrapper> >& handles,
-    MojoWriteMessageFlags flags) {
-  std::vector<MojoHandle> raw_handles(handles.size());
-  for (size_t i = 0; i < handles.size(); ++i)
-    raw_handles[i] = handles[i]->get().value();
-  MojoResult rv = MojoWriteMessage(handle.value(),
-                          buffer.bytes(),
-                          static_cast<uint32_t>(buffer.num_bytes()),
-                          raw_handles.empty() ? NULL : &raw_handles[0],
-                          static_cast<uint32_t>(raw_handles.size()),
-                          flags);
-  // MojoWriteMessage takes ownership of the handles, so release them here.
-  for (size_t i = 0; i < handles.size(); ++i)
-    ignore_result(handles[i]->release());
-
-  return rv;
-}
-
-gin::Dictionary ReadMessage(const gin::Arguments& args,
-                            mojo::Handle handle,
-                            MojoReadMessageFlags flags) {
-  uint32_t num_bytes = 0;
-  uint32_t num_handles = 0;
-  MojoResult result = MojoReadMessage(
-      handle.value(), NULL, &num_bytes, NULL, &num_handles, flags);
-  if (result != MOJO_RESULT_RESOURCE_EXHAUSTED) {
-    gin::Dictionary dictionary = gin::Dictionary::CreateEmpty(args.isolate());
-    dictionary.Set("result", result);
-    return dictionary;
-  }
-
-  v8::Handle<v8::ArrayBuffer> array_buffer =
-      v8::ArrayBuffer::New(args.isolate(), num_bytes);
-  std::vector<mojo::Handle> handles(num_handles);
-
-  gin::ArrayBuffer buffer;
-  ConvertFromV8(args.isolate(), array_buffer, &buffer);
-  CHECK(buffer.num_bytes() == num_bytes);
-
-  result = MojoReadMessage(handle.value(),
-                           buffer.bytes(),
-                           &num_bytes,
-                           handles.empty() ? NULL :
-                               reinterpret_cast<MojoHandle*>(&handles[0]),
-                           &num_handles,
-                           flags);
-
-  CHECK(buffer.num_bytes() == num_bytes);
-  CHECK(handles.size() == num_handles);
-
-  gin::Dictionary dictionary = gin::Dictionary::CreateEmpty(args.isolate());
-  dictionary.Set("result", result);
-  dictionary.Set("buffer", array_buffer);
-  dictionary.Set("handles", handles);
-  return dictionary;
-}
-
-gin::Dictionary CreateDataPipe(const gin::Arguments& args) {
-  gin::Dictionary dictionary = gin::Dictionary::CreateEmpty(args.isolate());
-  dictionary.Set("result", MOJO_RESULT_INVALID_ARGUMENT);
-
-  MojoHandle producer_handle = MOJO_HANDLE_INVALID;
-  MojoHandle consumer_handle = MOJO_HANDLE_INVALID;
-  MojoResult result = MOJO_RESULT_OK;
-
-  v8::Handle<v8::Value> options_value = args.PeekNext();
-  if (options_value.IsEmpty() || options_value->IsNull() ||
-      options_value->IsUndefined()) {
-    result = MojoCreateDataPipe(NULL, &producer_handle, &consumer_handle);
-  } else if (options_value->IsObject()) {
-    gin::Dictionary options_dict(args.isolate(), options_value->ToObject());
-    MojoCreateDataPipeOptions options;
-    // For future struct_size, we can probably infer that from the presence of
-    // properties in options_dict. For now, it's always 16.
-    options.struct_size = 16;
-    // Ideally these would be optional. But the interface makes it hard to
-    // typecheck them then.
-    if (!options_dict.Get("flags", &options.flags) ||
-        !options_dict.Get("elementNumBytes", &options.element_num_bytes) ||
-        !options_dict.Get("capacityNumBytes", &options.capacity_num_bytes)) {
-      return dictionary;
-    }
-
-    result = MojoCreateDataPipe(&options, &producer_handle, &consumer_handle);
-  } else {
-    return dictionary;
-  }
-
-  CHECK_EQ(MOJO_RESULT_OK, result);
-
-  dictionary.Set("result", result);
-  dictionary.Set("producerHandle", mojo::Handle(producer_handle));
-  dictionary.Set("consumerHandle", mojo::Handle(consumer_handle));
-  return dictionary;
-}
-
-gin::Dictionary WriteData(const gin::Arguments& args,
-                          mojo::Handle handle,
-                          const gin::ArrayBufferView& buffer,
-                          MojoWriteDataFlags flags) {
-  uint32_t num_bytes = static_cast<uint32_t>(buffer.num_bytes());
-  MojoResult result =
-      MojoWriteData(handle.value(), buffer.bytes(), &num_bytes, flags);
-  gin::Dictionary dictionary = gin::Dictionary::CreateEmpty(args.isolate());
-  dictionary.Set("result", result);
-  dictionary.Set("numBytes", num_bytes);
-  return dictionary;
-}
-
-gin::Dictionary ReadData(const gin::Arguments& args,
-                         mojo::Handle handle,
-                         MojoReadDataFlags flags) {
-  uint32_t num_bytes = 0;
-  MojoResult result = MojoReadData(
-      handle.value(), NULL, &num_bytes, MOJO_READ_DATA_FLAG_QUERY);
-  if (result != MOJO_RESULT_OK) {
-    gin::Dictionary dictionary = gin::Dictionary::CreateEmpty(args.isolate());
-    dictionary.Set("result", result);
-    return dictionary;
-  }
-
-  v8::Handle<v8::ArrayBuffer> array_buffer =
-      v8::ArrayBuffer::New(args.isolate(), num_bytes);
-  gin::ArrayBuffer buffer;
-  ConvertFromV8(args.isolate(), array_buffer, &buffer);
-  CHECK_EQ(num_bytes, buffer.num_bytes());
-
-  result = MojoReadData(handle.value(), buffer.bytes(), &num_bytes, flags);
-  CHECK_EQ(num_bytes, buffer.num_bytes());
-
-  gin::Dictionary dictionary = gin::Dictionary::CreateEmpty(args.isolate());
-  dictionary.Set("result", result);
-  dictionary.Set("buffer", array_buffer);
-  return dictionary;
-}
-
-// Asynchronously read all of the data available for the specified data pipe
-// consumer handle until the remote handle is closed or an error occurs. A
-// Promise is returned whose settled value is an object like this:
-// {result: core.RESULT_OK, buffer: dataArrayBuffer}. If the read failed,
-// then the Promise is rejected, the result will be the actual error code,
-// and the buffer will contain whatever was read before the error occurred.
-// The drainData data pipe handle argument is closed automatically.
-
-v8::Handle<v8::Value> DoDrainData(gin::Arguments* args,
-                                  gin::Handle<HandleWrapper> handle) {
-  return (new DrainData(args->isolate(), handle->release()))->GetPromise();
-}
-
-bool IsHandle(gin::Arguments* args, v8::Handle<v8::Value> val) {
-  gin::Handle<mojo::edk::js::HandleWrapper> ignore_handle;
-  return gin::Converter<gin::Handle<mojo::edk::js::HandleWrapper>>::FromV8(
-      args->isolate(), val, &ignore_handle);
-}
-
-gin::Dictionary CreateSharedBuffer(const gin::Arguments& args,
-                                   uint64_t num_bytes,
-                                   MojoCreateSharedBufferOptionsFlags flags) {
-  gin::Dictionary dictionary = gin::Dictionary::CreateEmpty(args.isolate());
-  MojoHandle handle = MOJO_HANDLE_INVALID;
-  MojoCreateSharedBufferOptions options;
-  // The |flags| is mandatory parameter for CreateSharedBuffer, and it will
-  // be always initialized in MojoCreateSharedBufferOptions struct. For
-  // forward compatibility, set struct_size to be 8 bytes (struct_size + flags),
-  // so that validator will only check the field that is set.
-  options.struct_size = 8;
-  options.flags = flags;
-  MojoResult result = MojoCreateSharedBuffer(&options, num_bytes, &handle);
-  if (result != MOJO_RESULT_OK) {
-    dictionary.Set("result", result);
-    return dictionary;
-  }
-
-  dictionary.Set("result", result);
-  dictionary.Set("handle", mojo::Handle(handle));
-
-  return dictionary;
-}
-
-gin::Dictionary DuplicateBufferHandle(
-    const gin::Arguments& args,
-    mojo::Handle handle,
-    MojoDuplicateBufferHandleOptionsFlags flags) {
-  gin::Dictionary dictionary = gin::Dictionary::CreateEmpty(args.isolate());
-  MojoHandle duped = MOJO_HANDLE_INVALID;
-  MojoDuplicateBufferHandleOptions options;
-  // The |flags| is mandatory parameter for DuplicateBufferHandle, and it will
-  // be always initialized in MojoDuplicateBufferHandleOptions struct. For
-  // forward compatibility, set struct_size to be 8 bytes (struct_size + flags),
-  // so that validator will only check the field that is set.
-  options.struct_size = 8;
-  options.flags = flags;
-  MojoResult result =
-      MojoDuplicateBufferHandle(handle.value(), &options, &duped);
-  if (result != MOJO_RESULT_OK) {
-    dictionary.Set("result", result);
-    return dictionary;
-  }
-
-  dictionary.Set("result", result);
-  dictionary.Set("handle", mojo::Handle(duped));
-
-  return dictionary;
-}
-
-gin::Dictionary MapBuffer(const gin::Arguments& args,
-                          mojo::Handle handle,
-                          uint64_t offset,
-                          uint64_t num_bytes,
-                          MojoMapBufferFlags flags) {
-  gin::Dictionary dictionary = gin::Dictionary::CreateEmpty(args.isolate());
-  void* data = nullptr;
-  MojoResult result =
-      MojoMapBuffer(handle.value(), offset, num_bytes, &data, flags);
-  if (result != MOJO_RESULT_OK) {
-    dictionary.Set("result", result);
-    return dictionary;
-  }
-
-  v8::Handle<v8::ArrayBuffer> array_buffer =
-      v8::ArrayBuffer::New(args.isolate(), data, num_bytes);
-
-  dictionary.Set("result", result);
-  dictionary.Set("buffer", array_buffer);
-
-  return dictionary;
-}
-
-MojoResult UnmapBuffer(const gin::Arguments& args,
-                       const v8::Handle<v8::ArrayBuffer>& buffer) {
-  // Buffer must be external, created by MapBuffer
-  if (!buffer->IsExternal())
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  return MojoUnmapBuffer(buffer->GetContents().Data());
-}
-
-gin::WrapperInfo g_wrapper_info = { gin::kEmbedderNativeGin };
-
-}  // namespace
-
-const char Core::kModuleName[] = "mojo/public/js/core";
-
-v8::Local<v8::Value> Core::GetModule(v8::Isolate* isolate) {
-  gin::PerIsolateData* data = gin::PerIsolateData::From(isolate);
-  v8::Local<v8::ObjectTemplate> templ = data->GetObjectTemplate(
-      &g_wrapper_info);
-
-  if (templ.IsEmpty()) {
-    templ =
-        gin::ObjectTemplateBuilder(isolate)
-            // TODO(mpcomplete): Should these just be methods on the JS Handle
-            // object?
-            .SetMethod("close", CloseHandle)
-            .SetMethod("queryHandleSignalsState", QueryHandleSignalsState)
-            .SetMethod("wait", WaitHandle)
-            .SetMethod("createMessagePipe", CreateMessagePipe)
-            .SetMethod("writeMessage", WriteMessage)
-            .SetMethod("readMessage", ReadMessage)
-            .SetMethod("createDataPipe", CreateDataPipe)
-            .SetMethod("writeData", WriteData)
-            .SetMethod("readData", ReadData)
-            .SetMethod("drainData", DoDrainData)
-            .SetMethod("isHandle", IsHandle)
-            .SetMethod("createSharedBuffer", CreateSharedBuffer)
-            .SetMethod("duplicateBufferHandle", DuplicateBufferHandle)
-            .SetMethod("mapBuffer", MapBuffer)
-            .SetMethod("unmapBuffer", UnmapBuffer)
-
-            .SetValue("RESULT_OK", MOJO_RESULT_OK)
-            .SetValue("RESULT_CANCELLED", MOJO_RESULT_CANCELLED)
-            .SetValue("RESULT_UNKNOWN", MOJO_RESULT_UNKNOWN)
-            .SetValue("RESULT_INVALID_ARGUMENT", MOJO_RESULT_INVALID_ARGUMENT)
-            .SetValue("RESULT_DEADLINE_EXCEEDED", MOJO_RESULT_DEADLINE_EXCEEDED)
-            .SetValue("RESULT_NOT_FOUND", MOJO_RESULT_NOT_FOUND)
-            .SetValue("RESULT_ALREADY_EXISTS", MOJO_RESULT_ALREADY_EXISTS)
-            .SetValue("RESULT_PERMISSION_DENIED", MOJO_RESULT_PERMISSION_DENIED)
-            .SetValue("RESULT_RESOURCE_EXHAUSTED",
-                      MOJO_RESULT_RESOURCE_EXHAUSTED)
-            .SetValue("RESULT_FAILED_PRECONDITION",
-                      MOJO_RESULT_FAILED_PRECONDITION)
-            .SetValue("RESULT_ABORTED", MOJO_RESULT_ABORTED)
-            .SetValue("RESULT_OUT_OF_RANGE", MOJO_RESULT_OUT_OF_RANGE)
-            .SetValue("RESULT_UNIMPLEMENTED", MOJO_RESULT_UNIMPLEMENTED)
-            .SetValue("RESULT_INTERNAL", MOJO_RESULT_INTERNAL)
-            .SetValue("RESULT_UNAVAILABLE", MOJO_RESULT_UNAVAILABLE)
-            .SetValue("RESULT_DATA_LOSS", MOJO_RESULT_DATA_LOSS)
-            .SetValue("RESULT_BUSY", MOJO_RESULT_BUSY)
-            .SetValue("RESULT_SHOULD_WAIT", MOJO_RESULT_SHOULD_WAIT)
-
-            .SetValue("HANDLE_SIGNAL_NONE", MOJO_HANDLE_SIGNAL_NONE)
-            .SetValue("HANDLE_SIGNAL_READABLE", MOJO_HANDLE_SIGNAL_READABLE)
-            .SetValue("HANDLE_SIGNAL_WRITABLE", MOJO_HANDLE_SIGNAL_WRITABLE)
-            .SetValue("HANDLE_SIGNAL_PEER_CLOSED",
-                      MOJO_HANDLE_SIGNAL_PEER_CLOSED)
-
-            .SetValue("CREATE_MESSAGE_PIPE_OPTIONS_FLAG_NONE",
-                      MOJO_CREATE_MESSAGE_PIPE_OPTIONS_FLAG_NONE)
-
-            .SetValue("WRITE_MESSAGE_FLAG_NONE", MOJO_WRITE_MESSAGE_FLAG_NONE)
-
-            .SetValue("READ_MESSAGE_FLAG_NONE", MOJO_READ_MESSAGE_FLAG_NONE)
-            .SetValue("READ_MESSAGE_FLAG_MAY_DISCARD",
-                      MOJO_READ_MESSAGE_FLAG_MAY_DISCARD)
-
-            .SetValue("CREATE_DATA_PIPE_OPTIONS_FLAG_NONE",
-                      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE)
-
-            .SetValue("WRITE_DATA_FLAG_NONE", MOJO_WRITE_DATA_FLAG_NONE)
-            .SetValue("WRITE_DATA_FLAG_ALL_OR_NONE",
-                      MOJO_WRITE_DATA_FLAG_ALL_OR_NONE)
-
-            .SetValue("READ_DATA_FLAG_NONE", MOJO_READ_DATA_FLAG_NONE)
-            .SetValue("READ_DATA_FLAG_ALL_OR_NONE",
-                      MOJO_READ_DATA_FLAG_ALL_OR_NONE)
-            .SetValue("READ_DATA_FLAG_DISCARD", MOJO_READ_DATA_FLAG_DISCARD)
-            .SetValue("READ_DATA_FLAG_QUERY", MOJO_READ_DATA_FLAG_QUERY)
-            .SetValue("READ_DATA_FLAG_PEEK", MOJO_READ_DATA_FLAG_PEEK)
-            .SetValue("CREATE_SHARED_BUFFER_OPTIONS_FLAG_NONE",
-                      MOJO_CREATE_SHARED_BUFFER_OPTIONS_FLAG_NONE)
-
-            .SetValue("DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_NONE",
-                      MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_NONE)
-
-            .SetValue("DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_READ_ONLY",
-                      MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_READ_ONLY)
-
-            .SetValue("MAP_BUFFER_FLAG_NONE", MOJO_MAP_BUFFER_FLAG_NONE)
-            .Build();
-
-    data->SetObjectTemplate(&g_wrapper_info, templ);
-  }
-
-  return templ->NewInstance();
-}
-
-}  // namespace js
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/js/core.h b/mojo/edk/js/core.h
deleted file mode 100644
index 97ef5df..0000000
--- a/mojo/edk/js/core.h
+++ /dev/null
@@ -1,25 +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 MOJO_EDK_JS_CORE_H_
-#define MOJO_EDK_JS_CORE_H_
-
-#include "mojo/edk/js/js_export.h"
-#include "v8/include/v8.h"
-
-namespace mojo {
-namespace edk {
-namespace js {
-
-class MOJO_JS_EXPORT Core {
- public:
-  static const char kModuleName[];
-  static v8::Local<v8::Value> GetModule(v8::Isolate* isolate);
-};
-
-}  // namespace js
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_JS_CORE_H_
diff --git a/mojo/edk/js/drain_data.cc b/mojo/edk/js/drain_data.cc
deleted file mode 100644
index 334ced3..0000000
--- a/mojo/edk/js/drain_data.cc
+++ /dev/null
@@ -1,129 +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 "mojo/edk/js/drain_data.h"
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include "base/bind.h"
-#include "base/memory/ptr_util.h"
-#include "gin/array_buffer.h"
-#include "gin/converter.h"
-#include "gin/dictionary.h"
-#include "gin/per_context_data.h"
-#include "gin/per_isolate_data.h"
-#include "mojo/public/cpp/system/core.h"
-
-namespace mojo {
-namespace edk {
-namespace js {
-
-DrainData::DrainData(v8::Isolate* isolate, mojo::Handle handle)
-    : isolate_(isolate),
-      handle_(DataPipeConsumerHandle(handle.value())),
-      handle_watcher_(FROM_HERE, SimpleWatcher::ArmingPolicy::AUTOMATIC) {
-  v8::Handle<v8::Context> context(isolate_->GetCurrentContext());
-  runner_ = gin::PerContextData::From(context)->runner()->GetWeakPtr();
-
-  WaitForData();
-}
-
-v8::Handle<v8::Value> DrainData::GetPromise() {
-  CHECK(resolver_.IsEmpty());
-  v8::Handle<v8::Promise::Resolver> resolver(
-      v8::Promise::Resolver::New(isolate_));
-  resolver_.Reset(isolate_, resolver);
-  return resolver->GetPromise();
-}
-
-DrainData::~DrainData() {
-  resolver_.Reset();
-}
-
-void DrainData::WaitForData() {
-  handle_watcher_.Watch(
-      handle_.get(), MOJO_HANDLE_SIGNAL_READABLE,
-      base::Bind(&DrainData::DataReady, base::Unretained(this)));
-}
-
-void DrainData::DataReady(MojoResult result) {
-  if (result != MOJO_RESULT_OK) {
-    DeliverData(result);
-    return;
-  }
-  while (result == MOJO_RESULT_OK) {
-    result = ReadData();
-    if (result == MOJO_RESULT_SHOULD_WAIT)
-      WaitForData();
-    else if (result != MOJO_RESULT_OK)
-      DeliverData(result);
-  }
-}
-
-MojoResult DrainData::ReadData() {
-  const void* buffer;
-  uint32_t num_bytes = 0;
-  MojoResult result = BeginReadDataRaw(
-      handle_.get(), &buffer, &num_bytes, MOJO_READ_DATA_FLAG_NONE);
-  if (result != MOJO_RESULT_OK)
-    return result;
-  const char* p = static_cast<const char*>(buffer);
-  data_buffers_.push_back(base::MakeUnique<DataBuffer>(p, p + num_bytes));
-  return EndReadDataRaw(handle_.get(), num_bytes);
-}
-
-void DrainData::DeliverData(MojoResult result) {
-  if (!runner_) {
-    delete this;
-    return;
-  }
-
-  size_t total_bytes = 0;
-  for (unsigned i = 0; i < data_buffers_.size(); i++)
-    total_bytes += data_buffers_[i]->size();
-
-  // Create a total_bytes length ArrayBuffer return value.
-  gin::Runner::Scope scope(runner_.get());
-  v8::Handle<v8::ArrayBuffer> array_buffer =
-      v8::ArrayBuffer::New(isolate_, total_bytes);
-  gin::ArrayBuffer buffer;
-  ConvertFromV8(isolate_, array_buffer, &buffer);
-  CHECK_EQ(total_bytes, buffer.num_bytes());
-
-  // Copy the data_buffers into the ArrayBuffer.
-  char* array_buffer_ptr = static_cast<char*>(buffer.bytes());
-  size_t offset = 0;
-  for (size_t i = 0; i < data_buffers_.size(); i++) {
-    size_t num_bytes = data_buffers_[i]->size();
-    if (num_bytes == 0)
-      continue;
-    const char* data_buffer_ptr = &((*data_buffers_[i])[0]);
-    memcpy(array_buffer_ptr + offset, data_buffer_ptr, num_bytes);
-    offset += num_bytes;
-  }
-
-  // The "settled" value of the promise always includes all of the data
-  // that was read before either an error occurred or the remote pipe handle
-  // was closed. The latter is indicated by MOJO_RESULT_FAILED_PRECONDITION.
-
-  v8::Handle<v8::Promise::Resolver> resolver(
-      v8::Local<v8::Promise::Resolver>::New(isolate_, resolver_));
-
-  gin::Dictionary dictionary = gin::Dictionary::CreateEmpty(isolate_);
-  dictionary.Set("result", result);
-  dictionary.Set("buffer", array_buffer);
-  v8::Handle<v8::Value> settled_value(ConvertToV8(isolate_, dictionary));
-
-  if (result == MOJO_RESULT_FAILED_PRECONDITION)
-    resolver->Resolve(settled_value);
-  else
-    resolver->Reject(settled_value);
-
-  delete this;
-}
-
-}  // namespace js
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/js/drain_data.h b/mojo/edk/js/drain_data.h
deleted file mode 100644
index 42da90f..0000000
--- a/mojo/edk/js/drain_data.h
+++ /dev/null
@@ -1,65 +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 MOJO_EDK_JS_DRAIN_DATA_H_
-#define MOJO_EDK_JS_DRAIN_DATA_H_
-
-#include <memory>
-#include <vector>
-
-#include "gin/runner.h"
-#include "mojo/public/cpp/system/core.h"
-#include "mojo/public/cpp/system/simple_watcher.h"
-#include "v8/include/v8.h"
-
-namespace mojo {
-namespace edk {
-namespace js {
-
-// This class is the implementation of the Mojo JavaScript core module's
-// drainData() method. It is not intended to be used directly. The caller
-// allocates a DrainData on the heap and returns GetPromise() to JS. The
-// implementation deletes itself after reading as much data as possible
-// and rejecting or resolving the Promise.
-
-class DrainData {
- public:
-  // Starts waiting for data on the specified data pipe consumer handle.
-  // See WaitForData(). The constructor does not block.
-  DrainData(v8::Isolate* isolate, mojo::Handle handle);
-
-  // Returns a Promise that will be settled when no more data can be read.
-  // Should be called just once on a newly allocated DrainData object.
-  v8::Handle<v8::Value> GetPromise();
-
- private:
-  ~DrainData();
-
-  // Waits for data to be available. DataReady() will be notified.
-  void WaitForData();
-
-  // Use ReadData() to read whatever is availble now on handle_ and save
-  // it in data_buffers_.
-  void DataReady(MojoResult result);
-  MojoResult ReadData();
-
-  // When the remote data pipe handle is closed, or an error occurs, deliver
-  // all of the buffered data to the JS Promise and then delete this.
-  void DeliverData(MojoResult result);
-
-  using DataBuffer = std::vector<char>;
-
-  v8::Isolate* isolate_;
-  ScopedDataPipeConsumerHandle handle_;
-  SimpleWatcher handle_watcher_;
-  base::WeakPtr<gin::Runner> runner_;
-  v8::UniquePersistent<v8::Promise::Resolver> resolver_;
-  std::vector<std::unique_ptr<DataBuffer>> data_buffers_;
-};
-
-}  // namespace js
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_JS_DRAIN_DATA_H_
diff --git a/mojo/edk/js/handle.cc b/mojo/edk/js/handle.cc
deleted file mode 100644
index 7da8e9f..0000000
--- a/mojo/edk/js/handle.cc
+++ /dev/null
@@ -1,85 +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 "mojo/edk/js/handle.h"
-
-#include "mojo/edk/js/handle_close_observer.h"
-
-namespace mojo {
-namespace edk {
-namespace js {
-
-gin::WrapperInfo HandleWrapper::kWrapperInfo = { gin::kEmbedderNativeGin };
-
-HandleWrapper::HandleWrapper(MojoHandle handle)
-    : handle_(mojo::Handle(handle)) {
-}
-
-HandleWrapper::~HandleWrapper() {
-  NotifyCloseObservers();
-}
-
-void HandleWrapper::Close() {
-  NotifyCloseObservers();
-  handle_.reset();
-}
-
-void HandleWrapper::AddCloseObserver(HandleCloseObserver* observer) {
-  close_observers_.AddObserver(observer);
-}
-
-void HandleWrapper::RemoveCloseObserver(HandleCloseObserver* observer) {
-  close_observers_.RemoveObserver(observer);
-}
-
-void HandleWrapper::NotifyCloseObservers() {
-  if (!handle_.is_valid())
-    return;
-
-  for (auto& observer : close_observers_)
-    observer.OnWillCloseHandle();
-}
-
-}  // namespace js
-}  // namespace edk
-}  // namespace mojo
-
-namespace gin {
-
-v8::Handle<v8::Value> Converter<mojo::Handle>::ToV8(v8::Isolate* isolate,
-                                                    const mojo::Handle& val) {
-  if (!val.is_valid())
-    return v8::Null(isolate);
-  return mojo::edk::js::HandleWrapper::Create(isolate, val.value()).ToV8();
-}
-
-bool Converter<mojo::Handle>::FromV8(v8::Isolate* isolate,
-                                     v8::Handle<v8::Value> val,
-                                     mojo::Handle* out) {
-  if (val->IsNull()) {
-    *out = mojo::Handle();
-    return true;
-  }
-
-  gin::Handle<mojo::edk::js::HandleWrapper> handle;
-  if (!Converter<gin::Handle<mojo::edk::js::HandleWrapper>>::FromV8(
-          isolate, val, &handle))
-    return false;
-
-  *out = handle->get();
-  return true;
-}
-
-v8::Handle<v8::Value> Converter<mojo::MessagePipeHandle>::ToV8(
-    v8::Isolate* isolate, mojo::MessagePipeHandle val) {
-  return Converter<mojo::Handle>::ToV8(isolate, val);
-}
-
-bool Converter<mojo::MessagePipeHandle>::FromV8(v8::Isolate* isolate,
-                                                v8::Handle<v8::Value> val,
-                                                mojo::MessagePipeHandle* out) {
-  return Converter<mojo::Handle>::FromV8(isolate, val, out);
-}
-
-}  // namespace gin
diff --git a/mojo/edk/js/handle.h b/mojo/edk/js/handle.h
deleted file mode 100644
index 60652ed..0000000
--- a/mojo/edk/js/handle.h
+++ /dev/null
@@ -1,107 +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 MOJO_EDK_JS_HANDLE_H_
-#define MOJO_EDK_JS_HANDLE_H_
-
-#include <stdint.h>
-
-#include "base/observer_list.h"
-#include "gin/converter.h"
-#include "gin/handle.h"
-#include "gin/wrappable.h"
-#include "mojo/edk/js/js_export.h"
-#include "mojo/public/cpp/system/core.h"
-
-namespace mojo {
-namespace edk {
-namespace js {
-
-class HandleCloseObserver;
-
-// Wrapper for mojo Handles exposed to JavaScript. This ensures the Handle
-// is Closed when its JS object is garbage collected.
-class MOJO_JS_EXPORT HandleWrapper : public gin::Wrappable<HandleWrapper> {
- public:
-  static gin::WrapperInfo kWrapperInfo;
-
-  static gin::Handle<HandleWrapper> Create(v8::Isolate* isolate,
-                                           MojoHandle handle) {
-    return gin::CreateHandle(isolate, new HandleWrapper(handle));
-  }
-
-  mojo::Handle get() const { return handle_.get(); }
-  mojo::Handle release() { return handle_.release(); }
-  void Close();
-
-  void AddCloseObserver(HandleCloseObserver* observer);
-  void RemoveCloseObserver(HandleCloseObserver* observer);
-
- protected:
-  HandleWrapper(MojoHandle handle);
-  ~HandleWrapper() override;
-  void NotifyCloseObservers();
-
-  mojo::ScopedHandle handle_;
-  base::ObserverList<HandleCloseObserver> close_observers_;
-};
-
-}  // namespace js
-}  // namespace edk
-}  // namespace mojo
-
-namespace gin {
-
-// Note: It's important to use this converter rather than the one for
-// MojoHandle, since that will do a simple int32_t conversion. It's unfortunate
-// there's no way to prevent against accidental use.
-// TODO(mpcomplete): define converters for all Handle subtypes.
-template <>
-struct MOJO_JS_EXPORT Converter<mojo::Handle> {
-  static v8::Handle<v8::Value> ToV8(v8::Isolate* isolate,
-                                    const mojo::Handle& val);
-  static bool FromV8(v8::Isolate* isolate, v8::Handle<v8::Value> val,
-                     mojo::Handle* out);
-};
-
-template <>
-struct MOJO_JS_EXPORT Converter<mojo::MessagePipeHandle> {
-  static v8::Handle<v8::Value> ToV8(v8::Isolate* isolate,
-                                    mojo::MessagePipeHandle val);
-  static bool FromV8(v8::Isolate* isolate,
-                     v8::Handle<v8::Value> val,
-                     mojo::MessagePipeHandle* out);
-};
-
-// We need to specialize the normal gin::Handle converter in order to handle
-// converting |null| to a wrapper for an empty mojo::Handle.
-template <>
-struct MOJO_JS_EXPORT Converter<gin::Handle<mojo::edk::js::HandleWrapper>> {
-  static v8::Handle<v8::Value> ToV8(
-      v8::Isolate* isolate,
-      const gin::Handle<mojo::edk::js::HandleWrapper>& val) {
-    return val.ToV8();
-  }
-
-  static bool FromV8(v8::Isolate* isolate,
-                     v8::Handle<v8::Value> val,
-                     gin::Handle<mojo::edk::js::HandleWrapper>* out) {
-    if (val->IsNull()) {
-      *out = mojo::edk::js::HandleWrapper::Create(isolate, MOJO_HANDLE_INVALID);
-      return true;
-    }
-
-    mojo::edk::js::HandleWrapper* object = NULL;
-    if (!Converter<mojo::edk::js::HandleWrapper*>::FromV8(isolate, val,
-                                                          &object)) {
-      return false;
-    }
-    *out = gin::Handle<mojo::edk::js::HandleWrapper>(val, object);
-    return true;
-  }
-};
-
-}  // namespace gin
-
-#endif  // MOJO_EDK_JS_HANDLE_H_
diff --git a/mojo/edk/js/handle_close_observer.h b/mojo/edk/js/handle_close_observer.h
deleted file mode 100644
index c7b935e..0000000
--- a/mojo/edk/js/handle_close_observer.h
+++ /dev/null
@@ -1,24 +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 MOJO_EDK_JS_HANDLE_CLOSE_OBSERVER_H_
-#define MOJO_EDK_JS_HANDLE_CLOSE_OBSERVER_H_
-
-namespace mojo {
-namespace edk {
-namespace js {
-
-class HandleCloseObserver {
- public:
-  virtual void OnWillCloseHandle() = 0;
-
- protected:
-  virtual ~HandleCloseObserver() {}
-};
-
-}  // namespace js
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_JS_HANDLE_CLOSE_OBSERVER_H_
diff --git a/mojo/edk/js/handle_unittest.cc b/mojo/edk/js/handle_unittest.cc
deleted file mode 100644
index dd2562f..0000000
--- a/mojo/edk/js/handle_unittest.cc
+++ /dev/null
@@ -1,92 +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 "base/macros.h"
-#include "mojo/edk/js/handle.h"
-#include "mojo/edk/js/handle_close_observer.h"
-#include "mojo/public/cpp/system/core.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace edk {
-namespace js {
-
-class HandleWrapperTest : public testing::Test,
-                          public HandleCloseObserver {
- public:
-  HandleWrapperTest() : closes_observed_(0) {}
-
-  void OnWillCloseHandle() override { closes_observed_++; }
-
- protected:
-  int closes_observed_;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(HandleWrapperTest);
-};
-
-class TestHandleWrapper : public HandleWrapper {
- public:
-  explicit TestHandleWrapper(MojoHandle handle) : HandleWrapper(handle) {}
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(TestHandleWrapper);
-};
-
-// Test that calling Close() on a HandleWrapper for an invalid handle does not
-// notify observers.
-TEST_F(HandleWrapperTest, CloseWithInvalidHandle) {
-  {
-    TestHandleWrapper wrapper(MOJO_HANDLE_INVALID);
-    wrapper.AddCloseObserver(this);
-    ASSERT_EQ(0, closes_observed_);
-    wrapper.Close();
-    EXPECT_EQ(0, closes_observed_);
-  }
-  EXPECT_EQ(0, closes_observed_);
-}
-
-// Test that destroying a HandleWrapper for an invalid handle does not notify
-// observers.
-TEST_F(HandleWrapperTest, DestroyWithInvalidHandle) {
-  {
-    TestHandleWrapper wrapper(MOJO_HANDLE_INVALID);
-    wrapper.AddCloseObserver(this);
-    ASSERT_EQ(0, closes_observed_);
-  }
-  EXPECT_EQ(0, closes_observed_);
-}
-
-// Test that calling Close on a HandleWrapper for a valid handle notifies
-// observers once.
-TEST_F(HandleWrapperTest, CloseWithValidHandle) {
-  {
-    mojo::MessagePipe pipe;
-    TestHandleWrapper wrapper(pipe.handle0.release().value());
-    wrapper.AddCloseObserver(this);
-    ASSERT_EQ(0, closes_observed_);
-    wrapper.Close();
-    EXPECT_EQ(1, closes_observed_);
-    // Check that calling close again doesn't notify observers.
-    wrapper.Close();
-    EXPECT_EQ(1, closes_observed_);
-  }
-  // Check that destroying a closed HandleWrapper doesn't notify observers.
-  EXPECT_EQ(1, closes_observed_);
-}
-
-// Test that destroying a HandleWrapper for a valid handle notifies observers.
-TEST_F(HandleWrapperTest, DestroyWithValidHandle) {
-  {
-    mojo::MessagePipe pipe;
-    TestHandleWrapper wrapper(pipe.handle0.release().value());
-    wrapper.AddCloseObserver(this);
-    ASSERT_EQ(0, closes_observed_);
-  }
-  EXPECT_EQ(1, closes_observed_);
-}
-
-}  // namespace js
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/js/js_export.h b/mojo/edk/js/js_export.h
deleted file mode 100644
index 179113c..0000000
--- a/mojo/edk/js/js_export.h
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_JS_JS_EXPORT_H_
-#define MOJO_EDK_JS_JS_EXPORT_H_
-
-// Defines MOJO_JS_EXPORT so that functionality implemented by //mojo/edk/js can
-// be exported to consumers.
-
-#if defined(COMPONENT_BUILD)
-#if defined(WIN32)
-
-#if defined(MOJO_JS_IMPLEMENTATION)
-#define MOJO_JS_EXPORT __declspec(dllexport)
-#else
-#define MOJO_JS_EXPORT __declspec(dllimport)
-#endif  // defined(MOJO_JS_IMPLEMENTATION)
-
-#else  // defined(WIN32)
-#if defined(MOJO_JS_IMPLEMENTATION)
-#define MOJO_JS_EXPORT __attribute__((visibility("default")))
-#else
-#define MOJO_JS_EXPORT
-#endif
-#endif
-
-#else  // defined(COMPONENT_BUILD)
-#define MOJO_JS_EXPORT
-#endif
-
-#endif  // MOJO_EDK_JS_JS_EXPORT_H_
diff --git a/mojo/edk/js/mojo_runner_delegate.cc b/mojo/edk/js/mojo_runner_delegate.cc
deleted file mode 100644
index dda0b2c..0000000
--- a/mojo/edk/js/mojo_runner_delegate.cc
+++ /dev/null
@@ -1,80 +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 "mojo/edk/js/mojo_runner_delegate.h"
-
-#include "base/bind.h"
-#include "base/path_service.h"
-#include "gin/converter.h"
-#include "gin/modules/console.h"
-#include "gin/modules/module_registry.h"
-#include "gin/modules/timer.h"
-#include "gin/try_catch.h"
-#include "mojo/edk/js/core.h"
-#include "mojo/edk/js/handle.h"
-#include "mojo/edk/js/support.h"
-#include "mojo/edk/js/threading.h"
-
-namespace mojo {
-namespace edk {
-namespace js {
-
-namespace {
-
-// TODO(abarth): Rather than loading these modules from the file system, we
-// should load them from the network via Mojo IPC.
-std::vector<base::FilePath> GetModuleSearchPaths() {
-  std::vector<base::FilePath> search_paths(2);
-  PathService::Get(base::DIR_SOURCE_ROOT, &search_paths[0]);
-  PathService::Get(base::DIR_EXE, &search_paths[1]);
-  search_paths[1] = search_paths[1].AppendASCII("gen");
-  return search_paths;
-}
-
-void StartCallback(base::WeakPtr<gin::Runner> runner,
-                   MojoHandle pipe,
-                   v8::Handle<v8::Value> module) {
-  v8::Isolate* isolate = runner->GetContextHolder()->isolate();
-  v8::Handle<v8::Function> start;
-  CHECK(gin::ConvertFromV8(isolate, module, &start));
-
-  v8::Handle<v8::Value> args[] = {
-      gin::ConvertToV8(isolate, Handle(pipe)) };
-  runner->Call(start, runner->global(), 1, args);
-}
-
-}  // namespace
-
-MojoRunnerDelegate::MojoRunnerDelegate()
-    : ModuleRunnerDelegate(GetModuleSearchPaths()) {
-  AddBuiltinModule(gin::Console::kModuleName, gin::Console::GetModule);
-  AddBuiltinModule(gin::TimerModule::kName, gin::TimerModule::GetModule);
-  AddBuiltinModule(Core::kModuleName, Core::GetModule);
-  AddBuiltinModule(Support::kModuleName, Support::GetModule);
-  AddBuiltinModule(Threading::kModuleName, Threading::GetModule);
-}
-
-MojoRunnerDelegate::~MojoRunnerDelegate() {
-}
-
-void MojoRunnerDelegate::Start(gin::Runner* runner,
-                               MojoHandle pipe,
-                               const std::string& module) {
-  gin::Runner::Scope scope(runner);
-  gin::ModuleRegistry* registry =
-      gin::ModuleRegistry::From(runner->GetContextHolder()->context());
-  registry->LoadModule(runner->GetContextHolder()->isolate(), module,
-                       base::Bind(StartCallback, runner->GetWeakPtr(), pipe));
-  AttemptToLoadMoreModules(runner);
-}
-
-void MojoRunnerDelegate::UnhandledException(gin::ShellRunner* runner,
-                                            gin::TryCatch& try_catch) {
-  gin::ModuleRunnerDelegate::UnhandledException(runner, try_catch);
-  LOG(ERROR) << try_catch.GetStackTrace();
-}
-
-}  // namespace js
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/js/mojo_runner_delegate.h b/mojo/edk/js/mojo_runner_delegate.h
deleted file mode 100644
index 9ab325c..0000000
--- a/mojo/edk/js/mojo_runner_delegate.h
+++ /dev/null
@@ -1,36 +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 MOJO_EDK_JS_MOJO_RUNNER_DELEGATE_H_
-#define MOJO_EDK_JS_MOJO_RUNNER_DELEGATE_H_
-
-#include "base/macros.h"
-#include "gin/modules/module_runner_delegate.h"
-#include "mojo/edk/js/js_export.h"
-#include "mojo/public/c/system/core.h"
-
-namespace mojo {
-namespace edk {
-namespace js {
-
-class MOJO_JS_EXPORT MojoRunnerDelegate : public gin::ModuleRunnerDelegate {
- public:
-  MojoRunnerDelegate();
-  ~MojoRunnerDelegate() override;
-
-  void Start(gin::Runner* runner, MojoHandle pipe, const std::string& module);
-
- private:
-  // From ModuleRunnerDelegate:
-  void UnhandledException(gin::ShellRunner* runner,
-                          gin::TryCatch& try_catch) override;
-
-  DISALLOW_COPY_AND_ASSIGN(MojoRunnerDelegate);
-};
-
-}  // namespace js
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_JS_MOJO_RUNNER_DELEGATE_H_
diff --git a/mojo/edk/js/support.cc b/mojo/edk/js/support.cc
deleted file mode 100644
index 404cb9b..0000000
--- a/mojo/edk/js/support.cc
+++ /dev/null
@@ -1,77 +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 "mojo/edk/js/support.h"
-
-#include "base/bind.h"
-#include "gin/arguments.h"
-#include "gin/converter.h"
-#include "gin/function_template.h"
-#include "gin/object_template_builder.h"
-#include "gin/per_isolate_data.h"
-#include "gin/public/wrapper_info.h"
-#include "gin/wrappable.h"
-#include "mojo/edk/js/handle.h"
-#include "mojo/edk/js/waiting_callback.h"
-#include "mojo/public/cpp/system/core.h"
-
-namespace mojo {
-namespace edk {
-namespace js {
-
-namespace {
-
-WaitingCallback* AsyncWait(const gin::Arguments& args,
-                           gin::Handle<HandleWrapper> handle,
-                           MojoHandleSignals signals,
-                           v8::Handle<v8::Function> callback) {
-  return WaitingCallback::Create(
-      args.isolate(), callback, handle, signals, true /* one_shot */).get();
-}
-
-void CancelWait(WaitingCallback* waiting_callback) {
-  waiting_callback->Cancel();
-}
-
-WaitingCallback* Watch(const gin::Arguments& args,
-                       gin::Handle<HandleWrapper> handle,
-                       MojoHandleSignals signals,
-                       v8::Handle<v8::Function> callback) {
-  return WaitingCallback::Create(
-      args.isolate(), callback, handle, signals, false /* one_shot */).get();
-}
-
-void CancelWatch(WaitingCallback* waiting_callback) {
-  waiting_callback->Cancel();
-}
-
-gin::WrapperInfo g_wrapper_info = { gin::kEmbedderNativeGin };
-
-}  // namespace
-
-const char Support::kModuleName[] = "mojo/public/js/support";
-
-v8::Local<v8::Value> Support::GetModule(v8::Isolate* isolate) {
-  gin::PerIsolateData* data = gin::PerIsolateData::From(isolate);
-  v8::Local<v8::ObjectTemplate> templ = data->GetObjectTemplate(
-      &g_wrapper_info);
-
-  if (templ.IsEmpty()) {
-    templ = gin::ObjectTemplateBuilder(isolate)
-                // TODO(rockot): Remove asyncWait and cancelWait.
-                .SetMethod("asyncWait", AsyncWait)
-                .SetMethod("cancelWait", CancelWait)
-                .SetMethod("watch", Watch)
-                .SetMethod("cancelWatch", CancelWatch)
-                .Build();
-
-    data->SetObjectTemplate(&g_wrapper_info, templ);
-  }
-
-  return templ->NewInstance();
-}
-
-}  // namespace js
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/js/support.h b/mojo/edk/js/support.h
deleted file mode 100644
index 551f5ac..0000000
--- a/mojo/edk/js/support.h
+++ /dev/null
@@ -1,25 +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 MOJO_EDK_JS_SUPPORT_H_
-#define MOJO_EDK_JS_SUPPORT_H_
-
-#include "mojo/edk/js/js_export.h"
-#include "v8/include/v8.h"
-
-namespace mojo {
-namespace edk {
-namespace js {
-
-class MOJO_JS_EXPORT Support {
- public:
-  static const char kModuleName[];
-  static v8::Local<v8::Value> GetModule(v8::Isolate* isolate);
-};
-
-}  // namespace js
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_JS_SUPPORT_H_
diff --git a/mojo/edk/js/tests/BUILD.gn b/mojo/edk/js/tests/BUILD.gn
deleted file mode 100644
index f56c4b9..0000000
--- a/mojo/edk/js/tests/BUILD.gn
+++ /dev/null
@@ -1,68 +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.
-
-import("//mojo/public/tools/bindings/mojom.gni")
-import("//testing/test.gni")
-
-# TODO(hansmuller): The organization of tests in this directory is weird:
-#   * Really, js_unittests tests public stuff, so that should live in public
-#     and be reworked as some sort of apptest.
-#   * Both js_unittests and js_integration_tests should auto-generate their
-#     tests somehow. The .cc files are just test runner stubs, including
-#     explicit lists of .js files.
-
-group("tests") {
-  testonly = true
-  deps = [
-    ":mojo_js_integration_tests",
-    ":mojo_js_unittests",
-  ]
-}
-
-test("mojo_js_integration_tests") {
-  deps = [
-    ":js_to_cpp_bindings",
-    "//gin:gin_test",
-    "//mojo/common",
-    "//mojo/edk/js",
-    "//mojo/edk/test:run_all_unittests",
-    "//mojo/public/cpp/bindings",
-    "//mojo/public/cpp/system",
-    "//mojo/public/js:bindings",
-  ]
-
-  sources = [
-    "js_to_cpp_tests.cc",
-  ]
-
-  data = [
-    "js_to_cpp_tests.js",
-  ]
-
-  configs += [ "//v8:external_startup_data" ]
-}
-
-mojom("js_to_cpp_bindings") {
-  sources = [
-    "js_to_cpp.mojom",
-  ]
-}
-
-test("mojo_js_unittests") {
-  deps = [
-    "//base",
-    "//gin:gin_test",
-    "//mojo/edk/js",
-    "//mojo/edk/test:run_all_unittests",
-    "//mojo/edk/test:test_support",
-    "//mojo/public/cpp/system",
-    "//mojo/public/interfaces/bindings/tests:test_interfaces",
-    "//mojo/public/js:tests",
-  ]
-
-  sources = [
-    "//mojo/edk/js/handle_unittest.cc",
-    "run_js_unittests.cc",
-  ]
-}
diff --git a/mojo/edk/js/tests/js_to_cpp.mojom b/mojo/edk/js/tests/js_to_cpp.mojom
deleted file mode 100644
index 688b22b..0000000
--- a/mojo/edk/js/tests/js_to_cpp.mojom
+++ /dev/null
@@ -1,54 +0,0 @@
-module js_to_cpp;
-
-// This struct encompasses all of the basic types, so that they
-// may be sent from C++ to JS and back for validation.
-struct EchoArgs {
-  int64 si64;
-  int32 si32;
-  int16 si16;
-  int8  si8;
-  uint64 ui64;
-  uint32 ui32;
-  uint16 ui16;
-  uint8  ui8;
-  float float_val;
-  float float_inf;
-  float float_nan;
-  double double_val;
-  double double_inf;
-  double double_nan;
-  string? name;
-  array<string>? string_array;
-  handle<message_pipe>? message_handle;
-  handle<data_pipe_consumer>? data_handle;
-};
-
-struct EchoArgsList {
-  EchoArgsList? next;
-  EchoArgs? item;
-};
-
-// Note: For messages which control test flow, pick numbers that are unlikely
-// to be hit as a result of our deliberate corruption of response messages.
-interface CppSide {
-  // Sent for all tests to notify that the JS side is now ready.
-  StartTest@88888888();
-
-  // Indicates end for echo, bit-flip, and back-pointer tests.
-  TestFinished@99999999();
-
-  // Responses from specific tests.
-  PingResponse();
-  EchoResponse(EchoArgsList list);
-  BitFlipResponse(EchoArgsList arg);
-  BackPointerResponse(EchoArgsList arg);
-};
-
-interface JsSide {
-  SetCppSide(CppSide cpp);
-
-  Ping();
-  Echo(int32 numIterations, EchoArgs arg);
-  BitFlip(EchoArgs arg);
-  BackPointer(EchoArgs arg);
-};
diff --git a/mojo/edk/js/tests/js_to_cpp_tests.cc b/mojo/edk/js/tests/js_to_cpp_tests.cc
deleted file mode 100644
index b6b74e3..0000000
--- a/mojo/edk/js/tests/js_to_cpp_tests.cc
+++ /dev/null
@@ -1,455 +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 <stddef.h>
-#include <stdint.h>
-
-#include <string>
-#include <utility>
-
-#include "base/at_exit.h"
-#include "base/files/file_path.h"
-#include "base/files/file_util.h"
-#include "base/macros.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "base/strings/utf_string_conversions.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "gin/array_buffer.h"
-#include "gin/public/isolate_holder.h"
-#include "gin/v8_initializer.h"
-#include "mojo/common/data_pipe_utils.h"
-#include "mojo/edk/js/mojo_runner_delegate.h"
-#include "mojo/edk/js/tests/js_to_cpp.mojom.h"
-#include "mojo/public/cpp/bindings/binding.h"
-#include "mojo/public/cpp/bindings/lib/validation_errors.h"
-#include "mojo/public/cpp/system/core.h"
-#include "mojo/public/cpp/system/wait.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace edk {
-namespace js {
-
-// Global value updated by some checks to prevent compilers from optimizing
-// reads out of existence.
-uint32_t g_waste_accumulator = 0;
-
-namespace {
-
-// Negative numbers with different values in each byte, the last of
-// which can survive promotion to double and back.
-const int8_t kExpectedInt8Value = -65;
-const int16_t kExpectedInt16Value = -16961;
-const int32_t kExpectedInt32Value = -1145258561;
-const int64_t kExpectedInt64Value = -77263311946305LL;
-
-// Positive numbers with different values in each byte, the last of
-// which can survive promotion to double and back.
-const uint8_t kExpectedUInt8Value = 65;
-const uint16_t kExpectedUInt16Value = 16961;
-const uint32_t kExpectedUInt32Value = 1145258561;
-const uint64_t kExpectedUInt64Value = 77263311946305LL;
-
-// Double/float values, including special case constants.
-const double kExpectedDoubleVal = 3.14159265358979323846;
-const double kExpectedDoubleInf = std::numeric_limits<double>::infinity();
-const double kExpectedDoubleNan = std::numeric_limits<double>::quiet_NaN();
-const float kExpectedFloatVal = static_cast<float>(kExpectedDoubleVal);
-const float kExpectedFloatInf = std::numeric_limits<float>::infinity();
-const float kExpectedFloatNan = std::numeric_limits<float>::quiet_NaN();
-
-// NaN has the property that it is not equal to itself.
-#define EXPECT_NAN(x) EXPECT_NE(x, x)
-
-void CheckDataPipe(ScopedDataPipeConsumerHandle data_pipe_handle) {
-  std::string buffer;
-  bool result = common::BlockingCopyToString(std::move(data_pipe_handle),
-                                             &buffer);
-  EXPECT_TRUE(result);
-  EXPECT_EQ(64u, buffer.size());
-  for (int i = 0; i < 64; ++i) {
-    EXPECT_EQ(i, buffer[i]);
-  }
-}
-
-void CheckMessagePipe(MessagePipeHandle message_pipe_handle) {
-  unsigned char buffer[100];
-  uint32_t buffer_size = static_cast<uint32_t>(sizeof(buffer));
-  MojoResult result = Wait(message_pipe_handle, MOJO_HANDLE_SIGNAL_READABLE);
-  EXPECT_EQ(MOJO_RESULT_OK, result);
-  result = ReadMessageRaw(
-      message_pipe_handle, buffer, &buffer_size, 0, 0, 0);
-  EXPECT_EQ(MOJO_RESULT_OK, result);
-  EXPECT_EQ(64u, buffer_size);
-  for (int i = 0; i < 64; ++i) {
-    EXPECT_EQ(255 - i, buffer[i]);
-  }
-}
-
-js_to_cpp::EchoArgsPtr BuildSampleEchoArgs() {
-  js_to_cpp::EchoArgsPtr args(js_to_cpp::EchoArgs::New());
-  args->si64 = kExpectedInt64Value;
-  args->si32 = kExpectedInt32Value;
-  args->si16 = kExpectedInt16Value;
-  args->si8 = kExpectedInt8Value;
-  args->ui64 = kExpectedUInt64Value;
-  args->ui32 = kExpectedUInt32Value;
-  args->ui16 = kExpectedUInt16Value;
-  args->ui8 = kExpectedUInt8Value;
-  args->float_val = kExpectedFloatVal;
-  args->float_inf = kExpectedFloatInf;
-  args->float_nan = kExpectedFloatNan;
-  args->double_val = kExpectedDoubleVal;
-  args->double_inf = kExpectedDoubleInf;
-  args->double_nan = kExpectedDoubleNan;
-  args->name.emplace("coming");
-  args->string_array.emplace(3);
-  (*args->string_array)[0] = "one";
-  (*args->string_array)[1] = "two";
-  (*args->string_array)[2] = "three";
-  return args;
-}
-
-void CheckSampleEchoArgs(js_to_cpp::EchoArgsPtr arg) {
-  EXPECT_EQ(kExpectedInt64Value, arg->si64);
-  EXPECT_EQ(kExpectedInt32Value, arg->si32);
-  EXPECT_EQ(kExpectedInt16Value, arg->si16);
-  EXPECT_EQ(kExpectedInt8Value, arg->si8);
-  EXPECT_EQ(kExpectedUInt64Value, arg->ui64);
-  EXPECT_EQ(kExpectedUInt32Value, arg->ui32);
-  EXPECT_EQ(kExpectedUInt16Value, arg->ui16);
-  EXPECT_EQ(kExpectedUInt8Value, arg->ui8);
-  EXPECT_EQ(kExpectedFloatVal, arg->float_val);
-  EXPECT_EQ(kExpectedFloatInf, arg->float_inf);
-  EXPECT_NAN(arg->float_nan);
-  EXPECT_EQ(kExpectedDoubleVal, arg->double_val);
-  EXPECT_EQ(kExpectedDoubleInf, arg->double_inf);
-  EXPECT_NAN(arg->double_nan);
-  EXPECT_EQ(std::string("coming"), *arg->name);
-  EXPECT_EQ(std::string("one"), (*arg->string_array)[0]);
-  EXPECT_EQ(std::string("two"), (*arg->string_array)[1]);
-  EXPECT_EQ(std::string("three"), (*arg->string_array)[2]);
-  CheckDataPipe(std::move(arg->data_handle));
-  CheckMessagePipe(arg->message_handle.get());
-}
-
-void CheckSampleEchoArgsList(const js_to_cpp::EchoArgsListPtr& list) {
-  if (list.is_null())
-    return;
-  CheckSampleEchoArgs(std::move(list->item));
-  CheckSampleEchoArgsList(list->next);
-}
-
-// More forgiving checks are needed in the face of potentially corrupt
-// messages. The values don't matter so long as all accesses are within
-// bounds.
-void CheckCorruptedString(const std::string& arg) {
-  for (size_t i = 0; i < arg.size(); ++i)
-    g_waste_accumulator += arg[i];
-}
-
-void CheckCorruptedString(const base::Optional<std::string>& arg) {
-  if (!arg)
-    return;
-  CheckCorruptedString(*arg);
-}
-
-void CheckCorruptedStringArray(
-    const base::Optional<std::vector<std::string>>& string_array) {
-  if (!string_array)
-    return;
-  for (size_t i = 0; i < string_array->size(); ++i)
-    CheckCorruptedString((*string_array)[i]);
-}
-
-void CheckCorruptedDataPipe(MojoHandle data_pipe_handle) {
-  unsigned char buffer[100];
-  uint32_t buffer_size = static_cast<uint32_t>(sizeof(buffer));
-  MojoResult result = MojoReadData(
-      data_pipe_handle, buffer, &buffer_size, MOJO_READ_DATA_FLAG_NONE);
-  if (result != MOJO_RESULT_OK)
-    return;
-  for (uint32_t i = 0; i < buffer_size; ++i)
-    g_waste_accumulator += buffer[i];
-}
-
-void CheckCorruptedMessagePipe(MojoHandle message_pipe_handle) {
-  unsigned char buffer[100];
-  uint32_t buffer_size = static_cast<uint32_t>(sizeof(buffer));
-  MojoResult result = MojoReadMessage(
-      message_pipe_handle, buffer, &buffer_size, 0, 0, 0);
-  if (result != MOJO_RESULT_OK)
-    return;
-  for (uint32_t i = 0; i < buffer_size; ++i)
-    g_waste_accumulator += buffer[i];
-}
-
-void CheckCorruptedEchoArgs(const js_to_cpp::EchoArgsPtr& arg) {
-  if (arg.is_null())
-    return;
-  CheckCorruptedString(arg->name);
-  CheckCorruptedStringArray(arg->string_array);
-  if (arg->data_handle.is_valid())
-    CheckCorruptedDataPipe(arg->data_handle.get().value());
-  if (arg->message_handle.is_valid())
-    CheckCorruptedMessagePipe(arg->message_handle.get().value());
-}
-
-void CheckCorruptedEchoArgsList(const js_to_cpp::EchoArgsListPtr& list) {
-  if (list.is_null())
-    return;
-  CheckCorruptedEchoArgs(list->item);
-  CheckCorruptedEchoArgsList(list->next);
-}
-
-// Base Provider implementation class. It's expected that tests subclass and
-// override the appropriate Provider functions. When test is done quit the
-// run_loop().
-class CppSideConnection : public js_to_cpp::CppSide {
- public:
-  CppSideConnection()
-      : run_loop_(nullptr),
-        js_side_(nullptr),
-        mishandled_messages_(0),
-        binding_(this) {}
-  ~CppSideConnection() override {}
-
-  void set_run_loop(base::RunLoop* run_loop) { run_loop_ = run_loop; }
-  base::RunLoop* run_loop() { return run_loop_; }
-
-  void set_js_side(js_to_cpp::JsSide* js_side) { js_side_ = js_side; }
-  js_to_cpp::JsSide* js_side() { return js_side_; }
-
-  void Bind(InterfaceRequest<js_to_cpp::CppSide> request) {
-    binding_.Bind(std::move(request));
-    // Keep the pipe open even after validation errors.
-    binding_.EnableTestingMode();
-  }
-
-  // js_to_cpp::CppSide:
-  void StartTest() override { NOTREACHED(); }
-
-  void TestFinished() override { NOTREACHED(); }
-
-  void PingResponse() override { mishandled_messages_ += 1; }
-
-  void EchoResponse(js_to_cpp::EchoArgsListPtr list) override {
-    mishandled_messages_ += 1;
-  }
-
-  void BitFlipResponse(js_to_cpp::EchoArgsListPtr list) override {
-    mishandled_messages_ += 1;
-  }
-
-  void BackPointerResponse(js_to_cpp::EchoArgsListPtr list) override {
-    mishandled_messages_ += 1;
-  }
-
- protected:
-  base::RunLoop* run_loop_;
-  js_to_cpp::JsSide* js_side_;
-  int mishandled_messages_;
-  mojo::Binding<js_to_cpp::CppSide> binding_;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(CppSideConnection);
-};
-
-// Trivial test to verify a message sent from JS is received.
-class PingCppSideConnection : public CppSideConnection {
- public:
-  PingCppSideConnection() : got_message_(false) {}
-  ~PingCppSideConnection() override {}
-
-  // js_to_cpp::CppSide:
-  void StartTest() override { js_side_->Ping(); }
-
-  void PingResponse() override {
-    got_message_ = true;
-    run_loop()->Quit();
-  }
-
-  bool DidSucceed() {
-    return got_message_ && !mishandled_messages_;
-  }
-
- private:
-  bool got_message_;
-  DISALLOW_COPY_AND_ASSIGN(PingCppSideConnection);
-};
-
-// Test that parameters are passed with correct values.
-class EchoCppSideConnection : public CppSideConnection {
- public:
-  EchoCppSideConnection() :
-      message_count_(0),
-      termination_seen_(false) {
-  }
-  ~EchoCppSideConnection() override {}
-
-  // js_to_cpp::CppSide:
-  void StartTest() override {
-    js_side_->Echo(kExpectedMessageCount, BuildSampleEchoArgs());
-  }
-
-  void EchoResponse(js_to_cpp::EchoArgsListPtr list) override {
-    const js_to_cpp::EchoArgsPtr& special_arg = list->item;
-    message_count_ += 1;
-    EXPECT_EQ(-1, special_arg->si64);
-    EXPECT_EQ(-1, special_arg->si32);
-    EXPECT_EQ(-1, special_arg->si16);
-    EXPECT_EQ(-1, special_arg->si8);
-    EXPECT_EQ(std::string("going"), *special_arg->name);
-    CheckSampleEchoArgsList(list->next);
-  }
-
-  void TestFinished() override {
-    termination_seen_ = true;
-    run_loop()->Quit();
-  }
-
-  bool DidSucceed() {
-    return termination_seen_ &&
-        !mishandled_messages_ &&
-        message_count_ == kExpectedMessageCount;
-  }
-
- private:
-  static const int kExpectedMessageCount = 10;
-  int message_count_;
-  bool termination_seen_;
-  DISALLOW_COPY_AND_ASSIGN(EchoCppSideConnection);
-};
-
-// Test that corrupted messages don't wreak havoc.
-class BitFlipCppSideConnection : public CppSideConnection {
- public:
-  BitFlipCppSideConnection() : termination_seen_(false) {}
-  ~BitFlipCppSideConnection() override {}
-
-  // js_to_cpp::CppSide:
-  void StartTest() override { js_side_->BitFlip(BuildSampleEchoArgs()); }
-
-  void BitFlipResponse(js_to_cpp::EchoArgsListPtr list) override {
-    CheckCorruptedEchoArgsList(list);
-  }
-
-  void TestFinished() override {
-    termination_seen_ = true;
-    run_loop()->Quit();
-  }
-
-  bool DidSucceed() {
-    return termination_seen_;
-  }
-
- private:
-  bool termination_seen_;
-  DISALLOW_COPY_AND_ASSIGN(BitFlipCppSideConnection);
-};
-
-// Test that severely random messages don't wreak havoc.
-class BackPointerCppSideConnection : public CppSideConnection {
- public:
-  BackPointerCppSideConnection() : termination_seen_(false) {}
-  ~BackPointerCppSideConnection() override {}
-
-  // js_to_cpp::CppSide:
-  void StartTest() override { js_side_->BackPointer(BuildSampleEchoArgs()); }
-
-  void BackPointerResponse(js_to_cpp::EchoArgsListPtr list) override {
-    CheckCorruptedEchoArgsList(list);
-  }
-
-  void TestFinished() override {
-    termination_seen_ = true;
-    run_loop()->Quit();
-  }
-
-  bool DidSucceed() {
-    return termination_seen_;
-  }
-
- private:
-  bool termination_seen_;
-  DISALLOW_COPY_AND_ASSIGN(BackPointerCppSideConnection);
-};
-
-}  // namespace
-
-class JsToCppTest : public testing::Test {
- public:
-  JsToCppTest() {}
-
-  void RunTest(const std::string& test, CppSideConnection* cpp_side) {
-    cpp_side->set_run_loop(&run_loop_);
-
-    js_to_cpp::JsSidePtr js_side;
-    auto js_side_proxy = MakeRequest(&js_side);
-
-    cpp_side->set_js_side(js_side.get());
-    js_to_cpp::CppSidePtr cpp_side_ptr;
-    cpp_side->Bind(MakeRequest(&cpp_side_ptr));
-
-    js_side->SetCppSide(std::move(cpp_side_ptr));
-
-#ifdef V8_USE_EXTERNAL_STARTUP_DATA
-    gin::V8Initializer::LoadV8Snapshot();
-    gin::V8Initializer::LoadV8Natives();
-#endif
-
-    gin::IsolateHolder::Initialize(gin::IsolateHolder::kStrictMode,
-                                   gin::IsolateHolder::kStableV8Extras,
-                                   gin::ArrayBufferAllocator::SharedInstance());
-    gin::IsolateHolder instance(base::ThreadTaskRunnerHandle::Get());
-    MojoRunnerDelegate delegate;
-    gin::ShellRunner runner(&delegate, instance.isolate());
-    delegate.Start(&runner, js_side_proxy.PassMessagePipe().release().value(),
-                   test);
-
-    run_loop_.Run();
-  }
-
- private:
-  base::ShadowingAtExitManager at_exit_;
-  base::MessageLoop loop;
-  base::RunLoop run_loop_;
-
-  DISALLOW_COPY_AND_ASSIGN(JsToCppTest);
-};
-
-TEST_F(JsToCppTest, Ping) {
-  PingCppSideConnection cpp_side_connection;
-  RunTest("mojo/edk/js/tests/js_to_cpp_tests", &cpp_side_connection);
-  EXPECT_TRUE(cpp_side_connection.DidSucceed());
-}
-
-TEST_F(JsToCppTest, Echo) {
-  EchoCppSideConnection cpp_side_connection;
-  RunTest("mojo/edk/js/tests/js_to_cpp_tests", &cpp_side_connection);
-  EXPECT_TRUE(cpp_side_connection.DidSucceed());
-}
-
-TEST_F(JsToCppTest, BitFlip) {
-  // These tests generate a lot of expected validation errors. Suppress logging.
-  mojo::internal::ScopedSuppressValidationErrorLoggingForTests log_suppression;
-
-  BitFlipCppSideConnection cpp_side_connection;
-  RunTest("mojo/edk/js/tests/js_to_cpp_tests", &cpp_side_connection);
-  EXPECT_TRUE(cpp_side_connection.DidSucceed());
-}
-
-TEST_F(JsToCppTest, BackPointer) {
-  // These tests generate a lot of expected validation errors. Suppress logging.
-  mojo::internal::ScopedSuppressValidationErrorLoggingForTests log_suppression;
-
-  BackPointerCppSideConnection cpp_side_connection;
-  RunTest("mojo/edk/js/tests/js_to_cpp_tests", &cpp_side_connection);
-  EXPECT_TRUE(cpp_side_connection.DidSucceed());
-}
-
-}  // namespace js
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/js/tests/js_to_cpp_tests.js b/mojo/edk/js/tests/js_to_cpp_tests.js
deleted file mode 100644
index 6b69fca..0000000
--- a/mojo/edk/js/tests/js_to_cpp_tests.js
+++ /dev/null
@@ -1,223 +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.
-
-define('mojo/edk/js/tests/js_to_cpp_tests', [
-  'console',
-  'mojo/edk/js/tests/js_to_cpp.mojom',
-  'mojo/public/js/bindings',
-  'mojo/public/js/connector',
-  'mojo/public/js/core',
-], function (console, jsToCpp, bindings, connector, core) {
-  var retainedJsSide;
-  var retainedJsSideStub;
-  var sampleData;
-  var sampleMessage;
-  var BAD_VALUE = 13;
-  var DATA_PIPE_PARAMS = {
-    flags: core.CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,
-    elementNumBytes: 1,
-    capacityNumBytes: 64
-  };
-
-  function JsSideConnection() {
-    this.binding = new bindings.Binding(jsToCpp.JsSide, this);
-  }
-
-  JsSideConnection.prototype.setCppSide = function(cppSide) {
-    this.cppSide_ = cppSide;
-    this.cppSide_.startTest();
-  };
-
-  JsSideConnection.prototype.ping = function (arg) {
-    this.cppSide_.pingResponse();
-  };
-
-  JsSideConnection.prototype.echo = function (numIterations, arg) {
-    var dataPipe1;
-    var dataPipe2;
-    var i;
-    var messagePipe1;
-    var messagePipe2;
-    var specialArg;
-
-    // Ensure expected negative values are negative.
-    if (arg.si64 > 0)
-      arg.si64 = BAD_VALUE;
-
-    if (arg.si32 > 0)
-      arg.si32 = BAD_VALUE;
-
-    if (arg.si16 > 0)
-      arg.si16 = BAD_VALUE;
-
-    if (arg.si8 > 0)
-      arg.si8 = BAD_VALUE;
-
-    for (i = 0; i < numIterations; ++i) {
-      dataPipe1 = core.createDataPipe(DATA_PIPE_PARAMS);
-      dataPipe2 = core.createDataPipe(DATA_PIPE_PARAMS);
-      messagePipe1 = core.createMessagePipe();
-      messagePipe2 = core.createMessagePipe();
-
-      arg.data_handle = dataPipe1.consumerHandle;
-      arg.message_handle = messagePipe1.handle1;
-
-      specialArg = new jsToCpp.EchoArgs();
-      specialArg.si64 = -1;
-      specialArg.si32 = -1;
-      specialArg.si16 = -1;
-      specialArg.si8 = -1;
-      specialArg.name = 'going';
-      specialArg.data_handle = dataPipe2.consumerHandle;
-      specialArg.message_handle = messagePipe2.handle1;
-
-      writeDataPipe(dataPipe1, sampleData);
-      writeDataPipe(dataPipe2, sampleData);
-      writeMessagePipe(messagePipe1, sampleMessage);
-      writeMessagePipe(messagePipe2, sampleMessage);
-
-      this.cppSide_.echoResponse(createEchoArgsList(specialArg, arg));
-
-      core.close(dataPipe1.producerHandle);
-      core.close(dataPipe2.producerHandle);
-      core.close(messagePipe1.handle0);
-      core.close(messagePipe2.handle0);
-    }
-    this.cppSide_.testFinished();
-  };
-
-  JsSideConnection.prototype.bitFlip = function (arg) {
-    var iteration = 0;
-    var dataPipe;
-    var messagePipe;
-    var proto = connector.Connector.prototype;
-    var stopSignalled = false;
-
-    proto.realAccept = proto.accept;
-    proto.accept = function (message) {
-      var offset = iteration / 8;
-      var mask;
-      var value;
-      if (offset < message.buffer.arrayBuffer.byteLength) {
-        mask = 1 << (iteration % 8);
-        value = message.buffer.getUint8(offset) ^ mask;
-        message.buffer.setUint8(offset, value);
-        return this.realAccept(message);
-      }
-      stopSignalled = true;
-      return false;
-    };
-
-    while (!stopSignalled) {
-      dataPipe = core.createDataPipe(DATA_PIPE_PARAMS);
-      messagePipe = core.createMessagePipe();
-      writeDataPipe(dataPipe, sampleData);
-      writeMessagePipe(messagePipe, sampleMessage);
-      arg.data_handle = dataPipe.consumerHandle;
-      arg.message_handle = messagePipe.handle1;
-
-      this.cppSide_.bitFlipResponse(createEchoArgsList(arg));
-
-      core.close(dataPipe.producerHandle);
-      core.close(messagePipe.handle0);
-      iteration += 1;
-    }
-
-    proto.accept = proto.realAccept;
-    proto.realAccept = null;
-    this.cppSide_.testFinished();
-  };
-
-  JsSideConnection.prototype.backPointer = function (arg) {
-    var iteration = 0;
-    var dataPipe;
-    var messagePipe;
-    var proto = connector.Connector.prototype;
-    var stopSignalled = false;
-
-    proto.realAccept = proto.accept;
-    proto.accept = function (message) {
-      var delta = 8 * (1 + iteration % 32);
-      var offset = 8 * ((iteration / 32) | 0);
-      if (offset < message.buffer.arrayBuffer.byteLength - 4) {
-        message.buffer.dataView.setUint32(offset, 0x100000000 - delta, true);
-        message.buffer.dataView.setUint32(offset + 4, 0xffffffff, true);
-        return this.realAccept(message);
-      }
-      stopSignalled = true;
-      return false;
-    };
-
-    while (!stopSignalled) {
-      dataPipe = core.createDataPipe(DATA_PIPE_PARAMS);
-      messagePipe = core.createMessagePipe();
-      writeDataPipe(dataPipe, sampleData);
-      writeMessagePipe(messagePipe, sampleMessage);
-      arg.data_handle = dataPipe.consumerHandle;
-      arg.message_handle = messagePipe.handle1;
-
-      this.cppSide_.backPointerResponse(createEchoArgsList(arg));
-
-      core.close(dataPipe.producerHandle);
-      core.close(messagePipe.handle0);
-      iteration += 1;
-    }
-
-    proto.accept = proto.realAccept;
-    proto.realAccept = null;
-    this.cppSide_.testFinished();
-  };
-
-  function writeDataPipe(pipe, data) {
-    var writeResult = core.writeData(
-      pipe.producerHandle, data, core.WRITE_DATA_FLAG_ALL_OR_NONE);
-
-    if (writeResult.result != core.RESULT_OK) {
-      console.log('ERROR: Data pipe write result was ' + writeResult.result);
-      return false;
-    }
-    if (writeResult.numBytes != data.length) {
-      console.log('ERROR: Data pipe write length was ' + writeResult.numBytes);
-      return false;
-    }
-    return true;
-  }
-
-  function writeMessagePipe(pipe, arrayBuffer) {
-    var result = core.writeMessage(pipe.handle0, arrayBuffer, [], 0);
-    if (result != core.RESULT_OK) {
-      console.log('ERROR: Message pipe write result was ' + result);
-      return false;
-    }
-    return true;
-  }
-
-  function createEchoArgsListElement(item, next) {
-    var list = new jsToCpp.EchoArgsList();
-    list.item = item;
-    list.next = next;
-    return list;
-  }
-
-  function createEchoArgsList() {
-    var genuineArray = Array.prototype.slice.call(arguments);
-    return genuineArray.reduceRight(function (previous, current) {
-      return createEchoArgsListElement(current, previous);
-    }, null);
-  }
-
-  return function(jsSideRequestHandle) {
-    var i;
-    sampleData = new Uint8Array(DATA_PIPE_PARAMS.capacityNumBytes);
-    for (i = 0; i < sampleData.length; ++i) {
-      sampleData[i] = i;
-    }
-    sampleMessage = new Uint8Array(DATA_PIPE_PARAMS.capacityNumBytes);
-    for (i = 0; i < sampleMessage.length; ++i) {
-      sampleMessage[i] = 255 - i;
-    }
-    retainedJsSide = new JsSideConnection;
-    retainedJsSide.binding.bind(jsSideRequestHandle);
-  };
-});
diff --git a/mojo/edk/js/tests/run_js_unittests.cc b/mojo/edk/js/tests/run_js_unittests.cc
deleted file mode 100644
index 13e796b..0000000
--- a/mojo/edk/js/tests/run_js_unittests.cc
+++ /dev/null
@@ -1,61 +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 "base/files/file_path.h"
-#include "base/macros.h"
-#include "base/path_service.h"
-#include "gin/modules/console.h"
-#include "gin/modules/module_registry.h"
-#include "gin/modules/timer.h"
-#include "gin/test/file_runner.h"
-#include "gin/test/gtest.h"
-#include "mojo/edk/js/core.h"
-#include "mojo/edk/js/support.h"
-#include "mojo/edk/js/threading.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace edk {
-namespace js {
-namespace {
-
-class TestRunnerDelegate : public gin::FileRunnerDelegate {
- public:
-  TestRunnerDelegate() {
-    AddBuiltinModule(gin::Console::kModuleName, gin::Console::GetModule);
-    AddBuiltinModule(gin::TimerModule::kName, gin::TimerModule::GetModule);
-    AddBuiltinModule(Core::kModuleName, Core::GetModule);
-    AddBuiltinModule(Threading::kModuleName, Threading::GetModule);
-    AddBuiltinModule(Support::kModuleName, Support::GetModule);
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(TestRunnerDelegate);
-};
-
-void RunTest(std::string test, bool run_until_idle) {
-  base::FilePath path;
-  PathService::Get(base::DIR_SOURCE_ROOT, &path);
-  path = path.AppendASCII("mojo")
-             .AppendASCII("public")
-             .AppendASCII("js")
-             .AppendASCII("tests")
-             .AppendASCII(test);
-  TestRunnerDelegate delegate;
-  gin::RunTestFromFile(path, &delegate, run_until_idle);
-}
-
-// TODO(abarth): Should we autogenerate these stubs from GYP?
-TEST(JSTest, Core) {
-  RunTest("core_unittest.js", true);
-}
-
-TEST(JSTest, Validation) {
-  RunTest("validation_unittest.js", true);
-}
-
-}  // namespace
-}  // namespace js
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/js/threading.cc b/mojo/edk/js/threading.cc
deleted file mode 100644
index db9f12d..0000000
--- a/mojo/edk/js/threading.cc
+++ /dev/null
@@ -1,49 +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 "mojo/edk/js/threading.h"
-
-#include "base/message_loop/message_loop.h"
-#include "gin/object_template_builder.h"
-#include "gin/per_isolate_data.h"
-#include "mojo/edk/js/handle.h"
-
-namespace mojo {
-namespace edk {
-namespace js {
-
-namespace {
-
-void Quit() {
-  base::MessageLoop::current()->QuitNow();
-}
-
-gin::WrapperInfo g_wrapper_info = { gin::kEmbedderNativeGin };
-
-}  // namespace
-
-const char Threading::kModuleName[] = "mojo/public/js/threading";
-
-v8::Local<v8::Value> Threading::GetModule(v8::Isolate* isolate) {
-  gin::PerIsolateData* data = gin::PerIsolateData::From(isolate);
-  v8::Local<v8::ObjectTemplate> templ = data->GetObjectTemplate(
-      &g_wrapper_info);
-
-  if (templ.IsEmpty()) {
-    templ = gin::ObjectTemplateBuilder(isolate)
-        .SetMethod("quit", Quit)
-        .Build();
-
-    data->SetObjectTemplate(&g_wrapper_info, templ);
-  }
-
-  return templ->NewInstance();
-}
-
-Threading::Threading() {
-}
-
-}  // namespace js
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/js/threading.h b/mojo/edk/js/threading.h
deleted file mode 100644
index 653d076..0000000
--- a/mojo/edk/js/threading.h
+++ /dev/null
@@ -1,28 +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 MOJO_EDK_JS_THREADING_H_
-#define MOJO_EDK_JS_THREADING_H_
-
-#include "gin/public/wrapper_info.h"
-#include "mojo/edk/js/js_export.h"
-#include "v8/include/v8.h"
-
-namespace mojo {
-namespace edk {
-namespace js {
-
-class MOJO_JS_EXPORT Threading {
- public:
-  static const char kModuleName[];
-  static v8::Local<v8::Value> GetModule(v8::Isolate* isolate);
- private:
-  Threading();
-};
-
-}  // namespace js
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_JS_THREADING_H_
diff --git a/mojo/edk/js/waiting_callback.cc b/mojo/edk/js/waiting_callback.cc
deleted file mode 100644
index 6ad4bd0..0000000
--- a/mojo/edk/js/waiting_callback.cc
+++ /dev/null
@@ -1,95 +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 "mojo/edk/js/waiting_callback.h"
-
-#include "base/bind.h"
-#include "base/message_loop/message_loop.h"
-#include "gin/per_context_data.h"
-
-namespace mojo {
-namespace edk {
-namespace js {
-
-namespace {
-
-v8::Handle<v8::Private> GetHiddenPropertyName(v8::Isolate* isolate) {
-  return v8::Private::ForApi(
-      isolate, gin::StringToV8(isolate, "::mojo::js::WaitingCallback"));
-}
-
-}  // namespace
-
-gin::WrapperInfo WaitingCallback::kWrapperInfo = { gin::kEmbedderNativeGin };
-
-// static
-gin::Handle<WaitingCallback> WaitingCallback::Create(
-    v8::Isolate* isolate,
-    v8::Handle<v8::Function> callback,
-    gin::Handle<HandleWrapper> handle_wrapper,
-    MojoHandleSignals signals,
-    bool one_shot) {
-  gin::Handle<WaitingCallback> waiting_callback = gin::CreateHandle(
-      isolate, new WaitingCallback(isolate, callback, one_shot));
-  MojoResult result = waiting_callback->watcher_.Watch(
-      handle_wrapper->get(), signals,
-      base::Bind(&WaitingCallback::OnHandleReady,
-                 base::Unretained(waiting_callback.get())));
-
-  // The signals may already be unsatisfiable.
-  if (result == MOJO_RESULT_FAILED_PRECONDITION)
-    waiting_callback->OnHandleReady(MOJO_RESULT_FAILED_PRECONDITION);
-
-  return waiting_callback;
-}
-
-void WaitingCallback::Cancel() {
-  if (watcher_.IsWatching())
-    watcher_.Cancel();
-}
-
-WaitingCallback::WaitingCallback(v8::Isolate* isolate,
-                                 v8::Handle<v8::Function> callback,
-                                 bool one_shot)
-    : one_shot_(one_shot),
-      watcher_(FROM_HERE, SimpleWatcher::ArmingPolicy::AUTOMATIC),
-      weak_factory_(this) {
-  v8::Handle<v8::Context> context = isolate->GetCurrentContext();
-  runner_ = gin::PerContextData::From(context)->runner()->GetWeakPtr();
-  GetWrapper(isolate)
-      ->SetPrivate(context, GetHiddenPropertyName(isolate), callback)
-      .FromJust();
-}
-
-WaitingCallback::~WaitingCallback() {
-  Cancel();
-}
-
-void WaitingCallback::OnHandleReady(MojoResult result) {
-  if (!runner_)
-    return;
-
-  gin::Runner::Scope scope(runner_.get());
-  v8::Isolate* isolate = runner_->GetContextHolder()->isolate();
-
-  v8::Handle<v8::Value> hidden_value =
-      GetWrapper(isolate)
-          ->GetPrivate(runner_->GetContextHolder()->context(),
-                       GetHiddenPropertyName(isolate))
-          .ToLocalChecked();
-  v8::Handle<v8::Function> callback;
-  CHECK(gin::ConvertFromV8(isolate, hidden_value, &callback));
-
-  v8::Handle<v8::Value> args[] = { gin::ConvertToV8(isolate, result) };
-  runner_->Call(callback, runner_->global(), 1, args);
-
-  if (one_shot_ || result == MOJO_RESULT_CANCELLED) {
-    runner_.reset();
-    Cancel();
-  }
-}
-
-}  // namespace js
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/js/waiting_callback.h b/mojo/edk/js/waiting_callback.h
deleted file mode 100644
index f97b389..0000000
--- a/mojo/edk/js/waiting_callback.h
+++ /dev/null
@@ -1,67 +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 MOJO_EDK_JS_WAITING_CALLBACK_H_
-#define MOJO_EDK_JS_WAITING_CALLBACK_H_
-
-#include "base/macros.h"
-#include "base/memory/weak_ptr.h"
-#include "gin/handle.h"
-#include "gin/runner.h"
-#include "gin/wrappable.h"
-#include "mojo/edk/js/handle.h"
-#include "mojo/public/cpp/system/core.h"
-#include "mojo/public/cpp/system/simple_watcher.h"
-
-namespace mojo {
-namespace edk {
-namespace js {
-
-class WaitingCallback : public gin::Wrappable<WaitingCallback> {
- public:
-  static gin::WrapperInfo kWrapperInfo;
-
-  // Creates a new WaitingCallback.
-  //
-  // If |one_shot| is true, the callback will only ever be called at most once.
-  // If false, the callback may be called any number of times until the
-  // WaitingCallback is explicitly cancelled.
-  static gin::Handle<WaitingCallback> Create(
-      v8::Isolate* isolate,
-      v8::Handle<v8::Function> callback,
-      gin::Handle<HandleWrapper> handle_wrapper,
-      MojoHandleSignals signals,
-      bool one_shot);
-
-  // Cancels the callback. Does nothing if a callback is not pending. This is
-  // implicitly invoked from the destructor but can be explicitly invoked as
-  // necessary.
-  void Cancel();
-
- private:
-  WaitingCallback(v8::Isolate* isolate,
-                  v8::Handle<v8::Function> callback,
-                  bool one_shot);
-  ~WaitingCallback() override;
-
-  // Callback from the Watcher.
-  void OnHandleReady(MojoResult result);
-
-  // Indicates whether this is a one-shot callback or not. If so, it uses the
-  // deprecated HandleWatcher to wait for signals; otherwise it uses the new
-  // system Watcher API.
-  const bool one_shot_;
-
-  base::WeakPtr<gin::Runner> runner_;
-  SimpleWatcher watcher_;
-  base::WeakPtrFactory<WaitingCallback> weak_factory_;
-
-  DISALLOW_COPY_AND_ASSIGN(WaitingCallback);
-};
-
-}  // namespace js
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_JS_WAITING_CALLBACK_H_
diff --git a/mojo/edk/system/BUILD.gn b/mojo/edk/system/BUILD.gn
deleted file mode 100644
index a68cd44..0000000
--- a/mojo/edk/system/BUILD.gn
+++ /dev/null
@@ -1,205 +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.
-
-import("//build/config/nacl/config.gni")
-import("//testing/test.gni")
-import("../../../mojo/public/tools/bindings/mojom.gni")
-
-if (is_android) {
-  import("//build/config/android/config.gni")
-  import("//build/config/android/rules.gni")
-}
-
-component("system") {
-  output_name = "mojo_system_impl"
-
-  sources = [
-    "atomic_flag.h",
-    "broker.h",
-    "broker_host.cc",
-    "broker_host.h",
-    "broker_posix.cc",
-    "broker_win.cc",
-    "channel.cc",
-    "channel.h",
-    "channel_posix.cc",
-    "channel_win.cc",
-    "configuration.cc",
-    "configuration.h",
-    "core.cc",
-    "core.h",
-    "data_pipe_consumer_dispatcher.cc",
-    "data_pipe_consumer_dispatcher.h",
-    "data_pipe_control_message.cc",
-    "data_pipe_control_message.h",
-    "data_pipe_producer_dispatcher.cc",
-    "data_pipe_producer_dispatcher.h",
-    "dispatcher.cc",
-    "dispatcher.h",
-    "handle_signals_state.h",
-    "handle_table.cc",
-    "handle_table.h",
-    "mapping_table.cc",
-    "mapping_table.h",
-    "message_for_transit.cc",
-    "message_for_transit.h",
-    "message_pipe_dispatcher.cc",
-    "message_pipe_dispatcher.h",
-    "node_channel.cc",
-    "node_channel.h",
-    "node_controller.cc",
-    "node_controller.h",
-    "options_validation.h",
-    "platform_handle_dispatcher.cc",
-    "platform_handle_dispatcher.h",
-    "ports_message.cc",
-    "ports_message.h",
-    "request_context.cc",
-    "request_context.h",
-    "shared_buffer_dispatcher.cc",
-    "shared_buffer_dispatcher.h",
-    "watch.cc",
-    "watch.h",
-    "watcher_dispatcher.cc",
-    "watcher_dispatcher.h",
-    "watcher_set.cc",
-    "watcher_set.h",
-  ]
-
-  defines = [ "MOJO_SYSTEM_IMPL_IMPLEMENTATION" ]
-
-  public_deps = [
-    "//mojo/edk/embedder",
-    "//mojo/edk/embedder:platform",
-    "//mojo/edk/system/ports",
-    "//mojo/public/c/system",
-    "//mojo/public/cpp/system",
-  ]
-
-  deps = [
-    "//base",
-  ]
-
-  if (!is_nacl) {
-    deps += [ "//crypto" ]
-  }
-
-  if (is_win) {
-    cflags = [ "/wd4324" ]  # Structure was padded due to __declspec(align()),
-                            # which is uninteresting.
-  }
-
-  if (is_mac && !is_ios) {
-    sources += [
-      "mach_port_relay.cc",
-      "mach_port_relay.h",
-    ]
-  }
-
-  if (is_nacl && !is_nacl_nonsfi) {
-    sources -= [
-      "broker_host.cc",
-      "broker_posix.cc",
-      "channel_posix.cc",
-    ]
-  }
-
-  # Use target_os == "chromeos" instead of is_chromeos because we need to
-  # build NaCl targets (i.e. IRT) for ChromeOS the same as the rest of ChromeOS.
-  if (is_android || target_os == "chromeos") {
-    defines += [ "MOJO_EDK_LEGACY_PROTOCOL" ]
-  }
-
-  allow_circular_includes_from = [ "//mojo/edk/embedder" ]
-}
-
-group("tests") {
-  testonly = true
-  deps = [
-    ":mojo_system_unittests",
-  ]
-
-  if (!is_ios) {
-    deps += [ ":mojo_message_pipe_perftests" ]
-  }
-}
-
-source_set("test_utils") {
-  testonly = true
-
-  sources = [
-    "test_utils.cc",
-    "test_utils.h",
-  ]
-
-  public_deps = [
-    "//mojo/public/c/system",
-    "//mojo/public/cpp/system",
-  ]
-
-  deps = [
-    "//base",
-    "//base/test:test_support",
-    "//mojo/edk/test:test_support",
-    "//testing/gtest:gtest",
-  ]
-}
-
-test("mojo_system_unittests") {
-  sources = [
-    "channel_unittest.cc",
-    "core_test_base.cc",
-    "core_test_base.h",
-    "core_unittest.cc",
-    "message_pipe_unittest.cc",
-    "options_validation_unittest.cc",
-    "platform_handle_dispatcher_unittest.cc",
-    "shared_buffer_dispatcher_unittest.cc",
-    "shared_buffer_unittest.cc",
-    "signals_unittest.cc",
-    "watcher_unittest.cc",
-  ]
-
-  if (!is_ios) {
-    sources += [
-      "data_pipe_unittest.cc",
-      "multiprocess_message_pipe_unittest.cc",
-      "platform_wrapper_unittest.cc",
-    ]
-  }
-
-  deps = [
-    ":test_utils",
-    "//base",
-    "//base/test:test_support",
-    "//mojo/edk/embedder:embedder_unittests",
-    "//mojo/edk/system",
-    "//mojo/edk/system/ports:tests",
-    "//mojo/edk/test:run_all_unittests",
-    "//mojo/edk/test:test_support",
-    "//mojo/public/cpp/system",
-    "//testing/gmock",
-    "//testing/gtest",
-  ]
-
-  allow_circular_includes_from = [ "//mojo/edk/embedder:embedder_unittests" ]
-}
-
-if (!is_ios) {
-  test("mojo_message_pipe_perftests") {
-    sources = [
-      "message_pipe_perftest.cc",
-    ]
-
-    deps = [
-      ":test_utils",
-      "//base",
-      "//base/test:test_support",
-      "//mojo/edk/system",
-      "//mojo/edk/test:run_all_perftests",
-      "//mojo/edk/test:test_support",
-      "//testing/gtest",
-    ]
-  }
-}
diff --git a/mojo/edk/system/atomic_flag.h b/mojo/edk/system/atomic_flag.h
deleted file mode 100644
index 6bdcfaa..0000000
--- a/mojo/edk/system/atomic_flag.h
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_SYSTEM_ATOMIC_FLAG_H_
-#define MOJO_EDK_SYSTEM_ATOMIC_FLAG_H_
-
-#include "base/atomicops.h"
-#include "base/macros.h"
-
-namespace mojo {
-namespace edk {
-
-// AtomicFlag is a boolean flag that can be set and tested atomically. It is
-// intended to be used to fast-path checks where the common case would normally
-// release the governing mutex immediately after checking.
-//
-// Example usage:
-// void DoFoo(Bar* bar) {
-//   AutoLock l(lock_);
-//   queue_.push_back(bar);
-//   flag_.Set(true);
-// }
-//
-// void Baz() {
-//   if (!flag_)  // Assume this is the common case.
-//     return;
-//
-//   AutoLock l(lock_);
-//   ... drain queue_ ...
-//   flag_.Set(false);
-// }
-class AtomicFlag {
- public:
-  AtomicFlag() : flag_(0) {}
-  ~AtomicFlag() {}
-
-  void Set(bool value) {
-    base::subtle::Release_Store(&flag_, value ? 1 : 0);
-  }
-
-  bool Get() const {
-    return base::subtle::Acquire_Load(&flag_) ? true : false;
-  }
-
-  operator const bool() const { return Get(); }
-
- private:
-  base::subtle::Atomic32 flag_;
-
-  DISALLOW_COPY_AND_ASSIGN(AtomicFlag);
-};
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_ATOMIC_FLAG_H_
diff --git a/mojo/edk/system/broker.h b/mojo/edk/system/broker.h
deleted file mode 100644
index 1577972..0000000
--- a/mojo/edk/system/broker.h
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_SYSTEM_BROKER_H_
-#define MOJO_EDK_SYSTEM_BROKER_H_
-
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/synchronization/lock.h"
-#include "mojo/edk/embedder/scoped_platform_handle.h"
-
-namespace mojo {
-namespace edk {
-
-class PlatformSharedBuffer;
-
-// The Broker is a channel to the parent process, which allows synchronous IPCs.
-class Broker {
- public:
-  // Note: This is blocking, and will wait for the first message over
-  // |platform_handle|.
-  explicit Broker(ScopedPlatformHandle platform_handle);
-  ~Broker();
-
-  // Returns the platform handle that should be used to establish a NodeChannel
-  // to the parent process.
-  ScopedPlatformHandle GetParentPlatformHandle();
-
-  // Request a shared buffer from the parent process. Blocks the current thread.
-  scoped_refptr<PlatformSharedBuffer> GetSharedBuffer(size_t num_bytes);
-
- private:
-  // Handle to the parent process, used for synchronous IPCs.
-  ScopedPlatformHandle sync_channel_;
-
-  // Handle to the parent process which is recieved in the first first message
-  // over |sync_channel_|.
-  ScopedPlatformHandle parent_channel_;
-
-  // Lock to only allow one sync message at a time. This avoids having to deal
-  // with message ordering since we can only have one request at a time
-  // in-flight.
-  base::Lock lock_;
-
-  DISALLOW_COPY_AND_ASSIGN(Broker);
-};
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_BROKER_H_
diff --git a/mojo/edk/system/broker_host.cc b/mojo/edk/system/broker_host.cc
deleted file mode 100644
index 6096034..0000000
--- a/mojo/edk/system/broker_host.cc
+++ /dev/null
@@ -1,153 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/system/broker_host.h"
-
-#include <utility>
-
-#include "base/logging.h"
-#include "base/memory/ref_counted.h"
-#include "base/message_loop/message_loop.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "mojo/edk/embedder/named_platform_channel_pair.h"
-#include "mojo/edk/embedder/named_platform_handle.h"
-#include "mojo/edk/embedder/platform_handle_vector.h"
-#include "mojo/edk/embedder/platform_shared_buffer.h"
-#include "mojo/edk/system/broker_messages.h"
-
-namespace mojo {
-namespace edk {
-
-BrokerHost::BrokerHost(base::ProcessHandle client_process,
-                       ScopedPlatformHandle platform_handle)
-#if defined(OS_WIN)
-    : client_process_(client_process)
-#endif
-{
-  CHECK(platform_handle.is_valid());
-
-  base::MessageLoop::current()->AddDestructionObserver(this);
-
-  channel_ = Channel::Create(this, ConnectionParams(std::move(platform_handle)),
-                             base::ThreadTaskRunnerHandle::Get());
-  channel_->Start();
-}
-
-BrokerHost::~BrokerHost() {
-  // We're always destroyed on the creation thread, which is the IO thread.
-  base::MessageLoop::current()->RemoveDestructionObserver(this);
-
-  if (channel_)
-    channel_->ShutDown();
-}
-
-bool BrokerHost::PrepareHandlesForClient(PlatformHandleVector* handles) {
-#if defined(OS_WIN)
-  if (!Channel::Message::RewriteHandles(
-      base::GetCurrentProcessHandle(), client_process_, handles)) {
-    // NOTE: We only log an error here. We do not signal a logical error or
-    // prevent any message from being sent. The client should handle unexpected
-    // invalid handles appropriately.
-    DLOG(ERROR) << "Failed to rewrite one or more handles to broker client.";
-    return false;
-  }
-#endif
-  return true;
-}
-
-bool BrokerHost::SendChannel(ScopedPlatformHandle handle) {
-  CHECK(handle.is_valid());
-  CHECK(channel_);
-
-#if defined(OS_WIN)
-  InitData* data;
-  Channel::MessagePtr message =
-      CreateBrokerMessage(BrokerMessageType::INIT, 1, 0, &data);
-  data->pipe_name_length = 0;
-#else
-  Channel::MessagePtr message =
-      CreateBrokerMessage(BrokerMessageType::INIT, 1, nullptr);
-#endif
-  ScopedPlatformHandleVectorPtr handles;
-  handles.reset(new PlatformHandleVector(1));
-  handles->at(0) = handle.release();
-
-  // This may legitimately fail on Windows if the client process is in another
-  // session, e.g., is an elevated process.
-  if (!PrepareHandlesForClient(handles.get()))
-    return false;
-
-   message->SetHandles(std::move(handles));
-  channel_->Write(std::move(message));
-  return true;
-}
-
-#if defined(OS_WIN)
-
-void BrokerHost::SendNamedChannel(const base::StringPiece16& pipe_name) {
-  InitData* data;
-  base::char16* name_data;
-  Channel::MessagePtr message = CreateBrokerMessage(
-      BrokerMessageType::INIT, 0, sizeof(*name_data) * pipe_name.length(),
-      &data, reinterpret_cast<void**>(&name_data));
-  data->pipe_name_length = static_cast<uint32_t>(pipe_name.length());
-  std::copy(pipe_name.begin(), pipe_name.end(), name_data);
-  channel_->Write(std::move(message));
-}
-
-#endif  // defined(OS_WIN)
-
-void BrokerHost::OnBufferRequest(uint32_t num_bytes) {
-  scoped_refptr<PlatformSharedBuffer> read_only_buffer;
-  scoped_refptr<PlatformSharedBuffer> buffer =
-      PlatformSharedBuffer::Create(num_bytes);
-  if (buffer)
-    read_only_buffer = buffer->CreateReadOnlyDuplicate();
-  if (!read_only_buffer)
-    buffer = nullptr;
-
-  Channel::MessagePtr message = CreateBrokerMessage(
-      BrokerMessageType::BUFFER_RESPONSE, buffer ? 2 : 0, nullptr);
-  if (buffer) {
-    ScopedPlatformHandleVectorPtr handles;
-    handles.reset(new PlatformHandleVector(2));
-    handles->at(0) = buffer->PassPlatformHandle().release();
-    handles->at(1) = read_only_buffer->PassPlatformHandle().release();
-    PrepareHandlesForClient(handles.get());
-    message->SetHandles(std::move(handles));
-  }
-
-  channel_->Write(std::move(message));
-}
-
-void BrokerHost::OnChannelMessage(const void* payload,
-                                  size_t payload_size,
-                                  ScopedPlatformHandleVectorPtr handles) {
-  if (payload_size < sizeof(BrokerMessageHeader))
-    return;
-
-  const BrokerMessageHeader* header =
-      static_cast<const BrokerMessageHeader*>(payload);
-  switch (header->type) {
-    case BrokerMessageType::BUFFER_REQUEST:
-      if (payload_size ==
-            sizeof(BrokerMessageHeader) + sizeof(BufferRequestData)) {
-        const BufferRequestData* request =
-            reinterpret_cast<const BufferRequestData*>(header + 1);
-        OnBufferRequest(request->size);
-      }
-      break;
-
-    default:
-      LOG(ERROR) << "Unexpected broker message type: " << header->type;
-      break;
-  }
-}
-
-void BrokerHost::OnChannelError() { delete this; }
-
-void BrokerHost::WillDestroyCurrentMessageLoop() { delete this; }
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/broker_host.h b/mojo/edk/system/broker_host.h
deleted file mode 100644
index a7995d2..0000000
--- a/mojo/edk/system/broker_host.h
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_SYSTEM_BROKER_HOST_H_
-#define MOJO_EDK_SYSTEM_BROKER_HOST_H_
-
-#include <stdint.h>
-
-#include "base/macros.h"
-#include "base/message_loop/message_loop.h"
-#include "base/process/process_handle.h"
-#include "base/strings/string_piece.h"
-#include "mojo/edk/embedder/platform_handle_vector.h"
-#include "mojo/edk/embedder/scoped_platform_handle.h"
-#include "mojo/edk/system/channel.h"
-
-namespace mojo {
-namespace edk {
-
-// The BrokerHost is a channel to the child process, which services synchronous
-// IPCs.
-class BrokerHost : public Channel::Delegate,
-                   public base::MessageLoop::DestructionObserver {
- public:
-  BrokerHost(base::ProcessHandle client_process, ScopedPlatformHandle handle);
-
-  // Send |handle| to the child, to be used to establish a NodeChannel to us.
-  bool SendChannel(ScopedPlatformHandle handle);
-
-#if defined(OS_WIN)
-  // Sends a named channel to the child. Like above, but for named pipes.
-  void SendNamedChannel(const base::StringPiece16& pipe_name);
-#endif
-
- private:
-  ~BrokerHost() override;
-
-  bool PrepareHandlesForClient(PlatformHandleVector* handles);
-
-  // Channel::Delegate:
-  void OnChannelMessage(const void* payload,
-                        size_t payload_size,
-                        ScopedPlatformHandleVectorPtr handles) override;
-  void OnChannelError() override;
-
-  // base::MessageLoop::DestructionObserver:
-  void WillDestroyCurrentMessageLoop() override;
-
-  void OnBufferRequest(uint32_t num_bytes);
-
-#if defined(OS_WIN)
-  base::ProcessHandle client_process_;
-#endif
-
-  scoped_refptr<Channel> channel_;
-
-  DISALLOW_COPY_AND_ASSIGN(BrokerHost);
-};
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_BROKER_HOST_H_
diff --git a/mojo/edk/system/broker_messages.h b/mojo/edk/system/broker_messages.h
deleted file mode 100644
index 0f0dd9d..0000000
--- a/mojo/edk/system/broker_messages.h
+++ /dev/null
@@ -1,80 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_SYSTEM_BROKER_MESSAGES_H_
-#define MOJO_EDK_SYSTEM_BROKER_MESSAGES_H_
-
-#include "mojo/edk/system/channel.h"
-
-namespace mojo {
-namespace edk {
-
-#pragma pack(push, 1)
-
-enum BrokerMessageType : uint32_t {
-  INIT,
-  BUFFER_REQUEST,
-  BUFFER_RESPONSE,
-};
-
-struct BrokerMessageHeader {
-  BrokerMessageType type;
-  uint32_t padding;
-};
-
-static_assert(IsAlignedForChannelMessage(sizeof(BrokerMessageHeader)),
-              "Invalid header size.");
-
-struct BufferRequestData {
-  uint32_t size;
-};
-
-#if defined(OS_WIN)
-struct InitData {
-  // NOTE: InitData in the payload is followed by string16 data with exactly
-  // |pipe_name_length| wide characters (i.e., |pipe_name_length|*2 bytes.)
-  // This applies to Windows only.
-  uint32_t pipe_name_length;
-};
-#endif
-
-#pragma pack(pop)
-
-template <typename T>
-inline Channel::MessagePtr CreateBrokerMessage(
-    BrokerMessageType type,
-    size_t num_handles,
-    size_t extra_data_size,
-    T** out_message_data,
-    void** out_extra_data = nullptr) {
-  const size_t message_size = sizeof(BrokerMessageHeader) +
-      sizeof(**out_message_data) + extra_data_size;
-  Channel::MessagePtr message(new Channel::Message(message_size, num_handles));
-  BrokerMessageHeader* header =
-      reinterpret_cast<BrokerMessageHeader*>(message->mutable_payload());
-  header->type = type;
-  header->padding = 0;
-  *out_message_data = reinterpret_cast<T*>(header + 1);
-  if (out_extra_data)
-    *out_extra_data = *out_message_data + 1;
-  return message;
-}
-
-inline Channel::MessagePtr CreateBrokerMessage(
-    BrokerMessageType type,
-    size_t num_handles,
-    std::nullptr_t** dummy_out_data) {
-  Channel::MessagePtr message(
-      new Channel::Message(sizeof(BrokerMessageHeader), num_handles));
-  BrokerMessageHeader* header =
-      reinterpret_cast<BrokerMessageHeader*>(message->mutable_payload());
-  header->type = type;
-  header->padding = 0;
-  return message;
-}
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_BROKER_MESSAGES_H_
diff --git a/mojo/edk/system/broker_posix.cc b/mojo/edk/system/broker_posix.cc
deleted file mode 100644
index 8742f70..0000000
--- a/mojo/edk/system/broker_posix.cc
+++ /dev/null
@@ -1,125 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/system/broker.h"
-
-#include <fcntl.h>
-#include <unistd.h>
-
-#include <utility>
-
-#include "base/logging.h"
-#include "mojo/edk/embedder/embedder_internal.h"
-#include "mojo/edk/embedder/platform_channel_utils_posix.h"
-#include "mojo/edk/embedder/platform_handle_utils.h"
-#include "mojo/edk/embedder/platform_handle_vector.h"
-#include "mojo/edk/embedder/platform_shared_buffer.h"
-#include "mojo/edk/system/broker_messages.h"
-#include "mojo/edk/system/channel.h"
-
-namespace mojo {
-namespace edk {
-
-namespace {
-
-bool WaitForBrokerMessage(PlatformHandle platform_handle,
-                          BrokerMessageType expected_type,
-                          size_t expected_num_handles,
-                          std::deque<PlatformHandle>* incoming_handles) {
-  Channel::MessagePtr message(
-      new Channel::Message(sizeof(BrokerMessageHeader), expected_num_handles));
-  std::deque<PlatformHandle> incoming_platform_handles;
-  ssize_t read_result = PlatformChannelRecvmsg(
-      platform_handle, const_cast<void*>(message->data()),
-      message->data_num_bytes(), &incoming_platform_handles, true /* block */);
-  bool error = false;
-  if (read_result < 0) {
-    PLOG(ERROR) << "Recvmsg error";
-    error = true;
-  } else if (static_cast<size_t>(read_result) != message->data_num_bytes()) {
-    LOG(ERROR) << "Invalid node channel message";
-    error = true;
-  } else if (incoming_platform_handles.size() != expected_num_handles) {
-    LOG(ERROR) << "Received unexpected number of handles";
-    error = true;
-  }
-
-  if (!error) {
-    const BrokerMessageHeader* header =
-        reinterpret_cast<const BrokerMessageHeader*>(message->payload());
-    if (header->type != expected_type) {
-      LOG(ERROR) << "Unexpected message";
-      error = true;
-    }
-  }
-
-  if (error) {
-    CloseAllPlatformHandles(&incoming_platform_handles);
-  } else {
-    if (incoming_handles)
-      incoming_handles->swap(incoming_platform_handles);
-  }
-  return !error;
-}
-
-}  // namespace
-
-Broker::Broker(ScopedPlatformHandle platform_handle)
-    : sync_channel_(std::move(platform_handle)) {
-  CHECK(sync_channel_.is_valid());
-
-  // Mark the channel as blocking.
-  int flags = fcntl(sync_channel_.get().handle, F_GETFL);
-  PCHECK(flags != -1);
-  flags = fcntl(sync_channel_.get().handle, F_SETFL, flags & ~O_NONBLOCK);
-  PCHECK(flags != -1);
-
-  // Wait for the first message, which should contain a handle.
-  std::deque<PlatformHandle> incoming_platform_handles;
-  if (WaitForBrokerMessage(sync_channel_.get(), BrokerMessageType::INIT, 1,
-                           &incoming_platform_handles)) {
-    parent_channel_ = ScopedPlatformHandle(incoming_platform_handles.front());
-  }
-}
-
-Broker::~Broker() = default;
-
-ScopedPlatformHandle Broker::GetParentPlatformHandle() {
-  return std::move(parent_channel_);
-}
-
-scoped_refptr<PlatformSharedBuffer> Broker::GetSharedBuffer(size_t num_bytes) {
-  base::AutoLock lock(lock_);
-
-  BufferRequestData* buffer_request;
-  Channel::MessagePtr out_message = CreateBrokerMessage(
-      BrokerMessageType::BUFFER_REQUEST, 0, 0, &buffer_request);
-  buffer_request->size = num_bytes;
-  ssize_t write_result = PlatformChannelWrite(
-      sync_channel_.get(), out_message->data(), out_message->data_num_bytes());
-  if (write_result < 0) {
-    PLOG(ERROR) << "Error sending sync broker message";
-    return nullptr;
-  } else if (static_cast<size_t>(write_result) !=
-             out_message->data_num_bytes()) {
-    LOG(ERROR) << "Error sending complete broker message";
-    return nullptr;
-  }
-
-  std::deque<PlatformHandle> incoming_platform_handles;
-  if (WaitForBrokerMessage(sync_channel_.get(),
-                           BrokerMessageType::BUFFER_RESPONSE, 2,
-                           &incoming_platform_handles)) {
-    ScopedPlatformHandle rw_handle(incoming_platform_handles.front());
-    incoming_platform_handles.pop_front();
-    ScopedPlatformHandle ro_handle(incoming_platform_handles.front());
-    return PlatformSharedBuffer::CreateFromPlatformHandlePair(
-        num_bytes, std::move(rw_handle), std::move(ro_handle));
-  }
-
-  return nullptr;
-}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/broker_win.cc b/mojo/edk/system/broker_win.cc
deleted file mode 100644
index 063282c..0000000
--- a/mojo/edk/system/broker_win.cc
+++ /dev/null
@@ -1,155 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <windows.h>
-
-#include <limits>
-#include <utility>
-
-#include "base/debug/alias.h"
-#include "base/numerics/safe_conversions.h"
-#include "base/strings/string_piece.h"
-#include "mojo/edk/embedder/named_platform_handle.h"
-#include "mojo/edk/embedder/named_platform_handle_utils.h"
-#include "mojo/edk/embedder/platform_handle.h"
-#include "mojo/edk/embedder/platform_handle_vector.h"
-#include "mojo/edk/embedder/platform_shared_buffer.h"
-#include "mojo/edk/system/broker.h"
-#include "mojo/edk/system/broker_messages.h"
-#include "mojo/edk/system/channel.h"
-
-namespace mojo {
-namespace edk {
-
-namespace {
-
-// 256 bytes should be enough for anyone!
-const size_t kMaxBrokerMessageSize = 256;
-
-bool TakeHandlesFromBrokerMessage(Channel::Message* message,
-                                  size_t num_handles,
-                                  ScopedPlatformHandle* out_handles) {
-  if (message->num_handles() != num_handles) {
-    DLOG(ERROR) << "Received unexpected number of handles in broker message";
-    return false;
-  }
-
-  ScopedPlatformHandleVectorPtr handles = message->TakeHandles();
-  DCHECK(handles);
-  DCHECK_EQ(handles->size(), num_handles);
-  DCHECK(out_handles);
-
-  for (size_t i = 0; i < num_handles; ++i)
-    out_handles[i] = ScopedPlatformHandle((*handles)[i]);
-  handles->clear();
-  return true;
-}
-
-Channel::MessagePtr WaitForBrokerMessage(PlatformHandle platform_handle,
-                                         BrokerMessageType expected_type) {
-  char buffer[kMaxBrokerMessageSize];
-  DWORD bytes_read = 0;
-  BOOL result = ::ReadFile(platform_handle.handle, buffer,
-                           kMaxBrokerMessageSize, &bytes_read, nullptr);
-  if (!result) {
-    // The pipe may be broken if the browser side has been closed, e.g. during
-    // browser shutdown. In that case the ReadFile call will fail and we
-    // shouldn't continue waiting.
-    PLOG(ERROR) << "Error reading broker pipe";
-    return nullptr;
-  }
-
-  Channel::MessagePtr message =
-      Channel::Message::Deserialize(buffer, static_cast<size_t>(bytes_read));
-  if (!message || message->payload_size() < sizeof(BrokerMessageHeader)) {
-    LOG(ERROR) << "Invalid broker message";
-
-    base::debug::Alias(&buffer[0]);
-    base::debug::Alias(&bytes_read);
-    base::debug::Alias(message.get());
-    CHECK(false);
-    return nullptr;
-  }
-
-  const BrokerMessageHeader* header =
-      reinterpret_cast<const BrokerMessageHeader*>(message->payload());
-  if (header->type != expected_type) {
-    LOG(ERROR) << "Unexpected broker message type";
-
-    base::debug::Alias(&buffer[0]);
-    base::debug::Alias(&bytes_read);
-    base::debug::Alias(message.get());
-    CHECK(false);
-    return nullptr;
-  }
-
-  return message;
-}
-
-}  // namespace
-
-Broker::Broker(ScopedPlatformHandle handle) : sync_channel_(std::move(handle)) {
-  CHECK(sync_channel_.is_valid());
-  Channel::MessagePtr message =
-      WaitForBrokerMessage(sync_channel_.get(), BrokerMessageType::INIT);
-
-  // If we fail to read a message (broken pipe), just return early. The parent
-  // handle will be null and callers must handle this gracefully.
-  if (!message)
-    return;
-
-  if (!TakeHandlesFromBrokerMessage(message.get(), 1, &parent_channel_)) {
-    // If the message has no handles, we expect it to carry pipe name instead.
-    const BrokerMessageHeader* header =
-        static_cast<const BrokerMessageHeader*>(message->payload());
-    CHECK_GE(message->payload_size(),
-             sizeof(BrokerMessageHeader) + sizeof(InitData));
-    const InitData* data = reinterpret_cast<const InitData*>(header + 1);
-    CHECK_EQ(message->payload_size(),
-             sizeof(BrokerMessageHeader) + sizeof(InitData) +
-             data->pipe_name_length * sizeof(base::char16));
-    const base::char16* name_data =
-        reinterpret_cast<const base::char16*>(data + 1);
-    CHECK(data->pipe_name_length);
-    parent_channel_ = CreateClientHandle(NamedPlatformHandle(
-        base::StringPiece16(name_data, data->pipe_name_length)));
-  }
-}
-
-Broker::~Broker() {}
-
-ScopedPlatformHandle Broker::GetParentPlatformHandle() {
-  return std::move(parent_channel_);
-}
-
-scoped_refptr<PlatformSharedBuffer> Broker::GetSharedBuffer(size_t num_bytes) {
-  base::AutoLock lock(lock_);
-  BufferRequestData* buffer_request;
-  Channel::MessagePtr out_message = CreateBrokerMessage(
-      BrokerMessageType::BUFFER_REQUEST, 0, 0, &buffer_request);
-  buffer_request->size = base::checked_cast<uint32_t>(num_bytes);
-  DWORD bytes_written = 0;
-  BOOL result = ::WriteFile(sync_channel_.get().handle, out_message->data(),
-                            static_cast<DWORD>(out_message->data_num_bytes()),
-                            &bytes_written, nullptr);
-  if (!result ||
-      static_cast<size_t>(bytes_written) != out_message->data_num_bytes()) {
-    LOG(ERROR) << "Error sending sync broker message";
-    return nullptr;
-  }
-
-  ScopedPlatformHandle handles[2];
-  Channel::MessagePtr response = WaitForBrokerMessage(
-      sync_channel_.get(), BrokerMessageType::BUFFER_RESPONSE);
-  if (response &&
-      TakeHandlesFromBrokerMessage(response.get(), 2, &handles[0])) {
-    return PlatformSharedBuffer::CreateFromPlatformHandlePair(
-        num_bytes, std::move(handles[0]), std::move(handles[1]));
-  }
-
-  return nullptr;
-}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/channel.cc b/mojo/edk/system/channel.cc
deleted file mode 100644
index 8a44d36..0000000
--- a/mojo/edk/system/channel.cc
+++ /dev/null
@@ -1,683 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/system/channel.h"
-
-#include <stddef.h>
-#include <string.h>
-
-#include <algorithm>
-#include <limits>
-#include <utility>
-
-#include "base/macros.h"
-#include "base/memory/aligned_memory.h"
-#include "base/process/process_handle.h"
-#include "mojo/edk/embedder/platform_handle.h"
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-#include "base/mac/mach_logging.h"
-#elif defined(OS_WIN)
-#include "base/win/win_util.h"
-#endif
-
-namespace mojo {
-namespace edk {
-
-namespace {
-
-static_assert(
-    IsAlignedForChannelMessage(sizeof(Channel::Message::LegacyHeader)),
-    "Invalid LegacyHeader size.");
-
-static_assert(IsAlignedForChannelMessage(sizeof(Channel::Message::Header)),
-              "Invalid Header size.");
-
-static_assert(sizeof(Channel::Message::LegacyHeader) == 8,
-              "LegacyHeader must be 8 bytes on ChromeOS and Android");
-
-static_assert(offsetof(Channel::Message::LegacyHeader, num_bytes) ==
-                  offsetof(Channel::Message::Header, num_bytes),
-              "num_bytes should be at the same offset in both Header structs.");
-static_assert(offsetof(Channel::Message::LegacyHeader, message_type) ==
-                  offsetof(Channel::Message::Header, message_type),
-              "message_type should be at the same offset in both Header "
-              "structs.");
-
-}  // namespace
-
-const size_t kReadBufferSize = 4096;
-const size_t kMaxUnusedReadBufferCapacity = 4096;
-const size_t kMaxChannelMessageSize = 256 * 1024 * 1024;
-const size_t kMaxAttachedHandles = 128;
-
-Channel::Message::Message(size_t payload_size, size_t max_handles)
-#if defined(MOJO_EDK_LEGACY_PROTOCOL)
-    : Message(payload_size, max_handles, MessageType::NORMAL_LEGACY) {
-}
-#else
-    : Message(payload_size, max_handles, MessageType::NORMAL) {
-}
-#endif
-
-Channel::Message::Message(size_t payload_size,
-                          size_t max_handles,
-                          MessageType message_type)
-    : max_handles_(max_handles) {
-  DCHECK_LE(max_handles_, kMaxAttachedHandles);
-
-  const bool is_legacy_message = (message_type == MessageType::NORMAL_LEGACY);
-  size_t extra_header_size = 0;
-#if defined(OS_WIN)
-  // On Windows we serialize HANDLEs into the extra header space.
-  extra_header_size = max_handles_ * sizeof(HandleEntry);
-#elif defined(OS_MACOSX) && !defined(OS_IOS)
-  // On OSX, some of the platform handles may be mach ports, which are
-  // serialised into the message buffer. Since there could be a mix of fds and
-  // mach ports, we store the mach ports as an <index, port> pair (of uint32_t),
-  // so that the original ordering of handles can be re-created.
-  if (max_handles) {
-    extra_header_size =
-        sizeof(MachPortsExtraHeader) + (max_handles * sizeof(MachPortsEntry));
-  }
-#endif
-  // Pad extra header data to be aliged to |kChannelMessageAlignment| bytes.
-  if (!IsAlignedForChannelMessage(extra_header_size)) {
-    extra_header_size += kChannelMessageAlignment -
-                         (extra_header_size % kChannelMessageAlignment);
-  }
-  DCHECK(IsAlignedForChannelMessage(extra_header_size));
-  const size_t header_size =
-      is_legacy_message ? sizeof(LegacyHeader) : sizeof(Header);
-  DCHECK(extra_header_size == 0 || !is_legacy_message);
-
-  size_ = header_size + extra_header_size + payload_size;
-  data_ = static_cast<char*>(base::AlignedAlloc(size_,
-                                                kChannelMessageAlignment));
-  // Only zero out the header and not the payload. Since the payload is going to
-  // be memcpy'd, zeroing the payload is unnecessary work and a significant
-  // performance issue when dealing with large messages. Any sanitizer errors
-  // complaining about an uninitialized read in the payload area should be
-  // treated as an error and fixed.
-  memset(data_, 0, header_size + extra_header_size);
-
-  DCHECK_LE(size_, std::numeric_limits<uint32_t>::max());
-  legacy_header()->num_bytes = static_cast<uint32_t>(size_);
-
-  DCHECK_LE(header_size + extra_header_size,
-            std::numeric_limits<uint16_t>::max());
-  legacy_header()->message_type = message_type;
-
-  if (is_legacy_message) {
-    legacy_header()->num_handles = static_cast<uint16_t>(max_handles);
-  } else {
-    header()->num_header_bytes =
-        static_cast<uint16_t>(header_size + extra_header_size);
-  }
-
-  if (max_handles_ > 0) {
-#if defined(OS_WIN)
-    handles_ = reinterpret_cast<HandleEntry*>(mutable_extra_header());
-    // Initialize all handles to invalid values.
-    for (size_t i = 0; i < max_handles_; ++i)
-      handles_[i].handle = base::win::HandleToUint32(INVALID_HANDLE_VALUE);
-#elif defined(OS_MACOSX) && !defined(OS_IOS)
-    mach_ports_header_ =
-        reinterpret_cast<MachPortsExtraHeader*>(mutable_extra_header());
-    mach_ports_header_->num_ports = 0;
-    // Initialize all handles to invalid values.
-    for (size_t i = 0; i < max_handles_; ++i) {
-      mach_ports_header_->entries[i] =
-          {0, static_cast<uint32_t>(MACH_PORT_NULL)};
-    }
-#endif
-  }
-}
-
-Channel::Message::~Message() {
-  base::AlignedFree(data_);
-}
-
-// static
-Channel::MessagePtr Channel::Message::Deserialize(const void* data,
-                                                  size_t data_num_bytes) {
-  if (data_num_bytes < sizeof(LegacyHeader))
-    return nullptr;
-
-  const LegacyHeader* legacy_header =
-      reinterpret_cast<const LegacyHeader*>(data);
-  if (legacy_header->num_bytes != data_num_bytes) {
-    DLOG(ERROR) << "Decoding invalid message: " << legacy_header->num_bytes
-                << " != " << data_num_bytes;
-    return nullptr;
-  }
-
-  const Header* header = nullptr;
-  if (legacy_header->message_type == MessageType::NORMAL)
-    header = reinterpret_cast<const Header*>(data);
-
-  uint32_t extra_header_size = 0;
-  size_t payload_size = 0;
-  const char* payload = nullptr;
-  if (!header) {
-    payload_size = data_num_bytes - sizeof(LegacyHeader);
-    payload = static_cast<const char*>(data) + sizeof(LegacyHeader);
-  } else {
-    if (header->num_bytes < header->num_header_bytes ||
-        header->num_header_bytes < sizeof(Header)) {
-      DLOG(ERROR) << "Decoding invalid message: " << header->num_bytes << " < "
-                  << header->num_header_bytes;
-      return nullptr;
-    }
-    extra_header_size = header->num_header_bytes - sizeof(Header);
-    payload_size = data_num_bytes - header->num_header_bytes;
-    payload = static_cast<const char*>(data) + header->num_header_bytes;
-  }
-
-#if defined(OS_WIN)
-  uint32_t max_handles = extra_header_size / sizeof(HandleEntry);
-#elif defined(OS_MACOSX) && !defined(OS_IOS)
-  if (extra_header_size > 0 &&
-      extra_header_size < sizeof(MachPortsExtraHeader)) {
-    DLOG(ERROR) << "Decoding invalid message: " << extra_header_size << " < "
-                << sizeof(MachPortsExtraHeader);
-    return nullptr;
-  }
-  uint32_t max_handles =
-      extra_header_size == 0
-          ? 0
-          : (extra_header_size - sizeof(MachPortsExtraHeader)) /
-                sizeof(MachPortsEntry);
-#else
-  const uint32_t max_handles = 0;
-#endif  // defined(OS_WIN)
-
-  const uint16_t num_handles =
-      header ? header->num_handles : legacy_header->num_handles;
-  if (num_handles > max_handles || max_handles > kMaxAttachedHandles) {
-    DLOG(ERROR) << "Decoding invalid message: " << num_handles << " > "
-                << max_handles;
-    return nullptr;
-  }
-
-  MessagePtr message(
-      new Message(payload_size, max_handles, legacy_header->message_type));
-  DCHECK_EQ(message->data_num_bytes(), data_num_bytes);
-
-  // Copy all payload bytes.
-  if (payload_size)
-    memcpy(message->mutable_payload(), payload, payload_size);
-
-  if (header) {
-    DCHECK_EQ(message->extra_header_size(), extra_header_size);
-    DCHECK_EQ(message->header()->num_header_bytes, header->num_header_bytes);
-
-    if (message->extra_header_size()) {
-      // Copy extra header bytes.
-      memcpy(message->mutable_extra_header(),
-             static_cast<const char*>(data) + sizeof(Header),
-             message->extra_header_size());
-    }
-    message->header()->num_handles = header->num_handles;
-  } else {
-    message->legacy_header()->num_handles = legacy_header->num_handles;
-  }
-
-#if defined(OS_WIN)
-  ScopedPlatformHandleVectorPtr handles(new PlatformHandleVector(num_handles));
-  for (size_t i = 0; i < num_handles; i++) {
-    (*handles)[i].handle =
-        base::win::Uint32ToHandle(message->handles_[i].handle);
-  }
-  message->SetHandles(std::move(handles));
-#endif
-
-  return message;
-}
-
-const void* Channel::Message::extra_header() const {
-  DCHECK(!is_legacy_message());
-  return data_ + sizeof(Header);
-}
-
-void* Channel::Message::mutable_extra_header() {
-  DCHECK(!is_legacy_message());
-  return data_ + sizeof(Header);
-}
-
-size_t Channel::Message::extra_header_size() const {
-  return header()->num_header_bytes - sizeof(Header);
-}
-
-void* Channel::Message::mutable_payload() {
-  if (is_legacy_message())
-    return static_cast<void*>(legacy_header() + 1);
-  return data_ + header()->num_header_bytes;
-}
-
-const void* Channel::Message::payload() const {
-  if (is_legacy_message())
-    return static_cast<const void*>(legacy_header() + 1);
-  return data_ + header()->num_header_bytes;
-}
-
-size_t Channel::Message::payload_size() const {
-  if (is_legacy_message())
-    return legacy_header()->num_bytes - sizeof(LegacyHeader);
-  return size_ - header()->num_header_bytes;
-}
-
-size_t Channel::Message::num_handles() const {
-  return is_legacy_message() ? legacy_header()->num_handles
-                             : header()->num_handles;
-}
-
-bool Channel::Message::has_handles() const {
-  return (is_legacy_message() ? legacy_header()->num_handles
-                              : header()->num_handles) > 0;
-}
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-bool Channel::Message::has_mach_ports() const {
-  if (!has_handles())
-    return false;
-
-  for (const auto& handle : (*handle_vector_)) {
-    if (handle.type == PlatformHandle::Type::MACH ||
-        handle.type == PlatformHandle::Type::MACH_NAME) {
-      return true;
-    }
-  }
-  return false;
-}
-#endif
-
-bool Channel::Message::is_legacy_message() const {
-  return legacy_header()->message_type == MessageType::NORMAL_LEGACY;
-}
-
-Channel::Message::LegacyHeader* Channel::Message::legacy_header() const {
-  return reinterpret_cast<LegacyHeader*>(data_);
-}
-
-Channel::Message::Header* Channel::Message::header() const {
-  DCHECK(!is_legacy_message());
-  return reinterpret_cast<Header*>(data_);
-}
-
-void Channel::Message::SetHandles(ScopedPlatformHandleVectorPtr new_handles) {
-  if (is_legacy_message()) {
-    // Old semantics for ChromeOS and Android
-    if (legacy_header()->num_handles == 0) {
-      CHECK(!new_handles || new_handles->size() == 0);
-      return;
-    }
-    CHECK(new_handles && new_handles->size() == legacy_header()->num_handles);
-    std::swap(handle_vector_, new_handles);
-    return;
-  }
-
-  if (max_handles_ == 0) {
-    CHECK(!new_handles || new_handles->size() == 0);
-    return;
-  }
-
-  CHECK(new_handles && new_handles->size() <= max_handles_);
-  header()->num_handles = static_cast<uint16_t>(new_handles->size());
-  std::swap(handle_vector_, new_handles);
-#if defined(OS_WIN)
-  memset(handles_, 0, extra_header_size());
-  for (size_t i = 0; i < handle_vector_->size(); i++)
-    handles_[i].handle = base::win::HandleToUint32((*handle_vector_)[i].handle);
-#endif  // defined(OS_WIN)
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-  size_t mach_port_index = 0;
-  if (mach_ports_header_) {
-    for (size_t i = 0; i < max_handles_; ++i) {
-      mach_ports_header_->entries[i] =
-          {0, static_cast<uint32_t>(MACH_PORT_NULL)};
-    }
-    for (size_t i = 0; i < handle_vector_->size(); i++) {
-      if ((*handle_vector_)[i].type == PlatformHandle::Type::MACH ||
-          (*handle_vector_)[i].type == PlatformHandle::Type::MACH_NAME) {
-        mach_port_t port = (*handle_vector_)[i].port;
-        mach_ports_header_->entries[mach_port_index].index = i;
-        mach_ports_header_->entries[mach_port_index].mach_port = port;
-        mach_port_index++;
-      }
-    }
-    mach_ports_header_->num_ports = static_cast<uint16_t>(mach_port_index);
-  }
-#endif
-}
-
-ScopedPlatformHandleVectorPtr Channel::Message::TakeHandles() {
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-  if (mach_ports_header_) {
-    for (size_t i = 0; i < max_handles_; ++i) {
-      mach_ports_header_->entries[i] =
-          {0, static_cast<uint32_t>(MACH_PORT_NULL)};
-    }
-    mach_ports_header_->num_ports = 0;
-  }
-#endif
-  if (is_legacy_message())
-    legacy_header()->num_handles = 0;
-  else
-    header()->num_handles = 0;
-  return std::move(handle_vector_);
-}
-
-ScopedPlatformHandleVectorPtr Channel::Message::TakeHandlesForTransport() {
-#if defined(OS_WIN)
-  // Not necessary on Windows.
-  NOTREACHED();
-  return nullptr;
-#elif defined(OS_MACOSX) && !defined(OS_IOS)
-  if (handle_vector_) {
-    for (auto it = handle_vector_->begin(); it != handle_vector_->end(); ) {
-      if (it->type == PlatformHandle::Type::MACH ||
-          it->type == PlatformHandle::Type::MACH_NAME) {
-        // For Mach port names, we can can just leak them. They're not real
-        // ports anyways. For real ports, they're leaked because this is a child
-        // process and the remote process will take ownership.
-        it = handle_vector_->erase(it);
-      } else {
-        ++it;
-      }
-    }
-  }
-  return std::move(handle_vector_);
-#else
-  return std::move(handle_vector_);
-#endif
-}
-
-#if defined(OS_WIN)
-// static
-bool Channel::Message::RewriteHandles(base::ProcessHandle from_process,
-                                      base::ProcessHandle to_process,
-                                      PlatformHandleVector* handles) {
-  bool success = true;
-  for (size_t i = 0; i < handles->size(); ++i) {
-    if (!(*handles)[i].is_valid()) {
-      DLOG(ERROR) << "Refusing to duplicate invalid handle.";
-      continue;
-    }
-    DCHECK_EQ((*handles)[i].owning_process, from_process);
-    BOOL result = DuplicateHandle(
-        from_process, (*handles)[i].handle, to_process,
-        &(*handles)[i].handle, 0, FALSE,
-        DUPLICATE_SAME_ACCESS | DUPLICATE_CLOSE_SOURCE);
-    if (result) {
-      (*handles)[i].owning_process = to_process;
-    } else {
-      success = false;
-
-      // If handle duplication fails, the source handle will already be closed
-      // due to DUPLICATE_CLOSE_SOURCE. Replace the handle in the message with
-      // an invalid handle.
-      (*handles)[i].handle = INVALID_HANDLE_VALUE;
-      (*handles)[i].owning_process = base::GetCurrentProcessHandle();
-    }
-  }
-  return success;
-}
-#endif
-
-// Helper class for managing a Channel's read buffer allocations. This maintains
-// a single contiguous buffer with the layout:
-//
-//   [discarded bytes][occupied bytes][unoccupied bytes]
-//
-// The Reserve() method ensures that a certain capacity of unoccupied bytes are
-// available. It does not claim that capacity and only allocates new capacity
-// when strictly necessary.
-//
-// Claim() marks unoccupied bytes as occupied.
-//
-// Discard() marks occupied bytes as discarded, signifying that their contents
-// can be forgotten or overwritten.
-//
-// Realign() moves occupied bytes to the front of the buffer so that those
-// occupied bytes are properly aligned.
-//
-// The most common Channel behavior in practice should result in very few
-// allocations and copies, as memory is claimed and discarded shortly after
-// being reserved, and future reservations will immediately reuse discarded
-// memory.
-class Channel::ReadBuffer {
- public:
-  ReadBuffer() {
-    size_ = kReadBufferSize;
-    data_ = static_cast<char*>(base::AlignedAlloc(size_,
-                                                  kChannelMessageAlignment));
-  }
-
-  ~ReadBuffer() {
-    DCHECK(data_);
-    base::AlignedFree(data_);
-  }
-
-  const char* occupied_bytes() const { return data_ + num_discarded_bytes_; }
-
-  size_t num_occupied_bytes() const {
-    return num_occupied_bytes_ - num_discarded_bytes_;
-  }
-
-  // Ensures the ReadBuffer has enough contiguous space allocated to hold
-  // |num_bytes| more bytes; returns the address of the first available byte.
-  char* Reserve(size_t num_bytes) {
-    if (num_occupied_bytes_ + num_bytes > size_) {
-      size_ = std::max(size_ * 2, num_occupied_bytes_ + num_bytes);
-      void* new_data = base::AlignedAlloc(size_, kChannelMessageAlignment);
-      memcpy(new_data, data_, num_occupied_bytes_);
-      base::AlignedFree(data_);
-      data_ = static_cast<char*>(new_data);
-    }
-
-    return data_ + num_occupied_bytes_;
-  }
-
-  // Marks the first |num_bytes| unoccupied bytes as occupied.
-  void Claim(size_t num_bytes) {
-    DCHECK_LE(num_occupied_bytes_ + num_bytes, size_);
-    num_occupied_bytes_ += num_bytes;
-  }
-
-  // Marks the first |num_bytes| occupied bytes as discarded. This may result in
-  // shrinkage of the internal buffer, and it is not safe to assume the result
-  // of a previous Reserve() call is still valid after this.
-  void Discard(size_t num_bytes) {
-    DCHECK_LE(num_discarded_bytes_ + num_bytes, num_occupied_bytes_);
-    num_discarded_bytes_ += num_bytes;
-
-    if (num_discarded_bytes_ == num_occupied_bytes_) {
-      // We can just reuse the buffer from the beginning in this common case.
-      num_discarded_bytes_ = 0;
-      num_occupied_bytes_ = 0;
-    }
-
-    if (num_discarded_bytes_ > kMaxUnusedReadBufferCapacity) {
-      // In the uncommon case that we have a lot of discarded data at the
-      // front of the buffer, simply move remaining data to a smaller buffer.
-      size_t num_preserved_bytes = num_occupied_bytes_ - num_discarded_bytes_;
-      size_ = std::max(num_preserved_bytes, kReadBufferSize);
-      char* new_data = static_cast<char*>(
-          base::AlignedAlloc(size_, kChannelMessageAlignment));
-      memcpy(new_data, data_ + num_discarded_bytes_, num_preserved_bytes);
-      base::AlignedFree(data_);
-      data_ = new_data;
-      num_discarded_bytes_ = 0;
-      num_occupied_bytes_ = num_preserved_bytes;
-    }
-
-    if (num_occupied_bytes_ == 0 && size_ > kMaxUnusedReadBufferCapacity) {
-      // Opportunistically shrink the read buffer back down to a small size if
-      // it's grown very large. We only do this if there are no remaining
-      // unconsumed bytes in the buffer to avoid copies in most the common
-      // cases.
-      size_ = kMaxUnusedReadBufferCapacity;
-      base::AlignedFree(data_);
-      data_ = static_cast<char*>(
-          base::AlignedAlloc(size_, kChannelMessageAlignment));
-    }
-  }
-
-  void Realign() {
-    size_t num_bytes = num_occupied_bytes();
-    memmove(data_, occupied_bytes(), num_bytes);
-    num_discarded_bytes_ = 0;
-    num_occupied_bytes_ = num_bytes;
-  }
-
- private:
-  char* data_ = nullptr;
-
-  // The total size of the allocated buffer.
-  size_t size_ = 0;
-
-  // The number of discarded bytes at the beginning of the allocated buffer.
-  size_t num_discarded_bytes_ = 0;
-
-  // The total number of occupied bytes, including discarded bytes.
-  size_t num_occupied_bytes_ = 0;
-
-  DISALLOW_COPY_AND_ASSIGN(ReadBuffer);
-};
-
-Channel::Channel(Delegate* delegate)
-    : delegate_(delegate), read_buffer_(new ReadBuffer) {
-}
-
-Channel::~Channel() {
-}
-
-void Channel::ShutDown() {
-  delegate_ = nullptr;
-  ShutDownImpl();
-}
-
-char* Channel::GetReadBuffer(size_t *buffer_capacity) {
-  DCHECK(read_buffer_);
-  size_t required_capacity = *buffer_capacity;
-  if (!required_capacity)
-    required_capacity = kReadBufferSize;
-
-  *buffer_capacity = required_capacity;
-  return read_buffer_->Reserve(required_capacity);
-}
-
-bool Channel::OnReadComplete(size_t bytes_read, size_t *next_read_size_hint) {
-  bool did_dispatch_message = false;
-  read_buffer_->Claim(bytes_read);
-  while (read_buffer_->num_occupied_bytes() >= sizeof(Message::LegacyHeader)) {
-    // Ensure the occupied data is properly aligned. If it isn't, a SIGBUS could
-    // happen on architectures that don't allow misaligned words access (i.e.
-    // anything other than x86). Only re-align when necessary to avoid copies.
-    if (!IsAlignedForChannelMessage(
-            reinterpret_cast<uintptr_t>(read_buffer_->occupied_bytes()))) {
-      read_buffer_->Realign();
-    }
-
-    // We have at least enough data available for a LegacyHeader.
-    const Message::LegacyHeader* legacy_header =
-        reinterpret_cast<const Message::LegacyHeader*>(
-            read_buffer_->occupied_bytes());
-
-    if (legacy_header->num_bytes < sizeof(Message::LegacyHeader) ||
-        legacy_header->num_bytes > kMaxChannelMessageSize) {
-      LOG(ERROR) << "Invalid message size: " << legacy_header->num_bytes;
-      return false;
-    }
-
-    if (read_buffer_->num_occupied_bytes() < legacy_header->num_bytes) {
-      // Not enough data available to read the full message. Hint to the
-      // implementation that it should try reading the full size of the message.
-      *next_read_size_hint =
-          legacy_header->num_bytes - read_buffer_->num_occupied_bytes();
-      return true;
-    }
-
-    const Message::Header* header = nullptr;
-    if (legacy_header->message_type != Message::MessageType::NORMAL_LEGACY) {
-      header = reinterpret_cast<const Message::Header*>(legacy_header);
-    }
-
-    size_t extra_header_size = 0;
-    const void* extra_header = nullptr;
-    size_t payload_size = 0;
-    void* payload = nullptr;
-    if (header) {
-      if (header->num_header_bytes < sizeof(Message::Header) ||
-          header->num_header_bytes > header->num_bytes) {
-        LOG(ERROR) << "Invalid message header size: "
-                   << header->num_header_bytes;
-        return false;
-      }
-      extra_header_size = header->num_header_bytes - sizeof(Message::Header);
-      extra_header = extra_header_size ? header + 1 : nullptr;
-      payload_size = header->num_bytes - header->num_header_bytes;
-      payload = payload_size
-                    ? reinterpret_cast<Message::Header*>(
-                          const_cast<char*>(read_buffer_->occupied_bytes()) +
-                          header->num_header_bytes)
-                    : nullptr;
-    } else {
-      payload_size = legacy_header->num_bytes - sizeof(Message::LegacyHeader);
-      payload = payload_size
-                    ? const_cast<Message::LegacyHeader*>(&legacy_header[1])
-                    : nullptr;
-    }
-
-    const uint16_t num_handles =
-        header ? header->num_handles : legacy_header->num_handles;
-    ScopedPlatformHandleVectorPtr handles;
-    if (num_handles > 0) {
-      if (!GetReadPlatformHandles(num_handles, extra_header, extra_header_size,
-                                  &handles)) {
-        return false;
-      }
-
-      if (!handles) {
-        // Not enough handles available for this message.
-        break;
-      }
-    }
-
-    // We've got a complete message! Dispatch it and try another.
-    if (legacy_header->message_type != Message::MessageType::NORMAL_LEGACY &&
-        legacy_header->message_type != Message::MessageType::NORMAL) {
-      if (!OnControlMessage(legacy_header->message_type, payload, payload_size,
-                            std::move(handles))) {
-        return false;
-      }
-      did_dispatch_message = true;
-    } else if (delegate_) {
-      delegate_->OnChannelMessage(payload, payload_size, std::move(handles));
-      did_dispatch_message = true;
-    }
-
-    read_buffer_->Discard(legacy_header->num_bytes);
-  }
-
-  *next_read_size_hint = did_dispatch_message ? 0 : kReadBufferSize;
-  return true;
-}
-
-void Channel::OnError() {
-  if (delegate_)
-    delegate_->OnChannelError();
-}
-
-bool Channel::OnControlMessage(Message::MessageType message_type,
-                               const void* payload,
-                               size_t payload_size,
-                               ScopedPlatformHandleVectorPtr handles) {
-  return false;
-}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/channel.h b/mojo/edk/system/channel.h
deleted file mode 100644
index 33a510c..0000000
--- a/mojo/edk/system/channel.h
+++ /dev/null
@@ -1,303 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_SYSTEM_CHANNEL_H_
-#define MOJO_EDK_SYSTEM_CHANNEL_H_
-
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/process/process_handle.h"
-#include "base/task_runner.h"
-#include "mojo/edk/embedder/connection_params.h"
-#include "mojo/edk/embedder/platform_handle_vector.h"
-#include "mojo/edk/embedder/scoped_platform_handle.h"
-
-namespace mojo {
-namespace edk {
-
-const size_t kChannelMessageAlignment = 8;
-
-constexpr bool IsAlignedForChannelMessage(size_t n) {
-  return n % kChannelMessageAlignment == 0;
-}
-
-// Channel provides a thread-safe interface to read and write arbitrary
-// delimited messages over an underlying I/O channel, optionally transferring
-// one or more platform handles in the process.
-class MOJO_SYSTEM_IMPL_EXPORT Channel
-    : public base::RefCountedThreadSafe<Channel> {
- public:
-  struct Message;
-
-  using MessagePtr = std::unique_ptr<Message>;
-
-  // A message to be written to a channel.
-  struct MOJO_SYSTEM_IMPL_EXPORT Message {
-    enum class MessageType : uint16_t {
-      // An old format normal message, that uses the LegacyHeader.
-      // Only used on Android and ChromeOS.
-      // TODO(jcivelli): remove legacy support when Arc++ has updated to Mojo
-      //                 with normal versioned messages. crbug.com/695645
-      NORMAL_LEGACY = 0,
-#if defined(OS_MACOSX)
-      // A control message containing handles to echo back.
-      HANDLES_SENT,
-      // A control message containing handles that can now be closed.
-      HANDLES_SENT_ACK,
-#endif
-      // A normal message that uses Header and can contain extra header values.
-      NORMAL,
-    };
-
-#pragma pack(push, 1)
-    // Old message wire format for ChromeOS and Android, used by NORMAL_LEGACY
-    // messages.
-    struct LegacyHeader {
-      // Message size in bytes, including the header.
-      uint32_t num_bytes;
-
-      // Number of attached handles.
-      uint16_t num_handles;
-
-      MessageType message_type;
-    };
-
-    // Header used by NORMAL messages.
-    // To preserve backward compatibility with LegacyHeader, the num_bytes and
-    // message_type field must be at the same offset as in LegacyHeader.
-    struct Header {
-      // Message size in bytes, including the header.
-      uint32_t num_bytes;
-
-      // Total size of header, including extra header data (i.e. HANDLEs on
-      // windows).
-      uint16_t num_header_bytes;
-
-      MessageType message_type;
-
-      // Number of attached handles. May be less than the reserved handle
-      // storage size in this message on platforms that serialise handles as
-      // data (i.e. HANDLEs on Windows, Mach ports on OSX).
-      uint16_t num_handles;
-
-      char padding[6];
-    };
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-    struct MachPortsEntry {
-      // Index of Mach port in the original vector of PlatformHandles.
-      uint16_t index;
-
-      // Mach port name.
-      uint32_t mach_port;
-      static_assert(sizeof(mach_port_t) <= sizeof(uint32_t),
-                    "mach_port_t must be no larger than uint32_t");
-    };
-    static_assert(sizeof(MachPortsEntry) == 6,
-                  "sizeof(MachPortsEntry) must be 6 bytes");
-
-    // Structure of the extra header field when present on OSX.
-    struct MachPortsExtraHeader {
-      // Actual number of Mach ports encoded in the extra header.
-      uint16_t num_ports;
-
-      // Array of encoded Mach ports. If |num_ports| > 0, |entries[0]| through
-      // to |entries[num_ports-1]| inclusive are valid.
-      MachPortsEntry entries[0];
-    };
-    static_assert(sizeof(MachPortsExtraHeader) == 2,
-                  "sizeof(MachPortsExtraHeader) must be 2 bytes");
-#elif defined(OS_WIN)
-    struct HandleEntry {
-      // The windows HANDLE. HANDLEs are guaranteed to fit inside 32-bits.
-      // See: https://msdn.microsoft.com/en-us/library/aa384203(VS.85).aspx
-      uint32_t handle;
-    };
-    static_assert(sizeof(HandleEntry) == 4,
-                  "sizeof(HandleEntry) must be 4 bytes");
-#endif
-#pragma pack(pop)
-
-    // Allocates and owns a buffer for message data with enough capacity for
-    // |payload_size| bytes plus a header, plus |max_handles| platform handles.
-    Message(size_t payload_size, size_t max_handles);
-    Message(size_t payload_size, size_t max_handles, MessageType message_type);
-    ~Message();
-
-    // Constructs a Message from serialized message data.
-    static MessagePtr Deserialize(const void* data, size_t data_num_bytes);
-
-    const void* data() const { return data_; }
-    size_t data_num_bytes() const { return size_; }
-
-    const void* extra_header() const;
-    void* mutable_extra_header();
-    size_t extra_header_size() const;
-
-    void* mutable_payload();
-    const void* payload() const;
-    size_t payload_size() const;
-
-    size_t num_handles() const;
-    bool has_handles() const;
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-    bool has_mach_ports() const;
-#endif
-
-    bool is_legacy_message() const;
-    LegacyHeader* legacy_header() const;
-    Header* header() const;
-
-    // Note: SetHandles() and TakeHandles() invalidate any previous value of
-    // handles().
-    void SetHandles(ScopedPlatformHandleVectorPtr new_handles);
-    ScopedPlatformHandleVectorPtr TakeHandles();
-    // Version of TakeHandles that returns a vector of platform handles suitable
-    // for transfer over an underlying OS mechanism. i.e. file descriptors over
-    // a unix domain socket. Any handle that cannot be transferred this way,
-    // such as Mach ports, will be removed.
-    ScopedPlatformHandleVectorPtr TakeHandlesForTransport();
-
-#if defined(OS_WIN)
-    // Prepares the handles in this message for use in a different process.
-    // Upon calling this the handles should belong to |from_process|; after the
-    // call they'll belong to |to_process|. The source handles are always
-    // closed by this call. Returns false iff one or more handles failed
-    // duplication.
-    static bool RewriteHandles(base::ProcessHandle from_process,
-                               base::ProcessHandle to_process,
-                               PlatformHandleVector* handles);
-#endif
-
-    void SetVersionForTest(uint16_t version_number);
-
-   private:
-    size_t size_ = 0;
-    size_t max_handles_ = 0;
-    char* data_ = nullptr;
-
-    ScopedPlatformHandleVectorPtr handle_vector_;
-
-#if defined(OS_WIN)
-    // On Windows, handles are serialised into the extra header section.
-    HandleEntry* handles_ = nullptr;
-#elif defined(OS_MACOSX) && !defined(OS_IOS)
-    // On OSX, handles are serialised into the extra header section.
-    MachPortsExtraHeader* mach_ports_header_ = nullptr;
-#endif
-
-    DISALLOW_COPY_AND_ASSIGN(Message);
-  };
-
-  // Delegate methods are called from the I/O task runner with which the Channel
-  // was created (see Channel::Create).
-  class Delegate {
-   public:
-    virtual ~Delegate() {}
-
-    // Notify of a received message. |payload| is not owned and must not be
-    // retained; it will be null if |payload_size| is 0. |handles| are
-    // transferred to the callee.
-    virtual void OnChannelMessage(const void* payload,
-                                  size_t payload_size,
-                                  ScopedPlatformHandleVectorPtr handles) = 0;
-
-    // Notify that an error has occured and the Channel will cease operation.
-    virtual void OnChannelError() = 0;
-  };
-
-  // Creates a new Channel around a |platform_handle|, taking ownership of the
-  // handle. All I/O on the handle will be performed on |io_task_runner|.
-  // Note that ShutDown() MUST be called on the Channel some time before
-  // |delegate| is destroyed.
-  static scoped_refptr<Channel> Create(
-      Delegate* delegate,
-      ConnectionParams connection_params,
-      scoped_refptr<base::TaskRunner> io_task_runner);
-
-  // Request that the channel be shut down. This should always be called before
-  // releasing the last reference to a Channel to ensure that it's cleaned up
-  // on its I/O task runner's thread.
-  //
-  // Delegate methods will no longer be invoked after this call.
-  void ShutDown();
-
-  // Begin processing I/O events. Delegate methods must only be invoked after
-  // this call.
-  virtual void Start() = 0;
-
-  // Stop processing I/O events.
-  virtual void ShutDownImpl() = 0;
-
-  // Queues an outgoing message on the Channel. This message will either
-  // eventually be written or will fail to write and trigger
-  // Delegate::OnChannelError.
-  virtual void Write(MessagePtr message) = 0;
-
-  // Causes the platform handle to leak when this channel is shut down instead
-  // of closing it.
-  virtual void LeakHandle() = 0;
-
- protected:
-  explicit Channel(Delegate* delegate);
-  virtual ~Channel();
-
-  // Called by the implementation when it wants somewhere to stick data.
-  // |*buffer_capacity| may be set by the caller to indicate the desired buffer
-  // size. If 0, a sane default size will be used instead.
-  //
-  // Returns the address of a buffer which can be written to, and indicates its
-  // actual capacity in |*buffer_capacity|.
-  char* GetReadBuffer(size_t* buffer_capacity);
-
-  // Called by the implementation when new data is available in the read
-  // buffer. Returns false to indicate an error. Upon success,
-  // |*next_read_size_hint| will be set to a recommended size for the next
-  // read done by the implementation.
-  bool OnReadComplete(size_t bytes_read, size_t* next_read_size_hint);
-
-  // Called by the implementation when something goes horribly wrong. It is NOT
-  // OK to call this synchronously from any public interface methods.
-  void OnError();
-
-  // Retrieves the set of platform handles read for a given message.
-  // |extra_header| and |extra_header_size| correspond to the extra header data.
-  // Depending on the Channel implementation, this body may encode platform
-  // handles, or handles may be stored and managed elsewhere by the
-  // implementation.
-  //
-  // Returns |false| on unrecoverable error (i.e. the Channel should be closed).
-  // Returns |true| otherwise. Note that it is possible on some platforms for an
-  // insufficient number of handles to be available when this call is made, but
-  // this is not necessarily an error condition. In such cases this returns
-  // |true| but |*handles| will also be reset to null.
-  virtual bool GetReadPlatformHandles(
-      size_t num_handles,
-      const void* extra_header,
-      size_t extra_header_size,
-      ScopedPlatformHandleVectorPtr* handles) = 0;
-
-  // Handles a received control message. Returns |true| if the message is
-  // accepted, or |false| otherwise.
-  virtual bool OnControlMessage(Message::MessageType message_type,
-                                const void* payload,
-                                size_t payload_size,
-                                ScopedPlatformHandleVectorPtr handles);
-
- private:
-  friend class base::RefCountedThreadSafe<Channel>;
-
-  class ReadBuffer;
-
-  Delegate* delegate_;
-  const std::unique_ptr<ReadBuffer> read_buffer_;
-
-  DISALLOW_COPY_AND_ASSIGN(Channel);
-};
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_CHANNEL_H_
diff --git a/mojo/edk/system/channel_posix.cc b/mojo/edk/system/channel_posix.cc
deleted file mode 100644
index 8b4ca7f..0000000
--- a/mojo/edk/system/channel_posix.cc
+++ /dev/null
@@ -1,572 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/system/channel.h"
-
-#include <errno.h>
-#include <sys/socket.h>
-
-#include <algorithm>
-#include <deque>
-#include <limits>
-#include <memory>
-
-#include "base/bind.h"
-#include "base/location.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/message_loop/message_loop.h"
-#include "base/synchronization/lock.h"
-#include "base/task_runner.h"
-#include "mojo/edk/embedder/platform_channel_utils_posix.h"
-#include "mojo/edk/embedder/platform_handle_vector.h"
-
-#if !defined(OS_NACL)
-#include <sys/uio.h>
-#endif
-
-namespace mojo {
-namespace edk {
-
-namespace {
-
-const size_t kMaxBatchReadCapacity = 256 * 1024;
-
-// A view over a Channel::Message object. The write queue uses these since
-// large messages may need to be sent in chunks.
-class MessageView {
- public:
-  // Owns |message|. |offset| indexes the first unsent byte in the message.
-  MessageView(Channel::MessagePtr message, size_t offset)
-      : message_(std::move(message)),
-        offset_(offset),
-        handles_(message_->TakeHandlesForTransport()) {
-    DCHECK_GT(message_->data_num_bytes(), offset_);
-  }
-
-  MessageView(MessageView&& other) { *this = std::move(other); }
-
-  MessageView& operator=(MessageView&& other) {
-    message_ = std::move(other.message_);
-    offset_ = other.offset_;
-    handles_ = std::move(other.handles_);
-    return *this;
-  }
-
-  ~MessageView() {}
-
-  const void* data() const {
-    return static_cast<const char*>(message_->data()) + offset_;
-  }
-
-  size_t data_num_bytes() const { return message_->data_num_bytes() - offset_; }
-
-  size_t data_offset() const { return offset_; }
-  void advance_data_offset(size_t num_bytes) {
-    DCHECK_GT(message_->data_num_bytes(), offset_ + num_bytes);
-    offset_ += num_bytes;
-  }
-
-  ScopedPlatformHandleVectorPtr TakeHandles() { return std::move(handles_); }
-  Channel::MessagePtr TakeMessage() { return std::move(message_); }
-
-  void SetHandles(ScopedPlatformHandleVectorPtr handles) {
-    handles_ = std::move(handles);
-  }
-
- private:
-  Channel::MessagePtr message_;
-  size_t offset_;
-  ScopedPlatformHandleVectorPtr handles_;
-
-  DISALLOW_COPY_AND_ASSIGN(MessageView);
-};
-
-class ChannelPosix : public Channel,
-                     public base::MessageLoop::DestructionObserver,
-                     public base::MessageLoopForIO::Watcher {
- public:
-  ChannelPosix(Delegate* delegate,
-               ConnectionParams connection_params,
-               scoped_refptr<base::TaskRunner> io_task_runner)
-      : Channel(delegate),
-        self_(this),
-        handle_(connection_params.TakeChannelHandle()),
-        io_task_runner_(io_task_runner)
-#if defined(OS_MACOSX)
-        ,
-        handles_to_close_(new PlatformHandleVector)
-#endif
-  {
-    CHECK(handle_.is_valid());
-  }
-
-  void Start() override {
-    if (io_task_runner_->RunsTasksOnCurrentThread()) {
-      StartOnIOThread();
-    } else {
-      io_task_runner_->PostTask(
-          FROM_HERE, base::Bind(&ChannelPosix::StartOnIOThread, this));
-    }
-  }
-
-  void ShutDownImpl() override {
-    // Always shut down asynchronously when called through the public interface.
-    io_task_runner_->PostTask(
-        FROM_HERE, base::Bind(&ChannelPosix::ShutDownOnIOThread, this));
-  }
-
-  void Write(MessagePtr message) override {
-    bool write_error = false;
-    {
-      base::AutoLock lock(write_lock_);
-      if (reject_writes_)
-        return;
-      if (outgoing_messages_.empty()) {
-        if (!WriteNoLock(MessageView(std::move(message), 0)))
-          reject_writes_ = write_error = true;
-      } else {
-        outgoing_messages_.emplace_back(std::move(message), 0);
-      }
-    }
-    if (write_error) {
-      // Do not synchronously invoke OnError(). Write() may have been called by
-      // the delegate and we don't want to re-enter it.
-      io_task_runner_->PostTask(FROM_HERE,
-                                base::Bind(&ChannelPosix::OnError, this));
-    }
-  }
-
-  void LeakHandle() override {
-    DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
-    leak_handle_ = true;
-  }
-
-  bool GetReadPlatformHandles(
-      size_t num_handles,
-      const void* extra_header,
-      size_t extra_header_size,
-      ScopedPlatformHandleVectorPtr* handles) override {
-    if (num_handles > std::numeric_limits<uint16_t>::max())
-      return false;
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-    // On OSX, we can have mach ports which are located in the extra header
-    // section.
-    using MachPortsEntry = Channel::Message::MachPortsEntry;
-    using MachPortsExtraHeader = Channel::Message::MachPortsExtraHeader;
-    CHECK(extra_header_size >=
-          sizeof(MachPortsExtraHeader) + num_handles * sizeof(MachPortsEntry));
-    const MachPortsExtraHeader* mach_ports_header =
-        reinterpret_cast<const MachPortsExtraHeader*>(extra_header);
-    size_t num_mach_ports = mach_ports_header->num_ports;
-    CHECK(num_mach_ports <= num_handles);
-    if (incoming_platform_handles_.size() + num_mach_ports < num_handles) {
-      handles->reset();
-      return true;
-    }
-
-    handles->reset(new PlatformHandleVector(num_handles));
-    const MachPortsEntry* mach_ports = mach_ports_header->entries;
-    for (size_t i = 0, mach_port_index = 0; i < num_handles; ++i) {
-      if (mach_port_index < num_mach_ports &&
-          mach_ports[mach_port_index].index == i) {
-        (*handles)->at(i) = PlatformHandle(
-            static_cast<mach_port_t>(mach_ports[mach_port_index].mach_port));
-        CHECK((*handles)->at(i).type == PlatformHandle::Type::MACH);
-        // These are actually just Mach port names until they're resolved from
-        // the remote process.
-        (*handles)->at(i).type = PlatformHandle::Type::MACH_NAME;
-        mach_port_index++;
-      } else {
-        CHECK(!incoming_platform_handles_.empty());
-        (*handles)->at(i) = incoming_platform_handles_.front();
-        incoming_platform_handles_.pop_front();
-      }
-    }
-#else
-    if (incoming_platform_handles_.size() < num_handles) {
-      handles->reset();
-      return true;
-    }
-
-    handles->reset(new PlatformHandleVector(num_handles));
-    for (size_t i = 0; i < num_handles; ++i) {
-      (*handles)->at(i) = incoming_platform_handles_.front();
-      incoming_platform_handles_.pop_front();
-    }
-#endif
-
-    return true;
-  }
-
- private:
-  ~ChannelPosix() override {
-    DCHECK(!read_watcher_);
-    DCHECK(!write_watcher_);
-    for (auto handle : incoming_platform_handles_)
-      handle.CloseIfNecessary();
-  }
-
-  void StartOnIOThread() {
-    DCHECK(!read_watcher_);
-    DCHECK(!write_watcher_);
-    read_watcher_.reset(
-        new base::MessageLoopForIO::FileDescriptorWatcher(FROM_HERE));
-    base::MessageLoop::current()->AddDestructionObserver(this);
-    if (handle_.get().needs_connection) {
-      base::MessageLoopForIO::current()->WatchFileDescriptor(
-          handle_.get().handle, false /* persistent */,
-          base::MessageLoopForIO::WATCH_READ, read_watcher_.get(), this);
-    } else {
-      write_watcher_.reset(
-          new base::MessageLoopForIO::FileDescriptorWatcher(FROM_HERE));
-      base::MessageLoopForIO::current()->WatchFileDescriptor(
-          handle_.get().handle, true /* persistent */,
-          base::MessageLoopForIO::WATCH_READ, read_watcher_.get(), this);
-      base::AutoLock lock(write_lock_);
-      FlushOutgoingMessagesNoLock();
-    }
-  }
-
-  void WaitForWriteOnIOThread() {
-    base::AutoLock lock(write_lock_);
-    WaitForWriteOnIOThreadNoLock();
-  }
-
-  void WaitForWriteOnIOThreadNoLock() {
-    if (pending_write_)
-      return;
-    if (!write_watcher_)
-      return;
-    if (io_task_runner_->RunsTasksOnCurrentThread()) {
-      pending_write_ = true;
-      base::MessageLoopForIO::current()->WatchFileDescriptor(
-          handle_.get().handle, false /* persistent */,
-          base::MessageLoopForIO::WATCH_WRITE, write_watcher_.get(), this);
-    } else {
-      io_task_runner_->PostTask(
-          FROM_HERE, base::Bind(&ChannelPosix::WaitForWriteOnIOThread, this));
-    }
-  }
-
-  void ShutDownOnIOThread() {
-    base::MessageLoop::current()->RemoveDestructionObserver(this);
-
-    read_watcher_.reset();
-    write_watcher_.reset();
-    if (leak_handle_)
-      ignore_result(handle_.release());
-    handle_.reset();
-#if defined(OS_MACOSX)
-    handles_to_close_.reset();
-#endif
-
-    // May destroy the |this| if it was the last reference.
-    self_ = nullptr;
-  }
-
-  // base::MessageLoop::DestructionObserver:
-  void WillDestroyCurrentMessageLoop() override {
-    DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
-    if (self_)
-      ShutDownOnIOThread();
-  }
-
-  // base::MessageLoopForIO::Watcher:
-  void OnFileCanReadWithoutBlocking(int fd) override {
-    CHECK_EQ(fd, handle_.get().handle);
-    if (handle_.get().needs_connection) {
-#if !defined(OS_NACL)
-      read_watcher_.reset();
-      base::MessageLoop::current()->RemoveDestructionObserver(this);
-
-      ScopedPlatformHandle accept_fd;
-      ServerAcceptConnection(handle_.get(), &accept_fd);
-      if (!accept_fd.is_valid()) {
-        OnError();
-        return;
-      }
-      handle_ = std::move(accept_fd);
-      StartOnIOThread();
-#else
-      NOTREACHED();
-#endif
-      return;
-    }
-
-    bool read_error = false;
-    size_t next_read_size = 0;
-    size_t buffer_capacity = 0;
-    size_t total_bytes_read = 0;
-    size_t bytes_read = 0;
-    do {
-      buffer_capacity = next_read_size;
-      char* buffer = GetReadBuffer(&buffer_capacity);
-      DCHECK_GT(buffer_capacity, 0u);
-
-      ssize_t read_result = PlatformChannelRecvmsg(
-          handle_.get(),
-          buffer,
-          buffer_capacity,
-          &incoming_platform_handles_);
-
-      if (read_result > 0) {
-        bytes_read = static_cast<size_t>(read_result);
-        total_bytes_read += bytes_read;
-        if (!OnReadComplete(bytes_read, &next_read_size)) {
-          read_error = true;
-          break;
-        }
-      } else if (read_result == 0 ||
-                 (errno != EAGAIN && errno != EWOULDBLOCK)) {
-        read_error = true;
-        break;
-      }
-    } while (bytes_read == buffer_capacity &&
-             total_bytes_read < kMaxBatchReadCapacity &&
-             next_read_size > 0);
-    if (read_error) {
-      // Stop receiving read notifications.
-      read_watcher_.reset();
-
-      OnError();
-    }
-  }
-
-  void OnFileCanWriteWithoutBlocking(int fd) override {
-    bool write_error = false;
-    {
-      base::AutoLock lock(write_lock_);
-      pending_write_ = false;
-      if (!FlushOutgoingMessagesNoLock())
-        reject_writes_ = write_error = true;
-    }
-    if (write_error)
-      OnError();
-  }
-
-  // Attempts to write a message directly to the channel. If the full message
-  // cannot be written, it's queued and a wait is initiated to write the message
-  // ASAP on the I/O thread.
-  bool WriteNoLock(MessageView message_view) {
-    if (handle_.get().needs_connection) {
-      outgoing_messages_.emplace_front(std::move(message_view));
-      return true;
-    }
-    size_t bytes_written = 0;
-    do {
-      message_view.advance_data_offset(bytes_written);
-
-      ssize_t result;
-      ScopedPlatformHandleVectorPtr handles = message_view.TakeHandles();
-      if (handles && handles->size()) {
-        iovec iov = {
-          const_cast<void*>(message_view.data()),
-          message_view.data_num_bytes()
-        };
-        // TODO: Handle lots of handles.
-        result = PlatformChannelSendmsgWithHandles(
-            handle_.get(), &iov, 1, handles->data(), handles->size());
-        if (result >= 0) {
-#if defined(OS_MACOSX)
-          // There is a bug on OSX which makes it dangerous to close
-          // a file descriptor while it is in transit. So instead we
-          // store the file descriptor in a set and send a message to
-          // the recipient, which is queued AFTER the message that
-          // sent the FD. The recipient will reply to the message,
-          // letting us know that it is now safe to close the file
-          // descriptor. For more information, see:
-          // http://crbug.com/298276
-          std::vector<int> fds;
-          for (auto& handle : *handles)
-            fds.push_back(handle.handle);
-          {
-            base::AutoLock l(handles_to_close_lock_);
-            for (auto& handle : *handles)
-              handles_to_close_->push_back(handle);
-          }
-          MessagePtr fds_message(
-              new Channel::Message(sizeof(fds[0]) * fds.size(), 0,
-                                   Message::MessageType::HANDLES_SENT));
-          memcpy(fds_message->mutable_payload(), fds.data(),
-                 sizeof(fds[0]) * fds.size());
-          outgoing_messages_.emplace_back(std::move(fds_message), 0);
-          handles->clear();
-#else
-          handles.reset();
-#endif  // defined(OS_MACOSX)
-        }
-      } else {
-        result = PlatformChannelWrite(handle_.get(), message_view.data(),
-                                      message_view.data_num_bytes());
-      }
-
-      if (result < 0) {
-        if (errno != EAGAIN && errno != EWOULDBLOCK
-#if defined(OS_MACOSX)
-            // On OS X if sendmsg() is trying to send fds between processes and
-            // there isn't enough room in the output buffer to send the fd
-            // structure over atomically then EMSGSIZE is returned.
-            //
-            // EMSGSIZE presents a problem since the system APIs can only call
-            // us when there's room in the socket buffer and not when there is
-            // "enough" room.
-            //
-            // The current behavior is to return to the event loop when EMSGSIZE
-            // is received and hopefull service another FD.  This is however
-            // still technically a busy wait since the event loop will call us
-            // right back until the receiver has read enough data to allow
-            // passing the FD over atomically.
-            && errno != EMSGSIZE
-#endif
-            ) {
-          return false;
-        }
-        message_view.SetHandles(std::move(handles));
-        outgoing_messages_.emplace_front(std::move(message_view));
-        WaitForWriteOnIOThreadNoLock();
-        return true;
-      }
-
-      bytes_written = static_cast<size_t>(result);
-    } while (bytes_written < message_view.data_num_bytes());
-
-    return FlushOutgoingMessagesNoLock();
-  }
-
-  bool FlushOutgoingMessagesNoLock() {
-    std::deque<MessageView> messages;
-    std::swap(outgoing_messages_, messages);
-
-    while (!messages.empty()) {
-      if (!WriteNoLock(std::move(messages.front())))
-        return false;
-
-      messages.pop_front();
-      if (!outgoing_messages_.empty()) {
-        // The message was requeued by WriteNoLock(), so we have to wait for
-        // pipe to become writable again. Repopulate the message queue and exit.
-        // If sending the message triggered any control messages, they may be
-        // in |outgoing_messages_| in addition to or instead of the message
-        // being sent.
-        std::swap(messages, outgoing_messages_);
-        while (!messages.empty()) {
-          outgoing_messages_.push_front(std::move(messages.back()));
-          messages.pop_back();
-        }
-        return true;
-      }
-    }
-
-    return true;
-  }
-
-#if defined(OS_MACOSX)
-  bool OnControlMessage(Message::MessageType message_type,
-                        const void* payload,
-                        size_t payload_size,
-                        ScopedPlatformHandleVectorPtr handles) override {
-    switch (message_type) {
-      case Message::MessageType::HANDLES_SENT: {
-        if (payload_size == 0)
-          break;
-        MessagePtr message(new Channel::Message(
-            payload_size, 0, Message::MessageType::HANDLES_SENT_ACK));
-        memcpy(message->mutable_payload(), payload, payload_size);
-        Write(std::move(message));
-        return true;
-      }
-
-      case Message::MessageType::HANDLES_SENT_ACK: {
-        size_t num_fds = payload_size / sizeof(int);
-        if (num_fds == 0 || payload_size % sizeof(int) != 0)
-          break;
-
-        const int* fds = reinterpret_cast<const int*>(payload);
-        if (!CloseHandles(fds, num_fds))
-          break;
-        return true;
-      }
-
-      default:
-        break;
-    }
-
-    return false;
-  }
-
-  // Closes handles referenced by |fds|. Returns false if |num_fds| is 0, or if
-  // |fds| does not match a sequence of handles in |handles_to_close_|.
-  bool CloseHandles(const int* fds, size_t num_fds) {
-    base::AutoLock l(handles_to_close_lock_);
-    if (!num_fds)
-      return false;
-
-    auto start =
-        std::find_if(handles_to_close_->begin(), handles_to_close_->end(),
-                     [&fds](const PlatformHandle& handle) {
-                       return handle.handle == fds[0];
-                     });
-    if (start == handles_to_close_->end())
-      return false;
-
-    auto it = start;
-    size_t i = 0;
-    // The FDs in the message should match a sequence of handles in
-    // |handles_to_close_|.
-    for (; i < num_fds && it != handles_to_close_->end(); i++, ++it) {
-      if (it->handle != fds[i])
-        return false;
-
-      it->CloseIfNecessary();
-    }
-    if (i != num_fds)
-      return false;
-
-    handles_to_close_->erase(start, it);
-    return true;
-  }
-#endif  // defined(OS_MACOSX)
-
-  // Keeps the Channel alive at least until explicit shutdown on the IO thread.
-  scoped_refptr<Channel> self_;
-
-  ScopedPlatformHandle handle_;
-  scoped_refptr<base::TaskRunner> io_task_runner_;
-
-  // These watchers must only be accessed on the IO thread.
-  std::unique_ptr<base::MessageLoopForIO::FileDescriptorWatcher> read_watcher_;
-  std::unique_ptr<base::MessageLoopForIO::FileDescriptorWatcher> write_watcher_;
-
-  std::deque<PlatformHandle> incoming_platform_handles_;
-
-  // Protects |pending_write_| and |outgoing_messages_|.
-  base::Lock write_lock_;
-  bool pending_write_ = false;
-  bool reject_writes_ = false;
-  std::deque<MessageView> outgoing_messages_;
-
-  bool leak_handle_ = false;
-
-#if defined(OS_MACOSX)
-  base::Lock handles_to_close_lock_;
-  ScopedPlatformHandleVectorPtr handles_to_close_;
-#endif
-
-  DISALLOW_COPY_AND_ASSIGN(ChannelPosix);
-};
-
-}  // namespace
-
-// static
-scoped_refptr<Channel> Channel::Create(
-    Delegate* delegate,
-    ConnectionParams connection_params,
-    scoped_refptr<base::TaskRunner> io_task_runner) {
-  return new ChannelPosix(delegate, std::move(connection_params),
-                          io_task_runner);
-}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/channel_unittest.cc b/mojo/edk/system/channel_unittest.cc
deleted file mode 100644
index ce2c804..0000000
--- a/mojo/edk/system/channel_unittest.cc
+++ /dev/null
@@ -1,177 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/system/channel.h"
-#include "base/memory/ptr_util.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace edk {
-namespace {
-
-class TestChannel : public Channel {
- public:
-  TestChannel(Channel::Delegate* delegate) : Channel(delegate) {}
-
-  char* GetReadBufferTest(size_t* buffer_capacity) {
-    return GetReadBuffer(buffer_capacity);
-  }
-
-  bool OnReadCompleteTest(size_t bytes_read, size_t* next_read_size_hint) {
-    return OnReadComplete(bytes_read, next_read_size_hint);
-  }
-
-  MOCK_METHOD4(GetReadPlatformHandles,
-               bool(size_t num_handles,
-                    const void* extra_header,
-                    size_t extra_header_size,
-                    ScopedPlatformHandleVectorPtr* handles));
-  MOCK_METHOD0(Start, void());
-  MOCK_METHOD0(ShutDownImpl, void());
-  MOCK_METHOD0(LeakHandle, void());
-
-  void Write(MessagePtr message) {}
-
- protected:
-  ~TestChannel() override {}
-};
-
-// Not using GMock as I don't think it supports movable types.
-class MockChannelDelegate : public Channel::Delegate {
- public:
-  MockChannelDelegate() {}
-
-  size_t GetReceivedPayloadSize() const { return payload_size_; }
-
-  const void* GetReceivedPayload() const { return payload_.get(); }
-
- protected:
-  void OnChannelMessage(const void* payload,
-                        size_t payload_size,
-                        ScopedPlatformHandleVectorPtr handles) override {
-    payload_.reset(new char[payload_size]);
-    memcpy(payload_.get(), payload, payload_size);
-    payload_size_ = payload_size;
-  }
-
-  // Notify that an error has occured and the Channel will cease operation.
-  void OnChannelError() override {}
-
- private:
-  size_t payload_size_ = 0;
-  std::unique_ptr<char[]> payload_;
-};
-
-Channel::MessagePtr CreateDefaultMessage(bool legacy_message) {
-  const size_t payload_size = 100;
-  Channel::MessagePtr message = base::MakeUnique<Channel::Message>(
-      payload_size, 0,
-      legacy_message ? Channel::Message::MessageType::NORMAL_LEGACY
-                     : Channel::Message::MessageType::NORMAL);
-  char* payload = static_cast<char*>(message->mutable_payload());
-  for (size_t i = 0; i < payload_size; i++) {
-    payload[i] = static_cast<char>(i);
-  }
-  return message;
-}
-
-void TestMemoryEqual(const void* data1,
-                     size_t data1_size,
-                     const void* data2,
-                     size_t data2_size) {
-  ASSERT_EQ(data1_size, data2_size);
-  const unsigned char* data1_char = static_cast<const unsigned char*>(data1);
-  const unsigned char* data2_char = static_cast<const unsigned char*>(data2);
-  for (size_t i = 0; i < data1_size; i++) {
-    // ASSERT so we don't log tons of errors if the data is different.
-    ASSERT_EQ(data1_char[i], data2_char[i]);
-  }
-}
-
-void TestMessagesAreEqual(Channel::Message* message1,
-                          Channel::Message* message2,
-                          bool legacy_messages) {
-  // If any of the message is null, this is probably not what you wanted to
-  // test.
-  ASSERT_NE(nullptr, message1);
-  ASSERT_NE(nullptr, message2);
-
-  ASSERT_EQ(message1->payload_size(), message2->payload_size());
-  EXPECT_EQ(message1->has_handles(), message2->has_handles());
-
-  TestMemoryEqual(message1->payload(), message1->payload_size(),
-                  message2->payload(), message2->payload_size());
-
-  if (legacy_messages)
-    return;
-
-  ASSERT_EQ(message1->extra_header_size(), message2->extra_header_size());
-  TestMemoryEqual(message1->extra_header(), message1->extra_header_size(),
-                  message2->extra_header(), message2->extra_header_size());
-}
-
-TEST(ChannelTest, LegacyMessageDeserialization) {
-  Channel::MessagePtr message = CreateDefaultMessage(true /* legacy_message */);
-  Channel::MessagePtr deserialized_message =
-      Channel::Message::Deserialize(message->data(), message->data_num_bytes());
-  TestMessagesAreEqual(message.get(), deserialized_message.get(),
-                       true /* legacy_message */);
-}
-
-TEST(ChannelTest, NonLegacyMessageDeserialization) {
-  Channel::MessagePtr message =
-      CreateDefaultMessage(false /* legacy_message */);
-  Channel::MessagePtr deserialized_message =
-      Channel::Message::Deserialize(message->data(), message->data_num_bytes());
-  TestMessagesAreEqual(message.get(), deserialized_message.get(),
-                       false /* legacy_message */);
-}
-
-TEST(ChannelTest, OnReadLegacyMessage) {
-  size_t buffer_size = 100 * 1024;
-  Channel::MessagePtr message = CreateDefaultMessage(true /* legacy_message */);
-
-  MockChannelDelegate channel_delegate;
-  scoped_refptr<TestChannel> channel = new TestChannel(&channel_delegate);
-  char* read_buffer = channel->GetReadBufferTest(&buffer_size);
-  ASSERT_LT(message->data_num_bytes(),
-            buffer_size);  // Bad test. Increase buffer
-                           // size.
-  memcpy(read_buffer, message->data(), message->data_num_bytes());
-
-  size_t next_read_size_hint = 0;
-  EXPECT_TRUE(channel->OnReadCompleteTest(message->data_num_bytes(),
-                                          &next_read_size_hint));
-
-  TestMemoryEqual(message->payload(), message->payload_size(),
-                  channel_delegate.GetReceivedPayload(),
-                  channel_delegate.GetReceivedPayloadSize());
-}
-
-TEST(ChannelTest, OnReadNonLegacyMessage) {
-  size_t buffer_size = 100 * 1024;
-  Channel::MessagePtr message =
-      CreateDefaultMessage(false /* legacy_message */);
-
-  MockChannelDelegate channel_delegate;
-  scoped_refptr<TestChannel> channel = new TestChannel(&channel_delegate);
-  char* read_buffer = channel->GetReadBufferTest(&buffer_size);
-  ASSERT_LT(message->data_num_bytes(),
-            buffer_size);  // Bad test. Increase buffer
-                           // size.
-  memcpy(read_buffer, message->data(), message->data_num_bytes());
-
-  size_t next_read_size_hint = 0;
-  EXPECT_TRUE(channel->OnReadCompleteTest(message->data_num_bytes(),
-                                          &next_read_size_hint));
-
-  TestMemoryEqual(message->payload(), message->payload_size(),
-                  channel_delegate.GetReceivedPayload(),
-                  channel_delegate.GetReceivedPayloadSize());
-}
-
-}  // namespace
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/channel_win.cc b/mojo/edk/system/channel_win.cc
deleted file mode 100644
index c15df16..0000000
--- a/mojo/edk/system/channel_win.cc
+++ /dev/null
@@ -1,360 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/system/channel.h"
-
-#include <stdint.h>
-#include <windows.h>
-
-#include <algorithm>
-#include <deque>
-#include <limits>
-#include <memory>
-
-#include "base/bind.h"
-#include "base/location.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/message_loop/message_loop.h"
-#include "base/synchronization/lock.h"
-#include "base/task_runner.h"
-#include "base/win/win_util.h"
-#include "mojo/edk/embedder/platform_handle_vector.h"
-
-namespace mojo {
-namespace edk {
-
-namespace {
-
-// A view over a Channel::Message object. The write queue uses these since
-// large messages may need to be sent in chunks.
-class MessageView {
- public:
-  // Owns |message|. |offset| indexes the first unsent byte in the message.
-  MessageView(Channel::MessagePtr message, size_t offset)
-      : message_(std::move(message)),
-        offset_(offset) {
-    DCHECK_GT(message_->data_num_bytes(), offset_);
-  }
-
-  MessageView(MessageView&& other) { *this = std::move(other); }
-
-  MessageView& operator=(MessageView&& other) {
-    message_ = std::move(other.message_);
-    offset_ = other.offset_;
-    return *this;
-  }
-
-  ~MessageView() {}
-
-  const void* data() const {
-    return static_cast<const char*>(message_->data()) + offset_;
-  }
-
-  size_t data_num_bytes() const { return message_->data_num_bytes() - offset_; }
-
-  size_t data_offset() const { return offset_; }
-  void advance_data_offset(size_t num_bytes) {
-    DCHECK_GE(message_->data_num_bytes(), offset_ + num_bytes);
-    offset_ += num_bytes;
-  }
-
-  Channel::MessagePtr TakeChannelMessage() { return std::move(message_); }
-
- private:
-  Channel::MessagePtr message_;
-  size_t offset_;
-
-  DISALLOW_COPY_AND_ASSIGN(MessageView);
-};
-
-class ChannelWin : public Channel,
-                   public base::MessageLoop::DestructionObserver,
-                   public base::MessageLoopForIO::IOHandler {
- public:
-  ChannelWin(Delegate* delegate,
-             ScopedPlatformHandle handle,
-             scoped_refptr<base::TaskRunner> io_task_runner)
-      : Channel(delegate),
-        self_(this),
-        handle_(std::move(handle)),
-        io_task_runner_(io_task_runner) {
-    CHECK(handle_.is_valid());
-
-    wait_for_connect_ = handle_.get().needs_connection;
-  }
-
-  void Start() override {
-    io_task_runner_->PostTask(
-        FROM_HERE, base::Bind(&ChannelWin::StartOnIOThread, this));
-  }
-
-  void ShutDownImpl() override {
-    // Always shut down asynchronously when called through the public interface.
-    io_task_runner_->PostTask(
-        FROM_HERE, base::Bind(&ChannelWin::ShutDownOnIOThread, this));
-  }
-
-  void Write(MessagePtr message) override {
-    bool write_error = false;
-    {
-      base::AutoLock lock(write_lock_);
-      if (reject_writes_)
-        return;
-
-      bool write_now = !delay_writes_ && outgoing_messages_.empty();
-      outgoing_messages_.emplace_back(std::move(message), 0);
-
-      if (write_now && !WriteNoLock(outgoing_messages_.front()))
-        reject_writes_ = write_error = true;
-    }
-    if (write_error) {
-      // Do not synchronously invoke OnError(). Write() may have been called by
-      // the delegate and we don't want to re-enter it.
-      io_task_runner_->PostTask(FROM_HERE,
-                                base::Bind(&ChannelWin::OnError, this));
-    }
-  }
-
-  void LeakHandle() override {
-    DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
-    leak_handle_ = true;
-  }
-
-  bool GetReadPlatformHandles(
-      size_t num_handles,
-      const void* extra_header,
-      size_t extra_header_size,
-      ScopedPlatformHandleVectorPtr* handles) override {
-    if (num_handles > std::numeric_limits<uint16_t>::max())
-      return false;
-    using HandleEntry = Channel::Message::HandleEntry;
-    size_t handles_size = sizeof(HandleEntry) * num_handles;
-    if (handles_size > extra_header_size)
-      return false;
-    DCHECK(extra_header);
-    handles->reset(new PlatformHandleVector(num_handles));
-    const HandleEntry* extra_header_handles =
-        reinterpret_cast<const HandleEntry*>(extra_header);
-    for (size_t i = 0; i < num_handles; i++) {
-      (*handles)->at(i).handle =
-          base::win::Uint32ToHandle(extra_header_handles[i].handle);
-    }
-    return true;
-  }
-
- private:
-  // May run on any thread.
-  ~ChannelWin() override {}
-
-  void StartOnIOThread() {
-    base::MessageLoop::current()->AddDestructionObserver(this);
-    base::MessageLoopForIO::current()->RegisterIOHandler(
-        handle_.get().handle, this);
-
-    if (wait_for_connect_) {
-      BOOL ok = ConnectNamedPipe(handle_.get().handle,
-                                 &connect_context_.overlapped);
-      if (ok) {
-        PLOG(ERROR) << "Unexpected success while waiting for pipe connection";
-        OnError();
-        return;
-      }
-
-      const DWORD err = GetLastError();
-      switch (err) {
-        case ERROR_PIPE_CONNECTED:
-          wait_for_connect_ = false;
-          break;
-        case ERROR_IO_PENDING:
-          AddRef();
-          return;
-        case ERROR_NO_DATA:
-          OnError();
-          return;
-      }
-    }
-
-    // Now that we have registered our IOHandler, we can start writing.
-    {
-      base::AutoLock lock(write_lock_);
-      if (delay_writes_) {
-        delay_writes_ = false;
-        WriteNextNoLock();
-      }
-    }
-
-    // Keep this alive in case we synchronously run shutdown.
-    scoped_refptr<ChannelWin> keep_alive(this);
-    ReadMore(0);
-  }
-
-  void ShutDownOnIOThread() {
-    base::MessageLoop::current()->RemoveDestructionObserver(this);
-
-    // BUG(crbug.com/583525): This function is expected to be called once, and
-    // |handle_| should be valid at this point.
-    CHECK(handle_.is_valid());
-    CancelIo(handle_.get().handle);
-    if (leak_handle_)
-      ignore_result(handle_.release());
-    handle_.reset();
-
-    // May destroy the |this| if it was the last reference.
-    self_ = nullptr;
-  }
-
-  // base::MessageLoop::DestructionObserver:
-  void WillDestroyCurrentMessageLoop() override {
-    DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
-    if (self_)
-      ShutDownOnIOThread();
-  }
-
-  // base::MessageLoop::IOHandler:
-  void OnIOCompleted(base::MessageLoopForIO::IOContext* context,
-                     DWORD bytes_transfered,
-                     DWORD error) override {
-    if (error != ERROR_SUCCESS) {
-      OnError();
-    } else if (context == &connect_context_) {
-      DCHECK(wait_for_connect_);
-      wait_for_connect_ = false;
-      ReadMore(0);
-
-      base::AutoLock lock(write_lock_);
-      if (delay_writes_) {
-        delay_writes_ = false;
-        WriteNextNoLock();
-      }
-    } else if (context == &read_context_) {
-      OnReadDone(static_cast<size_t>(bytes_transfered));
-    } else {
-      CHECK(context == &write_context_);
-      OnWriteDone(static_cast<size_t>(bytes_transfered));
-    }
-    Release();  // Balancing reference taken after ReadFile / WriteFile.
-  }
-
-  void OnReadDone(size_t bytes_read) {
-    if (bytes_read > 0) {
-      size_t next_read_size = 0;
-      if (OnReadComplete(bytes_read, &next_read_size)) {
-        ReadMore(next_read_size);
-      } else {
-        OnError();
-      }
-    } else if (bytes_read == 0) {
-      OnError();
-    }
-  }
-
-  void OnWriteDone(size_t bytes_written) {
-    if (bytes_written == 0)
-      return;
-
-    bool write_error = false;
-    {
-      base::AutoLock lock(write_lock_);
-
-      DCHECK(!outgoing_messages_.empty());
-
-      MessageView& message_view = outgoing_messages_.front();
-      message_view.advance_data_offset(bytes_written);
-      if (message_view.data_num_bytes() == 0) {
-        Channel::MessagePtr message = message_view.TakeChannelMessage();
-        outgoing_messages_.pop_front();
-
-        // Clear any handles so they don't get closed on destruction.
-        ScopedPlatformHandleVectorPtr handles = message->TakeHandles();
-        if (handles)
-          handles->clear();
-      }
-
-      if (!WriteNextNoLock())
-        reject_writes_ = write_error = true;
-    }
-    if (write_error)
-      OnError();
-  }
-
-  void ReadMore(size_t next_read_size_hint) {
-    size_t buffer_capacity = next_read_size_hint;
-    char* buffer = GetReadBuffer(&buffer_capacity);
-    DCHECK_GT(buffer_capacity, 0u);
-
-    BOOL ok = ReadFile(handle_.get().handle,
-                       buffer,
-                       static_cast<DWORD>(buffer_capacity),
-                       NULL,
-                       &read_context_.overlapped);
-
-    if (ok || GetLastError() == ERROR_IO_PENDING) {
-      AddRef();  // Will be balanced in OnIOCompleted
-    } else {
-      OnError();
-    }
-  }
-
-  // Attempts to write a message directly to the channel. If the full message
-  // cannot be written, it's queued and a wait is initiated to write the message
-  // ASAP on the I/O thread.
-  bool WriteNoLock(const MessageView& message_view) {
-    BOOL ok = WriteFile(handle_.get().handle,
-                        message_view.data(),
-                        static_cast<DWORD>(message_view.data_num_bytes()),
-                        NULL,
-                        &write_context_.overlapped);
-
-    if (ok || GetLastError() == ERROR_IO_PENDING) {
-      AddRef();  // Will be balanced in OnIOCompleted.
-      return true;
-    }
-    return false;
-  }
-
-  bool WriteNextNoLock() {
-    if (outgoing_messages_.empty())
-      return true;
-    return WriteNoLock(outgoing_messages_.front());
-  }
-
-  // Keeps the Channel alive at least until explicit shutdown on the IO thread.
-  scoped_refptr<Channel> self_;
-
-  ScopedPlatformHandle handle_;
-  scoped_refptr<base::TaskRunner> io_task_runner_;
-
-  base::MessageLoopForIO::IOContext connect_context_;
-  base::MessageLoopForIO::IOContext read_context_;
-  base::MessageLoopForIO::IOContext write_context_;
-
-  // Protects |reject_writes_| and |outgoing_messages_|.
-  base::Lock write_lock_;
-
-  bool delay_writes_ = true;
-
-  bool reject_writes_ = false;
-  std::deque<MessageView> outgoing_messages_;
-
-  bool wait_for_connect_;
-
-  bool leak_handle_ = false;
-
-  DISALLOW_COPY_AND_ASSIGN(ChannelWin);
-};
-
-}  // namespace
-
-// static
-scoped_refptr<Channel> Channel::Create(
-    Delegate* delegate,
-    ConnectionParams connection_params,
-    scoped_refptr<base::TaskRunner> io_task_runner) {
-  return new ChannelWin(delegate, connection_params.TakeChannelHandle(),
-                        io_task_runner);
-}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/configuration.cc b/mojo/edk/system/configuration.cc
deleted file mode 100644
index f5eb2b8..0000000
--- a/mojo/edk/system/configuration.cc
+++ /dev/null
@@ -1,25 +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 "mojo/edk/system/configuration.h"
-
-namespace mojo {
-namespace edk {
-namespace internal {
-
-// These default values should be synced with the documentation in
-// mojo/edk/embedder/configuration.h.
-Configuration g_configuration = {
-    1000000,              // max_handle_table_size
-    1000000,              // max_mapping_table_sze
-    4 * 1024 * 1024,      // max_message_num_bytes
-    10000,                // max_message_num_handles
-    256 * 1024 * 1024,    // max_data_pipe_capacity_bytes
-    1024 * 1024,          // default_data_pipe_capacity_bytes
-    16,                   // data_pipe_buffer_alignment_bytes
-    1024 * 1024 * 1024};  // max_shared_memory_num_bytes
-
-}  // namespace internal
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/configuration.h b/mojo/edk/system/configuration.h
deleted file mode 100644
index 038835f..0000000
--- a/mojo/edk/system/configuration.h
+++ /dev/null
@@ -1,29 +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 MOJO_EDK_SYSTEM_CONFIGURATION_H_
-#define MOJO_EDK_SYSTEM_CONFIGURATION_H_
-
-#include "mojo/edk/embedder/configuration.h"
-#include "mojo/edk/system/system_impl_export.h"
-
-namespace mojo {
-namespace edk {
-
-namespace internal {
-MOJO_SYSTEM_IMPL_EXPORT extern Configuration g_configuration;
-}  // namespace internal
-
-MOJO_SYSTEM_IMPL_EXPORT inline const Configuration& GetConfiguration() {
-  return internal::g_configuration;
-}
-
-MOJO_SYSTEM_IMPL_EXPORT inline Configuration* GetMutableConfiguration() {
-  return &internal::g_configuration;
-}
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_CONFIGURATION_H_
diff --git a/mojo/edk/system/core.cc b/mojo/edk/system/core.cc
deleted file mode 100644
index 360e8c3..0000000
--- a/mojo/edk/system/core.cc
+++ /dev/null
@@ -1,1019 +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 "mojo/edk/system/core.h"
-
-#include <string.h>
-
-#include <utility>
-
-#include "base/bind.h"
-#include "base/containers/stack_container.h"
-#include "base/location.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "base/message_loop/message_loop.h"
-#include "base/rand_util.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "base/time/time.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/embedder/embedder_internal.h"
-#include "mojo/edk/embedder/platform_shared_buffer.h"
-#include "mojo/edk/system/channel.h"
-#include "mojo/edk/system/configuration.h"
-#include "mojo/edk/system/data_pipe_consumer_dispatcher.h"
-#include "mojo/edk/system/data_pipe_producer_dispatcher.h"
-#include "mojo/edk/system/handle_signals_state.h"
-#include "mojo/edk/system/message_for_transit.h"
-#include "mojo/edk/system/message_pipe_dispatcher.h"
-#include "mojo/edk/system/platform_handle_dispatcher.h"
-#include "mojo/edk/system/ports/name.h"
-#include "mojo/edk/system/ports/node.h"
-#include "mojo/edk/system/request_context.h"
-#include "mojo/edk/system/shared_buffer_dispatcher.h"
-#include "mojo/edk/system/watcher_dispatcher.h"
-
-namespace mojo {
-namespace edk {
-
-namespace {
-
-// This is an unnecessarily large limit that is relatively easy to enforce.
-const uint32_t kMaxHandlesPerMessage = 1024 * 1024;
-
-// TODO(rockot): Maybe we could negotiate a debugging pipe ID for cross-process
-// pipes too; for now we just use a constant. This only affects bootstrap pipes.
-const uint64_t kUnknownPipeIdForDebug = 0x7f7f7f7f7f7f7f7fUL;
-
-MojoResult MojoPlatformHandleToScopedPlatformHandle(
-    const MojoPlatformHandle* platform_handle,
-    ScopedPlatformHandle* out_handle) {
-  if (platform_handle->struct_size != sizeof(MojoPlatformHandle))
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  if (platform_handle->type == MOJO_PLATFORM_HANDLE_TYPE_INVALID) {
-    out_handle->reset();
-    return MOJO_RESULT_OK;
-  }
-
-  PlatformHandle handle;
-  switch (platform_handle->type) {
-#if defined(OS_POSIX)
-    case MOJO_PLATFORM_HANDLE_TYPE_FILE_DESCRIPTOR:
-      handle.handle = static_cast<int>(platform_handle->value);
-      break;
-#endif
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-    case MOJO_PLATFORM_HANDLE_TYPE_MACH_PORT:
-      handle.type = PlatformHandle::Type::MACH;
-      handle.port = static_cast<mach_port_t>(platform_handle->value);
-      break;
-#endif
-
-#if defined(OS_WIN)
-    case MOJO_PLATFORM_HANDLE_TYPE_WINDOWS_HANDLE:
-      handle.handle = reinterpret_cast<HANDLE>(platform_handle->value);
-      break;
-#endif
-
-    default:
-      return MOJO_RESULT_INVALID_ARGUMENT;
-  }
-
-  out_handle->reset(handle);
-  return MOJO_RESULT_OK;
-}
-
-MojoResult ScopedPlatformHandleToMojoPlatformHandle(
-    ScopedPlatformHandle handle,
-    MojoPlatformHandle* platform_handle) {
-  if (platform_handle->struct_size != sizeof(MojoPlatformHandle))
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  if (!handle.is_valid()) {
-    platform_handle->type = MOJO_PLATFORM_HANDLE_TYPE_INVALID;
-    return MOJO_RESULT_OK;
-  }
-
-#if defined(OS_POSIX)
-  switch (handle.get().type) {
-    case PlatformHandle::Type::POSIX:
-      platform_handle->type = MOJO_PLATFORM_HANDLE_TYPE_FILE_DESCRIPTOR;
-      platform_handle->value = static_cast<uint64_t>(handle.release().handle);
-      break;
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-    case PlatformHandle::Type::MACH:
-      platform_handle->type = MOJO_PLATFORM_HANDLE_TYPE_MACH_PORT;
-      platform_handle->value = static_cast<uint64_t>(handle.release().port);
-      break;
-#endif  // defined(OS_MACOSX) && !defined(OS_IOS)
-
-    default:
-      return MOJO_RESULT_INVALID_ARGUMENT;
-  }
-#elif defined(OS_WIN)
-  platform_handle->type = MOJO_PLATFORM_HANDLE_TYPE_WINDOWS_HANDLE;
-  platform_handle->value = reinterpret_cast<uint64_t>(handle.release().handle);
-#endif  // defined(OS_WIN)
-
-  return MOJO_RESULT_OK;
-}
-
-}  // namespace
-
-Core::Core() {}
-
-Core::~Core() {
-  if (node_controller_ && node_controller_->io_task_runner()) {
-    // If this races with IO thread shutdown the callback will be dropped and
-    // the NodeController will be shutdown on this thread anyway, which is also
-    // just fine.
-    scoped_refptr<base::TaskRunner> io_task_runner =
-        node_controller_->io_task_runner();
-    io_task_runner->PostTask(FROM_HERE,
-                             base::Bind(&Core::PassNodeControllerToIOThread,
-                                        base::Passed(&node_controller_)));
-  }
-}
-
-void Core::SetIOTaskRunner(scoped_refptr<base::TaskRunner> io_task_runner) {
-  GetNodeController()->SetIOTaskRunner(io_task_runner);
-}
-
-NodeController* Core::GetNodeController() {
-  base::AutoLock lock(node_controller_lock_);
-  if (!node_controller_)
-    node_controller_.reset(new NodeController(this));
-  return node_controller_.get();
-}
-
-scoped_refptr<Dispatcher> Core::GetDispatcher(MojoHandle handle) {
-  base::AutoLock lock(handles_lock_);
-  return handles_.GetDispatcher(handle);
-}
-
-void Core::SetDefaultProcessErrorCallback(
-    const ProcessErrorCallback& callback) {
-  default_process_error_callback_ = callback;
-}
-
-void Core::AddChild(base::ProcessHandle process_handle,
-                    ConnectionParams connection_params,
-                    const std::string& child_token,
-                    const ProcessErrorCallback& process_error_callback) {
-  GetNodeController()->ConnectToChild(process_handle,
-                                      std::move(connection_params), child_token,
-                                      process_error_callback);
-}
-
-void Core::ChildLaunchFailed(const std::string& child_token) {
-  RequestContext request_context;
-  GetNodeController()->CloseChildPorts(child_token);
-}
-
-ScopedMessagePipeHandle Core::ConnectToPeerProcess(
-    ScopedPlatformHandle pipe_handle,
-    const std::string& peer_token) {
-  RequestContext request_context;
-  ports::PortRef port0, port1;
-  GetNodeController()->node()->CreatePortPair(&port0, &port1);
-  MojoHandle handle = AddDispatcher(new MessagePipeDispatcher(
-      GetNodeController(), port0, kUnknownPipeIdForDebug, 0));
-  ConnectionParams connection_params(std::move(pipe_handle));
-  GetNodeController()->ConnectToPeer(std::move(connection_params), port1,
-                                     peer_token);
-  return ScopedMessagePipeHandle(MessagePipeHandle(handle));
-}
-
-void Core::ClosePeerConnection(const std::string& peer_token) {
-  GetNodeController()->ClosePeerConnection(peer_token);
-}
-
-void Core::InitChild(ConnectionParams connection_params) {
-  GetNodeController()->ConnectToParent(std::move(connection_params));
-}
-
-void Core::SetMachPortProvider(base::PortProvider* port_provider) {
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-  GetNodeController()->CreateMachPortRelay(port_provider);
-#endif
-}
-
-MojoHandle Core::AddDispatcher(scoped_refptr<Dispatcher> dispatcher) {
-  base::AutoLock lock(handles_lock_);
-  return handles_.AddDispatcher(dispatcher);
-}
-
-bool Core::AddDispatchersFromTransit(
-    const std::vector<Dispatcher::DispatcherInTransit>& dispatchers,
-    MojoHandle* handles) {
-  bool failed = false;
-  {
-    base::AutoLock lock(handles_lock_);
-    if (!handles_.AddDispatchersFromTransit(dispatchers, handles))
-      failed = true;
-  }
-  if (failed) {
-    for (auto d : dispatchers)
-      d.dispatcher->Close();
-    return false;
-  }
-  return true;
-}
-
-MojoResult Core::CreatePlatformHandleWrapper(
-    ScopedPlatformHandle platform_handle,
-    MojoHandle* wrapper_handle) {
-  MojoHandle h = AddDispatcher(
-      PlatformHandleDispatcher::Create(std::move(platform_handle)));
-  if (h == MOJO_HANDLE_INVALID)
-    return MOJO_RESULT_RESOURCE_EXHAUSTED;
-  *wrapper_handle = h;
-  return MOJO_RESULT_OK;
-}
-
-MojoResult Core::PassWrappedPlatformHandle(
-    MojoHandle wrapper_handle,
-    ScopedPlatformHandle* platform_handle) {
-  base::AutoLock lock(handles_lock_);
-  scoped_refptr<Dispatcher> d;
-  MojoResult result = handles_.GetAndRemoveDispatcher(wrapper_handle, &d);
-  if (result != MOJO_RESULT_OK)
-    return result;
-  if (d->GetType() == Dispatcher::Type::PLATFORM_HANDLE) {
-    PlatformHandleDispatcher* phd =
-        static_cast<PlatformHandleDispatcher*>(d.get());
-    *platform_handle = phd->PassPlatformHandle();
-  } else {
-    result = MOJO_RESULT_INVALID_ARGUMENT;
-  }
-  d->Close();
-  return result;
-}
-
-MojoResult Core::CreateSharedBufferWrapper(
-    base::SharedMemoryHandle shared_memory_handle,
-    size_t num_bytes,
-    bool read_only,
-    MojoHandle* mojo_wrapper_handle) {
-  DCHECK(num_bytes);
-  scoped_refptr<PlatformSharedBuffer> platform_buffer =
-      PlatformSharedBuffer::CreateFromSharedMemoryHandle(num_bytes, read_only,
-                                                         shared_memory_handle);
-  if (!platform_buffer)
-    return MOJO_RESULT_UNKNOWN;
-
-  scoped_refptr<SharedBufferDispatcher> dispatcher;
-  MojoResult result = SharedBufferDispatcher::CreateFromPlatformSharedBuffer(
-      platform_buffer, &dispatcher);
-  if (result != MOJO_RESULT_OK)
-    return result;
-  MojoHandle h = AddDispatcher(dispatcher);
-  if (h == MOJO_HANDLE_INVALID)
-    return MOJO_RESULT_RESOURCE_EXHAUSTED;
-  *mojo_wrapper_handle = h;
-  return MOJO_RESULT_OK;
-}
-
-MojoResult Core::PassSharedMemoryHandle(
-    MojoHandle mojo_handle,
-    base::SharedMemoryHandle* shared_memory_handle,
-    size_t* num_bytes,
-    bool* read_only) {
-  if (!shared_memory_handle)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  scoped_refptr<Dispatcher> dispatcher;
-  MojoResult result = MOJO_RESULT_OK;
-  {
-    base::AutoLock lock(handles_lock_);
-    // Get the dispatcher and check it before removing it from the handle table
-    // to ensure that the dispatcher is of the correct type. This ensures we
-    // don't close and remove the wrong type of dispatcher.
-    dispatcher = handles_.GetDispatcher(mojo_handle);
-    if (!dispatcher || dispatcher->GetType() != Dispatcher::Type::SHARED_BUFFER)
-      return MOJO_RESULT_INVALID_ARGUMENT;
-
-    result = handles_.GetAndRemoveDispatcher(mojo_handle, &dispatcher);
-    if (result != MOJO_RESULT_OK)
-      return result;
-  }
-
-  SharedBufferDispatcher* shm_dispatcher =
-      static_cast<SharedBufferDispatcher*>(dispatcher.get());
-  scoped_refptr<PlatformSharedBuffer> platform_shared_buffer =
-      shm_dispatcher->PassPlatformSharedBuffer();
-
-  if (!platform_shared_buffer)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  if (num_bytes)
-    *num_bytes = platform_shared_buffer->GetNumBytes();
-  if (read_only)
-    *read_only = platform_shared_buffer->IsReadOnly();
-  *shared_memory_handle = platform_shared_buffer->DuplicateSharedMemoryHandle();
-
-  shm_dispatcher->Close();
-  return result;
-}
-
-void Core::RequestShutdown(const base::Closure& callback) {
-  GetNodeController()->RequestShutdown(callback);
-}
-
-ScopedMessagePipeHandle Core::CreateParentMessagePipe(
-    const std::string& token, const std::string& child_token) {
-  RequestContext request_context;
-  ports::PortRef port0, port1;
-  GetNodeController()->node()->CreatePortPair(&port0, &port1);
-  MojoHandle handle = AddDispatcher(
-      new MessagePipeDispatcher(GetNodeController(), port0,
-                                kUnknownPipeIdForDebug, 0));
-  GetNodeController()->ReservePort(token, port1, child_token);
-  return ScopedMessagePipeHandle(MessagePipeHandle(handle));
-}
-
-ScopedMessagePipeHandle Core::CreateChildMessagePipe(const std::string& token) {
-  RequestContext request_context;
-  ports::PortRef port0, port1;
-  GetNodeController()->node()->CreatePortPair(&port0, &port1);
-  MojoHandle handle = AddDispatcher(
-      new MessagePipeDispatcher(GetNodeController(), port0,
-                                kUnknownPipeIdForDebug, 1));
-  GetNodeController()->MergePortIntoParent(token, port1);
-  return ScopedMessagePipeHandle(MessagePipeHandle(handle));
-}
-
-MojoResult Core::SetProperty(MojoPropertyType type, const void* value) {
-  base::AutoLock locker(property_lock_);
-  switch (type) {
-    case MOJO_PROPERTY_TYPE_SYNC_CALL_ALLOWED:
-      property_sync_call_allowed_ = *static_cast<const bool*>(value);
-      return MOJO_RESULT_OK;
-    default:
-      return MOJO_RESULT_INVALID_ARGUMENT;
-  }
-}
-
-MojoTimeTicks Core::GetTimeTicksNow() {
-  return base::TimeTicks::Now().ToInternalValue();
-}
-
-MojoResult Core::Close(MojoHandle handle) {
-  RequestContext request_context;
-  scoped_refptr<Dispatcher> dispatcher;
-  {
-    base::AutoLock lock(handles_lock_);
-    MojoResult rv = handles_.GetAndRemoveDispatcher(handle, &dispatcher);
-    if (rv != MOJO_RESULT_OK)
-      return rv;
-  }
-  dispatcher->Close();
-  return MOJO_RESULT_OK;
-}
-
-MojoResult Core::QueryHandleSignalsState(
-    MojoHandle handle,
-    MojoHandleSignalsState* signals_state) {
-  RequestContext request_context;
-  scoped_refptr<Dispatcher> dispatcher = GetDispatcher(handle);
-  if (!dispatcher || !signals_state)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-  *signals_state = dispatcher->GetHandleSignalsState();
-  return MOJO_RESULT_OK;
-}
-
-MojoResult Core::CreateWatcher(MojoWatcherCallback callback,
-                               MojoHandle* watcher_handle) {
-  RequestContext request_context;
-  if (!watcher_handle)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-  *watcher_handle = AddDispatcher(new WatcherDispatcher(callback));
-  if (*watcher_handle == MOJO_HANDLE_INVALID)
-    return MOJO_RESULT_RESOURCE_EXHAUSTED;
-  return MOJO_RESULT_OK;
-}
-
-MojoResult Core::Watch(MojoHandle watcher_handle,
-                       MojoHandle handle,
-                       MojoHandleSignals signals,
-                       uintptr_t context) {
-  RequestContext request_context;
-  scoped_refptr<Dispatcher> watcher = GetDispatcher(watcher_handle);
-  if (!watcher || watcher->GetType() != Dispatcher::Type::WATCHER)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-  scoped_refptr<Dispatcher> dispatcher = GetDispatcher(handle);
-  if (!dispatcher)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-  return watcher->WatchDispatcher(dispatcher, signals, context);
-}
-
-MojoResult Core::CancelWatch(MojoHandle watcher_handle, uintptr_t context) {
-  RequestContext request_context;
-  scoped_refptr<Dispatcher> watcher = GetDispatcher(watcher_handle);
-  if (!watcher || watcher->GetType() != Dispatcher::Type::WATCHER)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-  return watcher->CancelWatch(context);
-}
-
-MojoResult Core::ArmWatcher(MojoHandle watcher_handle,
-                            uint32_t* num_ready_contexts,
-                            uintptr_t* ready_contexts,
-                            MojoResult* ready_results,
-                            MojoHandleSignalsState* ready_signals_states) {
-  RequestContext request_context;
-  scoped_refptr<Dispatcher> watcher = GetDispatcher(watcher_handle);
-  if (!watcher || watcher->GetType() != Dispatcher::Type::WATCHER)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-  return watcher->Arm(num_ready_contexts, ready_contexts, ready_results,
-                      ready_signals_states);
-}
-
-MojoResult Core::AllocMessage(uint32_t num_bytes,
-                              const MojoHandle* handles,
-                              uint32_t num_handles,
-                              MojoAllocMessageFlags flags,
-                              MojoMessageHandle* message) {
-  if (!message)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  if (num_handles == 0) {  // Fast path: no handles.
-    std::unique_ptr<MessageForTransit> msg;
-    MojoResult rv = MessageForTransit::Create(&msg, num_bytes, nullptr, 0);
-    if (rv != MOJO_RESULT_OK)
-      return rv;
-
-    *message = reinterpret_cast<MojoMessageHandle>(msg.release());
-    return MOJO_RESULT_OK;
-  }
-
-  if (!handles)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  if (num_handles > kMaxHandlesPerMessage)
-    return MOJO_RESULT_RESOURCE_EXHAUSTED;
-
-  std::vector<Dispatcher::DispatcherInTransit> dispatchers;
-  {
-    base::AutoLock lock(handles_lock_);
-    MojoResult rv = handles_.BeginTransit(handles, num_handles, &dispatchers);
-    if (rv != MOJO_RESULT_OK) {
-      handles_.CancelTransit(dispatchers);
-      return rv;
-    }
-  }
-  DCHECK_EQ(num_handles, dispatchers.size());
-
-  std::unique_ptr<MessageForTransit> msg;
-  MojoResult rv = MessageForTransit::Create(
-      &msg, num_bytes, dispatchers.data(), num_handles);
-
-  {
-    base::AutoLock lock(handles_lock_);
-    if (rv == MOJO_RESULT_OK) {
-      handles_.CompleteTransitAndClose(dispatchers);
-      *message = reinterpret_cast<MojoMessageHandle>(msg.release());
-    } else {
-      handles_.CancelTransit(dispatchers);
-    }
-  }
-
-  return rv;
-}
-
-MojoResult Core::FreeMessage(MojoMessageHandle message) {
-  if (!message)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  delete reinterpret_cast<MessageForTransit*>(message);
-
-  return MOJO_RESULT_OK;
-}
-
-MojoResult Core::GetMessageBuffer(MojoMessageHandle message, void** buffer) {
-  if (!message)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  *buffer = reinterpret_cast<MessageForTransit*>(message)->mutable_bytes();
-
-  return MOJO_RESULT_OK;
-}
-
-MojoResult Core::GetProperty(MojoPropertyType type, void* value) {
-  base::AutoLock locker(property_lock_);
-  switch (type) {
-    case MOJO_PROPERTY_TYPE_SYNC_CALL_ALLOWED:
-      *static_cast<bool*>(value) = property_sync_call_allowed_;
-      return MOJO_RESULT_OK;
-    default:
-      return MOJO_RESULT_INVALID_ARGUMENT;
-  }
-}
-
-MojoResult Core::CreateMessagePipe(
-    const MojoCreateMessagePipeOptions* options,
-    MojoHandle* message_pipe_handle0,
-    MojoHandle* message_pipe_handle1) {
-  RequestContext request_context;
-  ports::PortRef port0, port1;
-  GetNodeController()->node()->CreatePortPair(&port0, &port1);
-
-  CHECK(message_pipe_handle0);
-  CHECK(message_pipe_handle1);
-
-  uint64_t pipe_id = base::RandUint64();
-
-  *message_pipe_handle0 = AddDispatcher(
-      new MessagePipeDispatcher(GetNodeController(), port0, pipe_id, 0));
-  if (*message_pipe_handle0 == MOJO_HANDLE_INVALID)
-    return MOJO_RESULT_RESOURCE_EXHAUSTED;
-
-  *message_pipe_handle1 = AddDispatcher(
-      new MessagePipeDispatcher(GetNodeController(), port1, pipe_id, 1));
-  if (*message_pipe_handle1 == MOJO_HANDLE_INVALID) {
-    scoped_refptr<Dispatcher> unused;
-    unused->Close();
-
-    base::AutoLock lock(handles_lock_);
-    handles_.GetAndRemoveDispatcher(*message_pipe_handle0, &unused);
-    return MOJO_RESULT_RESOURCE_EXHAUSTED;
-  }
-
-  return MOJO_RESULT_OK;
-}
-
-MojoResult Core::WriteMessage(MojoHandle message_pipe_handle,
-                              const void* bytes,
-                              uint32_t num_bytes,
-                              const MojoHandle* handles,
-                              uint32_t num_handles,
-                              MojoWriteMessageFlags flags) {
-  if (num_bytes && !bytes)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  MojoMessageHandle message;
-  MojoResult rv = AllocMessage(num_bytes, handles, num_handles,
-                               MOJO_ALLOC_MESSAGE_FLAG_NONE, &message);
-  if (rv != MOJO_RESULT_OK)
-    return rv;
-
-  if (num_bytes) {
-    void* buffer = nullptr;
-    rv = GetMessageBuffer(message, &buffer);
-    DCHECK_EQ(rv, MOJO_RESULT_OK);
-    memcpy(buffer, bytes, num_bytes);
-  }
-
-  return WriteMessageNew(message_pipe_handle, message, flags);
-}
-
-MojoResult Core::WriteMessageNew(MojoHandle message_pipe_handle,
-                                 MojoMessageHandle message,
-                                 MojoWriteMessageFlags flags) {
-  RequestContext request_context;
-  std::unique_ptr<MessageForTransit> message_for_transit(
-      reinterpret_cast<MessageForTransit*>(message));
-  auto dispatcher = GetDispatcher(message_pipe_handle);
-  if (!dispatcher)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  return dispatcher->WriteMessage(std::move(message_for_transit), flags);
-}
-
-MojoResult Core::ReadMessage(MojoHandle message_pipe_handle,
-                             void* bytes,
-                             uint32_t* num_bytes,
-                             MojoHandle* handles,
-                             uint32_t* num_handles,
-                             MojoReadMessageFlags flags) {
-  CHECK((!num_handles || !*num_handles || handles) &&
-        (!num_bytes || !*num_bytes || bytes));
-  RequestContext request_context;
-  auto dispatcher = GetDispatcher(message_pipe_handle);
-  if (!dispatcher)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-  std::unique_ptr<MessageForTransit> message;
-  MojoResult rv =
-      dispatcher->ReadMessage(&message, num_bytes, handles, num_handles, flags,
-                              false /* ignore_num_bytes */);
-  if (rv != MOJO_RESULT_OK)
-    return rv;
-
-  if (message && message->num_bytes())
-    memcpy(bytes, message->bytes(), message->num_bytes());
-
-  return MOJO_RESULT_OK;
-}
-
-MojoResult Core::ReadMessageNew(MojoHandle message_pipe_handle,
-                                MojoMessageHandle* message,
-                                uint32_t* num_bytes,
-                                MojoHandle* handles,
-                                uint32_t* num_handles,
-                                MojoReadMessageFlags flags) {
-  CHECK(message);
-  CHECK(!num_handles || !*num_handles || handles);
-  RequestContext request_context;
-  auto dispatcher = GetDispatcher(message_pipe_handle);
-  if (!dispatcher)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-  std::unique_ptr<MessageForTransit> msg;
-  MojoResult rv =
-      dispatcher->ReadMessage(&msg, num_bytes, handles, num_handles, flags,
-                              true /* ignore_num_bytes */);
-  if (rv != MOJO_RESULT_OK)
-    return rv;
-  *message = reinterpret_cast<MojoMessageHandle>(msg.release());
-  return MOJO_RESULT_OK;
-}
-
-MojoResult Core::FuseMessagePipes(MojoHandle handle0, MojoHandle handle1) {
-  RequestContext request_context;
-  scoped_refptr<Dispatcher> dispatcher0;
-  scoped_refptr<Dispatcher> dispatcher1;
-
-  bool valid_handles = true;
-  {
-    base::AutoLock lock(handles_lock_);
-    MojoResult result0 = handles_.GetAndRemoveDispatcher(handle0, &dispatcher0);
-    MojoResult result1 = handles_.GetAndRemoveDispatcher(handle1, &dispatcher1);
-    if (result0 != MOJO_RESULT_OK || result1 != MOJO_RESULT_OK ||
-        dispatcher0->GetType() != Dispatcher::Type::MESSAGE_PIPE ||
-        dispatcher1->GetType() != Dispatcher::Type::MESSAGE_PIPE)
-      valid_handles = false;
-  }
-
-  if (!valid_handles) {
-    if (dispatcher0)
-      dispatcher0->Close();
-    if (dispatcher1)
-      dispatcher1->Close();
-    return MOJO_RESULT_INVALID_ARGUMENT;
-  }
-
-  MessagePipeDispatcher* mpd0 =
-      static_cast<MessagePipeDispatcher*>(dispatcher0.get());
-  MessagePipeDispatcher* mpd1 =
-      static_cast<MessagePipeDispatcher*>(dispatcher1.get());
-
-  if (!mpd0->Fuse(mpd1))
-    return MOJO_RESULT_FAILED_PRECONDITION;
-
-  return MOJO_RESULT_OK;
-}
-
-MojoResult Core::NotifyBadMessage(MojoMessageHandle message,
-                                  const char* error,
-                                  size_t error_num_bytes) {
-  if (!message)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  const PortsMessage& ports_message =
-      reinterpret_cast<MessageForTransit*>(message)->ports_message();
-  if (ports_message.source_node() == ports::kInvalidNodeName) {
-    DVLOG(1) << "Received invalid message from unknown node.";
-    if (!default_process_error_callback_.is_null())
-      default_process_error_callback_.Run(std::string(error, error_num_bytes));
-    return MOJO_RESULT_OK;
-  }
-
-  GetNodeController()->NotifyBadMessageFrom(
-      ports_message.source_node(), std::string(error, error_num_bytes));
-  return MOJO_RESULT_OK;
-}
-
-MojoResult Core::CreateDataPipe(
-    const MojoCreateDataPipeOptions* options,
-    MojoHandle* data_pipe_producer_handle,
-    MojoHandle* data_pipe_consumer_handle) {
-  RequestContext request_context;
-  if (options && options->struct_size != sizeof(MojoCreateDataPipeOptions))
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  MojoCreateDataPipeOptions create_options;
-  create_options.struct_size = sizeof(MojoCreateDataPipeOptions);
-  create_options.flags = options ? options->flags : 0;
-  create_options.element_num_bytes = options ? options->element_num_bytes : 1;
-  // TODO(rockot): Use Configuration to get default data pipe capacity.
-  create_options.capacity_num_bytes =
-      options && options->capacity_num_bytes ? options->capacity_num_bytes
-                                             : 64 * 1024;
-
-  // TODO(rockot): Broker through the parent when necessary.
-  scoped_refptr<PlatformSharedBuffer> ring_buffer =
-      GetNodeController()->CreateSharedBuffer(
-          create_options.capacity_num_bytes);
-  if (!ring_buffer)
-    return MOJO_RESULT_RESOURCE_EXHAUSTED;
-
-  ports::PortRef port0, port1;
-  GetNodeController()->node()->CreatePortPair(&port0, &port1);
-
-  CHECK(data_pipe_producer_handle);
-  CHECK(data_pipe_consumer_handle);
-
-  uint64_t pipe_id = base::RandUint64();
-
-  scoped_refptr<Dispatcher> producer = new DataPipeProducerDispatcher(
-      GetNodeController(), port0, ring_buffer, create_options,
-      true /* initialized */, pipe_id);
-  scoped_refptr<Dispatcher> consumer = new DataPipeConsumerDispatcher(
-      GetNodeController(), port1, ring_buffer, create_options,
-      true /* initialized */, pipe_id);
-
-  *data_pipe_producer_handle = AddDispatcher(producer);
-  *data_pipe_consumer_handle = AddDispatcher(consumer);
-  if (*data_pipe_producer_handle == MOJO_HANDLE_INVALID ||
-      *data_pipe_consumer_handle == MOJO_HANDLE_INVALID) {
-    if (*data_pipe_producer_handle != MOJO_HANDLE_INVALID) {
-      scoped_refptr<Dispatcher> unused;
-      base::AutoLock lock(handles_lock_);
-      handles_.GetAndRemoveDispatcher(*data_pipe_producer_handle, &unused);
-    }
-    producer->Close();
-    consumer->Close();
-    return MOJO_RESULT_RESOURCE_EXHAUSTED;
-  }
-
-  return MOJO_RESULT_OK;
-}
-
-MojoResult Core::WriteData(MojoHandle data_pipe_producer_handle,
-                           const void* elements,
-                           uint32_t* num_bytes,
-                           MojoWriteDataFlags flags) {
-  RequestContext request_context;
-  scoped_refptr<Dispatcher> dispatcher(
-      GetDispatcher(data_pipe_producer_handle));
-  if (!dispatcher)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  return dispatcher->WriteData(elements, num_bytes, flags);
-}
-
-MojoResult Core::BeginWriteData(MojoHandle data_pipe_producer_handle,
-                                void** buffer,
-                                uint32_t* buffer_num_bytes,
-                                MojoWriteDataFlags flags) {
-  RequestContext request_context;
-  scoped_refptr<Dispatcher> dispatcher(
-      GetDispatcher(data_pipe_producer_handle));
-  if (!dispatcher)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  return dispatcher->BeginWriteData(buffer, buffer_num_bytes, flags);
-}
-
-MojoResult Core::EndWriteData(MojoHandle data_pipe_producer_handle,
-                              uint32_t num_bytes_written) {
-  RequestContext request_context;
-  scoped_refptr<Dispatcher> dispatcher(
-      GetDispatcher(data_pipe_producer_handle));
-  if (!dispatcher)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  return dispatcher->EndWriteData(num_bytes_written);
-}
-
-MojoResult Core::ReadData(MojoHandle data_pipe_consumer_handle,
-                          void* elements,
-                          uint32_t* num_bytes,
-                          MojoReadDataFlags flags) {
-  RequestContext request_context;
-  scoped_refptr<Dispatcher> dispatcher(
-      GetDispatcher(data_pipe_consumer_handle));
-  if (!dispatcher)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  return dispatcher->ReadData(elements, num_bytes, flags);
-}
-
-MojoResult Core::BeginReadData(MojoHandle data_pipe_consumer_handle,
-                               const void** buffer,
-                               uint32_t* buffer_num_bytes,
-                               MojoReadDataFlags flags) {
-  RequestContext request_context;
-  scoped_refptr<Dispatcher> dispatcher(
-      GetDispatcher(data_pipe_consumer_handle));
-  if (!dispatcher)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  return dispatcher->BeginReadData(buffer, buffer_num_bytes, flags);
-}
-
-MojoResult Core::EndReadData(MojoHandle data_pipe_consumer_handle,
-                             uint32_t num_bytes_read) {
-  RequestContext request_context;
-  scoped_refptr<Dispatcher> dispatcher(
-      GetDispatcher(data_pipe_consumer_handle));
-  if (!dispatcher)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  return dispatcher->EndReadData(num_bytes_read);
-}
-
-MojoResult Core::CreateSharedBuffer(
-    const MojoCreateSharedBufferOptions* options,
-    uint64_t num_bytes,
-    MojoHandle* shared_buffer_handle) {
-  RequestContext request_context;
-  MojoCreateSharedBufferOptions validated_options = {};
-  MojoResult result = SharedBufferDispatcher::ValidateCreateOptions(
-      options, &validated_options);
-  if (result != MOJO_RESULT_OK)
-    return result;
-
-  scoped_refptr<SharedBufferDispatcher> dispatcher;
-  result = SharedBufferDispatcher::Create(
-      validated_options, GetNodeController(), num_bytes, &dispatcher);
-  if (result != MOJO_RESULT_OK) {
-    DCHECK(!dispatcher);
-    return result;
-  }
-
-  *shared_buffer_handle = AddDispatcher(dispatcher);
-  if (*shared_buffer_handle == MOJO_HANDLE_INVALID) {
-    LOG(ERROR) << "Handle table full";
-    dispatcher->Close();
-    return MOJO_RESULT_RESOURCE_EXHAUSTED;
-  }
-
-  return MOJO_RESULT_OK;
-}
-
-MojoResult Core::DuplicateBufferHandle(
-    MojoHandle buffer_handle,
-    const MojoDuplicateBufferHandleOptions* options,
-    MojoHandle* new_buffer_handle) {
-  RequestContext request_context;
-  scoped_refptr<Dispatcher> dispatcher(GetDispatcher(buffer_handle));
-  if (!dispatcher)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  // Don't verify |options| here; that's the dispatcher's job.
-  scoped_refptr<Dispatcher> new_dispatcher;
-  MojoResult result =
-      dispatcher->DuplicateBufferHandle(options, &new_dispatcher);
-  if (result != MOJO_RESULT_OK)
-    return result;
-
-  *new_buffer_handle = AddDispatcher(new_dispatcher);
-  if (*new_buffer_handle == MOJO_HANDLE_INVALID) {
-    LOG(ERROR) << "Handle table full";
-    dispatcher->Close();
-    return MOJO_RESULT_RESOURCE_EXHAUSTED;
-  }
-
-  return MOJO_RESULT_OK;
-}
-
-MojoResult Core::MapBuffer(MojoHandle buffer_handle,
-                           uint64_t offset,
-                           uint64_t num_bytes,
-                           void** buffer,
-                           MojoMapBufferFlags flags) {
-  RequestContext request_context;
-  scoped_refptr<Dispatcher> dispatcher(GetDispatcher(buffer_handle));
-  if (!dispatcher)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  std::unique_ptr<PlatformSharedBufferMapping> mapping;
-  MojoResult result = dispatcher->MapBuffer(offset, num_bytes, flags, &mapping);
-  if (result != MOJO_RESULT_OK)
-    return result;
-
-  DCHECK(mapping);
-  void* address = mapping->GetBase();
-  {
-    base::AutoLock locker(mapping_table_lock_);
-    result = mapping_table_.AddMapping(std::move(mapping));
-  }
-  if (result != MOJO_RESULT_OK)
-    return result;
-
-  *buffer = address;
-  return MOJO_RESULT_OK;
-}
-
-MojoResult Core::UnmapBuffer(void* buffer) {
-  RequestContext request_context;
-  base::AutoLock lock(mapping_table_lock_);
-  return mapping_table_.RemoveMapping(buffer);
-}
-
-MojoResult Core::WrapPlatformHandle(const MojoPlatformHandle* platform_handle,
-                                    MojoHandle* mojo_handle) {
-  ScopedPlatformHandle handle;
-  MojoResult result = MojoPlatformHandleToScopedPlatformHandle(platform_handle,
-                                                               &handle);
-  if (result != MOJO_RESULT_OK)
-    return result;
-
-  return CreatePlatformHandleWrapper(std::move(handle), mojo_handle);
-}
-
-MojoResult Core::UnwrapPlatformHandle(MojoHandle mojo_handle,
-                                      MojoPlatformHandle* platform_handle) {
-  ScopedPlatformHandle handle;
-  MojoResult result = PassWrappedPlatformHandle(mojo_handle, &handle);
-  if (result != MOJO_RESULT_OK)
-    return result;
-
-  return ScopedPlatformHandleToMojoPlatformHandle(std::move(handle),
-                                                  platform_handle);
-}
-
-MojoResult Core::WrapPlatformSharedBufferHandle(
-    const MojoPlatformHandle* platform_handle,
-    size_t size,
-    MojoPlatformSharedBufferHandleFlags flags,
-    MojoHandle* mojo_handle) {
-  DCHECK(size);
-  ScopedPlatformHandle handle;
-  MojoResult result = MojoPlatformHandleToScopedPlatformHandle(platform_handle,
-                                                               &handle);
-  if (result != MOJO_RESULT_OK)
-    return result;
-
-  bool read_only = flags & MOJO_PLATFORM_SHARED_BUFFER_HANDLE_FLAG_READ_ONLY;
-  scoped_refptr<PlatformSharedBuffer> platform_buffer =
-      PlatformSharedBuffer::CreateFromPlatformHandle(size, read_only,
-                                                     std::move(handle));
-  if (!platform_buffer)
-    return MOJO_RESULT_UNKNOWN;
-
-  scoped_refptr<SharedBufferDispatcher> dispatcher;
-  result = SharedBufferDispatcher::CreateFromPlatformSharedBuffer(
-      platform_buffer, &dispatcher);
-  if (result != MOJO_RESULT_OK)
-    return result;
-
-  MojoHandle h = AddDispatcher(dispatcher);
-  if (h == MOJO_HANDLE_INVALID) {
-    dispatcher->Close();
-    return MOJO_RESULT_RESOURCE_EXHAUSTED;
-  }
-
-  *mojo_handle = h;
-  return MOJO_RESULT_OK;
-}
-
-MojoResult Core::UnwrapPlatformSharedBufferHandle(
-    MojoHandle mojo_handle,
-    MojoPlatformHandle* platform_handle,
-    size_t* size,
-    MojoPlatformSharedBufferHandleFlags* flags) {
-  scoped_refptr<Dispatcher> dispatcher;
-  MojoResult result = MOJO_RESULT_OK;
-  {
-    base::AutoLock lock(handles_lock_);
-    result = handles_.GetAndRemoveDispatcher(mojo_handle, &dispatcher);
-    if (result != MOJO_RESULT_OK)
-      return result;
-  }
-
-  if (dispatcher->GetType() != Dispatcher::Type::SHARED_BUFFER) {
-    dispatcher->Close();
-    return MOJO_RESULT_INVALID_ARGUMENT;
-  }
-
-  SharedBufferDispatcher* shm_dispatcher =
-      static_cast<SharedBufferDispatcher*>(dispatcher.get());
-  scoped_refptr<PlatformSharedBuffer> platform_shared_buffer =
-      shm_dispatcher->PassPlatformSharedBuffer();
-  CHECK(platform_shared_buffer);
-
-  CHECK(size);
-  *size = platform_shared_buffer->GetNumBytes();
-
-  CHECK(flags);
-  *flags = MOJO_PLATFORM_SHARED_BUFFER_HANDLE_FLAG_NONE;
-  if (platform_shared_buffer->IsReadOnly())
-    *flags |= MOJO_PLATFORM_SHARED_BUFFER_HANDLE_FLAG_READ_ONLY;
-
-  ScopedPlatformHandle handle = platform_shared_buffer->PassPlatformHandle();
-  return ScopedPlatformHandleToMojoPlatformHandle(std::move(handle),
-                                                  platform_handle);
-}
-
-void Core::GetActiveHandlesForTest(std::vector<MojoHandle>* handles) {
-  base::AutoLock lock(handles_lock_);
-  handles_.GetActiveHandlesForTest(handles);
-}
-
-// static
-void Core::PassNodeControllerToIOThread(
-    std::unique_ptr<NodeController> node_controller) {
-  // It's OK to leak this reference. At this point we know the IO loop is still
-  // running, and we know the NodeController will observe its eventual
-  // destruction. This tells the NodeController to delete itself when that
-  // happens.
-  node_controller.release()->DestroyOnIOThreadShutdown();
-}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/core.h b/mojo/edk/system/core.h
deleted file mode 100644
index 1f6d865..0000000
--- a/mojo/edk/system/core.h
+++ /dev/null
@@ -1,297 +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 MOJO_EDK_SYSTEM_CORE_H_
-#define MOJO_EDK_SYSTEM_CORE_H_
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "base/callback.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/memory/shared_memory_handle.h"
-#include "base/synchronization/lock.h"
-#include "base/task_runner.h"
-#include "mojo/edk/embedder/scoped_platform_handle.h"
-#include "mojo/edk/system/dispatcher.h"
-#include "mojo/edk/system/handle_signals_state.h"
-#include "mojo/edk/system/handle_table.h"
-#include "mojo/edk/system/mapping_table.h"
-#include "mojo/edk/system/node_controller.h"
-#include "mojo/edk/system/system_impl_export.h"
-#include "mojo/public/c/system/buffer.h"
-#include "mojo/public/c/system/data_pipe.h"
-#include "mojo/public/c/system/message_pipe.h"
-#include "mojo/public/c/system/platform_handle.h"
-#include "mojo/public/c/system/types.h"
-#include "mojo/public/c/system/watcher.h"
-#include "mojo/public/cpp/system/message_pipe.h"
-
-namespace base {
-class PortProvider;
-}
-
-namespace mojo {
-namespace edk {
-
-// |Core| is an object that implements the Mojo system calls. All public methods
-// are thread-safe.
-class MOJO_SYSTEM_IMPL_EXPORT Core {
- public:
-  Core();
-  virtual ~Core();
-
-  // Called exactly once, shortly after construction, and before any other
-  // methods are called on this object.
-  void SetIOTaskRunner(scoped_refptr<base::TaskRunner> io_task_runner);
-
-  // Retrieves the NodeController for the current process.
-  NodeController* GetNodeController();
-
-  scoped_refptr<Dispatcher> GetDispatcher(MojoHandle handle);
-
-  void SetDefaultProcessErrorCallback(const ProcessErrorCallback& callback);
-
-  // Called in the parent process any time a new child is launched.
-  void AddChild(base::ProcessHandle process_handle,
-                ConnectionParams connection_params,
-                const std::string& child_token,
-                const ProcessErrorCallback& process_error_callback);
-
-  // Called in the parent process when a child process fails to launch.
-  void ChildLaunchFailed(const std::string& child_token);
-
-  // Called to connect to a peer process. This should be called only if there
-  // is no common ancestor for the processes involved within this mojo system.
-  // Both processes must call this function, each passing one end of a platform
-  // channel. This returns one end of a message pipe to each process.
-  ScopedMessagePipeHandle ConnectToPeerProcess(ScopedPlatformHandle pipe_handle,
-                                               const std::string& peer_token);
-  void ClosePeerConnection(const std::string& peer_token);
-
-  // Called in a child process exactly once during early initialization.
-  void InitChild(ConnectionParams connection_params);
-
-  // Creates a message pipe endpoint associated with |token|, which a child
-  // holding the token can later locate and connect to.
-  ScopedMessagePipeHandle CreateParentMessagePipe(
-      const std::string& token, const std::string& child_token);
-
-  // Creates a message pipe endpoint and connects it to a pipe the parent has
-  // associated with |token|.
-  ScopedMessagePipeHandle CreateChildMessagePipe(const std::string& token);
-
-  // Sets the mach port provider for this process.
-  void SetMachPortProvider(base::PortProvider* port_provider);
-
-  MojoHandle AddDispatcher(scoped_refptr<Dispatcher> dispatcher);
-
-  // Adds new dispatchers for non-message-pipe handles received in a message.
-  // |dispatchers| and |handles| should be the same size.
-  bool AddDispatchersFromTransit(
-      const std::vector<Dispatcher::DispatcherInTransit>& dispatchers,
-      MojoHandle* handles);
-
-  // See "mojo/edk/embedder/embedder.h" for more information on these functions.
-  MojoResult CreatePlatformHandleWrapper(ScopedPlatformHandle platform_handle,
-                                         MojoHandle* wrapper_handle);
-
-  MojoResult PassWrappedPlatformHandle(MojoHandle wrapper_handle,
-                                       ScopedPlatformHandle* platform_handle);
-
-  MojoResult CreateSharedBufferWrapper(
-      base::SharedMemoryHandle shared_memory_handle,
-      size_t num_bytes,
-      bool read_only,
-      MojoHandle* mojo_wrapper_handle);
-
-  MojoResult PassSharedMemoryHandle(
-      MojoHandle mojo_handle,
-      base::SharedMemoryHandle* shared_memory_handle,
-      size_t* num_bytes,
-      bool* read_only);
-
-  // Requests that the EDK tear itself down. |callback| will be called once
-  // the shutdown process is complete. Note that |callback| is always called
-  // asynchronously on the calling thread if said thread is running a message
-  // loop, and the calling thread must continue running a MessageLoop at least
-  // until the callback is called. If there is no running loop, the |callback|
-  // may be called from any thread. Beware!
-  void RequestShutdown(const base::Closure& callback);
-
-  MojoResult SetProperty(MojoPropertyType type, const void* value);
-
-  // ---------------------------------------------------------------------------
-
-  // The following methods are essentially implementations of the Mojo Core
-  // functions of the Mojo API, with the C interface translated to C++ by
-  // "mojo/edk/embedder/entrypoints.cc". The best way to understand the contract
-  // of these methods is to look at the header files defining the corresponding
-  // API functions, referenced below.
-
-  // These methods correspond to the API functions defined in
-  // "mojo/public/c/system/functions.h":
-  MojoTimeTicks GetTimeTicksNow();
-  MojoResult Close(MojoHandle handle);
-  MojoResult QueryHandleSignalsState(MojoHandle handle,
-                                     MojoHandleSignalsState* signals_state);
-  MojoResult CreateWatcher(MojoWatcherCallback callback,
-                           MojoHandle* watcher_handle);
-  MojoResult Watch(MojoHandle watcher_handle,
-                   MojoHandle handle,
-                   MojoHandleSignals signals,
-                   uintptr_t context);
-  MojoResult CancelWatch(MojoHandle watcher_handle, uintptr_t context);
-  MojoResult ArmWatcher(MojoHandle watcher_handle,
-                        uint32_t* num_ready_contexts,
-                        uintptr_t* ready_contexts,
-                        MojoResult* ready_results,
-                        MojoHandleSignalsState* ready_signals_states);
-  MojoResult AllocMessage(uint32_t num_bytes,
-                          const MojoHandle* handles,
-                          uint32_t num_handles,
-                          MojoAllocMessageFlags flags,
-                          MojoMessageHandle* message);
-  MojoResult FreeMessage(MojoMessageHandle message);
-  MojoResult GetMessageBuffer(MojoMessageHandle message, void** buffer);
-  MojoResult GetProperty(MojoPropertyType type, void* value);
-
-  // These methods correspond to the API functions defined in
-  // "mojo/public/c/system/message_pipe.h":
-  MojoResult CreateMessagePipe(
-      const MojoCreateMessagePipeOptions* options,
-      MojoHandle* message_pipe_handle0,
-      MojoHandle* message_pipe_handle1);
-  MojoResult WriteMessage(MojoHandle message_pipe_handle,
-                          const void* bytes,
-                          uint32_t num_bytes,
-                          const MojoHandle* handles,
-                          uint32_t num_handles,
-                          MojoWriteMessageFlags flags);
-  MojoResult WriteMessageNew(MojoHandle message_pipe_handle,
-                             MojoMessageHandle message,
-                             MojoWriteMessageFlags flags);
-  MojoResult ReadMessage(MojoHandle message_pipe_handle,
-                         void* bytes,
-                         uint32_t* num_bytes,
-                         MojoHandle* handles,
-                         uint32_t* num_handles,
-                         MojoReadMessageFlags flags);
-  MojoResult ReadMessageNew(MojoHandle message_pipe_handle,
-                            MojoMessageHandle* message,
-                            uint32_t* num_bytes,
-                            MojoHandle* handles,
-                            uint32_t* num_handles,
-                            MojoReadMessageFlags flags);
-  MojoResult FuseMessagePipes(MojoHandle handle0, MojoHandle handle1);
-  MojoResult NotifyBadMessage(MojoMessageHandle message,
-                              const char* error,
-                              size_t error_num_bytes);
-
-  // These methods correspond to the API functions defined in
-  // "mojo/public/c/system/data_pipe.h":
-  MojoResult CreateDataPipe(
-      const MojoCreateDataPipeOptions* options,
-      MojoHandle* data_pipe_producer_handle,
-      MojoHandle* data_pipe_consumer_handle);
-  MojoResult WriteData(MojoHandle data_pipe_producer_handle,
-                       const void* elements,
-                       uint32_t* num_bytes,
-                       MojoWriteDataFlags flags);
-  MojoResult BeginWriteData(MojoHandle data_pipe_producer_handle,
-                            void** buffer,
-                            uint32_t* buffer_num_bytes,
-                            MojoWriteDataFlags flags);
-  MojoResult EndWriteData(MojoHandle data_pipe_producer_handle,
-                          uint32_t num_bytes_written);
-  MojoResult ReadData(MojoHandle data_pipe_consumer_handle,
-                      void* elements,
-                      uint32_t* num_bytes,
-                      MojoReadDataFlags flags);
-  MojoResult BeginReadData(MojoHandle data_pipe_consumer_handle,
-                           const void** buffer,
-                           uint32_t* buffer_num_bytes,
-                           MojoReadDataFlags flags);
-  MojoResult EndReadData(MojoHandle data_pipe_consumer_handle,
-                         uint32_t num_bytes_read);
-
-  // These methods correspond to the API functions defined in
-  // "mojo/public/c/system/buffer.h":
-  MojoResult CreateSharedBuffer(
-      const MojoCreateSharedBufferOptions* options,
-      uint64_t num_bytes,
-      MojoHandle* shared_buffer_handle);
-  MojoResult DuplicateBufferHandle(
-      MojoHandle buffer_handle,
-      const MojoDuplicateBufferHandleOptions* options,
-      MojoHandle* new_buffer_handle);
-  MojoResult MapBuffer(MojoHandle buffer_handle,
-                       uint64_t offset,
-                       uint64_t num_bytes,
-                       void** buffer,
-                       MojoMapBufferFlags flags);
-  MojoResult UnmapBuffer(void* buffer);
-
-  // These methods correspond to the API functions defined in
-  // "mojo/public/c/system/platform_handle.h".
-  MojoResult WrapPlatformHandle(const MojoPlatformHandle* platform_handle,
-                                MojoHandle* mojo_handle);
-  MojoResult UnwrapPlatformHandle(MojoHandle mojo_handle,
-                                  MojoPlatformHandle* platform_handle);
-  MojoResult WrapPlatformSharedBufferHandle(
-      const MojoPlatformHandle* platform_handle,
-      size_t size,
-      MojoPlatformSharedBufferHandleFlags flags,
-      MojoHandle* mojo_handle);
-  MojoResult UnwrapPlatformSharedBufferHandle(
-      MojoHandle mojo_handle,
-      MojoPlatformHandle* platform_handle,
-      size_t* size,
-      MojoPlatformSharedBufferHandleFlags* flags);
-
-  void GetActiveHandlesForTest(std::vector<MojoHandle>* handles);
-
- private:
-  // Used to pass ownership of our NodeController over to the IO thread in the
-  // event that we're torn down before said thread.
-  static void PassNodeControllerToIOThread(
-      std::unique_ptr<NodeController> node_controller);
-
-  // Guards node_controller_.
-  //
-  // TODO(rockot): Consider removing this. It's only needed because we
-  // initialize node_controller_ lazily and that may happen on any thread.
-  // Otherwise it's effectively const and shouldn't need to be guarded.
-  //
-  // We can get rid of lazy initialization if we defer Mojo initialization far
-  // enough that zygotes don't do it. The zygote can't create a NodeController.
-  base::Lock node_controller_lock_;
-
-  // This is lazily initialized on first access. Always use GetNodeController()
-  // to access it.
-  std::unique_ptr<NodeController> node_controller_;
-
-  // The default callback to invoke, if any, when a process error is reported
-  // but cannot be associated with a specific process.
-  ProcessErrorCallback default_process_error_callback_;
-
-  base::Lock handles_lock_;
-  HandleTable handles_;
-
-  base::Lock mapping_table_lock_;  // Protects |mapping_table_|.
-  MappingTable mapping_table_;
-
-  base::Lock property_lock_;
-  // Properties that can be read using the MojoGetProperty() API.
-  bool property_sync_call_allowed_ = true;
-
-  DISALLOW_COPY_AND_ASSIGN(Core);
-};
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_CORE_H_
diff --git a/mojo/edk/system/core_test_base.cc b/mojo/edk/system/core_test_base.cc
deleted file mode 100644
index 7751612..0000000
--- a/mojo/edk/system/core_test_base.cc
+++ /dev/null
@@ -1,272 +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 "mojo/edk/system/core_test_base.h"
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <vector>
-
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "mojo/edk/embedder/embedder_internal.h"
-#include "mojo/edk/system/configuration.h"
-#include "mojo/edk/system/core.h"
-#include "mojo/edk/system/dispatcher.h"
-#include "mojo/edk/system/message_for_transit.h"
-
-namespace mojo {
-namespace edk {
-namespace test {
-
-namespace {
-
-// MockDispatcher --------------------------------------------------------------
-
-class MockDispatcher : public Dispatcher {
- public:
-  static scoped_refptr<MockDispatcher> Create(
-      CoreTestBase::MockHandleInfo* info) {
-    return make_scoped_refptr(new MockDispatcher(info));
-  }
-
-  // Dispatcher:
-  Type GetType() const override { return Type::UNKNOWN; }
-
-  MojoResult Close() override {
-    info_->IncrementCloseCallCount();
-    return MOJO_RESULT_OK;
-  }
-
-  MojoResult WriteMessage(
-      std::unique_ptr<MessageForTransit> message,
-      MojoWriteMessageFlags /*flags*/) override {
-    info_->IncrementWriteMessageCallCount();
-
-    if (message->num_bytes() > GetConfiguration().max_message_num_bytes)
-      return MOJO_RESULT_RESOURCE_EXHAUSTED;
-
-    if (message->num_handles())
-      return MOJO_RESULT_UNIMPLEMENTED;
-
-    return MOJO_RESULT_OK;
-  }
-
-  MojoResult ReadMessage(std::unique_ptr<MessageForTransit>* message,
-                         uint32_t* num_bytes,
-                         MojoHandle* handle,
-                         uint32_t* num_handles,
-                         MojoReadMessageFlags /*flags*/,
-                         bool ignore_num_bytes) override {
-    info_->IncrementReadMessageCallCount();
-
-    if (num_handles)
-      *num_handles = 1;
-
-    return MOJO_RESULT_OK;
-  }
-
-  MojoResult WriteData(const void* elements,
-                       uint32_t* num_bytes,
-                       MojoWriteDataFlags flags) override {
-    info_->IncrementWriteDataCallCount();
-    return MOJO_RESULT_UNIMPLEMENTED;
-  }
-
-  MojoResult BeginWriteData(void** buffer,
-                            uint32_t* buffer_num_bytes,
-                            MojoWriteDataFlags flags) override {
-    info_->IncrementBeginWriteDataCallCount();
-    return MOJO_RESULT_UNIMPLEMENTED;
-  }
-
-  MojoResult EndWriteData(uint32_t num_bytes_written) override {
-    info_->IncrementEndWriteDataCallCount();
-    return MOJO_RESULT_UNIMPLEMENTED;
-  }
-
-  MojoResult ReadData(void* elements,
-                      uint32_t* num_bytes,
-                      MojoReadDataFlags flags) override {
-    info_->IncrementReadDataCallCount();
-    return MOJO_RESULT_UNIMPLEMENTED;
-  }
-
-  MojoResult BeginReadData(const void** buffer,
-                           uint32_t* buffer_num_bytes,
-                           MojoReadDataFlags flags) override {
-    info_->IncrementBeginReadDataCallCount();
-    return MOJO_RESULT_UNIMPLEMENTED;
-  }
-
-  MojoResult EndReadData(uint32_t num_bytes_read) override {
-    info_->IncrementEndReadDataCallCount();
-    return MOJO_RESULT_UNIMPLEMENTED;
-  }
-
- private:
-  explicit MockDispatcher(CoreTestBase::MockHandleInfo* info) : info_(info) {
-    CHECK(info_);
-    info_->IncrementCtorCallCount();
-  }
-
-  ~MockDispatcher() override { info_->IncrementDtorCallCount(); }
-
-  CoreTestBase::MockHandleInfo* const info_;
-
-  DISALLOW_COPY_AND_ASSIGN(MockDispatcher);
-};
-
-}  // namespace
-
-// CoreTestBase ----------------------------------------------------------------
-
-CoreTestBase::CoreTestBase() {
-}
-
-CoreTestBase::~CoreTestBase() {
-}
-
-MojoHandle CoreTestBase::CreateMockHandle(CoreTestBase::MockHandleInfo* info) {
-  scoped_refptr<MockDispatcher> dispatcher = MockDispatcher::Create(info);
-  return core()->AddDispatcher(dispatcher);
-}
-
-Core* CoreTestBase::core() {
-  return mojo::edk::internal::g_core;
-}
-
-// CoreTestBase_MockHandleInfo -------------------------------------------------
-
-CoreTestBase_MockHandleInfo::CoreTestBase_MockHandleInfo()
-    : ctor_call_count_(0),
-      dtor_call_count_(0),
-      close_call_count_(0),
-      write_message_call_count_(0),
-      read_message_call_count_(0),
-      write_data_call_count_(0),
-      begin_write_data_call_count_(0),
-      end_write_data_call_count_(0),
-      read_data_call_count_(0),
-      begin_read_data_call_count_(0),
-      end_read_data_call_count_(0) {}
-
-CoreTestBase_MockHandleInfo::~CoreTestBase_MockHandleInfo() {
-}
-
-unsigned CoreTestBase_MockHandleInfo::GetCtorCallCount() const {
-  base::AutoLock locker(lock_);
-  return ctor_call_count_;
-}
-
-unsigned CoreTestBase_MockHandleInfo::GetDtorCallCount() const {
-  base::AutoLock locker(lock_);
-  return dtor_call_count_;
-}
-
-unsigned CoreTestBase_MockHandleInfo::GetCloseCallCount() const {
-  base::AutoLock locker(lock_);
-  return close_call_count_;
-}
-
-unsigned CoreTestBase_MockHandleInfo::GetWriteMessageCallCount() const {
-  base::AutoLock locker(lock_);
-  return write_message_call_count_;
-}
-
-unsigned CoreTestBase_MockHandleInfo::GetReadMessageCallCount() const {
-  base::AutoLock locker(lock_);
-  return read_message_call_count_;
-}
-
-unsigned CoreTestBase_MockHandleInfo::GetWriteDataCallCount() const {
-  base::AutoLock locker(lock_);
-  return write_data_call_count_;
-}
-
-unsigned CoreTestBase_MockHandleInfo::GetBeginWriteDataCallCount() const {
-  base::AutoLock locker(lock_);
-  return begin_write_data_call_count_;
-}
-
-unsigned CoreTestBase_MockHandleInfo::GetEndWriteDataCallCount() const {
-  base::AutoLock locker(lock_);
-  return end_write_data_call_count_;
-}
-
-unsigned CoreTestBase_MockHandleInfo::GetReadDataCallCount() const {
-  base::AutoLock locker(lock_);
-  return read_data_call_count_;
-}
-
-unsigned CoreTestBase_MockHandleInfo::GetBeginReadDataCallCount() const {
-  base::AutoLock locker(lock_);
-  return begin_read_data_call_count_;
-}
-
-unsigned CoreTestBase_MockHandleInfo::GetEndReadDataCallCount() const {
-  base::AutoLock locker(lock_);
-  return end_read_data_call_count_;
-}
-
-void CoreTestBase_MockHandleInfo::IncrementCtorCallCount() {
-  base::AutoLock locker(lock_);
-  ctor_call_count_++;
-}
-
-void CoreTestBase_MockHandleInfo::IncrementDtorCallCount() {
-  base::AutoLock locker(lock_);
-  dtor_call_count_++;
-}
-
-void CoreTestBase_MockHandleInfo::IncrementCloseCallCount() {
-  base::AutoLock locker(lock_);
-  close_call_count_++;
-}
-
-void CoreTestBase_MockHandleInfo::IncrementWriteMessageCallCount() {
-  base::AutoLock locker(lock_);
-  write_message_call_count_++;
-}
-
-void CoreTestBase_MockHandleInfo::IncrementReadMessageCallCount() {
-  base::AutoLock locker(lock_);
-  read_message_call_count_++;
-}
-
-void CoreTestBase_MockHandleInfo::IncrementWriteDataCallCount() {
-  base::AutoLock locker(lock_);
-  write_data_call_count_++;
-}
-
-void CoreTestBase_MockHandleInfo::IncrementBeginWriteDataCallCount() {
-  base::AutoLock locker(lock_);
-  begin_write_data_call_count_++;
-}
-
-void CoreTestBase_MockHandleInfo::IncrementEndWriteDataCallCount() {
-  base::AutoLock locker(lock_);
-  end_write_data_call_count_++;
-}
-
-void CoreTestBase_MockHandleInfo::IncrementReadDataCallCount() {
-  base::AutoLock locker(lock_);
-  read_data_call_count_++;
-}
-
-void CoreTestBase_MockHandleInfo::IncrementBeginReadDataCallCount() {
-  base::AutoLock locker(lock_);
-  begin_read_data_call_count_++;
-}
-
-void CoreTestBase_MockHandleInfo::IncrementEndReadDataCallCount() {
-  base::AutoLock locker(lock_);
-  end_read_data_call_count_++;
-}
-
-}  // namespace test
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/core_test_base.h b/mojo/edk/system/core_test_base.h
deleted file mode 100644
index 3d156e3..0000000
--- a/mojo/edk/system/core_test_base.h
+++ /dev/null
@@ -1,94 +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 MOJO_EDK_SYSTEM_CORE_TEST_BASE_H_
-#define MOJO_EDK_SYSTEM_CORE_TEST_BASE_H_
-
-#include <stddef.h>
-
-#include "base/macros.h"
-#include "base/synchronization/lock.h"
-#include "mojo/edk/embedder/embedder_internal.h"
-#include "mojo/edk/system/test_utils.h"
-#include "mojo/public/c/system/types.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace edk {
-
-class Core;
-
-namespace test {
-
-class CoreTestBase_MockHandleInfo;
-
-class CoreTestBase : public testing::Test {
- public:
-  using MockHandleInfo = CoreTestBase_MockHandleInfo;
-
-  CoreTestBase();
-  ~CoreTestBase() override;
-
- protected:
-  // |info| must remain alive until the returned handle is closed.
-  MojoHandle CreateMockHandle(MockHandleInfo* info);
-
-  Core* core();
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(CoreTestBase);
-};
-
-class CoreTestBase_MockHandleInfo {
- public:
-  CoreTestBase_MockHandleInfo();
-  ~CoreTestBase_MockHandleInfo();
-
-  unsigned GetCtorCallCount() const;
-  unsigned GetDtorCallCount() const;
-  unsigned GetCloseCallCount() const;
-  unsigned GetWriteMessageCallCount() const;
-  unsigned GetReadMessageCallCount() const;
-  unsigned GetWriteDataCallCount() const;
-  unsigned GetBeginWriteDataCallCount() const;
-  unsigned GetEndWriteDataCallCount() const;
-  unsigned GetReadDataCallCount() const;
-  unsigned GetBeginReadDataCallCount() const;
-  unsigned GetEndReadDataCallCount() const;
-
-  // For use by |MockDispatcher|:
-  void IncrementCtorCallCount();
-  void IncrementDtorCallCount();
-  void IncrementCloseCallCount();
-  void IncrementWriteMessageCallCount();
-  void IncrementReadMessageCallCount();
-  void IncrementWriteDataCallCount();
-  void IncrementBeginWriteDataCallCount();
-  void IncrementEndWriteDataCallCount();
-  void IncrementReadDataCallCount();
-  void IncrementBeginReadDataCallCount();
-  void IncrementEndReadDataCallCount();
-
- private:
-  mutable base::Lock lock_;  // Protects the following members.
-  unsigned ctor_call_count_;
-  unsigned dtor_call_count_;
-  unsigned close_call_count_;
-  unsigned write_message_call_count_;
-  unsigned read_message_call_count_;
-  unsigned write_data_call_count_;
-  unsigned begin_write_data_call_count_;
-  unsigned end_write_data_call_count_;
-  unsigned read_data_call_count_;
-  unsigned begin_read_data_call_count_;
-  unsigned end_read_data_call_count_;
-
-  DISALLOW_COPY_AND_ASSIGN(CoreTestBase_MockHandleInfo);
-};
-
-}  // namespace test
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_CORE_TEST_BASE_H_
diff --git a/mojo/edk/system/core_unittest.cc b/mojo/edk/system/core_unittest.cc
deleted file mode 100644
index 0d60b48..0000000
--- a/mojo/edk/system/core_unittest.cc
+++ /dev/null
@@ -1,971 +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 "mojo/edk/system/core.h"
-
-#include <stdint.h>
-
-#include <limits>
-
-#include "base/bind.h"
-#include "mojo/edk/embedder/embedder_internal.h"
-#include "mojo/edk/system/core_test_base.h"
-#include "mojo/edk/system/test_utils.h"
-#include "mojo/public/cpp/system/wait.h"
-
-#if defined(OS_WIN)
-#include "base/win/windows_version.h"
-#endif
-
-namespace mojo {
-namespace edk {
-namespace {
-
-const MojoHandleSignalsState kEmptyMojoHandleSignalsState = {0u, 0u};
-const MojoHandleSignalsState kFullMojoHandleSignalsState = {~0u, ~0u};
-const MojoHandleSignals kAllSignals = MOJO_HANDLE_SIGNAL_READABLE |
-                                      MOJO_HANDLE_SIGNAL_WRITABLE |
-                                      MOJO_HANDLE_SIGNAL_PEER_CLOSED;
-
-using CoreTest = test::CoreTestBase;
-
-TEST_F(CoreTest, GetTimeTicksNow) {
-  const MojoTimeTicks start = core()->GetTimeTicksNow();
-  ASSERT_NE(static_cast<MojoTimeTicks>(0), start)
-      << "GetTimeTicksNow should return nonzero value";
-  test::Sleep(test::DeadlineFromMilliseconds(15));
-  const MojoTimeTicks finish = core()->GetTimeTicksNow();
-  // Allow for some fuzz in sleep.
-  ASSERT_GE((finish - start), static_cast<MojoTimeTicks>(8000))
-      << "Sleeping should result in increasing time ticks";
-}
-
-TEST_F(CoreTest, Basic) {
-  MockHandleInfo info;
-
-  ASSERT_EQ(0u, info.GetCtorCallCount());
-  MojoHandle h = CreateMockHandle(&info);
-  ASSERT_EQ(1u, info.GetCtorCallCount());
-  ASSERT_NE(h, MOJO_HANDLE_INVALID);
-
-  ASSERT_EQ(0u, info.GetWriteMessageCallCount());
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->WriteMessage(h, nullptr, 0, nullptr, 0,
-                                 MOJO_WRITE_MESSAGE_FLAG_NONE));
-  ASSERT_EQ(1u, info.GetWriteMessageCallCount());
-
-  ASSERT_EQ(0u, info.GetReadMessageCallCount());
-  uint32_t num_bytes = 0;
-  ASSERT_EQ(
-      MOJO_RESULT_OK,
-      core()->ReadMessage(h, nullptr, &num_bytes, nullptr, nullptr,
-                          MOJO_READ_MESSAGE_FLAG_NONE));
-  ASSERT_EQ(1u, info.GetReadMessageCallCount());
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->ReadMessage(h, nullptr, nullptr, nullptr, nullptr,
-                                MOJO_READ_MESSAGE_FLAG_NONE));
-  ASSERT_EQ(2u, info.GetReadMessageCallCount());
-
-  ASSERT_EQ(0u, info.GetWriteDataCallCount());
-  ASSERT_EQ(MOJO_RESULT_UNIMPLEMENTED,
-            core()->WriteData(h, nullptr, nullptr, MOJO_WRITE_DATA_FLAG_NONE));
-  ASSERT_EQ(1u, info.GetWriteDataCallCount());
-
-  ASSERT_EQ(0u, info.GetBeginWriteDataCallCount());
-  ASSERT_EQ(MOJO_RESULT_UNIMPLEMENTED,
-            core()->BeginWriteData(h, nullptr, nullptr,
-                                   MOJO_WRITE_DATA_FLAG_NONE));
-  ASSERT_EQ(1u, info.GetBeginWriteDataCallCount());
-
-  ASSERT_EQ(0u, info.GetEndWriteDataCallCount());
-  ASSERT_EQ(MOJO_RESULT_UNIMPLEMENTED, core()->EndWriteData(h, 0));
-  ASSERT_EQ(1u, info.GetEndWriteDataCallCount());
-
-  ASSERT_EQ(0u, info.GetReadDataCallCount());
-  ASSERT_EQ(MOJO_RESULT_UNIMPLEMENTED,
-            core()->ReadData(h, nullptr, nullptr, MOJO_READ_DATA_FLAG_NONE));
-  ASSERT_EQ(1u, info.GetReadDataCallCount());
-
-  ASSERT_EQ(0u, info.GetBeginReadDataCallCount());
-  ASSERT_EQ(MOJO_RESULT_UNIMPLEMENTED,
-            core()->BeginReadData(h, nullptr, nullptr,
-                                  MOJO_READ_DATA_FLAG_NONE));
-  ASSERT_EQ(1u, info.GetBeginReadDataCallCount());
-
-  ASSERT_EQ(0u, info.GetEndReadDataCallCount());
-  ASSERT_EQ(MOJO_RESULT_UNIMPLEMENTED, core()->EndReadData(h, 0));
-  ASSERT_EQ(1u, info.GetEndReadDataCallCount());
-
-  ASSERT_EQ(0u, info.GetDtorCallCount());
-  ASSERT_EQ(0u, info.GetCloseCallCount());
-  ASSERT_EQ(MOJO_RESULT_OK, core()->Close(h));
-  ASSERT_EQ(1u, info.GetCloseCallCount());
-  ASSERT_EQ(1u, info.GetDtorCallCount());
-}
-
-TEST_F(CoreTest, InvalidArguments) {
-  // |Close()|:
-  {
-    ASSERT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(MOJO_HANDLE_INVALID));
-    ASSERT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(10));
-    ASSERT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(1000000000));
-
-    // Test a double-close.
-    MockHandleInfo info;
-    MojoHandle h = CreateMockHandle(&info);
-    ASSERT_EQ(MOJO_RESULT_OK, core()->Close(h));
-    ASSERT_EQ(1u, info.GetCloseCallCount());
-    ASSERT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(h));
-    ASSERT_EQ(1u, info.GetCloseCallCount());
-  }
-
-  // |CreateMessagePipe()|: Nothing to check (apart from things that cause
-  // death).
-
-  // |WriteMessage()|:
-  // Only check arguments checked by |Core|, namely |handle|, |handles|, and
-  // |num_handles|.
-  {
-    ASSERT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-              core()->WriteMessage(MOJO_HANDLE_INVALID, nullptr, 0,
-                                   nullptr, 0, MOJO_WRITE_MESSAGE_FLAG_NONE));
-
-    MockHandleInfo info;
-    MojoHandle h = CreateMockHandle(&info);
-    MojoHandle handles[2] = {MOJO_HANDLE_INVALID, MOJO_HANDLE_INVALID};
-
-    // Huge handle count (implausibly big on some systems -- more than can be
-    // stored in a 32-bit address space).
-    // Note: This may return either |MOJO_RESULT_INVALID_ARGUMENT| or
-    // |MOJO_RESULT_RESOURCE_EXHAUSTED|, depending on whether it's plausible or
-    // not.
-    ASSERT_NE(
-        MOJO_RESULT_OK,
-        core()->WriteMessage(h, nullptr, 0, handles,
-                             std::numeric_limits<uint32_t>::max(),
-                             MOJO_WRITE_MESSAGE_FLAG_NONE));
-    ASSERT_EQ(0u, info.GetWriteMessageCallCount());
-
-    // Null |bytes| with non-zero message size.
-    ASSERT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-              core()->WriteMessage(h, nullptr, 1, nullptr, 0,
-                                   MOJO_WRITE_MESSAGE_FLAG_NONE));
-    ASSERT_EQ(0u, info.GetWriteMessageCallCount());
-
-    // Null |handles| with non-zero handle count.
-    ASSERT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-              core()->WriteMessage(h, nullptr, 0, nullptr, 1,
-                                   MOJO_WRITE_MESSAGE_FLAG_NONE));
-    ASSERT_EQ(0u, info.GetWriteMessageCallCount());
-
-    // Huge handle count (plausibly big).
-    ASSERT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED,
-              core()->WriteMessage(
-                  h, nullptr, 0, handles,
-                  std::numeric_limits<uint32_t>::max() / sizeof(handles[0]),
-                  MOJO_WRITE_MESSAGE_FLAG_NONE));
-    ASSERT_EQ(0u, info.GetWriteMessageCallCount());
-
-    // Invalid handle in |handles|.
-    ASSERT_EQ(
-        MOJO_RESULT_INVALID_ARGUMENT,
-        core()->WriteMessage(h, nullptr, 0, handles, 1,
-                             MOJO_WRITE_MESSAGE_FLAG_NONE));
-    ASSERT_EQ(0u, info.GetWriteMessageCallCount());
-
-    // Two invalid handles in |handles|.
-    ASSERT_EQ(
-        MOJO_RESULT_INVALID_ARGUMENT,
-        core()->WriteMessage(h, nullptr, 0, handles, 2,
-                             MOJO_WRITE_MESSAGE_FLAG_NONE));
-    ASSERT_EQ(0u, info.GetWriteMessageCallCount());
-
-    // Can't send a handle over itself. Note that this will also cause |h| to be
-    // closed.
-    handles[0] = h;
-    ASSERT_EQ(
-        MOJO_RESULT_INVALID_ARGUMENT,
-        core()->WriteMessage(h, nullptr, 0, handles, 1,
-                             MOJO_WRITE_MESSAGE_FLAG_NONE));
-    ASSERT_EQ(0u, info.GetWriteMessageCallCount());
-
-    h = CreateMockHandle(&info);
-
-    MockHandleInfo info2;
-
-    // This is "okay", but |MockDispatcher| doesn't implement it.
-    handles[0] = CreateMockHandle(&info2);
-    ASSERT_EQ(
-        MOJO_RESULT_UNIMPLEMENTED,
-        core()->WriteMessage(h, nullptr, 0, handles, 1,
-                             MOJO_WRITE_MESSAGE_FLAG_NONE));
-    ASSERT_EQ(1u, info.GetWriteMessageCallCount());
-
-    // One of the |handles| is still invalid.
-    handles[0] = CreateMockHandle(&info2);
-    ASSERT_EQ(
-        MOJO_RESULT_INVALID_ARGUMENT,
-        core()->WriteMessage(h, nullptr, 0, handles, 2,
-                             MOJO_WRITE_MESSAGE_FLAG_NONE));
-    ASSERT_EQ(1u, info.GetWriteMessageCallCount());
-
-    // One of the |handles| is the same as |h|. Both handles are closed.
-    handles[0] = CreateMockHandle(&info2);
-    handles[1] = h;
-    ASSERT_EQ(
-        MOJO_RESULT_INVALID_ARGUMENT,
-        core()->WriteMessage(h, nullptr, 0, handles, 2,
-                             MOJO_WRITE_MESSAGE_FLAG_NONE));
-    ASSERT_EQ(1u, info.GetWriteMessageCallCount());
-
-    h = CreateMockHandle(&info);
-
-    // Can't send a handle twice in the same message.
-    handles[0] = CreateMockHandle(&info2);
-    handles[1] = handles[0];
-    ASSERT_EQ(
-        MOJO_RESULT_BUSY,
-        core()->WriteMessage(h, nullptr, 0, handles, 2,
-                             MOJO_WRITE_MESSAGE_FLAG_NONE));
-    ASSERT_EQ(1u, info.GetWriteMessageCallCount());
-
-    ASSERT_EQ(MOJO_RESULT_OK, core()->Close(h));
-  }
-
-  // |ReadMessage()|:
-  // Only check arguments checked by |Core|, namely |handle|, |handles|, and
-  // |num_handles|.
-  {
-    ASSERT_EQ(
-        MOJO_RESULT_INVALID_ARGUMENT,
-        core()->ReadMessage(MOJO_HANDLE_INVALID, nullptr, nullptr, nullptr,
-                            nullptr, MOJO_READ_MESSAGE_FLAG_NONE));
-
-    MockHandleInfo info;
-    MojoHandle h = CreateMockHandle(&info);
-
-    // Okay.
-    uint32_t handle_count = 0;
-    ASSERT_EQ(MOJO_RESULT_OK,
-              core()->ReadMessage(
-                  h, nullptr, nullptr, nullptr, &handle_count,
-                  MOJO_READ_MESSAGE_FLAG_NONE));
-    // Checked by |Core|, shouldn't go through to the dispatcher.
-    ASSERT_EQ(1u, info.GetReadMessageCallCount());
-
-    ASSERT_EQ(MOJO_RESULT_OK, core()->Close(h));
-  }
-}
-
-// These test invalid arguments that should cause death if we're being paranoid
-// about checking arguments (which we would want to do if, e.g., we were in a
-// true "kernel" situation, but we might not want to do otherwise for
-// performance reasons). Probably blatant errors like passing in null pointers
-// (for required pointer arguments) will still cause death, but perhaps not
-// predictably.
-TEST_F(CoreTest, InvalidArgumentsDeath) {
-#if defined(OFFICIAL_BUILD)
-  const char kMemoryCheckFailedRegex[] = "";
-#else
-  const char kMemoryCheckFailedRegex[] = "Check failed";
-#endif
-
-  // |CreateMessagePipe()|:
-  {
-    MojoHandle h;
-    ASSERT_DEATH_IF_SUPPORTED(
-        core()->CreateMessagePipe(nullptr, nullptr, nullptr),
-        kMemoryCheckFailedRegex);
-    ASSERT_DEATH_IF_SUPPORTED(
-        core()->CreateMessagePipe(nullptr, &h, nullptr),
-        kMemoryCheckFailedRegex);
-    ASSERT_DEATH_IF_SUPPORTED(
-        core()->CreateMessagePipe(nullptr, nullptr, &h),
-        kMemoryCheckFailedRegex);
-  }
-
-  // |ReadMessage()|:
-  // Only check arguments checked by |Core|, namely |handle|, |handles|, and
-  // |num_handles|.
-  {
-    MockHandleInfo info;
-    MojoHandle h = CreateMockHandle(&info);
-
-    uint32_t handle_count = 1;
-    ASSERT_DEATH_IF_SUPPORTED(
-        core()->ReadMessage(h, nullptr, nullptr, nullptr, &handle_count,
-                            MOJO_READ_MESSAGE_FLAG_NONE),
-        kMemoryCheckFailedRegex);
-
-    ASSERT_EQ(MOJO_RESULT_OK, core()->Close(h));
-  }
-}
-
-TEST_F(CoreTest, MessagePipe) {
-  MojoHandle h[2];
-  MojoHandleSignalsState hss[2];
-
-  ASSERT_EQ(MOJO_RESULT_OK, core()->CreateMessagePipe(nullptr, &h[0], &h[1]));
-  // Should get two distinct, valid handles.
-  ASSERT_NE(h[0], MOJO_HANDLE_INVALID);
-  ASSERT_NE(h[1], MOJO_HANDLE_INVALID);
-  ASSERT_NE(h[0], h[1]);
-
-  // Neither should be readable.
-  hss[0] = kEmptyMojoHandleSignalsState;
-  hss[1] = kEmptyMojoHandleSignalsState;
-  EXPECT_EQ(MOJO_RESULT_OK, core()->QueryHandleSignalsState(h[0], &hss[0]));
-  EXPECT_EQ(MOJO_RESULT_OK, core()->QueryHandleSignalsState(h[1], &hss[1]));
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss[0].satisfied_signals);
-  ASSERT_EQ(kAllSignals, hss[0].satisfiable_signals);
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss[1].satisfied_signals);
-  ASSERT_EQ(kAllSignals, hss[1].satisfiable_signals);
-
-  // Try to read anyway.
-  char buffer[1] = {'a'};
-  uint32_t buffer_size = 1;
-  ASSERT_EQ(
-      MOJO_RESULT_SHOULD_WAIT,
-      core()->ReadMessage(h[0], buffer, &buffer_size, nullptr, nullptr,
-                          MOJO_READ_MESSAGE_FLAG_NONE));
-  // Check that it left its inputs alone.
-  ASSERT_EQ('a', buffer[0]);
-  ASSERT_EQ(1u, buffer_size);
-
-  // Write to |h[1]|.
-  buffer[0] = 'b';
-  ASSERT_EQ(
-      MOJO_RESULT_OK,
-      core()->WriteMessage(h[1], buffer, 1, nullptr, 0,
-                           MOJO_WRITE_MESSAGE_FLAG_NONE));
-
-  // Wait for |h[0]| to become readable.
-  EXPECT_EQ(MOJO_RESULT_OK, mojo::Wait(mojo::Handle(h[0]),
-                                       MOJO_HANDLE_SIGNAL_READABLE, &hss[0]));
-
-  // Read from |h[0]|.
-  // First, get only the size.
-  buffer_size = 0;
-  ASSERT_EQ(
-      MOJO_RESULT_RESOURCE_EXHAUSTED,
-      core()->ReadMessage(h[0], nullptr, &buffer_size, nullptr, nullptr,
-                          MOJO_READ_MESSAGE_FLAG_NONE));
-  ASSERT_EQ(1u, buffer_size);
-  // Then actually read it.
-  buffer[0] = 'c';
-  buffer_size = 1;
-  ASSERT_EQ(
-      MOJO_RESULT_OK,
-      core()->ReadMessage(h[0], buffer, &buffer_size, nullptr, nullptr,
-                          MOJO_READ_MESSAGE_FLAG_NONE));
-  ASSERT_EQ('b', buffer[0]);
-  ASSERT_EQ(1u, buffer_size);
-
-  // |h[0]| should no longer be readable.
-  hss[0] = kEmptyMojoHandleSignalsState;
-  EXPECT_EQ(MOJO_RESULT_OK, core()->QueryHandleSignalsState(h[0], &hss[0]));
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss[0].satisfied_signals);
-  ASSERT_EQ(kAllSignals, hss[0].satisfiable_signals);
-
-  // Write to |h[0]|.
-  buffer[0] = 'd';
-  ASSERT_EQ(
-      MOJO_RESULT_OK,
-      core()->WriteMessage(h[0], buffer, 1, nullptr, 0,
-                           MOJO_WRITE_MESSAGE_FLAG_NONE));
-
-  // Close |h[0]|.
-  ASSERT_EQ(MOJO_RESULT_OK, core()->Close(h[0]));
-
-  // Wait for |h[1]| to learn about the other end's closure.
-  EXPECT_EQ(
-      MOJO_RESULT_OK,
-      mojo::Wait(mojo::Handle(h[1]), MOJO_HANDLE_SIGNAL_PEER_CLOSED, &hss[1]));
-
-  // Check that |h[1]| is no longer writable (and will never be).
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-            hss[1].satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-            hss[1].satisfiable_signals);
-
-  // Check that |h[1]| is still readable (for the moment).
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-            hss[1].satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-            hss[1].satisfiable_signals);
-
-  // Discard a message from |h[1]|.
-  ASSERT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED,
-            core()->ReadMessage(h[1], nullptr, nullptr, nullptr, nullptr,
-                                MOJO_READ_MESSAGE_FLAG_MAY_DISCARD));
-
-  // |h[1]| is no longer readable (and will never be).
-  hss[1] = kFullMojoHandleSignalsState;
-  EXPECT_EQ(MOJO_RESULT_OK, core()->QueryHandleSignalsState(h[1], &hss[1]));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss[1].satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss[1].satisfiable_signals);
-
-  // Try writing to |h[1]|.
-  buffer[0] = 'e';
-  ASSERT_EQ(
-      MOJO_RESULT_FAILED_PRECONDITION,
-      core()->WriteMessage(h[1], buffer, 1, nullptr, 0,
-                           MOJO_WRITE_MESSAGE_FLAG_NONE));
-
-  ASSERT_EQ(MOJO_RESULT_OK, core()->Close(h[1]));
-}
-
-// Tests passing a message pipe handle.
-TEST_F(CoreTest, MessagePipeBasicLocalHandlePassing1) {
-  const char kHello[] = "hello";
-  const uint32_t kHelloSize = static_cast<uint32_t>(sizeof(kHello));
-  const char kWorld[] = "world!!!";
-  const uint32_t kWorldSize = static_cast<uint32_t>(sizeof(kWorld));
-  char buffer[100];
-  const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer));
-  uint32_t num_bytes;
-  MojoHandle handles[10];
-  uint32_t num_handles;
-  MojoHandleSignalsState hss;
-  MojoHandle h_received;
-
-  MojoHandle h_passing[2];
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->CreateMessagePipe(nullptr, &h_passing[0], &h_passing[1]));
-
-  // Make sure that |h_passing[]| work properly.
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->WriteMessage(h_passing[0], kHello, kHelloSize, nullptr, 0,
-                                 MOJO_WRITE_MESSAGE_FLAG_NONE));
-  hss = kEmptyMojoHandleSignalsState;
-  EXPECT_EQ(MOJO_RESULT_OK, mojo::Wait(mojo::Handle(h_passing[1]),
-                                       MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
-            hss.satisfied_signals);
-  ASSERT_EQ(kAllSignals, hss.satisfiable_signals);
-  num_bytes = kBufferSize;
-  num_handles = arraysize(handles);
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->ReadMessage(
-                h_passing[1], buffer, &num_bytes, handles, &num_handles,
-                MOJO_READ_MESSAGE_FLAG_NONE));
-  ASSERT_EQ(kHelloSize, num_bytes);
-  ASSERT_STREQ(kHello, buffer);
-  ASSERT_EQ(0u, num_handles);
-
-  // Make sure that you can't pass either of the message pipe's handles over
-  // itself.
-  ASSERT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            core()->WriteMessage(h_passing[0], kHello, kHelloSize,
-                                 &h_passing[0], 1,
-                                 MOJO_WRITE_MESSAGE_FLAG_NONE));
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->CreateMessagePipe(nullptr, &h_passing[0], &h_passing[1]));
-
-  ASSERT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            core()->WriteMessage(h_passing[0], kHello, kHelloSize,
-                                 &h_passing[1], 1,
-                                 MOJO_WRITE_MESSAGE_FLAG_NONE));
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->CreateMessagePipe(nullptr, &h_passing[0], &h_passing[1]));
-
-  MojoHandle h_passed[2];
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->CreateMessagePipe(nullptr, &h_passed[0], &h_passed[1]));
-
-  // Make sure that |h_passed[]| work properly.
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->WriteMessage(h_passed[0], kHello, kHelloSize, nullptr, 0,
-                                 MOJO_WRITE_MESSAGE_FLAG_NONE));
-  hss = kEmptyMojoHandleSignalsState;
-  ASSERT_EQ(MOJO_RESULT_OK, mojo::Wait(mojo::Handle(h_passed[1]),
-                                       MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
-            hss.satisfied_signals);
-  ASSERT_EQ(kAllSignals, hss.satisfiable_signals);
-  num_bytes = kBufferSize;
-  num_handles = arraysize(handles);
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->ReadMessage(
-                h_passed[1], buffer, &num_bytes, handles, &num_handles,
-                MOJO_READ_MESSAGE_FLAG_NONE));
-  ASSERT_EQ(kHelloSize, num_bytes);
-  ASSERT_STREQ(kHello, buffer);
-  ASSERT_EQ(0u, num_handles);
-
-  // Send |h_passed[1]| from |h_passing[0]| to |h_passing[1]|.
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->WriteMessage(h_passing[0], kWorld, kWorldSize,
-                                 &h_passed[1], 1,
-                                 MOJO_WRITE_MESSAGE_FLAG_NONE));
-  hss = kEmptyMojoHandleSignalsState;
-  ASSERT_EQ(MOJO_RESULT_OK, mojo::Wait(mojo::Handle(h_passing[1]),
-                                       MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
-            hss.satisfied_signals);
-  ASSERT_EQ(kAllSignals, hss.satisfiable_signals);
-  num_bytes = kBufferSize;
-  num_handles = arraysize(handles);
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->ReadMessage(
-                h_passing[1], buffer, &num_bytes, handles, &num_handles,
-                MOJO_READ_MESSAGE_FLAG_NONE));
-  ASSERT_EQ(kWorldSize, num_bytes);
-  ASSERT_STREQ(kWorld, buffer);
-  ASSERT_EQ(1u, num_handles);
-  h_received = handles[0];
-  ASSERT_NE(h_received, MOJO_HANDLE_INVALID);
-  ASSERT_NE(h_received, h_passing[0]);
-  ASSERT_NE(h_received, h_passing[1]);
-  ASSERT_NE(h_received, h_passed[0]);
-
-  // Note: We rely on the Mojo system not re-using handle values very often.
-  ASSERT_NE(h_received, h_passed[1]);
-
-  // |h_passed[1]| should no longer be valid; check that trying to close it
-  // fails. See above note.
-  ASSERT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(h_passed[1]));
-
-  // Write to |h_passed[0]|. Should receive on |h_received|.
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->WriteMessage(h_passed[0], kHello, kHelloSize, nullptr, 0,
-                                 MOJO_WRITE_MESSAGE_FLAG_NONE));
-  hss = kEmptyMojoHandleSignalsState;
-  ASSERT_EQ(MOJO_RESULT_OK, mojo::Wait(mojo::Handle(h_received),
-                                       MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
-            hss.satisfied_signals);
-  ASSERT_EQ(kAllSignals, hss.satisfiable_signals);
-  num_bytes = kBufferSize;
-  num_handles = arraysize(handles);
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->ReadMessage(
-                h_received, buffer, &num_bytes, handles, &num_handles,
-                MOJO_READ_MESSAGE_FLAG_NONE));
-  ASSERT_EQ(kHelloSize, num_bytes);
-  ASSERT_STREQ(kHello, buffer);
-  ASSERT_EQ(0u, num_handles);
-
-  ASSERT_EQ(MOJO_RESULT_OK, core()->Close(h_passing[0]));
-  ASSERT_EQ(MOJO_RESULT_OK, core()->Close(h_passing[1]));
-  ASSERT_EQ(MOJO_RESULT_OK, core()->Close(h_passed[0]));
-  ASSERT_EQ(MOJO_RESULT_OK, core()->Close(h_received));
-}
-
-TEST_F(CoreTest, DataPipe) {
-  MojoHandle ph, ch;  // p is for producer and c is for consumer.
-  MojoHandleSignalsState hss;
-
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->CreateDataPipe(nullptr, &ph, &ch));
-  // Should get two distinct, valid handles.
-  ASSERT_NE(ph, MOJO_HANDLE_INVALID);
-  ASSERT_NE(ch, MOJO_HANDLE_INVALID);
-  ASSERT_NE(ph, ch);
-
-  // Producer should be never-readable, but already writable.
-  hss = kEmptyMojoHandleSignalsState;
-  EXPECT_EQ(MOJO_RESULT_OK, core()->QueryHandleSignalsState(ph, &hss));
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-            hss.satisfiable_signals);
-
-  // Consumer should be never-writable, and not yet readable.
-  hss = kFullMojoHandleSignalsState;
-  EXPECT_EQ(MOJO_RESULT_OK, core()->QueryHandleSignalsState(ch, &hss));
-  EXPECT_EQ(0u, hss.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfiable_signals);
-
-  // Write.
-  signed char elements[2] = {'A', 'B'};
-  uint32_t num_bytes = 2u;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->WriteData(ph, elements, &num_bytes,
-                              MOJO_WRITE_DATA_FLAG_NONE));
-  ASSERT_EQ(2u, num_bytes);
-
-  // Wait for the data to arrive to the consumer.
-  EXPECT_EQ(MOJO_RESULT_OK,
-            mojo::Wait(mojo::Handle(ch), MOJO_HANDLE_SIGNAL_READABLE, &hss));
-
-  // Consumer should now be readable.
-  hss = kEmptyMojoHandleSignalsState;
-  EXPECT_EQ(MOJO_RESULT_OK, core()->QueryHandleSignalsState(ch, &hss));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfiable_signals);
-
-  // Peek one character.
-  elements[0] = -1;
-  elements[1] = -1;
-  num_bytes = 1u;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->ReadData(
-                ch, elements, &num_bytes,
-                MOJO_READ_DATA_FLAG_NONE | MOJO_READ_DATA_FLAG_PEEK));
-  ASSERT_EQ('A', elements[0]);
-  ASSERT_EQ(-1, elements[1]);
-
-  // Read one character.
-  elements[0] = -1;
-  elements[1] = -1;
-  num_bytes = 1u;
-  ASSERT_EQ(MOJO_RESULT_OK, core()->ReadData(ch, elements, &num_bytes,
-                                             MOJO_READ_DATA_FLAG_NONE));
-  ASSERT_EQ('A', elements[0]);
-  ASSERT_EQ(-1, elements[1]);
-
-  // Two-phase write.
-  void* write_ptr = nullptr;
-  num_bytes = 0u;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->BeginWriteData(ph, &write_ptr, &num_bytes,
-                                   MOJO_WRITE_DATA_FLAG_NONE));
-  // We count on the default options providing a decent buffer size.
-  ASSERT_GE(num_bytes, 3u);
-
-  // Trying to do a normal write during a two-phase write should fail.
-  elements[0] = 'X';
-  num_bytes = 1u;
-  ASSERT_EQ(MOJO_RESULT_BUSY,
-            core()->WriteData(ph, elements, &num_bytes,
-                              MOJO_WRITE_DATA_FLAG_NONE));
-
-  // Actually write the data, and complete it now.
-  static_cast<char*>(write_ptr)[0] = 'C';
-  static_cast<char*>(write_ptr)[1] = 'D';
-  static_cast<char*>(write_ptr)[2] = 'E';
-  ASSERT_EQ(MOJO_RESULT_OK, core()->EndWriteData(ph, 3u));
-
-  // Wait for the data to arrive to the consumer.
-  ASSERT_EQ(MOJO_RESULT_OK,
-            mojo::Wait(mojo::Handle(ch), MOJO_HANDLE_SIGNAL_READABLE, &hss));
-
-  // Query how much data we have.
-  num_bytes = 0;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->ReadData(ch, nullptr, &num_bytes,
-                             MOJO_READ_DATA_FLAG_QUERY));
-  ASSERT_GE(num_bytes, 1u);
-
-  // Try to query with peek. Should fail.
-  num_bytes = 0;
-  ASSERT_EQ(
-      MOJO_RESULT_INVALID_ARGUMENT,
-      core()->ReadData(ch, nullptr, &num_bytes,
-                       MOJO_READ_DATA_FLAG_QUERY | MOJO_READ_DATA_FLAG_PEEK));
-  ASSERT_EQ(0u, num_bytes);
-
-  // Try to discard ten characters, in all-or-none mode. Should fail.
-  num_bytes = 10;
-  ASSERT_EQ(MOJO_RESULT_OUT_OF_RANGE,
-            core()->ReadData(
-                ch, nullptr, &num_bytes,
-                MOJO_READ_DATA_FLAG_DISCARD | MOJO_READ_DATA_FLAG_ALL_OR_NONE));
-
-  // Try to discard two characters, in peek mode. Should fail.
-  num_bytes = 2;
-  ASSERT_EQ(
-      MOJO_RESULT_INVALID_ARGUMENT,
-      core()->ReadData(ch, nullptr, &num_bytes,
-                       MOJO_READ_DATA_FLAG_DISCARD | MOJO_READ_DATA_FLAG_PEEK));
-
-  // Discard a character.
-  num_bytes = 1;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->ReadData(
-                ch, nullptr, &num_bytes,
-                MOJO_READ_DATA_FLAG_DISCARD | MOJO_READ_DATA_FLAG_ALL_OR_NONE));
-
-  // Ensure the 3 bytes were read.
-  ASSERT_EQ(MOJO_RESULT_OK,
-            mojo::Wait(mojo::Handle(ch), MOJO_HANDLE_SIGNAL_READABLE, &hss));
-
-  // Try a two-phase read of the remaining three bytes with peek. Should fail.
-  const void* read_ptr = nullptr;
-  num_bytes = 3;
-  ASSERT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            core()->BeginReadData(ch, &read_ptr, &num_bytes,
-                                  MOJO_READ_DATA_FLAG_PEEK));
-
-  // Read the remaining two characters, in two-phase mode (all-or-none).
-  num_bytes = 3;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->BeginReadData(ch, &read_ptr, &num_bytes,
-                                  MOJO_READ_DATA_FLAG_ALL_OR_NONE));
-  // Note: Count on still being able to do the contiguous read here.
-  ASSERT_EQ(3u, num_bytes);
-
-  // Discarding right now should fail.
-  num_bytes = 1;
-  ASSERT_EQ(MOJO_RESULT_BUSY,
-            core()->ReadData(ch, nullptr, &num_bytes,
-                             MOJO_READ_DATA_FLAG_DISCARD));
-
-  // Actually check our data and end the two-phase read.
-  ASSERT_EQ('C', static_cast<const char*>(read_ptr)[0]);
-  ASSERT_EQ('D', static_cast<const char*>(read_ptr)[1]);
-  ASSERT_EQ('E', static_cast<const char*>(read_ptr)[2]);
-  ASSERT_EQ(MOJO_RESULT_OK, core()->EndReadData(ch, 3u));
-
-  // Consumer should now be no longer readable.
-  hss = kFullMojoHandleSignalsState;
-  EXPECT_EQ(MOJO_RESULT_OK, core()->QueryHandleSignalsState(ch, &hss));
-  EXPECT_EQ(0u, hss.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfiable_signals);
-
-  // TODO(vtl): More.
-
-  // Close the producer.
-  ASSERT_EQ(MOJO_RESULT_OK, core()->Close(ph));
-
-  // Wait for this to get to the consumer.
-  EXPECT_EQ(MOJO_RESULT_OK,
-            mojo::Wait(mojo::Handle(ch), MOJO_HANDLE_SIGNAL_PEER_CLOSED, &hss));
-
-  // The consumer should now be never-readable.
-  hss = kFullMojoHandleSignalsState;
-  EXPECT_EQ(MOJO_RESULT_OK, core()->QueryHandleSignalsState(ch, &hss));
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals);
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals);
-
-  ASSERT_EQ(MOJO_RESULT_OK, core()->Close(ch));
-}
-
-// Tests passing data pipe producer and consumer handles.
-TEST_F(CoreTest, MessagePipeBasicLocalHandlePassing2) {
-  const char kHello[] = "hello";
-  const uint32_t kHelloSize = static_cast<uint32_t>(sizeof(kHello));
-  const char kWorld[] = "world!!!";
-  const uint32_t kWorldSize = static_cast<uint32_t>(sizeof(kWorld));
-  char buffer[100];
-  const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer));
-  uint32_t num_bytes;
-  MojoHandle handles[10];
-  uint32_t num_handles;
-  MojoHandleSignalsState hss;
-
-  MojoHandle h_passing[2];
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->CreateMessagePipe(nullptr, &h_passing[0], &h_passing[1]));
-
-  MojoHandle ph, ch;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->CreateDataPipe(nullptr, &ph, &ch));
-
-  // Send |ch| from |h_passing[0]| to |h_passing[1]|.
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->WriteMessage(h_passing[0], kHello, kHelloSize, &ch, 1,
-                                 MOJO_WRITE_MESSAGE_FLAG_NONE));
-  hss = kEmptyMojoHandleSignalsState;
-  ASSERT_EQ(MOJO_RESULT_OK, mojo::Wait(mojo::Handle(h_passing[1]),
-                                       MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
-            hss.satisfied_signals);
-  ASSERT_EQ(kAllSignals, hss.satisfiable_signals);
-  num_bytes = kBufferSize;
-  num_handles = arraysize(handles);
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->ReadMessage(
-                h_passing[1], buffer, &num_bytes, handles, &num_handles,
-                MOJO_READ_MESSAGE_FLAG_NONE));
-  ASSERT_EQ(kHelloSize, num_bytes);
-  ASSERT_STREQ(kHello, buffer);
-  ASSERT_EQ(1u, num_handles);
-  MojoHandle ch_received = handles[0];
-  ASSERT_NE(ch_received, MOJO_HANDLE_INVALID);
-  ASSERT_NE(ch_received, h_passing[0]);
-  ASSERT_NE(ch_received, h_passing[1]);
-  ASSERT_NE(ch_received, ph);
-
-  // Note: We rely on the Mojo system not re-using handle values very often.
-  ASSERT_NE(ch_received, ch);
-
-  // |ch| should no longer be valid; check that trying to close it fails. See
-  // above note.
-  ASSERT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(ch));
-
-  // Write to |ph|. Should receive on |ch_received|.
-  num_bytes = kWorldSize;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->WriteData(ph, kWorld, &num_bytes,
-                              MOJO_WRITE_DATA_FLAG_ALL_OR_NONE));
-  hss = kEmptyMojoHandleSignalsState;
-  EXPECT_EQ(MOJO_RESULT_OK, mojo::Wait(mojo::Handle(ch_received),
-                                       MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfiable_signals);
-  num_bytes = kBufferSize;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->ReadData(ch_received, buffer, &num_bytes,
-                             MOJO_READ_MESSAGE_FLAG_NONE));
-  ASSERT_EQ(kWorldSize, num_bytes);
-  ASSERT_STREQ(kWorld, buffer);
-
-  // Now pass |ph| in the same direction.
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->WriteMessage(h_passing[0], kWorld, kWorldSize, &ph, 1,
-                                 MOJO_WRITE_MESSAGE_FLAG_NONE));
-  hss = kEmptyMojoHandleSignalsState;
-  ASSERT_EQ(MOJO_RESULT_OK, mojo::Wait(mojo::Handle(h_passing[1]),
-                                       MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
-            hss.satisfied_signals);
-  ASSERT_EQ(kAllSignals, hss.satisfiable_signals);
-  num_bytes = kBufferSize;
-  num_handles = arraysize(handles);
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->ReadMessage(
-                h_passing[1], buffer, &num_bytes, handles, &num_handles,
-                MOJO_READ_MESSAGE_FLAG_NONE));
-  ASSERT_EQ(kWorldSize, num_bytes);
-  ASSERT_STREQ(kWorld, buffer);
-  ASSERT_EQ(1u, num_handles);
-  MojoHandle ph_received = handles[0];
-  ASSERT_NE(ph_received, MOJO_HANDLE_INVALID);
-  ASSERT_NE(ph_received, h_passing[0]);
-  ASSERT_NE(ph_received, h_passing[1]);
-  ASSERT_NE(ph_received, ch_received);
-
-  // Again, rely on the Mojo system not re-using handle values very often.
-  ASSERT_NE(ph_received, ph);
-
-  // |ph| should no longer be valid; check that trying to close it fails. See
-  // above note.
-  ASSERT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(ph));
-
-  // Write to |ph_received|. Should receive on |ch_received|.
-  num_bytes = kHelloSize;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->WriteData(ph_received, kHello, &num_bytes,
-                              MOJO_WRITE_DATA_FLAG_ALL_OR_NONE));
-  hss = kEmptyMojoHandleSignalsState;
-  EXPECT_EQ(MOJO_RESULT_OK, mojo::Wait(mojo::Handle(ch_received),
-                                       MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfiable_signals);
-  num_bytes = kBufferSize;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->ReadData(ch_received, buffer, &num_bytes,
-                             MOJO_READ_MESSAGE_FLAG_NONE));
-  ASSERT_EQ(kHelloSize, num_bytes);
-  ASSERT_STREQ(kHello, buffer);
-
-  ph = ph_received;
-  ph_received = MOJO_HANDLE_INVALID;
-  ch = ch_received;
-  ch_received = MOJO_HANDLE_INVALID;
-
-  // Make sure that |ph| can't be sent if it's in a two-phase write.
-  void* write_ptr = nullptr;
-  num_bytes = 0;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->BeginWriteData(ph, &write_ptr, &num_bytes,
-                                   MOJO_WRITE_DATA_FLAG_NONE));
-  ASSERT_GE(num_bytes, 1u);
-  ASSERT_EQ(MOJO_RESULT_BUSY,
-            core()->WriteMessage(h_passing[0], kHello, kHelloSize, &ph, 1,
-                                 MOJO_WRITE_MESSAGE_FLAG_NONE));
-
-  // But |ch| can, even if |ph| is in a two-phase write.
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->WriteMessage(h_passing[0], kHello, kHelloSize, &ch, 1,
-                                 MOJO_WRITE_MESSAGE_FLAG_NONE));
-  ch = MOJO_HANDLE_INVALID;
-  EXPECT_EQ(MOJO_RESULT_OK, mojo::Wait(mojo::Handle(h_passing[1]),
-                                       MOJO_HANDLE_SIGNAL_READABLE));
-  num_bytes = kBufferSize;
-  num_handles = arraysize(handles);
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->ReadMessage(
-                h_passing[1], buffer, &num_bytes, handles, &num_handles,
-                MOJO_READ_MESSAGE_FLAG_NONE));
-  ASSERT_EQ(kHelloSize, num_bytes);
-  ASSERT_STREQ(kHello, buffer);
-  ASSERT_EQ(1u, num_handles);
-  ch = handles[0];
-  ASSERT_NE(ch, MOJO_HANDLE_INVALID);
-
-  // Complete the two-phase write.
-  static_cast<char*>(write_ptr)[0] = 'x';
-  ASSERT_EQ(MOJO_RESULT_OK, core()->EndWriteData(ph, 1));
-
-  // Wait for |ch| to be readable.
-  hss = kEmptyMojoHandleSignalsState;
-  EXPECT_EQ(MOJO_RESULT_OK,
-            mojo::Wait(mojo::Handle(ch), MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfiable_signals);
-
-  // Make sure that |ch| can't be sent if it's in a two-phase read.
-  const void* read_ptr = nullptr;
-  num_bytes = 1;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->BeginReadData(ch, &read_ptr, &num_bytes,
-                                  MOJO_READ_DATA_FLAG_ALL_OR_NONE));
-  ASSERT_EQ(MOJO_RESULT_BUSY,
-            core()->WriteMessage(h_passing[0], kHello, kHelloSize, &ch, 1,
-                                 MOJO_WRITE_MESSAGE_FLAG_NONE));
-
-  // But |ph| can, even if |ch| is in a two-phase read.
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->WriteMessage(h_passing[0], kWorld, kWorldSize, &ph, 1,
-                                 MOJO_WRITE_MESSAGE_FLAG_NONE));
-  ph = MOJO_HANDLE_INVALID;
-  hss = kEmptyMojoHandleSignalsState;
-  EXPECT_EQ(MOJO_RESULT_OK, mojo::Wait(mojo::Handle(h_passing[1]),
-                                       MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
-            hss.satisfied_signals);
-  ASSERT_EQ(kAllSignals, hss.satisfiable_signals);
-  num_bytes = kBufferSize;
-  num_handles = arraysize(handles);
-  ASSERT_EQ(MOJO_RESULT_OK,
-            core()->ReadMessage(
-                h_passing[1], buffer, &num_bytes, handles, &num_handles,
-                MOJO_READ_MESSAGE_FLAG_NONE));
-  ASSERT_EQ(kWorldSize, num_bytes);
-  ASSERT_STREQ(kWorld, buffer);
-  ASSERT_EQ(1u, num_handles);
-  ph = handles[0];
-  ASSERT_NE(ph, MOJO_HANDLE_INVALID);
-
-  // Complete the two-phase read.
-  ASSERT_EQ('x', static_cast<const char*>(read_ptr)[0]);
-  ASSERT_EQ(MOJO_RESULT_OK, core()->EndReadData(ch, 1));
-
-  ASSERT_EQ(MOJO_RESULT_OK, core()->Close(h_passing[0]));
-  ASSERT_EQ(MOJO_RESULT_OK, core()->Close(h_passing[1]));
-  ASSERT_EQ(MOJO_RESULT_OK, core()->Close(ph));
-  ASSERT_EQ(MOJO_RESULT_OK, core()->Close(ch));
-}
-
-struct TestAsyncWaiter {
-  TestAsyncWaiter() : result(MOJO_RESULT_UNKNOWN) {}
-
-  void Awake(MojoResult r) { result = r; }
-
-  MojoResult result;
-};
-
-// TODO(vtl): Test |DuplicateBufferHandle()| and |MapBuffer()|.
-
-}  // namespace
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/data_pipe_consumer_dispatcher.cc b/mojo/edk/system/data_pipe_consumer_dispatcher.cc
deleted file mode 100644
index f338732..0000000
--- a/mojo/edk/system/data_pipe_consumer_dispatcher.cc
+++ /dev/null
@@ -1,562 +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 "mojo/edk/system/data_pipe_consumer_dispatcher.h"
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <algorithm>
-#include <limits>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/logging.h"
-#include "base/memory/ref_counted.h"
-#include "base/message_loop/message_loop.h"
-#include "mojo/edk/embedder/embedder_internal.h"
-#include "mojo/edk/embedder/platform_shared_buffer.h"
-#include "mojo/edk/system/core.h"
-#include "mojo/edk/system/data_pipe_control_message.h"
-#include "mojo/edk/system/node_controller.h"
-#include "mojo/edk/system/ports_message.h"
-#include "mojo/edk/system/request_context.h"
-#include "mojo/public/c/system/data_pipe.h"
-
-namespace mojo {
-namespace edk {
-
-namespace {
-
-const uint8_t kFlagPeerClosed = 0x01;
-
-#pragma pack(push, 1)
-
-struct SerializedState {
-  MojoCreateDataPipeOptions options;
-  uint64_t pipe_id;
-  uint32_t read_offset;
-  uint32_t bytes_available;
-  uint8_t flags;
-  char padding[7];
-};
-
-static_assert(sizeof(SerializedState) % 8 == 0,
-              "Invalid SerializedState size.");
-
-#pragma pack(pop)
-
-}  // namespace
-
-// A PortObserver which forwards to a DataPipeConsumerDispatcher. This owns a
-// reference to the dispatcher to ensure it lives as long as the observed port.
-class DataPipeConsumerDispatcher::PortObserverThunk
-    : public NodeController::PortObserver {
- public:
-  explicit PortObserverThunk(
-      scoped_refptr<DataPipeConsumerDispatcher> dispatcher)
-      : dispatcher_(dispatcher) {}
-
- private:
-  ~PortObserverThunk() override {}
-
-  // NodeController::PortObserver:
-  void OnPortStatusChanged() override { dispatcher_->OnPortStatusChanged(); }
-
-  scoped_refptr<DataPipeConsumerDispatcher> dispatcher_;
-
-  DISALLOW_COPY_AND_ASSIGN(PortObserverThunk);
-};
-
-DataPipeConsumerDispatcher::DataPipeConsumerDispatcher(
-    NodeController* node_controller,
-    const ports::PortRef& control_port,
-    scoped_refptr<PlatformSharedBuffer> shared_ring_buffer,
-    const MojoCreateDataPipeOptions& options,
-    bool initialized,
-    uint64_t pipe_id)
-    : options_(options),
-      node_controller_(node_controller),
-      control_port_(control_port),
-      pipe_id_(pipe_id),
-      watchers_(this),
-      shared_ring_buffer_(shared_ring_buffer) {
-  if (initialized) {
-    base::AutoLock lock(lock_);
-    InitializeNoLock();
-  }
-}
-
-Dispatcher::Type DataPipeConsumerDispatcher::GetType() const {
-  return Type::DATA_PIPE_CONSUMER;
-}
-
-MojoResult DataPipeConsumerDispatcher::Close() {
-  base::AutoLock lock(lock_);
-  DVLOG(1) << "Closing data pipe consumer " << pipe_id_;
-  return CloseNoLock();
-}
-
-MojoResult DataPipeConsumerDispatcher::ReadData(void* elements,
-                                                uint32_t* num_bytes,
-                                                MojoReadDataFlags flags) {
-  base::AutoLock lock(lock_);
-
-  if (!shared_ring_buffer_ || in_transit_)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  if (in_two_phase_read_)
-    return MOJO_RESULT_BUSY;
-
-  const bool had_new_data = new_data_available_;
-  new_data_available_ = false;
-
-  if ((flags & MOJO_READ_DATA_FLAG_QUERY)) {
-    if ((flags & MOJO_READ_DATA_FLAG_PEEK) ||
-        (flags & MOJO_READ_DATA_FLAG_DISCARD))
-      return MOJO_RESULT_INVALID_ARGUMENT;
-    DCHECK(!(flags & MOJO_READ_DATA_FLAG_DISCARD));  // Handled above.
-    DVLOG_IF(2, elements)
-        << "Query mode: ignoring non-null |elements|";
-    *num_bytes = static_cast<uint32_t>(bytes_available_);
-
-    if (had_new_data)
-      watchers_.NotifyState(GetHandleSignalsStateNoLock());
-    return MOJO_RESULT_OK;
-  }
-
-  bool discard = false;
-  if ((flags & MOJO_READ_DATA_FLAG_DISCARD)) {
-    // These flags are mutally exclusive.
-    if (flags & MOJO_READ_DATA_FLAG_PEEK)
-      return MOJO_RESULT_INVALID_ARGUMENT;
-    DVLOG_IF(2, elements)
-        << "Discard mode: ignoring non-null |elements|";
-    discard = true;
-  }
-
-  uint32_t max_num_bytes_to_read = *num_bytes;
-  if (max_num_bytes_to_read % options_.element_num_bytes != 0)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  bool all_or_none = flags & MOJO_READ_DATA_FLAG_ALL_OR_NONE;
-  uint32_t min_num_bytes_to_read =
-      all_or_none ? max_num_bytes_to_read : 0;
-
-  if (min_num_bytes_to_read > bytes_available_) {
-    if (had_new_data)
-      watchers_.NotifyState(GetHandleSignalsStateNoLock());
-    return peer_closed_ ? MOJO_RESULT_FAILED_PRECONDITION
-                        : MOJO_RESULT_OUT_OF_RANGE;
-  }
-
-  uint32_t bytes_to_read = std::min(max_num_bytes_to_read, bytes_available_);
-  if (bytes_to_read == 0) {
-    if (had_new_data)
-      watchers_.NotifyState(GetHandleSignalsStateNoLock());
-    return peer_closed_ ? MOJO_RESULT_FAILED_PRECONDITION
-                        : MOJO_RESULT_SHOULD_WAIT;
-  }
-
-  if (!discard) {
-    uint8_t* data = static_cast<uint8_t*>(ring_buffer_mapping_->GetBase());
-    CHECK(data);
-
-    uint8_t* destination = static_cast<uint8_t*>(elements);
-    CHECK(destination);
-
-    DCHECK_LE(read_offset_, options_.capacity_num_bytes);
-    uint32_t tail_bytes_to_copy =
-        std::min(options_.capacity_num_bytes - read_offset_, bytes_to_read);
-    uint32_t head_bytes_to_copy = bytes_to_read - tail_bytes_to_copy;
-    if (tail_bytes_to_copy > 0)
-      memcpy(destination, data + read_offset_, tail_bytes_to_copy);
-    if (head_bytes_to_copy > 0)
-      memcpy(destination + tail_bytes_to_copy, data, head_bytes_to_copy);
-  }
-  *num_bytes = bytes_to_read;
-
-  bool peek = !!(flags & MOJO_READ_DATA_FLAG_PEEK);
-  if (discard || !peek) {
-    read_offset_ = (read_offset_ + bytes_to_read) % options_.capacity_num_bytes;
-    bytes_available_ -= bytes_to_read;
-
-    base::AutoUnlock unlock(lock_);
-    NotifyRead(bytes_to_read);
-  }
-
-  // We may have just read the last available data and thus changed the signals
-  // state.
-  watchers_.NotifyState(GetHandleSignalsStateNoLock());
-
-  return MOJO_RESULT_OK;
-}
-
-MojoResult DataPipeConsumerDispatcher::BeginReadData(const void** buffer,
-                                                     uint32_t* buffer_num_bytes,
-                                                     MojoReadDataFlags flags) {
-  base::AutoLock lock(lock_);
-  if (!shared_ring_buffer_ || in_transit_)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  if (in_two_phase_read_)
-    return MOJO_RESULT_BUSY;
-
-  // These flags may not be used in two-phase mode.
-  if ((flags & MOJO_READ_DATA_FLAG_DISCARD) ||
-      (flags & MOJO_READ_DATA_FLAG_QUERY) ||
-      (flags & MOJO_READ_DATA_FLAG_PEEK))
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  const bool had_new_data = new_data_available_;
-  new_data_available_ = false;
-
-  if (bytes_available_ == 0) {
-    if (had_new_data)
-      watchers_.NotifyState(GetHandleSignalsStateNoLock());
-    return peer_closed_ ? MOJO_RESULT_FAILED_PRECONDITION
-                        : MOJO_RESULT_SHOULD_WAIT;
-  }
-
-  DCHECK_LT(read_offset_, options_.capacity_num_bytes);
-  uint32_t bytes_to_read = std::min(bytes_available_,
-                                    options_.capacity_num_bytes - read_offset_);
-
-  CHECK(ring_buffer_mapping_);
-  uint8_t* data = static_cast<uint8_t*>(ring_buffer_mapping_->GetBase());
-  CHECK(data);
-
-  in_two_phase_read_ = true;
-  *buffer = data + read_offset_;
-  *buffer_num_bytes = bytes_to_read;
-  two_phase_max_bytes_read_ = bytes_to_read;
-
-  if (had_new_data)
-    watchers_.NotifyState(GetHandleSignalsStateNoLock());
-
-  return MOJO_RESULT_OK;
-}
-
-MojoResult DataPipeConsumerDispatcher::EndReadData(uint32_t num_bytes_read) {
-  base::AutoLock lock(lock_);
-  if (!in_two_phase_read_)
-    return MOJO_RESULT_FAILED_PRECONDITION;
-
-  if (in_transit_)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  CHECK(shared_ring_buffer_);
-
-  MojoResult rv;
-  if (num_bytes_read > two_phase_max_bytes_read_ ||
-      num_bytes_read % options_.element_num_bytes != 0) {
-    rv = MOJO_RESULT_INVALID_ARGUMENT;
-  } else {
-    rv = MOJO_RESULT_OK;
-    read_offset_ =
-        (read_offset_ + num_bytes_read) % options_.capacity_num_bytes;
-
-    DCHECK_GE(bytes_available_, num_bytes_read);
-    bytes_available_ -= num_bytes_read;
-
-    base::AutoUnlock unlock(lock_);
-    NotifyRead(num_bytes_read);
-  }
-
-  in_two_phase_read_ = false;
-  two_phase_max_bytes_read_ = 0;
-
-  watchers_.NotifyState(GetHandleSignalsStateNoLock());
-
-  return rv;
-}
-
-HandleSignalsState DataPipeConsumerDispatcher::GetHandleSignalsState() const {
-  base::AutoLock lock(lock_);
-  return GetHandleSignalsStateNoLock();
-}
-
-MojoResult DataPipeConsumerDispatcher::AddWatcherRef(
-    const scoped_refptr<WatcherDispatcher>& watcher,
-    uintptr_t context) {
-  base::AutoLock lock(lock_);
-  if (is_closed_ || in_transit_)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-  return watchers_.Add(watcher, context, GetHandleSignalsStateNoLock());
-}
-
-MojoResult DataPipeConsumerDispatcher::RemoveWatcherRef(
-    WatcherDispatcher* watcher,
-    uintptr_t context) {
-  base::AutoLock lock(lock_);
-  if (is_closed_ || in_transit_)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-  return watchers_.Remove(watcher, context);
-}
-
-void DataPipeConsumerDispatcher::StartSerialize(uint32_t* num_bytes,
-                                                uint32_t* num_ports,
-                                                uint32_t* num_handles) {
-  base::AutoLock lock(lock_);
-  DCHECK(in_transit_);
-  *num_bytes = static_cast<uint32_t>(sizeof(SerializedState));
-  *num_ports = 1;
-  *num_handles = 1;
-}
-
-bool DataPipeConsumerDispatcher::EndSerialize(
-    void* destination,
-    ports::PortName* ports,
-    PlatformHandle* platform_handles) {
-  SerializedState* state = static_cast<SerializedState*>(destination);
-  memcpy(&state->options, &options_, sizeof(MojoCreateDataPipeOptions));
-  memset(state->padding, 0, sizeof(state->padding));
-
-  base::AutoLock lock(lock_);
-  DCHECK(in_transit_);
-  state->pipe_id = pipe_id_;
-  state->read_offset = read_offset_;
-  state->bytes_available = bytes_available_;
-  state->flags = peer_closed_ ? kFlagPeerClosed : 0;
-
-  ports[0] = control_port_.name();
-
-  buffer_handle_for_transit_ = shared_ring_buffer_->DuplicatePlatformHandle();
-  platform_handles[0] = buffer_handle_for_transit_.get();
-
-  return true;
-}
-
-bool DataPipeConsumerDispatcher::BeginTransit() {
-  base::AutoLock lock(lock_);
-  if (in_transit_)
-    return false;
-  in_transit_ = !in_two_phase_read_;
-  return in_transit_;
-}
-
-void DataPipeConsumerDispatcher::CompleteTransitAndClose() {
-  node_controller_->SetPortObserver(control_port_, nullptr);
-
-  base::AutoLock lock(lock_);
-  DCHECK(in_transit_);
-  in_transit_ = false;
-  transferred_ = true;
-  ignore_result(buffer_handle_for_transit_.release());
-  CloseNoLock();
-}
-
-void DataPipeConsumerDispatcher::CancelTransit() {
-  base::AutoLock lock(lock_);
-  DCHECK(in_transit_);
-  in_transit_ = false;
-  buffer_handle_for_transit_.reset();
-  UpdateSignalsStateNoLock();
-}
-
-// static
-scoped_refptr<DataPipeConsumerDispatcher>
-DataPipeConsumerDispatcher::Deserialize(const void* data,
-                                        size_t num_bytes,
-                                        const ports::PortName* ports,
-                                        size_t num_ports,
-                                        PlatformHandle* handles,
-                                        size_t num_handles) {
-  if (num_ports != 1 || num_handles != 1 ||
-      num_bytes != sizeof(SerializedState)) {
-    return nullptr;
-  }
-
-  const SerializedState* state = static_cast<const SerializedState*>(data);
-
-  NodeController* node_controller = internal::g_core->GetNodeController();
-  ports::PortRef port;
-  if (node_controller->node()->GetPort(ports[0], &port) != ports::OK)
-    return nullptr;
-
-  PlatformHandle buffer_handle;
-  std::swap(buffer_handle, handles[0]);
-  scoped_refptr<PlatformSharedBuffer> ring_buffer =
-      PlatformSharedBuffer::CreateFromPlatformHandle(
-          state->options.capacity_num_bytes,
-          false /* read_only */,
-          ScopedPlatformHandle(buffer_handle));
-  if (!ring_buffer) {
-    DLOG(ERROR) << "Failed to deserialize shared buffer handle.";
-    return nullptr;
-  }
-
-  scoped_refptr<DataPipeConsumerDispatcher> dispatcher =
-      new DataPipeConsumerDispatcher(node_controller, port, ring_buffer,
-                                     state->options, false /* initialized */,
-                                     state->pipe_id);
-
-  {
-    base::AutoLock lock(dispatcher->lock_);
-    dispatcher->read_offset_ = state->read_offset;
-    dispatcher->bytes_available_ = state->bytes_available;
-    dispatcher->new_data_available_ = state->bytes_available > 0;
-    dispatcher->peer_closed_ = state->flags & kFlagPeerClosed;
-    dispatcher->InitializeNoLock();
-    dispatcher->UpdateSignalsStateNoLock();
-  }
-
-  return dispatcher;
-}
-
-DataPipeConsumerDispatcher::~DataPipeConsumerDispatcher() {
-  DCHECK(is_closed_ && !shared_ring_buffer_ && !ring_buffer_mapping_ &&
-         !in_transit_);
-}
-
-void DataPipeConsumerDispatcher::InitializeNoLock() {
-  lock_.AssertAcquired();
-
-  if (shared_ring_buffer_) {
-    DCHECK(!ring_buffer_mapping_);
-    ring_buffer_mapping_ =
-        shared_ring_buffer_->Map(0, options_.capacity_num_bytes);
-    if (!ring_buffer_mapping_) {
-      DLOG(ERROR) << "Failed to map shared buffer.";
-      shared_ring_buffer_ = nullptr;
-    }
-  }
-
-  base::AutoUnlock unlock(lock_);
-  node_controller_->SetPortObserver(
-      control_port_,
-      make_scoped_refptr(new PortObserverThunk(this)));
-}
-
-MojoResult DataPipeConsumerDispatcher::CloseNoLock() {
-  lock_.AssertAcquired();
-  if (is_closed_ || in_transit_)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-  is_closed_ = true;
-  ring_buffer_mapping_.reset();
-  shared_ring_buffer_ = nullptr;
-
-  watchers_.NotifyClosed();
-  if (!transferred_) {
-    base::AutoUnlock unlock(lock_);
-    node_controller_->ClosePort(control_port_);
-  }
-
-  return MOJO_RESULT_OK;
-}
-
-HandleSignalsState
-DataPipeConsumerDispatcher::GetHandleSignalsStateNoLock() const {
-  lock_.AssertAcquired();
-
-  HandleSignalsState rv;
-  if (shared_ring_buffer_ && bytes_available_) {
-    if (!in_two_phase_read_) {
-      rv.satisfied_signals |= MOJO_HANDLE_SIGNAL_READABLE;
-      if (new_data_available_)
-        rv.satisfied_signals |= MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE;
-    }
-    rv.satisfiable_signals |= MOJO_HANDLE_SIGNAL_READABLE;
-  } else if (!peer_closed_ && shared_ring_buffer_) {
-    rv.satisfiable_signals |= MOJO_HANDLE_SIGNAL_READABLE;
-  }
-
-  if (shared_ring_buffer_) {
-    if (new_data_available_ || !peer_closed_)
-      rv.satisfiable_signals |= MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE;
-  }
-
-  if (peer_closed_)
-    rv.satisfied_signals |= MOJO_HANDLE_SIGNAL_PEER_CLOSED;
-  rv.satisfiable_signals |= MOJO_HANDLE_SIGNAL_PEER_CLOSED;
-
-  return rv;
-}
-
-void DataPipeConsumerDispatcher::NotifyRead(uint32_t num_bytes) {
-  DVLOG(1) << "Data pipe consumer " << pipe_id_ << " notifying peer: "
-           << num_bytes << " bytes read. [control_port="
-           << control_port_.name() << "]";
-
-  SendDataPipeControlMessage(node_controller_, control_port_,
-                             DataPipeCommand::DATA_WAS_READ, num_bytes);
-}
-
-void DataPipeConsumerDispatcher::OnPortStatusChanged() {
-  DCHECK(RequestContext::current());
-
-  base::AutoLock lock(lock_);
-
-  // We stop observing the control port as soon it's transferred, but this can
-  // race with events which are raised right before that happens. This is fine
-  // to ignore.
-  if (transferred_)
-    return;
-
-  DVLOG(1) << "Control port status changed for data pipe producer " << pipe_id_;
-
-  UpdateSignalsStateNoLock();
-}
-
-void DataPipeConsumerDispatcher::UpdateSignalsStateNoLock() {
-  lock_.AssertAcquired();
-
-  bool was_peer_closed = peer_closed_;
-  size_t previous_bytes_available = bytes_available_;
-
-  ports::PortStatus port_status;
-  int rv = node_controller_->node()->GetStatus(control_port_, &port_status);
-  if (rv != ports::OK || !port_status.receiving_messages) {
-    DVLOG(1) << "Data pipe consumer " << pipe_id_ << " is aware of peer closure"
-             << " [control_port=" << control_port_.name() << "]";
-    peer_closed_ = true;
-  } else if (rv == ports::OK && port_status.has_messages && !in_transit_) {
-    ports::ScopedMessage message;
-    do {
-      int rv = node_controller_->node()->GetMessage(
-          control_port_, &message, nullptr);
-      if (rv != ports::OK)
-        peer_closed_ = true;
-      if (message) {
-        if (message->num_payload_bytes() < sizeof(DataPipeControlMessage)) {
-          peer_closed_ = true;
-          break;
-        }
-
-        const DataPipeControlMessage* m =
-            static_cast<const DataPipeControlMessage*>(
-                message->payload_bytes());
-
-        if (m->command != DataPipeCommand::DATA_WAS_WRITTEN) {
-          DLOG(ERROR) << "Unexpected control message from producer.";
-          peer_closed_ = true;
-          break;
-        }
-
-        if (static_cast<size_t>(bytes_available_) + m->num_bytes >
-              options_.capacity_num_bytes) {
-          DLOG(ERROR) << "Producer claims to have written too many bytes.";
-          peer_closed_ = true;
-          break;
-        }
-
-        DVLOG(1) << "Data pipe consumer " << pipe_id_ << " is aware that "
-                 << m->num_bytes << " bytes were written. [control_port="
-                 << control_port_.name() << "]";
-
-        bytes_available_ += m->num_bytes;
-      }
-    } while (message);
-  }
-
-  bool has_new_data = bytes_available_ != previous_bytes_available;
-  if (has_new_data)
-    new_data_available_ = true;
-
-  if (peer_closed_ != was_peer_closed || has_new_data)
-    watchers_.NotifyState(GetHandleSignalsStateNoLock());
-}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/data_pipe_consumer_dispatcher.h b/mojo/edk/system/data_pipe_consumer_dispatcher.h
deleted file mode 100644
index 120c7a3..0000000
--- a/mojo/edk/system/data_pipe_consumer_dispatcher.h
+++ /dev/null
@@ -1,123 +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 MOJO_EDK_SYSTEM_DATA_PIPE_CONSUMER_DISPATCHER_H_
-#define MOJO_EDK_SYSTEM_DATA_PIPE_CONSUMER_DISPATCHER_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <memory>
-
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/synchronization/lock.h"
-#include "mojo/edk/embedder/platform_handle_vector.h"
-#include "mojo/edk/embedder/platform_shared_buffer.h"
-#include "mojo/edk/embedder/scoped_platform_handle.h"
-#include "mojo/edk/system/dispatcher.h"
-#include "mojo/edk/system/ports/port_ref.h"
-#include "mojo/edk/system/system_impl_export.h"
-#include "mojo/edk/system/watcher_set.h"
-
-namespace mojo {
-namespace edk {
-
-class NodeController;
-
-// This is the Dispatcher implementation for the consumer handle for data
-// pipes created by the Mojo primitive MojoCreateDataPipe(). This class is
-// thread-safe.
-class MOJO_SYSTEM_IMPL_EXPORT DataPipeConsumerDispatcher final
-    : public Dispatcher {
- public:
-  DataPipeConsumerDispatcher(
-      NodeController* node_controller,
-      const ports::PortRef& control_port,
-      scoped_refptr<PlatformSharedBuffer> shared_ring_buffer,
-      const MojoCreateDataPipeOptions& options,
-      bool initialized,
-      uint64_t pipe_id);
-
-  // Dispatcher:
-  Type GetType() const override;
-  MojoResult Close() override;
-  MojoResult ReadData(void* elements,
-                      uint32_t* num_bytes,
-                      MojoReadDataFlags flags) override;
-  MojoResult BeginReadData(const void** buffer,
-                           uint32_t* buffer_num_bytes,
-                           MojoReadDataFlags flags) override;
-  MojoResult EndReadData(uint32_t num_bytes_read) override;
-  HandleSignalsState GetHandleSignalsState() const override;
-  MojoResult AddWatcherRef(const scoped_refptr<WatcherDispatcher>& watcher,
-                           uintptr_t context) override;
-  MojoResult RemoveWatcherRef(WatcherDispatcher* watcher,
-                              uintptr_t context) override;
-  void StartSerialize(uint32_t* num_bytes,
-                      uint32_t* num_ports,
-                      uint32_t* num_handles) override;
-  bool EndSerialize(void* destination,
-                    ports::PortName* ports,
-                    PlatformHandle* handles) override;
-  bool BeginTransit() override;
-  void CompleteTransitAndClose() override;
-  void CancelTransit() override;
-
-  static scoped_refptr<DataPipeConsumerDispatcher>
-  Deserialize(const void* data,
-              size_t num_bytes,
-              const ports::PortName* ports,
-              size_t num_ports,
-              PlatformHandle* handles,
-              size_t num_handles);
-
- private:
-  class PortObserverThunk;
-  friend class PortObserverThunk;
-
-  ~DataPipeConsumerDispatcher() override;
-
-  void InitializeNoLock();
-  MojoResult CloseNoLock();
-  HandleSignalsState GetHandleSignalsStateNoLock() const;
-  void NotifyRead(uint32_t num_bytes);
-  void OnPortStatusChanged();
-  void UpdateSignalsStateNoLock();
-
-  const MojoCreateDataPipeOptions options_;
-  NodeController* const node_controller_;
-  const ports::PortRef control_port_;
-  const uint64_t pipe_id_;
-
-  // Guards access to the fields below.
-  mutable base::Lock lock_;
-
-  WatcherSet watchers_;
-
-  scoped_refptr<PlatformSharedBuffer> shared_ring_buffer_;
-  std::unique_ptr<PlatformSharedBufferMapping> ring_buffer_mapping_;
-  ScopedPlatformHandle buffer_handle_for_transit_;
-
-  bool in_two_phase_read_ = false;
-  uint32_t two_phase_max_bytes_read_ = 0;
-
-  bool in_transit_ = false;
-  bool is_closed_ = false;
-  bool peer_closed_ = false;
-  bool transferred_ = false;
-
-  uint32_t read_offset_ = 0;
-  uint32_t bytes_available_ = 0;
-
-  // Indicates whether any new data is available since the last read attempt.
-  bool new_data_available_ = false;
-
-  DISALLOW_COPY_AND_ASSIGN(DataPipeConsumerDispatcher);
-};
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_DATA_PIPE_CONSUMER_DISPATCHER_H_
diff --git a/mojo/edk/system/data_pipe_control_message.cc b/mojo/edk/system/data_pipe_control_message.cc
deleted file mode 100644
index 23873b8..0000000
--- a/mojo/edk/system/data_pipe_control_message.cc
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/system/data_pipe_control_message.h"
-
-#include "mojo/edk/embedder/platform_handle_vector.h"
-#include "mojo/edk/system/node_controller.h"
-#include "mojo/edk/system/ports_message.h"
-
-namespace mojo {
-namespace edk {
-
-void SendDataPipeControlMessage(NodeController* node_controller,
-                                const ports::PortRef& port,
-                                DataPipeCommand command,
-                                uint32_t num_bytes) {
-  std::unique_ptr<PortsMessage> message =
-      PortsMessage::NewUserMessage(sizeof(DataPipeControlMessage), 0, 0);
-  CHECK(message);
-
-  DataPipeControlMessage* data =
-      static_cast<DataPipeControlMessage*>(message->mutable_payload_bytes());
-  data->command = command;
-  data->num_bytes = num_bytes;
-
-  int rv = node_controller->SendMessage(port, std::move(message));
-  if (rv != ports::OK && rv != ports::ERROR_PORT_PEER_CLOSED) {
-    DLOG(ERROR) << "Unexpected failure sending data pipe control message: "
-                << rv;
-  }
-}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/data_pipe_control_message.h b/mojo/edk/system/data_pipe_control_message.h
deleted file mode 100644
index ec84ea3..0000000
--- a/mojo/edk/system/data_pipe_control_message.h
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_SYSTEM_DATA_PIPE_CONTROL_MESSAGE_H_
-#define MOJO_EDK_SYSTEM_DATA_PIPE_CONTROL_MESSAGE_H_
-
-#include <stdint.h>
-
-#include <memory>
-
-#include "mojo/edk/embedder/scoped_platform_handle.h"
-#include "mojo/edk/system/ports/port_ref.h"
-#include "mojo/public/c/system/macros.h"
-
-namespace mojo {
-namespace edk {
-
-class NodeController;
-
-enum DataPipeCommand : uint32_t {
-  // Signal to the consumer that new data is available.
-  DATA_WAS_WRITTEN,
-
-  // Signal to the producer that data has been consumed.
-  DATA_WAS_READ,
-};
-
-// Message header for messages sent over a data pipe control port.
-struct MOJO_ALIGNAS(8) DataPipeControlMessage {
-  DataPipeCommand command;
-  uint32_t num_bytes;
-};
-
-void SendDataPipeControlMessage(NodeController* node_controller,
-                                const ports::PortRef& port,
-                                DataPipeCommand command,
-                                uint32_t num_bytes);
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_DATA_PIPE_CONTROL_MESSAGE_H_
diff --git a/mojo/edk/system/data_pipe_producer_dispatcher.cc b/mojo/edk/system/data_pipe_producer_dispatcher.cc
deleted file mode 100644
index b0102a6..0000000
--- a/mojo/edk/system/data_pipe_producer_dispatcher.cc
+++ /dev/null
@@ -1,507 +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 "mojo/edk/system/data_pipe_producer_dispatcher.h"
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <utility>
-
-#include "base/bind.h"
-#include "base/logging.h"
-#include "base/memory/ref_counted.h"
-#include "base/message_loop/message_loop.h"
-#include "mojo/edk/embedder/embedder_internal.h"
-#include "mojo/edk/embedder/platform_shared_buffer.h"
-#include "mojo/edk/system/configuration.h"
-#include "mojo/edk/system/core.h"
-#include "mojo/edk/system/data_pipe_control_message.h"
-#include "mojo/edk/system/node_controller.h"
-#include "mojo/edk/system/ports_message.h"
-#include "mojo/edk/system/request_context.h"
-#include "mojo/public/c/system/data_pipe.h"
-
-namespace mojo {
-namespace edk {
-
-namespace {
-
-const uint8_t kFlagPeerClosed = 0x01;
-
-#pragma pack(push, 1)
-
-struct SerializedState {
-  MojoCreateDataPipeOptions options;
-  uint64_t pipe_id;
-  uint32_t write_offset;
-  uint32_t available_capacity;
-  uint8_t flags;
-  char padding[7];
-};
-
-static_assert(sizeof(SerializedState) % 8 == 0,
-              "Invalid SerializedState size.");
-
-#pragma pack(pop)
-
-}  // namespace
-
-// A PortObserver which forwards to a DataPipeProducerDispatcher. This owns a
-// reference to the dispatcher to ensure it lives as long as the observed port.
-class DataPipeProducerDispatcher::PortObserverThunk
-    : public NodeController::PortObserver {
- public:
-  explicit PortObserverThunk(
-      scoped_refptr<DataPipeProducerDispatcher> dispatcher)
-      : dispatcher_(dispatcher) {}
-
- private:
-  ~PortObserverThunk() override {}
-
-  // NodeController::PortObserver:
-  void OnPortStatusChanged() override { dispatcher_->OnPortStatusChanged(); }
-
-  scoped_refptr<DataPipeProducerDispatcher> dispatcher_;
-
-  DISALLOW_COPY_AND_ASSIGN(PortObserverThunk);
-};
-
-DataPipeProducerDispatcher::DataPipeProducerDispatcher(
-    NodeController* node_controller,
-    const ports::PortRef& control_port,
-    scoped_refptr<PlatformSharedBuffer> shared_ring_buffer,
-    const MojoCreateDataPipeOptions& options,
-    bool initialized,
-    uint64_t pipe_id)
-    : options_(options),
-      node_controller_(node_controller),
-      control_port_(control_port),
-      pipe_id_(pipe_id),
-      watchers_(this),
-      shared_ring_buffer_(shared_ring_buffer),
-      available_capacity_(options_.capacity_num_bytes) {
-  if (initialized) {
-    base::AutoLock lock(lock_);
-    InitializeNoLock();
-  }
-}
-
-Dispatcher::Type DataPipeProducerDispatcher::GetType() const {
-  return Type::DATA_PIPE_PRODUCER;
-}
-
-MojoResult DataPipeProducerDispatcher::Close() {
-  base::AutoLock lock(lock_);
-  DVLOG(1) << "Closing data pipe producer " << pipe_id_;
-  return CloseNoLock();
-}
-
-MojoResult DataPipeProducerDispatcher::WriteData(const void* elements,
-                                                 uint32_t* num_bytes,
-                                                 MojoWriteDataFlags flags) {
-  base::AutoLock lock(lock_);
-  if (!shared_ring_buffer_ || in_transit_)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  if (in_two_phase_write_)
-    return MOJO_RESULT_BUSY;
-
-  if (peer_closed_)
-    return MOJO_RESULT_FAILED_PRECONDITION;
-
-  if (*num_bytes % options_.element_num_bytes != 0)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-  if (*num_bytes == 0)
-    return MOJO_RESULT_OK;  // Nothing to do.
-
-  if ((flags & MOJO_WRITE_DATA_FLAG_ALL_OR_NONE) &&
-      (*num_bytes > available_capacity_)) {
-    // Don't return "should wait" since you can't wait for a specified amount of
-    // data.
-    return MOJO_RESULT_OUT_OF_RANGE;
-  }
-
-  DCHECK_LE(available_capacity_, options_.capacity_num_bytes);
-  uint32_t num_bytes_to_write = std::min(*num_bytes, available_capacity_);
-  if (num_bytes_to_write == 0)
-    return MOJO_RESULT_SHOULD_WAIT;
-
-  *num_bytes = num_bytes_to_write;
-
-  CHECK(ring_buffer_mapping_);
-  uint8_t* data = static_cast<uint8_t*>(ring_buffer_mapping_->GetBase());
-  CHECK(data);
-
-  const uint8_t* source = static_cast<const uint8_t*>(elements);
-  CHECK(source);
-
-  DCHECK_LE(write_offset_, options_.capacity_num_bytes);
-  uint32_t tail_bytes_to_write =
-      std::min(options_.capacity_num_bytes - write_offset_,
-               num_bytes_to_write);
-  uint32_t head_bytes_to_write = num_bytes_to_write - tail_bytes_to_write;
-
-  DCHECK_GT(tail_bytes_to_write, 0u);
-  memcpy(data + write_offset_, source, tail_bytes_to_write);
-  if (head_bytes_to_write > 0)
-    memcpy(data, source + tail_bytes_to_write, head_bytes_to_write);
-
-  DCHECK_LE(num_bytes_to_write, available_capacity_);
-  available_capacity_ -= num_bytes_to_write;
-  write_offset_ = (write_offset_ + num_bytes_to_write) %
-      options_.capacity_num_bytes;
-
-  watchers_.NotifyState(GetHandleSignalsStateNoLock());
-
-  base::AutoUnlock unlock(lock_);
-  NotifyWrite(num_bytes_to_write);
-
-  return MOJO_RESULT_OK;
-}
-
-MojoResult DataPipeProducerDispatcher::BeginWriteData(
-    void** buffer,
-    uint32_t* buffer_num_bytes,
-    MojoWriteDataFlags flags) {
-  base::AutoLock lock(lock_);
-  if (!shared_ring_buffer_ || in_transit_)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  // These flags may not be used in two-phase mode.
-  if (flags & MOJO_WRITE_DATA_FLAG_ALL_OR_NONE)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  if (in_two_phase_write_)
-    return MOJO_RESULT_BUSY;
-  if (peer_closed_)
-    return MOJO_RESULT_FAILED_PRECONDITION;
-
-  if (available_capacity_ == 0) {
-    return peer_closed_ ? MOJO_RESULT_FAILED_PRECONDITION
-                        : MOJO_RESULT_SHOULD_WAIT;
-  }
-
-  in_two_phase_write_ = true;
-  *buffer_num_bytes = std::min(options_.capacity_num_bytes - write_offset_,
-                               available_capacity_);
-  DCHECK_GT(*buffer_num_bytes, 0u);
-
-  CHECK(ring_buffer_mapping_);
-  uint8_t* data = static_cast<uint8_t*>(ring_buffer_mapping_->GetBase());
-  *buffer = data + write_offset_;
-
-  return MOJO_RESULT_OK;
-}
-
-MojoResult DataPipeProducerDispatcher::EndWriteData(
-    uint32_t num_bytes_written) {
-  base::AutoLock lock(lock_);
-  if (is_closed_ || in_transit_)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  if (!in_two_phase_write_)
-    return MOJO_RESULT_FAILED_PRECONDITION;
-
-  DCHECK(shared_ring_buffer_);
-  DCHECK(ring_buffer_mapping_);
-
-  // Note: Allow successful completion of the two-phase write even if the other
-  // side has been closed.
-  MojoResult rv = MOJO_RESULT_OK;
-  if (num_bytes_written > available_capacity_ ||
-      num_bytes_written % options_.element_num_bytes != 0 ||
-      write_offset_ + num_bytes_written > options_.capacity_num_bytes) {
-    rv = MOJO_RESULT_INVALID_ARGUMENT;
-  } else {
-    DCHECK_LE(num_bytes_written + write_offset_, options_.capacity_num_bytes);
-    available_capacity_ -= num_bytes_written;
-    write_offset_ = (write_offset_ + num_bytes_written) %
-        options_.capacity_num_bytes;
-
-    base::AutoUnlock unlock(lock_);
-    NotifyWrite(num_bytes_written);
-  }
-
-  in_two_phase_write_ = false;
-
-  // If we're now writable, we *became* writable (since we weren't writable
-  // during the two-phase write), so notify watchers.
-  watchers_.NotifyState(GetHandleSignalsStateNoLock());
-
-  return rv;
-}
-
-HandleSignalsState DataPipeProducerDispatcher::GetHandleSignalsState() const {
-  base::AutoLock lock(lock_);
-  return GetHandleSignalsStateNoLock();
-}
-
-MojoResult DataPipeProducerDispatcher::AddWatcherRef(
-    const scoped_refptr<WatcherDispatcher>& watcher,
-    uintptr_t context) {
-  base::AutoLock lock(lock_);
-  if (is_closed_ || in_transit_)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-  return watchers_.Add(watcher, context, GetHandleSignalsStateNoLock());
-}
-
-MojoResult DataPipeProducerDispatcher::RemoveWatcherRef(
-    WatcherDispatcher* watcher,
-    uintptr_t context) {
-  base::AutoLock lock(lock_);
-  if (is_closed_ || in_transit_)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-  return watchers_.Remove(watcher, context);
-}
-
-void DataPipeProducerDispatcher::StartSerialize(uint32_t* num_bytes,
-                                                uint32_t* num_ports,
-                                                uint32_t* num_handles) {
-  base::AutoLock lock(lock_);
-  DCHECK(in_transit_);
-  *num_bytes = sizeof(SerializedState);
-  *num_ports = 1;
-  *num_handles = 1;
-}
-
-bool DataPipeProducerDispatcher::EndSerialize(
-    void* destination,
-    ports::PortName* ports,
-    PlatformHandle* platform_handles) {
-  SerializedState* state = static_cast<SerializedState*>(destination);
-  memcpy(&state->options, &options_, sizeof(MojoCreateDataPipeOptions));
-  memset(state->padding, 0, sizeof(state->padding));
-
-  base::AutoLock lock(lock_);
-  DCHECK(in_transit_);
-  state->pipe_id = pipe_id_;
-  state->write_offset = write_offset_;
-  state->available_capacity = available_capacity_;
-  state->flags = peer_closed_ ? kFlagPeerClosed : 0;
-
-  ports[0] = control_port_.name();
-
-  buffer_handle_for_transit_ = shared_ring_buffer_->DuplicatePlatformHandle();
-  platform_handles[0] = buffer_handle_for_transit_.get();
-
-  return true;
-}
-
-bool DataPipeProducerDispatcher::BeginTransit() {
-  base::AutoLock lock(lock_);
-  if (in_transit_)
-    return false;
-  in_transit_ = !in_two_phase_write_;
-  return in_transit_;
-}
-
-void DataPipeProducerDispatcher::CompleteTransitAndClose() {
-  node_controller_->SetPortObserver(control_port_, nullptr);
-
-  base::AutoLock lock(lock_);
-  DCHECK(in_transit_);
-  transferred_ = true;
-  in_transit_ = false;
-  ignore_result(buffer_handle_for_transit_.release());
-  CloseNoLock();
-}
-
-void DataPipeProducerDispatcher::CancelTransit() {
-  base::AutoLock lock(lock_);
-  DCHECK(in_transit_);
-  in_transit_ = false;
-  buffer_handle_for_transit_.reset();
-
-  HandleSignalsState state = GetHandleSignalsStateNoLock();
-  watchers_.NotifyState(state);
-}
-
-// static
-scoped_refptr<DataPipeProducerDispatcher>
-DataPipeProducerDispatcher::Deserialize(const void* data,
-                                        size_t num_bytes,
-                                        const ports::PortName* ports,
-                                        size_t num_ports,
-                                        PlatformHandle* handles,
-                                        size_t num_handles) {
-  if (num_ports != 1 || num_handles != 1 ||
-      num_bytes != sizeof(SerializedState)) {
-    return nullptr;
-  }
-
-  const SerializedState* state = static_cast<const SerializedState*>(data);
-
-  NodeController* node_controller = internal::g_core->GetNodeController();
-  ports::PortRef port;
-  if (node_controller->node()->GetPort(ports[0], &port) != ports::OK)
-    return nullptr;
-
-  PlatformHandle buffer_handle;
-  std::swap(buffer_handle, handles[0]);
-  scoped_refptr<PlatformSharedBuffer> ring_buffer =
-      PlatformSharedBuffer::CreateFromPlatformHandle(
-          state->options.capacity_num_bytes,
-          false /* read_only */,
-          ScopedPlatformHandle(buffer_handle));
-  if (!ring_buffer) {
-    DLOG(ERROR) << "Failed to deserialize shared buffer handle.";
-    return nullptr;
-  }
-
-  scoped_refptr<DataPipeProducerDispatcher> dispatcher =
-      new DataPipeProducerDispatcher(node_controller, port, ring_buffer,
-                                     state->options, false /* initialized */,
-                                     state->pipe_id);
-
-  {
-    base::AutoLock lock(dispatcher->lock_);
-    dispatcher->write_offset_ = state->write_offset;
-    dispatcher->available_capacity_ = state->available_capacity;
-    dispatcher->peer_closed_ = state->flags & kFlagPeerClosed;
-    dispatcher->InitializeNoLock();
-    dispatcher->UpdateSignalsStateNoLock();
-  }
-
-  return dispatcher;
-}
-
-DataPipeProducerDispatcher::~DataPipeProducerDispatcher() {
-  DCHECK(is_closed_ && !in_transit_ && !shared_ring_buffer_ &&
-         !ring_buffer_mapping_);
-}
-
-void DataPipeProducerDispatcher::InitializeNoLock() {
-  lock_.AssertAcquired();
-
-  if (shared_ring_buffer_) {
-    ring_buffer_mapping_ =
-        shared_ring_buffer_->Map(0, options_.capacity_num_bytes);
-    if (!ring_buffer_mapping_) {
-      DLOG(ERROR) << "Failed to map shared buffer.";
-      shared_ring_buffer_ = nullptr;
-    }
-  }
-
-  base::AutoUnlock unlock(lock_);
-  node_controller_->SetPortObserver(
-      control_port_,
-      make_scoped_refptr(new PortObserverThunk(this)));
-}
-
-MojoResult DataPipeProducerDispatcher::CloseNoLock() {
-  lock_.AssertAcquired();
-  if (is_closed_ || in_transit_)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-  is_closed_ = true;
-  ring_buffer_mapping_.reset();
-  shared_ring_buffer_ = nullptr;
-
-  watchers_.NotifyClosed();
-  if (!transferred_) {
-    base::AutoUnlock unlock(lock_);
-    node_controller_->ClosePort(control_port_);
-  }
-
-  return MOJO_RESULT_OK;
-}
-
-HandleSignalsState DataPipeProducerDispatcher::GetHandleSignalsStateNoLock()
-    const {
-  lock_.AssertAcquired();
-  HandleSignalsState rv;
-  if (!peer_closed_) {
-    if (!in_two_phase_write_ && shared_ring_buffer_ && available_capacity_ > 0)
-      rv.satisfied_signals |= MOJO_HANDLE_SIGNAL_WRITABLE;
-    rv.satisfiable_signals |= MOJO_HANDLE_SIGNAL_WRITABLE;
-  } else {
-    rv.satisfied_signals |= MOJO_HANDLE_SIGNAL_PEER_CLOSED;
-  }
-  rv.satisfiable_signals |= MOJO_HANDLE_SIGNAL_PEER_CLOSED;
-  return rv;
-}
-
-void DataPipeProducerDispatcher::NotifyWrite(uint32_t num_bytes) {
-  DVLOG(1) << "Data pipe producer " << pipe_id_ << " notifying peer: "
-           << num_bytes << " bytes written. [control_port="
-           << control_port_.name() << "]";
-
-  SendDataPipeControlMessage(node_controller_, control_port_,
-                             DataPipeCommand::DATA_WAS_WRITTEN, num_bytes);
-}
-
-void DataPipeProducerDispatcher::OnPortStatusChanged() {
-  DCHECK(RequestContext::current());
-
-  base::AutoLock lock(lock_);
-
-  // We stop observing the control port as soon it's transferred, but this can
-  // race with events which are raised right before that happens. This is fine
-  // to ignore.
-  if (transferred_)
-    return;
-
-  DVLOG(1) << "Control port status changed for data pipe producer " << pipe_id_;
-
-  UpdateSignalsStateNoLock();
-}
-
-void DataPipeProducerDispatcher::UpdateSignalsStateNoLock() {
-  lock_.AssertAcquired();
-
-  bool was_peer_closed = peer_closed_;
-  size_t previous_capacity = available_capacity_;
-
-  ports::PortStatus port_status;
-  int rv = node_controller_->node()->GetStatus(control_port_, &port_status);
-  if (rv != ports::OK || !port_status.receiving_messages) {
-    DVLOG(1) << "Data pipe producer " << pipe_id_ << " is aware of peer closure"
-             << " [control_port=" << control_port_.name() << "]";
-    peer_closed_ = true;
-  } else if (rv == ports::OK && port_status.has_messages && !in_transit_) {
-    ports::ScopedMessage message;
-    do {
-      int rv = node_controller_->node()->GetMessage(
-          control_port_, &message, nullptr);
-      if (rv != ports::OK)
-        peer_closed_ = true;
-      if (message) {
-        if (message->num_payload_bytes() < sizeof(DataPipeControlMessage)) {
-          peer_closed_ = true;
-          break;
-        }
-
-        const DataPipeControlMessage* m =
-            static_cast<const DataPipeControlMessage*>(
-                message->payload_bytes());
-
-        if (m->command != DataPipeCommand::DATA_WAS_READ) {
-          DLOG(ERROR) << "Unexpected message from consumer.";
-          peer_closed_ = true;
-          break;
-        }
-
-        if (static_cast<size_t>(available_capacity_) + m->num_bytes >
-              options_.capacity_num_bytes) {
-          DLOG(ERROR) << "Consumer claims to have read too many bytes.";
-          break;
-        }
-
-        DVLOG(1) << "Data pipe producer " << pipe_id_ << " is aware that "
-                 << m->num_bytes << " bytes were read. [control_port="
-                 << control_port_.name() << "]";
-
-        available_capacity_ += m->num_bytes;
-      }
-    } while (message);
-  }
-
-  if (peer_closed_ != was_peer_closed ||
-      available_capacity_ != previous_capacity) {
-    watchers_.NotifyState(GetHandleSignalsStateNoLock());
-  }
-}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/data_pipe_producer_dispatcher.h b/mojo/edk/system/data_pipe_producer_dispatcher.h
deleted file mode 100644
index 1eddd5d..0000000
--- a/mojo/edk/system/data_pipe_producer_dispatcher.h
+++ /dev/null
@@ -1,123 +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 MOJO_EDK_SYSTEM_DATA_PIPE_PRODUCER_DISPATCHER_H_
-#define MOJO_EDK_SYSTEM_DATA_PIPE_PRODUCER_DISPATCHER_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <memory>
-
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/synchronization/lock.h"
-#include "mojo/edk/embedder/platform_handle_vector.h"
-#include "mojo/edk/embedder/platform_shared_buffer.h"
-#include "mojo/edk/system/dispatcher.h"
-#include "mojo/edk/system/ports/port_ref.h"
-#include "mojo/edk/system/system_impl_export.h"
-#include "mojo/edk/system/watcher_set.h"
-
-namespace mojo {
-namespace edk {
-
-struct DataPipeControlMessage;
-class NodeController;
-
-// This is the Dispatcher implementation for the producer handle for data
-// pipes created by the Mojo primitive MojoCreateDataPipe(). This class is
-// thread-safe.
-class MOJO_SYSTEM_IMPL_EXPORT DataPipeProducerDispatcher final
-    : public Dispatcher {
- public:
-  DataPipeProducerDispatcher(
-      NodeController* node_controller,
-      const ports::PortRef& port,
-      scoped_refptr<PlatformSharedBuffer> shared_ring_buffer,
-      const MojoCreateDataPipeOptions& options,
-      bool initialized,
-      uint64_t pipe_id);
-
-  // Dispatcher:
-  Type GetType() const override;
-  MojoResult Close() override;
-  MojoResult WriteData(const void* elements,
-                       uint32_t* num_bytes,
-                       MojoReadDataFlags flags) override;
-  MojoResult BeginWriteData(void** buffer,
-                            uint32_t* buffer_num_bytes,
-                            MojoWriteDataFlags flags) override;
-  MojoResult EndWriteData(uint32_t num_bytes_written) override;
-  HandleSignalsState GetHandleSignalsState() const override;
-  MojoResult AddWatcherRef(const scoped_refptr<WatcherDispatcher>& watcher,
-                           uintptr_t context) override;
-  MojoResult RemoveWatcherRef(WatcherDispatcher* watcher,
-                              uintptr_t context) override;
-  void StartSerialize(uint32_t* num_bytes,
-                      uint32_t* num_ports,
-                      uint32_t* num_handles) override;
-  bool EndSerialize(void* destination,
-                    ports::PortName* ports,
-                    PlatformHandle* handles) override;
-  bool BeginTransit() override;
-  void CompleteTransitAndClose() override;
-  void CancelTransit() override;
-
-  static scoped_refptr<DataPipeProducerDispatcher>
-  Deserialize(const void* data,
-              size_t num_bytes,
-              const ports::PortName* ports,
-              size_t num_ports,
-              PlatformHandle* handles,
-              size_t num_handles);
-
- private:
-  class PortObserverThunk;
-  friend class PortObserverThunk;
-
-  ~DataPipeProducerDispatcher() override;
-
-  void OnSharedBufferCreated(const scoped_refptr<PlatformSharedBuffer>& buffer);
-  void InitializeNoLock();
-  MojoResult CloseNoLock();
-  HandleSignalsState GetHandleSignalsStateNoLock() const;
-  void NotifyWrite(uint32_t num_bytes);
-  void OnPortStatusChanged();
-  void UpdateSignalsStateNoLock();
-  bool ProcessMessageNoLock(const DataPipeControlMessage& message,
-                            ScopedPlatformHandleVectorPtr handles);
-
-  const MojoCreateDataPipeOptions options_;
-  NodeController* const node_controller_;
-  const ports::PortRef control_port_;
-  const uint64_t pipe_id_;
-
-  // Guards access to the fields below.
-  mutable base::Lock lock_;
-
-  WatcherSet watchers_;
-
-  bool buffer_requested_ = false;
-
-  scoped_refptr<PlatformSharedBuffer> shared_ring_buffer_;
-  std::unique_ptr<PlatformSharedBufferMapping> ring_buffer_mapping_;
-  ScopedPlatformHandle buffer_handle_for_transit_;
-
-  bool in_transit_ = false;
-  bool is_closed_ = false;
-  bool peer_closed_ = false;
-  bool transferred_ = false;
-  bool in_two_phase_write_ = false;
-
-  uint32_t write_offset_ = 0;
-  uint32_t available_capacity_;
-
-  DISALLOW_COPY_AND_ASSIGN(DataPipeProducerDispatcher);
-};
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_DATA_PIPE_PRODUCER_DISPATCHER_H_
diff --git a/mojo/edk/system/data_pipe_unittest.cc b/mojo/edk/system/data_pipe_unittest.cc
deleted file mode 100644
index 79c1f75..0000000
--- a/mojo/edk/system/data_pipe_unittest.cc
+++ /dev/null
@@ -1,2034 +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 <stddef.h>
-#include <stdint.h>
-
-#include <memory>
-
-#include "base/bind.h"
-#include "base/location.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/embedder/platform_channel_pair.h"
-#include "mojo/edk/system/test_utils.h"
-#include "mojo/edk/test/mojo_test_base.h"
-#include "mojo/public/c/system/data_pipe.h"
-#include "mojo/public/c/system/functions.h"
-#include "mojo/public/c/system/message_pipe.h"
-#include "mojo/public/cpp/system/simple_watcher.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace edk {
-namespace {
-
-const uint32_t kSizeOfOptions =
-    static_cast<uint32_t>(sizeof(MojoCreateDataPipeOptions));
-
-// In various places, we have to poll (since, e.g., we can't yet wait for a
-// certain amount of data to be available). This is the maximum number of
-// iterations (separated by a short sleep).
-// TODO(vtl): Get rid of this.
-const size_t kMaxPoll = 100;
-
-// Used in Multiprocess test.
-const size_t kMultiprocessCapacity = 37;
-const char kMultiprocessTestData[] = "hello i'm a string that is 36 bytes";
-const int kMultiprocessMaxIter = 5;
-
-// TODO(rockot): There are many uses of ASSERT where EXPECT would be more
-// appropriate. Fix this.
-
-class DataPipeTest : public test::MojoTestBase {
- public:
-  DataPipeTest() : producer_(MOJO_HANDLE_INVALID),
-                   consumer_(MOJO_HANDLE_INVALID) {}
-
-  ~DataPipeTest() override {
-    if (producer_ != MOJO_HANDLE_INVALID)
-      CHECK_EQ(MOJO_RESULT_OK, MojoClose(producer_));
-    if (consumer_ != MOJO_HANDLE_INVALID)
-      CHECK_EQ(MOJO_RESULT_OK, MojoClose(consumer_));
-  }
-
-  MojoResult Create(const MojoCreateDataPipeOptions* options) {
-    return MojoCreateDataPipe(options, &producer_, &consumer_);
-  }
-
-  MojoResult WriteData(const void* elements,
-                       uint32_t* num_bytes,
-                       bool all_or_none = false) {
-    return MojoWriteData(producer_, elements, num_bytes,
-                         all_or_none ? MOJO_WRITE_DATA_FLAG_ALL_OR_NONE
-                                     : MOJO_WRITE_DATA_FLAG_NONE);
-  }
-
-  MojoResult ReadData(void* elements,
-                      uint32_t* num_bytes,
-                      bool all_or_none = false,
-                      bool peek = false) {
-    MojoReadDataFlags flags = MOJO_READ_DATA_FLAG_NONE;
-    if (all_or_none)
-      flags |= MOJO_READ_DATA_FLAG_ALL_OR_NONE;
-    if (peek)
-      flags |= MOJO_READ_DATA_FLAG_PEEK;
-    return MojoReadData(consumer_, elements, num_bytes, flags);
-  }
-
-  MojoResult QueryData(uint32_t* num_bytes) {
-    return MojoReadData(consumer_, nullptr, num_bytes,
-                        MOJO_READ_DATA_FLAG_QUERY);
-  }
-
-  MojoResult DiscardData(uint32_t* num_bytes, bool all_or_none = false) {
-    MojoReadDataFlags flags = MOJO_READ_DATA_FLAG_DISCARD;
-    if (all_or_none)
-      flags |= MOJO_READ_DATA_FLAG_ALL_OR_NONE;
-    return MojoReadData(consumer_, nullptr, num_bytes, flags);
-  }
-
-  MojoResult BeginReadData(const void** elements,
-                           uint32_t* num_bytes,
-                           bool all_or_none = false) {
-    MojoReadDataFlags flags = MOJO_READ_DATA_FLAG_NONE;
-    if (all_or_none)
-      flags |= MOJO_READ_DATA_FLAG_ALL_OR_NONE;
-    return MojoBeginReadData(consumer_, elements, num_bytes, flags);
-  }
-
-  MojoResult EndReadData(uint32_t num_bytes_read) {
-    return MojoEndReadData(consumer_, num_bytes_read);
-  }
-
-  MojoResult BeginWriteData(void** elements,
-                            uint32_t* num_bytes,
-                            bool all_or_none = false) {
-    MojoReadDataFlags flags = MOJO_WRITE_DATA_FLAG_NONE;
-    if (all_or_none)
-      flags |= MOJO_WRITE_DATA_FLAG_ALL_OR_NONE;
-    return MojoBeginWriteData(producer_, elements, num_bytes, flags);
-  }
-
-  MojoResult EndWriteData(uint32_t num_bytes_written) {
-    return MojoEndWriteData(producer_, num_bytes_written);
-  }
-
-  MojoResult CloseProducer() {
-    MojoResult rv = MojoClose(producer_);
-    producer_ = MOJO_HANDLE_INVALID;
-    return rv;
-  }
-
-  MojoResult CloseConsumer() {
-    MojoResult rv = MojoClose(consumer_);
-    consumer_ = MOJO_HANDLE_INVALID;
-    return rv;
-  }
-
-  MojoHandle producer_, consumer_;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(DataPipeTest);
-};
-
-TEST_F(DataPipeTest, Basic) {
-  const MojoCreateDataPipeOptions options = {
-      kSizeOfOptions,                           // |struct_size|.
-      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-      static_cast<uint32_t>(sizeof(int32_t)),   // |element_num_bytes|.
-      1000 * sizeof(int32_t)                    // |capacity_num_bytes|.
-  };
-
-  ASSERT_EQ(MOJO_RESULT_OK, Create(&options));
-
-  // We can write to a data pipe handle immediately.
-  int32_t elements[10] = {};
-  uint32_t num_bytes = 0;
-
-  num_bytes =
-      static_cast<uint32_t>(arraysize(elements) * sizeof(elements[0]));
-
-  elements[0] = 123;
-  elements[1] = 456;
-  num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0]));
-  ASSERT_EQ(MOJO_RESULT_OK, WriteData(&elements[0], &num_bytes));
-
-  // Now wait for the other side to become readable.
-  MojoHandleSignalsState state;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(consumer_, MOJO_HANDLE_SIGNAL_READABLE, &state));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            state.satisfied_signals);
-
-  elements[0] = -1;
-  elements[1] = -1;
-  ASSERT_EQ(MOJO_RESULT_OK, ReadData(&elements[0], &num_bytes));
-  ASSERT_EQ(static_cast<uint32_t>(2u * sizeof(elements[0])), num_bytes);
-  ASSERT_EQ(elements[0], 123);
-  ASSERT_EQ(elements[1], 456);
-}
-
-// Tests creation of data pipes with various (valid) options.
-TEST_F(DataPipeTest, CreateAndMaybeTransfer) {
-  MojoCreateDataPipeOptions test_options[] = {
-      // Default options.
-      {},
-      // Trivial element size, non-default capacity.
-      {kSizeOfOptions,                           // |struct_size|.
-       MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-       1,                                        // |element_num_bytes|.
-       1000},                                    // |capacity_num_bytes|.
-      // Nontrivial element size, non-default capacity.
-      {kSizeOfOptions,                           // |struct_size|.
-       MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-       4,                                        // |element_num_bytes|.
-       4000},                                    // |capacity_num_bytes|.
-      // Nontrivial element size, default capacity.
-      {kSizeOfOptions,                           // |struct_size|.
-       MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-       100,                                      // |element_num_bytes|.
-       0}                                        // |capacity_num_bytes|.
-  };
-  for (size_t i = 0; i < arraysize(test_options); i++) {
-    MojoHandle producer_handle, consumer_handle;
-    MojoCreateDataPipeOptions* options =
-        i ? &test_options[i] : nullptr;
-    ASSERT_EQ(MOJO_RESULT_OK,
-              MojoCreateDataPipe(options, &producer_handle, &consumer_handle));
-    ASSERT_EQ(MOJO_RESULT_OK, MojoClose(producer_handle));
-    ASSERT_EQ(MOJO_RESULT_OK, MojoClose(consumer_handle));
-  }
-}
-
-TEST_F(DataPipeTest, SimpleReadWrite) {
-  const MojoCreateDataPipeOptions options = {
-      kSizeOfOptions,                           // |struct_size|.
-      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-      static_cast<uint32_t>(sizeof(int32_t)),   // |element_num_bytes|.
-      1000 * sizeof(int32_t)                    // |capacity_num_bytes|.
-  };
-
-  ASSERT_EQ(MOJO_RESULT_OK, Create(&options));
-  MojoHandleSignalsState hss;
-
-  int32_t elements[10] = {};
-  uint32_t num_bytes = 0;
-
-  // Try reading; nothing there yet.
-  num_bytes =
-      static_cast<uint32_t>(arraysize(elements) * sizeof(elements[0]));
-  ASSERT_EQ(MOJO_RESULT_SHOULD_WAIT, ReadData(elements, &num_bytes));
-
-  // Query; nothing there yet.
-  num_bytes = 0;
-  ASSERT_EQ(MOJO_RESULT_OK, QueryData(&num_bytes));
-  ASSERT_EQ(0u, num_bytes);
-
-  // Discard; nothing there yet.
-  num_bytes = static_cast<uint32_t>(5u * sizeof(elements[0]));
-  ASSERT_EQ(MOJO_RESULT_SHOULD_WAIT, DiscardData(&num_bytes));
-
-  // Read with invalid |num_bytes|.
-  num_bytes = sizeof(elements[0]) + 1;
-  ASSERT_EQ(MOJO_RESULT_INVALID_ARGUMENT, ReadData(elements, &num_bytes));
-
-  // Write two elements.
-  elements[0] = 123;
-  elements[1] = 456;
-  num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0]));
-  ASSERT_EQ(MOJO_RESULT_OK, WriteData(elements, &num_bytes));
-  // It should have written everything (even without "all or none").
-  ASSERT_EQ(2u * sizeof(elements[0]), num_bytes);
-
-  // Wait.
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(consumer_, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfiable_signals);
-
-  // Query.
-  // TODO(vtl): It's theoretically possible (though not with the current
-  // implementation/configured limits) that not all the data has arrived yet.
-  // (The theoretically-correct assertion here is that |num_bytes| is |1 * ...|
-  // or |2 * ...|.)
-  num_bytes = 0;
-  ASSERT_EQ(MOJO_RESULT_OK, QueryData(&num_bytes));
-  ASSERT_EQ(2 * sizeof(elements[0]), num_bytes);
-
-  // Read one element.
-  elements[0] = -1;
-  elements[1] = -1;
-  num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0]));
-  ASSERT_EQ(MOJO_RESULT_OK, ReadData(elements, &num_bytes));
-  ASSERT_EQ(1u * sizeof(elements[0]), num_bytes);
-  ASSERT_EQ(123, elements[0]);
-  ASSERT_EQ(-1, elements[1]);
-
-  // Query.
-  // TODO(vtl): See previous TODO. (If we got 2 elements there, however, we
-  // should get 1 here.)
-  num_bytes = 0;
-  ASSERT_EQ(MOJO_RESULT_OK, QueryData(&num_bytes));
-  ASSERT_EQ(1 * sizeof(elements[0]), num_bytes);
-
-  // Peek one element.
-  elements[0] = -1;
-  elements[1] = -1;
-  num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0]));
-  ASSERT_EQ(MOJO_RESULT_OK, ReadData(elements, &num_bytes, false, true));
-  ASSERT_EQ(1u * sizeof(elements[0]), num_bytes);
-  ASSERT_EQ(456, elements[0]);
-  ASSERT_EQ(-1, elements[1]);
-
-  // Query. Still has 1 element remaining.
-  num_bytes = 0;
-  ASSERT_EQ(MOJO_RESULT_OK, QueryData(&num_bytes));
-  ASSERT_EQ(1 * sizeof(elements[0]), num_bytes);
-
-  // Try to read two elements, with "all or none".
-  elements[0] = -1;
-  elements[1] = -1;
-  num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0]));
-  ASSERT_EQ(MOJO_RESULT_OUT_OF_RANGE,
-            ReadData(elements, &num_bytes, true, false));
-  ASSERT_EQ(-1, elements[0]);
-  ASSERT_EQ(-1, elements[1]);
-
-  // Try to read two elements, without "all or none".
-  elements[0] = -1;
-  elements[1] = -1;
-  num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0]));
-  ASSERT_EQ(MOJO_RESULT_OK, ReadData(elements, &num_bytes, false, false));
-  ASSERT_EQ(1u * sizeof(elements[0]), num_bytes);
-  ASSERT_EQ(456, elements[0]);
-  ASSERT_EQ(-1, elements[1]);
-
-  // Query.
-  num_bytes = 0;
-  ASSERT_EQ(MOJO_RESULT_OK, QueryData(&num_bytes));
-  ASSERT_EQ(0u, num_bytes);
-}
-
-// Note: The "basic" waiting tests test that the "wait states" are correct in
-// various situations; they don't test that waiters are properly awoken on state
-// changes. (For that, we need to use multiple threads.)
-TEST_F(DataPipeTest, BasicProducerWaiting) {
-  // Note: We take advantage of the fact that current for current
-  // implementations capacities are strict maximums. This is not guaranteed by
-  // the API.
-
-  const MojoCreateDataPipeOptions options = {
-      kSizeOfOptions,                           // |struct_size|.
-      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-      static_cast<uint32_t>(sizeof(int32_t)),   // |element_num_bytes|.
-      2 * sizeof(int32_t)                       // |capacity_num_bytes|.
-  };
-  Create(&options);
-  MojoHandleSignalsState hss;
-
-  // Never readable. Already writable.
-  hss = GetSignalsState(producer_);
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-            hss.satisfiable_signals);
-
-  // Write two elements.
-  int32_t elements[2] = {123, 456};
-  uint32_t num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0]));
-  ASSERT_EQ(MOJO_RESULT_OK, WriteData(elements, &num_bytes, true));
-  ASSERT_EQ(static_cast<uint32_t>(2u * sizeof(elements[0])), num_bytes);
-
-  // Wait for data to become available to the consumer.
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(consumer_, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfiable_signals);
-
-  // Peek one element.
-  elements[0] = -1;
-  elements[1] = -1;
-  num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0]));
-  ASSERT_EQ(MOJO_RESULT_OK, ReadData(elements, &num_bytes, true, true));
-  ASSERT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes);
-  ASSERT_EQ(123, elements[0]);
-  ASSERT_EQ(-1, elements[1]);
-
-  // Read one element.
-  elements[0] = -1;
-  elements[1] = -1;
-  num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0]));
-  ASSERT_EQ(MOJO_RESULT_OK, ReadData(elements, &num_bytes, true, false));
-  ASSERT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes);
-  ASSERT_EQ(123, elements[0]);
-  ASSERT_EQ(-1, elements[1]);
-
-  // Try writing, using a two-phase write.
-  void* buffer = nullptr;
-  num_bytes = static_cast<uint32_t>(3u * sizeof(elements[0]));
-  ASSERT_EQ(MOJO_RESULT_OK, BeginWriteData(&buffer, &num_bytes));
-  EXPECT_TRUE(buffer);
-  ASSERT_GE(num_bytes, static_cast<uint32_t>(1u * sizeof(elements[0])));
-
-  static_cast<int32_t*>(buffer)[0] = 789;
-  ASSERT_EQ(MOJO_RESULT_OK, EndWriteData(static_cast<uint32_t>(
-                                         1u * sizeof(elements[0]))));
-
-  // Read one element, using a two-phase read.
-  const void* read_buffer = nullptr;
-  num_bytes = 0u;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            BeginReadData(&read_buffer, &num_bytes, false));
-  EXPECT_TRUE(read_buffer);
-  // The two-phase read should be able to read at least one element.
-  ASSERT_GE(num_bytes, static_cast<uint32_t>(1u * sizeof(elements[0])));
-  ASSERT_EQ(456, static_cast<const int32_t*>(read_buffer)[0]);
-  ASSERT_EQ(MOJO_RESULT_OK, EndReadData(static_cast<uint32_t>(
-                                        1u * sizeof(elements[0]))));
-
-  // Write one element.
-  elements[0] = 123;
-  num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0]));
-  ASSERT_EQ(MOJO_RESULT_OK, WriteData(elements, &num_bytes));
-  ASSERT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes);
-
-  // Close the consumer.
-  CloseConsumer();
-
-  // It should now be never-writable.
-  hss = MojoHandleSignalsState();
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(producer_, MOJO_HANDLE_SIGNAL_PEER_CLOSED, &hss));
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals);
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals);
-}
-
-TEST_F(DataPipeTest, PeerClosedProducerWaiting) {
-  const MojoCreateDataPipeOptions options = {
-      kSizeOfOptions,                           // |struct_size|.
-      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-      static_cast<uint32_t>(sizeof(int32_t)),   // |element_num_bytes|.
-      2 * sizeof(int32_t)                       // |capacity_num_bytes|.
-  };
-  ASSERT_EQ(MOJO_RESULT_OK, Create(&options));
-  MojoHandleSignalsState hss;
-
-  // Close the consumer.
-  CloseConsumer();
-
-  // It should be signaled.
-  hss = MojoHandleSignalsState();
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(producer_, MOJO_HANDLE_SIGNAL_PEER_CLOSED, &hss));
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals);
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals);
-}
-
-TEST_F(DataPipeTest, PeerClosedConsumerWaiting) {
-  const MojoCreateDataPipeOptions options = {
-      kSizeOfOptions,                           // |struct_size|.
-      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-      static_cast<uint32_t>(sizeof(int32_t)),   // |element_num_bytes|.
-      2 * sizeof(int32_t)                       // |capacity_num_bytes|.
-  };
-  ASSERT_EQ(MOJO_RESULT_OK, Create(&options));
-  MojoHandleSignalsState hss;
-
-  // Close the producer.
-  CloseProducer();
-
-  // It should be signaled.
-  hss = MojoHandleSignalsState();
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(consumer_, MOJO_HANDLE_SIGNAL_PEER_CLOSED, &hss));
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals);
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals);
-}
-
-TEST_F(DataPipeTest, BasicConsumerWaiting) {
-  const MojoCreateDataPipeOptions options = {
-      kSizeOfOptions,                           // |struct_size|.
-      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-      static_cast<uint32_t>(sizeof(int32_t)),   // |element_num_bytes|.
-      1000 * sizeof(int32_t)                    // |capacity_num_bytes|.
-  };
-  ASSERT_EQ(MOJO_RESULT_OK, Create(&options));
-  MojoHandleSignalsState hss;
-
-  // Never writable.
-  hss = MojoHandleSignalsState();
-  ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-            WaitForSignals(consumer_, MOJO_HANDLE_SIGNAL_WRITABLE, &hss));
-  EXPECT_EQ(0u, hss.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfiable_signals);
-
-  // Write two elements.
-  int32_t elements[2] = {123, 456};
-  uint32_t num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0]));
-  ASSERT_EQ(MOJO_RESULT_OK, WriteData(elements, &num_bytes, true));
-
-  // Wait for readability.
-  hss = MojoHandleSignalsState();
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(consumer_, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfiable_signals);
-
-  // Discard one element.
-  num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0]));
-  ASSERT_EQ(MOJO_RESULT_OK, DiscardData(&num_bytes, true));
-  ASSERT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes);
-
-  // Should still be readable.
-  hss = MojoHandleSignalsState();
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(consumer_, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfiable_signals);
-
-  // Peek one element.
-  elements[0] = -1;
-  elements[1] = -1;
-  num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0]));
-  ASSERT_EQ(MOJO_RESULT_OK, ReadData(elements, &num_bytes, true, true));
-  ASSERT_EQ(456, elements[0]);
-  ASSERT_EQ(-1, elements[1]);
-
-  // Should still be readable.
-  hss = MojoHandleSignalsState();
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(consumer_, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfiable_signals);
-
-  // Read one element.
-  elements[0] = -1;
-  elements[1] = -1;
-  num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0]));
-  ASSERT_EQ(MOJO_RESULT_OK, ReadData(elements, &num_bytes, true));
-  ASSERT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes);
-  ASSERT_EQ(456, elements[0]);
-  ASSERT_EQ(-1, elements[1]);
-
-  // Write one element.
-  elements[0] = 789;
-  elements[1] = -1;
-  num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0]));
-  ASSERT_EQ(MOJO_RESULT_OK, WriteData(elements, &num_bytes, true));
-
-  // Waiting should now succeed.
-  hss = MojoHandleSignalsState();
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(consumer_, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfiable_signals);
-
-  // Close the producer.
-  CloseProducer();
-
-  // Should still be readable.
-  hss = MojoHandleSignalsState();
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(consumer_, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  EXPECT_TRUE(hss.satisfied_signals & (MOJO_HANDLE_SIGNAL_READABLE |
-                                       MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfiable_signals);
-
-  // Wait for the peer closed signal.
-  hss = MojoHandleSignalsState();
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(consumer_, MOJO_HANDLE_SIGNAL_PEER_CLOSED, &hss));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE |
-                MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-            hss.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfiable_signals);
-
-  // Read one element.
-  elements[0] = -1;
-  elements[1] = -1;
-  num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0]));
-  ASSERT_EQ(MOJO_RESULT_OK, ReadData(elements, &num_bytes, true));
-  ASSERT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes);
-  ASSERT_EQ(789, elements[0]);
-  ASSERT_EQ(-1, elements[1]);
-
-  // Should be never-readable.
-  hss = MojoHandleSignalsState();
-  ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-            WaitForSignals(consumer_, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals);
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals);
-}
-
-TEST_F(DataPipeTest, ConsumerNewDataReadable) {
-  const MojoCreateDataPipeOptions options = {
-      kSizeOfOptions,                           // |struct_size|.
-      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-      static_cast<uint32_t>(sizeof(int32_t)),   // |element_num_bytes|.
-      1000 * sizeof(int32_t)                    // |capacity_num_bytes|.
-  };
-  EXPECT_EQ(MOJO_RESULT_OK, Create(&options));
-
-  int32_t elements[2] = {123, 456};
-  uint32_t num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0]));
-  EXPECT_EQ(MOJO_RESULT_OK, WriteData(elements, &num_bytes, true));
-
-  // The consumer handle should appear to be readable and have new data.
-  EXPECT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(consumer_, MOJO_HANDLE_SIGNAL_READABLE));
-  EXPECT_TRUE(GetSignalsState(consumer_).satisfied_signals &
-              MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE);
-
-  // Now try to read a minimum of 6 elements.
-  int32_t read_elements[6];
-  uint32_t num_read_bytes = sizeof(read_elements);
-  EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE,
-            MojoReadData(consumer_, read_elements, &num_read_bytes,
-                         MOJO_READ_DATA_FLAG_ALL_OR_NONE));
-
-  // The consumer should still appear to be readable but not with new data.
-  EXPECT_TRUE(GetSignalsState(consumer_).satisfied_signals &
-              MOJO_HANDLE_SIGNAL_READABLE);
-  EXPECT_FALSE(GetSignalsState(consumer_).satisfied_signals &
-               MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE);
-
-  // Write four more elements.
-  EXPECT_EQ(MOJO_RESULT_OK, WriteData(elements, &num_bytes, true));
-  EXPECT_EQ(MOJO_RESULT_OK, WriteData(elements, &num_bytes, true));
-
-  // The consumer handle should once again appear to be readable.
-  EXPECT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(consumer_, MOJO_HANDLE_SIGNAL_READABLE));
-
-  // Try again to read a minimum of 6 elements. Should succeed this time.
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoReadData(consumer_, read_elements, &num_read_bytes,
-                         MOJO_READ_DATA_FLAG_ALL_OR_NONE));
-
-  // And now the consumer is unreadable.
-  EXPECT_FALSE(GetSignalsState(consumer_).satisfied_signals &
-               MOJO_HANDLE_SIGNAL_READABLE);
-  EXPECT_FALSE(GetSignalsState(consumer_).satisfied_signals &
-               MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE);
-}
-
-// Test with two-phase APIs and also closing the producer with an active
-// consumer waiter.
-TEST_F(DataPipeTest, ConsumerWaitingTwoPhase) {
-  const MojoCreateDataPipeOptions options = {
-      kSizeOfOptions,                           // |struct_size|.
-      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-      static_cast<uint32_t>(sizeof(int32_t)),   // |element_num_bytes|.
-      1000 * sizeof(int32_t)                    // |capacity_num_bytes|.
-  };
-  ASSERT_EQ(MOJO_RESULT_OK, Create(&options));
-  MojoHandleSignalsState hss;
-
-  // Write two elements.
-  int32_t* elements = nullptr;
-  void* buffer = nullptr;
-  // Request room for three (but we'll only write two).
-  uint32_t num_bytes = static_cast<uint32_t>(3u * sizeof(elements[0]));
-  ASSERT_EQ(MOJO_RESULT_OK, BeginWriteData(&buffer, &num_bytes, false));
-  EXPECT_TRUE(buffer);
-  EXPECT_GE(num_bytes, static_cast<uint32_t>(3u * sizeof(elements[0])));
-  elements = static_cast<int32_t*>(buffer);
-  elements[0] = 123;
-  elements[1] = 456;
-  ASSERT_EQ(MOJO_RESULT_OK, EndWriteData(2u * sizeof(elements[0])));
-
-  // Wait for readability.
-  hss = MojoHandleSignalsState();
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(consumer_, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfiable_signals);
-
-  // Read one element.
-  // Request two in all-or-none mode, but only read one.
-  const void* read_buffer = nullptr;
-  num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0]));
-  ASSERT_EQ(MOJO_RESULT_OK, BeginReadData(&read_buffer, &num_bytes, true));
-  EXPECT_TRUE(read_buffer);
-  ASSERT_EQ(static_cast<uint32_t>(2u * sizeof(elements[0])), num_bytes);
-  const int32_t* read_elements = static_cast<const int32_t*>(read_buffer);
-  ASSERT_EQ(123, read_elements[0]);
-  ASSERT_EQ(MOJO_RESULT_OK, EndReadData(1u * sizeof(elements[0])));
-
-  // Should still be readable.
-  hss = MojoHandleSignalsState();
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(consumer_, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfiable_signals);
-
-  // Read one element.
-  // Request three, but not in all-or-none mode.
-  read_buffer = nullptr;
-  num_bytes = static_cast<uint32_t>(3u * sizeof(elements[0]));
-  ASSERT_EQ(MOJO_RESULT_OK, BeginReadData(&read_buffer, &num_bytes));
-  EXPECT_TRUE(read_buffer);
-  ASSERT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes);
-  read_elements = static_cast<const int32_t*>(read_buffer);
-  ASSERT_EQ(456, read_elements[0]);
-  ASSERT_EQ(MOJO_RESULT_OK, EndReadData(1u * sizeof(elements[0])));
-
-  // Close the producer.
-  CloseProducer();
-
-  // Should be never-readable.
-  hss = MojoHandleSignalsState();
-  ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-            WaitForSignals(consumer_, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals);
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals);
-}
-
-// Tests that data pipes aren't writable/readable during two-phase writes/reads.
-TEST_F(DataPipeTest, BasicTwoPhaseWaiting) {
-  const MojoCreateDataPipeOptions options = {
-      kSizeOfOptions,                           // |struct_size|.
-      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-      static_cast<uint32_t>(sizeof(int32_t)),   // |element_num_bytes|.
-      1000 * sizeof(int32_t)                    // |capacity_num_bytes|.
-  };
-  ASSERT_EQ(MOJO_RESULT_OK, Create(&options));
-  MojoHandleSignalsState hss;
-
-  // It should be writable.
-  hss = GetSignalsState(producer_);
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-            hss.satisfiable_signals);
-
-  uint32_t num_bytes = static_cast<uint32_t>(1u * sizeof(int32_t));
-  void* write_ptr = nullptr;
-  ASSERT_EQ(MOJO_RESULT_OK, BeginWriteData(&write_ptr, &num_bytes));
-  EXPECT_TRUE(write_ptr);
-  EXPECT_GE(num_bytes, static_cast<uint32_t>(1u * sizeof(int32_t)));
-
-  // At this point, it shouldn't be writable.
-  hss = GetSignalsState(producer_);
-  ASSERT_EQ(0u, hss.satisfied_signals);
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-            hss.satisfiable_signals);
-
-  // It shouldn't be readable yet either (we'll wait later).
-  hss = GetSignalsState(consumer_);
-  ASSERT_EQ(0u, hss.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfiable_signals);
-
-  static_cast<int32_t*>(write_ptr)[0] = 123;
-  ASSERT_EQ(MOJO_RESULT_OK, EndWriteData(1u * sizeof(int32_t)));
-
-  // It should immediately be writable again.
-  hss = GetSignalsState(producer_);
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-            hss.satisfiable_signals);
-
-  // It should become readable.
-  hss = MojoHandleSignalsState();
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(consumer_, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfiable_signals);
-
-  // Start another two-phase write and check that it's readable even in the
-  // middle of it.
-  num_bytes = static_cast<uint32_t>(1u * sizeof(int32_t));
-  write_ptr = nullptr;
-  ASSERT_EQ(MOJO_RESULT_OK, BeginWriteData(&write_ptr, &num_bytes));
-  EXPECT_TRUE(write_ptr);
-  EXPECT_GE(num_bytes, static_cast<uint32_t>(1u * sizeof(int32_t)));
-
-  // It should be readable.
-  hss = MojoHandleSignalsState();
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(consumer_, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfiable_signals);
-
-  // End the two-phase write without writing anything.
-  ASSERT_EQ(MOJO_RESULT_OK, EndWriteData(0u));
-
-  // Start a two-phase read.
-  num_bytes = static_cast<uint32_t>(1u * sizeof(int32_t));
-  const void* read_ptr = nullptr;
-  ASSERT_EQ(MOJO_RESULT_OK, BeginReadData(&read_ptr, &num_bytes));
-  EXPECT_TRUE(read_ptr);
-  ASSERT_EQ(static_cast<uint32_t>(1u * sizeof(int32_t)), num_bytes);
-
-  // At this point, it should still be writable.
-  hss = GetSignalsState(producer_);
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-            hss.satisfiable_signals);
-
-  // But not readable.
-  hss = GetSignalsState(consumer_);
-  ASSERT_EQ(0u, hss.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfiable_signals);
-
-  // End the two-phase read without reading anything.
-  ASSERT_EQ(MOJO_RESULT_OK, EndReadData(0u));
-
-  // It should be readable again.
-  hss = GetSignalsState(consumer_);
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfiable_signals);
-}
-
-void Seq(int32_t start, size_t count, int32_t* out) {
-  for (size_t i = 0; i < count; i++)
-    out[i] = start + static_cast<int32_t>(i);
-}
-
-TEST_F(DataPipeTest, AllOrNone) {
-  const MojoCreateDataPipeOptions options = {
-      kSizeOfOptions,                           // |struct_size|.
-      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-      static_cast<uint32_t>(sizeof(int32_t)),   // |element_num_bytes|.
-      10 * sizeof(int32_t)                      // |capacity_num_bytes|.
-  };
-  ASSERT_EQ(MOJO_RESULT_OK, Create(&options));
-  MojoHandleSignalsState hss;
-
-  // Try writing more than the total capacity of the pipe.
-  uint32_t num_bytes = 20u * sizeof(int32_t);
-  int32_t buffer[100];
-  Seq(0, arraysize(buffer), buffer);
-  ASSERT_EQ(MOJO_RESULT_OUT_OF_RANGE, WriteData(buffer, &num_bytes, true));
-
-  // Should still be empty.
-  num_bytes = ~0u;
-  ASSERT_EQ(MOJO_RESULT_OK, QueryData(&num_bytes));
-  ASSERT_EQ(0u, num_bytes);
-
-  // Write some data.
-  num_bytes = 5u * sizeof(int32_t);
-  Seq(100, arraysize(buffer), buffer);
-  ASSERT_EQ(MOJO_RESULT_OK, WriteData(buffer, &num_bytes, true));
-  ASSERT_EQ(5u * sizeof(int32_t), num_bytes);
-
-  // Wait for data.
-  // TODO(vtl): There's no real guarantee that all the data will become
-  // available at once (except that in current implementations, with reasonable
-  // limits, it will). Eventually, we'll be able to wait for a specified amount
-  // of data to become available.
-  hss = MojoHandleSignalsState();
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(consumer_, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE |
-                MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-            hss.satisfiable_signals);
-
-  // Half full.
-  num_bytes = 0u;
-  ASSERT_EQ(MOJO_RESULT_OK, QueryData(&num_bytes));
-  ASSERT_EQ(5u * sizeof(int32_t), num_bytes);
-
-  // Try writing more than the available capacity of the pipe, but less than the
-  // total capacity.
-  num_bytes = 6u * sizeof(int32_t);
-  Seq(200, arraysize(buffer), buffer);
-  ASSERT_EQ(MOJO_RESULT_OUT_OF_RANGE, WriteData(buffer, &num_bytes, true));
-
-  // Try reading too much.
-  num_bytes = 11u * sizeof(int32_t);
-  memset(buffer, 0xab, sizeof(buffer));
-  ASSERT_EQ(MOJO_RESULT_OUT_OF_RANGE, ReadData(buffer, &num_bytes, true));
-  int32_t expected_buffer[100];
-  memset(expected_buffer, 0xab, sizeof(expected_buffer));
-  ASSERT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer)));
-
-  // Try discarding too much.
-  num_bytes = 11u * sizeof(int32_t);
-  ASSERT_EQ(MOJO_RESULT_OUT_OF_RANGE, DiscardData(&num_bytes, true));
-
-  // Just a little.
-  num_bytes = 2u * sizeof(int32_t);
-  Seq(300, arraysize(buffer), buffer);
-  ASSERT_EQ(MOJO_RESULT_OK, WriteData(buffer, &num_bytes, true));
-  ASSERT_EQ(2u * sizeof(int32_t), num_bytes);
-
-  // Just right.
-  num_bytes = 3u * sizeof(int32_t);
-  Seq(400, arraysize(buffer), buffer);
-  ASSERT_EQ(MOJO_RESULT_OK, WriteData(buffer, &num_bytes, true));
-  ASSERT_EQ(3u * sizeof(int32_t), num_bytes);
-
-  // TODO(vtl): Hack (see also the TODO above): We can't currently wait for a
-  // specified amount of data to be available, so poll.
-  for (size_t i = 0; i < kMaxPoll; i++) {
-    num_bytes = 0u;
-    ASSERT_EQ(MOJO_RESULT_OK, QueryData(&num_bytes));
-    if (num_bytes >= 10u * sizeof(int32_t))
-      break;
-
-    test::Sleep(test::EpsilonDeadline());
-  }
-  ASSERT_EQ(10u * sizeof(int32_t), num_bytes);
-
-  // Read half.
-  num_bytes = 5u * sizeof(int32_t);
-  memset(buffer, 0xab, sizeof(buffer));
-  ASSERT_EQ(MOJO_RESULT_OK, ReadData(buffer, &num_bytes, true));
-  ASSERT_EQ(5u * sizeof(int32_t), num_bytes);
-  memset(expected_buffer, 0xab, sizeof(expected_buffer));
-  Seq(100, 5, expected_buffer);
-  ASSERT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer)));
-
-  // Try reading too much again.
-  num_bytes = 6u * sizeof(int32_t);
-  memset(buffer, 0xab, sizeof(buffer));
-  ASSERT_EQ(MOJO_RESULT_OUT_OF_RANGE, ReadData(buffer, &num_bytes, true));
-  memset(expected_buffer, 0xab, sizeof(expected_buffer));
-  ASSERT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer)));
-
-  // Try discarding too much again.
-  num_bytes = 6u * sizeof(int32_t);
-  ASSERT_EQ(MOJO_RESULT_OUT_OF_RANGE, DiscardData(&num_bytes, true));
-
-  // Discard a little.
-  num_bytes = 2u * sizeof(int32_t);
-  ASSERT_EQ(MOJO_RESULT_OK, DiscardData(&num_bytes, true));
-  ASSERT_EQ(2u * sizeof(int32_t), num_bytes);
-
-  // Three left.
-  num_bytes = 0u;
-  ASSERT_EQ(MOJO_RESULT_OK, QueryData(&num_bytes));
-  ASSERT_EQ(3u * sizeof(int32_t), num_bytes);
-
-  // Close the producer, then test producer-closed cases.
-  CloseProducer();
-
-  // Wait.
-  hss = MojoHandleSignalsState();
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(consumer_, MOJO_HANDLE_SIGNAL_PEER_CLOSED, &hss));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-            hss.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-            hss.satisfiable_signals);
-
-  // Try reading too much; "failed precondition" since the producer is closed.
-  num_bytes = 4u * sizeof(int32_t);
-  memset(buffer, 0xab, sizeof(buffer));
-  ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-            ReadData(buffer, &num_bytes, true));
-  memset(expected_buffer, 0xab, sizeof(expected_buffer));
-  ASSERT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer)));
-
-  // Try discarding too much; "failed precondition" again.
-  num_bytes = 4u * sizeof(int32_t);
-  ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION, DiscardData(&num_bytes, true));
-
-  // Read a little.
-  num_bytes = 2u * sizeof(int32_t);
-  memset(buffer, 0xab, sizeof(buffer));
-  ASSERT_EQ(MOJO_RESULT_OK, ReadData(buffer, &num_bytes, true));
-  ASSERT_EQ(2u * sizeof(int32_t), num_bytes);
-  memset(expected_buffer, 0xab, sizeof(expected_buffer));
-  Seq(400, 2, expected_buffer);
-  ASSERT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer)));
-
-  // Discard the remaining element.
-  num_bytes = 1u * sizeof(int32_t);
-  ASSERT_EQ(MOJO_RESULT_OK, DiscardData(&num_bytes, true));
-  ASSERT_EQ(1u * sizeof(int32_t), num_bytes);
-
-  // Empty again.
-  num_bytes = ~0u;
-  ASSERT_EQ(MOJO_RESULT_OK, QueryData(&num_bytes));
-  ASSERT_EQ(0u, num_bytes);
-}
-
-// Tests that |ProducerWriteData()| and |ConsumerReadData()| writes and reads,
-// respectively, as much as possible, even if it may have to "wrap around" the
-// internal circular buffer. (Note that the two-phase write and read need not do
-// this.)
-TEST_F(DataPipeTest, WrapAround) {
-  unsigned char test_data[1000];
-  for (size_t i = 0; i < arraysize(test_data); i++)
-    test_data[i] = static_cast<unsigned char>(i);
-
-  const MojoCreateDataPipeOptions options = {
-      kSizeOfOptions,                           // |struct_size|.
-      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-      1u,                                       // |element_num_bytes|.
-      100u                                      // |capacity_num_bytes|.
-  };
-
-  ASSERT_EQ(MOJO_RESULT_OK, Create(&options));
-  MojoHandleSignalsState hss;
-
-  // Write 20 bytes.
-  uint32_t num_bytes = 20u;
-  ASSERT_EQ(MOJO_RESULT_OK, WriteData(&test_data[0], &num_bytes, true));
-  ASSERT_EQ(20u, num_bytes);
-
-  // Wait for data.
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(consumer_, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  EXPECT_TRUE(hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfiable_signals);
-
-  // Read 10 bytes.
-  unsigned char read_buffer[1000] = {0};
-  num_bytes = 10u;
-  ASSERT_EQ(MOJO_RESULT_OK, ReadData(read_buffer, &num_bytes, true));
-  ASSERT_EQ(10u, num_bytes);
-  ASSERT_EQ(0, memcmp(read_buffer, &test_data[0], 10u));
-
-  // Check that a two-phase write can now only write (at most) 80 bytes. (This
-  // checks an implementation detail; this behavior is not guaranteed.)
-  void* write_buffer_ptr = nullptr;
-  num_bytes = 0u;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            BeginWriteData(&write_buffer_ptr, &num_bytes, false));
-  EXPECT_TRUE(write_buffer_ptr);
-  ASSERT_EQ(80u, num_bytes);
-  ASSERT_EQ(MOJO_RESULT_OK, EndWriteData(0));
-
-  size_t total_num_bytes = 0;
-  while (total_num_bytes < 90) {
-    // Wait to write.
-    ASSERT_EQ(MOJO_RESULT_OK,
-              WaitForSignals(producer_, MOJO_HANDLE_SIGNAL_WRITABLE, &hss));
-    ASSERT_EQ(hss.satisfied_signals, MOJO_HANDLE_SIGNAL_WRITABLE);
-    ASSERT_EQ(hss.satisfiable_signals,
-              MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED);
-
-    // Write as much as we can.
-    num_bytes = 100;
-    ASSERT_EQ(MOJO_RESULT_OK,
-              WriteData(&test_data[20 + total_num_bytes], &num_bytes, false));
-    total_num_bytes += num_bytes;
-  }
-
-  ASSERT_EQ(90u, total_num_bytes);
-
-  num_bytes = 0;
-  ASSERT_EQ(MOJO_RESULT_OK, QueryData(&num_bytes));
-  ASSERT_EQ(100u, num_bytes);
-
-  // Check that a two-phase read can now only read (at most) 90 bytes. (This
-  // checks an implementation detail; this behavior is not guaranteed.)
-  const void* read_buffer_ptr = nullptr;
-  num_bytes = 0;
-  ASSERT_EQ(MOJO_RESULT_OK, BeginReadData(&read_buffer_ptr, &num_bytes, false));
-  EXPECT_TRUE(read_buffer_ptr);
-  ASSERT_EQ(90u, num_bytes);
-  ASSERT_EQ(MOJO_RESULT_OK, EndReadData(0));
-
-  // Read as much as possible. We should read 100 bytes.
-  num_bytes = static_cast<uint32_t>(arraysize(read_buffer) *
-                                    sizeof(read_buffer[0]));
-  memset(read_buffer, 0, num_bytes);
-  ASSERT_EQ(MOJO_RESULT_OK, ReadData(read_buffer, &num_bytes));
-  ASSERT_EQ(100u, num_bytes);
-  ASSERT_EQ(0, memcmp(read_buffer, &test_data[10], 100u));
-}
-
-// Tests the behavior of writing (simple and two-phase), closing the producer,
-// then reading (simple and two-phase).
-TEST_F(DataPipeTest, WriteCloseProducerRead) {
-  const char kTestData[] = "hello world";
-  const uint32_t kTestDataSize = static_cast<uint32_t>(sizeof(kTestData));
-
-  const MojoCreateDataPipeOptions options = {
-      kSizeOfOptions,                           // |struct_size|.
-      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-      1u,                                       // |element_num_bytes|.
-      1000u                                     // |capacity_num_bytes|.
-  };
-  ASSERT_EQ(MOJO_RESULT_OK, Create(&options));
-
-  // Write some data, so we'll have something to read.
-  uint32_t num_bytes = kTestDataSize;
-  ASSERT_EQ(MOJO_RESULT_OK, WriteData(kTestData, &num_bytes, false));
-  ASSERT_EQ(kTestDataSize, num_bytes);
-
-  // Write it again, so we'll have something left over.
-  num_bytes = kTestDataSize;
-  ASSERT_EQ(MOJO_RESULT_OK, WriteData(kTestData, &num_bytes, false));
-  ASSERT_EQ(kTestDataSize, num_bytes);
-
-  // Start two-phase write.
-  void* write_buffer_ptr = nullptr;
-  num_bytes = 0u;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            BeginWriteData(&write_buffer_ptr, &num_bytes, false));
-  EXPECT_TRUE(write_buffer_ptr);
-  EXPECT_GT(num_bytes, 0u);
-
-  // TODO(vtl): (See corresponding TODO in TwoPhaseAllOrNone.)
-  for (size_t i = 0; i < kMaxPoll; i++) {
-    num_bytes = 0u;
-    ASSERT_EQ(MOJO_RESULT_OK, QueryData(&num_bytes));
-    if (num_bytes >= 2u * kTestDataSize)
-      break;
-
-    test::Sleep(test::EpsilonDeadline());
-  }
-  ASSERT_EQ(2u * kTestDataSize, num_bytes);
-
-  // Start two-phase read.
-  const void* read_buffer_ptr = nullptr;
-  num_bytes = 0u;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            BeginReadData(&read_buffer_ptr, &num_bytes));
-  EXPECT_TRUE(read_buffer_ptr);
-  ASSERT_EQ(2u * kTestDataSize, num_bytes);
-
-  // Close the producer.
-  CloseProducer();
-
-  // The consumer can finish its two-phase read.
-  ASSERT_EQ(0, memcmp(read_buffer_ptr, kTestData, kTestDataSize));
-  ASSERT_EQ(MOJO_RESULT_OK, EndReadData(kTestDataSize));
-
-  // And start another.
-  read_buffer_ptr = nullptr;
-  num_bytes = 0u;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            BeginReadData(&read_buffer_ptr, &num_bytes));
-  EXPECT_TRUE(read_buffer_ptr);
-  ASSERT_EQ(kTestDataSize, num_bytes);
-}
-
-
-// Tests the behavior of interrupting a two-phase read and write by closing the
-// consumer.
-TEST_F(DataPipeTest, TwoPhaseWriteReadCloseConsumer) {
-  const char kTestData[] = "hello world";
-  const uint32_t kTestDataSize = static_cast<uint32_t>(sizeof(kTestData));
-
-  const MojoCreateDataPipeOptions options = {
-      kSizeOfOptions,                           // |struct_size|.
-      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-      1u,                                       // |element_num_bytes|.
-      1000u                                     // |capacity_num_bytes|.
-  };
-  ASSERT_EQ(MOJO_RESULT_OK, Create(&options));
-  MojoHandleSignalsState hss;
-
-  // Write some data, so we'll have something to read.
-  uint32_t num_bytes = kTestDataSize;
-  ASSERT_EQ(MOJO_RESULT_OK, WriteData(kTestData, &num_bytes));
-  ASSERT_EQ(kTestDataSize, num_bytes);
-
-  // Start two-phase write.
-  void* write_buffer_ptr = nullptr;
-  num_bytes = 0u;
-  ASSERT_EQ(MOJO_RESULT_OK, BeginWriteData(&write_buffer_ptr, &num_bytes));
-  EXPECT_TRUE(write_buffer_ptr);
-  ASSERT_GT(num_bytes, kTestDataSize);
-
-  // Wait for data.
-  // TODO(vtl): (See corresponding TODO in AllOrNone.)
-  hss = MojoHandleSignalsState();
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(consumer_, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfiable_signals);
-
-  // Start two-phase read.
-  const void* read_buffer_ptr = nullptr;
-  num_bytes = 0u;
-  ASSERT_EQ(MOJO_RESULT_OK, BeginReadData(&read_buffer_ptr, &num_bytes));
-  EXPECT_TRUE(read_buffer_ptr);
-  ASSERT_EQ(kTestDataSize, num_bytes);
-
-  // Close the consumer.
-  CloseConsumer();
-
-  // Wait for producer to know that the consumer is closed.
-  hss = MojoHandleSignalsState();
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(producer_, MOJO_HANDLE_SIGNAL_PEER_CLOSED, &hss));
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals);
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals);
-
-  // Actually write some data. (Note: Premature freeing of the buffer would
-  // probably only be detected under ASAN or similar.)
-  memcpy(write_buffer_ptr, kTestData, kTestDataSize);
-  // Note: Even though the consumer has been closed, ending the two-phase
-  // write will report success.
-  ASSERT_EQ(MOJO_RESULT_OK, EndWriteData(kTestDataSize));
-
-  // But trying to write should result in failure.
-  num_bytes = kTestDataSize;
-  ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION, WriteData(kTestData, &num_bytes));
-
-  // As will trying to start another two-phase write.
-  write_buffer_ptr = nullptr;
-  num_bytes = 0u;
-  ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-            BeginWriteData(&write_buffer_ptr, &num_bytes));
-}
-
-// Tests the behavior of "interrupting" a two-phase write by closing both the
-// producer and the consumer.
-TEST_F(DataPipeTest, TwoPhaseWriteCloseBoth) {
-  const uint32_t kTestDataSize = 15u;
-
-  const MojoCreateDataPipeOptions options = {
-      kSizeOfOptions,                           // |struct_size|.
-      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-      1u,                                       // |element_num_bytes|.
-      1000u                                     // |capacity_num_bytes|.
-  };
-  ASSERT_EQ(MOJO_RESULT_OK, Create(&options));
-
-  // Start two-phase write.
-  void* write_buffer_ptr = nullptr;
-  uint32_t num_bytes = 0u;
-  ASSERT_EQ(MOJO_RESULT_OK, BeginWriteData(&write_buffer_ptr, &num_bytes));
-  EXPECT_TRUE(write_buffer_ptr);
-  ASSERT_GT(num_bytes, kTestDataSize);
-}
-
-// Tests the behavior of writing, closing the producer, and then reading (with
-// and without data remaining).
-TEST_F(DataPipeTest, WriteCloseProducerReadNoData) {
-  const char kTestData[] = "hello world";
-  const uint32_t kTestDataSize = static_cast<uint32_t>(sizeof(kTestData));
-
-  const MojoCreateDataPipeOptions options = {
-      kSizeOfOptions,                           // |struct_size|.
-      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-      1u,                                       // |element_num_bytes|.
-      1000u                                     // |capacity_num_bytes|.
-  };
-  ASSERT_EQ(MOJO_RESULT_OK, Create(&options));
-  MojoHandleSignalsState hss;
-
-  // Write some data, so we'll have something to read.
-  uint32_t num_bytes = kTestDataSize;
-  ASSERT_EQ(MOJO_RESULT_OK, WriteData(kTestData, &num_bytes));
-  ASSERT_EQ(kTestDataSize, num_bytes);
-
-  // Close the producer.
-  CloseProducer();
-
-  // Wait. (Note that once the consumer knows that the producer is closed, it
-  // must also know about all the data that was sent.)
-  hss = MojoHandleSignalsState();
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(consumer_, MOJO_HANDLE_SIGNAL_PEER_CLOSED, &hss));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfiable_signals);
-
-  // Peek that data.
-  char buffer[1000];
-  num_bytes = static_cast<uint32_t>(sizeof(buffer));
-  ASSERT_EQ(MOJO_RESULT_OK, ReadData(buffer, &num_bytes, false, true));
-  ASSERT_EQ(kTestDataSize, num_bytes);
-  ASSERT_EQ(0, memcmp(buffer, kTestData, kTestDataSize));
-
-  // Read that data.
-  memset(buffer, 0, 1000);
-  num_bytes = static_cast<uint32_t>(sizeof(buffer));
-  ASSERT_EQ(MOJO_RESULT_OK, ReadData(buffer, &num_bytes));
-  ASSERT_EQ(kTestDataSize, num_bytes);
-  ASSERT_EQ(0, memcmp(buffer, kTestData, kTestDataSize));
-
-  // A second read should fail.
-  num_bytes = static_cast<uint32_t>(sizeof(buffer));
-  ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION, ReadData(buffer, &num_bytes));
-
-  // A two-phase read should also fail.
-  const void* read_buffer_ptr = nullptr;
-  num_bytes = 0u;
-  ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-            BeginReadData(&read_buffer_ptr, &num_bytes));
-
-  // Ditto for discard.
-  num_bytes = 10u;
-  ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION, DiscardData(&num_bytes));
-}
-
-// Test that during a two phase read the memory stays valid even if more data
-// comes in.
-TEST_F(DataPipeTest, TwoPhaseReadMemoryStable) {
-  const char kTestData[] = "hello world";
-  const uint32_t kTestDataSize = static_cast<uint32_t>(sizeof(kTestData));
-
-  const MojoCreateDataPipeOptions options = {
-      kSizeOfOptions,                           // |struct_size|.
-      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-      1u,                                       // |element_num_bytes|.
-      1000u                                     // |capacity_num_bytes|.
-  };
-  ASSERT_EQ(MOJO_RESULT_OK, Create(&options));
-  MojoHandleSignalsState hss;
-
-  // Write some data.
-  uint32_t num_bytes = kTestDataSize;
-  ASSERT_EQ(MOJO_RESULT_OK, WriteData(kTestData, &num_bytes));
-  ASSERT_EQ(kTestDataSize, num_bytes);
-
-  // Wait for the data.
-  hss = MojoHandleSignalsState();
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(consumer_, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfiable_signals);
-
-  // Begin a two-phase read.
-  const void* read_buffer_ptr = nullptr;
-  uint32_t read_buffer_size = 0u;
-  ASSERT_EQ(MOJO_RESULT_OK, BeginReadData(&read_buffer_ptr, &read_buffer_size));
-
-  // Write more data.
-  const char kExtraData[] = "bye world";
-  const uint32_t kExtraDataSize = static_cast<uint32_t>(sizeof(kExtraData));
-  num_bytes = kExtraDataSize;
-  ASSERT_EQ(MOJO_RESULT_OK, WriteData(kExtraData, &num_bytes));
-  ASSERT_EQ(kExtraDataSize, num_bytes);
-
-  // Close the producer.
-  CloseProducer();
-
-  // Wait. (Note that once the consumer knows that the producer is closed, it
-  // must also have received the extra data).
-  hss = MojoHandleSignalsState();
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(consumer_, MOJO_HANDLE_SIGNAL_PEER_CLOSED, &hss));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfiable_signals);
-
-  // Read the two phase memory to check it's still valid.
-  ASSERT_EQ(0, memcmp(read_buffer_ptr, kTestData, kTestDataSize));
-  EndReadData(read_buffer_size);
-}
-
-// Test that two-phase reads/writes behave correctly when given invalid
-// arguments.
-TEST_F(DataPipeTest, TwoPhaseMoreInvalidArguments) {
-  const MojoCreateDataPipeOptions options = {
-      kSizeOfOptions,                           // |struct_size|.
-      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-      static_cast<uint32_t>(sizeof(int32_t)),   // |element_num_bytes|.
-      10 * sizeof(int32_t)                      // |capacity_num_bytes|.
-  };
-  ASSERT_EQ(MOJO_RESULT_OK, Create(&options));
-  MojoHandleSignalsState hss;
-
-  // No data.
-  uint32_t num_bytes = 1000u;
-  ASSERT_EQ(MOJO_RESULT_OK, QueryData(&num_bytes));
-  ASSERT_EQ(0u, num_bytes);
-
-  // Try "ending" a two-phase write when one isn't active.
-  ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-            EndWriteData(1u * sizeof(int32_t)));
-
-  // Wait a bit, to make sure that if a signal were (incorrectly) sent, it'd
-  // have time to propagate.
-  test::Sleep(test::EpsilonDeadline());
-
-  // Still no data.
-  num_bytes = 1000u;
-  ASSERT_EQ(MOJO_RESULT_OK, QueryData(&num_bytes));
-  ASSERT_EQ(0u, num_bytes);
-
-  // Try ending a two-phase write with an invalid amount (too much).
-  num_bytes = 0u;
-  void* write_ptr = nullptr;
-  ASSERT_EQ(MOJO_RESULT_OK, BeginWriteData(&write_ptr, &num_bytes));
-  ASSERT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            EndWriteData(num_bytes + static_cast<uint32_t>(sizeof(int32_t))));
-
-  // But the two-phase write still ended.
-  ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION, EndWriteData(0u));
-
-  // Wait a bit (as above).
-  test::Sleep(test::EpsilonDeadline());
-
-  // Still no data.
-  num_bytes = 1000u;
-  ASSERT_EQ(MOJO_RESULT_OK, QueryData(&num_bytes));
-  ASSERT_EQ(0u, num_bytes);
-
-  // Try ending a two-phase write with an invalid amount (not a multiple of the
-  // element size).
-  num_bytes = 0u;
-  write_ptr = nullptr;
-  ASSERT_EQ(MOJO_RESULT_OK, BeginWriteData(&write_ptr, &num_bytes));
-  EXPECT_GE(num_bytes, 1u);
-  ASSERT_EQ(MOJO_RESULT_INVALID_ARGUMENT, EndWriteData(1u));
-
-  // But the two-phase write still ended.
-  ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION, EndWriteData(0u));
-
-  // Wait a bit (as above).
-  test::Sleep(test::EpsilonDeadline());
-
-  // Still no data.
-  num_bytes = 1000u;
-  ASSERT_EQ(MOJO_RESULT_OK, QueryData(&num_bytes));
-  ASSERT_EQ(0u, num_bytes);
-
-  // Now write some data, so we'll be able to try reading.
-  int32_t element = 123;
-  num_bytes = 1u * sizeof(int32_t);
-  ASSERT_EQ(MOJO_RESULT_OK, WriteData(&element, &num_bytes));
-
-  // Wait for data.
-  // TODO(vtl): (See corresponding TODO in AllOrNone.)
-  hss = MojoHandleSignalsState();
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(consumer_, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfiable_signals);
-
-  // One element available.
-  num_bytes = 0u;
-  ASSERT_EQ(MOJO_RESULT_OK, QueryData(&num_bytes));
-  ASSERT_EQ(1u * sizeof(int32_t), num_bytes);
-
-  // Try "ending" a two-phase read when one isn't active.
-  ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION, EndReadData(1u * sizeof(int32_t)));
-
-  // Still one element available.
-  num_bytes = 0u;
-  ASSERT_EQ(MOJO_RESULT_OK, QueryData(&num_bytes));
-  ASSERT_EQ(1u * sizeof(int32_t), num_bytes);
-
-  // Try ending a two-phase read with an invalid amount (too much).
-  num_bytes = 0u;
-  const void* read_ptr = nullptr;
-  ASSERT_EQ(MOJO_RESULT_OK, BeginReadData(&read_ptr, &num_bytes));
-  ASSERT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            EndReadData(num_bytes + static_cast<uint32_t>(sizeof(int32_t))));
-
-  // Still one element available.
-  num_bytes = 0u;
-  ASSERT_EQ(MOJO_RESULT_OK, QueryData(&num_bytes));
-  ASSERT_EQ(1u * sizeof(int32_t), num_bytes);
-
-  // Try ending a two-phase read with an invalid amount (not a multiple of the
-  // element size).
-  num_bytes = 0u;
-  read_ptr = nullptr;
-  ASSERT_EQ(MOJO_RESULT_OK, BeginReadData(&read_ptr, &num_bytes));
-  ASSERT_EQ(1u * sizeof(int32_t), num_bytes);
-  ASSERT_EQ(123, static_cast<const int32_t*>(read_ptr)[0]);
-  ASSERT_EQ(MOJO_RESULT_INVALID_ARGUMENT, EndReadData(1u));
-
-  // Still one element available.
-  num_bytes = 0u;
-  ASSERT_EQ(MOJO_RESULT_OK, QueryData(&num_bytes));
-  ASSERT_EQ(1u * sizeof(int32_t), num_bytes);
-}
-
-// Test that a producer can be sent over a MP.
-TEST_F(DataPipeTest, SendProducer) {
-  const char kTestData[] = "hello world";
-  const uint32_t kTestDataSize = static_cast<uint32_t>(sizeof(kTestData));
-
-  const MojoCreateDataPipeOptions options = {
-      kSizeOfOptions,                           // |struct_size|.
-      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-      1u,                                       // |element_num_bytes|.
-      1000u                                     // |capacity_num_bytes|.
-  };
-  ASSERT_EQ(MOJO_RESULT_OK, Create(&options));
-  MojoHandleSignalsState hss;
-
-  // Write some data.
-  uint32_t num_bytes = kTestDataSize;
-  ASSERT_EQ(MOJO_RESULT_OK, WriteData(kTestData, &num_bytes));
-  ASSERT_EQ(kTestDataSize, num_bytes);
-
-  // Wait for the data.
-  hss = MojoHandleSignalsState();
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(consumer_, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfiable_signals);
-
-  // Check the data.
-  const void* read_buffer = nullptr;
-  num_bytes = 0u;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            BeginReadData(&read_buffer, &num_bytes, false));
-  ASSERT_EQ(0, memcmp(read_buffer, kTestData, kTestDataSize));
-  EndReadData(num_bytes);
-
-  // Now send the producer over a MP so that it's serialized.
-  MojoHandle pipe0, pipe1;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            MojoCreateMessagePipe(nullptr, &pipe0, &pipe1));
-
-  ASSERT_EQ(MOJO_RESULT_OK,
-            MojoWriteMessage(pipe0, nullptr, 0, &producer_, 1,
-                             MOJO_WRITE_MESSAGE_FLAG_NONE));
-  producer_ = MOJO_HANDLE_INVALID;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(pipe1, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  uint32_t num_handles = 1;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            MojoReadMessage(pipe1, nullptr, 0, &producer_, &num_handles,
-                            MOJO_READ_MESSAGE_FLAG_NONE));
-  ASSERT_EQ(num_handles, 1u);
-
-  // Write more data.
-  const char kExtraData[] = "bye world";
-  const uint32_t kExtraDataSize = static_cast<uint32_t>(sizeof(kExtraData));
-  num_bytes = kExtraDataSize;
-  ASSERT_EQ(MOJO_RESULT_OK, WriteData(kExtraData, &num_bytes));
-  ASSERT_EQ(kExtraDataSize, num_bytes);
-
-  // Wait for it.
-  hss = MojoHandleSignalsState();
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(consumer_, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            hss.satisfiable_signals);
-
-  // Check the second write.
-  num_bytes = 0u;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            BeginReadData(&read_buffer, &num_bytes, false));
-  ASSERT_EQ(0, memcmp(read_buffer, kExtraData, kExtraDataSize));
-  EndReadData(num_bytes);
-
-  ASSERT_EQ(MOJO_RESULT_OK, MojoClose(pipe0));
-  ASSERT_EQ(MOJO_RESULT_OK, MojoClose(pipe1));
-}
-
-// Ensures that if a data pipe consumer whose producer has closed is passed over
-// a message pipe, the deserialized dispatcher is also marked as having a closed
-// peer.
-TEST_F(DataPipeTest, ConsumerWithClosedProducerSent) {
-  const MojoCreateDataPipeOptions options = {
-      kSizeOfOptions,                           // |struct_size|.
-      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-      static_cast<uint32_t>(sizeof(int32_t)),   // |element_num_bytes|.
-      1000 * sizeof(int32_t)                    // |capacity_num_bytes|.
-  };
-
-  ASSERT_EQ(MOJO_RESULT_OK, Create(&options));
-
-  // We can write to a data pipe handle immediately.
-  int32_t data = 123;
-  uint32_t num_bytes = sizeof(data);
-  ASSERT_EQ(MOJO_RESULT_OK, WriteData(&data, &num_bytes));
-  ASSERT_EQ(MOJO_RESULT_OK, CloseProducer());
-
-  // Now wait for the other side to become readable and to see the peer closed.
-  MojoHandleSignalsState state;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(consumer_, MOJO_HANDLE_SIGNAL_PEER_CLOSED, &state));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            state.satisfied_signals);
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            state.satisfiable_signals);
-
-  // Now send the consumer over a MP so that it's serialized.
-  MojoHandle pipe0, pipe1;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            MojoCreateMessagePipe(nullptr, &pipe0, &pipe1));
-
-  ASSERT_EQ(MOJO_RESULT_OK,
-            MojoWriteMessage(pipe0, nullptr, 0, &consumer_, 1,
-                             MOJO_WRITE_MESSAGE_FLAG_NONE));
-  consumer_ = MOJO_HANDLE_INVALID;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(pipe1, MOJO_HANDLE_SIGNAL_READABLE, &state));
-  uint32_t num_handles = 1;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            MojoReadMessage(pipe1, nullptr, 0, &consumer_, &num_handles,
-                            MOJO_READ_MESSAGE_FLAG_NONE));
-  ASSERT_EQ(num_handles, 1u);
-
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(consumer_, MOJO_HANDLE_SIGNAL_PEER_CLOSED, &state));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            state.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            state.satisfiable_signals);
-
-  int32_t read_data;
-  ASSERT_EQ(MOJO_RESULT_OK, ReadData(&read_data, &num_bytes));
-  ASSERT_EQ(sizeof(read_data), num_bytes);
-  ASSERT_EQ(data, read_data);
-
-  ASSERT_EQ(MOJO_RESULT_OK, MojoClose(pipe0));
-  ASSERT_EQ(MOJO_RESULT_OK, MojoClose(pipe1));
-}
-
-bool WriteAllData(MojoHandle producer,
-                  const void* elements,
-                  uint32_t num_bytes) {
-  for (size_t i = 0; i < kMaxPoll; i++) {
-    // Write as much data as we can.
-    uint32_t write_bytes = num_bytes;
-    MojoResult result = MojoWriteData(producer, elements, &write_bytes,
-                                      MOJO_WRITE_DATA_FLAG_NONE);
-    if (result == MOJO_RESULT_OK) {
-      num_bytes -= write_bytes;
-      elements = static_cast<const uint8_t*>(elements) + write_bytes;
-      if (num_bytes == 0)
-        return true;
-    } else {
-      EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, result);
-    }
-
-    MojoHandleSignalsState hss = MojoHandleSignalsState();
-    EXPECT_EQ(MOJO_RESULT_OK, test::MojoTestBase::WaitForSignals(
-                                  producer, MOJO_HANDLE_SIGNAL_WRITABLE, &hss));
-    EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
-    EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-              hss.satisfiable_signals);
-  }
-
-  return false;
-}
-
-// If |expect_empty| is true, expect |consumer| to be empty after reading.
-bool ReadAllData(MojoHandle consumer,
-                 void* elements,
-                 uint32_t num_bytes,
-                 bool expect_empty) {
-  for (size_t i = 0; i < kMaxPoll; i++) {
-    // Read as much data as we can.
-    uint32_t read_bytes = num_bytes;
-    MojoResult result =
-        MojoReadData(consumer, elements, &read_bytes, MOJO_READ_DATA_FLAG_NONE);
-    if (result == MOJO_RESULT_OK) {
-      num_bytes -= read_bytes;
-      elements = static_cast<uint8_t*>(elements) + read_bytes;
-      if (num_bytes == 0) {
-        if (expect_empty) {
-          // Expect no more data.
-          test::Sleep(test::TinyDeadline());
-          MojoReadData(consumer, nullptr, &num_bytes,
-                       MOJO_READ_DATA_FLAG_QUERY);
-          EXPECT_EQ(0u, num_bytes);
-        }
-        return true;
-      }
-    } else {
-      EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, result);
-    }
-
-    MojoHandleSignalsState hss = MojoHandleSignalsState();
-    EXPECT_EQ(MOJO_RESULT_OK, test::MojoTestBase::WaitForSignals(
-                                  consumer, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-    // Peer could have become closed while we're still waiting for data.
-    EXPECT_TRUE(MOJO_HANDLE_SIGNAL_READABLE & hss.satisfied_signals);
-    EXPECT_TRUE(hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE);
-    EXPECT_TRUE(hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_PEER_CLOSED);
-  }
-
-  return num_bytes == 0;
-}
-
-#if !defined(OS_IOS)
-
-TEST_F(DataPipeTest, Multiprocess) {
-  const uint32_t kTestDataSize =
-      static_cast<uint32_t>(sizeof(kMultiprocessTestData));
-  const MojoCreateDataPipeOptions options = {
-      kSizeOfOptions,                           // |struct_size|.
-      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-      1,                                        // |element_num_bytes|.
-      kMultiprocessCapacity                     // |capacity_num_bytes|.
-  };
-  ASSERT_EQ(MOJO_RESULT_OK, Create(&options));
-
-  RUN_CHILD_ON_PIPE(MultiprocessClient, server_mp)
-    // Send some data before serialising and sending the data pipe over.
-    // This is the first write so we don't need to use WriteAllData.
-    uint32_t num_bytes = kTestDataSize;
-    ASSERT_EQ(MOJO_RESULT_OK, WriteData(kMultiprocessTestData, &num_bytes,
-                                        MOJO_WRITE_DATA_FLAG_ALL_OR_NONE));
-    ASSERT_EQ(kTestDataSize, num_bytes);
-
-    // Send child process the data pipe.
-    ASSERT_EQ(MOJO_RESULT_OK,
-              MojoWriteMessage(server_mp, nullptr, 0, &consumer_, 1,
-                               MOJO_WRITE_MESSAGE_FLAG_NONE));
-
-    // Send a bunch of data of varying sizes.
-    uint8_t buffer[100];
-    int seq = 0;
-    for (int i = 0; i < kMultiprocessMaxIter; ++i) {
-      for (uint32_t size = 1; size <= kMultiprocessCapacity; size++) {
-        for (unsigned int j = 0; j < size; ++j)
-          buffer[j] = seq + j;
-        EXPECT_TRUE(WriteAllData(producer_, buffer, size));
-        seq += size;
-      }
-    }
-
-    // Write the test string in again.
-    ASSERT_TRUE(WriteAllData(producer_, kMultiprocessTestData, kTestDataSize));
-
-    // Swap ends.
-    ASSERT_EQ(MOJO_RESULT_OK,
-              MojoWriteMessage(server_mp, nullptr, 0, &producer_, 1,
-                               MOJO_WRITE_MESSAGE_FLAG_NONE));
-
-    // Receive the consumer from the other side.
-    producer_ = MOJO_HANDLE_INVALID;
-    MojoHandleSignalsState hss = MojoHandleSignalsState();
-    ASSERT_EQ(MOJO_RESULT_OK,
-              WaitForSignals(server_mp, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-    MojoHandle handles[2];
-    uint32_t num_handles = arraysize(handles);
-    ASSERT_EQ(MOJO_RESULT_OK,
-              MojoReadMessage(server_mp, nullptr, 0, handles, &num_handles,
-                              MOJO_READ_MESSAGE_FLAG_NONE));
-    ASSERT_EQ(1u, num_handles);
-    consumer_ = handles[0];
-
-    // Read the test string twice. Once for when we sent it, and once for the
-    // other end sending it.
-    for (int i = 0; i < 2; ++i) {
-      EXPECT_TRUE(ReadAllData(consumer_, buffer, kTestDataSize, i == 1));
-      EXPECT_EQ(0, memcmp(buffer, kMultiprocessTestData, kTestDataSize));
-    }
-
-    WriteMessage(server_mp, "quit");
-
-    // Don't have to close the consumer here because it will be done for us.
-  END_CHILD()
-}
-
-DEFINE_TEST_CLIENT_TEST_WITH_PIPE(MultiprocessClient, DataPipeTest, client_mp) {
-  const uint32_t kTestDataSize =
-      static_cast<uint32_t>(sizeof(kMultiprocessTestData));
-
-  // Receive the data pipe from the other side.
-  MojoHandle consumer = MOJO_HANDLE_INVALID;
-  MojoHandleSignalsState hss = MojoHandleSignalsState();
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(client_mp, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  MojoHandle handles[2];
-  uint32_t num_handles = arraysize(handles);
-  ASSERT_EQ(MOJO_RESULT_OK,
-            MojoReadMessage(client_mp, nullptr, 0, handles, &num_handles,
-                            MOJO_READ_MESSAGE_FLAG_NONE));
-  ASSERT_EQ(1u, num_handles);
-  consumer = handles[0];
-
-  // Read the initial string that was sent.
-  int32_t buffer[100];
-  EXPECT_TRUE(ReadAllData(consumer, buffer, kTestDataSize, false));
-  EXPECT_EQ(0, memcmp(buffer, kMultiprocessTestData, kTestDataSize));
-
-  // Receive the main data and check it is correct.
-  int seq = 0;
-  uint8_t expected_buffer[100];
-  for (int i = 0; i < kMultiprocessMaxIter; ++i) {
-    for (uint32_t size = 1; size <= kMultiprocessCapacity; ++size) {
-      for (unsigned int j = 0; j < size; ++j)
-        expected_buffer[j] = seq + j;
-      EXPECT_TRUE(ReadAllData(consumer, buffer, size, false));
-      EXPECT_EQ(0, memcmp(buffer, expected_buffer, size));
-
-      seq += size;
-    }
-  }
-
-  // Swap ends.
-  ASSERT_EQ(MOJO_RESULT_OK, MojoWriteMessage(client_mp, nullptr, 0, &consumer,
-                                             1, MOJO_WRITE_MESSAGE_FLAG_NONE));
-
-  // Receive the producer from the other side.
-  MojoHandle producer = MOJO_HANDLE_INVALID;
-  hss = MojoHandleSignalsState();
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(client_mp, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  num_handles = arraysize(handles);
-  ASSERT_EQ(MOJO_RESULT_OK,
-            MojoReadMessage(client_mp, nullptr, 0, handles, &num_handles,
-                            MOJO_READ_MESSAGE_FLAG_NONE));
-  ASSERT_EQ(1u, num_handles);
-  producer = handles[0];
-
-  // Write the test string one more time.
-  EXPECT_TRUE(WriteAllData(producer, kMultiprocessTestData, kTestDataSize));
-
-  // We swapped ends, so close the producer.
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(producer));
-
-  // Wait to receive a "quit" message before exiting.
-  EXPECT_EQ("quit", ReadMessage(client_mp));
-}
-
-DEFINE_TEST_CLIENT_TEST_WITH_PIPE(WriteAndCloseProducer, DataPipeTest, h) {
-  MojoHandle p;
-  std::string message = ReadMessageWithHandles(h, &p, 1);
-
-  // Write some data to the producer and close it.
-  uint32_t num_bytes = static_cast<uint32_t>(message.size());
-  EXPECT_EQ(MOJO_RESULT_OK, MojoWriteData(p, message.data(), &num_bytes,
-                                          MOJO_WRITE_DATA_FLAG_NONE));
-  EXPECT_EQ(num_bytes, static_cast<uint32_t>(message.size()));
-
-  // Close the producer before quitting.
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(p));
-
-  // Wait for a quit message.
-  EXPECT_EQ("quit", ReadMessage(h));
-}
-
-DEFINE_TEST_CLIENT_TEST_WITH_PIPE(ReadAndCloseConsumer, DataPipeTest, h) {
-  MojoHandle c;
-  std::string expected_message = ReadMessageWithHandles(h, &c, 1);
-
-  // Wait for the consumer to become readable.
-  EXPECT_EQ(MOJO_RESULT_OK, WaitForSignals(c, MOJO_HANDLE_SIGNAL_READABLE));
-
-  // Drain the consumer and expect to find the given message.
-  uint32_t num_bytes = static_cast<uint32_t>(expected_message.size());
-  std::vector<char> bytes(expected_message.size());
-  EXPECT_EQ(MOJO_RESULT_OK, MojoReadData(c, bytes.data(), &num_bytes,
-                                         MOJO_READ_DATA_FLAG_NONE));
-  EXPECT_EQ(num_bytes, static_cast<uint32_t>(bytes.size()));
-
-  std::string message(bytes.data(), bytes.size());
-  EXPECT_EQ(expected_message, message);
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(c));
-
-  // Wait for a quit message.
-  EXPECT_EQ("quit", ReadMessage(h));
-}
-
-TEST_F(DataPipeTest, SendConsumerAndCloseProducer) {
-  // Create a new data pipe.
-  MojoHandle p, c;
-  EXPECT_EQ(MOJO_RESULT_OK, MojoCreateDataPipe(nullptr, &p ,&c));
-
-  RUN_CHILD_ON_PIPE(WriteAndCloseProducer, producer_client)
-    RUN_CHILD_ON_PIPE(ReadAndCloseConsumer, consumer_client)
-      const std::string kMessage = "Hello, world!";
-      WriteMessageWithHandles(producer_client, kMessage, &p, 1);
-      WriteMessageWithHandles(consumer_client, kMessage, &c, 1);
-
-      WriteMessage(consumer_client, "quit");
-    END_CHILD()
-
-    WriteMessage(producer_client, "quit");
-  END_CHILD()
-}
-
-DEFINE_TEST_CLIENT_TEST_WITH_PIPE(CreateAndWrite, DataPipeTest, h) {
-  const MojoCreateDataPipeOptions options = {
-      kSizeOfOptions,                           // |struct_size|.
-      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-      1,                                        // |element_num_bytes|.
-      kMultiprocessCapacity                     // |capacity_num_bytes|.
-  };
-
-  MojoHandle p, c;
-  ASSERT_EQ(MOJO_RESULT_OK, MojoCreateDataPipe(&options, &p, &c));
-
-  const std::string kMessage = "Hello, world!";
-  WriteMessageWithHandles(h, kMessage, &c, 1);
-
-  // Write some data to the producer and close it.
-  uint32_t num_bytes = static_cast<uint32_t>(kMessage.size());
-  EXPECT_EQ(MOJO_RESULT_OK, MojoWriteData(p, kMessage.data(), &num_bytes,
-                                          MOJO_WRITE_DATA_FLAG_NONE));
-  EXPECT_EQ(num_bytes, static_cast<uint32_t>(kMessage.size()));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(p));
-
-  // Wait for a quit message.
-  EXPECT_EQ("quit", ReadMessage(h));
-}
-
-TEST_F(DataPipeTest, CreateInChild) {
-  RUN_CHILD_ON_PIPE(CreateAndWrite, child)
-    MojoHandle c;
-    std::string expected_message = ReadMessageWithHandles(child, &c, 1);
-
-    // Wait for the consumer to become readable.
-    EXPECT_EQ(MOJO_RESULT_OK, WaitForSignals(c, MOJO_HANDLE_SIGNAL_READABLE));
-
-    // Drain the consumer and expect to find the given message.
-    uint32_t num_bytes = static_cast<uint32_t>(expected_message.size());
-    std::vector<char> bytes(expected_message.size());
-    EXPECT_EQ(MOJO_RESULT_OK, MojoReadData(c, bytes.data(), &num_bytes,
-                                           MOJO_READ_DATA_FLAG_NONE));
-    EXPECT_EQ(num_bytes, static_cast<uint32_t>(bytes.size()));
-
-    std::string message(bytes.data(), bytes.size());
-    EXPECT_EQ(expected_message, message);
-
-    EXPECT_EQ(MOJO_RESULT_OK, MojoClose(c));
-    WriteMessage(child, "quit");
-  END_CHILD()
-}
-
-DEFINE_TEST_CLIENT_TEST_WITH_PIPE(DataPipeStatusChangeInTransitClient,
-                                  DataPipeTest, parent) {
-  // This test verifies that peer closure is detectable through various
-  // mechanisms when it races with handle transfer.
-
-  MojoHandle handles[6];
-  EXPECT_EQ("o_O", ReadMessageWithHandles(parent, handles, 6));
-  MojoHandle* producers = &handles[0];
-  MojoHandle* consumers = &handles[3];
-
-  // Wait on producer 0
-  EXPECT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(producers[0], MOJO_HANDLE_SIGNAL_PEER_CLOSED));
-
-  // Wait on consumer 0
-  EXPECT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(consumers[0], MOJO_HANDLE_SIGNAL_PEER_CLOSED));
-
-  base::MessageLoop message_loop;
-
-  // Wait on producer 1 and consumer 1 using SimpleWatchers.
-  {
-    base::RunLoop run_loop;
-    int count = 0;
-    auto callback = base::Bind(
-        [] (base::RunLoop* loop, int* count, MojoResult result) {
-          EXPECT_EQ(MOJO_RESULT_OK, result);
-          if (++*count == 2)
-            loop->Quit();
-        },
-        &run_loop, &count);
-    SimpleWatcher producer_watcher(FROM_HERE,
-                                   SimpleWatcher::ArmingPolicy::AUTOMATIC);
-    SimpleWatcher consumer_watcher(FROM_HERE,
-                                   SimpleWatcher::ArmingPolicy::AUTOMATIC);
-    producer_watcher.Watch(Handle(producers[1]), MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-                           callback);
-    consumer_watcher.Watch(Handle(consumers[1]), MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-                           callback);
-    run_loop.Run();
-    EXPECT_EQ(2, count);
-  }
-
-  // Wait on producer 2 by polling with MojoWriteData.
-  MojoResult result;
-  do {
-    uint32_t num_bytes = 0;
-    result = MojoWriteData(
-        producers[2], nullptr, &num_bytes, MOJO_WRITE_DATA_FLAG_NONE);
-  } while (result == MOJO_RESULT_OK);
-  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result);
-
-  // Wait on consumer 2 by polling with MojoReadData.
-  do {
-    char byte;
-    uint32_t num_bytes = 1;
-    result = MojoReadData(
-        consumers[2], &byte, &num_bytes, MOJO_READ_DATA_FLAG_NONE);
-  } while (result == MOJO_RESULT_SHOULD_WAIT);
-  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result);
-
-  for (size_t i = 0; i < 6; ++i)
-    CloseHandle(handles[i]);
-}
-
-TEST_F(DataPipeTest, StatusChangeInTransit) {
-  MojoHandle producers[6];
-  MojoHandle consumers[6];
-  for (size_t i = 0; i < 6; ++i)
-    CreateDataPipe(&producers[i], &consumers[i], 1);
-
-  RUN_CHILD_ON_PIPE(DataPipeStatusChangeInTransitClient, child)
-    MojoHandle handles[] = { producers[0], producers[1], producers[2],
-                             consumers[3], consumers[4], consumers[5] };
-
-    // Send 3 producers and 3 consumers, and let their transfer race with their
-    // peers' closure.
-    WriteMessageWithHandles(child, "o_O", handles, 6);
-
-    for (size_t i = 0; i < 3; ++i)
-      CloseHandle(consumers[i]);
-    for (size_t i = 3; i < 6; ++i)
-      CloseHandle(producers[i]);
-  END_CHILD()
-}
-
-#endif  // !defined(OS_IOS)
-
-}  // namespace
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/dispatcher.cc b/mojo/edk/system/dispatcher.cc
deleted file mode 100644
index 7cdbe91..0000000
--- a/mojo/edk/system/dispatcher.cc
+++ /dev/null
@@ -1,198 +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 "mojo/edk/system/dispatcher.h"
-
-#include "base/logging.h"
-#include "mojo/edk/system/configuration.h"
-#include "mojo/edk/system/data_pipe_consumer_dispatcher.h"
-#include "mojo/edk/system/data_pipe_producer_dispatcher.h"
-#include "mojo/edk/system/message_pipe_dispatcher.h"
-#include "mojo/edk/system/platform_handle_dispatcher.h"
-#include "mojo/edk/system/shared_buffer_dispatcher.h"
-
-namespace mojo {
-namespace edk {
-
-Dispatcher::DispatcherInTransit::DispatcherInTransit() {}
-
-Dispatcher::DispatcherInTransit::DispatcherInTransit(
-    const DispatcherInTransit& other) = default;
-
-Dispatcher::DispatcherInTransit::~DispatcherInTransit() {}
-
-MojoResult Dispatcher::WatchDispatcher(scoped_refptr<Dispatcher> dispatcher,
-                                       MojoHandleSignals signals,
-                                       uintptr_t context) {
-  return MOJO_RESULT_INVALID_ARGUMENT;
-}
-
-MojoResult Dispatcher::CancelWatch(uintptr_t context) {
-  return MOJO_RESULT_INVALID_ARGUMENT;
-}
-
-MojoResult Dispatcher::Arm(uint32_t* num_ready_contexts,
-                           uintptr_t* ready_contexts,
-                           MojoResult* ready_results,
-                           MojoHandleSignalsState* ready_signals_states) {
-  return MOJO_RESULT_INVALID_ARGUMENT;
-}
-
-MojoResult Dispatcher::WriteMessage(std::unique_ptr<MessageForTransit> message,
-                                    MojoWriteMessageFlags flags) {
-  return MOJO_RESULT_INVALID_ARGUMENT;
-}
-
-MojoResult Dispatcher::ReadMessage(std::unique_ptr<MessageForTransit>* message,
-                                   uint32_t* num_bytes,
-                                   MojoHandle* handles,
-                                   uint32_t* num_handles,
-                                   MojoReadMessageFlags flags,
-                                   bool read_any_size) {
-  return MOJO_RESULT_INVALID_ARGUMENT;
-}
-
-MojoResult Dispatcher::DuplicateBufferHandle(
-    const MojoDuplicateBufferHandleOptions* options,
-    scoped_refptr<Dispatcher>* new_dispatcher) {
-  return MOJO_RESULT_INVALID_ARGUMENT;
-}
-
-MojoResult Dispatcher::MapBuffer(
-    uint64_t offset,
-    uint64_t num_bytes,
-    MojoMapBufferFlags flags,
-    std::unique_ptr<PlatformSharedBufferMapping>* mapping) {
-  return MOJO_RESULT_INVALID_ARGUMENT;
-}
-
-MojoResult Dispatcher::ReadData(void* elements,
-                                uint32_t* num_bytes,
-                                MojoReadDataFlags flags) {
-  return MOJO_RESULT_INVALID_ARGUMENT;
-}
-
-MojoResult Dispatcher::BeginReadData(const void** buffer,
-                                     uint32_t* buffer_num_bytes,
-                                     MojoReadDataFlags flags) {
-  return MOJO_RESULT_INVALID_ARGUMENT;
-}
-
-MojoResult Dispatcher::EndReadData(uint32_t num_bytes_read) {
-  return MOJO_RESULT_INVALID_ARGUMENT;
-}
-
-MojoResult Dispatcher::WriteData(const void* elements,
-                                 uint32_t* num_bytes,
-                                 MojoWriteDataFlags flags) {
-  return MOJO_RESULT_INVALID_ARGUMENT;
-}
-
-MojoResult Dispatcher::BeginWriteData(void** buffer,
-                                      uint32_t* buffer_num_bytes,
-                                      MojoWriteDataFlags flags) {
-  return MOJO_RESULT_INVALID_ARGUMENT;
-}
-
-MojoResult Dispatcher::EndWriteData(uint32_t num_bytes_written) {
-  return MOJO_RESULT_INVALID_ARGUMENT;
-}
-
-MojoResult Dispatcher::AddWaitingDispatcher(
-    const scoped_refptr<Dispatcher>& dispatcher,
-    MojoHandleSignals signals,
-    uintptr_t context) {
-  return MOJO_RESULT_INVALID_ARGUMENT;
-}
-
-MojoResult Dispatcher::RemoveWaitingDispatcher(
-    const scoped_refptr<Dispatcher>& dispatcher) {
-  return MOJO_RESULT_INVALID_ARGUMENT;
-}
-
-MojoResult Dispatcher::GetReadyDispatchers(uint32_t* count,
-                                           DispatcherVector* dispatchers,
-                                           MojoResult* results,
-                                           uintptr_t* contexts) {
-  return MOJO_RESULT_INVALID_ARGUMENT;
-}
-
-HandleSignalsState Dispatcher::GetHandleSignalsState() const {
-  return HandleSignalsState();
-}
-
-MojoResult Dispatcher::AddWatcherRef(
-    const scoped_refptr<WatcherDispatcher>& watcher,
-    uintptr_t context) {
-  return MOJO_RESULT_INVALID_ARGUMENT;
-}
-
-MojoResult Dispatcher::RemoveWatcherRef(WatcherDispatcher* watcher,
-                                        uintptr_t context) {
-  return MOJO_RESULT_INVALID_ARGUMENT;
-}
-
-void Dispatcher::StartSerialize(uint32_t* num_bytes,
-                                uint32_t* num_ports,
-                                uint32_t* num_platform_handles) {
-  *num_bytes = 0;
-  *num_ports = 0;
-  *num_platform_handles = 0;
-}
-
-bool Dispatcher::EndSerialize(void* destination,
-                              ports::PortName* ports,
-                              PlatformHandle* handles) {
-  LOG(ERROR) << "Attempting to serialize a non-transferrable dispatcher.";
-  return true;
-}
-
-bool Dispatcher::BeginTransit() { return true; }
-
-void Dispatcher::CompleteTransitAndClose() {}
-
-void Dispatcher::CancelTransit() {}
-
-// static
-scoped_refptr<Dispatcher> Dispatcher::Deserialize(
-    Type type,
-    const void* bytes,
-    size_t num_bytes,
-    const ports::PortName* ports,
-    size_t num_ports,
-    PlatformHandle* platform_handles,
-    size_t num_platform_handles) {
-  switch (type) {
-    case Type::MESSAGE_PIPE:
-      return MessagePipeDispatcher::Deserialize(
-          bytes, num_bytes, ports, num_ports, platform_handles,
-          num_platform_handles);
-    case Type::SHARED_BUFFER:
-      return SharedBufferDispatcher::Deserialize(
-          bytes, num_bytes, ports, num_ports, platform_handles,
-          num_platform_handles);
-    case Type::DATA_PIPE_CONSUMER:
-      return DataPipeConsumerDispatcher::Deserialize(
-          bytes, num_bytes, ports, num_ports, platform_handles,
-          num_platform_handles);
-    case Type::DATA_PIPE_PRODUCER:
-      return DataPipeProducerDispatcher::Deserialize(
-          bytes, num_bytes, ports, num_ports, platform_handles,
-          num_platform_handles);
-    case Type::PLATFORM_HANDLE:
-      return PlatformHandleDispatcher::Deserialize(
-          bytes, num_bytes, ports, num_ports, platform_handles,
-          num_platform_handles);
-    default:
-      LOG(ERROR) << "Deserializing invalid dispatcher type.";
-      return nullptr;
-  }
-}
-
-Dispatcher::Dispatcher() {}
-
-Dispatcher::~Dispatcher() {}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/dispatcher.h b/mojo/edk/system/dispatcher.h
deleted file mode 100644
index db1f1f1..0000000
--- a/mojo/edk/system/dispatcher.h
+++ /dev/null
@@ -1,245 +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 MOJO_EDK_SYSTEM_DISPATCHER_H_
-#define MOJO_EDK_SYSTEM_DISPATCHER_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <memory>
-#include <ostream>
-#include <vector>
-
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/synchronization/lock.h"
-#include "mojo/edk/embedder/platform_handle.h"
-#include "mojo/edk/embedder/platform_shared_buffer.h"
-#include "mojo/edk/system/handle_signals_state.h"
-#include "mojo/edk/system/ports/name.h"
-#include "mojo/edk/system/system_impl_export.h"
-#include "mojo/edk/system/watch.h"
-#include "mojo/public/c/system/buffer.h"
-#include "mojo/public/c/system/data_pipe.h"
-#include "mojo/public/c/system/message_pipe.h"
-#include "mojo/public/c/system/types.h"
-
-namespace mojo {
-namespace edk {
-
-class Dispatcher;
-class MessageForTransit;
-
-using DispatcherVector = std::vector<scoped_refptr<Dispatcher>>;
-
-// A |Dispatcher| implements Mojo EDK calls that are associated with a
-// particular MojoHandle.
-class MOJO_SYSTEM_IMPL_EXPORT Dispatcher
-    : public base::RefCountedThreadSafe<Dispatcher> {
- public:
-  struct DispatcherInTransit {
-    DispatcherInTransit();
-    DispatcherInTransit(const DispatcherInTransit& other);
-    ~DispatcherInTransit();
-
-    scoped_refptr<Dispatcher> dispatcher;
-    MojoHandle local_handle;
-  };
-
-  enum class Type {
-    UNKNOWN = 0,
-    MESSAGE_PIPE,
-    DATA_PIPE_PRODUCER,
-    DATA_PIPE_CONSUMER,
-    SHARED_BUFFER,
-    WATCHER,
-
-    // "Private" types (not exposed via the public interface):
-    PLATFORM_HANDLE = -1,
-  };
-
-  // All Dispatchers must minimally implement these methods.
-
-  virtual Type GetType() const = 0;
-  virtual MojoResult Close() = 0;
-
-  ///////////// Watcher API ////////////////////
-
-  virtual MojoResult WatchDispatcher(scoped_refptr<Dispatcher> dispatcher,
-                                     MojoHandleSignals signals,
-                                     uintptr_t context);
-  virtual MojoResult CancelWatch(uintptr_t context);
-  virtual MojoResult Arm(uint32_t* num_ready_contexts,
-                         uintptr_t* ready_contexts,
-                         MojoResult* ready_results,
-                         MojoHandleSignalsState* ready_signals_states);
-
-  ///////////// Message pipe API /////////////
-
-  virtual MojoResult WriteMessage(std::unique_ptr<MessageForTransit> message,
-                                  MojoWriteMessageFlags flags);
-
-  virtual MojoResult ReadMessage(std::unique_ptr<MessageForTransit>* message,
-                                 uint32_t* num_bytes,
-                                 MojoHandle* handles,
-                                 uint32_t* num_handles,
-                                 MojoReadMessageFlags flags,
-                                 bool read_any_size);
-
-  ///////////// Shared buffer API /////////////
-
-  // |options| may be null. |new_dispatcher| must not be null, but
-  // |*new_dispatcher| should be null (and will contain the dispatcher for the
-  // new handle on success).
-  virtual MojoResult DuplicateBufferHandle(
-      const MojoDuplicateBufferHandleOptions* options,
-      scoped_refptr<Dispatcher>* new_dispatcher);
-
-  virtual MojoResult MapBuffer(
-      uint64_t offset,
-      uint64_t num_bytes,
-      MojoMapBufferFlags flags,
-      std::unique_ptr<PlatformSharedBufferMapping>* mapping);
-
-  ///////////// Data pipe consumer API /////////////
-
-  virtual MojoResult ReadData(void* elements,
-                              uint32_t* num_bytes,
-                              MojoReadDataFlags flags);
-
-  virtual MojoResult BeginReadData(const void** buffer,
-                                   uint32_t* buffer_num_bytes,
-                                   MojoReadDataFlags flags);
-
-  virtual MojoResult EndReadData(uint32_t num_bytes_read);
-
-  ///////////// Data pipe producer API /////////////
-
-  virtual MojoResult WriteData(const void* elements,
-                               uint32_t* num_bytes,
-                               MojoWriteDataFlags flags);
-
-  virtual MojoResult BeginWriteData(void** buffer,
-                                    uint32_t* buffer_num_bytes,
-                                    MojoWriteDataFlags flags);
-
-  virtual MojoResult EndWriteData(uint32_t num_bytes_written);
-
-  ///////////// Wait set API /////////////
-
-  // Adds a dispatcher to wait on. When the dispatcher satisfies |signals|, it
-  // will be returned in the next call to |GetReadyDispatchers()|. If
-  // |dispatcher| has been added, it must be removed before adding again,
-  // otherwise |MOJO_RESULT_ALREADY_EXISTS| will be returned.
-  virtual MojoResult AddWaitingDispatcher(
-      const scoped_refptr<Dispatcher>& dispatcher,
-      MojoHandleSignals signals,
-      uintptr_t context);
-
-  // Removes a dispatcher to wait on. If |dispatcher| has not been added,
-  // |MOJO_RESULT_NOT_FOUND| will be returned.
-  virtual MojoResult RemoveWaitingDispatcher(
-      const scoped_refptr<Dispatcher>& dispatcher);
-
-  // Returns a set of ready dispatchers. |*count| is the maximum number of
-  // dispatchers to return, and will contain the number of dispatchers returned
-  // in |dispatchers| on completion.
-  virtual MojoResult GetReadyDispatchers(uint32_t* count,
-                                         DispatcherVector* dispatchers,
-                                         MojoResult* results,
-                                         uintptr_t* contexts);
-
-  ///////////// General-purpose API for all handle types /////////
-
-  // Gets the current handle signals state. (The default implementation simply
-  // returns a default-constructed |HandleSignalsState|, i.e., no signals
-  // satisfied or satisfiable.) Note: The state is subject to change from other
-  // threads.
-  virtual HandleSignalsState GetHandleSignalsState() const;
-
-  // Adds a WatcherDispatcher reference to this dispatcher, to be notified of
-  // all subsequent changes to handle state including signal changes or closure.
-  // The reference is associated with a |context| for disambiguation of
-  // removals.
-  virtual MojoResult AddWatcherRef(
-      const scoped_refptr<WatcherDispatcher>& watcher,
-      uintptr_t context);
-
-  // Removes a WatcherDispatcher reference from this dispatcher.
-  virtual MojoResult RemoveWatcherRef(WatcherDispatcher* watcher,
-                                      uintptr_t context);
-
-  // Informs the caller of the total serialized size (in bytes) and the total
-  // number of platform handles and ports needed to transfer this dispatcher
-  // across a message pipe.
-  //
-  // Must eventually be followed by a call to EndSerializeAndClose(). Note that
-  // StartSerialize() and EndSerialize() are always called in sequence, and
-  // only between calls to BeginTransit() and either (but not both)
-  // CompleteTransitAndClose() or CancelTransit().
-  //
-  // For this reason it is IMPERATIVE that the implementation ensure a
-  // consistent serializable state between BeginTransit() and
-  // CompleteTransitAndClose()/CancelTransit().
-  virtual void StartSerialize(uint32_t* num_bytes,
-                              uint32_t* num_ports,
-                              uint32_t* num_platform_handles);
-
-  // Serializes this dispatcher into |destination|, |ports|, and |handles|.
-  // Returns true iff successful, false otherwise. In either case the dispatcher
-  // will close.
-  //
-  // NOTE: Transit MAY still fail after this call returns. Implementations
-  // should not assume PlatformHandle ownership has transferred until
-  // CompleteTransitAndClose() is called. In other words, if CancelTransit() is
-  // called, the implementation should retain its PlatformHandles in working
-  // condition.
-  virtual bool EndSerialize(void* destination,
-                            ports::PortName* ports,
-                            PlatformHandle* handles);
-
-  // Does whatever is necessary to begin transit of the dispatcher.  This
-  // should return |true| if transit is OK, or false if the underlying resource
-  // is deemed busy by the implementation.
-  virtual bool BeginTransit();
-
-  // Does whatever is necessary to complete transit of the dispatcher, including
-  // closure. This is only called upon successfully transmitting an outgoing
-  // message containing this serialized dispatcher.
-  virtual void CompleteTransitAndClose();
-
-  // Does whatever is necessary to cancel transit of the dispatcher. The
-  // dispatcher should remain in a working state and resume normal operation.
-  virtual void CancelTransit();
-
-  // Deserializes a specific dispatcher type from an incoming message.
-  static scoped_refptr<Dispatcher> Deserialize(
-      Type type,
-      const void* bytes,
-      size_t num_bytes,
-      const ports::PortName* ports,
-      size_t num_ports,
-      PlatformHandle* platform_handles,
-      size_t num_platform_handles);
-
- protected:
-  friend class base::RefCountedThreadSafe<Dispatcher>;
-
-  Dispatcher();
-  virtual ~Dispatcher();
-
-  DISALLOW_COPY_AND_ASSIGN(Dispatcher);
-};
-
-// So logging macros and |DCHECK_EQ()|, etc. work.
-MOJO_SYSTEM_IMPL_EXPORT inline std::ostream& operator<<(std::ostream& out,
-                                                        Dispatcher::Type type) {
-  return out << static_cast<int>(type);
-}
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_DISPATCHER_H_
diff --git a/mojo/edk/system/handle_signals_state.h b/mojo/edk/system/handle_signals_state.h
deleted file mode 100644
index f241278..0000000
--- a/mojo/edk/system/handle_signals_state.h
+++ /dev/null
@@ -1,13 +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 MOJO_EDK_SYSTEM_HANDLE_SIGNALS_STATE_H_
-#define MOJO_EDK_SYSTEM_HANDLE_SIGNALS_STATE_H_
-
-#include "mojo/public/cpp/system/handle_signals_state.h"
-
-// TODO(rockot): Remove this header and use the C++ system library type
-// directly inside the EDK.
-
-#endif  // MOJO_EDK_SYSTEM_HANDLE_SIGNALS_STATE_H_
diff --git a/mojo/edk/system/handle_table.cc b/mojo/edk/system/handle_table.cc
deleted file mode 100644
index b570793..0000000
--- a/mojo/edk/system/handle_table.cc
+++ /dev/null
@@ -1,135 +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 "mojo/edk/system/handle_table.h"
-
-#include <stdint.h>
-
-#include <limits>
-
-namespace mojo {
-namespace edk {
-
-HandleTable::HandleTable() {}
-
-HandleTable::~HandleTable() {}
-
-MojoHandle HandleTable::AddDispatcher(scoped_refptr<Dispatcher> dispatcher) {
-  // Oops, we're out of handles.
-  if (next_available_handle_ == MOJO_HANDLE_INVALID)
-    return MOJO_HANDLE_INVALID;
-
-  MojoHandle handle = next_available_handle_++;
-  auto result =
-      handles_.insert(std::make_pair(handle, Entry(std::move(dispatcher))));
-  DCHECK(result.second);
-
-  return handle;
-}
-
-bool HandleTable::AddDispatchersFromTransit(
-    const std::vector<Dispatcher::DispatcherInTransit>& dispatchers,
-    MojoHandle* handles) {
-  // Oops, we're out of handles.
-  if (next_available_handle_ == MOJO_HANDLE_INVALID)
-    return false;
-
-  DCHECK_LE(dispatchers.size(), std::numeric_limits<uint32_t>::max());
-  // If this insertion would cause handle overflow, we're out of handles.
-  if (next_available_handle_ + dispatchers.size() < next_available_handle_)
-    return false;
-
-  for (size_t i = 0; i < dispatchers.size(); ++i) {
-    MojoHandle handle = next_available_handle_++;
-    auto result = handles_.insert(
-        std::make_pair(handle, Entry(dispatchers[i].dispatcher)));
-    DCHECK(result.second);
-    handles[i] = handle;
-  }
-
-  return true;
-}
-
-scoped_refptr<Dispatcher> HandleTable::GetDispatcher(MojoHandle handle) const {
-  auto it = handles_.find(handle);
-  if (it == handles_.end())
-    return nullptr;
-  return it->second.dispatcher;
-}
-
-MojoResult HandleTable::GetAndRemoveDispatcher(
-    MojoHandle handle,
-    scoped_refptr<Dispatcher>* dispatcher) {
-  auto it = handles_.find(handle);
-  if (it == handles_.end())
-    return MOJO_RESULT_INVALID_ARGUMENT;
-  if (it->second.busy)
-    return MOJO_RESULT_BUSY;
-
-  *dispatcher = std::move(it->second.dispatcher);
-  handles_.erase(it);
-  return MOJO_RESULT_OK;
-}
-
-MojoResult HandleTable::BeginTransit(
-    const MojoHandle* handles,
-    uint32_t num_handles,
-    std::vector<Dispatcher::DispatcherInTransit>* dispatchers) {
-  dispatchers->clear();
-  dispatchers->reserve(num_handles);
-  for (size_t i = 0; i < num_handles; ++i) {
-    auto it = handles_.find(handles[i]);
-    if (it == handles_.end())
-      return MOJO_RESULT_INVALID_ARGUMENT;
-    if (it->second.busy)
-      return MOJO_RESULT_BUSY;
-
-    Dispatcher::DispatcherInTransit d;
-    d.local_handle = handles[i];
-    d.dispatcher = it->second.dispatcher;
-    if (!d.dispatcher->BeginTransit())
-      return MOJO_RESULT_BUSY;
-    it->second.busy = true;
-    dispatchers->push_back(d);
-  }
-  return MOJO_RESULT_OK;
-}
-
-void HandleTable::CompleteTransitAndClose(
-    const std::vector<Dispatcher::DispatcherInTransit>& dispatchers) {
-  for (const auto& dispatcher : dispatchers) {
-    auto it = handles_.find(dispatcher.local_handle);
-    DCHECK(it != handles_.end() && it->second.busy);
-    handles_.erase(it);
-    dispatcher.dispatcher->CompleteTransitAndClose();
-  }
-}
-
-void HandleTable::CancelTransit(
-    const std::vector<Dispatcher::DispatcherInTransit>& dispatchers) {
-  for (const auto& dispatcher : dispatchers) {
-    auto it = handles_.find(dispatcher.local_handle);
-    DCHECK(it != handles_.end() && it->second.busy);
-    it->second.busy = false;
-    dispatcher.dispatcher->CancelTransit();
-  }
-}
-
-void HandleTable::GetActiveHandlesForTest(std::vector<MojoHandle>* handles) {
-  handles->clear();
-  for (const auto& entry : handles_)
-    handles->push_back(entry.first);
-}
-
-HandleTable::Entry::Entry() {}
-
-HandleTable::Entry::Entry(scoped_refptr<Dispatcher> dispatcher)
-    : dispatcher(std::move(dispatcher)) {}
-
-HandleTable::Entry::Entry(const Entry& other) = default;
-
-HandleTable::Entry::~Entry() {}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/handle_table.h b/mojo/edk/system/handle_table.h
deleted file mode 100644
index 882d540..0000000
--- a/mojo/edk/system/handle_table.h
+++ /dev/null
@@ -1,75 +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 MOJO_EDK_SYSTEM_HANDLE_TABLE_H_
-#define MOJO_EDK_SYSTEM_HANDLE_TABLE_H_
-
-#include <stdint.h>
-
-#include <vector>
-
-#include "base/containers/hash_tables.h"
-#include "base/macros.h"
-#include "mojo/edk/system/dispatcher.h"
-#include "mojo/public/c/system/types.h"
-
-namespace mojo {
-namespace edk {
-
-class HandleTable {
- public:
-  HandleTable();
-  ~HandleTable();
-
-  MojoHandle AddDispatcher(scoped_refptr<Dispatcher> dispatcher);
-
-  // Inserts multiple dispatchers received from message transit, populating
-  // |handles| with their newly allocated handles. Returns |true| on success.
-  bool AddDispatchersFromTransit(
-      const std::vector<Dispatcher::DispatcherInTransit>& dispatchers,
-      MojoHandle* handles);
-
-  scoped_refptr<Dispatcher> GetDispatcher(MojoHandle handle) const;
-  MojoResult GetAndRemoveDispatcher(MojoHandle,
-                                    scoped_refptr<Dispatcher>* dispatcher);
-
-  // Marks handles as busy and populates |dispatchers|. Returns MOJO_RESULT_BUSY
-  // if any of the handles are already in transit; MOJO_RESULT_INVALID_ARGUMENT
-  // if any of the handles are invalid; or MOJO_RESULT_OK if successful.
-  MojoResult BeginTransit(
-      const MojoHandle* handles,
-      uint32_t num_handles,
-      std::vector<Dispatcher::DispatcherInTransit>* dispatchers);
-
-  void CompleteTransitAndClose(
-      const std::vector<Dispatcher::DispatcherInTransit>& dispatchers);
-  void CancelTransit(
-      const std::vector<Dispatcher::DispatcherInTransit>& dispatchers);
-
-  void GetActiveHandlesForTest(std::vector<MojoHandle> *handles);
-
- private:
-  struct Entry {
-   Entry();
-   explicit Entry(scoped_refptr<Dispatcher> dispatcher);
-   Entry(const Entry& other);
-   ~Entry();
-
-   scoped_refptr<Dispatcher> dispatcher;
-   bool busy = false;
-  };
-
-  using HandleMap = base::hash_map<MojoHandle, Entry>;
-
-  HandleMap handles_;
-
-  uint32_t next_available_handle_ = 1;
-
-  DISALLOW_COPY_AND_ASSIGN(HandleTable);
-};
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_HANDLE_TABLE_H_
diff --git a/mojo/edk/system/mach_port_relay.cc b/mojo/edk/system/mach_port_relay.cc
deleted file mode 100644
index f05cf22..0000000
--- a/mojo/edk/system/mach_port_relay.cc
+++ /dev/null
@@ -1,248 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/system/mach_port_relay.h"
-
-#include <mach/mach.h>
-
-#include <utility>
-
-#include "base/logging.h"
-#include "base/mac/mach_port_util.h"
-#include "base/mac/scoped_mach_port.h"
-#include "base/metrics/histogram_macros.h"
-#include "base/process/process.h"
-#include "mojo/edk/embedder/platform_handle_vector.h"
-
-namespace mojo {
-namespace edk {
-
-namespace {
-
-// Errors that can occur in the broker (privileged parent) process.
-// These match tools/metrics/histograms.xml.
-// This enum is append-only.
-enum class BrokerUMAError : int {
-  SUCCESS = 0,
-  // Couldn't get a task port for the process with a given pid.
-  ERROR_TASK_FOR_PID = 1,
-  // Couldn't make a port with receive rights in the destination process.
-  ERROR_MAKE_RECEIVE_PORT = 2,
-  // Couldn't change the attributes of a Mach port.
-  ERROR_SET_ATTRIBUTES = 3,
-  // Couldn't extract a right from the destination.
-  ERROR_EXTRACT_DEST_RIGHT = 4,
-  // Couldn't send a Mach port in a call to mach_msg().
-  ERROR_SEND_MACH_PORT = 5,
-  // Couldn't extract a right from the source.
-  ERROR_EXTRACT_SOURCE_RIGHT = 6,
-  ERROR_MAX
-};
-
-// Errors that can occur in a child process.
-// These match tools/metrics/histograms.xml.
-// This enum is append-only.
-enum class ChildUMAError : int {
-  SUCCESS = 0,
-  // An error occurred while trying to receive a Mach port with mach_msg().
-  ERROR_RECEIVE_MACH_MESSAGE = 1,
-  ERROR_MAX
-};
-
-void ReportBrokerError(BrokerUMAError error) {
-  UMA_HISTOGRAM_ENUMERATION("Mojo.MachPortRelay.BrokerError",
-                            static_cast<int>(error),
-                            static_cast<int>(BrokerUMAError::ERROR_MAX));
-}
-
-void ReportChildError(ChildUMAError error) {
-  UMA_HISTOGRAM_ENUMERATION("Mojo.MachPortRelay.ChildError",
-                            static_cast<int>(error),
-                            static_cast<int>(ChildUMAError::ERROR_MAX));
-}
-
-}  // namespace
-
-// static
-bool MachPortRelay::ReceivePorts(PlatformHandleVector* handles) {
-  DCHECK(handles);
-
-  for (size_t i = 0; i < handles->size(); i++) {
-    PlatformHandle* handle = handles->data() + i;
-    DCHECK(handle->type != PlatformHandle::Type::MACH);
-    if (handle->type != PlatformHandle::Type::MACH_NAME)
-      continue;
-
-    if (handle->port == MACH_PORT_NULL) {
-      handle->type = PlatformHandle::Type::MACH;
-      continue;
-    }
-
-    base::mac::ScopedMachReceiveRight message_port(handle->port);
-    base::mac::ScopedMachSendRight received_port(
-        base::ReceiveMachPort(message_port.get()));
-    if (received_port.get() == MACH_PORT_NULL) {
-      ReportChildError(ChildUMAError::ERROR_RECEIVE_MACH_MESSAGE);
-      handle->port = MACH_PORT_NULL;
-      LOG(ERROR) << "Error receiving mach port";
-      return false;
-    }
-
-    ReportChildError(ChildUMAError::SUCCESS);
-    handle->port = received_port.release();
-    handle->type = PlatformHandle::Type::MACH;
-  }
-
-  return true;
-}
-
-MachPortRelay::MachPortRelay(base::PortProvider* port_provider)
-    : port_provider_(port_provider) {
-  DCHECK(port_provider);
-  port_provider_->AddObserver(this);
-}
-
-MachPortRelay::~MachPortRelay() {
-  port_provider_->RemoveObserver(this);
-}
-
-bool MachPortRelay::SendPortsToProcess(Channel::Message* message,
-                                       base::ProcessHandle process) {
-  DCHECK(message);
-  mach_port_t task_port = port_provider_->TaskForPid(process);
-  if (task_port == MACH_PORT_NULL) {
-    // Callers check the port provider for the task port before calling this
-    // function, in order to queue pending messages. Therefore, if this fails,
-    // it should be considered a genuine, bona fide, electrified, six-car error.
-    ReportBrokerError(BrokerUMAError::ERROR_TASK_FOR_PID);
-    return false;
-  }
-
-  size_t num_sent = 0;
-  bool error = false;
-  ScopedPlatformHandleVectorPtr handles = message->TakeHandles();
-  // Message should have handles, otherwise there's no point in calling this
-  // function.
-  DCHECK(handles);
-  for (size_t i = 0; i < handles->size(); i++) {
-    PlatformHandle* handle = &(*handles)[i];
-    DCHECK(handle->type != PlatformHandle::Type::MACH_NAME);
-    if (handle->type != PlatformHandle::Type::MACH)
-      continue;
-
-    if (handle->port == MACH_PORT_NULL) {
-      handle->type = PlatformHandle::Type::MACH_NAME;
-      num_sent++;
-      continue;
-    }
-
-    mach_port_name_t intermediate_port;
-    base::MachCreateError error_code;
-    intermediate_port = base::CreateIntermediateMachPort(
-        task_port, base::mac::ScopedMachSendRight(handle->port), &error_code);
-    if (intermediate_port == MACH_PORT_NULL) {
-      BrokerUMAError uma_error;
-      switch (error_code) {
-        case base::MachCreateError::ERROR_MAKE_RECEIVE_PORT:
-          uma_error = BrokerUMAError::ERROR_MAKE_RECEIVE_PORT;
-          break;
-        case base::MachCreateError::ERROR_SET_ATTRIBUTES:
-          uma_error = BrokerUMAError::ERROR_SET_ATTRIBUTES;
-          break;
-        case base::MachCreateError::ERROR_EXTRACT_DEST_RIGHT:
-          uma_error = BrokerUMAError::ERROR_EXTRACT_DEST_RIGHT;
-          break;
-        case base::MachCreateError::ERROR_SEND_MACH_PORT:
-          uma_error = BrokerUMAError::ERROR_SEND_MACH_PORT;
-          break;
-      }
-      ReportBrokerError(uma_error);
-      handle->port = MACH_PORT_NULL;
-      error = true;
-      break;
-    }
-
-    ReportBrokerError(BrokerUMAError::SUCCESS);
-    handle->port = intermediate_port;
-    handle->type = PlatformHandle::Type::MACH_NAME;
-    num_sent++;
-  }
-  DCHECK(error || num_sent);
-  message->SetHandles(std::move(handles));
-
-  return !error;
-}
-
-bool MachPortRelay::ExtractPortRights(Channel::Message* message,
-                                      base::ProcessHandle process) {
-  DCHECK(message);
-
-  mach_port_t task_port = port_provider_->TaskForPid(process);
-  if (task_port == MACH_PORT_NULL) {
-    ReportBrokerError(BrokerUMAError::ERROR_TASK_FOR_PID);
-    return false;
-  }
-
-  size_t num_received = 0;
-  bool error = false;
-  ScopedPlatformHandleVectorPtr handles = message->TakeHandles();
-  // Message should have handles, otherwise there's no point in calling this
-  // function.
-  DCHECK(handles);
-  for (size_t i = 0; i < handles->size(); i++) {
-    PlatformHandle* handle = handles->data() + i;
-    DCHECK(handle->type != PlatformHandle::Type::MACH);
-    if (handle->type != PlatformHandle::Type::MACH_NAME)
-      continue;
-
-    if (handle->port == MACH_PORT_NULL) {
-      handle->type = PlatformHandle::Type::MACH;
-      num_received++;
-      continue;
-    }
-
-    mach_port_t extracted_right = MACH_PORT_NULL;
-    mach_msg_type_name_t extracted_right_type;
-    kern_return_t kr =
-        mach_port_extract_right(task_port, handle->port,
-                                MACH_MSG_TYPE_MOVE_SEND,
-                                &extracted_right, &extracted_right_type);
-    if (kr != KERN_SUCCESS) {
-      ReportBrokerError(BrokerUMAError::ERROR_EXTRACT_SOURCE_RIGHT);
-      error = true;
-      break;
-    }
-
-    ReportBrokerError(BrokerUMAError::SUCCESS);
-    DCHECK_EQ(static_cast<mach_msg_type_name_t>(MACH_MSG_TYPE_PORT_SEND),
-              extracted_right_type);
-    handle->port = extracted_right;
-    handle->type = PlatformHandle::Type::MACH;
-    num_received++;
-  }
-  DCHECK(error || num_received);
-  message->SetHandles(std::move(handles));
-
-  return !error;
-}
-
-void MachPortRelay::AddObserver(Observer* observer) {
-  base::AutoLock locker(observers_lock_);
-  bool inserted = observers_.insert(observer).second;
-  DCHECK(inserted);
-}
-
-void MachPortRelay::RemoveObserver(Observer* observer) {
-  base::AutoLock locker(observers_lock_);
-  observers_.erase(observer);
-}
-
-void MachPortRelay::OnReceivedTaskPort(base::ProcessHandle process) {
-  base::AutoLock locker(observers_lock_);
-  for (auto* observer : observers_)
-    observer->OnProcessReady(process);
-}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/mach_port_relay.h b/mojo/edk/system/mach_port_relay.h
deleted file mode 100644
index 87bc56c..0000000
--- a/mojo/edk/system/mach_port_relay.h
+++ /dev/null
@@ -1,94 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_SYSTEM_MACH_PORT_RELAY_H_
-#define MOJO_EDK_SYSTEM_MACH_PORT_RELAY_H_
-
-#include <set>
-
-#include "base/macros.h"
-#include "base/process/port_provider_mac.h"
-#include "base/synchronization/lock.h"
-#include "mojo/edk/embedder/scoped_platform_handle.h"
-#include "mojo/edk/system/channel.h"
-
-namespace mojo {
-namespace edk {
-
-// The MachPortRelay is used by a privileged process, usually the root process,
-// to manipulate Mach ports in a child process. Ports can be added to and
-// extracted from a child process that has registered itself with the
-// |base::PortProvider| used by this class.
-class MachPortRelay : public base::PortProvider::Observer {
- public:
-  class Observer {
-   public:
-    // Called by the MachPortRelay to notify observers that a new process is
-    // ready for Mach ports to be sent/received. There are no guarantees about
-    // the thread this is called on, including the presence of a MessageLoop.
-    // Implementations must not call AddObserver() or RemoveObserver() during
-    // this function, as doing so will deadlock.
-    virtual void OnProcessReady(base::ProcessHandle process) = 0;
-  };
-
-  // Used by a child process to receive Mach ports from a sender (privileged)
-  // process. Each Mach port in |handles| is interpreted as an intermediate Mach
-  // port. It replaces each Mach port with the final Mach port received from the
-  // intermediate port. This method takes ownership of the intermediate Mach
-  // port and gives ownership of the final Mach port to the caller. Any handles
-  // that are not Mach ports will remain unchanged, and the number and ordering
-  // of handles is preserved.
-  // Returns |false| on failure and there is no guarantee about whether a Mach
-  // port is intermediate or final.
-  //
-  // See SendPortsToProcess() for the definition of intermediate and final Mach
-  // ports.
-  static bool ReceivePorts(PlatformHandleVector* handles);
-
-  explicit MachPortRelay(base::PortProvider* port_provider);
-  ~MachPortRelay() override;
-
-  // Sends the Mach ports attached to |message| to |process|.
-  // For each Mach port attached to |message|, a new Mach port, the intermediate
-  // port, is created in |process|. The message's Mach port is then sent over
-  // this intermediate port and the message is modified to refer to the name of
-  // the intermediate port. The Mach port received over the intermediate port in
-  // the child is referred to as the final Mach port.
-  // Returns |false| on failure and |message| may contain a mix of actual Mach
-  // ports and names.
-  bool SendPortsToProcess(Channel::Message* message,
-                          base::ProcessHandle process);
-
-  // Extracts the Mach ports attached to |message| from |process|.
-  // Any Mach ports attached to |message| are names and not actual Mach ports
-  // that are valid in this process. For each of those Mach port names, a send
-  // right is extracted from |process| and the port name is replaced with the
-  // send right.
-  // Returns |false| on failure and |message| may contain a mix of actual Mach
-  // ports and names.
-  bool ExtractPortRights(Channel::Message* message,
-                         base::ProcessHandle process);
-
-  // Observer interface.
-  void AddObserver(Observer* observer);
-  void RemoveObserver(Observer* observer);
-
-  base::PortProvider* port_provider() const { return port_provider_; }
-
- private:
-  // base::PortProvider::Observer implementation.
-  void OnReceivedTaskPort(base::ProcessHandle process) override;
-
-  base::PortProvider* const port_provider_;
-
-  base::Lock observers_lock_;
-  std::set<Observer*> observers_;
-
-  DISALLOW_COPY_AND_ASSIGN(MachPortRelay);
-};
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_MACH_PORT_RELAY_H_
diff --git a/mojo/edk/system/mapping_table.cc b/mojo/edk/system/mapping_table.cc
deleted file mode 100644
index 8509443..0000000
--- a/mojo/edk/system/mapping_table.cc
+++ /dev/null
@@ -1,48 +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 "mojo/edk/system/mapping_table.h"
-
-#include "base/logging.h"
-#include "mojo/edk/embedder/platform_shared_buffer.h"
-#include "mojo/edk/system/configuration.h"
-
-namespace mojo {
-namespace edk {
-
-MappingTable::MappingTable() {
-}
-
-MappingTable::~MappingTable() {
-  // This should usually not be reached (the only instance should be owned by
-  // the singleton |Core|, which lives forever), except in tests.
-}
-
-MojoResult MappingTable::AddMapping(
-    std::unique_ptr<PlatformSharedBufferMapping> mapping) {
-  DCHECK(mapping);
-
-  if (address_to_mapping_map_.size() >=
-      GetConfiguration().max_mapping_table_sze)
-    return MOJO_RESULT_RESOURCE_EXHAUSTED;
-
-  void* address = mapping->GetBase();
-  DCHECK(address_to_mapping_map_.find(address) ==
-         address_to_mapping_map_.end());
-  address_to_mapping_map_[address] = mapping.release();
-  return MOJO_RESULT_OK;
-}
-
-MojoResult MappingTable::RemoveMapping(void* address) {
-  AddressToMappingMap::iterator it = address_to_mapping_map_.find(address);
-  if (it == address_to_mapping_map_.end())
-    return MOJO_RESULT_INVALID_ARGUMENT;
-  PlatformSharedBufferMapping* mapping_to_delete = it->second;
-  address_to_mapping_map_.erase(it);
-  delete mapping_to_delete;
-  return MOJO_RESULT_OK;
-}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/mapping_table.h b/mojo/edk/system/mapping_table.h
deleted file mode 100644
index 00167e3..0000000
--- a/mojo/edk/system/mapping_table.h
+++ /dev/null
@@ -1,57 +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 MOJO_EDK_SYSTEM_MAPPING_TABLE_H_
-#define MOJO_EDK_SYSTEM_MAPPING_TABLE_H_
-
-#include <stdint.h>
-
-#include <memory>
-#include <vector>
-
-#include "base/containers/hash_tables.h"
-#include "base/macros.h"
-#include "mojo/edk/system/system_impl_export.h"
-#include "mojo/public/c/system/types.h"
-
-namespace mojo {
-
-namespace edk {
-class Core;
-class PlatformSharedBufferMapping;
-
-// Test-only function (defined/used in embedder/test_embedder.cc). Declared here
-// so it can be friended.
-namespace internal {
-bool ShutdownCheckNoLeaks(Core*);
-}
-
-// This class provides the (global) table of memory mappings (owned by |Core|),
-// which maps mapping base addresses to |PlatformSharedBufferMapping|s.
-//
-// This class is NOT thread-safe; locking is left to |Core|.
-class MOJO_SYSTEM_IMPL_EXPORT MappingTable {
- public:
-  MappingTable();
-  ~MappingTable();
-
-  // Tries to add a mapping. (Takes ownership of the mapping in all cases; on
-  // failure, it will be destroyed.)
-  MojoResult AddMapping(std::unique_ptr<PlatformSharedBufferMapping> mapping);
-  MojoResult RemoveMapping(void* address);
-
- private:
-  friend bool internal::ShutdownCheckNoLeaks(Core*);
-
-  using AddressToMappingMap =
-      base::hash_map<void*, PlatformSharedBufferMapping*>;
-  AddressToMappingMap address_to_mapping_map_;
-
-  DISALLOW_COPY_AND_ASSIGN(MappingTable);
-};
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_MAPPING_TABLE_H_
diff --git a/mojo/edk/system/message_for_transit.cc b/mojo/edk/system/message_for_transit.cc
deleted file mode 100644
index 26658e1..0000000
--- a/mojo/edk/system/message_for_transit.cc
+++ /dev/null
@@ -1,136 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/system/message_for_transit.h"
-
-#include <vector>
-
-#include "mojo/edk/embedder/platform_handle_vector.h"
-
-namespace mojo {
-namespace edk {
-
-namespace {
-
-static_assert(sizeof(MessageForTransit::MessageHeader) % 8 == 0,
-              "Invalid MessageHeader size.");
-static_assert(sizeof(MessageForTransit::DispatcherHeader) % 8 == 0,
-              "Invalid DispatcherHeader size.");
-
-}  // namespace
-
-MessageForTransit::~MessageForTransit() {}
-
-// static
-MojoResult MessageForTransit::Create(
-    std::unique_ptr<MessageForTransit>* message,
-    uint32_t num_bytes,
-    const Dispatcher::DispatcherInTransit* dispatchers,
-    uint32_t num_dispatchers) {
-  // A structure for retaining information about every Dispatcher that will be
-  // sent with this message.
-  struct DispatcherInfo {
-    uint32_t num_bytes;
-    uint32_t num_ports;
-    uint32_t num_handles;
-  };
-
-  // This is only the base header size. It will grow as we accumulate the
-  // size of serialized state for each dispatcher.
-  size_t header_size = sizeof(MessageHeader) +
-      num_dispatchers * sizeof(DispatcherHeader);
-  size_t num_ports = 0;
-  size_t num_handles = 0;
-
-  std::vector<DispatcherInfo> dispatcher_info(num_dispatchers);
-  for (size_t i = 0; i < num_dispatchers; ++i) {
-    Dispatcher* d = dispatchers[i].dispatcher.get();
-    d->StartSerialize(&dispatcher_info[i].num_bytes,
-                      &dispatcher_info[i].num_ports,
-                      &dispatcher_info[i].num_handles);
-    header_size += dispatcher_info[i].num_bytes;
-    num_ports += dispatcher_info[i].num_ports;
-    num_handles += dispatcher_info[i].num_handles;
-  }
-
-  // We now have enough information to fully allocate the message storage.
-  std::unique_ptr<PortsMessage> msg = PortsMessage::NewUserMessage(
-      header_size + num_bytes, num_ports, num_handles);
-  if (!msg)
-    return MOJO_RESULT_RESOURCE_EXHAUSTED;
-
-  // Populate the message header with information about serialized dispatchers.
-  //
-  // The front of the message is always a MessageHeader followed by a
-  // DispatcherHeader for each dispatcher to be sent.
-  MessageHeader* header =
-      static_cast<MessageHeader*>(msg->mutable_payload_bytes());
-  DispatcherHeader* dispatcher_headers =
-      reinterpret_cast<DispatcherHeader*>(header + 1);
-
-  // Serialized dispatcher state immediately follows the series of
-  // DispatcherHeaders.
-  char* dispatcher_data =
-      reinterpret_cast<char*>(dispatcher_headers + num_dispatchers);
-
-  header->num_dispatchers = num_dispatchers;
-
-  // |header_size| is the total number of bytes preceding the message payload,
-  // including all dispatcher headers and serialized dispatcher state.
-  DCHECK_LE(header_size, std::numeric_limits<uint32_t>::max());
-  header->header_size = static_cast<uint32_t>(header_size);
-
-  if (num_dispatchers > 0) {
-    ScopedPlatformHandleVectorPtr handles(
-        new PlatformHandleVector(num_handles));
-    size_t port_index = 0;
-    size_t handle_index = 0;
-    bool fail = false;
-    for (size_t i = 0; i < num_dispatchers; ++i) {
-      Dispatcher* d = dispatchers[i].dispatcher.get();
-      DispatcherHeader* dh = &dispatcher_headers[i];
-      const DispatcherInfo& info = dispatcher_info[i];
-
-      // Fill in the header for this dispatcher.
-      dh->type = static_cast<int32_t>(d->GetType());
-      dh->num_bytes = info.num_bytes;
-      dh->num_ports = info.num_ports;
-      dh->num_platform_handles = info.num_handles;
-
-      // Fill in serialized state, ports, and platform handles. We'll cancel
-      // the send if the dispatcher implementation rejects for some reason.
-      if (!d->EndSerialize(static_cast<void*>(dispatcher_data),
-                           msg->mutable_ports() + port_index,
-                           handles->data() + handle_index)) {
-        fail = true;
-        break;
-      }
-
-      dispatcher_data += info.num_bytes;
-      port_index += info.num_ports;
-      handle_index += info.num_handles;
-    }
-
-    if (fail) {
-      // Release any platform handles we've accumulated. Their dispatchers
-      // retain ownership when message creation fails, so these are not actually
-      // leaking.
-      handles->clear();
-      return MOJO_RESULT_INVALID_ARGUMENT;
-    }
-
-    // Take ownership of all the handles and move them into message storage.
-    msg->SetHandles(std::move(handles));
-  }
-
-  message->reset(new MessageForTransit(std::move(msg)));
-  return MOJO_RESULT_OK;
-}
-
-MessageForTransit::MessageForTransit(std::unique_ptr<PortsMessage> message)
-    : message_(std::move(message)) {
-}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/message_for_transit.h b/mojo/edk/system/message_for_transit.h
deleted file mode 100644
index 6103a77..0000000
--- a/mojo/edk/system/message_for_transit.h
+++ /dev/null
@@ -1,115 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_SYSTEM_MESSAGE_FOR_TRANSIT_H_
-#define MOJO_EDK_SYSTEM_MESSAGE_FOR_TRANSIT_H_
-
-#include <stdint.h>
-
-#include <memory>
-
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "mojo/edk/system/dispatcher.h"
-#include "mojo/edk/system/ports_message.h"
-#include "mojo/edk/system/system_impl_export.h"
-
-namespace mojo {
-namespace edk {
-
-// MessageForTransit holds onto a PortsMessage which may be sent via
-// |MojoWriteMessage()| or which may have been received on a pipe endpoint.
-// Instances of this class are exposed to Mojo system API consumers via the
-// opaque pointers used with |MojoCreateMessage()|, |MojoDestroyMessage()|,
-// |MojoWriteMessageNew()|, and |MojoReadMessageNew()|.
-class MOJO_SYSTEM_IMPL_EXPORT MessageForTransit {
- public:
-#pragma pack(push, 1)
-  // Header attached to every message.
-  struct MessageHeader {
-    // The number of serialized dispatchers included in this header.
-    uint32_t num_dispatchers;
-
-    // Total size of the header, including serialized dispatcher data.
-    uint32_t header_size;
-  };
-
-  // Header for each dispatcher in a message, immediately following the message
-  // header.
-  struct DispatcherHeader {
-    // The type of the dispatcher, correpsonding to the Dispatcher::Type enum.
-    int32_t type;
-
-    // The size of the serialized dispatcher, not including this header.
-    uint32_t num_bytes;
-
-    // The number of ports needed to deserialize this dispatcher.
-    uint32_t num_ports;
-
-    // The number of platform handles needed to deserialize this dispatcher.
-    uint32_t num_platform_handles;
-  };
-#pragma pack(pop)
-
-  ~MessageForTransit();
-
-  // A static constructor for building outbound messages.
-  static MojoResult Create(
-      std::unique_ptr<MessageForTransit>* message,
-      uint32_t num_bytes,
-      const Dispatcher::DispatcherInTransit* dispatchers,
-      uint32_t num_dispatchers);
-
-  // A static constructor for wrapping inbound messages.
-  static std::unique_ptr<MessageForTransit> WrapPortsMessage(
-      std::unique_ptr<PortsMessage> message) {
-    return base::WrapUnique(new MessageForTransit(std::move(message)));
-  }
-
-  const void* bytes() const {
-    DCHECK(message_);
-    return static_cast<const void*>(
-        static_cast<const char*>(message_->payload_bytes()) +
-            header()->header_size);
-  }
-
-  void* mutable_bytes() {
-    DCHECK(message_);
-    return static_cast<void*>(
-        static_cast<char*>(message_->mutable_payload_bytes()) +
-            header()->header_size);
-  }
-
-  size_t num_bytes() const {
-    size_t header_size = header()->header_size;
-    DCHECK_GE(message_->num_payload_bytes(), header_size);
-    return message_->num_payload_bytes() - header_size;
-  }
-
-  size_t num_handles() const { return header()->num_dispatchers; }
-
-  const PortsMessage& ports_message() const { return *message_; }
-
-  std::unique_ptr<PortsMessage> TakePortsMessage() {
-    return std::move(message_);
-  }
-
- private:
-  explicit MessageForTransit(std::unique_ptr<PortsMessage> message);
-
-  const MessageForTransit::MessageHeader* header() const {
-    DCHECK(message_);
-    return static_cast<const MessageForTransit::MessageHeader*>(
-        message_->payload_bytes());
-  }
-
-  std::unique_ptr<PortsMessage> message_;
-
-  DISALLOW_COPY_AND_ASSIGN(MessageForTransit);
-};
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_MESSAGE_FOR_TRANSIT_H_
diff --git a/mojo/edk/system/message_pipe_dispatcher.cc b/mojo/edk/system/message_pipe_dispatcher.cc
deleted file mode 100644
index 1db56c0..0000000
--- a/mojo/edk/system/message_pipe_dispatcher.cc
+++ /dev/null
@@ -1,554 +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 "mojo/edk/system/message_pipe_dispatcher.h"
-
-#include <limits>
-#include <memory>
-
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "mojo/edk/embedder/embedder_internal.h"
-#include "mojo/edk/system/core.h"
-#include "mojo/edk/system/message_for_transit.h"
-#include "mojo/edk/system/node_controller.h"
-#include "mojo/edk/system/ports/message_filter.h"
-#include "mojo/edk/system/ports_message.h"
-#include "mojo/edk/system/request_context.h"
-
-namespace mojo {
-namespace edk {
-
-namespace {
-
-using DispatcherHeader = MessageForTransit::DispatcherHeader;
-using MessageHeader = MessageForTransit::MessageHeader;
-
-#pragma pack(push, 1)
-
-struct SerializedState {
-  uint64_t pipe_id;
-  int8_t endpoint;
-  char padding[7];
-};
-
-static_assert(sizeof(SerializedState) % 8 == 0,
-              "Invalid SerializedState size.");
-
-#pragma pack(pop)
-
-}  // namespace
-
-// A PortObserver which forwards to a MessagePipeDispatcher. This owns a
-// reference to the MPD to ensure it lives as long as the observed port.
-class MessagePipeDispatcher::PortObserverThunk
-    : public NodeController::PortObserver {
- public:
-  explicit PortObserverThunk(scoped_refptr<MessagePipeDispatcher> dispatcher)
-      : dispatcher_(dispatcher) {}
-
- private:
-  ~PortObserverThunk() override {}
-
-  // NodeController::PortObserver:
-  void OnPortStatusChanged() override { dispatcher_->OnPortStatusChanged(); }
-
-  scoped_refptr<MessagePipeDispatcher> dispatcher_;
-
-  DISALLOW_COPY_AND_ASSIGN(PortObserverThunk);
-};
-
-// A MessageFilter used by ReadMessage to determine whether a message should
-// actually be consumed yet.
-class ReadMessageFilter : public ports::MessageFilter {
- public:
-  // Creates a new ReadMessageFilter which captures and potentially modifies
-  // various (unowned) local state within MessagePipeDispatcher::ReadMessage.
-  ReadMessageFilter(bool read_any_size,
-                    bool may_discard,
-                    uint32_t* num_bytes,
-                    uint32_t* num_handles,
-                    bool* no_space,
-                    bool* invalid_message)
-      : read_any_size_(read_any_size),
-        may_discard_(may_discard),
-        num_bytes_(num_bytes),
-        num_handles_(num_handles),
-        no_space_(no_space),
-        invalid_message_(invalid_message) {}
-
-  ~ReadMessageFilter() override {}
-
-  // ports::MessageFilter:
-  bool Match(const ports::Message& m) override {
-    const PortsMessage& message = static_cast<const PortsMessage&>(m);
-    if (message.num_payload_bytes() < sizeof(MessageHeader)) {
-      *invalid_message_ = true;
-      return true;
-    }
-
-    const MessageHeader* header =
-        static_cast<const MessageHeader*>(message.payload_bytes());
-    if (header->header_size > message.num_payload_bytes()) {
-      *invalid_message_ = true;
-      return true;
-    }
-
-    uint32_t bytes_to_read = 0;
-    uint32_t bytes_available =
-        static_cast<uint32_t>(message.num_payload_bytes()) -
-        header->header_size;
-    if (num_bytes_) {
-      bytes_to_read = std::min(*num_bytes_, bytes_available);
-      *num_bytes_ = bytes_available;
-    }
-
-    uint32_t handles_to_read = 0;
-    uint32_t handles_available = header->num_dispatchers;
-    if (num_handles_) {
-      handles_to_read = std::min(*num_handles_, handles_available);
-      *num_handles_ = handles_available;
-    }
-
-    if (handles_to_read < handles_available ||
-        (!read_any_size_ && bytes_to_read < bytes_available)) {
-      *no_space_ = true;
-      return may_discard_;
-    }
-
-    return true;
-  }
-
- private:
-  const bool read_any_size_;
-  const bool may_discard_;
-  uint32_t* const num_bytes_;
-  uint32_t* const num_handles_;
-  bool* const no_space_;
-  bool* const invalid_message_;
-
-  DISALLOW_COPY_AND_ASSIGN(ReadMessageFilter);
-};
-
-#if DCHECK_IS_ON()
-
-// A MessageFilter which never matches a message. Used to peek at the size of
-// the next available message on a port, for debug logging only.
-class PeekSizeMessageFilter : public ports::MessageFilter {
- public:
-  PeekSizeMessageFilter() {}
-  ~PeekSizeMessageFilter() override {}
-
-  // ports::MessageFilter:
-  bool Match(const ports::Message& message) override {
-    message_size_ = message.num_payload_bytes();
-    return false;
-  }
-
-  size_t message_size() const { return message_size_; }
-
- private:
-  size_t message_size_ = 0;
-
-  DISALLOW_COPY_AND_ASSIGN(PeekSizeMessageFilter);
-};
-
-#endif  // DCHECK_IS_ON()
-
-MessagePipeDispatcher::MessagePipeDispatcher(NodeController* node_controller,
-                                             const ports::PortRef& port,
-                                             uint64_t pipe_id,
-                                             int endpoint)
-    : node_controller_(node_controller),
-      port_(port),
-      pipe_id_(pipe_id),
-      endpoint_(endpoint),
-      watchers_(this) {
-  DVLOG(2) << "Creating new MessagePipeDispatcher for port " << port.name()
-           << " [pipe_id=" << pipe_id << "; endpoint=" << endpoint << "]";
-
-  node_controller_->SetPortObserver(
-      port_,
-      make_scoped_refptr(new PortObserverThunk(this)));
-}
-
-bool MessagePipeDispatcher::Fuse(MessagePipeDispatcher* other) {
-  node_controller_->SetPortObserver(port_, nullptr);
-  node_controller_->SetPortObserver(other->port_, nullptr);
-
-  ports::PortRef port0;
-  {
-    base::AutoLock lock(signal_lock_);
-    port0 = port_;
-    port_closed_.Set(true);
-    watchers_.NotifyClosed();
-  }
-
-  ports::PortRef port1;
-  {
-    base::AutoLock lock(other->signal_lock_);
-    port1 = other->port_;
-    other->port_closed_.Set(true);
-    other->watchers_.NotifyClosed();
-  }
-
-  // Both ports are always closed by this call.
-  int rv = node_controller_->MergeLocalPorts(port0, port1);
-  return rv == ports::OK;
-}
-
-Dispatcher::Type MessagePipeDispatcher::GetType() const {
-  return Type::MESSAGE_PIPE;
-}
-
-MojoResult MessagePipeDispatcher::Close() {
-  base::AutoLock lock(signal_lock_);
-  DVLOG(2) << "Closing message pipe " << pipe_id_ << " endpoint " << endpoint_
-           << " [port=" << port_.name() << "]";
-  return CloseNoLock();
-}
-
-MojoResult MessagePipeDispatcher::WriteMessage(
-    std::unique_ptr<MessageForTransit> message,
-    MojoWriteMessageFlags flags) {
-  if (port_closed_ || in_transit_)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  size_t num_bytes = message->num_bytes();
-  int rv = node_controller_->SendMessage(port_, message->TakePortsMessage());
-
-  DVLOG(4) << "Sent message on pipe " << pipe_id_ << " endpoint " << endpoint_
-           << " [port=" << port_.name() << "; rv=" << rv
-           << "; num_bytes=" << num_bytes << "]";
-
-  if (rv != ports::OK) {
-    if (rv == ports::ERROR_PORT_UNKNOWN ||
-        rv == ports::ERROR_PORT_STATE_UNEXPECTED ||
-        rv == ports::ERROR_PORT_CANNOT_SEND_PEER) {
-      return MOJO_RESULT_INVALID_ARGUMENT;
-    } else if (rv == ports::ERROR_PORT_PEER_CLOSED) {
-      return MOJO_RESULT_FAILED_PRECONDITION;
-    }
-
-    NOTREACHED();
-    return MOJO_RESULT_UNKNOWN;
-  }
-
-  return MOJO_RESULT_OK;
-}
-
-MojoResult MessagePipeDispatcher::ReadMessage(
-    std::unique_ptr<MessageForTransit>* message,
-    uint32_t* num_bytes,
-    MojoHandle* handles,
-    uint32_t* num_handles,
-    MojoReadMessageFlags flags,
-    bool read_any_size) {
-  // We can't read from a port that's closed or in transit!
-  if (port_closed_ || in_transit_)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  bool no_space = false;
-  bool may_discard = flags & MOJO_READ_MESSAGE_FLAG_MAY_DISCARD;
-  bool invalid_message = false;
-
-  // Grab a message if the provided handles buffer is large enough. If the input
-  // |num_bytes| is provided and |read_any_size| is false, we also ensure
-  // that it specifies a size at least as large as the next available payload.
-  //
-  // If |read_any_size| is true, the input value of |*num_bytes| is ignored.
-  // This flag exists to support both new and old API behavior.
-
-  ports::ScopedMessage ports_message;
-  ReadMessageFilter filter(read_any_size, may_discard, num_bytes, num_handles,
-                           &no_space, &invalid_message);
-  int rv = node_controller_->node()->GetMessage(port_, &ports_message, &filter);
-
-  if (invalid_message)
-    return MOJO_RESULT_UNKNOWN;
-
-  if (rv != ports::OK && rv != ports::ERROR_PORT_PEER_CLOSED) {
-    if (rv == ports::ERROR_PORT_UNKNOWN ||
-        rv == ports::ERROR_PORT_STATE_UNEXPECTED)
-      return MOJO_RESULT_INVALID_ARGUMENT;
-
-    NOTREACHED();
-    return MOJO_RESULT_UNKNOWN;  // TODO: Add a better error code here?
-  }
-
-  if (no_space) {
-    if (may_discard) {
-      // May have been the last message on the pipe. Need to update signals just
-      // in case.
-      base::AutoLock lock(signal_lock_);
-      watchers_.NotifyState(GetHandleSignalsStateNoLock());
-    }
-    // |*num_handles| (and/or |*num_bytes| if |read_any_size| is false) wasn't
-    // sufficient to hold this message's data. The message will still be in
-    // queue unless MOJO_READ_MESSAGE_FLAG_MAY_DISCARD was set.
-    return MOJO_RESULT_RESOURCE_EXHAUSTED;
-  }
-
-  if (!ports_message) {
-    // No message was available in queue.
-
-    if (rv == ports::OK)
-      return MOJO_RESULT_SHOULD_WAIT;
-
-    // Peer is closed and there are no more messages to read.
-    DCHECK_EQ(rv, ports::ERROR_PORT_PEER_CLOSED);
-    return MOJO_RESULT_FAILED_PRECONDITION;
-  }
-
-  // Alright! We have a message and the caller has provided sufficient storage
-  // in which to receive it.
-
-  {
-    // We need to update anyone watching our signals in case that was the last
-    // available message.
-    base::AutoLock lock(signal_lock_);
-    watchers_.NotifyState(GetHandleSignalsStateNoLock());
-  }
-
-  std::unique_ptr<PortsMessage> msg(
-      static_cast<PortsMessage*>(ports_message.release()));
-
-  const MessageHeader* header =
-      static_cast<const MessageHeader*>(msg->payload_bytes());
-  const DispatcherHeader* dispatcher_headers =
-      reinterpret_cast<const DispatcherHeader*>(header + 1);
-
-  if (header->num_dispatchers > std::numeric_limits<uint16_t>::max())
-    return MOJO_RESULT_UNKNOWN;
-
-  // Deserialize dispatchers.
-  if (header->num_dispatchers > 0) {
-    CHECK(handles);
-    std::vector<DispatcherInTransit> dispatchers(header->num_dispatchers);
-    size_t data_payload_index = sizeof(MessageHeader) +
-        header->num_dispatchers * sizeof(DispatcherHeader);
-    if (data_payload_index > header->header_size)
-      return MOJO_RESULT_UNKNOWN;
-    const char* dispatcher_data = reinterpret_cast<const char*>(
-        dispatcher_headers + header->num_dispatchers);
-    size_t port_index = 0;
-    size_t platform_handle_index = 0;
-    ScopedPlatformHandleVectorPtr msg_handles = msg->TakeHandles();
-    const size_t num_msg_handles = msg_handles ? msg_handles->size() : 0;
-    for (size_t i = 0; i < header->num_dispatchers; ++i) {
-      const DispatcherHeader& dh = dispatcher_headers[i];
-      Type type = static_cast<Type>(dh.type);
-
-      size_t next_payload_index = data_payload_index + dh.num_bytes;
-      if (msg->num_payload_bytes() < next_payload_index ||
-          next_payload_index < data_payload_index) {
-        return MOJO_RESULT_UNKNOWN;
-      }
-
-      size_t next_port_index = port_index + dh.num_ports;
-      if (msg->num_ports() < next_port_index || next_port_index < port_index)
-        return MOJO_RESULT_UNKNOWN;
-
-      size_t next_platform_handle_index =
-          platform_handle_index + dh.num_platform_handles;
-      if (num_msg_handles < next_platform_handle_index ||
-          next_platform_handle_index < platform_handle_index) {
-        return MOJO_RESULT_UNKNOWN;
-      }
-
-      PlatformHandle* out_handles =
-          num_msg_handles ? msg_handles->data() + platform_handle_index
-                          : nullptr;
-      dispatchers[i].dispatcher = Dispatcher::Deserialize(
-          type, dispatcher_data, dh.num_bytes, msg->ports() + port_index,
-          dh.num_ports, out_handles, dh.num_platform_handles);
-      if (!dispatchers[i].dispatcher)
-        return MOJO_RESULT_UNKNOWN;
-
-      dispatcher_data += dh.num_bytes;
-      data_payload_index = next_payload_index;
-      port_index = next_port_index;
-      platform_handle_index = next_platform_handle_index;
-    }
-
-    if (!node_controller_->core()->AddDispatchersFromTransit(dispatchers,
-                                                             handles))
-      return MOJO_RESULT_UNKNOWN;
-  }
-
-  CHECK(msg);
-  *message = MessageForTransit::WrapPortsMessage(std::move(msg));
-  return MOJO_RESULT_OK;
-}
-
-HandleSignalsState
-MessagePipeDispatcher::GetHandleSignalsState() const {
-  base::AutoLock lock(signal_lock_);
-  return GetHandleSignalsStateNoLock();
-}
-
-MojoResult MessagePipeDispatcher::AddWatcherRef(
-    const scoped_refptr<WatcherDispatcher>& watcher,
-    uintptr_t context) {
-  base::AutoLock lock(signal_lock_);
-  if (port_closed_ || in_transit_)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-  return watchers_.Add(watcher, context, GetHandleSignalsStateNoLock());
-}
-
-MojoResult MessagePipeDispatcher::RemoveWatcherRef(WatcherDispatcher* watcher,
-                                                   uintptr_t context) {
-  base::AutoLock lock(signal_lock_);
-  if (port_closed_ || in_transit_)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-  return watchers_.Remove(watcher, context);
-}
-
-void MessagePipeDispatcher::StartSerialize(uint32_t* num_bytes,
-                                           uint32_t* num_ports,
-                                           uint32_t* num_handles) {
-  *num_bytes = static_cast<uint32_t>(sizeof(SerializedState));
-  *num_ports = 1;
-  *num_handles = 0;
-}
-
-bool MessagePipeDispatcher::EndSerialize(void* destination,
-                                         ports::PortName* ports,
-                                         PlatformHandle* handles) {
-  SerializedState* state = static_cast<SerializedState*>(destination);
-  state->pipe_id = pipe_id_;
-  state->endpoint = static_cast<int8_t>(endpoint_);
-  memset(state->padding, 0, sizeof(state->padding));
-  ports[0] = port_.name();
-  return true;
-}
-
-bool MessagePipeDispatcher::BeginTransit() {
-  base::AutoLock lock(signal_lock_);
-  if (in_transit_ || port_closed_)
-    return false;
-  in_transit_.Set(true);
-  return in_transit_;
-}
-
-void MessagePipeDispatcher::CompleteTransitAndClose() {
-  node_controller_->SetPortObserver(port_, nullptr);
-
-  base::AutoLock lock(signal_lock_);
-  port_transferred_ = true;
-  in_transit_.Set(false);
-  CloseNoLock();
-}
-
-void MessagePipeDispatcher::CancelTransit() {
-  base::AutoLock lock(signal_lock_);
-  in_transit_.Set(false);
-
-  // Something may have happened while we were waiting for potential transit.
-  watchers_.NotifyState(GetHandleSignalsStateNoLock());
-}
-
-// static
-scoped_refptr<Dispatcher> MessagePipeDispatcher::Deserialize(
-    const void* data,
-    size_t num_bytes,
-    const ports::PortName* ports,
-    size_t num_ports,
-    PlatformHandle* handles,
-    size_t num_handles) {
-  if (num_ports != 1 || num_handles || num_bytes != sizeof(SerializedState))
-    return nullptr;
-
-  const SerializedState* state = static_cast<const SerializedState*>(data);
-
-  ports::PortRef port;
-  CHECK_EQ(
-      ports::OK,
-      internal::g_core->GetNodeController()->node()->GetPort(ports[0], &port));
-
-  return new MessagePipeDispatcher(internal::g_core->GetNodeController(), port,
-                                   state->pipe_id, state->endpoint);
-}
-
-MessagePipeDispatcher::~MessagePipeDispatcher() {
-  DCHECK(port_closed_ && !in_transit_);
-}
-
-MojoResult MessagePipeDispatcher::CloseNoLock() {
-  signal_lock_.AssertAcquired();
-  if (port_closed_ || in_transit_)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  port_closed_.Set(true);
-  watchers_.NotifyClosed();
-
-  if (!port_transferred_) {
-    base::AutoUnlock unlock(signal_lock_);
-    node_controller_->ClosePort(port_);
-  }
-
-  return MOJO_RESULT_OK;
-}
-
-HandleSignalsState MessagePipeDispatcher::GetHandleSignalsStateNoLock() const {
-  HandleSignalsState rv;
-
-  ports::PortStatus port_status;
-  if (node_controller_->node()->GetStatus(port_, &port_status) != ports::OK) {
-    CHECK(in_transit_ || port_transferred_ || port_closed_);
-    return HandleSignalsState();
-  }
-
-  if (port_status.has_messages) {
-    rv.satisfied_signals |= MOJO_HANDLE_SIGNAL_READABLE;
-    rv.satisfiable_signals |= MOJO_HANDLE_SIGNAL_READABLE;
-  }
-  if (port_status.receiving_messages)
-    rv.satisfiable_signals |= MOJO_HANDLE_SIGNAL_READABLE;
-  if (!port_status.peer_closed) {
-    rv.satisfied_signals |= MOJO_HANDLE_SIGNAL_WRITABLE;
-    rv.satisfiable_signals |= MOJO_HANDLE_SIGNAL_WRITABLE;
-    rv.satisfiable_signals |= MOJO_HANDLE_SIGNAL_READABLE;
-  } else {
-    rv.satisfied_signals |= MOJO_HANDLE_SIGNAL_PEER_CLOSED;
-  }
-  rv.satisfiable_signals |= MOJO_HANDLE_SIGNAL_PEER_CLOSED;
-  return rv;
-}
-
-void MessagePipeDispatcher::OnPortStatusChanged() {
-  DCHECK(RequestContext::current());
-
-  base::AutoLock lock(signal_lock_);
-
-  // We stop observing our port as soon as it's transferred, but this can race
-  // with events which are raised right before that happens. This is fine to
-  // ignore.
-  if (port_transferred_)
-    return;
-
-#if DCHECK_IS_ON()
-  ports::PortStatus port_status;
-  if (node_controller_->node()->GetStatus(port_, &port_status) == ports::OK) {
-    if (port_status.has_messages) {
-      ports::ScopedMessage unused;
-      PeekSizeMessageFilter filter;
-      node_controller_->node()->GetMessage(port_, &unused, &filter);
-      DVLOG(4) << "New message detected on message pipe " << pipe_id_
-               << " endpoint " << endpoint_ << " [port=" << port_.name()
-               << "; size=" << filter.message_size() << "]";
-    }
-    if (port_status.peer_closed) {
-      DVLOG(2) << "Peer closure detected on message pipe " << pipe_id_
-               << " endpoint " << endpoint_ << " [port=" << port_.name() << "]";
-    }
-  }
-#endif
-
-  watchers_.NotifyState(GetHandleSignalsStateNoLock());
-}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/message_pipe_dispatcher.h b/mojo/edk/system/message_pipe_dispatcher.h
deleted file mode 100644
index 574ad66..0000000
--- a/mojo/edk/system/message_pipe_dispatcher.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 MOJO_EDK_SYSTEM_MESSAGE_PIPE_DISPATCHER_H_
-#define MOJO_EDK_SYSTEM_MESSAGE_PIPE_DISPATCHER_H_
-
-#include <stdint.h>
-
-#include <memory>
-#include <queue>
-
-#include "base/macros.h"
-#include "mojo/edk/system/atomic_flag.h"
-#include "mojo/edk/system/dispatcher.h"
-#include "mojo/edk/system/message_for_transit.h"
-#include "mojo/edk/system/ports/port_ref.h"
-#include "mojo/edk/system/watcher_set.h"
-
-namespace mojo {
-namespace edk {
-
-class NodeController;
-
-class MessagePipeDispatcher : public Dispatcher {
- public:
-  // Constructs a MessagePipeDispatcher permanently tied to a specific port.
-  // |connected| must indicate the state of the port at construction time; if
-  // the port is initialized with a peer, |connected| must be true. Otherwise it
-  // must be false.
-  //
-  // A MessagePipeDispatcher may not be transferred while in a disconnected
-  // state, and one can never return to a disconnected once connected.
-  //
-  // |pipe_id| is a unique identifier which can be used to track pipe endpoints
-  // as they're passed around. |endpoint| is either 0 or 1 and again is only
-  // used for tracking pipes (one side is always 0, the other is always 1.)
-  MessagePipeDispatcher(NodeController* node_controller,
-                        const ports::PortRef& port,
-                        uint64_t pipe_id,
-                        int endpoint);
-
-  // Fuses this pipe with |other|. Returns |true| on success or |false| on
-  // failure. Regardless of the return value, both dispatchers are closed by
-  // this call.
-  bool Fuse(MessagePipeDispatcher* other);
-
-  // Dispatcher:
-  Type GetType() const override;
-  MojoResult Close() override;
-  MojoResult WriteMessage(std::unique_ptr<MessageForTransit> message,
-                          MojoWriteMessageFlags flags) override;
-  MojoResult ReadMessage(std::unique_ptr<MessageForTransit>* message,
-                         uint32_t* num_bytes,
-                         MojoHandle* handles,
-                         uint32_t* num_handles,
-                         MojoReadMessageFlags flags,
-                         bool read_any_size) override;
-  HandleSignalsState GetHandleSignalsState() const override;
-  MojoResult AddWatcherRef(const scoped_refptr<WatcherDispatcher>& watcher,
-                           uintptr_t context) override;
-  MojoResult RemoveWatcherRef(WatcherDispatcher* watcher,
-                              uintptr_t context) override;
-  void StartSerialize(uint32_t* num_bytes,
-                      uint32_t* num_ports,
-                      uint32_t* num_handles) override;
-  bool EndSerialize(void* destination,
-                    ports::PortName* ports,
-                    PlatformHandle* handles) override;
-  bool BeginTransit() override;
-  void CompleteTransitAndClose() override;
-  void CancelTransit() override;
-
-  static scoped_refptr<Dispatcher> Deserialize(
-      const void* data,
-      size_t num_bytes,
-      const ports::PortName* ports,
-      size_t num_ports,
-      PlatformHandle* handles,
-      size_t num_handles);
-
- private:
-  class PortObserverThunk;
-  friend class PortObserverThunk;
-
-  ~MessagePipeDispatcher() override;
-
-  MojoResult CloseNoLock();
-  HandleSignalsState GetHandleSignalsStateNoLock() const;
-  void OnPortStatusChanged();
-
-  // These are safe to access from any thread without locking.
-  NodeController* const node_controller_;
-  const ports::PortRef port_;
-  const uint64_t pipe_id_;
-  const int endpoint_;
-
-  // Guards access to all the fields below.
-  mutable base::Lock signal_lock_;
-
-  // This is not the same is |port_transferred_|. It's only held true between
-  // BeginTransit() and Complete/CancelTransit().
-  AtomicFlag in_transit_;
-
-  bool port_transferred_ = false;
-  AtomicFlag port_closed_;
-  WatcherSet watchers_;
-
-  DISALLOW_COPY_AND_ASSIGN(MessagePipeDispatcher);
-};
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_MESSAGE_PIPE_DISPATCHER_H_
diff --git a/mojo/edk/system/message_pipe_perftest.cc b/mojo/edk/system/message_pipe_perftest.cc
deleted file mode 100644
index 9866c47..0000000
--- a/mojo/edk/system/message_pipe_perftest.cc
+++ /dev/null
@@ -1,167 +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 <stddef.h>
-#include <stdint.h>
-
-#include <memory>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/bind_helpers.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/strings/stringprintf.h"
-#include "base/test/perf_time_logger.h"
-#include "base/threading/thread.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/embedder/scoped_platform_handle.h"
-#include "mojo/edk/system/handle_signals_state.h"
-#include "mojo/edk/system/test_utils.h"
-#include "mojo/edk/test/mojo_test_base.h"
-#include "mojo/edk/test/test_utils.h"
-#include "mojo/public/c/system/functions.h"
-#include "mojo/public/cpp/system/message_pipe.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace edk {
-namespace {
-
-class MessagePipePerfTest : public test::MojoTestBase {
- public:
-  MessagePipePerfTest() : message_count_(0), message_size_(0) {}
-
-  void SetUpMeasurement(int message_count, size_t message_size) {
-    message_count_ = message_count;
-    message_size_ = message_size;
-    payload_ = std::string(message_size, '*');
-    read_buffer_.resize(message_size * 2);
-  }
-
- protected:
-  void WriteWaitThenRead(MojoHandle mp) {
-    CHECK_EQ(MojoWriteMessage(mp, payload_.data(),
-                              static_cast<uint32_t>(payload_.size()), nullptr,
-                              0, MOJO_WRITE_MESSAGE_FLAG_NONE),
-             MOJO_RESULT_OK);
-    HandleSignalsState hss;
-    CHECK_EQ(WaitForSignals(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss),
-             MOJO_RESULT_OK);
-    uint32_t read_buffer_size = static_cast<uint32_t>(read_buffer_.size());
-    CHECK_EQ(MojoReadMessage(mp, &read_buffer_[0], &read_buffer_size, nullptr,
-                             nullptr, MOJO_READ_MESSAGE_FLAG_NONE),
-             MOJO_RESULT_OK);
-    CHECK_EQ(read_buffer_size, static_cast<uint32_t>(payload_.size()));
-  }
-
-  void SendQuitMessage(MojoHandle mp) {
-    CHECK_EQ(MojoWriteMessage(mp, "", 0, nullptr, 0,
-                              MOJO_WRITE_MESSAGE_FLAG_NONE),
-             MOJO_RESULT_OK);
-  }
-
-  void Measure(MojoHandle mp) {
-    // Have one ping-pong to ensure channel being established.
-    WriteWaitThenRead(mp);
-
-    std::string test_name =
-        base::StringPrintf("IPC_Perf_%dx_%u", message_count_,
-                           static_cast<unsigned>(message_size_));
-    base::PerfTimeLogger logger(test_name.c_str());
-
-    for (int i = 0; i < message_count_; ++i)
-      WriteWaitThenRead(mp);
-
-    logger.Done();
-  }
-
- protected:
-  void RunPingPongServer(MojoHandle mp) {
-    // This values are set to align with one at ipc_pertests.cc for comparison.
-    const size_t kMsgSize[5] = {12, 144, 1728, 20736, 248832};
-    const int kMessageCount[5] = {50000, 50000, 50000, 12000, 1000};
-
-    for (size_t i = 0; i < 5; i++) {
-      SetUpMeasurement(kMessageCount[i], kMsgSize[i]);
-      Measure(mp);
-    }
-
-    SendQuitMessage(mp);
-  }
-
-  static int RunPingPongClient(MojoHandle mp) {
-    std::string buffer(1000000, '\0');
-    int rv = 0;
-    while (true) {
-      // Wait for our end of the message pipe to be readable.
-      HandleSignalsState hss;
-      MojoResult result = WaitForSignals(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss);
-      if (result != MOJO_RESULT_OK) {
-        rv = result;
-        break;
-      }
-
-      uint32_t read_size = static_cast<uint32_t>(buffer.size());
-      CHECK_EQ(MojoReadMessage(mp, &buffer[0],
-                               &read_size, nullptr,
-                               0, MOJO_READ_MESSAGE_FLAG_NONE),
-               MOJO_RESULT_OK);
-
-      // Empty message indicates quit.
-      if (read_size == 0)
-        break;
-
-      CHECK_EQ(MojoWriteMessage(mp, &buffer[0],
-                                read_size,
-                                nullptr, 0, MOJO_WRITE_MESSAGE_FLAG_NONE),
-               MOJO_RESULT_OK);
-    }
-
-    return rv;
-  }
-
- private:
-  int message_count_;
-  size_t message_size_;
-  std::string payload_;
-  std::string read_buffer_;
-  std::unique_ptr<base::PerfTimeLogger> perf_logger_;
-
-  DISALLOW_COPY_AND_ASSIGN(MessagePipePerfTest);
-};
-
-TEST_F(MessagePipePerfTest, PingPong) {
-  MojoHandle server_handle, client_handle;
-  CreateMessagePipe(&server_handle, &client_handle);
-
-  base::Thread client_thread("PingPongClient");
-  client_thread.Start();
-  client_thread.task_runner()->PostTask(
-      FROM_HERE,
-      base::Bind(base::IgnoreResult(&RunPingPongClient), client_handle));
-
-  RunPingPongServer(server_handle);
-}
-
-// For each message received, sends a reply message with the same contents
-// repeated twice, until the other end is closed or it receives "quitquitquit"
-// (which it doesn't reply to). It'll return the number of messages received,
-// not including any "quitquitquit" message, modulo 100.
-DEFINE_TEST_CLIENT_WITH_PIPE(PingPongClient, MessagePipePerfTest, h) {
-  return RunPingPongClient(h);
-}
-
-// Repeatedly sends messages as previous one got replied by the child.
-// Waits for the child to close its end before quitting once specified
-// number of messages has been sent.
-TEST_F(MessagePipePerfTest, MultiprocessPingPong) {
-  RUN_CHILD_ON_PIPE(PingPongClient, h)
-    RunPingPongServer(h);
-  END_CHILD()
-}
-
-}  // namespace
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/message_pipe_unittest.cc b/mojo/edk/system/message_pipe_unittest.cc
deleted file mode 100644
index e6f1ff6..0000000
--- a/mojo/edk/system/message_pipe_unittest.cc
+++ /dev/null
@@ -1,699 +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 <stdint.h>
-#include <string.h>
-
-#include "base/memory/ref_counted.h"
-#include "mojo/edk/system/test_utils.h"
-#include "mojo/edk/test/mojo_test_base.h"
-#include "mojo/public/c/system/core.h"
-#include "mojo/public/c/system/types.h"
-
-namespace mojo {
-namespace edk {
-namespace {
-
-const MojoHandleSignals kAllSignals = MOJO_HANDLE_SIGNAL_READABLE |
-                                      MOJO_HANDLE_SIGNAL_WRITABLE |
-                                      MOJO_HANDLE_SIGNAL_PEER_CLOSED;
-static const char kHelloWorld[] = "hello world";
-
-class MessagePipeTest : public test::MojoTestBase {
- public:
-  MessagePipeTest() {
-    CHECK_EQ(MOJO_RESULT_OK, MojoCreateMessagePipe(nullptr, &pipe0_, &pipe1_));
-  }
-
-  ~MessagePipeTest() override {
-    if (pipe0_ != MOJO_HANDLE_INVALID)
-      CHECK_EQ(MOJO_RESULT_OK, MojoClose(pipe0_));
-    if (pipe1_ != MOJO_HANDLE_INVALID)
-      CHECK_EQ(MOJO_RESULT_OK, MojoClose(pipe1_));
-  }
-
-  MojoResult WriteMessage(MojoHandle message_pipe_handle,
-                          const void* bytes,
-                          uint32_t num_bytes) {
-    return MojoWriteMessage(message_pipe_handle, bytes, num_bytes, nullptr, 0,
-                            MOJO_WRITE_MESSAGE_FLAG_NONE);
-  }
-
-  MojoResult ReadMessage(MojoHandle message_pipe_handle,
-                         void* bytes,
-                         uint32_t* num_bytes,
-                         bool may_discard = false) {
-    return MojoReadMessage(message_pipe_handle, bytes, num_bytes, nullptr, 0,
-                           may_discard ? MOJO_READ_MESSAGE_FLAG_MAY_DISCARD :
-                                         MOJO_READ_MESSAGE_FLAG_NONE);
-  }
-
-  MojoHandle pipe0_, pipe1_;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MessagePipeTest);
-};
-
-using FuseMessagePipeTest = test::MojoTestBase;
-
-TEST_F(MessagePipeTest, WriteData) {
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WriteMessage(pipe0_, kHelloWorld, sizeof(kHelloWorld)));
-}
-
-// Tests:
-//  - only default flags
-//  - reading messages from a port
-//    - when there are no/one/two messages available for that port
-//    - with buffer size 0 (and null buffer) -- should get size
-//    - with too-small buffer -- should get size
-//    - also verify that buffers aren't modified when/where they shouldn't be
-//  - writing messages to a port
-//    - in the obvious scenarios (as above)
-//    - to a port that's been closed
-//  - writing a message to a port, closing the other (would be the source) port,
-//    and reading it
-TEST_F(MessagePipeTest, Basic) {
-  int32_t buffer[2];
-  const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer));
-  uint32_t buffer_size;
-
-  // Nothing to read yet on port 0.
-  buffer[0] = 123;
-  buffer[1] = 456;
-  buffer_size = kBufferSize;
-  ASSERT_EQ(MOJO_RESULT_SHOULD_WAIT, ReadMessage(pipe0_, buffer, &buffer_size));
-  ASSERT_EQ(kBufferSize, buffer_size);
-  ASSERT_EQ(123, buffer[0]);
-  ASSERT_EQ(456, buffer[1]);
-
-  // Ditto for port 1.
-  buffer[0] = 123;
-  buffer[1] = 456;
-  buffer_size = kBufferSize;
-  ASSERT_EQ(MOJO_RESULT_SHOULD_WAIT, ReadMessage(pipe1_, buffer, &buffer_size));
-
-  // Write from port 1 (to port 0).
-  buffer[0] = 789012345;
-  buffer[1] = 0;
-  ASSERT_EQ(MOJO_RESULT_OK, WriteMessage(pipe1_, buffer, sizeof(buffer[0])));
-
-  MojoHandleSignalsState state;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(pipe0_, MOJO_HANDLE_SIGNAL_READABLE, &state));
-
-  // Read from port 0.
-  buffer[0] = 123;
-  buffer[1] = 456;
-  buffer_size = kBufferSize;
-  ASSERT_EQ(MOJO_RESULT_OK, ReadMessage(pipe0_, buffer, &buffer_size));
-  ASSERT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size);
-  ASSERT_EQ(789012345, buffer[0]);
-  ASSERT_EQ(456, buffer[1]);
-
-  // Read again from port 0 -- it should be empty.
-  buffer_size = kBufferSize;
-  ASSERT_EQ(MOJO_RESULT_SHOULD_WAIT, ReadMessage(pipe0_, buffer, &buffer_size));
-
-  // Write two messages from port 0 (to port 1).
-  buffer[0] = 123456789;
-  buffer[1] = 0;
-  ASSERT_EQ(MOJO_RESULT_OK, WriteMessage(pipe0_, buffer, sizeof(buffer[0])));
-  buffer[0] = 234567890;
-  buffer[1] = 0;
-  ASSERT_EQ(MOJO_RESULT_OK, WriteMessage(pipe0_, buffer, sizeof(buffer[0])));
-
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(pipe1_, MOJO_HANDLE_SIGNAL_READABLE, &state));
-
-  // Read from port 1 with buffer size 0 (should get the size of next message).
-  // Also test that giving a null buffer is okay when the buffer size is 0.
-  buffer_size = 0;
-  ASSERT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED,
-            ReadMessage(pipe1_, nullptr, &buffer_size));
-  ASSERT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size);
-
-  // Read from port 1 with buffer size 1 (too small; should get the size of next
-  // message).
-  buffer[0] = 123;
-  buffer[1] = 456;
-  buffer_size = 1;
-  ASSERT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED,
-            ReadMessage(pipe1_, buffer, &buffer_size));
-  ASSERT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size);
-  ASSERT_EQ(123, buffer[0]);
-  ASSERT_EQ(456, buffer[1]);
-
-  // Read from port 1.
-  buffer[0] = 123;
-  buffer[1] = 456;
-  buffer_size = kBufferSize;
-  ASSERT_EQ(MOJO_RESULT_OK, ReadMessage(pipe1_, buffer, &buffer_size));
-  ASSERT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size);
-  ASSERT_EQ(123456789, buffer[0]);
-  ASSERT_EQ(456, buffer[1]);
-
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(pipe1_, MOJO_HANDLE_SIGNAL_READABLE, &state));
-
-  // Read again from port 1.
-  buffer[0] = 123;
-  buffer[1] = 456;
-  buffer_size = kBufferSize;
-  ASSERT_EQ(MOJO_RESULT_OK, ReadMessage(pipe1_, buffer, &buffer_size));
-  ASSERT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size);
-  ASSERT_EQ(234567890, buffer[0]);
-  ASSERT_EQ(456, buffer[1]);
-
-  // Read again from port 1 -- it should be empty.
-  buffer_size = kBufferSize;
-  ASSERT_EQ(MOJO_RESULT_SHOULD_WAIT, ReadMessage(pipe1_, buffer, &buffer_size));
-
-  // Write from port 0 (to port 1).
-  buffer[0] = 345678901;
-  buffer[1] = 0;
-  ASSERT_EQ(MOJO_RESULT_OK, WriteMessage(pipe0_, buffer, sizeof(buffer[0])));
-
-  // Close port 0.
-  MojoClose(pipe0_);
-  pipe0_ = MOJO_HANDLE_INVALID;
-
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(pipe1_, MOJO_HANDLE_SIGNAL_PEER_CLOSED, &state));
-
-  // Try to write from port 1 (to port 0).
-  buffer[0] = 456789012;
-  buffer[1] = 0;
-  ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-            WriteMessage(pipe1_, buffer, sizeof(buffer[0])));
-
-  // Read from port 1; should still get message (even though port 0 was closed).
-  buffer[0] = 123;
-  buffer[1] = 456;
-  buffer_size = kBufferSize;
-  ASSERT_EQ(MOJO_RESULT_OK, ReadMessage(pipe1_, buffer, &buffer_size));
-  ASSERT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size);
-  ASSERT_EQ(345678901, buffer[0]);
-  ASSERT_EQ(456, buffer[1]);
-
-  // Read again from port 1 -- it should be empty (and port 0 is closed).
-  buffer_size = kBufferSize;
-  ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-            ReadMessage(pipe1_, buffer, &buffer_size));
-}
-
-TEST_F(MessagePipeTest, CloseWithQueuedIncomingMessages) {
-  int32_t buffer[1];
-  const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer));
-  uint32_t buffer_size;
-
-  // Write some messages from port 1 (to port 0).
-  for (int32_t i = 0; i < 5; i++) {
-    buffer[0] = i;
-    ASSERT_EQ(MOJO_RESULT_OK, WriteMessage(pipe1_, buffer, kBufferSize));
-  }
-
-  MojoHandleSignalsState state;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(pipe0_, MOJO_HANDLE_SIGNAL_READABLE, &state));
-
-  // Port 0 shouldn't be empty.
-  buffer_size = 0;
-  ASSERT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED,
-            ReadMessage(pipe0_, nullptr, &buffer_size));
-  ASSERT_EQ(kBufferSize, buffer_size);
-
-  // Close port 0 first, which should have outstanding (incoming) messages.
-  MojoClose(pipe0_);
-  MojoClose(pipe1_);
-  pipe0_ = pipe1_ = MOJO_HANDLE_INVALID;
-}
-
-TEST_F(MessagePipeTest, DiscardMode) {
-  int32_t buffer[2];
-  const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer));
-  uint32_t buffer_size;
-
-  // Write from port 1 (to port 0).
-  buffer[0] = 789012345;
-  buffer[1] = 0;
-  ASSERT_EQ(MOJO_RESULT_OK, WriteMessage(pipe1_, buffer, sizeof(buffer[0])));
-
-  MojoHandleSignalsState state;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(pipe0_, MOJO_HANDLE_SIGNAL_READABLE, &state));
-
-  // Read/discard from port 0 (no buffer); get size.
-  buffer_size = 0;
-  ASSERT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED,
-            ReadMessage(pipe0_, nullptr, &buffer_size, true));
-  ASSERT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size);
-
-  // Read again from port 0 -- it should be empty.
-  buffer_size = kBufferSize;
-  ASSERT_EQ(MOJO_RESULT_SHOULD_WAIT,
-            ReadMessage(pipe0_, buffer, &buffer_size, true));
-
-  // Write from port 1 (to port 0).
-  buffer[0] = 890123456;
-  buffer[1] = 0;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WriteMessage(pipe1_, buffer, sizeof(buffer[0])));
-
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(pipe0_, MOJO_HANDLE_SIGNAL_READABLE, &state));
-
-  // Read from port 0 (buffer big enough).
-  buffer[0] = 123;
-  buffer[1] = 456;
-  buffer_size = kBufferSize;
-  ASSERT_EQ(MOJO_RESULT_OK, ReadMessage(pipe0_, buffer, &buffer_size, true));
-  ASSERT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size);
-  ASSERT_EQ(890123456, buffer[0]);
-  ASSERT_EQ(456, buffer[1]);
-
-  // Read again from port 0 -- it should be empty.
-  buffer_size = kBufferSize;
-  ASSERT_EQ(MOJO_RESULT_SHOULD_WAIT,
-            ReadMessage(pipe0_, buffer, &buffer_size, true));
-
-  // Write from port 1 (to port 0).
-  buffer[0] = 901234567;
-  buffer[1] = 0;
-  ASSERT_EQ(MOJO_RESULT_OK, WriteMessage(pipe1_, buffer, sizeof(buffer[0])));
-
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(pipe0_, MOJO_HANDLE_SIGNAL_READABLE, &state));
-
-  // Read/discard from port 0 (buffer too small); get size.
-  buffer_size = 1;
-  ASSERT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED,
-            ReadMessage(pipe0_, buffer, &buffer_size, true));
-  ASSERT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size);
-
-  // Read again from port 0 -- it should be empty.
-  buffer_size = kBufferSize;
-  ASSERT_EQ(MOJO_RESULT_SHOULD_WAIT,
-            ReadMessage(pipe0_, buffer, &buffer_size, true));
-
-  // Write from port 1 (to port 0).
-  buffer[0] = 123456789;
-  buffer[1] = 0;
-  ASSERT_EQ(MOJO_RESULT_OK, WriteMessage(pipe1_, buffer, sizeof(buffer[0])));
-
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(pipe0_, MOJO_HANDLE_SIGNAL_READABLE, &state));
-
-  // Discard from port 0.
-  buffer_size = 1;
-  ASSERT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED,
-            ReadMessage(pipe0_, nullptr, 0, true));
-
-  // Read again from port 0 -- it should be empty.
-  buffer_size = kBufferSize;
-  ASSERT_EQ(MOJO_RESULT_SHOULD_WAIT,
-            ReadMessage(pipe0_, buffer, &buffer_size, true));
-}
-
-TEST_F(MessagePipeTest, BasicWaiting) {
-  MojoHandleSignalsState hss;
-
-  int32_t buffer[1];
-  const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer));
-  uint32_t buffer_size;
-
-  // Always writable (until the other port is closed). Not yet readable. Peer
-  // not closed.
-  hss = GetSignalsState(pipe0_);
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
-  ASSERT_EQ(kAllSignals, hss.satisfiable_signals);
-  hss = MojoHandleSignalsState();
-
-  // Write from port 0 (to port 1), to make port 1 readable.
-  buffer[0] = 123456789;
-  ASSERT_EQ(MOJO_RESULT_OK, WriteMessage(pipe0_, buffer, kBufferSize));
-
-  // Port 1 should already be readable now.
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(pipe1_, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
-            hss.satisfied_signals);
-  ASSERT_EQ(kAllSignals, hss.satisfiable_signals);
-  // ... and still writable.
-  hss = MojoHandleSignalsState();
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(pipe1_, MOJO_HANDLE_SIGNAL_WRITABLE, &hss));
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
-            hss.satisfied_signals);
-  ASSERT_EQ(kAllSignals, hss.satisfiable_signals);
-
-  // Close port 0.
-  MojoClose(pipe0_);
-  pipe0_ = MOJO_HANDLE_INVALID;
-
-  // Port 1 should be signaled with peer closed.
-  hss = MojoHandleSignalsState();
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(pipe1_, MOJO_HANDLE_SIGNAL_PEER_CLOSED, &hss));
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-            hss.satisfied_signals);
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-            hss.satisfiable_signals);
-
-  // Port 1 should not be writable.
-  hss = MojoHandleSignalsState();
-
-  ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-            WaitForSignals(pipe1_, MOJO_HANDLE_SIGNAL_WRITABLE, &hss));
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-            hss.satisfied_signals);
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-            hss.satisfiable_signals);
-
-  // But it should still be readable.
-  hss = MojoHandleSignalsState();
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(pipe1_, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-            hss.satisfied_signals);
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-            hss.satisfiable_signals);
-
-  // Read from port 1.
-  buffer[0] = 0;
-  buffer_size = kBufferSize;
-  ASSERT_EQ(MOJO_RESULT_OK, ReadMessage(pipe1_, buffer, &buffer_size));
-  ASSERT_EQ(123456789, buffer[0]);
-
-  // Now port 1 should no longer be readable.
-  hss = MojoHandleSignalsState();
-  ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-            WaitForSignals(pipe1_, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals);
-  ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals);
-}
-
-TEST_F(MessagePipeTest, InvalidMessageObjects) {
-  // null message
-  ASSERT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            MojoFreeMessage(MOJO_MESSAGE_HANDLE_INVALID));
-
-  // null message
-  ASSERT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            MojoGetMessageBuffer(MOJO_MESSAGE_HANDLE_INVALID, nullptr));
-
-  // Non-zero num_handles with null handles array.
-  ASSERT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            MojoAllocMessage(0, nullptr, 1, MOJO_ALLOC_MESSAGE_FLAG_NONE,
-                             nullptr));
-}
-
-TEST_F(MessagePipeTest, AllocAndFreeMessage) {
-  const std::string kMessage = "Hello, world.";
-  MojoMessageHandle message = MOJO_MESSAGE_HANDLE_INVALID;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            MojoAllocMessage(static_cast<uint32_t>(kMessage.size()), nullptr, 0,
-                             MOJO_ALLOC_MESSAGE_FLAG_NONE, &message));
-  ASSERT_NE(MOJO_MESSAGE_HANDLE_INVALID, message);
-  ASSERT_EQ(MOJO_RESULT_OK, MojoFreeMessage(message));
-}
-
-TEST_F(MessagePipeTest, WriteAndReadMessageObject) {
-  const std::string kMessage = "Hello, world.";
-  MojoMessageHandle message = MOJO_MESSAGE_HANDLE_INVALID;
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoAllocMessage(static_cast<uint32_t>(kMessage.size()), nullptr, 0,
-                             MOJO_ALLOC_MESSAGE_FLAG_NONE, &message));
-  ASSERT_NE(MOJO_MESSAGE_HANDLE_INVALID, message);
-
-  void* buffer = nullptr;
-  EXPECT_EQ(MOJO_RESULT_OK, MojoGetMessageBuffer(message, &buffer));
-  ASSERT_TRUE(buffer);
-  memcpy(buffer, kMessage.data(), kMessage.size());
-
-  MojoHandle a, b;
-  CreateMessagePipe(&a, &b);
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoWriteMessageNew(a, message, MOJO_WRITE_MESSAGE_FLAG_NONE));
-
-  EXPECT_EQ(MOJO_RESULT_OK, WaitForSignals(b, MOJO_HANDLE_SIGNAL_READABLE));
-  uint32_t num_bytes = 0;
-  uint32_t num_handles = 0;
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoReadMessageNew(b, &message, &num_bytes, nullptr, &num_handles,
-                               MOJO_READ_MESSAGE_FLAG_NONE));
-  ASSERT_NE(MOJO_MESSAGE_HANDLE_INVALID, message);
-  EXPECT_EQ(static_cast<uint32_t>(kMessage.size()), num_bytes);
-  EXPECT_EQ(0u, num_handles);
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoGetMessageBuffer(message, &buffer));
-  ASSERT_TRUE(buffer);
-
-  EXPECT_EQ(0, strncmp(static_cast<const char*>(buffer), kMessage.data(),
-                       num_bytes));
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoFreeMessage(message));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(a));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(b));
-}
-
-#if !defined(OS_IOS)
-
-const size_t kPingPongHandlesPerIteration = 50;
-const size_t kPingPongIterations = 500;
-
-DEFINE_TEST_CLIENT_TEST_WITH_PIPE(HandlePingPong, MessagePipeTest, h) {
-  // Waits for a handle to become readable and writes it back to the sender.
-  for (size_t i = 0; i < kPingPongIterations; i++) {
-    MojoHandle handles[kPingPongHandlesPerIteration];
-    ReadMessageWithHandles(h, handles, kPingPongHandlesPerIteration);
-    WriteMessageWithHandles(h, "", handles, kPingPongHandlesPerIteration);
-  }
-
-  EXPECT_EQ(MOJO_RESULT_OK, WaitForSignals(h, MOJO_HANDLE_SIGNAL_READABLE));
-  char msg[4];
-  uint32_t num_bytes = 4;
-  EXPECT_EQ(MOJO_RESULT_OK, ReadMessage(h, msg, &num_bytes));
-}
-
-// This test is flaky: http://crbug.com/585784
-TEST_F(MessagePipeTest, DISABLED_DataPipeConsumerHandlePingPong) {
-  MojoHandle p, c[kPingPongHandlesPerIteration];
-  for (size_t i = 0; i < kPingPongHandlesPerIteration; ++i) {
-    EXPECT_EQ(MOJO_RESULT_OK, MojoCreateDataPipe(nullptr, &p, &c[i]));
-    MojoClose(p);
-  }
-
-  RUN_CHILD_ON_PIPE(HandlePingPong, h)
-    for (size_t i = 0; i < kPingPongIterations; i++) {
-      WriteMessageWithHandles(h, "", c, kPingPongHandlesPerIteration);
-      ReadMessageWithHandles(h, c, kPingPongHandlesPerIteration);
-    }
-    WriteMessage(h, "quit", 4);
-  END_CHILD()
-  for (size_t i = 0; i < kPingPongHandlesPerIteration; ++i)
-    MojoClose(c[i]);
-}
-
-// This test is flaky: http://crbug.com/585784
-TEST_F(MessagePipeTest, DISABLED_DataPipeProducerHandlePingPong) {
-  MojoHandle p[kPingPongHandlesPerIteration], c;
-  for (size_t i = 0; i < kPingPongHandlesPerIteration; ++i) {
-    EXPECT_EQ(MOJO_RESULT_OK, MojoCreateDataPipe(nullptr, &p[i], &c));
-    MojoClose(c);
-  }
-
-  RUN_CHILD_ON_PIPE(HandlePingPong, h)
-    for (size_t i = 0; i < kPingPongIterations; i++) {
-      WriteMessageWithHandles(h, "", p, kPingPongHandlesPerIteration);
-      ReadMessageWithHandles(h, p, kPingPongHandlesPerIteration);
-    }
-    WriteMessage(h, "quit", 4);
-  END_CHILD()
-  for (size_t i = 0; i < kPingPongHandlesPerIteration; ++i)
-    MojoClose(p[i]);
-}
-
-TEST_F(MessagePipeTest, SharedBufferHandlePingPong) {
-  MojoHandle buffers[kPingPongHandlesPerIteration];
-  for (size_t i = 0; i <kPingPongHandlesPerIteration; ++i)
-    EXPECT_EQ(MOJO_RESULT_OK, MojoCreateSharedBuffer(nullptr, 1, &buffers[i]));
-
-  RUN_CHILD_ON_PIPE(HandlePingPong, h)
-    for (size_t i = 0; i < kPingPongIterations; i++) {
-      WriteMessageWithHandles(h, "", buffers, kPingPongHandlesPerIteration);
-      ReadMessageWithHandles(h, buffers, kPingPongHandlesPerIteration);
-    }
-    WriteMessage(h, "quit", 4);
-  END_CHILD()
-  for (size_t i = 0; i < kPingPongHandlesPerIteration; ++i)
-    MojoClose(buffers[i]);
-}
-
-#endif  // !defined(OS_IOS)
-
-TEST_F(FuseMessagePipeTest, Basic) {
-  // Test that we can fuse pipes and they still work.
-
-  MojoHandle a, b, c, d;
-  CreateMessagePipe(&a, &b);
-  CreateMessagePipe(&c, &d);
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoFuseMessagePipes(b, c));
-
-  // Handles b and c should be closed.
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(b));
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(c));
-
-  const std::string kTestMessage1 = "Hello, world!";
-  const std::string kTestMessage2 = "Goodbye, world!";
-
-  WriteMessage(a, kTestMessage1);
-  EXPECT_EQ(kTestMessage1, ReadMessage(d));
-
-  WriteMessage(d, kTestMessage2);
-  EXPECT_EQ(kTestMessage2, ReadMessage(a));
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(a));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(d));
-}
-
-TEST_F(FuseMessagePipeTest, FuseAfterPeerWrite) {
-  // Test that messages written before fusion are eventually delivered.
-
-  MojoHandle a, b, c, d;
-  CreateMessagePipe(&a, &b);
-  CreateMessagePipe(&c, &d);
-
-  const std::string kTestMessage1 = "Hello, world!";
-  const std::string kTestMessage2 = "Goodbye, world!";
-  WriteMessage(a, kTestMessage1);
-  WriteMessage(d, kTestMessage2);
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoFuseMessagePipes(b, c));
-
-  // Handles b and c should be closed.
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(b));
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(c));
-
-  EXPECT_EQ(kTestMessage1, ReadMessage(d));
-  EXPECT_EQ(kTestMessage2, ReadMessage(a));
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(a));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(d));
-}
-
-TEST_F(FuseMessagePipeTest, NoFuseAfterWrite) {
-  // Test that a pipe endpoint which has been written to cannot be fused.
-
-  MojoHandle a, b, c, d;
-  CreateMessagePipe(&a, &b);
-  CreateMessagePipe(&c, &d);
-
-  WriteMessage(b, "shouldn't have done that!");
-  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, MojoFuseMessagePipes(b, c));
-
-  // Handles b and c should be closed.
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(b));
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(c));
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(a));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(d));
-}
-
-TEST_F(FuseMessagePipeTest, NoFuseSelf) {
-  // Test that a pipe's own endpoints can't be fused together.
-
-  MojoHandle a, b;
-  CreateMessagePipe(&a, &b);
-
-  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, MojoFuseMessagePipes(a, b));
-
-  // Handles a and b should be closed.
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(a));
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(b));
-}
-
-TEST_F(FuseMessagePipeTest, FuseInvalidArguments) {
-  MojoHandle a, b, c, d;
-  CreateMessagePipe(&a, &b);
-  CreateMessagePipe(&c, &d);
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(b));
-
-  // Can't fuse an invalid handle.
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoFuseMessagePipes(b, c));
-
-  // Handle c should be closed.
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(c));
-
-  // Can't fuse a non-message pipe handle.
-  MojoHandle e, f;
-  CreateDataPipe(&e, &f, 16);
-
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoFuseMessagePipes(e, d));
-
-  // Handles d and e should be closed.
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(d));
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(e));
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(a));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(f));
-}
-
-TEST_F(FuseMessagePipeTest, FuseAfterPeerClosure) {
-  // Test that peer closure prior to fusion can still be detected after fusion.
-
-  MojoHandle a, b, c, d;
-  CreateMessagePipe(&a, &b);
-  CreateMessagePipe(&c, &d);
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(a));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoFuseMessagePipes(b, c));
-
-  // Handles b and c should be closed.
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(b));
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(c));
-
-  EXPECT_EQ(MOJO_RESULT_OK, WaitForSignals(d, MOJO_HANDLE_SIGNAL_PEER_CLOSED));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(d));
-}
-
-TEST_F(FuseMessagePipeTest, FuseAfterPeerWriteAndClosure) {
-  // Test that peer write and closure prior to fusion still results in the
-  // both message arrival and awareness of peer closure.
-
-  MojoHandle a, b, c, d;
-  CreateMessagePipe(&a, &b);
-  CreateMessagePipe(&c, &d);
-
-  const std::string kTestMessage = "ayyy lmao";
-  WriteMessage(a, kTestMessage);
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(a));
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoFuseMessagePipes(b, c));
-
-  // Handles b and c should be closed.
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(b));
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(c));
-
-  EXPECT_EQ(kTestMessage, ReadMessage(d));
-  EXPECT_EQ(MOJO_RESULT_OK, WaitForSignals(d, MOJO_HANDLE_SIGNAL_PEER_CLOSED));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(d));
-}
-
-TEST_F(MessagePipeTest, ClosePipesStressTest) {
-  // Stress test to exercise https://crbug.com/665869.
-  const size_t kNumPipes = 100000;
-  for (size_t i = 0; i < kNumPipes; ++i) {
-    MojoHandle a, b;
-    CreateMessagePipe(&a, &b);
-    MojoClose(a);
-    MojoClose(b);
-  }
-}
-
-}  // namespace
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/multiprocess_message_pipe_unittest.cc b/mojo/edk/system/multiprocess_message_pipe_unittest.cc
deleted file mode 100644
index 37248d1..0000000
--- a/mojo/edk/system/multiprocess_message_pipe_unittest.cc
+++ /dev/null
@@ -1,1366 +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 <stddef.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <string.h>
-
-#include <string>
-#include <utility>
-#include <vector>
-
-#include "base/bind.h"
-#include "base/containers/hash_tables.h"
-#include "base/files/file_path.h"
-#include "base/files/file_util.h"
-#include "base/files/scoped_file.h"
-#include "base/files/scoped_temp_dir.h"
-#include "base/logging.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "base/strings/string_split.h"
-#include "build/build_config.h"
-#include "mojo/edk/embedder/platform_channel_pair.h"
-#include "mojo/edk/embedder/scoped_platform_handle.h"
-#include "mojo/edk/system/handle_signals_state.h"
-#include "mojo/edk/system/test_utils.h"
-#include "mojo/edk/test/mojo_test_base.h"
-#include "mojo/edk/test/test_utils.h"
-#include "mojo/public/c/system/buffer.h"
-#include "mojo/public/c/system/functions.h"
-#include "mojo/public/c/system/types.h"
-#include "mojo/public/cpp/system/simple_watcher.h"
-#include "mojo/public/cpp/system/wait.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-
-namespace mojo {
-namespace edk {
-namespace {
-
-class MultiprocessMessagePipeTest : public test::MojoTestBase {
- protected:
-  // Convenience class for tests which will control command-driven children.
-  // See the CommandDrivenClient definition below.
-  class CommandDrivenClientController {
-   public:
-    explicit CommandDrivenClientController(MojoHandle h) : h_(h) {}
-
-    void Send(const std::string& command) {
-      WriteMessage(h_, command);
-      EXPECT_EQ("ok", ReadMessage(h_));
-    }
-
-    void SendHandle(const std::string& name, MojoHandle p) {
-      WriteMessageWithHandles(h_, "take:" + name, &p, 1);
-      EXPECT_EQ("ok", ReadMessage(h_));
-    }
-
-    MojoHandle RetrieveHandle(const std::string& name) {
-      WriteMessage(h_, "return:" + name);
-      MojoHandle p;
-      EXPECT_EQ("ok", ReadMessageWithHandles(h_, &p, 1));
-      return p;
-    }
-
-    void Exit() { WriteMessage(h_, "exit"); }
-
-   private:
-    MojoHandle h_;
-  };
-};
-
-class MultiprocessMessagePipeTestWithPeerSupport
-    : public MultiprocessMessagePipeTest,
-      public testing::WithParamInterface<test::MojoTestBase::LaunchType> {
- protected:
-  void SetUp() override {
-    test::MojoTestBase::SetUp();
-    set_launch_type(GetParam());
-  }
-};
-
-// For each message received, sends a reply message with the same contents
-// repeated twice, until the other end is closed or it receives "quitquitquit"
-// (which it doesn't reply to). It'll return the number of messages received,
-// not including any "quitquitquit" message, modulo 100.
-DEFINE_TEST_CLIENT_WITH_PIPE(EchoEcho, MultiprocessMessagePipeTest, h) {
-  const std::string quitquitquit("quitquitquit");
-  int rv = 0;
-  for (;; rv = (rv + 1) % 100) {
-    // Wait for our end of the message pipe to be readable.
-    HandleSignalsState hss;
-    MojoResult result = WaitForSignals(h, MOJO_HANDLE_SIGNAL_READABLE, &hss);
-    if (result != MOJO_RESULT_OK) {
-      // It was closed, probably.
-      CHECK_EQ(result, MOJO_RESULT_FAILED_PRECONDITION);
-      CHECK_EQ(hss.satisfied_signals, MOJO_HANDLE_SIGNAL_PEER_CLOSED);
-      CHECK_EQ(hss.satisfiable_signals, MOJO_HANDLE_SIGNAL_PEER_CLOSED);
-      break;
-    } else {
-      CHECK((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE));
-      CHECK((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE));
-    }
-
-    std::string read_buffer(1000, '\0');
-    uint32_t read_buffer_size = static_cast<uint32_t>(read_buffer.size());
-    CHECK_EQ(MojoReadMessage(h, &read_buffer[0],
-                             &read_buffer_size, nullptr,
-                             0, MOJO_READ_MESSAGE_FLAG_NONE),
-             MOJO_RESULT_OK);
-    read_buffer.resize(read_buffer_size);
-    VLOG(2) << "Child got: " << read_buffer;
-
-    if (read_buffer == quitquitquit) {
-      VLOG(2) << "Child quitting.";
-      break;
-    }
-
-    std::string write_buffer = read_buffer + read_buffer;
-    CHECK_EQ(MojoWriteMessage(h, write_buffer.data(),
-                              static_cast<uint32_t>(write_buffer.size()),
-                              nullptr, 0u, MOJO_WRITE_MESSAGE_FLAG_NONE),
-             MOJO_RESULT_OK);
-  }
-
-  return rv;
-}
-
-TEST_P(MultiprocessMessagePipeTestWithPeerSupport, Basic) {
-  RUN_CHILD_ON_PIPE(EchoEcho, h)
-    std::string hello("hello");
-    ASSERT_EQ(MOJO_RESULT_OK,
-              MojoWriteMessage(h, hello.data(),
-                               static_cast<uint32_t>(hello.size()), nullptr, 0u,
-                               MOJO_WRITE_MESSAGE_FLAG_NONE));
-
-    HandleSignalsState hss;
-    ASSERT_EQ(MOJO_RESULT_OK,
-              WaitForSignals(h, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-    // The child may or may not have closed its end of the message pipe and died
-    // (and we may or may not know it yet), so our end may or may not appear as
-    // writable.
-    EXPECT_TRUE((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE));
-    EXPECT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE));
-
-    std::string read_buffer(1000, '\0');
-    uint32_t read_buffer_size = static_cast<uint32_t>(read_buffer.size());
-    CHECK_EQ(MojoReadMessage(h, &read_buffer[0],
-                             &read_buffer_size, nullptr, 0,
-                             MOJO_READ_MESSAGE_FLAG_NONE),
-             MOJO_RESULT_OK);
-    read_buffer.resize(read_buffer_size);
-    VLOG(2) << "Parent got: " << read_buffer;
-    ASSERT_EQ(hello + hello, read_buffer);
-
-    std::string quitquitquit("quitquitquit");
-    CHECK_EQ(MojoWriteMessage(h, quitquitquit.data(),
-                              static_cast<uint32_t>(quitquitquit.size()),
-                              nullptr, 0u, MOJO_WRITE_MESSAGE_FLAG_NONE),
-             MOJO_RESULT_OK);
-  END_CHILD_AND_EXPECT_EXIT_CODE(1 % 100);
-}
-
-TEST_P(MultiprocessMessagePipeTestWithPeerSupport, QueueMessages) {
-  static const size_t kNumMessages = 1001;
-  RUN_CHILD_ON_PIPE(EchoEcho, h)
-    for (size_t i = 0; i < kNumMessages; i++) {
-      std::string write_buffer(i, 'A' + (i % 26));
-      ASSERT_EQ(MOJO_RESULT_OK,
-              MojoWriteMessage(h, write_buffer.data(),
-                               static_cast<uint32_t>(write_buffer.size()),
-                               nullptr, 0u, MOJO_WRITE_MESSAGE_FLAG_NONE));
-    }
-
-    for (size_t i = 0; i < kNumMessages; i++) {
-      HandleSignalsState hss;
-      ASSERT_EQ(MOJO_RESULT_OK,
-                WaitForSignals(h, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-      // The child may or may not have closed its end of the message pipe and
-      // died (and we may or may not know it yet), so our end may or may not
-      // appear as writable.
-      ASSERT_TRUE((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE));
-      ASSERT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE));
-
-      std::string read_buffer(kNumMessages * 2, '\0');
-      uint32_t read_buffer_size = static_cast<uint32_t>(read_buffer.size());
-      ASSERT_EQ(MojoReadMessage(h, &read_buffer[0],
-                                &read_buffer_size, nullptr, 0,
-                                MOJO_READ_MESSAGE_FLAG_NONE),
-               MOJO_RESULT_OK);
-      read_buffer.resize(read_buffer_size);
-
-      ASSERT_EQ(std::string(i * 2, 'A' + (i % 26)), read_buffer);
-    }
-
-    const std::string quitquitquit("quitquitquit");
-    ASSERT_EQ(MOJO_RESULT_OK,
-              MojoWriteMessage(h, quitquitquit.data(),
-                               static_cast<uint32_t>(quitquitquit.size()),
-                               nullptr, 0u, MOJO_WRITE_MESSAGE_FLAG_NONE));
-
-    // Wait for it to become readable, which should fail (since we sent
-    // "quitquitquit").
-    HandleSignalsState hss;
-    ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-              WaitForSignals(h, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-    ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals);
-    ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals);
-  END_CHILD_AND_EXPECT_EXIT_CODE(static_cast<int>(kNumMessages % 100));
-}
-
-DEFINE_TEST_CLIENT_WITH_PIPE(CheckSharedBuffer, MultiprocessMessagePipeTest,
-                             h) {
-  // Wait for the first message from our parent.
-  HandleSignalsState hss;
-  CHECK_EQ(WaitForSignals(h, MOJO_HANDLE_SIGNAL_READABLE, &hss),
-           MOJO_RESULT_OK);
-  // In this test, the parent definitely doesn't close its end of the message
-  // pipe before we do.
-  CHECK_EQ(hss.satisfied_signals,
-           MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE);
-  CHECK_EQ(hss.satisfiable_signals, MOJO_HANDLE_SIGNAL_READABLE |
-                                    MOJO_HANDLE_SIGNAL_WRITABLE |
-                                    MOJO_HANDLE_SIGNAL_PEER_CLOSED);
-
-  // It should have a shared buffer.
-  std::string read_buffer(100, '\0');
-  uint32_t num_bytes = static_cast<uint32_t>(read_buffer.size());
-  MojoHandle handles[10];
-  uint32_t num_handlers = arraysize(handles);  // Maximum number to receive
-  CHECK_EQ(MojoReadMessage(h, &read_buffer[0],
-                           &num_bytes, &handles[0],
-                           &num_handlers, MOJO_READ_MESSAGE_FLAG_NONE),
-           MOJO_RESULT_OK);
-  read_buffer.resize(num_bytes);
-  CHECK_EQ(read_buffer, std::string("go 1"));
-  CHECK_EQ(num_handlers, 1u);
-
-  // Make a mapping.
-  void* buffer;
-  CHECK_EQ(MojoMapBuffer(handles[0], 0, 100, &buffer,
-                         MOJO_CREATE_SHARED_BUFFER_OPTIONS_FLAG_NONE),
-           MOJO_RESULT_OK);
-
-  // Write some stuff to the shared buffer.
-  static const char kHello[] = "hello";
-  memcpy(buffer, kHello, sizeof(kHello));
-
-  // We should be able to close the dispatcher now.
-  MojoClose(handles[0]);
-
-  // And send a message to signal that we've written stuff.
-  const std::string go2("go 2");
-  CHECK_EQ(MojoWriteMessage(h, go2.data(),
-                            static_cast<uint32_t>(go2.size()), nullptr, 0u,
-                            MOJO_WRITE_MESSAGE_FLAG_NONE),
-           MOJO_RESULT_OK);
-
-  // Now wait for our parent to send us a message.
-  hss = HandleSignalsState();
-  CHECK_EQ(WaitForSignals(h, MOJO_HANDLE_SIGNAL_READABLE, &hss),
-           MOJO_RESULT_OK);
-  CHECK_EQ(hss.satisfied_signals,
-           MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE);
-  CHECK_EQ(hss.satisfiable_signals, MOJO_HANDLE_SIGNAL_READABLE |
-                                        MOJO_HANDLE_SIGNAL_WRITABLE |
-                                        MOJO_HANDLE_SIGNAL_PEER_CLOSED);
-
-  read_buffer = std::string(100, '\0');
-  num_bytes = static_cast<uint32_t>(read_buffer.size());
-  CHECK_EQ(MojoReadMessage(h, &read_buffer[0], &num_bytes,
-                           nullptr, 0, MOJO_READ_MESSAGE_FLAG_NONE),
-           MOJO_RESULT_OK);
-  read_buffer.resize(num_bytes);
-  CHECK_EQ(read_buffer, std::string("go 3"));
-
-  // It should have written something to the shared buffer.
-  static const char kWorld[] = "world!!!";
-  CHECK_EQ(memcmp(buffer, kWorld, sizeof(kWorld)), 0);
-
-  // And we're done.
-
-  return 0;
-}
-
-TEST_F(MultiprocessMessagePipeTest, SharedBufferPassing) {
-  RUN_CHILD_ON_PIPE(CheckSharedBuffer, h)
-    // Make a shared buffer.
-    MojoCreateSharedBufferOptions options;
-    options.struct_size = sizeof(options);
-    options.flags = MOJO_CREATE_SHARED_BUFFER_OPTIONS_FLAG_NONE;
-
-    MojoHandle shared_buffer;
-    ASSERT_EQ(MOJO_RESULT_OK,
-              MojoCreateSharedBuffer(&options, 100, &shared_buffer));
-
-    // Send the shared buffer.
-    const std::string go1("go 1");
-
-    MojoHandle duplicated_shared_buffer;
-    ASSERT_EQ(MOJO_RESULT_OK,
-              MojoDuplicateBufferHandle(
-                  shared_buffer,
-                  nullptr,
-                  &duplicated_shared_buffer));
-    MojoHandle handles[1];
-    handles[0] = duplicated_shared_buffer;
-    ASSERT_EQ(MOJO_RESULT_OK,
-              MojoWriteMessage(h, &go1[0],
-                               static_cast<uint32_t>(go1.size()), &handles[0],
-                               arraysize(handles),
-                               MOJO_WRITE_MESSAGE_FLAG_NONE));
-
-    // Wait for a message from the child.
-    HandleSignalsState hss;
-    ASSERT_EQ(MOJO_RESULT_OK,
-              WaitForSignals(h, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-    EXPECT_TRUE((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE));
-    EXPECT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE));
-
-    std::string read_buffer(100, '\0');
-    uint32_t num_bytes = static_cast<uint32_t>(read_buffer.size());
-    ASSERT_EQ(MOJO_RESULT_OK,
-              MojoReadMessage(h, &read_buffer[0],
-                              &num_bytes, nullptr, 0,
-                              MOJO_READ_MESSAGE_FLAG_NONE));
-    read_buffer.resize(num_bytes);
-    ASSERT_EQ(std::string("go 2"), read_buffer);
-
-    // After we get it, the child should have written something to the shared
-    // buffer.
-    static const char kHello[] = "hello";
-    void* buffer;
-    CHECK_EQ(MojoMapBuffer(shared_buffer, 0, 100, &buffer,
-                           MOJO_CREATE_SHARED_BUFFER_OPTIONS_FLAG_NONE),
-             MOJO_RESULT_OK);
-    ASSERT_EQ(0, memcmp(buffer, kHello, sizeof(kHello)));
-
-    // Now we'll write some stuff to the shared buffer.
-    static const char kWorld[] = "world!!!";
-    memcpy(buffer, kWorld, sizeof(kWorld));
-
-    // And send a message to signal that we've written stuff.
-    const std::string go3("go 3");
-    ASSERT_EQ(MOJO_RESULT_OK,
-              MojoWriteMessage(h, &go3[0],
-                               static_cast<uint32_t>(go3.size()), nullptr, 0u,
-                               MOJO_WRITE_MESSAGE_FLAG_NONE));
-
-    // Wait for |h| to become readable, which should fail.
-    hss = HandleSignalsState();
-    ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-              WaitForSignals(h, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-    ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals);
-    ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals);
-  END_CHILD()
-}
-
-DEFINE_TEST_CLIENT_WITH_PIPE(CheckPlatformHandleFile,
-                             MultiprocessMessagePipeTest, h) {
-  HandleSignalsState hss;
-  CHECK_EQ(WaitForSignals(h, MOJO_HANDLE_SIGNAL_READABLE, &hss),
-           MOJO_RESULT_OK);
-  CHECK_EQ(hss.satisfied_signals,
-           MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE);
-  CHECK_EQ(hss.satisfiable_signals, MOJO_HANDLE_SIGNAL_READABLE |
-                                        MOJO_HANDLE_SIGNAL_WRITABLE |
-                                        MOJO_HANDLE_SIGNAL_PEER_CLOSED);
-
-  std::string read_buffer(100, '\0');
-  uint32_t num_bytes = static_cast<uint32_t>(read_buffer.size());
-  MojoHandle handles[255];  // Maximum number to receive.
-  uint32_t num_handlers = arraysize(handles);
-
-  CHECK_EQ(MojoReadMessage(h, &read_buffer[0],
-                           &num_bytes, &handles[0],
-                           &num_handlers, MOJO_READ_MESSAGE_FLAG_NONE),
-           MOJO_RESULT_OK);
-
-  read_buffer.resize(num_bytes);
-  char hello[32];
-  int num_handles = 0;
-  sscanf(read_buffer.c_str(), "%s %d", hello, &num_handles);
-  CHECK_EQ(std::string("hello"), std::string(hello));
-  CHECK_GT(num_handles, 0);
-
-  for (int i = 0; i < num_handles; ++i) {
-    ScopedPlatformHandle h;
-    CHECK_EQ(PassWrappedPlatformHandle(handles[i], &h), MOJO_RESULT_OK);
-    CHECK(h.is_valid());
-    MojoClose(handles[i]);
-
-    base::ScopedFILE fp(test::FILEFromPlatformHandle(std::move(h), "r"));
-    CHECK(fp);
-    std::string fread_buffer(100, '\0');
-    size_t bytes_read =
-        fread(&fread_buffer[0], 1, fread_buffer.size(), fp.get());
-    fread_buffer.resize(bytes_read);
-    CHECK_EQ(fread_buffer, "world");
-  }
-
-  return 0;
-}
-
-class MultiprocessMessagePipeTestWithPipeCount
-    : public MultiprocessMessagePipeTest,
-      public testing::WithParamInterface<size_t> {};
-
-TEST_P(MultiprocessMessagePipeTestWithPipeCount, PlatformHandlePassing) {
-  base::ScopedTempDir temp_dir;
-  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-
-  RUN_CHILD_ON_PIPE(CheckPlatformHandleFile, h)
-    std::vector<MojoHandle> handles;
-
-    size_t pipe_count = GetParam();
-    for (size_t i = 0; i < pipe_count; ++i) {
-      base::FilePath unused;
-      base::ScopedFILE fp(
-          CreateAndOpenTemporaryFileInDir(temp_dir.GetPath(), &unused));
-      const std::string world("world");
-      CHECK_EQ(fwrite(&world[0], 1, world.size(), fp.get()), world.size());
-      fflush(fp.get());
-      rewind(fp.get());
-      MojoHandle handle;
-      ASSERT_EQ(
-          CreatePlatformHandleWrapper(
-              ScopedPlatformHandle(test::PlatformHandleFromFILE(std::move(fp))),
-              &handle),
-          MOJO_RESULT_OK);
-      handles.push_back(handle);
-    }
-
-    char message[128];
-    snprintf(message, sizeof(message), "hello %d",
-             static_cast<int>(pipe_count));
-    ASSERT_EQ(MOJO_RESULT_OK,
-              MojoWriteMessage(h, message,
-                               static_cast<uint32_t>(strlen(message)),
-                               &handles[0],
-                               static_cast<uint32_t>(handles.size()),
-                               MOJO_WRITE_MESSAGE_FLAG_NONE));
-
-    // Wait for it to become readable, which should fail.
-    HandleSignalsState hss;
-    ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-              WaitForSignals(h, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-    ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals);
-    ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals);
-  END_CHILD()
-}
-
-// Android multi-process tests are not executing the new process. This is flaky.
-#if !defined(OS_ANDROID)
-INSTANTIATE_TEST_CASE_P(PipeCount,
-                        MultiprocessMessagePipeTestWithPipeCount,
-                        // TODO(rockot): Re-enable the 140-pipe case when
-                        // ChannelPosix has support for sending lots of handles.
-                        testing::Values(1u, 128u /*, 140u*/));
-#endif
-
-DEFINE_TEST_CLIENT_WITH_PIPE(CheckMessagePipe, MultiprocessMessagePipeTest, h) {
-  // Wait for the first message from our parent.
-  HandleSignalsState hss;
-  CHECK_EQ(WaitForSignals(h, MOJO_HANDLE_SIGNAL_READABLE, &hss),
-           MOJO_RESULT_OK);
-  // In this test, the parent definitely doesn't close its end of the message
-  // pipe before we do.
-  CHECK_EQ(hss.satisfied_signals,
-           MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE);
-  CHECK_EQ(hss.satisfiable_signals, MOJO_HANDLE_SIGNAL_READABLE |
-                                    MOJO_HANDLE_SIGNAL_WRITABLE |
-                                    MOJO_HANDLE_SIGNAL_PEER_CLOSED);
-
-  // It should have a message pipe.
-  MojoHandle handles[10];
-  uint32_t num_handlers = arraysize(handles);
-  CHECK_EQ(MojoReadMessage(h, nullptr,
-                           nullptr, &handles[0],
-                           &num_handlers, MOJO_READ_MESSAGE_FLAG_NONE),
-           MOJO_RESULT_OK);
-  CHECK_EQ(num_handlers, 1u);
-
-  // Read data from the received message pipe.
-  CHECK_EQ(WaitForSignals(handles[0], MOJO_HANDLE_SIGNAL_READABLE, &hss),
-           MOJO_RESULT_OK);
-  CHECK_EQ(hss.satisfied_signals,
-           MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE);
-  CHECK_EQ(hss.satisfiable_signals, MOJO_HANDLE_SIGNAL_READABLE |
-                                    MOJO_HANDLE_SIGNAL_WRITABLE |
-                                    MOJO_HANDLE_SIGNAL_PEER_CLOSED);
-
-  std::string read_buffer(100, '\0');
-  uint32_t read_buffer_size = static_cast<uint32_t>(read_buffer.size());
-  CHECK_EQ(MojoReadMessage(handles[0], &read_buffer[0],
-                           &read_buffer_size, nullptr,
-                           0, MOJO_READ_MESSAGE_FLAG_NONE),
-           MOJO_RESULT_OK);
-  read_buffer.resize(read_buffer_size);
-  CHECK_EQ(read_buffer, std::string("hello"));
-
-  // Now write some data into the message pipe.
-  std::string write_buffer = "world";
-  CHECK_EQ(MojoWriteMessage(handles[0], write_buffer.data(),
-                            static_cast<uint32_t>(write_buffer.size()), nullptr,
-                            0u, MOJO_WRITE_MESSAGE_FLAG_NONE),
-           MOJO_RESULT_OK);
-  MojoClose(handles[0]);
-  return 0;
-}
-
-TEST_P(MultiprocessMessagePipeTestWithPeerSupport, MessagePipePassing) {
-  RUN_CHILD_ON_PIPE(CheckMessagePipe, h)
-    MojoCreateSharedBufferOptions options;
-    options.struct_size = sizeof(options);
-    options.flags = MOJO_CREATE_SHARED_BUFFER_OPTIONS_FLAG_NONE;
-
-    MojoHandle mp1, mp2;
-    ASSERT_EQ(MOJO_RESULT_OK,
-              MojoCreateMessagePipe(nullptr, &mp1, &mp2));
-
-    // Write a string into one end of the new message pipe and send the other
-    // end.
-    const std::string hello("hello");
-    ASSERT_EQ(MOJO_RESULT_OK,
-              MojoWriteMessage(mp1, &hello[0],
-                               static_cast<uint32_t>(hello.size()), nullptr, 0,
-                               MOJO_WRITE_MESSAGE_FLAG_NONE));
-    ASSERT_EQ(MOJO_RESULT_OK,
-              MojoWriteMessage(h, nullptr, 0, &mp2, 1,
-                               MOJO_WRITE_MESSAGE_FLAG_NONE));
-
-    // Wait for a message from the child.
-    HandleSignalsState hss;
-    ASSERT_EQ(MOJO_RESULT_OK,
-              WaitForSignals(mp1, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-    EXPECT_TRUE((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE));
-    EXPECT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE));
-
-    std::string read_buffer(100, '\0');
-    uint32_t read_buffer_size = static_cast<uint32_t>(read_buffer.size());
-    CHECK_EQ(MojoReadMessage(mp1, &read_buffer[0],
-                             &read_buffer_size, nullptr,
-                             0, MOJO_READ_MESSAGE_FLAG_NONE),
-             MOJO_RESULT_OK);
-    read_buffer.resize(read_buffer_size);
-    CHECK_EQ(read_buffer, std::string("world"));
-
-    MojoClose(mp1);
-  END_CHILD()
-}
-
-TEST_P(MultiprocessMessagePipeTestWithPeerSupport, MessagePipeTwoPassing) {
-  RUN_CHILD_ON_PIPE(CheckMessagePipe, h)
-    MojoHandle mp1, mp2;
-    ASSERT_EQ(MOJO_RESULT_OK,
-              MojoCreateMessagePipe(nullptr, &mp2, &mp1));
-
-    // Write a string into one end of the new message pipe and send the other
-    // end.
-    const std::string hello("hello");
-    ASSERT_EQ(MOJO_RESULT_OK,
-              MojoWriteMessage(mp1, &hello[0],
-                               static_cast<uint32_t>(hello.size()), nullptr, 0u,
-                               MOJO_WRITE_MESSAGE_FLAG_NONE));
-    ASSERT_EQ(MOJO_RESULT_OK,
-              MojoWriteMessage(h, nullptr, 0u, &mp2, 1u,
-                               MOJO_WRITE_MESSAGE_FLAG_NONE));
-
-    // Wait for a message from the child.
-    HandleSignalsState hss;
-    ASSERT_EQ(MOJO_RESULT_OK,
-              WaitForSignals(mp1, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-    EXPECT_TRUE((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE));
-    EXPECT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE));
-
-    std::string read_buffer(100, '\0');
-    uint32_t read_buffer_size = static_cast<uint32_t>(read_buffer.size());
-    CHECK_EQ(MojoReadMessage(mp1, &read_buffer[0],
-                             &read_buffer_size, nullptr,
-                             0, MOJO_READ_MESSAGE_FLAG_NONE),
-             MOJO_RESULT_OK);
-    read_buffer.resize(read_buffer_size);
-    CHECK_EQ(read_buffer, std::string("world"));
-  END_CHILD();
-}
-
-DEFINE_TEST_CLIENT_WITH_PIPE(DataPipeConsumer, MultiprocessMessagePipeTest, h) {
-  // Wait for the first message from our parent.
-  HandleSignalsState hss;
-  CHECK_EQ(WaitForSignals(h, MOJO_HANDLE_SIGNAL_READABLE, &hss),
-           MOJO_RESULT_OK);
-  // In this test, the parent definitely doesn't close its end of the message
-  // pipe before we do.
-  CHECK_EQ(hss.satisfied_signals,
-           MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE);
-  CHECK_EQ(hss.satisfiable_signals, MOJO_HANDLE_SIGNAL_READABLE |
-                                    MOJO_HANDLE_SIGNAL_WRITABLE |
-                                    MOJO_HANDLE_SIGNAL_PEER_CLOSED);
-
-  // It should have a message pipe.
-  MojoHandle handles[10];
-  uint32_t num_handlers = arraysize(handles);
-  CHECK_EQ(MojoReadMessage(h, nullptr,
-                           nullptr, &handles[0],
-                           &num_handlers, MOJO_READ_MESSAGE_FLAG_NONE),
-           MOJO_RESULT_OK);
-  CHECK_EQ(num_handlers, 1u);
-
-  // Read data from the received message pipe.
-  CHECK_EQ(WaitForSignals(handles[0], MOJO_HANDLE_SIGNAL_READABLE, &hss),
-           MOJO_RESULT_OK);
-  CHECK_EQ(hss.satisfied_signals,
-           MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE);
-  CHECK_EQ(hss.satisfiable_signals, MOJO_HANDLE_SIGNAL_READABLE |
-                                    MOJO_HANDLE_SIGNAL_WRITABLE |
-                                    MOJO_HANDLE_SIGNAL_PEER_CLOSED);
-
-  std::string read_buffer(100, '\0');
-  uint32_t read_buffer_size = static_cast<uint32_t>(read_buffer.size());
-  CHECK_EQ(MojoReadMessage(handles[0], &read_buffer[0],
-                           &read_buffer_size, nullptr,
-                           0, MOJO_READ_MESSAGE_FLAG_NONE),
-           MOJO_RESULT_OK);
-  read_buffer.resize(read_buffer_size);
-  CHECK_EQ(read_buffer, std::string("hello"));
-
-  // Now write some data into the message pipe.
-  std::string write_buffer = "world";
-  CHECK_EQ(MojoWriteMessage(handles[0], write_buffer.data(),
-                            static_cast<uint32_t>(write_buffer.size()),
-                            nullptr, 0u, MOJO_WRITE_MESSAGE_FLAG_NONE),
-            MOJO_RESULT_OK);
-  MojoClose(handles[0]);
-  return 0;
-}
-
-TEST_F(MultiprocessMessagePipeTest, DataPipeConsumer) {
-  RUN_CHILD_ON_PIPE(DataPipeConsumer, h)
-    MojoCreateSharedBufferOptions options;
-    options.struct_size = sizeof(options);
-    options.flags = MOJO_CREATE_SHARED_BUFFER_OPTIONS_FLAG_NONE;
-
-    MojoHandle mp1, mp2;
-    ASSERT_EQ(MOJO_RESULT_OK,
-              MojoCreateMessagePipe(nullptr, &mp2, &mp1));
-
-    // Write a string into one end of the new message pipe and send the other
-    // end.
-    const std::string hello("hello");
-    ASSERT_EQ(MOJO_RESULT_OK,
-              MojoWriteMessage(mp1, &hello[0],
-                               static_cast<uint32_t>(hello.size()), nullptr, 0u,
-                               MOJO_WRITE_MESSAGE_FLAG_NONE));
-    ASSERT_EQ(MOJO_RESULT_OK,
-              MojoWriteMessage(h, nullptr, 0, &mp2, 1u,
-                               MOJO_WRITE_MESSAGE_FLAG_NONE));
-
-    // Wait for a message from the child.
-    HandleSignalsState hss;
-    ASSERT_EQ(MOJO_RESULT_OK,
-              WaitForSignals(mp1, MOJO_HANDLE_SIGNAL_READABLE, &hss));
-    EXPECT_TRUE((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE));
-    EXPECT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE));
-
-    std::string read_buffer(100, '\0');
-    uint32_t read_buffer_size = static_cast<uint32_t>(read_buffer.size());
-    CHECK_EQ(MojoReadMessage(mp1, &read_buffer[0],
-                             &read_buffer_size, nullptr,
-                             0, MOJO_READ_MESSAGE_FLAG_NONE),
-             MOJO_RESULT_OK);
-    read_buffer.resize(read_buffer_size);
-    CHECK_EQ(read_buffer, std::string("world"));
-
-    MojoClose(mp1);
-  END_CHILD();
-}
-
-TEST_P(MultiprocessMessagePipeTestWithPeerSupport, CreateMessagePipe) {
-  MojoHandle p0, p1;
-  CreateMessagePipe(&p0, &p1);
-  VerifyTransmission(p0, p1, std::string(10 * 1024 * 1024, 'a'));
-  VerifyTransmission(p1, p0, std::string(10 * 1024 * 1024, 'e'));
-
-  CloseHandle(p0);
-  CloseHandle(p1);
-}
-
-TEST_P(MultiprocessMessagePipeTestWithPeerSupport, PassMessagePipeLocal) {
-  MojoHandle p0, p1;
-  CreateMessagePipe(&p0, &p1);
-  VerifyTransmission(p0, p1, "testing testing");
-  VerifyTransmission(p1, p0, "one two three");
-
-  MojoHandle p2, p3;
-
-  CreateMessagePipe(&p2, &p3);
-  VerifyTransmission(p2, p3, "testing testing");
-  VerifyTransmission(p3, p2, "one two three");
-
-  // Pass p2 over p0 to p1.
-  const std::string message = "ceci n'est pas une pipe";
-  WriteMessageWithHandles(p0, message, &p2, 1);
-  EXPECT_EQ(message, ReadMessageWithHandles(p1, &p2, 1));
-
-  CloseHandle(p0);
-  CloseHandle(p1);
-
-  // Verify that the received handle (now in p2) still works.
-  VerifyTransmission(p2, p3, "Easy come, easy go; will you let me go?");
-  VerifyTransmission(p3, p2, "Bismillah! NO! We will not let you go!");
-
-  CloseHandle(p2);
-  CloseHandle(p3);
-}
-
-// Echos the primordial channel until "exit".
-DEFINE_TEST_CLIENT_WITH_PIPE(ChannelEchoClient, MultiprocessMessagePipeTest,
-                             h) {
-  for (;;) {
-    std::string message = ReadMessage(h);
-    if (message == "exit")
-      break;
-    WriteMessage(h, message);
-  }
-  return 0;
-}
-
-TEST_P(MultiprocessMessagePipeTestWithPeerSupport, MultiprocessChannelPipe) {
-  RUN_CHILD_ON_PIPE(ChannelEchoClient, h)
-    VerifyEcho(h, "in an interstellar burst");
-    VerifyEcho(h, "i am back to save the universe");
-    VerifyEcho(h, std::string(10 * 1024 * 1024, 'o'));
-
-    WriteMessage(h, "exit");
-  END_CHILD()
-}
-
-// Receives a pipe handle from the primordial channel and echos on it until
-// "exit". Used to test simple pipe transfer across processes via channels.
-DEFINE_TEST_CLIENT_WITH_PIPE(EchoServiceClient, MultiprocessMessagePipeTest,
-                             h) {
-  MojoHandle p;
-  ReadMessageWithHandles(h, &p, 1);
-  for (;;) {
-    std::string message = ReadMessage(p);
-    if (message == "exit")
-      break;
-    WriteMessage(p, message);
-  }
-  return 0;
-}
-
-TEST_P(MultiprocessMessagePipeTestWithPeerSupport,
-       PassMessagePipeCrossProcess) {
-  MojoHandle p0, p1;
-  CreateMessagePipe(&p0, &p1);
-  RUN_CHILD_ON_PIPE(EchoServiceClient, h)
-
-    // Pass one end of the pipe to the other process.
-    WriteMessageWithHandles(h, "here take this", &p1, 1);
-
-    VerifyEcho(p0, "and you may ask yourself");
-    VerifyEcho(p0, "where does that highway go?");
-    VerifyEcho(p0, std::string(20 * 1024 * 1024, 'i'));
-
-    WriteMessage(p0, "exit");
-  END_CHILD()
-  CloseHandle(p0);
-}
-
-// Receives a pipe handle from the primordial channel and reads new handles
-// from it. Each read handle establishes a new echo channel.
-DEFINE_TEST_CLIENT_WITH_PIPE(EchoServiceFactoryClient,
-                             MultiprocessMessagePipeTest, h) {
-  MojoHandle p;
-  ReadMessageWithHandles(h, &p, 1);
-
-  std::vector<Handle> handles(2);
-  handles[0] = Handle(h);
-  handles[1] = Handle(p);
-  std::vector<MojoHandleSignals> signals(2, MOJO_HANDLE_SIGNAL_READABLE);
-  for (;;) {
-    size_t index;
-    CHECK_EQ(
-        mojo::WaitMany(handles.data(), signals.data(), handles.size(), &index),
-        MOJO_RESULT_OK);
-    DCHECK_LE(index, handles.size());
-    if (index == 0) {
-      // If data is available on the first pipe, it should be an exit command.
-      EXPECT_EQ(std::string("exit"), ReadMessage(h));
-      break;
-    } else if (index == 1) {
-      // If the second pipe, it should be a new handle requesting echo service.
-      MojoHandle echo_request;
-      ReadMessageWithHandles(p, &echo_request, 1);
-      handles.push_back(Handle(echo_request));
-      signals.push_back(MOJO_HANDLE_SIGNAL_READABLE);
-    } else {
-      // Otherwise it was one of our established echo pipes. Echo!
-      WriteMessage(handles[index].value(), ReadMessage(handles[index].value()));
-    }
-  }
-
-  for (size_t i = 1; i < handles.size(); ++i)
-    CloseHandle(handles[i].value());
-
-  return 0;
-}
-
-TEST_P(MultiprocessMessagePipeTestWithPeerSupport,
-       PassMoarMessagePipesCrossProcess) {
-  MojoHandle echo_factory_proxy, echo_factory_request;
-  CreateMessagePipe(&echo_factory_proxy, &echo_factory_request);
-
-  MojoHandle echo_proxy_a, echo_request_a;
-  CreateMessagePipe(&echo_proxy_a, &echo_request_a);
-
-  MojoHandle echo_proxy_b, echo_request_b;
-  CreateMessagePipe(&echo_proxy_b, &echo_request_b);
-
-  MojoHandle echo_proxy_c, echo_request_c;
-  CreateMessagePipe(&echo_proxy_c, &echo_request_c);
-
-  RUN_CHILD_ON_PIPE(EchoServiceFactoryClient, h)
-    WriteMessageWithHandles(
-        h, "gief factory naow plz", &echo_factory_request, 1);
-
-    WriteMessageWithHandles(echo_factory_proxy, "give me an echo service plz!",
-                           &echo_request_a, 1);
-    WriteMessageWithHandles(echo_factory_proxy, "give me one too!",
-                           &echo_request_b, 1);
-
-    VerifyEcho(echo_proxy_a, "i came here for an argument");
-    VerifyEcho(echo_proxy_a, "shut your festering gob");
-    VerifyEcho(echo_proxy_a, "mumble mumble mumble");
-
-    VerifyEcho(echo_proxy_b, "wubalubadubdub");
-    VerifyEcho(echo_proxy_b, "wubalubadubdub");
-
-    WriteMessageWithHandles(echo_factory_proxy, "hook me up also thanks",
-                           &echo_request_c, 1);
-
-    VerifyEcho(echo_proxy_a, "the frobinators taste like frobinators");
-    VerifyEcho(echo_proxy_b, "beep bop boop");
-    VerifyEcho(echo_proxy_c, "zzzzzzzzzzzzzzzzzzzzzzzzzz");
-
-    WriteMessage(h, "exit");
-  END_CHILD()
-
-  CloseHandle(echo_factory_proxy);
-  CloseHandle(echo_proxy_a);
-  CloseHandle(echo_proxy_b);
-  CloseHandle(echo_proxy_c);
-}
-
-TEST_P(MultiprocessMessagePipeTestWithPeerSupport,
-       ChannelPipesWithMultipleChildren) {
-  RUN_CHILD_ON_PIPE(ChannelEchoClient, a)
-    RUN_CHILD_ON_PIPE(ChannelEchoClient, b)
-      VerifyEcho(a, "hello child 0");
-      VerifyEcho(b, "hello child 1");
-
-      WriteMessage(a, "exit");
-      WriteMessage(b, "exit");
-    END_CHILD()
-  END_CHILD()
-}
-
-// Reads and turns a pipe handle some number of times to create lots of
-// transient proxies.
-DEFINE_TEST_CLIENT_TEST_WITH_PIPE(PingPongPipeClient,
-                                  MultiprocessMessagePipeTest, h) {
-  const size_t kNumBounces = 50;
-  MojoHandle p0, p1;
-  ReadMessageWithHandles(h, &p0, 1);
-  ReadMessageWithHandles(h, &p1, 1);
-  for (size_t i = 0; i < kNumBounces; ++i) {
-    WriteMessageWithHandles(h, "", &p1, 1);
-    ReadMessageWithHandles(h, &p1, 1);
-  }
-  WriteMessageWithHandles(h, "", &p0, 1);
-  WriteMessage(p1, "bye");
-  MojoClose(p1);
-  EXPECT_EQ("quit", ReadMessage(h));
-}
-
-TEST_P(MultiprocessMessagePipeTestWithPeerSupport, PingPongPipe) {
-  MojoHandle p0, p1;
-  CreateMessagePipe(&p0, &p1);
-
-  RUN_CHILD_ON_PIPE(PingPongPipeClient, h)
-    const size_t kNumBounces = 50;
-    WriteMessageWithHandles(h, "", &p0, 1);
-    WriteMessageWithHandles(h, "", &p1, 1);
-    for (size_t i = 0; i < kNumBounces; ++i) {
-      ReadMessageWithHandles(h, &p1, 1);
-      WriteMessageWithHandles(h, "", &p1, 1);
-    }
-    ReadMessageWithHandles(h, &p0, 1);
-    WriteMessage(h, "quit");
-  END_CHILD()
-
-  EXPECT_EQ("bye", ReadMessage(p0));
-
-  // We should still be able to observe peer closure from the other end.
-  EXPECT_EQ(MOJO_RESULT_OK, WaitForSignals(p0, MOJO_HANDLE_SIGNAL_PEER_CLOSED));
-}
-
-// Parses commands from the parent pipe and does whatever it's asked to do.
-DEFINE_TEST_CLIENT_WITH_PIPE(CommandDrivenClient, MultiprocessMessagePipeTest,
-                             h) {
-  base::hash_map<std::string, MojoHandle> named_pipes;
-  for (;;) {
-    MojoHandle p;
-    auto parts = base::SplitString(ReadMessageWithOptionalHandle(h, &p), ":",
-                                   base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL);
-    CHECK(!parts.empty());
-    std::string command = parts[0];
-    if (command == "take") {
-      // Take a pipe.
-      CHECK_EQ(parts.size(), 2u);
-      CHECK_NE(p, MOJO_HANDLE_INVALID);
-      named_pipes[parts[1]] = p;
-      WriteMessage(h, "ok");
-    } else if (command == "return") {
-      // Return a pipe.
-      CHECK_EQ(parts.size(), 2u);
-      CHECK_EQ(p, MOJO_HANDLE_INVALID);
-      p = named_pipes[parts[1]];
-      CHECK_NE(p, MOJO_HANDLE_INVALID);
-      named_pipes.erase(parts[1]);
-      WriteMessageWithHandles(h, "ok", &p, 1);
-    } else if (command == "say") {
-      // Say something to a named pipe.
-      CHECK_EQ(parts.size(), 3u);
-      CHECK_EQ(p, MOJO_HANDLE_INVALID);
-      p = named_pipes[parts[1]];
-      CHECK_NE(p, MOJO_HANDLE_INVALID);
-      CHECK(!parts[2].empty());
-      WriteMessage(p, parts[2]);
-      WriteMessage(h, "ok");
-    } else if (command == "hear") {
-      // Expect to read something from a named pipe.
-      CHECK_EQ(parts.size(), 3u);
-      CHECK_EQ(p, MOJO_HANDLE_INVALID);
-      p = named_pipes[parts[1]];
-      CHECK_NE(p, MOJO_HANDLE_INVALID);
-      CHECK(!parts[2].empty());
-      CHECK_EQ(parts[2], ReadMessage(p));
-      WriteMessage(h, "ok");
-    } else if (command == "pass") {
-      // Pass one named pipe over another named pipe.
-      CHECK_EQ(parts.size(), 3u);
-      CHECK_EQ(p, MOJO_HANDLE_INVALID);
-      p = named_pipes[parts[1]];
-      MojoHandle carrier = named_pipes[parts[2]];
-      CHECK_NE(p, MOJO_HANDLE_INVALID);
-      CHECK_NE(carrier, MOJO_HANDLE_INVALID);
-      named_pipes.erase(parts[1]);
-      WriteMessageWithHandles(carrier, "got a pipe for ya", &p, 1);
-      WriteMessage(h, "ok");
-    } else if (command == "catch") {
-      // Expect to receive one named pipe from another named pipe.
-      CHECK_EQ(parts.size(), 3u);
-      CHECK_EQ(p, MOJO_HANDLE_INVALID);
-      MojoHandle carrier = named_pipes[parts[2]];
-      CHECK_NE(carrier, MOJO_HANDLE_INVALID);
-      ReadMessageWithHandles(carrier, &p, 1);
-      CHECK_NE(p, MOJO_HANDLE_INVALID);
-      named_pipes[parts[1]] = p;
-      WriteMessage(h, "ok");
-    } else if (command == "exit") {
-      CHECK_EQ(parts.size(), 1u);
-      break;
-    }
-  }
-
-  for (auto& pipe : named_pipes)
-    CloseHandle(pipe.second);
-
-  return 0;
-}
-
-TEST_F(MultiprocessMessagePipeTest, ChildToChildPipes) {
-  RUN_CHILD_ON_PIPE(CommandDrivenClient, h0)
-    RUN_CHILD_ON_PIPE(CommandDrivenClient, h1)
-      CommandDrivenClientController a(h0);
-      CommandDrivenClientController b(h1);
-
-      // Create a pipe and pass each end to a different client.
-      MojoHandle p0, p1;
-      CreateMessagePipe(&p0, &p1);
-      a.SendHandle("x", p0);
-      b.SendHandle("y", p1);
-
-      // Make sure they can talk.
-      a.Send("say:x:hello");
-      b.Send("hear:y:hello");
-
-      b.Send("say:y:i love multiprocess pipes!");
-      a.Send("hear:x:i love multiprocess pipes!");
-
-      a.Exit();
-      b.Exit();
-    END_CHILD()
-  END_CHILD()
-}
-
-TEST_F(MultiprocessMessagePipeTest, MoreChildToChildPipes) {
-  RUN_CHILD_ON_PIPE(CommandDrivenClient, h0)
-    RUN_CHILD_ON_PIPE(CommandDrivenClient, h1)
-      RUN_CHILD_ON_PIPE(CommandDrivenClient, h2)
-        RUN_CHILD_ON_PIPE(CommandDrivenClient, h3)
-          CommandDrivenClientController a(h0), b(h1), c(h2), d(h3);
-
-          // Connect a to b and c to d
-
-          MojoHandle p0, p1;
-
-          CreateMessagePipe(&p0, &p1);
-          a.SendHandle("b_pipe", p0);
-          b.SendHandle("a_pipe", p1);
-
-          MojoHandle p2, p3;
-
-          CreateMessagePipe(&p2, &p3);
-          c.SendHandle("d_pipe", p2);
-          d.SendHandle("c_pipe", p3);
-
-          // Connect b to c via a and d
-          MojoHandle p4, p5;
-          CreateMessagePipe(&p4, &p5);
-          a.SendHandle("d_pipe", p4);
-          d.SendHandle("a_pipe", p5);
-
-          // Have |a| pass its new |d|-pipe to |b|. It will eventually connect
-          // to |c|.
-          a.Send("pass:d_pipe:b_pipe");
-          b.Send("catch:c_pipe:a_pipe");
-
-          // Have |d| pass its new |a|-pipe to |c|. It will now be connected to
-          // |b|.
-          d.Send("pass:a_pipe:c_pipe");
-          c.Send("catch:b_pipe:d_pipe");
-
-          // Make sure b and c and talk.
-          b.Send("say:c_pipe:it's a beautiful day");
-          c.Send("hear:b_pipe:it's a beautiful day");
-
-          // Create x and y and have b and c exchange them.
-          MojoHandle x, y;
-          CreateMessagePipe(&x, &y);
-          b.SendHandle("x", x);
-          c.SendHandle("y", y);
-          b.Send("pass:x:c_pipe");
-          c.Send("pass:y:b_pipe");
-          b.Send("catch:y:c_pipe");
-          c.Send("catch:x:b_pipe");
-
-          // Make sure the pipe still works in both directions.
-          b.Send("say:y:hello");
-          c.Send("hear:x:hello");
-          c.Send("say:x:goodbye");
-          b.Send("hear:y:goodbye");
-
-          // Take both pipes back.
-          y = c.RetrieveHandle("x");
-          x = b.RetrieveHandle("y");
-
-          VerifyTransmission(x, y, "still works");
-          VerifyTransmission(y, x, "in both directions");
-
-          CloseHandle(x);
-          CloseHandle(y);
-
-          a.Exit();
-          b.Exit();
-          c.Exit();
-          d.Exit();
-        END_CHILD()
-      END_CHILD()
-    END_CHILD()
-  END_CHILD()
-}
-
-DEFINE_TEST_CLIENT_TEST_WITH_PIPE(ReceivePipeWithClosedPeer,
-                                  MultiprocessMessagePipeTest, h) {
-  MojoHandle p;
-  EXPECT_EQ("foo", ReadMessageWithHandles(h, &p, 1));
-  EXPECT_EQ(MOJO_RESULT_OK, WaitForSignals(p, MOJO_HANDLE_SIGNAL_PEER_CLOSED));
-}
-
-TEST_P(MultiprocessMessagePipeTestWithPeerSupport, SendPipeThenClosePeer) {
-  RUN_CHILD_ON_PIPE(ReceivePipeWithClosedPeer, h)
-    MojoHandle a, b;
-    CreateMessagePipe(&a, &b);
-
-    // Send |a| and immediately close |b|. The child should observe closure.
-    WriteMessageWithHandles(h, "foo", &a, 1);
-    MojoClose(b);
-  END_CHILD()
-}
-
-DEFINE_TEST_CLIENT_TEST_WITH_PIPE(SendOtherChildPipeWithClosedPeer,
-                                  MultiprocessMessagePipeTest, h) {
-  // Create a new pipe and send one end to the parent, who will connect it to
-  // a client running ReceivePipeWithClosedPeerFromOtherChild.
-  MojoHandle application_proxy, application_request;
-  CreateMessagePipe(&application_proxy, &application_request);
-  WriteMessageWithHandles(h, "c2a plz", &application_request, 1);
-
-  // Create another pipe and send one end to the remote "application".
-  MojoHandle service_proxy, service_request;
-  CreateMessagePipe(&service_proxy, &service_request);
-  WriteMessageWithHandles(application_proxy, "c2s lol", &service_request, 1);
-
-  // Immediately close the service proxy. The "application" should detect this.
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(service_proxy));
-
-  // Wait for quit.
-  EXPECT_EQ("quit", ReadMessage(h));
-}
-
-DEFINE_TEST_CLIENT_TEST_WITH_PIPE(ReceivePipeWithClosedPeerFromOtherChild,
-                                  MultiprocessMessagePipeTest, h) {
-  // Receive a pipe from the parent. This is akin to an "application request".
-  MojoHandle application_client;
-  EXPECT_EQ("c2a", ReadMessageWithHandles(h, &application_client, 1));
-
-  // Receive a pipe from the "application" "client".
-  MojoHandle service_client;
-  EXPECT_EQ("c2s lol",
-            ReadMessageWithHandles(application_client, &service_client, 1));
-
-  // Wait for the service client to signal closure.
-  EXPECT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(service_client, MOJO_HANDLE_SIGNAL_PEER_CLOSED));
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(service_client));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(application_client));
-}
-
-#if defined(OS_ANDROID)
-// Android multi-process tests are not executing the new process. This is flaky.
-#define MAYBE_SendPipeWithClosedPeerBetweenChildren \
-    DISABLED_SendPipeWithClosedPeerBetweenChildren
-#else
-#define MAYBE_SendPipeWithClosedPeerBetweenChildren \
-    SendPipeWithClosedPeerBetweenChildren
-#endif
-TEST_F(MultiprocessMessagePipeTest,
-       MAYBE_SendPipeWithClosedPeerBetweenChildren) {
-  RUN_CHILD_ON_PIPE(SendOtherChildPipeWithClosedPeer, kid_a)
-    RUN_CHILD_ON_PIPE(ReceivePipeWithClosedPeerFromOtherChild, kid_b)
-      // Receive an "application request" from the first child and forward it
-      // to the second child.
-      MojoHandle application_request;
-      EXPECT_EQ("c2a plz",
-                ReadMessageWithHandles(kid_a, &application_request, 1));
-
-      WriteMessageWithHandles(kid_b, "c2a", &application_request, 1);
-    END_CHILD()
-
-    WriteMessage(kid_a, "quit");
-  END_CHILD()
-}
-
-TEST_P(MultiprocessMessagePipeTestWithPeerSupport, SendClosePeerSend) {
-  MojoHandle a, b;
-  CreateMessagePipe(&a, &b);
-
-  MojoHandle c, d;
-  CreateMessagePipe(&c, &d);
-
-  // Send |a| over |c|, immediately close |b|, then send |a| back over |d|.
-  WriteMessageWithHandles(c, "foo", &a, 1);
-  EXPECT_EQ("foo", ReadMessageWithHandles(d, &a, 1));
-  WriteMessageWithHandles(d, "bar", &a, 1);
-  EXPECT_EQ("bar", ReadMessageWithHandles(c, &a, 1));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(b));
-
-  // We should be able to detect peer closure on |a|.
-  EXPECT_EQ(MOJO_RESULT_OK, WaitForSignals(a, MOJO_HANDLE_SIGNAL_PEER_CLOSED));
-}
-
-DEFINE_TEST_CLIENT_TEST_WITH_PIPE(WriteCloseSendPeerClient,
-                                  MultiprocessMessagePipeTest, h) {
-  MojoHandle pipe[2];
-  EXPECT_EQ("foo", ReadMessageWithHandles(h, pipe, 2));
-
-  // Write some messages to the first endpoint and then close it.
-  WriteMessage(pipe[0], "baz");
-  WriteMessage(pipe[0], "qux");
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(pipe[0]));
-
-  MojoHandle c, d;
-  CreateMessagePipe(&c, &d);
-
-  // Pass the orphaned endpoint over another pipe before passing it back to
-  // the parent, just for some extra proxying goodness.
-  WriteMessageWithHandles(c, "foo", &pipe[1], 1);
-  EXPECT_EQ("foo", ReadMessageWithHandles(d, &pipe[1], 1));
-
-  // And finally pass it back to the parent.
-  WriteMessageWithHandles(h, "bar", &pipe[1], 1);
-
-  EXPECT_EQ("quit", ReadMessage(h));
-}
-
-TEST_P(MultiprocessMessagePipeTestWithPeerSupport, WriteCloseSendPeer) {
-  MojoHandle pipe[2];
-  CreateMessagePipe(&pipe[0], &pipe[1]);
-
-  RUN_CHILD_ON_PIPE(WriteCloseSendPeerClient, h)
-    // Pass the pipe to the child.
-    WriteMessageWithHandles(h, "foo", pipe, 2);
-
-    // Read back an endpoint which should have messages on it.
-    MojoHandle p;
-    EXPECT_EQ("bar", ReadMessageWithHandles(h, &p, 1));
-
-    EXPECT_EQ("baz", ReadMessage(p));
-    EXPECT_EQ("qux", ReadMessage(p));
-
-    // Expect to have peer closure signaled.
-    EXPECT_EQ(MOJO_RESULT_OK,
-              WaitForSignals(p, MOJO_HANDLE_SIGNAL_PEER_CLOSED));
-
-    WriteMessage(h, "quit");
-  END_CHILD()
-}
-
-DEFINE_TEST_CLIENT_TEST_WITH_PIPE(MessagePipeStatusChangeInTransitClient,
-                                  MultiprocessMessagePipeTest, parent) {
-  // This test verifies that peer closure is detectable through various
-  // mechanisms when it races with handle transfer.
-  MojoHandle handles[4];
-  EXPECT_EQ("o_O", ReadMessageWithHandles(parent, handles, 4));
-
-  EXPECT_EQ(MOJO_RESULT_OK,
-            WaitForSignals(handles[0], MOJO_HANDLE_SIGNAL_PEER_CLOSED));
-
-  base::MessageLoop message_loop;
-
-  // Wait on handle 1 using a SimpleWatcher.
-  {
-    base::RunLoop run_loop;
-    SimpleWatcher watcher(FROM_HERE, SimpleWatcher::ArmingPolicy::AUTOMATIC);
-    watcher.Watch(Handle(handles[1]), MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-                  base::Bind(
-                      [](base::RunLoop* loop, MojoResult result) {
-                        EXPECT_EQ(MOJO_RESULT_OK, result);
-                        loop->Quit();
-                      },
-                      &run_loop));
-    run_loop.Run();
-  }
-
-  // Wait on handle 2 by polling with MojoReadMessage.
-  MojoResult result;
-  do {
-    result = MojoReadMessage(handles[2], nullptr, nullptr, nullptr, nullptr,
-                             MOJO_READ_MESSAGE_FLAG_NONE);
-  } while (result == MOJO_RESULT_SHOULD_WAIT);
-  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result);
-
-  // Wait on handle 3 by polling with MojoWriteMessage.
-  do {
-    result = MojoWriteMessage(handles[3], nullptr, 0, nullptr, 0,
-                              MOJO_WRITE_MESSAGE_FLAG_NONE);
-  } while (result == MOJO_RESULT_OK);
-  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result);
-
-  for (size_t i = 0; i < 4; ++i)
-    CloseHandle(handles[i]);
-}
-
-TEST_F(MultiprocessMessagePipeTest, MessagePipeStatusChangeInTransit) {
-  MojoHandle local_handles[4];
-  MojoHandle sent_handles[4];
-  for (size_t i = 0; i < 4; ++i)
-    CreateMessagePipe(&local_handles[i], &sent_handles[i]);
-
-  RUN_CHILD_ON_PIPE(MessagePipeStatusChangeInTransitClient, child)
-    // Send 4 handles and let their transfer race with their peers' closure.
-    WriteMessageWithHandles(child, "o_O", sent_handles, 4);
-    for (size_t i = 0; i < 4; ++i)
-      CloseHandle(local_handles[i]);
-  END_CHILD()
-}
-
-DEFINE_TEST_CLIENT_TEST_WITH_PIPE(BadMessageClient, MultiprocessMessagePipeTest,
-                                  parent) {
-  MojoHandle pipe;
-  EXPECT_EQ("hi", ReadMessageWithHandles(parent, &pipe, 1));
-  WriteMessage(pipe, "derp");
-  EXPECT_EQ("bye", ReadMessage(parent));
-}
-
-void OnProcessError(std::string* out_error, const std::string& error) {
-  *out_error = error;
-}
-
-TEST_F(MultiprocessMessagePipeTest, NotifyBadMessage) {
-  const std::string kFirstErrorMessage = "everything is terrible!";
-  const std::string kSecondErrorMessage = "not the bits you're looking for";
-
-  std::string first_process_error;
-  std::string second_process_error;
-
-  set_process_error_callback(base::Bind(&OnProcessError, &first_process_error));
-  RUN_CHILD_ON_PIPE(BadMessageClient, child1)
-    set_process_error_callback(base::Bind(&OnProcessError,
-                                          &second_process_error));
-    RUN_CHILD_ON_PIPE(BadMessageClient, child2)
-      MojoHandle a, b, c, d;
-      CreateMessagePipe(&a, &b);
-      CreateMessagePipe(&c, &d);
-      WriteMessageWithHandles(child1, "hi", &b, 1);
-      WriteMessageWithHandles(child2, "hi", &d, 1);
-
-      // Read a message from the pipe we sent to child1 and flag it as bad.
-      ASSERT_EQ(MOJO_RESULT_OK, WaitForSignals(a, MOJO_HANDLE_SIGNAL_READABLE));
-      uint32_t num_bytes = 0;
-      MojoMessageHandle message;
-      ASSERT_EQ(MOJO_RESULT_OK,
-                MojoReadMessageNew(a, &message, &num_bytes, nullptr, 0,
-                                   MOJO_READ_MESSAGE_FLAG_NONE));
-      EXPECT_EQ(MOJO_RESULT_OK,
-                MojoNotifyBadMessage(message, kFirstErrorMessage.data(),
-                                     kFirstErrorMessage.size()));
-      EXPECT_EQ(MOJO_RESULT_OK, MojoFreeMessage(message));
-
-      // Read a message from the pipe we sent to child2 and flag it as bad.
-      ASSERT_EQ(MOJO_RESULT_OK, WaitForSignals(c, MOJO_HANDLE_SIGNAL_READABLE));
-      ASSERT_EQ(MOJO_RESULT_OK,
-                MojoReadMessageNew(c, &message, &num_bytes, nullptr, 0,
-                                   MOJO_READ_MESSAGE_FLAG_NONE));
-      EXPECT_EQ(MOJO_RESULT_OK,
-                MojoNotifyBadMessage(message, kSecondErrorMessage.data(),
-                                     kSecondErrorMessage.size()));
-      EXPECT_EQ(MOJO_RESULT_OK, MojoFreeMessage(message));
-
-      WriteMessage(child2, "bye");
-    END_CHILD();
-
-    WriteMessage(child1, "bye");
-  END_CHILD()
-
-  // The error messages should match the processes which triggered them.
-  EXPECT_NE(std::string::npos, first_process_error.find(kFirstErrorMessage));
-  EXPECT_NE(std::string::npos, second_process_error.find(kSecondErrorMessage));
-}
-INSTANTIATE_TEST_CASE_P(
-    ,
-    MultiprocessMessagePipeTestWithPeerSupport,
-    testing::Values(test::MojoTestBase::LaunchType::CHILD,
-                    test::MojoTestBase::LaunchType::PEER,
-                    test::MojoTestBase::LaunchType::NAMED_CHILD,
-                    test::MojoTestBase::LaunchType::NAMED_PEER));
-}  // namespace
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/node_channel.cc b/mojo/edk/system/node_channel.cc
deleted file mode 100644
index b0f770d..0000000
--- a/mojo/edk/system/node_channel.cc
+++ /dev/null
@@ -1,905 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/system/node_channel.h"
-
-#include <cstring>
-#include <limits>
-#include <sstream>
-
-#include "base/bind.h"
-#include "base/location.h"
-#include "base/logging.h"
-#include "mojo/edk/system/channel.h"
-#include "mojo/edk/system/request_context.h"
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-#include "mojo/edk/system/mach_port_relay.h"
-#endif
-
-namespace mojo {
-namespace edk {
-
-namespace {
-
-template <typename T>
-T Align(T t) {
-  const auto k = kChannelMessageAlignment;
-  return t + (k - (t % k)) % k;
-}
-
-// NOTE: Please ONLY append messages to the end of this enum.
-enum class MessageType : uint32_t {
-  ACCEPT_CHILD,
-  ACCEPT_PARENT,
-  ADD_BROKER_CLIENT,
-  BROKER_CLIENT_ADDED,
-  ACCEPT_BROKER_CLIENT,
-  PORTS_MESSAGE,
-  REQUEST_PORT_MERGE,
-  REQUEST_INTRODUCTION,
-  INTRODUCE,
-#if defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS))
-  RELAY_PORTS_MESSAGE,
-#endif
-  BROADCAST,
-#if defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS))
-  PORTS_MESSAGE_FROM_RELAY,
-#endif
-  ACCEPT_PEER,
-};
-
-struct Header {
-  MessageType type;
-  uint32_t padding;
-};
-
-static_assert(IsAlignedForChannelMessage(sizeof(Header)),
-              "Invalid header size.");
-
-struct AcceptChildData {
-  ports::NodeName parent_name;
-  ports::NodeName token;
-};
-
-struct AcceptParentData {
-  ports::NodeName token;
-  ports::NodeName child_name;
-};
-
-struct AcceptPeerData {
-  ports::NodeName token;
-  ports::NodeName peer_name;
-  ports::PortName port_name;
-};
-
-// This message may include a process handle on plaforms that require it.
-struct AddBrokerClientData {
-  ports::NodeName client_name;
-#if !defined(OS_WIN)
-  uint32_t process_handle;
-  uint32_t padding;
-#endif
-};
-
-#if !defined(OS_WIN)
-static_assert(sizeof(base::ProcessHandle) == sizeof(uint32_t),
-              "Unexpected pid size");
-static_assert(sizeof(AddBrokerClientData) % kChannelMessageAlignment == 0,
-              "Invalid AddBrokerClientData size.");
-#endif
-
-// This data is followed by a platform channel handle to the broker.
-struct BrokerClientAddedData {
-  ports::NodeName client_name;
-};
-
-// This data may be followed by a platform channel handle to the broker. If not,
-// then the parent is the broker and its channel should be used as such.
-struct AcceptBrokerClientData {
-  ports::NodeName broker_name;
-};
-
-// This is followed by arbitrary payload data which is interpreted as a token
-// string for port location.
-struct RequestPortMergeData {
-  ports::PortName connector_port_name;
-};
-
-// Used for both REQUEST_INTRODUCTION and INTRODUCE.
-//
-// For INTRODUCE the message also includes a valid platform handle for a channel
-// the receiver may use to communicate with the named node directly, or an
-// invalid platform handle if the node is unknown to the sender or otherwise
-// cannot be introduced.
-struct IntroductionData {
-  ports::NodeName name;
-};
-
-#if defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS))
-// This struct is followed by the full payload of a message to be relayed.
-struct RelayPortsMessageData {
-  ports::NodeName destination;
-};
-
-// This struct is followed by the full payload of a relayed message.
-struct PortsMessageFromRelayData {
-  ports::NodeName source;
-};
-#endif
-
-template <typename DataType>
-Channel::MessagePtr CreateMessage(MessageType type,
-                                  size_t payload_size,
-                                  size_t num_handles,
-                                  DataType** out_data) {
-  Channel::MessagePtr message(
-      new Channel::Message(sizeof(Header) + payload_size, num_handles));
-  Header* header = reinterpret_cast<Header*>(message->mutable_payload());
-  header->type = type;
-  header->padding = 0;
-  *out_data = reinterpret_cast<DataType*>(&header[1]);
-  return message;
-}
-
-template <typename DataType>
-bool GetMessagePayload(const void* bytes,
-                       size_t num_bytes,
-                       DataType** out_data) {
-  static_assert(sizeof(DataType) > 0, "DataType must have non-zero size.");
-  if (num_bytes < sizeof(Header) + sizeof(DataType))
-    return false;
-  *out_data = reinterpret_cast<const DataType*>(
-      static_cast<const char*>(bytes) + sizeof(Header));
-  return true;
-}
-
-}  // namespace
-
-// static
-scoped_refptr<NodeChannel> NodeChannel::Create(
-    Delegate* delegate,
-    ConnectionParams connection_params,
-    scoped_refptr<base::TaskRunner> io_task_runner,
-    const ProcessErrorCallback& process_error_callback) {
-#if defined(OS_NACL_SFI)
-  LOG(FATAL) << "Multi-process not yet supported on NaCl-SFI";
-  return nullptr;
-#else
-  return new NodeChannel(delegate, std::move(connection_params), io_task_runner,
-                         process_error_callback);
-#endif
-}
-
-// static
-Channel::MessagePtr NodeChannel::CreatePortsMessage(size_t payload_size,
-                                                    void** payload,
-                                                    size_t num_handles) {
-  return CreateMessage(MessageType::PORTS_MESSAGE, payload_size, num_handles,
-                       payload);
-}
-
-// static
-void NodeChannel::GetPortsMessageData(Channel::Message* message,
-                                      void** data,
-                                      size_t* num_data_bytes) {
-  *data = reinterpret_cast<Header*>(message->mutable_payload()) + 1;
-  *num_data_bytes = message->payload_size() - sizeof(Header);
-}
-
-void NodeChannel::Start() {
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-  MachPortRelay* relay = delegate_->GetMachPortRelay();
-  if (relay)
-    relay->AddObserver(this);
-#endif
-
-  base::AutoLock lock(channel_lock_);
-  // ShutDown() may have already been called, in which case |channel_| is null.
-  if (channel_)
-    channel_->Start();
-}
-
-void NodeChannel::ShutDown() {
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-  MachPortRelay* relay = delegate_->GetMachPortRelay();
-  if (relay)
-    relay->RemoveObserver(this);
-#endif
-
-  base::AutoLock lock(channel_lock_);
-  if (channel_) {
-    channel_->ShutDown();
-    channel_ = nullptr;
-  }
-}
-
-void NodeChannel::LeakHandleOnShutdown() {
-  base::AutoLock lock(channel_lock_);
-  if (channel_) {
-    channel_->LeakHandle();
-  }
-}
-
-void NodeChannel::NotifyBadMessage(const std::string& error) {
-  if (!process_error_callback_.is_null())
-    process_error_callback_.Run("Received bad user message: " + error);
-}
-
-void NodeChannel::SetRemoteProcessHandle(base::ProcessHandle process_handle) {
-  DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
-  base::AutoLock lock(remote_process_handle_lock_);
-  DCHECK_EQ(base::kNullProcessHandle, remote_process_handle_);
-  CHECK_NE(remote_process_handle_, base::GetCurrentProcessHandle());
-  remote_process_handle_ = process_handle;
-#if defined(OS_WIN)
-  DCHECK(!scoped_remote_process_handle_.is_valid());
-  scoped_remote_process_handle_.reset(PlatformHandle(process_handle));
-#endif
-}
-
-bool NodeChannel::HasRemoteProcessHandle() {
-  base::AutoLock lock(remote_process_handle_lock_);
-  return remote_process_handle_ != base::kNullProcessHandle;
-}
-
-base::ProcessHandle NodeChannel::CopyRemoteProcessHandle() {
-  base::AutoLock lock(remote_process_handle_lock_);
-#if defined(OS_WIN)
-  if (remote_process_handle_ != base::kNullProcessHandle) {
-    // Privileged nodes use this to pass their childrens' process handles to the
-    // broker on launch.
-    HANDLE handle = remote_process_handle_;
-    BOOL result = DuplicateHandle(
-        base::GetCurrentProcessHandle(), remote_process_handle_,
-        base::GetCurrentProcessHandle(), &handle, 0, FALSE,
-        DUPLICATE_SAME_ACCESS);
-    DPCHECK(result);
-    return handle;
-  }
-  return base::kNullProcessHandle;
-#else
-  return remote_process_handle_;
-#endif
-}
-
-void NodeChannel::SetRemoteNodeName(const ports::NodeName& name) {
-  DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
-  remote_node_name_ = name;
-}
-
-void NodeChannel::AcceptChild(const ports::NodeName& parent_name,
-                              const ports::NodeName& token) {
-  AcceptChildData* data;
-  Channel::MessagePtr message = CreateMessage(
-      MessageType::ACCEPT_CHILD, sizeof(AcceptChildData), 0, &data);
-  data->parent_name = parent_name;
-  data->token = token;
-  WriteChannelMessage(std::move(message));
-}
-
-void NodeChannel::AcceptParent(const ports::NodeName& token,
-                               const ports::NodeName& child_name) {
-  AcceptParentData* data;
-  Channel::MessagePtr message = CreateMessage(
-      MessageType::ACCEPT_PARENT, sizeof(AcceptParentData), 0, &data);
-  data->token = token;
-  data->child_name = child_name;
-  WriteChannelMessage(std::move(message));
-}
-
-void NodeChannel::AcceptPeer(const ports::NodeName& sender_name,
-                             const ports::NodeName& token,
-                             const ports::PortName& port_name) {
-  AcceptPeerData* data;
-  Channel::MessagePtr message =
-      CreateMessage(MessageType::ACCEPT_PEER, sizeof(AcceptPeerData), 0, &data);
-  data->token = token;
-  data->peer_name = sender_name;
-  data->port_name = port_name;
-  WriteChannelMessage(std::move(message));
-}
-
-void NodeChannel::AddBrokerClient(const ports::NodeName& client_name,
-                                  base::ProcessHandle process_handle) {
-  AddBrokerClientData* data;
-  ScopedPlatformHandleVectorPtr handles(new PlatformHandleVector());
-#if defined(OS_WIN)
-  handles->push_back(PlatformHandle(process_handle));
-#endif
-  Channel::MessagePtr message = CreateMessage(
-      MessageType::ADD_BROKER_CLIENT, sizeof(AddBrokerClientData),
-      handles->size(), &data);
-  message->SetHandles(std::move(handles));
-  data->client_name = client_name;
-#if !defined(OS_WIN)
-  data->process_handle = process_handle;
-  data->padding = 0;
-#endif
-  WriteChannelMessage(std::move(message));
-}
-
-void NodeChannel::BrokerClientAdded(const ports::NodeName& client_name,
-                                    ScopedPlatformHandle broker_channel) {
-  BrokerClientAddedData* data;
-  ScopedPlatformHandleVectorPtr handles(new PlatformHandleVector());
-  if (broker_channel.is_valid())
-    handles->push_back(broker_channel.release());
-  Channel::MessagePtr message = CreateMessage(
-      MessageType::BROKER_CLIENT_ADDED, sizeof(BrokerClientAddedData),
-      handles->size(), &data);
-  message->SetHandles(std::move(handles));
-  data->client_name = client_name;
-  WriteChannelMessage(std::move(message));
-}
-
-void NodeChannel::AcceptBrokerClient(const ports::NodeName& broker_name,
-                                     ScopedPlatformHandle broker_channel) {
-  AcceptBrokerClientData* data;
-  ScopedPlatformHandleVectorPtr handles(new PlatformHandleVector());
-  if (broker_channel.is_valid())
-    handles->push_back(broker_channel.release());
-  Channel::MessagePtr message = CreateMessage(
-      MessageType::ACCEPT_BROKER_CLIENT, sizeof(AcceptBrokerClientData),
-      handles->size(), &data);
-  message->SetHandles(std::move(handles));
-  data->broker_name = broker_name;
-  WriteChannelMessage(std::move(message));
-}
-
-void NodeChannel::PortsMessage(Channel::MessagePtr message) {
-  WriteChannelMessage(std::move(message));
-}
-
-void NodeChannel::RequestPortMerge(const ports::PortName& connector_port_name,
-                                   const std::string& token) {
-  RequestPortMergeData* data;
-  Channel::MessagePtr message = CreateMessage(
-      MessageType::REQUEST_PORT_MERGE,
-      sizeof(RequestPortMergeData) + token.size(), 0, &data);
-  data->connector_port_name = connector_port_name;
-  memcpy(data + 1, token.data(), token.size());
-  WriteChannelMessage(std::move(message));
-}
-
-void NodeChannel::RequestIntroduction(const ports::NodeName& name) {
-  IntroductionData* data;
-  Channel::MessagePtr message = CreateMessage(
-      MessageType::REQUEST_INTRODUCTION, sizeof(IntroductionData), 0, &data);
-  data->name = name;
-  WriteChannelMessage(std::move(message));
-}
-
-void NodeChannel::Introduce(const ports::NodeName& name,
-                            ScopedPlatformHandle channel_handle) {
-  IntroductionData* data;
-  ScopedPlatformHandleVectorPtr handles(new PlatformHandleVector());
-  if (channel_handle.is_valid())
-    handles->push_back(channel_handle.release());
-  Channel::MessagePtr message = CreateMessage(
-      MessageType::INTRODUCE, sizeof(IntroductionData), handles->size(), &data);
-  message->SetHandles(std::move(handles));
-  data->name = name;
-  WriteChannelMessage(std::move(message));
-}
-
-void NodeChannel::Broadcast(Channel::MessagePtr message) {
-  DCHECK(!message->has_handles());
-  void* data;
-  Channel::MessagePtr broadcast_message = CreateMessage(
-      MessageType::BROADCAST, message->data_num_bytes(), 0, &data);
-  memcpy(data, message->data(), message->data_num_bytes());
-  WriteChannelMessage(std::move(broadcast_message));
-}
-
-#if defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS))
-void NodeChannel::RelayPortsMessage(const ports::NodeName& destination,
-                                    Channel::MessagePtr message) {
-#if defined(OS_WIN)
-  DCHECK(message->has_handles());
-
-  // Note that this is only used on Windows, and on Windows all platform
-  // handles are included in the message data. We blindly copy all the data
-  // here and the relay node (the parent) will duplicate handles as needed.
-  size_t num_bytes = sizeof(RelayPortsMessageData) + message->data_num_bytes();
-  RelayPortsMessageData* data;
-  Channel::MessagePtr relay_message = CreateMessage(
-      MessageType::RELAY_PORTS_MESSAGE, num_bytes, 0, &data);
-  data->destination = destination;
-  memcpy(data + 1, message->data(), message->data_num_bytes());
-
-  // When the handles are duplicated in the parent, the source handles will
-  // be closed. If the parent never receives this message then these handles
-  // will leak, but that means something else has probably broken and the
-  // sending process won't likely be around much longer.
-  ScopedPlatformHandleVectorPtr handles = message->TakeHandles();
-  handles->clear();
-
-#else
-  DCHECK(message->has_mach_ports());
-
-  // On OSX, the handles are extracted from the relayed message and attached to
-  // the wrapper. The broker then takes the handles attached to the wrapper and
-  // moves them back to the relayed message. This is necessary because the
-  // message may contain fds which need to be attached to the outer message so
-  // that they can be transferred to the broker.
-  ScopedPlatformHandleVectorPtr handles = message->TakeHandles();
-  size_t num_bytes = sizeof(RelayPortsMessageData) + message->data_num_bytes();
-  RelayPortsMessageData* data;
-  Channel::MessagePtr relay_message = CreateMessage(
-      MessageType::RELAY_PORTS_MESSAGE, num_bytes, handles->size(), &data);
-  data->destination = destination;
-  memcpy(data + 1, message->data(), message->data_num_bytes());
-  relay_message->SetHandles(std::move(handles));
-#endif  // defined(OS_WIN)
-
-  WriteChannelMessage(std::move(relay_message));
-}
-
-void NodeChannel::PortsMessageFromRelay(const ports::NodeName& source,
-                                        Channel::MessagePtr message) {
-  size_t num_bytes = sizeof(PortsMessageFromRelayData) +
-      message->payload_size();
-  PortsMessageFromRelayData* data;
-  Channel::MessagePtr relayed_message = CreateMessage(
-      MessageType::PORTS_MESSAGE_FROM_RELAY, num_bytes, message->num_handles(),
-      &data);
-  data->source = source;
-  if (message->payload_size())
-    memcpy(data + 1, message->payload(), message->payload_size());
-  relayed_message->SetHandles(message->TakeHandles());
-  WriteChannelMessage(std::move(relayed_message));
-}
-#endif  // defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS))
-
-NodeChannel::NodeChannel(Delegate* delegate,
-                         ConnectionParams connection_params,
-                         scoped_refptr<base::TaskRunner> io_task_runner,
-                         const ProcessErrorCallback& process_error_callback)
-    : delegate_(delegate),
-      io_task_runner_(io_task_runner),
-      process_error_callback_(process_error_callback)
-#if !defined(OS_NACL_SFI)
-      ,
-      channel_(
-          Channel::Create(this, std::move(connection_params), io_task_runner_))
-#endif
-{
-}
-
-NodeChannel::~NodeChannel() {
-  ShutDown();
-}
-
-void NodeChannel::OnChannelMessage(const void* payload,
-                                   size_t payload_size,
-                                   ScopedPlatformHandleVectorPtr handles) {
-  DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
-
-  RequestContext request_context(RequestContext::Source::SYSTEM);
-
-  // Ensure this NodeChannel stays alive through the extent of this method. The
-  // delegate may have the only other reference to this object and it may choose
-  // to drop it here in response to, e.g., a malformed message.
-  scoped_refptr<NodeChannel> keepalive = this;
-
-#if defined(OS_WIN)
-  // If we receive handles from a known process, rewrite them to our own
-  // process. This can occur when a privileged node receives handles directly
-  // from a privileged descendant.
-  {
-    base::AutoLock lock(remote_process_handle_lock_);
-    if (handles && remote_process_handle_ != base::kNullProcessHandle) {
-      // Note that we explicitly mark the handles as being owned by the sending
-      // process before rewriting them, in order to accommodate RewriteHandles'
-      // internal sanity checks.
-      for (auto& handle : *handles)
-        handle.owning_process = remote_process_handle_;
-      if (!Channel::Message::RewriteHandles(remote_process_handle_,
-                                            base::GetCurrentProcessHandle(),
-                                            handles.get())) {
-        DLOG(ERROR) << "Received one or more invalid handles.";
-      }
-    } else if (handles) {
-      // Handles received by an unknown process must already be owned by us.
-      for (auto& handle : *handles)
-        handle.owning_process = base::GetCurrentProcessHandle();
-    }
-  }
-#elif defined(OS_MACOSX) && !defined(OS_IOS)
-  // If we're not the root, receive any mach ports from the message. If we're
-  // the root, the only message containing mach ports should be a
-  // RELAY_PORTS_MESSAGE.
-  {
-    MachPortRelay* relay = delegate_->GetMachPortRelay();
-    if (handles && !relay) {
-      if (!MachPortRelay::ReceivePorts(handles.get())) {
-        LOG(ERROR) << "Error receiving mach ports.";
-      }
-    }
-  }
-#endif  // defined(OS_WIN)
-
-
-  if (payload_size <= sizeof(Header)) {
-    delegate_->OnChannelError(remote_node_name_, this);
-    return;
-  }
-
-  const Header* header = static_cast<const Header*>(payload);
-  switch (header->type) {
-    case MessageType::ACCEPT_CHILD: {
-      const AcceptChildData* data;
-      if (GetMessagePayload(payload, payload_size, &data)) {
-        delegate_->OnAcceptChild(remote_node_name_, data->parent_name,
-                                 data->token);
-        return;
-      }
-      break;
-    }
-
-    case MessageType::ACCEPT_PARENT: {
-      const AcceptParentData* data;
-      if (GetMessagePayload(payload, payload_size, &data)) {
-        delegate_->OnAcceptParent(remote_node_name_, data->token,
-                                  data->child_name);
-        return;
-      }
-      break;
-    }
-
-    case MessageType::ADD_BROKER_CLIENT: {
-      const AddBrokerClientData* data;
-      if (GetMessagePayload(payload, payload_size, &data)) {
-        ScopedPlatformHandle process_handle;
-#if defined(OS_WIN)
-        if (!handles || handles->size() != 1) {
-          DLOG(ERROR) << "Dropping invalid AddBrokerClient message.";
-          break;
-        }
-        process_handle = ScopedPlatformHandle(handles->at(0));
-        handles->clear();
-        delegate_->OnAddBrokerClient(remote_node_name_, data->client_name,
-                                     process_handle.release().handle);
-#else
-        if (handles && handles->size() != 0) {
-          DLOG(ERROR) << "Dropping invalid AddBrokerClient message.";
-          break;
-        }
-        delegate_->OnAddBrokerClient(remote_node_name_, data->client_name,
-                                     data->process_handle);
-#endif
-        return;
-      }
-      break;
-    }
-
-    case MessageType::BROKER_CLIENT_ADDED: {
-      const BrokerClientAddedData* data;
-      if (GetMessagePayload(payload, payload_size, &data)) {
-        ScopedPlatformHandle broker_channel;
-        if (!handles || handles->size() != 1) {
-          DLOG(ERROR) << "Dropping invalid BrokerClientAdded message.";
-          break;
-        }
-        broker_channel = ScopedPlatformHandle(handles->at(0));
-        handles->clear();
-        delegate_->OnBrokerClientAdded(remote_node_name_, data->client_name,
-                                       std::move(broker_channel));
-        return;
-      }
-      break;
-    }
-
-    case MessageType::ACCEPT_BROKER_CLIENT: {
-      const AcceptBrokerClientData* data;
-      if (GetMessagePayload(payload, payload_size, &data)) {
-        ScopedPlatformHandle broker_channel;
-        if (handles && handles->size() > 1) {
-          DLOG(ERROR) << "Dropping invalid AcceptBrokerClient message.";
-          break;
-        }
-        if (handles && handles->size() == 1) {
-          broker_channel = ScopedPlatformHandle(handles->at(0));
-          handles->clear();
-        }
-        delegate_->OnAcceptBrokerClient(remote_node_name_, data->broker_name,
-                                        std::move(broker_channel));
-        return;
-      }
-      break;
-    }
-
-    case MessageType::PORTS_MESSAGE: {
-      size_t num_handles = handles ? handles->size() : 0;
-      Channel::MessagePtr message(
-          new Channel::Message(payload_size, num_handles));
-      message->SetHandles(std::move(handles));
-      memcpy(message->mutable_payload(), payload, payload_size);
-      delegate_->OnPortsMessage(remote_node_name_, std::move(message));
-      return;
-    }
-
-    case MessageType::REQUEST_PORT_MERGE: {
-      const RequestPortMergeData* data;
-      if (GetMessagePayload(payload, payload_size, &data)) {
-        // Don't accept an empty token.
-        size_t token_size = payload_size - sizeof(*data) - sizeof(Header);
-        if (token_size == 0)
-          break;
-        std::string token(reinterpret_cast<const char*>(data + 1), token_size);
-        delegate_->OnRequestPortMerge(remote_node_name_,
-                                      data->connector_port_name, token);
-        return;
-      }
-      break;
-    }
-
-    case MessageType::REQUEST_INTRODUCTION: {
-      const IntroductionData* data;
-      if (GetMessagePayload(payload, payload_size, &data)) {
-        delegate_->OnRequestIntroduction(remote_node_name_, data->name);
-        return;
-      }
-      break;
-    }
-
-    case MessageType::INTRODUCE: {
-      const IntroductionData* data;
-      if (GetMessagePayload(payload, payload_size, &data)) {
-        if (handles && handles->size() > 1) {
-          DLOG(ERROR) << "Dropping invalid introduction message.";
-          break;
-        }
-        ScopedPlatformHandle channel_handle;
-        if (handles && handles->size() == 1) {
-          channel_handle = ScopedPlatformHandle(handles->at(0));
-          handles->clear();
-        }
-        delegate_->OnIntroduce(remote_node_name_, data->name,
-                               std::move(channel_handle));
-        return;
-      }
-      break;
-    }
-
-#if defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS))
-    case MessageType::RELAY_PORTS_MESSAGE: {
-      base::ProcessHandle from_process;
-      {
-        base::AutoLock lock(remote_process_handle_lock_);
-        from_process = remote_process_handle_;
-      }
-      const RelayPortsMessageData* data;
-      if (GetMessagePayload(payload, payload_size, &data)) {
-        // Don't try to relay an empty message.
-        if (payload_size <= sizeof(Header) + sizeof(RelayPortsMessageData))
-          break;
-
-        const void* message_start = data + 1;
-        Channel::MessagePtr message = Channel::Message::Deserialize(
-            message_start, payload_size - sizeof(Header) - sizeof(*data));
-        if (!message) {
-          DLOG(ERROR) << "Dropping invalid relay message.";
-          break;
-        }
-  #if defined(OS_MACOSX) && !defined(OS_IOS)
-        message->SetHandles(std::move(handles));
-        MachPortRelay* relay = delegate_->GetMachPortRelay();
-        if (!relay) {
-          LOG(ERROR) << "Receiving mach ports without a port relay from "
-                     << remote_node_name_ << ". Dropping message.";
-          break;
-        }
-        {
-          base::AutoLock lock(pending_mach_messages_lock_);
-          if (relay->port_provider()->TaskForPid(from_process) ==
-              MACH_PORT_NULL) {
-            pending_relay_messages_.push(
-                std::make_pair(data->destination, std::move(message)));
-            break;
-          }
-        }
-  #endif
-        delegate_->OnRelayPortsMessage(remote_node_name_, from_process,
-                                       data->destination, std::move(message));
-        return;
-      }
-      break;
-    }
-#endif
-
-    case MessageType::BROADCAST: {
-      if (payload_size <= sizeof(Header))
-        break;
-      const void* data = static_cast<const void*>(
-          reinterpret_cast<const Header*>(payload) + 1);
-      Channel::MessagePtr message =
-          Channel::Message::Deserialize(data, payload_size - sizeof(Header));
-      if (!message || message->has_handles()) {
-        DLOG(ERROR) << "Dropping invalid broadcast message.";
-        break;
-      }
-      delegate_->OnBroadcast(remote_node_name_, std::move(message));
-      return;
-    }
-
-#if defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS))
-    case MessageType::PORTS_MESSAGE_FROM_RELAY:
-      const PortsMessageFromRelayData* data;
-      if (GetMessagePayload(payload, payload_size, &data)) {
-        size_t num_bytes = payload_size - sizeof(*data);
-        if (num_bytes < sizeof(Header))
-          break;
-        num_bytes -= sizeof(Header);
-
-        size_t num_handles = handles ? handles->size() : 0;
-        Channel::MessagePtr message(
-            new Channel::Message(num_bytes, num_handles));
-        message->SetHandles(std::move(handles));
-        if (num_bytes)
-          memcpy(message->mutable_payload(), data + 1, num_bytes);
-        delegate_->OnPortsMessageFromRelay(
-            remote_node_name_, data->source, std::move(message));
-        return;
-      }
-      break;
-
-#endif  // defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS))
-
-    case MessageType::ACCEPT_PEER: {
-      const AcceptPeerData* data;
-      if (GetMessagePayload(payload, payload_size, &data)) {
-        delegate_->OnAcceptPeer(remote_node_name_, data->token, data->peer_name,
-                                data->port_name);
-        return;
-      }
-      break;
-    }
-
-    default:
-      break;
-  }
-
-  DLOG(ERROR) << "Received invalid message. Closing channel.";
-  delegate_->OnChannelError(remote_node_name_, this);
-}
-
-void NodeChannel::OnChannelError() {
-  DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
-
-  RequestContext request_context(RequestContext::Source::SYSTEM);
-
-  ShutDown();
-  // |OnChannelError()| may cause |this| to be destroyed, but still need access
-  // to the name name after that destruction. So may a copy of
-  // |remote_node_name_| so it can be used if |this| becomes destroyed.
-  ports::NodeName node_name = remote_node_name_;
-  delegate_->OnChannelError(node_name, this);
-}
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-void NodeChannel::OnProcessReady(base::ProcessHandle process) {
-  io_task_runner_->PostTask(FROM_HERE, base::Bind(
-      &NodeChannel::ProcessPendingMessagesWithMachPorts, this));
-}
-
-void NodeChannel::ProcessPendingMessagesWithMachPorts() {
-  MachPortRelay* relay = delegate_->GetMachPortRelay();
-  DCHECK(relay);
-
-  base::ProcessHandle remote_process_handle;
-  {
-    base::AutoLock lock(remote_process_handle_lock_);
-    remote_process_handle = remote_process_handle_;
-  }
-  PendingMessageQueue pending_writes;
-  PendingRelayMessageQueue pending_relays;
-  {
-    base::AutoLock lock(pending_mach_messages_lock_);
-    pending_writes.swap(pending_write_messages_);
-    pending_relays.swap(pending_relay_messages_);
-  }
-
-  while (!pending_writes.empty()) {
-    Channel::MessagePtr message = std::move(pending_writes.front());
-    pending_writes.pop();
-    if (!relay->SendPortsToProcess(message.get(), remote_process_handle)) {
-      LOG(ERROR) << "Error on sending mach ports. Remote process is likely "
-                 << "gone. Dropping message.";
-      return;
-    }
-
-    base::AutoLock lock(channel_lock_);
-    if (!channel_) {
-      DLOG(ERROR) << "Dropping message on closed channel.";
-      break;
-    } else {
-      channel_->Write(std::move(message));
-    }
-  }
-
-  // Ensure this NodeChannel stays alive while flushing relay messages.
-  scoped_refptr<NodeChannel> keepalive = this;
-
-  while (!pending_relays.empty()) {
-    ports::NodeName destination = pending_relays.front().first;
-    Channel::MessagePtr message = std::move(pending_relays.front().second);
-    pending_relays.pop();
-    delegate_->OnRelayPortsMessage(remote_node_name_, remote_process_handle,
-                                   destination, std::move(message));
-  }
-}
-#endif
-
-void NodeChannel::WriteChannelMessage(Channel::MessagePtr message) {
-#if defined(OS_WIN)
-  // Map handles to the destination process. Note: only messages from a
-  // privileged node should contain handles on Windows. If an unprivileged
-  // node needs to send handles, it should do so via RelayPortsMessage which
-  // stashes the handles in the message in such a way that they go undetected
-  // here (they'll be unpacked and duplicated by a privileged parent.)
-
-  if (message->has_handles()) {
-    base::ProcessHandle remote_process_handle;
-    {
-      base::AutoLock lock(remote_process_handle_lock_);
-      remote_process_handle = remote_process_handle_;
-    }
-
-    // Rewrite outgoing handles if we have a handle to the destination process.
-    if (remote_process_handle != base::kNullProcessHandle) {
-      ScopedPlatformHandleVectorPtr handles = message->TakeHandles();
-      if (!Channel::Message::RewriteHandles(base::GetCurrentProcessHandle(),
-                                            remote_process_handle,
-                                            handles.get())) {
-        DLOG(ERROR) << "Failed to duplicate one or more outgoing handles.";
-      }
-      message->SetHandles(std::move(handles));
-    }
-  }
-#elif defined(OS_MACOSX) && !defined(OS_IOS)
-  // On OSX, we need to transfer mach ports to the destination process before
-  // transferring the message itself.
-  if (message->has_mach_ports()) {
-    MachPortRelay* relay = delegate_->GetMachPortRelay();
-    if (relay) {
-      base::ProcessHandle remote_process_handle;
-      {
-        base::AutoLock lock(remote_process_handle_lock_);
-        // Expect that the receiving node is a child.
-        DCHECK(remote_process_handle_ != base::kNullProcessHandle);
-        remote_process_handle = remote_process_handle_;
-      }
-      {
-        base::AutoLock lock(pending_mach_messages_lock_);
-        if (relay->port_provider()->TaskForPid(remote_process_handle) ==
-            MACH_PORT_NULL) {
-          // It is also possible for TaskForPid() to return MACH_PORT_NULL when
-          // the process has started, then died. In that case, the queued
-          // message will never be processed. But that's fine since we're about
-          // to die anyway.
-          pending_write_messages_.push(std::move(message));
-          return;
-        }
-      }
-
-      if (!relay->SendPortsToProcess(message.get(), remote_process_handle)) {
-        LOG(ERROR) << "Error on sending mach ports. Remote process is likely "
-                   << "gone. Dropping message.";
-        return;
-      }
-    }
-  }
-#endif
-
-  base::AutoLock lock(channel_lock_);
-  if (!channel_)
-    DLOG(ERROR) << "Dropping message on closed channel.";
-  else
-    channel_->Write(std::move(message));
-}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/node_channel.h b/mojo/edk/system/node_channel.h
deleted file mode 100644
index 95dc341..0000000
--- a/mojo/edk/system/node_channel.h
+++ /dev/null
@@ -1,219 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_SYSTEM_NODE_CHANNEL_H_
-#define MOJO_EDK_SYSTEM_NODE_CHANNEL_H_
-
-#include <queue>
-#include <unordered_map>
-#include <utility>
-
-#include "base/callback.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/process/process_handle.h"
-#include "base/synchronization/lock.h"
-#include "base/task_runner.h"
-#include "build/build_config.h"
-#include "mojo/edk/embedder/connection_params.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/embedder/platform_handle_vector.h"
-#include "mojo/edk/embedder/scoped_platform_handle.h"
-#include "mojo/edk/system/channel.h"
-#include "mojo/edk/system/ports/name.h"
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-#include "mojo/edk/system/mach_port_relay.h"
-#endif
-
-namespace mojo {
-namespace edk {
-
-// Wraps a Channel to send and receive Node control messages.
-class NodeChannel : public base::RefCountedThreadSafe<NodeChannel>,
-                    public Channel::Delegate
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-                    , public MachPortRelay::Observer
-#endif
-  {
- public:
-  class Delegate {
-   public:
-    virtual ~Delegate() {}
-    virtual void OnAcceptChild(const ports::NodeName& from_node,
-                               const ports::NodeName& parent_name,
-                               const ports::NodeName& token) = 0;
-    virtual void OnAcceptParent(const ports::NodeName& from_node,
-                                const ports::NodeName& token,
-                                const ports::NodeName& child_name) = 0;
-    virtual void OnAddBrokerClient(const ports::NodeName& from_node,
-                                   const ports::NodeName& client_name,
-                                   base::ProcessHandle process_handle) = 0;
-    virtual void OnBrokerClientAdded(const ports::NodeName& from_node,
-                                     const ports::NodeName& client_name,
-                                     ScopedPlatformHandle broker_channel) = 0;
-    virtual void OnAcceptBrokerClient(const ports::NodeName& from_node,
-                                      const ports::NodeName& broker_name,
-                                      ScopedPlatformHandle broker_channel) = 0;
-    virtual void OnPortsMessage(const ports::NodeName& from_node,
-                                Channel::MessagePtr message) = 0;
-    virtual void OnRequestPortMerge(const ports::NodeName& from_node,
-                                    const ports::PortName& connector_port_name,
-                                    const std::string& token) = 0;
-    virtual void OnRequestIntroduction(const ports::NodeName& from_node,
-                                       const ports::NodeName& name) = 0;
-    virtual void OnIntroduce(const ports::NodeName& from_node,
-                             const ports::NodeName& name,
-                             ScopedPlatformHandle channel_handle) = 0;
-    virtual void OnBroadcast(const ports::NodeName& from_node,
-                             Channel::MessagePtr message) = 0;
-#if defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS))
-    virtual void OnRelayPortsMessage(const ports::NodeName& from_node,
-                                     base::ProcessHandle from_process,
-                                     const ports::NodeName& destination,
-                                     Channel::MessagePtr message) = 0;
-    virtual void OnPortsMessageFromRelay(const ports::NodeName& from_node,
-                                         const ports::NodeName& source_node,
-                                         Channel::MessagePtr message) = 0;
-#endif
-    virtual void OnAcceptPeer(const ports::NodeName& from_node,
-                              const ports::NodeName& token,
-                              const ports::NodeName& peer_name,
-                              const ports::PortName& port_name) = 0;
-    virtual void OnChannelError(const ports::NodeName& node,
-                                NodeChannel* channel) = 0;
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-    virtual MachPortRelay* GetMachPortRelay() = 0;
-#endif
-  };
-
-  static scoped_refptr<NodeChannel> Create(
-      Delegate* delegate,
-      ConnectionParams connection_params,
-      scoped_refptr<base::TaskRunner> io_task_runner,
-      const ProcessErrorCallback& process_error_callback);
-
-  static Channel::MessagePtr CreatePortsMessage(size_t payload_size,
-                                                void** payload,
-                                                size_t num_handles);
-
-  static void GetPortsMessageData(Channel::Message* message, void** data,
-                                  size_t* num_data_bytes);
-
-  // Start receiving messages.
-  void Start();
-
-  // Permanently stop the channel from sending or receiving messages.
-  void ShutDown();
-
-  // Leaks the pipe handle instead of closing it on shutdown.
-  void LeakHandleOnShutdown();
-
-  // Invokes the bad message callback for this channel, if any.
-  void NotifyBadMessage(const std::string& error);
-
-  // Note: On Windows, we take ownership of the remote process handle.
-  void SetRemoteProcessHandle(base::ProcessHandle process_handle);
-  bool HasRemoteProcessHandle();
-  // Note: The returned |ProcessHandle| is owned by the caller and should be
-  // freed if necessary.
-  base::ProcessHandle CopyRemoteProcessHandle();
-
-  // Used for context in Delegate calls (via |from_node| arguments.)
-  void SetRemoteNodeName(const ports::NodeName& name);
-
-  void AcceptChild(const ports::NodeName& parent_name,
-                   const ports::NodeName& token);
-  void AcceptParent(const ports::NodeName& token,
-                    const ports::NodeName& child_name);
-  void AcceptPeer(const ports::NodeName& sender_name,
-                  const ports::NodeName& token,
-                  const ports::PortName& port_name);
-  void AddBrokerClient(const ports::NodeName& client_name,
-                       base::ProcessHandle process_handle);
-  void BrokerClientAdded(const ports::NodeName& client_name,
-                         ScopedPlatformHandle broker_channel);
-  void AcceptBrokerClient(const ports::NodeName& broker_name,
-                          ScopedPlatformHandle broker_channel);
-  void PortsMessage(Channel::MessagePtr message);
-  void RequestPortMerge(const ports::PortName& connector_port_name,
-                        const std::string& token);
-  void RequestIntroduction(const ports::NodeName& name);
-  void Introduce(const ports::NodeName& name,
-                 ScopedPlatformHandle channel_handle);
-  void Broadcast(Channel::MessagePtr message);
-
-#if defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS))
-  // Relay the message to the specified node via this channel.  This is used to
-  // pass windows handles between two processes that do not have permission to
-  // duplicate handles into the other's address space. The relay process is
-  // assumed to have that permission.
-  void RelayPortsMessage(const ports::NodeName& destination,
-                         Channel::MessagePtr message);
-
-  // Sends a message to its destination from a relay. This is interpreted by the
-  // receiver similarly to PortsMessage, but the original source node is
-  // provided as additional message metadata from the (trusted) relay node.
-  void PortsMessageFromRelay(const ports::NodeName& source,
-                             Channel::MessagePtr message);
-#endif
-
- private:
-  friend class base::RefCountedThreadSafe<NodeChannel>;
-
-  using PendingMessageQueue = std::queue<Channel::MessagePtr>;
-  using PendingRelayMessageQueue =
-      std::queue<std::pair<ports::NodeName, Channel::MessagePtr>>;
-
-  NodeChannel(Delegate* delegate,
-              ConnectionParams connection_params,
-              scoped_refptr<base::TaskRunner> io_task_runner,
-              const ProcessErrorCallback& process_error_callback);
-  ~NodeChannel() override;
-
-  // Channel::Delegate:
-  void OnChannelMessage(const void* payload,
-                        size_t payload_size,
-                        ScopedPlatformHandleVectorPtr handles) override;
-  void OnChannelError() override;
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-  // MachPortRelay::Observer:
-  void OnProcessReady(base::ProcessHandle process) override;
-
-  void ProcessPendingMessagesWithMachPorts();
-#endif
-
-  void WriteChannelMessage(Channel::MessagePtr message);
-
-  Delegate* const delegate_;
-  const scoped_refptr<base::TaskRunner> io_task_runner_;
-  const ProcessErrorCallback process_error_callback_;
-
-  base::Lock channel_lock_;
-  scoped_refptr<Channel> channel_;
-
-  // Must only be accessed from |io_task_runner_|'s thread.
-  ports::NodeName remote_node_name_;
-
-  base::Lock remote_process_handle_lock_;
-  base::ProcessHandle remote_process_handle_ = base::kNullProcessHandle;
-#if defined(OS_WIN)
-  ScopedPlatformHandle scoped_remote_process_handle_;
-#endif
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-  base::Lock pending_mach_messages_lock_;
-  PendingMessageQueue pending_write_messages_;
-  PendingRelayMessageQueue pending_relay_messages_;
-#endif
-
-  DISALLOW_COPY_AND_ASSIGN(NodeChannel);
-};
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_NODE_CHANNEL_H_
diff --git a/mojo/edk/system/node_controller.cc b/mojo/edk/system/node_controller.cc
deleted file mode 100644
index 73b16b1..0000000
--- a/mojo/edk/system/node_controller.cc
+++ /dev/null
@@ -1,1470 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/system/node_controller.h"
-
-#include <algorithm>
-#include <limits>
-
-#include "base/bind.h"
-#include "base/location.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/message_loop/message_loop.h"
-#include "base/metrics/histogram_macros.h"
-#include "base/process/process_handle.h"
-#include "base/rand_util.h"
-#include "base/time/time.h"
-#include "base/timer/elapsed_timer.h"
-#include "mojo/edk/embedder/embedder_internal.h"
-#include "mojo/edk/embedder/named_platform_channel_pair.h"
-#include "mojo/edk/embedder/named_platform_handle.h"
-#include "mojo/edk/embedder/platform_channel_pair.h"
-#include "mojo/edk/system/broker.h"
-#include "mojo/edk/system/broker_host.h"
-#include "mojo/edk/system/core.h"
-#include "mojo/edk/system/ports_message.h"
-#include "mojo/edk/system/request_context.h"
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-#include "mojo/edk/system/mach_port_relay.h"
-#endif
-
-#if !defined(OS_NACL)
-#include "crypto/random.h"
-#endif
-
-namespace mojo {
-namespace edk {
-
-namespace {
-
-#if defined(OS_NACL)
-template <typename T>
-void GenerateRandomName(T* out) { base::RandBytes(out, sizeof(T)); }
-#else
-template <typename T>
-void GenerateRandomName(T* out) { crypto::RandBytes(out, sizeof(T)); }
-#endif
-
-ports::NodeName GetRandomNodeName() {
-  ports::NodeName name;
-  GenerateRandomName(&name);
-  return name;
-}
-
-void RecordPeerCount(size_t count) {
-  DCHECK_LE(count, static_cast<size_t>(std::numeric_limits<int32_t>::max()));
-
-  // 8k is the maximum number of file descriptors allowed in Chrome.
-  UMA_HISTOGRAM_CUSTOM_COUNTS("Mojo.System.Node.ConnectedPeers",
-                              static_cast<int32_t>(count),
-                              1 /* min */,
-                              8000 /* max */,
-                              50 /* bucket count */);
-}
-
-void RecordPendingChildCount(size_t count) {
-  DCHECK_LE(count, static_cast<size_t>(std::numeric_limits<int32_t>::max()));
-
-  // 8k is the maximum number of file descriptors allowed in Chrome.
-  UMA_HISTOGRAM_CUSTOM_COUNTS("Mojo.System.Node.PendingChildren",
-                              static_cast<int32_t>(count),
-                              1 /* min */,
-                              8000 /* max */,
-                              50 /* bucket count */);
-}
-
-bool ParsePortsMessage(Channel::Message* message,
-                       void** data,
-                       size_t* num_data_bytes,
-                       size_t* num_header_bytes,
-                       size_t* num_payload_bytes,
-                       size_t* num_ports_bytes) {
-  DCHECK(data && num_data_bytes && num_header_bytes && num_payload_bytes &&
-         num_ports_bytes);
-
-  NodeChannel::GetPortsMessageData(message, data, num_data_bytes);
-  if (!*num_data_bytes)
-    return false;
-
-  if (!ports::Message::Parse(*data, *num_data_bytes, num_header_bytes,
-                             num_payload_bytes, num_ports_bytes)) {
-    return false;
-  }
-
-  return true;
-}
-
-// Used by NodeController to watch for shutdown. Since no IO can happen once
-// the IO thread is killed, the NodeController can cleanly drop all its peers
-// at that time.
-class ThreadDestructionObserver :
-    public base::MessageLoop::DestructionObserver {
- public:
-  static void Create(scoped_refptr<base::TaskRunner> task_runner,
-                     const base::Closure& callback) {
-    if (task_runner->RunsTasksOnCurrentThread()) {
-      // Owns itself.
-      new ThreadDestructionObserver(callback);
-    } else {
-      task_runner->PostTask(FROM_HERE,
-                            base::Bind(&Create, task_runner, callback));
-    }
-  }
-
- private:
-  explicit ThreadDestructionObserver(const base::Closure& callback)
-      : callback_(callback) {
-    base::MessageLoop::current()->AddDestructionObserver(this);
-  }
-
-  ~ThreadDestructionObserver() override {
-    base::MessageLoop::current()->RemoveDestructionObserver(this);
-  }
-
-  // base::MessageLoop::DestructionObserver:
-  void WillDestroyCurrentMessageLoop() override {
-    callback_.Run();
-    delete this;
-  }
-
-  const base::Closure callback_;
-
-  DISALLOW_COPY_AND_ASSIGN(ThreadDestructionObserver);
-};
-
-}  // namespace
-
-NodeController::~NodeController() {}
-
-NodeController::NodeController(Core* core)
-    : core_(core),
-      name_(GetRandomNodeName()),
-      node_(new ports::Node(name_, this)) {
-  DVLOG(1) << "Initializing node " << name_;
-}
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-void NodeController::CreateMachPortRelay(
-    base::PortProvider* port_provider) {
-  base::AutoLock lock(mach_port_relay_lock_);
-  DCHECK(!mach_port_relay_);
-  mach_port_relay_.reset(new MachPortRelay(port_provider));
-}
-#endif
-
-void NodeController::SetIOTaskRunner(
-    scoped_refptr<base::TaskRunner> task_runner) {
-  io_task_runner_ = task_runner;
-  ThreadDestructionObserver::Create(
-      io_task_runner_,
-      base::Bind(&NodeController::DropAllPeers, base::Unretained(this)));
-}
-
-void NodeController::ConnectToChild(
-    base::ProcessHandle process_handle,
-    ConnectionParams connection_params,
-    const std::string& child_token,
-    const ProcessErrorCallback& process_error_callback) {
-  // Generate the temporary remote node name here so that it can be associated
-  // with the embedder's child_token. If an error occurs in the child process
-  // after it is launched, but before any reserved ports are connected, this can
-  // be used to clean up any dangling ports.
-  ports::NodeName node_name;
-  GenerateRandomName(&node_name);
-
-  {
-    base::AutoLock lock(reserved_ports_lock_);
-    bool inserted = pending_child_tokens_.insert(
-        std::make_pair(node_name, child_token)).second;
-    DCHECK(inserted);
-  }
-
-#if defined(OS_WIN)
-  // On Windows, we need to duplicate the process handle because we have no
-  // control over its lifetime and it may become invalid by the time the posted
-  // task runs.
-  HANDLE dup_handle = INVALID_HANDLE_VALUE;
-  BOOL ok = ::DuplicateHandle(
-      base::GetCurrentProcessHandle(), process_handle,
-      base::GetCurrentProcessHandle(), &dup_handle,
-      0, FALSE, DUPLICATE_SAME_ACCESS);
-  DPCHECK(ok);
-  process_handle = dup_handle;
-#endif
-
-  io_task_runner_->PostTask(
-      FROM_HERE, base::Bind(&NodeController::ConnectToChildOnIOThread,
-                            base::Unretained(this), process_handle,
-                            base::Passed(&connection_params), node_name,
-                            process_error_callback));
-}
-
-void NodeController::CloseChildPorts(const std::string& child_token) {
-  std::vector<ports::PortRef> ports_to_close;
-  {
-    std::vector<std::string> port_tokens;
-    base::AutoLock lock(reserved_ports_lock_);
-    for (const auto& port : reserved_ports_) {
-      if (port.second.child_token == child_token) {
-        DVLOG(1) << "Closing reserved port " << port.second.port.name();
-        ports_to_close.push_back(port.second.port);
-        port_tokens.push_back(port.first);
-      }
-    }
-
-    for (const auto& token : port_tokens)
-      reserved_ports_.erase(token);
-  }
-
-  for (const auto& port : ports_to_close)
-    node_->ClosePort(port);
-
-  // Ensure local port closure messages are processed.
-  AcceptIncomingMessages();
-}
-
-void NodeController::ClosePeerConnection(const std::string& peer_token) {
-  io_task_runner_->PostTask(
-      FROM_HERE, base::Bind(&NodeController::ClosePeerConnectionOnIOThread,
-                            base::Unretained(this), peer_token));
-}
-
-void NodeController::ConnectToParent(ConnectionParams connection_params) {
-#if !defined(OS_MACOSX) && !defined(OS_NACL_SFI)
-  // Use the bootstrap channel for the broker and receive the node's channel
-  // synchronously as the first message from the broker.
-  base::ElapsedTimer timer;
-  broker_.reset(new Broker(connection_params.TakeChannelHandle()));
-  ScopedPlatformHandle platform_handle = broker_->GetParentPlatformHandle();
-  UMA_HISTOGRAM_TIMES("Mojo.System.GetParentPlatformHandleSyncTime",
-                      timer.Elapsed());
-
-  if (!platform_handle.is_valid()) {
-    // Most likely the browser side of the channel has already been closed and
-    // the broker was unable to negotiate a NodeChannel pipe. In this case we
-    // can cancel parent connection.
-    DVLOG(1) << "Cannot connect to invalid parent channel.";
-    CancelPendingPortMerges();
-    return;
-  }
-  connection_params = ConnectionParams(std::move(platform_handle));
-#endif
-
-  io_task_runner_->PostTask(
-      FROM_HERE,
-      base::Bind(&NodeController::ConnectToParentOnIOThread,
-                 base::Unretained(this), base::Passed(&connection_params)));
-}
-
-void NodeController::ConnectToPeer(ConnectionParams connection_params,
-                                   const ports::PortRef& port,
-                                   const std::string& peer_token) {
-  ports::NodeName node_name;
-  GenerateRandomName(&node_name);
-  io_task_runner_->PostTask(
-      FROM_HERE,
-      base::Bind(&NodeController::ConnectToPeerOnIOThread,
-                 base::Unretained(this), base::Passed(&connection_params),
-                 node_name, port, peer_token));
-}
-
-void NodeController::SetPortObserver(const ports::PortRef& port,
-                                     scoped_refptr<PortObserver> observer) {
-  node_->SetUserData(port, std::move(observer));
-}
-
-void NodeController::ClosePort(const ports::PortRef& port) {
-  SetPortObserver(port, nullptr);
-  int rv = node_->ClosePort(port);
-  DCHECK_EQ(rv, ports::OK) << " Failed to close port: " << port.name();
-
-  AcceptIncomingMessages();
-}
-
-int NodeController::SendMessage(const ports::PortRef& port,
-                                std::unique_ptr<PortsMessage> message) {
-  ports::ScopedMessage ports_message(message.release());
-  int rv = node_->SendMessage(port, std::move(ports_message));
-
-  AcceptIncomingMessages();
-  return rv;
-}
-
-void NodeController::ReservePort(const std::string& token,
-                                 const ports::PortRef& port,
-                                 const std::string& child_token) {
-  DVLOG(2) << "Reserving port " << port.name() << "@" << name_ << " for token "
-           << token;
-
-  base::AutoLock lock(reserved_ports_lock_);
-  auto result = reserved_ports_.insert(
-      std::make_pair(token, ReservedPort{port, child_token}));
-  DCHECK(result.second);
-}
-
-void NodeController::MergePortIntoParent(const std::string& token,
-                                         const ports::PortRef& port) {
-  bool was_merged = false;
-  {
-    // This request may be coming from within the process that reserved the
-    // "parent" side (e.g. for Chrome single-process mode), so if this token is
-    // reserved locally, merge locally instead.
-    base::AutoLock lock(reserved_ports_lock_);
-    auto it = reserved_ports_.find(token);
-    if (it != reserved_ports_.end()) {
-      node_->MergePorts(port, name_, it->second.port.name());
-      reserved_ports_.erase(it);
-      was_merged = true;
-    }
-  }
-  if (was_merged) {
-    AcceptIncomingMessages();
-    return;
-  }
-
-  scoped_refptr<NodeChannel> parent;
-  bool reject_merge = false;
-  {
-    // Hold |pending_port_merges_lock_| while getting |parent|. Otherwise,
-    // there is a race where the parent can be set, and |pending_port_merges_|
-    // be processed between retrieving |parent| and adding the merge to
-    // |pending_port_merges_|.
-    base::AutoLock lock(pending_port_merges_lock_);
-    parent = GetParentChannel();
-    if (reject_pending_merges_) {
-      reject_merge = true;
-    } else if (!parent) {
-      pending_port_merges_.push_back(std::make_pair(token, port));
-      return;
-    }
-  }
-  if (reject_merge) {
-    node_->ClosePort(port);
-    DVLOG(2) << "Rejecting port merge for token " << token
-             << " due to closed parent channel.";
-    AcceptIncomingMessages();
-    return;
-  }
-
-  parent->RequestPortMerge(port.name(), token);
-}
-
-int NodeController::MergeLocalPorts(const ports::PortRef& port0,
-                                    const ports::PortRef& port1) {
-  int rv = node_->MergeLocalPorts(port0, port1);
-  AcceptIncomingMessages();
-  return rv;
-}
-
-scoped_refptr<PlatformSharedBuffer> NodeController::CreateSharedBuffer(
-    size_t num_bytes) {
-#if !defined(OS_MACOSX) && !defined(OS_NACL_SFI)
-  // Shared buffer creation failure is fatal, so always use the broker when we
-  // have one. This does mean that a non-root process that has children will use
-  // the broker for shared buffer creation even though that process is
-  // privileged.
-  if (broker_) {
-    return broker_->GetSharedBuffer(num_bytes);
-  }
-#endif
-  return PlatformSharedBuffer::Create(num_bytes);
-}
-
-void NodeController::RequestShutdown(const base::Closure& callback) {
-  {
-    base::AutoLock lock(shutdown_lock_);
-    shutdown_callback_ = callback;
-    shutdown_callback_flag_.Set(true);
-  }
-
-  AttemptShutdownIfRequested();
-}
-
-void NodeController::NotifyBadMessageFrom(const ports::NodeName& source_node,
-                                          const std::string& error) {
-  scoped_refptr<NodeChannel> peer = GetPeerChannel(source_node);
-  if (peer)
-    peer->NotifyBadMessage(error);
-}
-
-void NodeController::ConnectToChildOnIOThread(
-    base::ProcessHandle process_handle,
-    ConnectionParams connection_params,
-    ports::NodeName token,
-    const ProcessErrorCallback& process_error_callback) {
-  DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
-
-#if !defined(OS_MACOSX) && !defined(OS_NACL)
-  PlatformChannelPair node_channel;
-  ScopedPlatformHandle server_handle = node_channel.PassServerHandle();
-  // BrokerHost owns itself.
-  BrokerHost* broker_host =
-      new BrokerHost(process_handle, connection_params.TakeChannelHandle());
-  bool channel_ok = broker_host->SendChannel(node_channel.PassClientHandle());
-
-#if defined(OS_WIN)
-  if (!channel_ok) {
-    // On Windows the above operation may fail if the channel is crossing a
-    // session boundary. In that case we fall back to a named pipe.
-    NamedPlatformChannelPair named_channel;
-    server_handle = named_channel.PassServerHandle();
-    broker_host->SendNamedChannel(named_channel.handle().name);
-  }
-#else
-  CHECK(channel_ok);
-#endif  // defined(OS_WIN)
-
-  scoped_refptr<NodeChannel> channel =
-      NodeChannel::Create(this, ConnectionParams(std::move(server_handle)),
-                          io_task_runner_, process_error_callback);
-
-#else  // !defined(OS_MACOSX) && !defined(OS_NACL)
-  scoped_refptr<NodeChannel> channel =
-      NodeChannel::Create(this, std::move(connection_params), io_task_runner_,
-                          process_error_callback);
-#endif  // !defined(OS_MACOSX) && !defined(OS_NACL)
-
-  // We set up the child channel with a temporary name so it can be identified
-  // as a pending child if it writes any messages to the channel. We may start
-  // receiving messages from it (though we shouldn't) as soon as Start() is
-  // called below.
-
-  pending_children_.insert(std::make_pair(token, channel));
-  RecordPendingChildCount(pending_children_.size());
-
-  channel->SetRemoteNodeName(token);
-  channel->SetRemoteProcessHandle(process_handle);
-  channel->Start();
-
-  channel->AcceptChild(name_, token);
-}
-
-void NodeController::ConnectToParentOnIOThread(
-    ConnectionParams connection_params) {
-  DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
-
-  {
-    base::AutoLock lock(parent_lock_);
-    DCHECK(parent_name_ == ports::kInvalidNodeName);
-
-    // At this point we don't know the parent's name, so we can't yet insert it
-    // into our |peers_| map. That will happen as soon as we receive an
-    // AcceptChild message from them.
-    bootstrap_parent_channel_ =
-        NodeChannel::Create(this, std::move(connection_params), io_task_runner_,
-                            ProcessErrorCallback());
-    // Prevent the parent pipe handle from being closed on shutdown. Pipe
-    // closure is used by the parent to detect the child process has exited.
-    // Relying on message pipes to be closed is not enough because the parent
-    // may see the message pipe closure before the child is dead, causing the
-    // child process to be unexpectedly SIGKILL'd.
-    bootstrap_parent_channel_->LeakHandleOnShutdown();
-  }
-  bootstrap_parent_channel_->Start();
-}
-
-void NodeController::ConnectToPeerOnIOThread(ConnectionParams connection_params,
-                                             ports::NodeName token,
-                                             ports::PortRef port,
-                                             const std::string& peer_token) {
-  DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
-
-  scoped_refptr<NodeChannel> channel = NodeChannel::Create(
-      this, std::move(connection_params), io_task_runner_, {});
-  peer_connections_.insert(
-      {token, PeerConnection{channel, port, peer_token}});
-  peers_by_token_.insert({peer_token, token});
-
-  channel->SetRemoteNodeName(token);
-  channel->Start();
-
-  channel->AcceptPeer(name_, token, port.name());
-}
-
-void NodeController::ClosePeerConnectionOnIOThread(
-    const std::string& peer_token) {
-  RequestContext request_context(RequestContext::Source::SYSTEM);
-  auto peer = peers_by_token_.find(peer_token);
-  // The connection may already be closed.
-  if (peer == peers_by_token_.end())
-    return;
-
-  // |peer| may be removed so make a copy of |name|.
-  ports::NodeName name = peer->second;
-  DropPeer(name, nullptr);
-}
-
-scoped_refptr<NodeChannel> NodeController::GetPeerChannel(
-    const ports::NodeName& name) {
-  base::AutoLock lock(peers_lock_);
-  auto it = peers_.find(name);
-  if (it == peers_.end())
-    return nullptr;
-  return it->second;
-}
-
-scoped_refptr<NodeChannel> NodeController::GetParentChannel() {
-  ports::NodeName parent_name;
-  {
-    base::AutoLock lock(parent_lock_);
-    parent_name = parent_name_;
-  }
-  return GetPeerChannel(parent_name);
-}
-
-scoped_refptr<NodeChannel> NodeController::GetBrokerChannel() {
-  ports::NodeName broker_name;
-  {
-    base::AutoLock lock(broker_lock_);
-    broker_name = broker_name_;
-  }
-  return GetPeerChannel(broker_name);
-}
-
-void NodeController::AddPeer(const ports::NodeName& name,
-                             scoped_refptr<NodeChannel> channel,
-                             bool start_channel) {
-  DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
-
-  DCHECK(name != ports::kInvalidNodeName);
-  DCHECK(channel);
-
-  channel->SetRemoteNodeName(name);
-
-  OutgoingMessageQueue pending_messages;
-  {
-    base::AutoLock lock(peers_lock_);
-    if (peers_.find(name) != peers_.end()) {
-      // This can happen normally if two nodes race to be introduced to each
-      // other. The losing pipe will be silently closed and introduction should
-      // not be affected.
-      DVLOG(1) << "Ignoring duplicate peer name " << name;
-      return;
-    }
-
-    auto result = peers_.insert(std::make_pair(name, channel));
-    DCHECK(result.second);
-
-    DVLOG(2) << "Accepting new peer " << name << " on node " << name_;
-
-    RecordPeerCount(peers_.size());
-
-    auto it = pending_peer_messages_.find(name);
-    if (it != pending_peer_messages_.end()) {
-      std::swap(pending_messages, it->second);
-      pending_peer_messages_.erase(it);
-    }
-  }
-
-  if (start_channel)
-    channel->Start();
-
-  // Flush any queued message we need to deliver to this node.
-  while (!pending_messages.empty()) {
-    channel->PortsMessage(std::move(pending_messages.front()));
-    pending_messages.pop();
-  }
-}
-
-void NodeController::DropPeer(const ports::NodeName& name,
-                              NodeChannel* channel) {
-  DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
-
-  {
-    base::AutoLock lock(peers_lock_);
-    auto it = peers_.find(name);
-
-    if (it != peers_.end()) {
-      ports::NodeName peer = it->first;
-      peers_.erase(it);
-      DVLOG(1) << "Dropped peer " << peer;
-    }
-
-    pending_peer_messages_.erase(name);
-    pending_children_.erase(name);
-
-    RecordPeerCount(peers_.size());
-    RecordPendingChildCount(pending_children_.size());
-  }
-
-  std::vector<ports::PortRef> ports_to_close;
-  {
-    // Clean up any reserved ports.
-    base::AutoLock lock(reserved_ports_lock_);
-    auto it = pending_child_tokens_.find(name);
-    if (it != pending_child_tokens_.end()) {
-      const std::string& child_token = it->second;
-
-      std::vector<std::string> port_tokens;
-      for (const auto& port : reserved_ports_) {
-        if (port.second.child_token == child_token) {
-          DVLOG(1) << "Closing reserved port: " << port.second.port.name();
-          ports_to_close.push_back(port.second.port);
-          port_tokens.push_back(port.first);
-        }
-      }
-
-      // We have to erase reserved ports in a two-step manner because the usual
-      // manner of using the returned iterator from map::erase isn't technically
-      // valid in C++11 (although it is in C++14).
-      for (const auto& token : port_tokens)
-        reserved_ports_.erase(token);
-
-      pending_child_tokens_.erase(it);
-    }
-  }
-
-  bool is_parent;
-  {
-    base::AutoLock lock(parent_lock_);
-    is_parent = (name == parent_name_ || channel == bootstrap_parent_channel_);
-  }
-
-  // If the error comes from the parent channel, we also need to cancel any
-  // port merge requests, so that errors can be propagated to the message
-  // pipes.
-  if (is_parent)
-    CancelPendingPortMerges();
-
-  auto peer = peer_connections_.find(name);
-  if (peer != peer_connections_.end()) {
-    peers_by_token_.erase(peer->second.peer_token);
-    ports_to_close.push_back(peer->second.local_port);
-    peer_connections_.erase(peer);
-  }
-
-  for (const auto& port : ports_to_close)
-    node_->ClosePort(port);
-
-  node_->LostConnectionToNode(name);
-
-  AcceptIncomingMessages();
-}
-
-void NodeController::SendPeerMessage(const ports::NodeName& name,
-                                     ports::ScopedMessage message) {
-  Channel::MessagePtr channel_message =
-      static_cast<PortsMessage*>(message.get())->TakeChannelMessage();
-
-  scoped_refptr<NodeChannel> peer = GetPeerChannel(name);
-#if defined(OS_WIN)
-  if (channel_message->has_handles()) {
-    // If we're sending a message with handles we aren't the destination
-    // node's parent or broker (i.e. we don't know its process handle), ask
-    // the broker to relay for us.
-    scoped_refptr<NodeChannel> broker = GetBrokerChannel();
-    if (!peer || !peer->HasRemoteProcessHandle()) {
-      if (broker) {
-        broker->RelayPortsMessage(name, std::move(channel_message));
-      } else {
-        base::AutoLock lock(broker_lock_);
-        pending_relay_messages_[name].emplace(std::move(channel_message));
-      }
-      return;
-    }
-  }
-#elif defined(OS_MACOSX) && !defined(OS_IOS)
-  if (channel_message->has_mach_ports()) {
-    // Messages containing Mach ports are always routed through the broker, even
-    // if the broker process is the intended recipient.
-    bool use_broker = false;
-    {
-      base::AutoLock lock(parent_lock_);
-      use_broker = (bootstrap_parent_channel_ ||
-                    parent_name_ != ports::kInvalidNodeName);
-    }
-    if (use_broker) {
-      scoped_refptr<NodeChannel> broker = GetBrokerChannel();
-      if (broker) {
-        broker->RelayPortsMessage(name, std::move(channel_message));
-      } else {
-        base::AutoLock lock(broker_lock_);
-        pending_relay_messages_[name].emplace(std::move(channel_message));
-      }
-      return;
-    }
-  }
-#endif  // defined(OS_WIN)
-
-  if (peer) {
-    peer->PortsMessage(std::move(channel_message));
-    return;
-  }
-
-  // If we don't know who the peer is and we are the broker, we can only assume
-  // the peer is invalid, i.e., it's either a junk name or has already been
-  // disconnected.
-  scoped_refptr<NodeChannel> broker = GetBrokerChannel();
-  if (!broker) {
-    DVLOG(1) << "Dropping message for unknown peer: " << name;
-    return;
-  }
-
-  // If we aren't the broker, assume we just need to be introduced and queue
-  // until that can be either confirmed or denied by the broker.
-  bool needs_introduction = false;
-  {
-    base::AutoLock lock(peers_lock_);
-    auto& queue = pending_peer_messages_[name];
-    needs_introduction = queue.empty();
-    queue.emplace(std::move(channel_message));
-  }
-  if (needs_introduction)
-    broker->RequestIntroduction(name);
-}
-
-void NodeController::AcceptIncomingMessages() {
-  // This is an impactically large value which should never be reached in
-  // practice. See the CHECK below for usage.
-  constexpr size_t kMaxAcceptedMessages = 1000000;
-
-  size_t num_messages_accepted = 0;
-  while (incoming_messages_flag_) {
-    // TODO: We may need to be more careful to avoid starving the rest of the
-    // thread here. Revisit this if it turns out to be a problem. One
-    // alternative would be to schedule a task to continue pumping messages
-    // after flushing once.
-
-    messages_lock_.Acquire();
-    if (incoming_messages_.empty()) {
-      messages_lock_.Release();
-      break;
-    }
-
-    // libstdc++'s deque creates an internal buffer on construction, even when
-    // the size is 0. So avoid creating it until it is necessary.
-    std::queue<ports::ScopedMessage> messages;
-    std::swap(messages, incoming_messages_);
-    incoming_messages_flag_.Set(false);
-    messages_lock_.Release();
-
-    num_messages_accepted += messages.size();
-    while (!messages.empty()) {
-      node_->AcceptMessage(std::move(messages.front()));
-      messages.pop();
-    }
-
-    // This is effectively a safeguard against potential bugs which might lead
-    // to runaway message cycles. If any such cycles arise, we'll start seeing
-    // crash reports from this location.
-    CHECK_LE(num_messages_accepted, kMaxAcceptedMessages);
-  }
-
-  if (num_messages_accepted >= 4) {
-    // Note: We avoid logging this histogram for the vast majority of cases.
-    // See https://crbug.com/685763 for more context.
-    UMA_HISTOGRAM_CUSTOM_COUNTS("Mojo.System.MessagesAcceptedPerEvent",
-                                static_cast<int32_t>(num_messages_accepted),
-                                1 /* min */,
-                                500 /* max */,
-                                50 /* bucket count */);
-  }
-
-  AttemptShutdownIfRequested();
-}
-
-void NodeController::ProcessIncomingMessages() {
-  RequestContext request_context(RequestContext::Source::SYSTEM);
-
-  {
-    base::AutoLock lock(messages_lock_);
-    // Allow a new incoming messages processing task to be posted. This can't be
-    // done after AcceptIncomingMessages() otherwise a message might be missed.
-    // Doing it here may result in at most two tasks existing at the same time;
-    // this running one, and one pending in the task runner.
-    incoming_messages_task_posted_ = false;
-  }
-
-  AcceptIncomingMessages();
-}
-
-void NodeController::DropAllPeers() {
-  DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
-
-  std::vector<scoped_refptr<NodeChannel>> all_peers;
-  {
-    base::AutoLock lock(parent_lock_);
-    if (bootstrap_parent_channel_) {
-      // |bootstrap_parent_channel_| isn't null'd here becuase we rely on its
-      // existence to determine whether or not this is the root node. Once
-      // bootstrap_parent_channel_->ShutDown() has been called,
-      // |bootstrap_parent_channel_| is essentially a dead object and it doesn't
-      // matter if it's deleted now or when |this| is deleted.
-      // Note: |bootstrap_parent_channel_| is only modified on the IO thread.
-      all_peers.push_back(bootstrap_parent_channel_);
-    }
-  }
-
-  {
-    base::AutoLock lock(peers_lock_);
-    for (const auto& peer : peers_)
-      all_peers.push_back(peer.second);
-    for (const auto& peer : pending_children_)
-      all_peers.push_back(peer.second);
-    peers_.clear();
-    pending_children_.clear();
-    pending_peer_messages_.clear();
-    peer_connections_.clear();
-  }
-
-  for (const auto& peer : all_peers)
-    peer->ShutDown();
-
-  if (destroy_on_io_thread_shutdown_)
-    delete this;
-}
-
-void NodeController::GenerateRandomPortName(ports::PortName* port_name) {
-  GenerateRandomName(port_name);
-}
-
-void NodeController::AllocMessage(size_t num_header_bytes,
-                                  ports::ScopedMessage* message) {
-  message->reset(new PortsMessage(num_header_bytes, 0, 0, nullptr));
-}
-
-void NodeController::ForwardMessage(const ports::NodeName& node,
-                                    ports::ScopedMessage message) {
-  DCHECK(message);
-  bool schedule_pump_task = false;
-  if (node == name_) {
-    // NOTE: We need to avoid re-entering the Node instance within
-    // ForwardMessage. Because ForwardMessage is only ever called
-    // (synchronously) in response to Node's ClosePort, SendMessage, or
-    // AcceptMessage, we flush the queue after calling any of those methods.
-    base::AutoLock lock(messages_lock_);
-    // |io_task_runner_| may be null in tests or processes that don't require
-    // multi-process Mojo.
-    schedule_pump_task = incoming_messages_.empty() && io_task_runner_ &&
-        !incoming_messages_task_posted_;
-    incoming_messages_task_posted_ |= schedule_pump_task;
-    incoming_messages_.emplace(std::move(message));
-    incoming_messages_flag_.Set(true);
-  } else {
-    SendPeerMessage(node, std::move(message));
-  }
-
-  if (schedule_pump_task) {
-    // Normally, the queue is processed after the action that added the local
-    // message is done (i.e. SendMessage, ClosePort, etc). However, it's also
-    // possible for a local message to be added as a result of a remote message,
-    // and OnChannelMessage() doesn't process this queue (although
-    // OnPortsMessage() does). There may also be other code paths, now or added
-    // in the future, which cause local messages to be added but don't process
-    // this message queue.
-    //
-    // Instead of adding a call to AcceptIncomingMessages() on every possible
-    // code path, post a task to the IO thread to process the queue. If the
-    // current call stack processes the queue, this may end up doing nothing.
-    io_task_runner_->PostTask(
-        FROM_HERE,
-        base::Bind(&NodeController::ProcessIncomingMessages,
-                   base::Unretained(this)));
-  }
-}
-
-void NodeController::BroadcastMessage(ports::ScopedMessage message) {
-  CHECK_EQ(message->num_ports(), 0u);
-  Channel::MessagePtr channel_message =
-      static_cast<PortsMessage*>(message.get())->TakeChannelMessage();
-  CHECK(!channel_message->has_handles());
-
-  scoped_refptr<NodeChannel> broker = GetBrokerChannel();
-  if (broker)
-    broker->Broadcast(std::move(channel_message));
-  else
-    OnBroadcast(name_, std::move(channel_message));
-}
-
-void NodeController::PortStatusChanged(const ports::PortRef& port) {
-  scoped_refptr<ports::UserData> user_data;
-  node_->GetUserData(port, &user_data);
-
-  PortObserver* observer = static_cast<PortObserver*>(user_data.get());
-  if (observer) {
-    observer->OnPortStatusChanged();
-  } else {
-    DVLOG(2) << "Ignoring status change for " << port.name() << " because it "
-             << "doesn't have an observer.";
-  }
-}
-
-void NodeController::OnAcceptChild(const ports::NodeName& from_node,
-                                   const ports::NodeName& parent_name,
-                                   const ports::NodeName& token) {
-  DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
-
-  scoped_refptr<NodeChannel> parent;
-  {
-    base::AutoLock lock(parent_lock_);
-    if (bootstrap_parent_channel_ && parent_name_ == ports::kInvalidNodeName) {
-      parent_name_ = parent_name;
-      parent = bootstrap_parent_channel_;
-    }
-  }
-
-  if (!parent) {
-    DLOG(ERROR) << "Unexpected AcceptChild message from " << from_node;
-    DropPeer(from_node, nullptr);
-    return;
-  }
-
-  parent->SetRemoteNodeName(parent_name);
-  parent->AcceptParent(token, name_);
-
-  // NOTE: The child does not actually add its parent as a peer until
-  // receiving an AcceptBrokerClient message from the broker. The parent
-  // will request that said message be sent upon receiving AcceptParent.
-
-  DVLOG(1) << "Child " << name_ << " accepting parent " << parent_name;
-}
-
-void NodeController::OnAcceptParent(const ports::NodeName& from_node,
-                                    const ports::NodeName& token,
-                                    const ports::NodeName& child_name) {
-  DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
-
-  auto it = pending_children_.find(from_node);
-  if (it == pending_children_.end() || token != from_node) {
-    DLOG(ERROR) << "Received unexpected AcceptParent message from "
-                << from_node;
-    DropPeer(from_node, nullptr);
-    return;
-  }
-
-  {
-    base::AutoLock lock(reserved_ports_lock_);
-    auto it = pending_child_tokens_.find(from_node);
-    if (it != pending_child_tokens_.end()) {
-      std::string token = std::move(it->second);
-      pending_child_tokens_.erase(it);
-      pending_child_tokens_[child_name] = std::move(token);
-    }
-  }
-
-  scoped_refptr<NodeChannel> channel = it->second;
-  pending_children_.erase(it);
-
-  DCHECK(channel);
-
-  DVLOG(1) << "Parent " << name_ << " accepted child " << child_name;
-
-  AddPeer(child_name, channel, false /* start_channel */);
-
-  // TODO(rockot/amistry): We could simplify child initialization if we could
-  // synchronously get a new async broker channel from the broker. For now we do
-  // it asynchronously since it's only used to facilitate handle passing, not
-  // handle creation.
-  scoped_refptr<NodeChannel> broker = GetBrokerChannel();
-  if (broker) {
-    // Inform the broker of this new child.
-    broker->AddBrokerClient(child_name, channel->CopyRemoteProcessHandle());
-  } else {
-    // If we have no broker, either we need to wait for one, or we *are* the
-    // broker.
-    scoped_refptr<NodeChannel> parent = GetParentChannel();
-    if (!parent) {
-      base::AutoLock lock(parent_lock_);
-      parent = bootstrap_parent_channel_;
-    }
-
-    if (!parent) {
-      // Yes, we're the broker. We can initialize the child directly.
-      channel->AcceptBrokerClient(name_, ScopedPlatformHandle());
-    } else {
-      // We aren't the broker, so wait for a broker connection.
-      base::AutoLock lock(broker_lock_);
-      pending_broker_clients_.push(child_name);
-    }
-  }
-}
-
-void NodeController::OnAddBrokerClient(const ports::NodeName& from_node,
-                                       const ports::NodeName& client_name,
-                                       base::ProcessHandle process_handle) {
-#if defined(OS_WIN)
-  // Scoped handle to avoid leaks on error.
-  ScopedPlatformHandle scoped_process_handle =
-      ScopedPlatformHandle(PlatformHandle(process_handle));
-#endif
-  scoped_refptr<NodeChannel> sender = GetPeerChannel(from_node);
-  if (!sender) {
-    DLOG(ERROR) << "Ignoring AddBrokerClient from unknown sender.";
-    return;
-  }
-
-  if (GetPeerChannel(client_name)) {
-    DLOG(ERROR) << "Ignoring AddBrokerClient for known client.";
-    DropPeer(from_node, nullptr);
-    return;
-  }
-
-  PlatformChannelPair broker_channel;
-  ConnectionParams connection_params(broker_channel.PassServerHandle());
-  scoped_refptr<NodeChannel> client =
-      NodeChannel::Create(this, std::move(connection_params), io_task_runner_,
-                          ProcessErrorCallback());
-
-#if defined(OS_WIN)
-  // The broker must have a working handle to the client process in order to
-  // properly copy other handles to and from the client.
-  if (!scoped_process_handle.is_valid()) {
-    DLOG(ERROR) << "Broker rejecting client with invalid process handle.";
-    return;
-  }
-  client->SetRemoteProcessHandle(scoped_process_handle.release().handle);
-#else
-  client->SetRemoteProcessHandle(process_handle);
-#endif
-
-  AddPeer(client_name, client, true /* start_channel */);
-
-  DVLOG(1) << "Broker " << name_ << " accepting client " << client_name
-           << " from peer " << from_node;
-
-  sender->BrokerClientAdded(client_name, broker_channel.PassClientHandle());
-}
-
-void NodeController::OnBrokerClientAdded(const ports::NodeName& from_node,
-                                         const ports::NodeName& client_name,
-                                         ScopedPlatformHandle broker_channel) {
-  scoped_refptr<NodeChannel> client = GetPeerChannel(client_name);
-  if (!client) {
-    DLOG(ERROR) << "BrokerClientAdded for unknown child " << client_name;
-    return;
-  }
-
-  // This should have come from our own broker.
-  if (GetBrokerChannel() != GetPeerChannel(from_node)) {
-    DLOG(ERROR) << "BrokerClientAdded from non-broker node " << from_node;
-    return;
-  }
-
-  DVLOG(1) << "Child " << client_name << " accepted by broker " << from_node;
-
-  client->AcceptBrokerClient(from_node, std::move(broker_channel));
-}
-
-void NodeController::OnAcceptBrokerClient(const ports::NodeName& from_node,
-                                          const ports::NodeName& broker_name,
-                                          ScopedPlatformHandle broker_channel) {
-  // This node should already have a parent in bootstrap mode.
-  ports::NodeName parent_name;
-  scoped_refptr<NodeChannel> parent;
-  {
-    base::AutoLock lock(parent_lock_);
-    parent_name = parent_name_;
-    parent = bootstrap_parent_channel_;
-    bootstrap_parent_channel_ = nullptr;
-  }
-  DCHECK(parent_name == from_node);
-  DCHECK(parent);
-
-  std::queue<ports::NodeName> pending_broker_clients;
-  std::unordered_map<ports::NodeName, OutgoingMessageQueue>
-      pending_relay_messages;
-  {
-    base::AutoLock lock(broker_lock_);
-    broker_name_ = broker_name;
-    std::swap(pending_broker_clients, pending_broker_clients_);
-    std::swap(pending_relay_messages, pending_relay_messages_);
-  }
-  DCHECK(broker_name != ports::kInvalidNodeName);
-
-  // It's now possible to add both the broker and the parent as peers.
-  // Note that the broker and parent may be the same node.
-  scoped_refptr<NodeChannel> broker;
-  if (broker_name == parent_name) {
-    DCHECK(!broker_channel.is_valid());
-    broker = parent;
-  } else {
-    DCHECK(broker_channel.is_valid());
-    broker =
-        NodeChannel::Create(this, ConnectionParams(std::move(broker_channel)),
-                            io_task_runner_, ProcessErrorCallback());
-    AddPeer(broker_name, broker, true /* start_channel */);
-  }
-
-  AddPeer(parent_name, parent, false /* start_channel */);
-
-  {
-    // Complete any port merge requests we have waiting for the parent.
-    base::AutoLock lock(pending_port_merges_lock_);
-    for (const auto& request : pending_port_merges_)
-      parent->RequestPortMerge(request.second.name(), request.first);
-    pending_port_merges_.clear();
-  }
-
-  // Feed the broker any pending children of our own.
-  while (!pending_broker_clients.empty()) {
-    const ports::NodeName& child_name = pending_broker_clients.front();
-    auto it = pending_children_.find(child_name);
-    DCHECK(it != pending_children_.end());
-    broker->AddBrokerClient(child_name, it->second->CopyRemoteProcessHandle());
-    pending_broker_clients.pop();
-  }
-
-#if defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS))
-  // Have the broker relay any messages we have waiting.
-  for (auto& entry : pending_relay_messages) {
-    const ports::NodeName& destination = entry.first;
-    auto& message_queue = entry.second;
-    while (!message_queue.empty()) {
-      broker->RelayPortsMessage(destination, std::move(message_queue.front()));
-      message_queue.pop();
-    }
-  }
-#endif
-
-  DVLOG(1) << "Child " << name_ << " accepted by broker " << broker_name;
-}
-
-void NodeController::OnPortsMessage(const ports::NodeName& from_node,
-                                    Channel::MessagePtr channel_message) {
-  DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
-
-  void* data;
-  size_t num_data_bytes, num_header_bytes, num_payload_bytes, num_ports_bytes;
-  if (!ParsePortsMessage(channel_message.get(), &data, &num_data_bytes,
-                         &num_header_bytes, &num_payload_bytes,
-                         &num_ports_bytes)) {
-    DropPeer(from_node, nullptr);
-    return;
-  }
-
-  CHECK(channel_message);
-  std::unique_ptr<PortsMessage> ports_message(
-      new PortsMessage(num_header_bytes,
-                       num_payload_bytes,
-                       num_ports_bytes,
-                       std::move(channel_message)));
-  ports_message->set_source_node(from_node);
-  node_->AcceptMessage(ports::ScopedMessage(ports_message.release()));
-  AcceptIncomingMessages();
-}
-
-void NodeController::OnRequestPortMerge(
-    const ports::NodeName& from_node,
-    const ports::PortName& connector_port_name,
-    const std::string& token) {
-  DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
-
-  DVLOG(2) << "Node " << name_ << " received RequestPortMerge for token "
-           << token << " and port " << connector_port_name << "@" << from_node;
-
-  ports::PortRef local_port;
-  {
-    base::AutoLock lock(reserved_ports_lock_);
-    auto it = reserved_ports_.find(token);
-    if (it == reserved_ports_.end()) {
-      DVLOG(1) << "Ignoring request to connect to port for unknown token "
-               << token;
-      return;
-    }
-    local_port = it->second.port;
-    reserved_ports_.erase(it);
-  }
-
-  int rv = node_->MergePorts(local_port, from_node, connector_port_name);
-  if (rv != ports::OK)
-    DLOG(ERROR) << "MergePorts failed: " << rv;
-
-  AcceptIncomingMessages();
-}
-
-void NodeController::OnRequestIntroduction(const ports::NodeName& from_node,
-                                           const ports::NodeName& name) {
-  DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
-
-  scoped_refptr<NodeChannel> requestor = GetPeerChannel(from_node);
-  if (from_node == name || name == ports::kInvalidNodeName || !requestor) {
-    DLOG(ERROR) << "Rejecting invalid OnRequestIntroduction message from "
-                << from_node;
-    DropPeer(from_node, nullptr);
-    return;
-  }
-
-  scoped_refptr<NodeChannel> new_friend = GetPeerChannel(name);
-  if (!new_friend) {
-    // We don't know who they're talking about!
-    requestor->Introduce(name, ScopedPlatformHandle());
-  } else {
-    PlatformChannelPair new_channel;
-    requestor->Introduce(name, new_channel.PassServerHandle());
-    new_friend->Introduce(from_node, new_channel.PassClientHandle());
-  }
-}
-
-void NodeController::OnIntroduce(const ports::NodeName& from_node,
-                                 const ports::NodeName& name,
-                                 ScopedPlatformHandle channel_handle) {
-  DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
-
-  if (!channel_handle.is_valid()) {
-    node_->LostConnectionToNode(name);
-
-    DVLOG(1) << "Could not be introduced to peer " << name;
-    base::AutoLock lock(peers_lock_);
-    pending_peer_messages_.erase(name);
-    return;
-  }
-
-  scoped_refptr<NodeChannel> channel =
-      NodeChannel::Create(this, ConnectionParams(std::move(channel_handle)),
-                          io_task_runner_, ProcessErrorCallback());
-
-  DVLOG(1) << "Adding new peer " << name << " via parent introduction.";
-  AddPeer(name, channel, true /* start_channel */);
-}
-
-void NodeController::OnBroadcast(const ports::NodeName& from_node,
-                                 Channel::MessagePtr message) {
-  DCHECK(!message->has_handles());
-
-  void* data;
-  size_t num_data_bytes, num_header_bytes, num_payload_bytes, num_ports_bytes;
-  if (!ParsePortsMessage(message.get(), &data, &num_data_bytes,
-                         &num_header_bytes, &num_payload_bytes,
-                         &num_ports_bytes)) {
-    DropPeer(from_node, nullptr);
-    return;
-  }
-
-  // Broadcast messages must not contain ports.
-  if (num_ports_bytes > 0) {
-    DropPeer(from_node, nullptr);
-    return;
-  }
-
-  base::AutoLock lock(peers_lock_);
-  for (auto& iter : peers_) {
-    // Copy and send the message to each known peer.
-    Channel::MessagePtr peer_message(
-        new Channel::Message(message->payload_size(), 0));
-    memcpy(peer_message->mutable_payload(), message->payload(),
-           message->payload_size());
-    iter.second->PortsMessage(std::move(peer_message));
-  }
-}
-
-#if defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS))
-void NodeController::OnRelayPortsMessage(const ports::NodeName& from_node,
-                                         base::ProcessHandle from_process,
-                                         const ports::NodeName& destination,
-                                         Channel::MessagePtr message) {
-  DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
-
-  if (GetBrokerChannel()) {
-    // Only the broker should be asked to relay a message.
-    LOG(ERROR) << "Non-broker refusing to relay message.";
-    DropPeer(from_node, nullptr);
-    return;
-  }
-
-  // The parent should always know which process this came from.
-  DCHECK(from_process != base::kNullProcessHandle);
-
-#if defined(OS_WIN)
-  // Rewrite the handles to this (the parent) process. If the message is
-  // destined for another child process, the handles will be rewritten to that
-  // process before going out (see NodeChannel::WriteChannelMessage).
-  //
-  // TODO: We could avoid double-duplication.
-  //
-  // Note that we explicitly mark the handles as being owned by the sending
-  // process before rewriting them, in order to accommodate RewriteHandles'
-  // internal sanity checks.
-  ScopedPlatformHandleVectorPtr handles = message->TakeHandles();
-  for (size_t i = 0; i < handles->size(); ++i)
-    (*handles)[i].owning_process = from_process;
-  if (!Channel::Message::RewriteHandles(from_process,
-                                        base::GetCurrentProcessHandle(),
-                                        handles.get())) {
-    DLOG(ERROR) << "Failed to relay one or more handles.";
-  }
-  message->SetHandles(std::move(handles));
-#else
-  MachPortRelay* relay = GetMachPortRelay();
-  if (!relay) {
-    LOG(ERROR) << "Receiving Mach ports without a port relay from "
-               << from_node << ". Dropping message.";
-    return;
-  }
-  if (!relay->ExtractPortRights(message.get(), from_process)) {
-    // NodeChannel should ensure that MachPortRelay is ready for the remote
-    // process. At this point, if the port extraction failed, either something
-    // went wrong in the mach stuff, or the remote process died.
-    LOG(ERROR) << "Error on receiving Mach ports " << from_node
-               << ". Dropping message.";
-    return;
-  }
-#endif  // defined(OS_WIN)
-
-  if (destination == name_) {
-    // Great, we can deliver this message locally.
-    OnPortsMessage(from_node, std::move(message));
-    return;
-  }
-
-  scoped_refptr<NodeChannel> peer = GetPeerChannel(destination);
-  if (peer)
-    peer->PortsMessageFromRelay(from_node, std::move(message));
-  else
-    DLOG(ERROR) << "Dropping relay message for unknown node " << destination;
-}
-
-void NodeController::OnPortsMessageFromRelay(const ports::NodeName& from_node,
-                                             const ports::NodeName& source_node,
-                                             Channel::MessagePtr message) {
-  if (GetPeerChannel(from_node) != GetBrokerChannel()) {
-    LOG(ERROR) << "Refusing relayed message from non-broker node.";
-    DropPeer(from_node, nullptr);
-    return;
-  }
-
-  OnPortsMessage(source_node, std::move(message));
-}
-#endif
-
-void NodeController::OnAcceptPeer(const ports::NodeName& from_node,
-                                  const ports::NodeName& token,
-                                  const ports::NodeName& peer_name,
-                                  const ports::PortName& port_name) {
-  DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
-
-  auto it = peer_connections_.find(from_node);
-  if (it == peer_connections_.end()) {
-    DLOG(ERROR) << "Received unexpected AcceptPeer message from " << from_node;
-    DropPeer(from_node, nullptr);
-    return;
-  }
-
-  scoped_refptr<NodeChannel> channel = std::move(it->second.channel);
-  ports::PortRef local_port = it->second.local_port;
-  std::string peer_token = std::move(it->second.peer_token);
-  peer_connections_.erase(it);
-  DCHECK(channel);
-
-  // If the peer connection is a self connection (which is used in tests),
-  // drop the channel to it and skip straight to merging the ports.
-  if (name_ == peer_name) {
-    peers_by_token_.erase(peer_token);
-  } else {
-    peers_by_token_[peer_token] = peer_name;
-    peer_connections_.insert(
-        {peer_name, PeerConnection{nullptr, local_port, peer_token}});
-    DVLOG(1) << "Node " << name_ << " accepted peer " << peer_name;
-
-    AddPeer(peer_name, channel, false /* start_channel */);
-  }
-
-  // We need to choose one side to initiate the port merge. It doesn't matter
-  // who does it as long as they don't both try. Simple solution: pick the one
-  // with the "smaller" port name.
-  if (local_port.name() < port_name) {
-    node()->MergePorts(local_port, peer_name, port_name);
-  }
-}
-
-void NodeController::OnChannelError(const ports::NodeName& from_node,
-                                    NodeChannel* channel) {
-  if (io_task_runner_->RunsTasksOnCurrentThread()) {
-    DropPeer(from_node, channel);
-    // DropPeer may have caused local port closures, so be sure to process any
-    // pending local messages.
-    AcceptIncomingMessages();
-  } else {
-    io_task_runner_->PostTask(
-        FROM_HERE,
-        base::Bind(&NodeController::OnChannelError, base::Unretained(this),
-                   from_node, channel));
-  }
-}
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-MachPortRelay* NodeController::GetMachPortRelay() {
-  {
-    base::AutoLock lock(parent_lock_);
-    // Return null if we're not the root.
-    if (bootstrap_parent_channel_ || parent_name_ != ports::kInvalidNodeName)
-      return nullptr;
-  }
-
-  base::AutoLock lock(mach_port_relay_lock_);
-  return mach_port_relay_.get();
-}
-#endif
-
-void NodeController::CancelPendingPortMerges() {
-  std::vector<ports::PortRef> ports_to_close;
-
-  {
-    base::AutoLock lock(pending_port_merges_lock_);
-    reject_pending_merges_ = true;
-    for (const auto& port : pending_port_merges_)
-      ports_to_close.push_back(port.second);
-    pending_port_merges_.clear();
-  }
-
-  for (const auto& port : ports_to_close)
-    node_->ClosePort(port);
-}
-
-void NodeController::DestroyOnIOThreadShutdown() {
-  destroy_on_io_thread_shutdown_ = true;
-}
-
-void NodeController::AttemptShutdownIfRequested() {
-  if (!shutdown_callback_flag_)
-    return;
-
-  base::Closure callback;
-  {
-    base::AutoLock lock(shutdown_lock_);
-    if (shutdown_callback_.is_null())
-      return;
-    if (!node_->CanShutdownCleanly(
-          ports::Node::ShutdownPolicy::ALLOW_LOCAL_PORTS)) {
-      DVLOG(2) << "Unable to cleanly shut down node " << name_;
-      return;
-    }
-
-    callback = shutdown_callback_;
-    shutdown_callback_.Reset();
-    shutdown_callback_flag_.Set(false);
-  }
-
-  DCHECK(!callback.is_null());
-
-  callback.Run();
-}
-
-NodeController::PeerConnection::PeerConnection() = default;
-
-NodeController::PeerConnection::PeerConnection(
-    const PeerConnection& other) = default;
-
-NodeController::PeerConnection::PeerConnection(
-    PeerConnection&& other) = default;
-
-NodeController::PeerConnection::PeerConnection(
-    scoped_refptr<NodeChannel> channel,
-    const ports::PortRef& local_port,
-    const std::string& peer_token)
-    : channel(std::move(channel)),
-      local_port(local_port),
-      peer_token(peer_token) {}
-
-NodeController::PeerConnection::~PeerConnection() = default;
-
-NodeController::PeerConnection& NodeController::PeerConnection::
-operator=(const PeerConnection& other) = default;
-
-NodeController::PeerConnection& NodeController::PeerConnection::
-operator=(PeerConnection&& other) = default;
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/node_controller.h b/mojo/edk/system/node_controller.h
deleted file mode 100644
index 46a2d61..0000000
--- a/mojo/edk/system/node_controller.h
+++ /dev/null
@@ -1,378 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_SYSTEM_NODE_CONTROLLER_H_
-#define MOJO_EDK_SYSTEM_NODE_CONTROLLER_H_
-
-#include <memory>
-#include <queue>
-#include <unordered_map>
-#include <unordered_set>
-#include <utility>
-#include <vector>
-
-#include "base/callback.h"
-#include "base/containers/hash_tables.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/task_runner.h"
-#include "mojo/edk/embedder/platform_handle_vector.h"
-#include "mojo/edk/embedder/platform_shared_buffer.h"
-#include "mojo/edk/embedder/scoped_platform_handle.h"
-#include "mojo/edk/system/atomic_flag.h"
-#include "mojo/edk/system/node_channel.h"
-#include "mojo/edk/system/ports/name.h"
-#include "mojo/edk/system/ports/node.h"
-#include "mojo/edk/system/ports/node_delegate.h"
-
-namespace base {
-class PortProvider;
-}
-
-namespace mojo {
-namespace edk {
-
-class Broker;
-class Core;
-class MachPortRelay;
-class PortsMessage;
-
-// The owner of ports::Node which facilitates core EDK implementation. All
-// public interface methods are safe to call from any thread.
-class NodeController : public ports::NodeDelegate,
-                       public NodeChannel::Delegate {
- public:
-  class PortObserver : public ports::UserData {
-   public:
-    virtual void OnPortStatusChanged() = 0;
-
-   protected:
-    ~PortObserver() override {}
-  };
-
-  // |core| owns and out-lives us.
-  explicit NodeController(Core* core);
-  ~NodeController() override;
-
-  const ports::NodeName& name() const { return name_; }
-  Core* core() const { return core_; }
-  ports::Node* node() const { return node_.get(); }
-  scoped_refptr<base::TaskRunner> io_task_runner() const {
-    return io_task_runner_;
-  }
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-  // Create the relay used to transfer mach ports between processes.
-  void CreateMachPortRelay(base::PortProvider* port_provider);
-#endif
-
-  // Called exactly once, shortly after construction, and before any other
-  // methods are called on this object.
-  void SetIOTaskRunner(scoped_refptr<base::TaskRunner> io_task_runner);
-
-  // Connects this node to a child node. This node will initiate a handshake.
-  void ConnectToChild(base::ProcessHandle process_handle,
-                      ConnectionParams connection_params,
-                      const std::string& child_token,
-                      const ProcessErrorCallback& process_error_callback);
-
-  // Closes all reserved ports which associated with the child process
-  // |child_token|.
-  void CloseChildPorts(const std::string& child_token);
-
-  // Close a connection to a peer associated with |peer_token|.
-  void ClosePeerConnection(const std::string& peer_token);
-
-  // Connects this node to a parent node. The parent node will initiate a
-  // handshake.
-  void ConnectToParent(ConnectionParams connection_params);
-
-  // Connects this node to a peer node. On success, |port| will be merged with
-  // the corresponding port in the peer node.
-  void ConnectToPeer(ConnectionParams connection_params,
-                     const ports::PortRef& port,
-                     const std::string& peer_token);
-
-  // Sets a port's observer. If |observer| is null the port's current observer
-  // is removed.
-  void SetPortObserver(const ports::PortRef& port,
-                       scoped_refptr<PortObserver> observer);
-
-  // Closes a port. Use this in lieu of calling Node::ClosePort() directly, as
-  // it ensures the port's observer has also been removed.
-  void ClosePort(const ports::PortRef& port);
-
-  // Sends a message on a port to its peer.
-  int SendMessage(const ports::PortRef& port_ref,
-                  std::unique_ptr<PortsMessage> message);
-
-  // Reserves a local port |port| associated with |token|. A peer holding a copy
-  // of |token| can merge one of its own ports into this one.
-  void ReservePort(const std::string& token, const ports::PortRef& port,
-                   const std::string& child_token);
-
-  // Merges a local port |port| into a port reserved by |token| in the parent.
-  void MergePortIntoParent(const std::string& token,
-                           const ports::PortRef& port);
-
-  // Merges two local ports together.
-  int MergeLocalPorts(const ports::PortRef& port0, const ports::PortRef& port1);
-
-  // Creates a new shared buffer for use in the current process.
-  scoped_refptr<PlatformSharedBuffer> CreateSharedBuffer(size_t num_bytes);
-
-  // Request that the Node be shut down cleanly. This may take an arbitrarily
-  // long time to complete, at which point |callback| will be called.
-  //
-  // Note that while it is safe to continue using the NodeController's public
-  // interface after requesting shutdown, you do so at your own risk and there
-  // is NO guarantee that new messages will be sent or ports will complete
-  // transfer.
-  void RequestShutdown(const base::Closure& callback);
-
-  // Notifies the NodeController that we received a bad message from the given
-  // node.
-  void NotifyBadMessageFrom(const ports::NodeName& source_node,
-                            const std::string& error);
-
- private:
-  friend Core;
-
-  using NodeMap = std::unordered_map<ports::NodeName,
-                                     scoped_refptr<NodeChannel>>;
-  using OutgoingMessageQueue = std::queue<Channel::MessagePtr>;
-
-  struct ReservedPort {
-    ports::PortRef port;
-    const std::string child_token;
-  };
-
-  struct PeerConnection {
-    PeerConnection();
-    PeerConnection(const PeerConnection& other);
-    PeerConnection(PeerConnection&& other);
-    PeerConnection(scoped_refptr<NodeChannel> channel,
-                   const ports::PortRef& local_port,
-                   const std::string& peer_token);
-    ~PeerConnection();
-
-    PeerConnection& operator=(const PeerConnection& other);
-    PeerConnection& operator=(PeerConnection&& other);
-
-
-    scoped_refptr<NodeChannel> channel;
-    ports::PortRef local_port;
-    std::string peer_token;
-  };
-
-  void ConnectToChildOnIOThread(
-      base::ProcessHandle process_handle,
-      ConnectionParams connection_params,
-      ports::NodeName token,
-      const ProcessErrorCallback& process_error_callback);
-  void ConnectToParentOnIOThread(ConnectionParams connection_params);
-
-  void ConnectToPeerOnIOThread(ConnectionParams connection_params,
-                               ports::NodeName token,
-                               ports::PortRef port,
-                               const std::string& peer_token);
-  void ClosePeerConnectionOnIOThread(const std::string& node_name);
-
-  scoped_refptr<NodeChannel> GetPeerChannel(const ports::NodeName& name);
-  scoped_refptr<NodeChannel> GetParentChannel();
-  scoped_refptr<NodeChannel> GetBrokerChannel();
-
-  void AddPeer(const ports::NodeName& name,
-               scoped_refptr<NodeChannel> channel,
-               bool start_channel);
-  void DropPeer(const ports::NodeName& name, NodeChannel* channel);
-  void SendPeerMessage(const ports::NodeName& name,
-                       ports::ScopedMessage message);
-  void AcceptIncomingMessages();
-  void ProcessIncomingMessages();
-  void DropAllPeers();
-
-  // ports::NodeDelegate:
-  void GenerateRandomPortName(ports::PortName* port_name) override;
-  void AllocMessage(size_t num_header_bytes,
-                    ports::ScopedMessage* message) override;
-  void ForwardMessage(const ports::NodeName& node,
-                      ports::ScopedMessage message) override;
-  void BroadcastMessage(ports::ScopedMessage message) override;
-  void PortStatusChanged(const ports::PortRef& port) override;
-
-  // NodeChannel::Delegate:
-  void OnAcceptChild(const ports::NodeName& from_node,
-                     const ports::NodeName& parent_name,
-                     const ports::NodeName& token) override;
-  void OnAcceptParent(const ports::NodeName& from_node,
-                      const ports::NodeName& token,
-                      const ports::NodeName& child_name) override;
-  void OnAddBrokerClient(const ports::NodeName& from_node,
-                         const ports::NodeName& client_name,
-                         base::ProcessHandle process_handle) override;
-  void OnBrokerClientAdded(const ports::NodeName& from_node,
-                           const ports::NodeName& client_name,
-                           ScopedPlatformHandle broker_channel) override;
-  void OnAcceptBrokerClient(const ports::NodeName& from_node,
-                            const ports::NodeName& broker_name,
-                            ScopedPlatformHandle broker_channel) override;
-  void OnPortsMessage(const ports::NodeName& from_node,
-                      Channel::MessagePtr message) override;
-  void OnRequestPortMerge(const ports::NodeName& from_node,
-                          const ports::PortName& connector_port_name,
-                          const std::string& token) override;
-  void OnRequestIntroduction(const ports::NodeName& from_node,
-                             const ports::NodeName& name) override;
-  void OnIntroduce(const ports::NodeName& from_node,
-                   const ports::NodeName& name,
-                   ScopedPlatformHandle channel_handle) override;
-  void OnBroadcast(const ports::NodeName& from_node,
-                   Channel::MessagePtr message) override;
-#if defined(OS_WIN) || (defined(OS_MACOSX) && !defined(OS_IOS))
-  void OnRelayPortsMessage(const ports::NodeName& from_node,
-                           base::ProcessHandle from_process,
-                           const ports::NodeName& destination,
-                           Channel::MessagePtr message) override;
-  void OnPortsMessageFromRelay(const ports::NodeName& from_node,
-                               const ports::NodeName& source_node,
-                               Channel::MessagePtr message) override;
-#endif
-  void OnAcceptPeer(const ports::NodeName& from_node,
-                    const ports::NodeName& token,
-                    const ports::NodeName& peer_name,
-                    const ports::PortName& port_name) override;
-  void OnChannelError(const ports::NodeName& from_node,
-                      NodeChannel* channel) override;
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-  MachPortRelay* GetMachPortRelay() override;
-#endif
-
-  // Cancels all pending port merges. These are merges which are supposed to
-  // be requested from the parent ASAP, and they may be cancelled if the
-  // connection to the parent is broken or never established.
-  void CancelPendingPortMerges();
-
-  // Marks this NodeController for destruction when the IO thread shuts down.
-  // This is used in case Core is torn down before the IO thread. Must only be
-  // called on the IO thread.
-  void DestroyOnIOThreadShutdown();
-
-  // If there is a registered shutdown callback (meaning shutdown has been
-  // requested, this checks the Node's status to see if clean shutdown is
-  // possible. If so, shutdown is performed and the shutdown callback is run.
-  void AttemptShutdownIfRequested();
-
-  // These are safe to access from any thread as long as the Node is alive.
-  Core* const core_;
-  const ports::NodeName name_;
-  const std::unique_ptr<ports::Node> node_;
-  scoped_refptr<base::TaskRunner> io_task_runner_;
-
-  // Guards |peers_| and |pending_peer_messages_|.
-  base::Lock peers_lock_;
-
-  // Channels to known peers, including parent and children, if any.
-  NodeMap peers_;
-
-  // Outgoing message queues for peers we've heard of but can't yet talk to.
-  std::unordered_map<ports::NodeName, OutgoingMessageQueue>
-      pending_peer_messages_;
-
-  // Guards |reserved_ports_| and |pending_child_tokens_|.
-  base::Lock reserved_ports_lock_;
-
-  // Ports reserved by token. Key is the port token.
-  base::hash_map<std::string, ReservedPort> reserved_ports_;
-  // TODO(amistry): This _really_ needs to be a bimap. Unfortunately, we don't
-  // have one yet :(
-  std::unordered_map<ports::NodeName, std::string> pending_child_tokens_;
-
-  // Guards |pending_port_merges_| and |reject_pending_merges_|.
-  base::Lock pending_port_merges_lock_;
-
-  // A set of port merge requests awaiting parent connection.
-  std::vector<std::pair<std::string, ports::PortRef>> pending_port_merges_;
-
-  // Indicates that new merge requests should be rejected because the parent has
-  // disconnected.
-  bool reject_pending_merges_ = false;
-
-  // Guards |parent_name_| and |bootstrap_parent_channel_|.
-  base::Lock parent_lock_;
-
-  // The name of our parent node, if any.
-  ports::NodeName parent_name_;
-
-  // A temporary reference to the parent channel before we know their name.
-  scoped_refptr<NodeChannel> bootstrap_parent_channel_;
-
-  // Guards |broker_name_|, |pending_broker_clients_|, and
-  // |pending_relay_messages_|.
-  base::Lock broker_lock_;
-
-  // The name of our broker node, if any.
-  ports::NodeName broker_name_;
-
-  // A queue of pending child names waiting to be connected to a broker.
-  std::queue<ports::NodeName> pending_broker_clients_;
-
-  // Messages waiting to be relayed by the broker once it's known.
-  std::unordered_map<ports::NodeName, OutgoingMessageQueue>
-      pending_relay_messages_;
-
-  // Guards |incoming_messages_| and |incoming_messages_task_posted_|.
-  base::Lock messages_lock_;
-  std::queue<ports::ScopedMessage> incoming_messages_;
-  // Ensures that there is only one incoming messages task posted to the IO
-  // thread.
-  bool incoming_messages_task_posted_ = false;
-  // Flag to fast-path checking |incoming_messages_|.
-  AtomicFlag incoming_messages_flag_;
-
-  // Guards |shutdown_callback_|.
-  base::Lock shutdown_lock_;
-
-  // Set by RequestShutdown(). If this is non-null, the controller will
-  // begin polling the Node to see if clean shutdown is possible any time the
-  // Node's state is modified by the controller.
-  base::Closure shutdown_callback_;
-  // Flag to fast-path checking |shutdown_callback_|.
-  AtomicFlag shutdown_callback_flag_;
-
-  // All other fields below must only be accessed on the I/O thread, i.e., the
-  // thread on which core_->io_task_runner() runs tasks.
-
-  // Channels to children during handshake.
-  NodeMap pending_children_;
-
-  using PeerNodeMap =
-      std::unordered_map<ports::NodeName, PeerConnection>;
-  PeerNodeMap peer_connections_;
-
-  // Maps from peer token to node name, pending or not.
-  std::unordered_map<std::string, ports::NodeName> peers_by_token_;
-
-  // Indicates whether this object should delete itself on IO thread shutdown.
-  // Must only be accessed from the IO thread.
-  bool destroy_on_io_thread_shutdown_ = false;
-
-#if !defined(OS_MACOSX) && !defined(OS_NACL_SFI)
-  // Broker for sync shared buffer creation in children.
-  std::unique_ptr<Broker> broker_;
-#endif
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-  base::Lock mach_port_relay_lock_;
-  // Relay for transferring mach ports to/from children.
-  std::unique_ptr<MachPortRelay> mach_port_relay_;
-#endif
-
-  DISALLOW_COPY_AND_ASSIGN(NodeController);
-};
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_NODE_CONTROLLER_H_
diff --git a/mojo/edk/system/options_validation.h b/mojo/edk/system/options_validation.h
deleted file mode 100644
index e1b337d..0000000
--- a/mojo/edk/system/options_validation.h
+++ /dev/null
@@ -1,97 +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.
-
-// Functions to help with verifying various |Mojo...Options| structs from the
-// (public, C) API. These are "extensible" structs, which all have |struct_size|
-// as their first member. All fields (other than |struct_size|) are optional,
-// but any |flags| specified must be known to the system (otherwise, an error of
-// |MOJO_RESULT_UNIMPLEMENTED| should be returned).
-
-#ifndef MOJO_EDK_SYSTEM_OPTIONS_VALIDATION_H_
-#define MOJO_EDK_SYSTEM_OPTIONS_VALIDATION_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <algorithm>
-
-#include "base/logging.h"
-#include "base/macros.h"
-#include "mojo/edk/system/system_impl_export.h"
-#include "mojo/public/c/system/types.h"
-
-namespace mojo {
-namespace edk {
-
-template <class Options>
-class UserOptionsReader {
- public:
-  // Constructor from a |const* Options| (which it checks -- this constructor
-  // has side effects!).
-  // Note: We initialize |options_reader_| without checking, since we do a check
-  // in |GetSizeForReader()|.
-  explicit UserOptionsReader(const Options* options) {
-    CHECK(options && IsAligned<MOJO_ALIGNOF(Options)>(options));
-    options_ = GetSizeForReader(options) == 0 ? nullptr : options;
-    static_assert(offsetof(Options, struct_size) == 0,
-                  "struct_size not first member of Options");
-    // TODO(vtl): Enable when MSVC supports this (C++11 extended sizeof):
-    //   static_assert(sizeof(Options::struct_size) == sizeof(uint32_t),
-    //                 "Options::struct_size not a uint32_t");
-    // (Or maybe assert that its type is uint32_t?)
-  }
-
-  bool is_valid() const { return !!options_; }
-
-  const Options& options() const {
-    DCHECK(is_valid());
-    return *options_;
-  }
-
-  // Checks that the given (variable-size) |options| passed to the constructor
-  // (plausibly) has a member at the given offset with the given size. You
-  // probably want to use |OPTIONS_STRUCT_HAS_MEMBER()| instead.
-  bool HasMember(size_t offset, size_t size) const {
-    DCHECK(is_valid());
-    // We assume that |offset| and |size| are reasonable, since they should come
-    // from |offsetof(Options, some_member)| and |sizeof(Options::some_member)|,
-    // respectively.
-    return options().struct_size >= offset + size;
-  }
-
- private:
-  static inline size_t GetSizeForReader(const Options* options) {
-    uint32_t struct_size = *reinterpret_cast<const uint32_t*>(options);
-    if (struct_size < sizeof(uint32_t))
-      return 0;
-
-    return std::min(static_cast<size_t>(struct_size), sizeof(Options));
-  }
-
-  template <size_t alignment>
-  static bool IsAligned(const void* pointer) {
-    return reinterpret_cast<uintptr_t>(pointer) % alignment == 0;
-  }
-
-  const Options* options_;
-
-  DISALLOW_COPY_AND_ASSIGN(UserOptionsReader);
-};
-
-// Macro to invoke |UserOptionsReader<Options>::HasMember()| parametrized by
-// member name instead of offset and size.
-//
-// (We can't just give |HasMember()| a member pointer template argument instead,
-// since there's no good/strictly-correct way to get an offset from that.)
-//
-// TODO(vtl): With C++11, use |sizeof(Options::member)| instead of (the
-// contortion below). We might also be able to pull out the type |Options| from
-// |reader| (using |decltype|) instead of requiring a parameter.
-#define OPTIONS_STRUCT_HAS_MEMBER(Options, member, reader) \
-  reader.HasMember(offsetof(Options, member), sizeof(reader.options().member))
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_OPTIONS_VALIDATION_H_
diff --git a/mojo/edk/system/options_validation_unittest.cc b/mojo/edk/system/options_validation_unittest.cc
deleted file mode 100644
index a01a92c..0000000
--- a/mojo/edk/system/options_validation_unittest.cc
+++ /dev/null
@@ -1,134 +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 "mojo/edk/system/options_validation.h"
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include "mojo/public/c/system/macros.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace edk {
-namespace {
-
-// Declare a test options struct just as we do in actual public headers.
-
-using TestOptionsFlags = uint32_t;
-
-static_assert(MOJO_ALIGNOF(int64_t) == 8, "int64_t has weird alignment");
-struct MOJO_ALIGNAS(8) TestOptions {
-  uint32_t struct_size;
-  TestOptionsFlags flags;
-  uint32_t member1;
-  uint32_t member2;
-};
-static_assert(sizeof(TestOptions) == 16, "TestOptions has wrong size");
-
-const uint32_t kSizeOfTestOptions = static_cast<uint32_t>(sizeof(TestOptions));
-
-TEST(OptionsValidationTest, Valid) {
-  {
-    const TestOptions kOptions = {kSizeOfTestOptions};
-    UserOptionsReader<TestOptions> reader(&kOptions);
-    EXPECT_TRUE(reader.is_valid());
-    EXPECT_TRUE(OPTIONS_STRUCT_HAS_MEMBER(TestOptions, flags, reader));
-    EXPECT_TRUE(OPTIONS_STRUCT_HAS_MEMBER(TestOptions, member1, reader));
-    EXPECT_TRUE(OPTIONS_STRUCT_HAS_MEMBER(TestOptions, member2, reader));
-  }
-  {
-    const TestOptions kOptions = {static_cast<uint32_t>(
-        offsetof(TestOptions, struct_size) + sizeof(uint32_t))};
-    UserOptionsReader<TestOptions> reader(&kOptions);
-    EXPECT_TRUE(reader.is_valid());
-    EXPECT_FALSE(OPTIONS_STRUCT_HAS_MEMBER(TestOptions, flags, reader));
-    EXPECT_FALSE(OPTIONS_STRUCT_HAS_MEMBER(TestOptions, member1, reader));
-    EXPECT_FALSE(OPTIONS_STRUCT_HAS_MEMBER(TestOptions, member2, reader));
-  }
-
-  {
-    const TestOptions kOptions = {
-        static_cast<uint32_t>(offsetof(TestOptions, flags) + sizeof(uint32_t))};
-    UserOptionsReader<TestOptions> reader(&kOptions);
-    EXPECT_TRUE(reader.is_valid());
-    EXPECT_TRUE(OPTIONS_STRUCT_HAS_MEMBER(TestOptions, flags, reader));
-    EXPECT_FALSE(OPTIONS_STRUCT_HAS_MEMBER(TestOptions, member1, reader));
-    EXPECT_FALSE(OPTIONS_STRUCT_HAS_MEMBER(TestOptions, member2, reader));
-  }
-  {
-    MOJO_ALIGNAS(8) char buf[sizeof(TestOptions) + 100] = {};
-    TestOptions* options = reinterpret_cast<TestOptions*>(buf);
-    options->struct_size = kSizeOfTestOptions + 1;
-    UserOptionsReader<TestOptions> reader(options);
-    EXPECT_TRUE(reader.is_valid());
-    EXPECT_TRUE(OPTIONS_STRUCT_HAS_MEMBER(TestOptions, flags, reader));
-    EXPECT_TRUE(OPTIONS_STRUCT_HAS_MEMBER(TestOptions, member1, reader));
-    EXPECT_TRUE(OPTIONS_STRUCT_HAS_MEMBER(TestOptions, member2, reader));
-  }
-  {
-    MOJO_ALIGNAS(8) char buf[sizeof(TestOptions) + 100] = {};
-    TestOptions* options = reinterpret_cast<TestOptions*>(buf);
-    options->struct_size = kSizeOfTestOptions + 4;
-    UserOptionsReader<TestOptions> reader(options);
-    EXPECT_TRUE(reader.is_valid());
-    EXPECT_TRUE(OPTIONS_STRUCT_HAS_MEMBER(TestOptions, flags, reader));
-    EXPECT_TRUE(OPTIONS_STRUCT_HAS_MEMBER(TestOptions, member1, reader));
-    EXPECT_TRUE(OPTIONS_STRUCT_HAS_MEMBER(TestOptions, member2, reader));
-  }
-}
-
-TEST(OptionsValidationTest, Invalid) {
-  // Size too small:
-  for (size_t i = 0; i < sizeof(uint32_t); i++) {
-    TestOptions options = {static_cast<uint32_t>(i)};
-    UserOptionsReader<TestOptions> reader(&options);
-    EXPECT_FALSE(reader.is_valid()) << i;
-  }
-}
-
-// These test invalid arguments that should cause death if we're being paranoid
-// about checking arguments (which we would want to do if, e.g., we were in a
-// true "kernel" situation, but we might not want to do otherwise for
-// performance reasons). Probably blatant errors like passing in null pointers
-// (for required pointer arguments) will still cause death, but perhaps not
-// predictably.
-TEST(OptionsValidationTest, InvalidDeath) {
-#if defined(OFFICIAL_BUILD)
-  const char kMemoryCheckFailedRegex[] = "";
-#else
-  const char kMemoryCheckFailedRegex[] = "Check failed";
-#endif
-
-  // Null:
-  EXPECT_DEATH_IF_SUPPORTED(
-      { UserOptionsReader<TestOptions> reader((nullptr)); },
-      kMemoryCheckFailedRegex);
-
-  // Unaligned:
-  EXPECT_DEATH_IF_SUPPORTED(
-      {
-        UserOptionsReader<TestOptions> reader(
-            reinterpret_cast<const TestOptions*>(1));
-      },
-      kMemoryCheckFailedRegex);
-  // Note: The current implementation checks the size only after checking the
-  // alignment versus that required for the |uint32_t| size, so it won't die in
-  // the expected way if you pass, e.g., 4. So we have to manufacture a valid
-  // pointer at an offset of alignment 4.
-  EXPECT_DEATH_IF_SUPPORTED(
-      {
-        uint32_t buffer[100] = {};
-        TestOptions* options = (reinterpret_cast<uintptr_t>(buffer) % 8 == 0)
-                                   ? reinterpret_cast<TestOptions*>(&buffer[1])
-                                   : reinterpret_cast<TestOptions*>(&buffer[0]);
-        options->struct_size = static_cast<uint32_t>(sizeof(TestOptions));
-        UserOptionsReader<TestOptions> reader(options);
-      },
-      kMemoryCheckFailedRegex);
-}
-
-}  // namespace
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/platform_handle_dispatcher.cc b/mojo/edk/system/platform_handle_dispatcher.cc
deleted file mode 100644
index 3e708c2..0000000
--- a/mojo/edk/system/platform_handle_dispatcher.cc
+++ /dev/null
@@ -1,104 +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 "mojo/edk/system/platform_handle_dispatcher.h"
-
-#include "base/synchronization/lock.h"
-#include "mojo/edk/embedder/platform_handle_vector.h"
-
-namespace mojo {
-namespace edk {
-
-// static
-scoped_refptr<PlatformHandleDispatcher> PlatformHandleDispatcher::Create(
-    ScopedPlatformHandle platform_handle) {
-  return new PlatformHandleDispatcher(std::move(platform_handle));
-}
-
-ScopedPlatformHandle PlatformHandleDispatcher::PassPlatformHandle() {
-  return std::move(platform_handle_);
-}
-
-Dispatcher::Type PlatformHandleDispatcher::GetType() const {
-  return Type::PLATFORM_HANDLE;
-}
-
-MojoResult PlatformHandleDispatcher::Close() {
-  base::AutoLock lock(lock_);
-  if (is_closed_ || in_transit_)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-  is_closed_ = true;
-  platform_handle_.reset();
-  return MOJO_RESULT_OK;
-}
-
-void PlatformHandleDispatcher::StartSerialize(uint32_t* num_bytes,
-                                              uint32_t* num_ports,
-                                              uint32_t* num_handles) {
-  *num_bytes = 0;
-  *num_ports = 0;
-  *num_handles = 1;
-}
-
-bool PlatformHandleDispatcher::EndSerialize(void* destination,
-                                            ports::PortName* ports,
-                                            PlatformHandle* handles) {
-  base::AutoLock lock(lock_);
-  if (is_closed_)
-    return false;
-  handles[0] = platform_handle_.get();
-  return true;
-}
-
-bool PlatformHandleDispatcher::BeginTransit() {
-  base::AutoLock lock(lock_);
-  if (in_transit_)
-    return false;
-  in_transit_ = !is_closed_;
-  return in_transit_;
-}
-
-void PlatformHandleDispatcher::CompleteTransitAndClose() {
-  base::AutoLock lock(lock_);
-
-  in_transit_ = false;
-  is_closed_ = true;
-
-  // The system has taken ownership of our handle.
-  ignore_result(platform_handle_.release());
-}
-
-void PlatformHandleDispatcher::CancelTransit() {
-  base::AutoLock lock(lock_);
-  in_transit_ = false;
-}
-
-// static
-scoped_refptr<PlatformHandleDispatcher> PlatformHandleDispatcher::Deserialize(
-    const void* bytes,
-    size_t num_bytes,
-    const ports::PortName* ports,
-    size_t num_ports,
-    PlatformHandle* handles,
-    size_t num_handles) {
-  if (num_bytes || num_ports || num_handles != 1)
-    return nullptr;
-
-  PlatformHandle handle;
-  std::swap(handle, handles[0]);
-
-  return PlatformHandleDispatcher::Create(ScopedPlatformHandle(handle));
-}
-
-PlatformHandleDispatcher::PlatformHandleDispatcher(
-    ScopedPlatformHandle platform_handle)
-    : platform_handle_(std::move(platform_handle)) {}
-
-PlatformHandleDispatcher::~PlatformHandleDispatcher() {
-  DCHECK(is_closed_ && !in_transit_);
-  DCHECK(!platform_handle_.is_valid());
-}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/platform_handle_dispatcher.h b/mojo/edk/system/platform_handle_dispatcher.h
deleted file mode 100644
index a36c7a0..0000000
--- a/mojo/edk/system/platform_handle_dispatcher.h
+++ /dev/null
@@ -1,61 +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 MOJO_EDK_SYSTEM_PLATFORM_HANDLE_DISPATCHER_H_
-#define MOJO_EDK_SYSTEM_PLATFORM_HANDLE_DISPATCHER_H_
-
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/synchronization/lock.h"
-#include "mojo/edk/embedder/scoped_platform_handle.h"
-#include "mojo/edk/system/dispatcher.h"
-#include "mojo/edk/system/system_impl_export.h"
-
-namespace mojo {
-namespace edk {
-
-class MOJO_SYSTEM_IMPL_EXPORT PlatformHandleDispatcher : public Dispatcher {
- public:
-  static scoped_refptr<PlatformHandleDispatcher> Create(
-      ScopedPlatformHandle platform_handle);
-
-  ScopedPlatformHandle PassPlatformHandle();
-
-  // Dispatcher:
-  Type GetType() const override;
-  MojoResult Close() override;
-  void StartSerialize(uint32_t* num_bytes,
-                      uint32_t* num_ports,
-                      uint32_t* num_handles) override;
-  bool EndSerialize(void* destination,
-                    ports::PortName* ports,
-                    PlatformHandle* handles) override;
-  bool BeginTransit() override;
-  void CompleteTransitAndClose() override;
-  void CancelTransit() override;
-
-  static scoped_refptr<PlatformHandleDispatcher> Deserialize(
-      const void* bytes,
-      size_t num_bytes,
-      const ports::PortName* ports,
-      size_t num_ports,
-      PlatformHandle* handles,
-      size_t num_handles);
-
- private:
-  PlatformHandleDispatcher(ScopedPlatformHandle platform_handle);
-  ~PlatformHandleDispatcher() override;
-
-  base::Lock lock_;
-  bool in_transit_ = false;
-  bool is_closed_ = false;
-  ScopedPlatformHandle platform_handle_;
-
-  DISALLOW_COPY_AND_ASSIGN(PlatformHandleDispatcher);
-};
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_PLATFORM_HANDLE_DISPATCHER_H_
diff --git a/mojo/edk/system/platform_handle_dispatcher_unittest.cc b/mojo/edk/system/platform_handle_dispatcher_unittest.cc
deleted file mode 100644
index 7a94262..0000000
--- a/mojo/edk/system/platform_handle_dispatcher_unittest.cc
+++ /dev/null
@@ -1,123 +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 "mojo/edk/system/platform_handle_dispatcher.h"
-
-#include <stdio.h>
-#include <utility>
-
-#include "base/files/file_path.h"
-#include "base/files/file_util.h"
-#include "base/files/scoped_file.h"
-#include "base/files/scoped_temp_dir.h"
-#include "base/memory/ref_counted.h"
-#include "mojo/edk/embedder/platform_handle_vector.h"
-#include "mojo/edk/test/test_utils.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace edk {
-namespace {
-
-TEST(PlatformHandleDispatcherTest, Basic) {
-  base::ScopedTempDir temp_dir;
-  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-
-  static const char kHelloWorld[] = "hello world";
-
-  base::FilePath unused;
-  base::ScopedFILE fp(
-      CreateAndOpenTemporaryFileInDir(temp_dir.GetPath(), &unused));
-  ASSERT_TRUE(fp);
-  EXPECT_EQ(sizeof(kHelloWorld),
-            fwrite(kHelloWorld, 1, sizeof(kHelloWorld), fp.get()));
-
-  ScopedPlatformHandle h(test::PlatformHandleFromFILE(std::move(fp)));
-  EXPECT_FALSE(fp);
-  ASSERT_TRUE(h.is_valid());
-
-  scoped_refptr<PlatformHandleDispatcher> dispatcher =
-      PlatformHandleDispatcher::Create(std::move(h));
-  EXPECT_FALSE(h.is_valid());
-  EXPECT_EQ(Dispatcher::Type::PLATFORM_HANDLE, dispatcher->GetType());
-
-  h = dispatcher->PassPlatformHandle();
-  EXPECT_TRUE(h.is_valid());
-
-  fp = test::FILEFromPlatformHandle(std::move(h), "rb");
-  EXPECT_FALSE(h.is_valid());
-  EXPECT_TRUE(fp);
-
-  rewind(fp.get());
-  char read_buffer[1000] = {};
-  EXPECT_EQ(sizeof(kHelloWorld),
-            fread(read_buffer, 1, sizeof(read_buffer), fp.get()));
-  EXPECT_STREQ(kHelloWorld, read_buffer);
-
-  // Try getting the handle again. (It should fail cleanly.)
-  h = dispatcher->PassPlatformHandle();
-  EXPECT_FALSE(h.is_valid());
-
-  EXPECT_EQ(MOJO_RESULT_OK, dispatcher->Close());
-}
-
-TEST(PlatformHandleDispatcherTest, Serialization) {
-  base::ScopedTempDir temp_dir;
-  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-
-  static const char kFooBar[] = "foo bar";
-
-  base::FilePath unused;
-  base::ScopedFILE fp(
-      CreateAndOpenTemporaryFileInDir(temp_dir.GetPath(), &unused));
-  EXPECT_EQ(sizeof(kFooBar), fwrite(kFooBar, 1, sizeof(kFooBar), fp.get()));
-
-  scoped_refptr<PlatformHandleDispatcher> dispatcher =
-      PlatformHandleDispatcher::Create(
-          test::PlatformHandleFromFILE(std::move(fp)));
-
-  uint32_t num_bytes = 0;
-  uint32_t num_ports = 0;
-  uint32_t num_handles = 0;
-  EXPECT_TRUE(dispatcher->BeginTransit());
-  dispatcher->StartSerialize(&num_bytes, &num_ports, &num_handles);
-
-  EXPECT_EQ(0u, num_bytes);
-  EXPECT_EQ(0u, num_ports);
-  EXPECT_EQ(1u, num_handles);
-
-  ScopedPlatformHandleVectorPtr handles(new PlatformHandleVector(1));
-  EXPECT_TRUE(dispatcher->EndSerialize(nullptr, nullptr, handles->data()));
-  dispatcher->CompleteTransitAndClose();
-
-  EXPECT_TRUE(handles->at(0).is_valid());
-
-  ScopedPlatformHandle handle = dispatcher->PassPlatformHandle();
-  EXPECT_FALSE(handle.is_valid());
-
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, dispatcher->Close());
-
-  dispatcher = static_cast<PlatformHandleDispatcher*>(
-      Dispatcher::Deserialize(Dispatcher::Type::PLATFORM_HANDLE, nullptr,
-                              num_bytes, nullptr, num_ports, handles->data(),
-                              1).get());
-
-  EXPECT_FALSE(handles->at(0).is_valid());
-  EXPECT_TRUE(dispatcher->GetType() == Dispatcher::Type::PLATFORM_HANDLE);
-
-  fp = test::FILEFromPlatformHandle(dispatcher->PassPlatformHandle(), "rb");
-  EXPECT_TRUE(fp);
-
-  rewind(fp.get());
-  char read_buffer[1000] = {};
-  EXPECT_EQ(sizeof(kFooBar),
-            fread(read_buffer, 1, sizeof(read_buffer), fp.get()));
-  EXPECT_STREQ(kFooBar, read_buffer);
-
-  EXPECT_EQ(MOJO_RESULT_OK, dispatcher->Close());
-}
-
-}  // namespace
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/platform_wrapper_unittest.cc b/mojo/edk/system/platform_wrapper_unittest.cc
deleted file mode 100644
index f29d62b..0000000
--- a/mojo/edk/system/platform_wrapper_unittest.cc
+++ /dev/null
@@ -1,212 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <stdint.h>
-#include <string.h>
-
-#include <algorithm>
-#include <string>
-#include <vector>
-
-#include "base/files/file.h"
-#include "base/files/file_util.h"
-#include "base/memory/shared_memory.h"
-#include "base/process/process_handle.h"
-#include "mojo/edk/embedder/platform_shared_buffer.h"
-#include "mojo/edk/test/mojo_test_base.h"
-#include "mojo/public/c/system/platform_handle.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-#if defined(OS_WIN)
-#include <windows.h>
-#endif
-
-#if defined(OS_POSIX)
-#define SIMPLE_PLATFORM_HANDLE_TYPE MOJO_PLATFORM_HANDLE_TYPE_FILE_DESCRIPTOR
-#elif defined(OS_WIN)
-#define SIMPLE_PLATFORM_HANDLE_TYPE MOJO_PLATFORM_HANDLE_TYPE_WINDOWS_HANDLE
-#endif
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-#define SHARED_BUFFER_PLATFORM_HANDLE_TYPE MOJO_PLATFORM_HANDLE_TYPE_MACH_PORT
-#else
-#define SHARED_BUFFER_PLATFORM_HANDLE_TYPE SIMPLE_PLATFORM_HANDLE_TYPE
-#endif
-
-uint64_t PlatformHandleValueFromPlatformFile(base::PlatformFile file) {
-#if defined(OS_WIN)
-  return reinterpret_cast<uint64_t>(file);
-#else
-  return static_cast<uint64_t>(file);
-#endif
-}
-
-base::PlatformFile PlatformFileFromPlatformHandleValue(uint64_t value) {
-#if defined(OS_WIN)
-  return reinterpret_cast<base::PlatformFile>(value);
-#else
-  return static_cast<base::PlatformFile>(value);
-#endif
-}
-
-namespace mojo {
-namespace edk {
-namespace {
-
-using PlatformWrapperTest = test::MojoTestBase;
-
-TEST_F(PlatformWrapperTest, WrapPlatformHandle) {
-  // Create a temporary file and write a message to it.
-  base::FilePath temp_file_path;
-  ASSERT_TRUE(base::CreateTemporaryFile(&temp_file_path));
-  const std::string kMessage = "Hello, world!";
-  EXPECT_EQ(base::WriteFile(temp_file_path, kMessage.data(),
-                            static_cast<int>(kMessage.size())),
-            static_cast<int>(kMessage.size()));
-
-  RUN_CHILD_ON_PIPE(ReadPlatformFile, h)
-    // Open the temporary file for reading, wrap its handle, and send it to
-    // the child along with the expected message to be read.
-    base::File file(temp_file_path,
-                    base::File::FLAG_OPEN | base::File::FLAG_READ);
-    EXPECT_TRUE(file.IsValid());
-
-    MojoHandle wrapped_handle;
-    MojoPlatformHandle os_file;
-    os_file.struct_size = sizeof(MojoPlatformHandle);
-    os_file.type = SIMPLE_PLATFORM_HANDLE_TYPE;
-    os_file.value =
-        PlatformHandleValueFromPlatformFile(file.TakePlatformFile());
-    EXPECT_EQ(MOJO_RESULT_OK,
-              MojoWrapPlatformHandle(&os_file, &wrapped_handle));
-
-    WriteMessageWithHandles(h, kMessage, &wrapped_handle, 1);
-  END_CHILD()
-
-  base::DeleteFile(temp_file_path, false);
-}
-
-DEFINE_TEST_CLIENT_TEST_WITH_PIPE(ReadPlatformFile, PlatformWrapperTest, h) {
-  // Read a message and a wrapped file handle; unwrap the handle.
-  MojoHandle wrapped_handle;
-  std::string message = ReadMessageWithHandles(h, &wrapped_handle, 1);
-
-  MojoPlatformHandle platform_handle;
-  platform_handle.struct_size = sizeof(MojoPlatformHandle);
-  ASSERT_EQ(MOJO_RESULT_OK,
-            MojoUnwrapPlatformHandle(wrapped_handle, &platform_handle));
-  EXPECT_EQ(SIMPLE_PLATFORM_HANDLE_TYPE, platform_handle.type);
-  base::File file(PlatformFileFromPlatformHandleValue(platform_handle.value));
-
-  // Expect to read the same message from the file.
-  std::vector<char> data(message.size());
-  EXPECT_EQ(file.ReadAtCurrentPos(data.data(), static_cast<int>(data.size())),
-            static_cast<int>(data.size()));
-  EXPECT_TRUE(std::equal(message.begin(), message.end(), data.begin()));
-}
-
-TEST_F(PlatformWrapperTest, WrapPlatformSharedBufferHandle) {
-  // Allocate a new platform shared buffer and write a message into it.
-  const std::string kMessage = "Hello, world!";
-  base::SharedMemory buffer;
-  buffer.CreateAndMapAnonymous(kMessage.size());
-  CHECK(buffer.memory());
-  memcpy(buffer.memory(), kMessage.data(), kMessage.size());
-
-  RUN_CHILD_ON_PIPE(ReadPlatformSharedBuffer, h)
-    // Wrap the shared memory handle and send it to the child along with the
-    // expected message.
-    base::SharedMemoryHandle memory_handle =
-        base::SharedMemory::DuplicateHandle(buffer.handle());
-    MojoPlatformHandle os_buffer;
-    os_buffer.struct_size = sizeof(MojoPlatformHandle);
-    os_buffer.type = SHARED_BUFFER_PLATFORM_HANDLE_TYPE;
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-    os_buffer.value = static_cast<uint64_t>(memory_handle.GetMemoryObject());
-#elif defined(OS_POSIX)
-    os_buffer.value = static_cast<uint64_t>(memory_handle.fd);
-#elif defined(OS_WIN)
-    os_buffer.value = reinterpret_cast<uint64_t>(memory_handle.GetHandle());
-#endif
-
-    MojoHandle wrapped_handle;
-    ASSERT_EQ(MOJO_RESULT_OK,
-              MojoWrapPlatformSharedBufferHandle(
-                  &os_buffer, kMessage.size(),
-                  MOJO_PLATFORM_SHARED_BUFFER_HANDLE_FLAG_NONE,
-                  &wrapped_handle));
-    WriteMessageWithHandles(h, kMessage, &wrapped_handle, 1);
-  END_CHILD()
-}
-
-DEFINE_TEST_CLIENT_TEST_WITH_PIPE(ReadPlatformSharedBuffer, PlatformWrapperTest,
-                                  h) {
-  // Read a message and a wrapped shared buffer handle.
-  MojoHandle wrapped_handle;
-  std::string message = ReadMessageWithHandles(h, &wrapped_handle, 1);
-
-  // Check the message in the buffer
-  ExpectBufferContents(wrapped_handle, 0, message);
-
-  // Now unwrap the buffer and verify that the base::SharedMemoryHandle also
-  // works as expected.
-  MojoPlatformHandle os_buffer;
-  os_buffer.struct_size = sizeof(MojoPlatformHandle);
-  size_t size;
-  MojoPlatformSharedBufferHandleFlags flags;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            MojoUnwrapPlatformSharedBufferHandle(wrapped_handle, &os_buffer,
-                                                 &size, &flags));
-  bool read_only = flags & MOJO_PLATFORM_SHARED_BUFFER_HANDLE_FLAG_NONE;
-  EXPECT_FALSE(read_only);
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-  ASSERT_EQ(MOJO_PLATFORM_HANDLE_TYPE_MACH_PORT, os_buffer.type);
-  base::SharedMemoryHandle memory_handle(
-      static_cast<mach_port_t>(os_buffer.value), size,
-      base::GetCurrentProcId());
-#elif defined(OS_POSIX)
-  ASSERT_EQ(MOJO_PLATFORM_HANDLE_TYPE_FILE_DESCRIPTOR, os_buffer.type);
-  base::SharedMemoryHandle memory_handle(static_cast<int>(os_buffer.value),
-                                         false);
-#elif defined(OS_WIN)
-  ASSERT_EQ(MOJO_PLATFORM_HANDLE_TYPE_WINDOWS_HANDLE, os_buffer.type);
-  base::SharedMemoryHandle memory_handle(
-      reinterpret_cast<HANDLE>(os_buffer.value), base::GetCurrentProcId());
-#endif
-
-  base::SharedMemory memory(memory_handle, read_only);
-  memory.Map(message.size());
-  ASSERT_TRUE(memory.memory());
-
-  EXPECT_TRUE(std::equal(message.begin(), message.end(),
-                         static_cast<const char*>(memory.memory())));
-}
-
-TEST_F(PlatformWrapperTest, InvalidHandle) {
-  // Wrap an invalid platform handle and expect to unwrap the same.
-
-  MojoHandle wrapped_handle;
-  MojoPlatformHandle invalid_handle;
-  invalid_handle.struct_size = sizeof(MojoPlatformHandle);
-  invalid_handle.type = MOJO_PLATFORM_HANDLE_TYPE_INVALID;
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoWrapPlatformHandle(&invalid_handle, &wrapped_handle));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoUnwrapPlatformHandle(wrapped_handle, &invalid_handle));
-  EXPECT_EQ(MOJO_PLATFORM_HANDLE_TYPE_INVALID, invalid_handle.type);
-}
-
-TEST_F(PlatformWrapperTest, InvalidArgument) {
-  // Try to wrap an invalid MojoPlatformHandle struct and expect an error.
-  MojoHandle wrapped_handle;
-  MojoPlatformHandle platform_handle;
-  platform_handle.struct_size = 0;
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            MojoWrapPlatformHandle(&platform_handle, &wrapped_handle));
-}
-
-}  // namespace
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/ports/BUILD.gn b/mojo/edk/system/ports/BUILD.gn
deleted file mode 100644
index 5c82761..0000000
--- a/mojo/edk/system/ports/BUILD.gn
+++ /dev/null
@@ -1,46 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//testing/test.gni")
-
-source_set("ports") {
-  sources = [
-    "event.cc",
-    "event.h",
-    "message.cc",
-    "message.h",
-    "message_filter.h",
-    "message_queue.cc",
-    "message_queue.h",
-    "name.cc",
-    "name.h",
-    "node.cc",
-    "node.h",
-    "node_delegate.h",
-    "port.cc",
-    "port.h",
-    "port_ref.cc",
-    "port_ref.h",
-    "user_data.h",
-  ]
-
-  public_deps = [
-    "//base",
-  ]
-}
-
-source_set("tests") {
-  testonly = true
-
-  sources = [
-    "ports_unittest.cc",
-  ]
-
-  deps = [
-    ":ports",
-    "//base",
-    "//base/test:test_support",
-    "//testing/gtest",
-  ]
-}
diff --git a/mojo/edk/system/ports/event.cc b/mojo/edk/system/ports/event.cc
deleted file mode 100644
index 2e22086..0000000
--- a/mojo/edk/system/ports/event.cc
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/system/ports/event.h"
-
-#include <string.h>
-
-namespace mojo {
-namespace edk {
-namespace ports {
-
-namespace {
-
-const size_t kPortsMessageAlignment = 8;
-
-static_assert(sizeof(PortDescriptor) % kPortsMessageAlignment == 0,
-              "Invalid PortDescriptor size.");
-
-static_assert(sizeof(EventHeader) % kPortsMessageAlignment == 0,
-              "Invalid EventHeader size.");
-
-static_assert(sizeof(UserEventData) % kPortsMessageAlignment == 0,
-              "Invalid UserEventData size.");
-
-static_assert(sizeof(ObserveProxyEventData) % kPortsMessageAlignment == 0,
-              "Invalid ObserveProxyEventData size.");
-
-static_assert(sizeof(ObserveProxyAckEventData) % kPortsMessageAlignment == 0,
-              "Invalid ObserveProxyAckEventData size.");
-
-static_assert(sizeof(ObserveClosureEventData) % kPortsMessageAlignment == 0,
-              "Invalid ObserveClosureEventData size.");
-
-static_assert(sizeof(MergePortEventData) % kPortsMessageAlignment == 0,
-              "Invalid MergePortEventData size.");
-
-}  // namespace
-
-PortDescriptor::PortDescriptor() {
-  memset(padding, 0, sizeof(padding));
-}
-
-}  // namespace ports
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/ports/event.h b/mojo/edk/system/ports/event.h
deleted file mode 100644
index a66dfc1..0000000
--- a/mojo/edk/system/ports/event.h
+++ /dev/null
@@ -1,111 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_SYSTEM_PORTS_EVENT_H_
-#define MOJO_EDK_SYSTEM_PORTS_EVENT_H_
-
-#include <stdint.h>
-
-#include "mojo/edk/system/ports/message.h"
-#include "mojo/edk/system/ports/name.h"
-
-namespace mojo {
-namespace edk {
-namespace ports {
-
-#pragma pack(push, 1)
-
-// TODO: Add static assertions of alignment.
-
-struct PortDescriptor {
-  PortDescriptor();
-
-  NodeName peer_node_name;
-  PortName peer_port_name;
-  NodeName referring_node_name;
-  PortName referring_port_name;
-  uint64_t next_sequence_num_to_send;
-  uint64_t next_sequence_num_to_receive;
-  uint64_t last_sequence_num_to_receive;
-  bool peer_closed;
-  char padding[7];
-};
-
-enum struct EventType : uint32_t {
-  kUser,
-  kPortAccepted,
-  kObserveProxy,
-  kObserveProxyAck,
-  kObserveClosure,
-  kMergePort,
-};
-
-struct EventHeader {
-  EventType type;
-  uint32_t padding;
-  PortName port_name;
-};
-
-struct UserEventData {
-  uint64_t sequence_num;
-  uint32_t num_ports;
-  uint32_t padding;
-};
-
-struct ObserveProxyEventData {
-  NodeName proxy_node_name;
-  PortName proxy_port_name;
-  NodeName proxy_to_node_name;
-  PortName proxy_to_port_name;
-};
-
-struct ObserveProxyAckEventData {
-  uint64_t last_sequence_num;
-};
-
-struct ObserveClosureEventData {
-  uint64_t last_sequence_num;
-};
-
-struct MergePortEventData {
-  PortName new_port_name;
-  PortDescriptor new_port_descriptor;
-};
-
-#pragma pack(pop)
-
-inline const EventHeader* GetEventHeader(const Message& message) {
-  return static_cast<const EventHeader*>(message.header_bytes());
-}
-
-inline EventHeader* GetMutableEventHeader(Message* message) {
-  return static_cast<EventHeader*>(message->mutable_header_bytes());
-}
-
-template <typename EventData>
-inline const EventData* GetEventData(const Message& message) {
-  return reinterpret_cast<const EventData*>(
-      reinterpret_cast<const char*>(GetEventHeader(message) + 1));
-}
-
-template <typename EventData>
-inline EventData* GetMutableEventData(Message* message) {
-  return reinterpret_cast<EventData*>(
-      reinterpret_cast<char*>(GetMutableEventHeader(message) + 1));
-}
-
-inline const PortDescriptor* GetPortDescriptors(const UserEventData* event) {
-  return reinterpret_cast<const PortDescriptor*>(
-      reinterpret_cast<const char*>(event + 1));
-}
-
-inline PortDescriptor* GetMutablePortDescriptors(UserEventData* event) {
-  return reinterpret_cast<PortDescriptor*>(reinterpret_cast<char*>(event + 1));
-}
-
-}  // namespace ports
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_PORTS_EVENT_H_
diff --git a/mojo/edk/system/ports/message.cc b/mojo/edk/system/ports/message.cc
deleted file mode 100644
index 5d3c000..0000000
--- a/mojo/edk/system/ports/message.cc
+++ /dev/null
@@ -1,100 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <stdlib.h>
-
-#include <limits>
-
-#include "base/logging.h"
-#include "mojo/edk/system/ports/event.h"
-
-namespace mojo {
-namespace edk {
-namespace ports {
-
-// static
-bool Message::Parse(const void* bytes,
-                    size_t num_bytes,
-                    size_t* num_header_bytes,
-                    size_t* num_payload_bytes,
-                    size_t* num_ports_bytes) {
-  if (num_bytes < sizeof(EventHeader))
-    return false;
-  const EventHeader* header = static_cast<const EventHeader*>(bytes);
-  switch (header->type) {
-    case EventType::kUser:
-      // See below.
-      break;
-    case EventType::kPortAccepted:
-      *num_header_bytes = sizeof(EventHeader);
-      break;
-    case EventType::kObserveProxy:
-      *num_header_bytes = sizeof(EventHeader) + sizeof(ObserveProxyEventData);
-      break;
-    case EventType::kObserveProxyAck:
-      *num_header_bytes =
-          sizeof(EventHeader) + sizeof(ObserveProxyAckEventData);
-      break;
-    case EventType::kObserveClosure:
-      *num_header_bytes = sizeof(EventHeader) + sizeof(ObserveClosureEventData);
-      break;
-    case EventType::kMergePort:
-      *num_header_bytes = sizeof(EventHeader) + sizeof(MergePortEventData);
-      break;
-    default:
-      return false;
-  }
-
-  if (header->type == EventType::kUser) {
-    if (num_bytes < sizeof(EventHeader) + sizeof(UserEventData))
-      return false;
-    const UserEventData* event_data =
-        reinterpret_cast<const UserEventData*>(
-            reinterpret_cast<const char*>(header + 1));
-    if (event_data->num_ports > std::numeric_limits<uint16_t>::max())
-      return false;
-    *num_header_bytes = sizeof(EventHeader) +
-                        sizeof(UserEventData) +
-                        event_data->num_ports * sizeof(PortDescriptor);
-    *num_ports_bytes = event_data->num_ports * sizeof(PortName);
-    if (num_bytes < *num_header_bytes + *num_ports_bytes)
-      return false;
-    *num_payload_bytes = num_bytes - *num_header_bytes - *num_ports_bytes;
-  } else {
-    if (*num_header_bytes != num_bytes)
-      return false;
-    *num_payload_bytes = 0;
-    *num_ports_bytes = 0;
-  }
-
-  return true;
-}
-
-Message::Message(size_t num_payload_bytes, size_t num_ports)
-    : Message(sizeof(EventHeader) + sizeof(UserEventData) +
-                  num_ports * sizeof(PortDescriptor),
-              num_payload_bytes, num_ports * sizeof(PortName)) {
-  num_ports_ = num_ports;
-}
-
-Message::Message(size_t num_header_bytes,
-                 size_t num_payload_bytes,
-                 size_t num_ports_bytes)
-    : start_(nullptr),
-      num_header_bytes_(num_header_bytes),
-      num_ports_bytes_(num_ports_bytes),
-      num_payload_bytes_(num_payload_bytes) {
-}
-
-void Message::InitializeUserMessageHeader(void* start) {
-  start_ = static_cast<char*>(start);
-  memset(start_, 0, num_header_bytes_);
-  GetMutableEventHeader(this)->type = EventType::kUser;
-  GetMutableEventData<UserEventData>(this)->num_ports =
-      static_cast<uint32_t>(num_ports_);
-}
-
-}  // namespace ports
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/ports/message.h b/mojo/edk/system/ports/message.h
deleted file mode 100644
index 95fa046..0000000
--- a/mojo/edk/system/ports/message.h
+++ /dev/null
@@ -1,93 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_SYSTEM_PORTS_MESSAGE_H_
-#define MOJO_EDK_SYSTEM_PORTS_MESSAGE_H_
-
-#include <stddef.h>
-
-#include <memory>
-
-#include "mojo/edk/system/ports/name.h"
-
-namespace mojo {
-namespace edk {
-namespace ports {
-
-// A message consists of a header (array of bytes), payload (array of bytes)
-// and an array of ports. The header is used by the Node implementation.
-//
-// This class is designed to be subclassed, and the subclass is responsible for
-// providing the underlying storage. The header size will be aligned, and it
-// should be followed in memory by the array of ports and finally the payload.
-//
-// NOTE: This class does not manage the lifetime of the ports it references.
-class Message {
- public:
-  virtual ~Message() {}
-
-  // Inspect the message at |bytes| and return the size of each section. Returns
-  // |false| if the message is malformed and |true| otherwise.
-  static bool Parse(const void* bytes,
-                    size_t num_bytes,
-                    size_t* num_header_bytes,
-                    size_t* num_payload_bytes,
-                    size_t* num_ports_bytes);
-
-  void* mutable_header_bytes() { return start_; }
-  const void* header_bytes() const { return start_; }
-  size_t num_header_bytes() const { return num_header_bytes_; }
-
-  void* mutable_payload_bytes() {
-    return start_ + num_header_bytes_ + num_ports_bytes_;
-  }
-  const void* payload_bytes() const {
-    return const_cast<Message*>(this)->mutable_payload_bytes();
-  }
-  size_t num_payload_bytes() const { return num_payload_bytes_; }
-
-  PortName* mutable_ports() {
-    return reinterpret_cast<PortName*>(start_ + num_header_bytes_);
-  }
-  const PortName* ports() const {
-    return const_cast<Message*>(this)->mutable_ports();
-  }
-  size_t num_ports_bytes() const { return num_ports_bytes_; }
-  size_t num_ports() const { return num_ports_bytes_ / sizeof(PortName); }
-
- protected:
-  // Constructs a new Message base for a user message.
-  //
-  // Note: You MUST call InitializeUserMessageHeader() before this Message is
-  // ready for transmission.
-  Message(size_t num_payload_bytes, size_t num_ports);
-
-  // Constructs a new Message base for an internal message. Do NOT call
-  // InitializeUserMessageHeader() when using this constructor.
-  Message(size_t num_header_bytes,
-          size_t num_payload_bytes,
-          size_t num_ports_bytes);
-
-  Message(const Message& other) = delete;
-  void operator=(const Message& other) = delete;
-
-  // Initializes the header in a newly allocated message buffer to carry a
-  // user message.
-  void InitializeUserMessageHeader(void* start);
-
-  // Note: storage is [header][ports][payload].
-  char* start_ = nullptr;
-  size_t num_ports_ = 0;
-  size_t num_header_bytes_ = 0;
-  size_t num_ports_bytes_ = 0;
-  size_t num_payload_bytes_ = 0;
-};
-
-using ScopedMessage = std::unique_ptr<Message>;
-
-}  // namespace ports
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_PORTS_MESSAGE_H_
diff --git a/mojo/edk/system/ports/message_filter.h b/mojo/edk/system/ports/message_filter.h
deleted file mode 100644
index bf8fa21..0000000
--- a/mojo/edk/system/ports/message_filter.h
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_SYSTEM_PORTS_MESSAGE_FILTER_H_
-#define MOJO_EDK_SYSTEM_PORTS_MESSAGE_FILTER_H_
-
-namespace mojo {
-namespace edk {
-namespace ports {
-
-class Message;
-
-// An interface which can be implemented to filter port messages according to
-// arbitrary policy.
-class MessageFilter {
- public:
-  virtual ~MessageFilter() {}
-
-  // Returns true of |message| should be accepted by whomever is applying this
-  // filter. See MessageQueue::GetNextMessage(), for example.
-  virtual bool Match(const Message& message) = 0;
-};
-
-}  // namespace ports
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_PORTS_MESSAGE_FILTER_H_
diff --git a/mojo/edk/system/ports/message_queue.cc b/mojo/edk/system/ports/message_queue.cc
deleted file mode 100644
index defb1b6..0000000
--- a/mojo/edk/system/ports/message_queue.cc
+++ /dev/null
@@ -1,87 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/system/ports/message_queue.h"
-
-#include <algorithm>
-
-#include "base/logging.h"
-#include "mojo/edk/system/ports/event.h"
-#include "mojo/edk/system/ports/message_filter.h"
-
-namespace mojo {
-namespace edk {
-namespace ports {
-
-inline uint64_t GetSequenceNum(const ScopedMessage& message) {
-  return GetEventData<UserEventData>(*message)->sequence_num;
-}
-
-// Used by std::{push,pop}_heap functions
-inline bool operator<(const ScopedMessage& a, const ScopedMessage& b) {
-  return GetSequenceNum(a) > GetSequenceNum(b);
-}
-
-MessageQueue::MessageQueue() : MessageQueue(kInitialSequenceNum) {}
-
-MessageQueue::MessageQueue(uint64_t next_sequence_num)
-    : next_sequence_num_(next_sequence_num) {
-  // The message queue is blocked waiting for a message with sequence number
-  // equal to |next_sequence_num|.
-}
-
-MessageQueue::~MessageQueue() {
-#if DCHECK_IS_ON()
-  size_t num_leaked_ports = 0;
-  for (const auto& message : heap_)
-    num_leaked_ports += message->num_ports();
-  DVLOG_IF(1, num_leaked_ports > 0)
-      << "Leaking " << num_leaked_ports << " ports in unreceived messages";
-#endif
-}
-
-bool MessageQueue::HasNextMessage() const {
-  return !heap_.empty() && GetSequenceNum(heap_[0]) == next_sequence_num_;
-}
-
-void MessageQueue::GetNextMessage(ScopedMessage* message,
-                                  MessageFilter* filter) {
-  if (!HasNextMessage() || (filter && !filter->Match(*heap_[0].get()))) {
-    message->reset();
-    return;
-  }
-
-  std::pop_heap(heap_.begin(), heap_.end());
-  *message = std::move(heap_.back());
-  heap_.pop_back();
-
-  next_sequence_num_++;
-}
-
-void MessageQueue::AcceptMessage(ScopedMessage message,
-                                 bool* has_next_message) {
-  DCHECK(GetEventHeader(*message)->type == EventType::kUser);
-
-  // TODO: Handle sequence number roll-over.
-
-  heap_.emplace_back(std::move(message));
-  std::push_heap(heap_.begin(), heap_.end());
-
-  if (!signalable_) {
-    *has_next_message = false;
-  } else {
-    *has_next_message = (GetSequenceNum(heap_[0]) == next_sequence_num_);
-  }
-}
-
-void MessageQueue::GetReferencedPorts(std::deque<PortName>* port_names) {
-  for (const auto& message : heap_) {
-    for (size_t i = 0; i < message->num_ports(); ++i)
-      port_names->push_back(message->ports()[i]);
-  }
-}
-
-}  // namespace ports
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/ports/message_queue.h b/mojo/edk/system/ports/message_queue.h
deleted file mode 100644
index d9a47ed..0000000
--- a/mojo/edk/system/ports/message_queue.h
+++ /dev/null
@@ -1,73 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_SYSTEM_PORTS_MESSAGE_QUEUE_H_
-#define MOJO_EDK_SYSTEM_PORTS_MESSAGE_QUEUE_H_
-
-#include <stdint.h>
-
-#include <deque>
-#include <functional>
-#include <limits>
-#include <vector>
-
-#include "base/macros.h"
-#include "mojo/edk/system/ports/message.h"
-
-namespace mojo {
-namespace edk {
-namespace ports {
-
-const uint64_t kInitialSequenceNum = 1;
-const uint64_t kInvalidSequenceNum = std::numeric_limits<uint64_t>::max();
-
-class MessageFilter;
-
-// An incoming message queue for a port. MessageQueue keeps track of the highest
-// known sequence number and can indicate whether the next sequential message is
-// available. Thus the queue enforces message ordering for the consumer without
-// enforcing it for the producer (see AcceptMessage() below.)
-class MessageQueue {
- public:
-  explicit MessageQueue();
-  explicit MessageQueue(uint64_t next_sequence_num);
-  ~MessageQueue();
-
-  void set_signalable(bool value) { signalable_ = value; }
-
-  uint64_t next_sequence_num() const { return next_sequence_num_; }
-
-  bool HasNextMessage() const;
-
-  // Gives ownership of the message. If |filter| is non-null, the next message
-  // will only be retrieved if the filter successfully matches it.
-  void GetNextMessage(ScopedMessage* message, MessageFilter* filter);
-
-  // Takes ownership of the message. Note: Messages are ordered, so while we
-  // have added a message to the queue, we may still be waiting on a message
-  // ahead of this one before we can let any of the messages be returned by
-  // GetNextMessage.
-  //
-  // Furthermore, once has_next_message is set to true, it will remain false
-  // until GetNextMessage is called enough times to return a null message.
-  // In other words, has_next_message acts like an edge trigger.
-  //
-  void AcceptMessage(ScopedMessage message, bool* has_next_message);
-
-  // Returns all of the ports referenced by messages in this message queue.
-  void GetReferencedPorts(std::deque<PortName>* ports);
-
- private:
-  std::vector<ScopedMessage> heap_;
-  uint64_t next_sequence_num_;
-  bool signalable_ = true;
-
-  DISALLOW_COPY_AND_ASSIGN(MessageQueue);
-};
-
-}  // namespace ports
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_PORTS_MESSAGE_QUEUE_H_
diff --git a/mojo/edk/system/ports/name.cc b/mojo/edk/system/ports/name.cc
deleted file mode 100644
index ea17698..0000000
--- a/mojo/edk/system/ports/name.cc
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/system/ports/name.h"
-
-namespace mojo {
-namespace edk {
-namespace ports {
-
-extern const PortName kInvalidPortName = {0, 0};
-
-extern const NodeName kInvalidNodeName = {0, 0};
-
-std::ostream& operator<<(std::ostream& stream, const Name& name) {
-  std::ios::fmtflags flags(stream.flags());
-  stream << std::hex << std::uppercase << name.v1;
-  if (name.v2 != 0)
-    stream << '.' << name.v2;
-  stream.flags(flags);
-  return stream;
-}
-
-}  // namespace ports
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/ports/name.h b/mojo/edk/system/ports/name.h
deleted file mode 100644
index 72e41b9..0000000
--- a/mojo/edk/system/ports/name.h
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_SYSTEM_PORTS_NAME_H_
-#define MOJO_EDK_SYSTEM_PORTS_NAME_H_
-
-#include <stdint.h>
-
-#include <ostream>
-#include <tuple>
-
-#include "base/hash.h"
-
-namespace mojo {
-namespace edk {
-namespace ports {
-
-struct Name {
-  Name(uint64_t v1, uint64_t v2) : v1(v1), v2(v2) {}
-  uint64_t v1, v2;
-};
-
-inline bool operator==(const Name& a, const Name& b) {
-  return a.v1 == b.v1 && a.v2 == b.v2;
-}
-
-inline bool operator!=(const Name& a, const Name& b) {
-  return !(a == b);
-}
-
-inline bool operator<(const Name& a, const Name& b) {
-  return std::tie(a.v1, a.v2) < std::tie(b.v1, b.v2);
-}
-
-std::ostream& operator<<(std::ostream& stream, const Name& name);
-
-struct PortName : Name {
-  PortName() : Name(0, 0) {}
-  PortName(uint64_t v1, uint64_t v2) : Name(v1, v2) {}
-};
-
-extern const PortName kInvalidPortName;
-
-struct NodeName : Name {
-  NodeName() : Name(0, 0) {}
-  NodeName(uint64_t v1, uint64_t v2) : Name(v1, v2) {}
-};
-
-extern const NodeName kInvalidNodeName;
-
-}  // namespace ports
-}  // namespace edk
-}  // namespace mojo
-
-namespace std {
-
-template <>
-struct hash<mojo::edk::ports::PortName> {
-  std::size_t operator()(const mojo::edk::ports::PortName& name) const {
-    return base::HashInts64(name.v1, name.v2);
-  }
-};
-
-template <>
-struct hash<mojo::edk::ports::NodeName> {
-  std::size_t operator()(const mojo::edk::ports::NodeName& name) const {
-    return base::HashInts64(name.v1, name.v2);
-  }
-};
-
-}  // namespace std
-
-#endif  // MOJO_EDK_SYSTEM_PORTS_NAME_H_
diff --git a/mojo/edk/system/ports/node.cc b/mojo/edk/system/ports/node.cc
deleted file mode 100644
index f9a3feb..0000000
--- a/mojo/edk/system/ports/node.cc
+++ /dev/null
@@ -1,1385 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/system/ports/node.h"
-
-#include <string.h>
-
-#include <utility>
-
-#include "base/atomicops.h"
-#include "base/logging.h"
-#include "base/memory/ref_counted.h"
-#include "base/synchronization/lock.h"
-#include "mojo/edk/system/ports/node_delegate.h"
-
-namespace mojo {
-namespace edk {
-namespace ports {
-
-namespace {
-
-int DebugError(const char* message, int error_code) {
-  CHECK(false) << "Oops: " << message;
-  return error_code;
-}
-
-#define OOPS(x) DebugError(#x, x)
-
-bool CanAcceptMoreMessages(const Port* port) {
-  // Have we already doled out the last message (i.e., do we expect to NOT
-  // receive further messages)?
-  uint64_t next_sequence_num = port->message_queue.next_sequence_num();
-  if (port->state == Port::kClosed)
-    return false;
-  if (port->peer_closed || port->remove_proxy_on_last_message) {
-    if (port->last_sequence_num_to_receive == next_sequence_num - 1)
-      return false;
-  }
-  return true;
-}
-
-}  // namespace
-
-class Node::LockedPort {
- public:
-  explicit LockedPort(Port* port) : port_(port) {
-    port_->lock.AssertAcquired();
-  }
-
-  Port* get() const { return port_; }
-  Port* operator->() const { return port_; }
-
- private:
-  Port* const port_;
-};
-
-Node::Node(const NodeName& name, NodeDelegate* delegate)
-    : name_(name),
-      delegate_(delegate) {
-}
-
-Node::~Node() {
-  if (!ports_.empty())
-    DLOG(WARNING) << "Unclean shutdown for node " << name_;
-}
-
-bool Node::CanShutdownCleanly(ShutdownPolicy policy) {
-  base::AutoLock ports_lock(ports_lock_);
-
-  if (policy == ShutdownPolicy::DONT_ALLOW_LOCAL_PORTS) {
-#if DCHECK_IS_ON()
-    for (auto entry : ports_) {
-      DVLOG(2) << "Port " << entry.first << " referencing node "
-               << entry.second->peer_node_name << " is blocking shutdown of "
-               << "node " << name_ << " (state=" << entry.second->state << ")";
-    }
-#endif
-    return ports_.empty();
-  }
-
-  DCHECK_EQ(policy, ShutdownPolicy::ALLOW_LOCAL_PORTS);
-
-  // NOTE: This is not efficient, though it probably doesn't need to be since
-  // relatively few ports should be open during shutdown and shutdown doesn't
-  // need to be blazingly fast.
-  bool can_shutdown = true;
-  for (auto entry : ports_) {
-    base::AutoLock lock(entry.second->lock);
-    if (entry.second->peer_node_name != name_ &&
-        entry.second->state != Port::kReceiving) {
-      can_shutdown = false;
-#if DCHECK_IS_ON()
-      DVLOG(2) << "Port " << entry.first << " referencing node "
-               << entry.second->peer_node_name << " is blocking shutdown of "
-               << "node " << name_ << " (state=" << entry.second->state << ")";
-#else
-      // Exit early when not debugging.
-      break;
-#endif
-    }
-  }
-
-  return can_shutdown;
-}
-
-int Node::GetPort(const PortName& port_name, PortRef* port_ref) {
-  scoped_refptr<Port> port = GetPort(port_name);
-  if (!port)
-    return ERROR_PORT_UNKNOWN;
-
-  *port_ref = PortRef(port_name, std::move(port));
-  return OK;
-}
-
-int Node::CreateUninitializedPort(PortRef* port_ref) {
-  PortName port_name;
-  delegate_->GenerateRandomPortName(&port_name);
-
-  scoped_refptr<Port> port(new Port(kInitialSequenceNum, kInitialSequenceNum));
-  int rv = AddPortWithName(port_name, port);
-  if (rv != OK)
-    return rv;
-
-  *port_ref = PortRef(port_name, std::move(port));
-  return OK;
-}
-
-int Node::InitializePort(const PortRef& port_ref,
-                         const NodeName& peer_node_name,
-                         const PortName& peer_port_name) {
-  Port* port = port_ref.port();
-
-  {
-    base::AutoLock lock(port->lock);
-    if (port->state != Port::kUninitialized)
-      return ERROR_PORT_STATE_UNEXPECTED;
-
-    port->state = Port::kReceiving;
-    port->peer_node_name = peer_node_name;
-    port->peer_port_name = peer_port_name;
-  }
-
-  delegate_->PortStatusChanged(port_ref);
-
-  return OK;
-}
-
-int Node::CreatePortPair(PortRef* port0_ref, PortRef* port1_ref) {
-  int rv;
-
-  rv = CreateUninitializedPort(port0_ref);
-  if (rv != OK)
-    return rv;
-
-  rv = CreateUninitializedPort(port1_ref);
-  if (rv != OK)
-    return rv;
-
-  rv = InitializePort(*port0_ref, name_, port1_ref->name());
-  if (rv != OK)
-    return rv;
-
-  rv = InitializePort(*port1_ref, name_, port0_ref->name());
-  if (rv != OK)
-    return rv;
-
-  return OK;
-}
-
-int Node::SetUserData(const PortRef& port_ref,
-                      scoped_refptr<UserData> user_data) {
-  Port* port = port_ref.port();
-
-  base::AutoLock lock(port->lock);
-  if (port->state == Port::kClosed)
-    return ERROR_PORT_STATE_UNEXPECTED;
-
-  port->user_data = std::move(user_data);
-
-  return OK;
-}
-
-int Node::GetUserData(const PortRef& port_ref,
-                      scoped_refptr<UserData>* user_data) {
-  Port* port = port_ref.port();
-
-  base::AutoLock lock(port->lock);
-  if (port->state == Port::kClosed)
-    return ERROR_PORT_STATE_UNEXPECTED;
-
-  *user_data = port->user_data;
-
-  return OK;
-}
-
-int Node::ClosePort(const PortRef& port_ref) {
-  std::deque<PortName> referenced_port_names;
-
-  ObserveClosureEventData data;
-
-  NodeName peer_node_name;
-  PortName peer_port_name;
-  Port* port = port_ref.port();
-  {
-    // We may need to erase the port, which requires ports_lock_ to be held,
-    // but ports_lock_ must be acquired before any individual port locks.
-    base::AutoLock ports_lock(ports_lock_);
-
-    base::AutoLock lock(port->lock);
-    if (port->state == Port::kUninitialized) {
-      // If the port was not yet initialized, there's nothing interesting to do.
-      ErasePort_Locked(port_ref.name());
-      return OK;
-    }
-
-    if (port->state != Port::kReceiving)
-      return ERROR_PORT_STATE_UNEXPECTED;
-
-    port->state = Port::kClosed;
-
-    // We pass along the sequence number of the last message sent from this
-    // port to allow the peer to have the opportunity to consume all inbound
-    // messages before notifying the embedder that this port is closed.
-    data.last_sequence_num = port->next_sequence_num_to_send - 1;
-
-    peer_node_name = port->peer_node_name;
-    peer_port_name = port->peer_port_name;
-
-    // If the port being closed still has unread messages, then we need to take
-    // care to close those ports so as to avoid leaking memory.
-    port->message_queue.GetReferencedPorts(&referenced_port_names);
-
-    ErasePort_Locked(port_ref.name());
-  }
-
-  DVLOG(2) << "Sending ObserveClosure from " << port_ref.name() << "@" << name_
-           << " to " << peer_port_name << "@" << peer_node_name;
-
-  delegate_->ForwardMessage(
-      peer_node_name,
-      NewInternalMessage(peer_port_name, EventType::kObserveClosure, data));
-
-  for (const auto& name : referenced_port_names) {
-    PortRef ref;
-    if (GetPort(name, &ref) == OK)
-      ClosePort(ref);
-  }
-  return OK;
-}
-
-int Node::GetStatus(const PortRef& port_ref, PortStatus* port_status) {
-  Port* port = port_ref.port();
-
-  base::AutoLock lock(port->lock);
-
-  if (port->state != Port::kReceiving)
-    return ERROR_PORT_STATE_UNEXPECTED;
-
-  port_status->has_messages = port->message_queue.HasNextMessage();
-  port_status->receiving_messages = CanAcceptMoreMessages(port);
-  port_status->peer_closed = port->peer_closed;
-  return OK;
-}
-
-int Node::GetMessage(const PortRef& port_ref,
-                     ScopedMessage* message,
-                     MessageFilter* filter) {
-  *message = nullptr;
-
-  DVLOG(4) << "GetMessage for " << port_ref.name() << "@" << name_;
-
-  Port* port = port_ref.port();
-  {
-    base::AutoLock lock(port->lock);
-
-    // This could also be treated like the port being unknown since the
-    // embedder should no longer be referring to a port that has been sent.
-    if (port->state != Port::kReceiving)
-      return ERROR_PORT_STATE_UNEXPECTED;
-
-    // Let the embedder get messages until there are no more before reporting
-    // that the peer closed its end.
-    if (!CanAcceptMoreMessages(port))
-      return ERROR_PORT_PEER_CLOSED;
-
-    port->message_queue.GetNextMessage(message, filter);
-  }
-
-  // Allow referenced ports to trigger PortStatusChanged calls.
-  if (*message) {
-    for (size_t i = 0; i < (*message)->num_ports(); ++i) {
-      const PortName& new_port_name = (*message)->ports()[i];
-      scoped_refptr<Port> new_port = GetPort(new_port_name);
-
-      DCHECK(new_port) << "Port " << new_port_name << "@" << name_
-                       << " does not exist!";
-
-      base::AutoLock lock(new_port->lock);
-
-      DCHECK(new_port->state == Port::kReceiving);
-      new_port->message_queue.set_signalable(true);
-    }
-  }
-
-  return OK;
-}
-
-int Node::SendMessage(const PortRef& port_ref, ScopedMessage message) {
-  int rv = SendMessageInternal(port_ref, &message);
-  if (rv != OK) {
-    // If send failed, close all carried ports. Note that we're careful not to
-    // close the sending port itself if it happened to be one of the encoded
-    // ports (an invalid but possible condition.)
-    for (size_t i = 0; i < message->num_ports(); ++i) {
-      if (message->ports()[i] == port_ref.name())
-        continue;
-
-      PortRef port;
-      if (GetPort(message->ports()[i], &port) == OK)
-        ClosePort(port);
-    }
-  }
-  return rv;
-}
-
-int Node::AcceptMessage(ScopedMessage message) {
-  const EventHeader* header = GetEventHeader(*message);
-  switch (header->type) {
-    case EventType::kUser:
-      return OnUserMessage(std::move(message));
-    case EventType::kPortAccepted:
-      return OnPortAccepted(header->port_name);
-    case EventType::kObserveProxy:
-      return OnObserveProxy(
-          header->port_name,
-          *GetEventData<ObserveProxyEventData>(*message));
-    case EventType::kObserveProxyAck:
-      return OnObserveProxyAck(
-          header->port_name,
-          GetEventData<ObserveProxyAckEventData>(*message)->last_sequence_num);
-    case EventType::kObserveClosure:
-      return OnObserveClosure(
-          header->port_name,
-          GetEventData<ObserveClosureEventData>(*message)->last_sequence_num);
-    case EventType::kMergePort:
-      return OnMergePort(header->port_name,
-                         *GetEventData<MergePortEventData>(*message));
-  }
-  return OOPS(ERROR_NOT_IMPLEMENTED);
-}
-
-int Node::MergePorts(const PortRef& port_ref,
-                     const NodeName& destination_node_name,
-                     const PortName& destination_port_name) {
-  Port* port = port_ref.port();
-  MergePortEventData data;
-  {
-    base::AutoLock lock(port->lock);
-
-    DVLOG(1) << "Sending MergePort from " << port_ref.name() << "@" << name_
-             << " to " << destination_port_name << "@" << destination_node_name;
-
-    // Send the port-to-merge over to the destination node so it can be merged
-    // into the port cycle atomically there.
-    data.new_port_name = port_ref.name();
-    WillSendPort(LockedPort(port), destination_node_name, &data.new_port_name,
-                 &data.new_port_descriptor);
-  }
-  delegate_->ForwardMessage(
-      destination_node_name,
-      NewInternalMessage(destination_port_name,
-                         EventType::kMergePort, data));
-  return OK;
-}
-
-int Node::MergeLocalPorts(const PortRef& port0_ref, const PortRef& port1_ref) {
-  Port* port0 = port0_ref.port();
-  Port* port1 = port1_ref.port();
-  int rv;
-  {
-    // |ports_lock_| must be held when acquiring overlapping port locks.
-    base::AutoLock ports_lock(ports_lock_);
-    base::AutoLock port0_lock(port0->lock);
-    base::AutoLock port1_lock(port1->lock);
-
-    DVLOG(1) << "Merging local ports " << port0_ref.name() << "@" << name_
-             << " and " << port1_ref.name() << "@" << name_;
-
-    if (port0->state != Port::kReceiving || port1->state != Port::kReceiving)
-      rv = ERROR_PORT_STATE_UNEXPECTED;
-    else
-      rv = MergePorts_Locked(port0_ref, port1_ref);
-  }
-
-  if (rv != OK) {
-    ClosePort(port0_ref);
-    ClosePort(port1_ref);
-  }
-
-  return rv;
-}
-
-int Node::LostConnectionToNode(const NodeName& node_name) {
-  // We can no longer send events to the given node. We also can't expect any
-  // PortAccepted events.
-
-  DVLOG(1) << "Observing lost connection from node " << name_
-           << " to node " << node_name;
-
-  DestroyAllPortsWithPeer(node_name, kInvalidPortName);
-  return OK;
-}
-
-int Node::OnUserMessage(ScopedMessage message) {
-  PortName port_name = GetEventHeader(*message)->port_name;
-  const auto* event = GetEventData<UserEventData>(*message);
-
-#if DCHECK_IS_ON()
-  std::ostringstream ports_buf;
-  for (size_t i = 0; i < message->num_ports(); ++i) {
-    if (i > 0)
-      ports_buf << ",";
-    ports_buf << message->ports()[i];
-  }
-
-  DVLOG(4) << "AcceptMessage " << event->sequence_num
-             << " [ports=" << ports_buf.str() << "] at "
-             << port_name << "@" << name_;
-#endif
-
-  scoped_refptr<Port> port = GetPort(port_name);
-
-  // Even if this port does not exist, cannot receive anymore messages or is
-  // buffering or proxying messages, we still need these ports to be bound to
-  // this node. When the message is forwarded, these ports will get transferred
-  // following the usual method. If the message cannot be accepted, then the
-  // newly bound ports will simply be closed.
-
-  for (size_t i = 0; i < message->num_ports(); ++i) {
-    int rv = AcceptPort(message->ports()[i], GetPortDescriptors(event)[i]);
-    if (rv != OK)
-      return rv;
-  }
-
-  bool has_next_message = false;
-  bool message_accepted = false;
-
-  if (port) {
-    // We may want to forward messages once the port lock is held, so we must
-    // acquire |ports_lock_| first.
-    base::AutoLock ports_lock(ports_lock_);
-    base::AutoLock lock(port->lock);
-
-    // Reject spurious messages if we've already received the last expected
-    // message.
-    if (CanAcceptMoreMessages(port.get())) {
-      message_accepted = true;
-      port->message_queue.AcceptMessage(std::move(message), &has_next_message);
-
-      if (port->state == Port::kBuffering) {
-        has_next_message = false;
-      } else if (port->state == Port::kProxying) {
-        has_next_message = false;
-
-        // Forward messages. We forward messages in sequential order here so
-        // that we maintain the message queue's notion of next sequence number.
-        // That's useful for the proxy removal process as we can tell when this
-        // port has seen all of the messages it is expected to see.
-        int rv = ForwardMessages_Locked(LockedPort(port.get()), port_name);
-        if (rv != OK)
-          return rv;
-
-        MaybeRemoveProxy_Locked(LockedPort(port.get()), port_name);
-      }
-    }
-  }
-
-  if (!message_accepted) {
-    DVLOG(2) << "Message not accepted!\n";
-    // Close all newly accepted ports as they are effectively orphaned.
-    for (size_t i = 0; i < message->num_ports(); ++i) {
-      PortRef port_ref;
-      if (GetPort(message->ports()[i], &port_ref) == OK) {
-        ClosePort(port_ref);
-      } else {
-        DLOG(WARNING) << "Cannot close non-existent port!\n";
-      }
-    }
-  } else if (has_next_message) {
-    PortRef port_ref(port_name, port);
-    delegate_->PortStatusChanged(port_ref);
-  }
-
-  return OK;
-}
-
-int Node::OnPortAccepted(const PortName& port_name) {
-  scoped_refptr<Port> port = GetPort(port_name);
-  if (!port)
-    return ERROR_PORT_UNKNOWN;
-
-  DVLOG(2) << "PortAccepted at " << port_name << "@" << name_
-           << " pointing to "
-           << port->peer_port_name << "@" << port->peer_node_name;
-
-  return BeginProxying(PortRef(port_name, std::move(port)));
-}
-
-int Node::OnObserveProxy(const PortName& port_name,
-                         const ObserveProxyEventData& event) {
-  if (port_name == kInvalidPortName) {
-    // An ObserveProxy with an invalid target port name is a broadcast used to
-    // inform ports when their peer (which was itself a proxy) has become
-    // defunct due to unexpected node disconnection.
-    //
-    // Receiving ports affected by this treat it as equivalent to peer closure.
-    // Proxies affected by this can be removed and will in turn broadcast their
-    // own death with a similar message.
-    CHECK_EQ(event.proxy_to_node_name, kInvalidNodeName);
-    CHECK_EQ(event.proxy_to_port_name, kInvalidPortName);
-    DestroyAllPortsWithPeer(event.proxy_node_name, event.proxy_port_name);
-    return OK;
-  }
-
-  // The port may have already been closed locally, in which case the
-  // ObserveClosure message will contain the last_sequence_num field.
-  // We can then silently ignore this message.
-  scoped_refptr<Port> port = GetPort(port_name);
-  if (!port) {
-    DVLOG(1) << "ObserveProxy: " << port_name << "@" << name_ << " not found";
-    return OK;
-  }
-
-  DVLOG(2) << "ObserveProxy at " << port_name << "@" << name_ << ", proxy at "
-           << event.proxy_port_name << "@"
-           << event.proxy_node_name << " pointing to "
-           << event.proxy_to_port_name << "@"
-           << event.proxy_to_node_name;
-
-  {
-    base::AutoLock lock(port->lock);
-
-    if (port->peer_node_name == event.proxy_node_name &&
-        port->peer_port_name == event.proxy_port_name) {
-      if (port->state == Port::kReceiving) {
-        port->peer_node_name = event.proxy_to_node_name;
-        port->peer_port_name = event.proxy_to_port_name;
-
-        ObserveProxyAckEventData ack;
-        ack.last_sequence_num = port->next_sequence_num_to_send - 1;
-
-        delegate_->ForwardMessage(
-            event.proxy_node_name,
-            NewInternalMessage(event.proxy_port_name,
-                               EventType::kObserveProxyAck,
-                               ack));
-      } else {
-        // As a proxy ourselves, we don't know how to honor the ObserveProxy
-        // event or to populate the last_sequence_num field of ObserveProxyAck.
-        // Afterall, another port could be sending messages to our peer now
-        // that we've sent out our own ObserveProxy event.  Instead, we will
-        // send an ObserveProxyAck indicating that the ObserveProxy event
-        // should be re-sent (last_sequence_num set to kInvalidSequenceNum).
-        // However, this has to be done after we are removed as a proxy.
-        // Otherwise, we might just find ourselves back here again, which
-        // would be akin to a busy loop.
-
-        DVLOG(2) << "Delaying ObserveProxyAck to "
-                 << event.proxy_port_name << "@" << event.proxy_node_name;
-
-        ObserveProxyAckEventData ack;
-        ack.last_sequence_num = kInvalidSequenceNum;
-
-        port->send_on_proxy_removal.reset(
-            new std::pair<NodeName, ScopedMessage>(
-                event.proxy_node_name,
-                NewInternalMessage(event.proxy_port_name,
-                                   EventType::kObserveProxyAck,
-                                   ack)));
-      }
-    } else {
-      // Forward this event along to our peer. Eventually, it should find the
-      // port referring to the proxy.
-      delegate_->ForwardMessage(
-          port->peer_node_name,
-          NewInternalMessage(port->peer_port_name,
-                             EventType::kObserveProxy,
-                             event));
-    }
-  }
-  return OK;
-}
-
-int Node::OnObserveProxyAck(const PortName& port_name,
-                            uint64_t last_sequence_num) {
-  DVLOG(2) << "ObserveProxyAck at " << port_name << "@" << name_
-           << " (last_sequence_num=" << last_sequence_num << ")";
-
-  scoped_refptr<Port> port = GetPort(port_name);
-  if (!port)
-    return ERROR_PORT_UNKNOWN;  // The port may have observed closure first, so
-                                // this is not an "Oops".
-
-  {
-    base::AutoLock lock(port->lock);
-
-    if (port->state != Port::kProxying)
-      return OOPS(ERROR_PORT_STATE_UNEXPECTED);
-
-    if (last_sequence_num == kInvalidSequenceNum) {
-      // Send again.
-      InitiateProxyRemoval(LockedPort(port.get()), port_name);
-      return OK;
-    }
-
-    // We can now remove this port once we have received and forwarded the last
-    // message addressed to this port.
-    port->remove_proxy_on_last_message = true;
-    port->last_sequence_num_to_receive = last_sequence_num;
-  }
-  TryRemoveProxy(PortRef(port_name, std::move(port)));
-  return OK;
-}
-
-int Node::OnObserveClosure(const PortName& port_name,
-                           uint64_t last_sequence_num) {
-  // OK if the port doesn't exist, as it may have been closed already.
-  scoped_refptr<Port> port = GetPort(port_name);
-  if (!port)
-    return OK;
-
-  // This message tells the port that it should no longer expect more messages
-  // beyond last_sequence_num. This message is forwarded along until we reach
-  // the receiving end, and this message serves as an equivalent to
-  // ObserveProxyAck.
-
-  bool notify_delegate = false;
-  ObserveClosureEventData forwarded_data;
-  NodeName peer_node_name;
-  PortName peer_port_name;
-  bool try_remove_proxy = false;
-  {
-    base::AutoLock lock(port->lock);
-
-    port->peer_closed = true;
-    port->last_sequence_num_to_receive = last_sequence_num;
-
-    DVLOG(2) << "ObserveClosure at " << port_name << "@" << name_
-             << " (state=" << port->state << ") pointing to "
-             << port->peer_port_name << "@" << port->peer_node_name
-             << " (last_sequence_num=" << last_sequence_num << ")";
-
-    // We always forward ObserveClosure, even beyond the receiving port which
-    // cares about it. This ensures that any dead-end proxies beyond that port
-    // are notified to remove themselves.
-
-    if (port->state == Port::kReceiving) {
-      notify_delegate = true;
-
-      // When forwarding along the other half of the port cycle, this will only
-      // reach dead-end proxies. Tell them we've sent our last message so they
-      // can go away.
-      //
-      // TODO: Repurposing ObserveClosure for this has the desired result but
-      // may be semantically confusing since the forwarding port is not actually
-      // closed. Consider replacing this with a new event type.
-      forwarded_data.last_sequence_num = port->next_sequence_num_to_send - 1;
-    } else {
-      // We haven't yet reached the receiving peer of the closed port, so
-      // forward the message along as-is.
-      forwarded_data.last_sequence_num = last_sequence_num;
-
-      // See about removing the port if it is a proxy as our peer won't be able
-      // to participate in proxy removal.
-      port->remove_proxy_on_last_message = true;
-      if (port->state == Port::kProxying)
-        try_remove_proxy = true;
-    }
-
-    DVLOG(2) << "Forwarding ObserveClosure from "
-             << port_name << "@" << name_ << " to peer "
-             << port->peer_port_name << "@" << port->peer_node_name
-             << " (last_sequence_num=" << forwarded_data.last_sequence_num
-             << ")";
-
-    peer_node_name = port->peer_node_name;
-    peer_port_name = port->peer_port_name;
-  }
-  if (try_remove_proxy)
-    TryRemoveProxy(PortRef(port_name, port));
-
-  delegate_->ForwardMessage(
-      peer_node_name,
-      NewInternalMessage(peer_port_name, EventType::kObserveClosure,
-                         forwarded_data));
-
-  if (notify_delegate) {
-    PortRef port_ref(port_name, std::move(port));
-    delegate_->PortStatusChanged(port_ref);
-  }
-  return OK;
-}
-
-int Node::OnMergePort(const PortName& port_name,
-                      const MergePortEventData& event) {
-  scoped_refptr<Port> port = GetPort(port_name);
-
-  DVLOG(1) << "MergePort at " << port_name << "@" << name_ << " (state="
-           << (port ? port->state : -1) << ") merging with proxy "
-           << event.new_port_name
-           << "@" << name_ << " pointing to "
-           << event.new_port_descriptor.peer_port_name << "@"
-           << event.new_port_descriptor.peer_node_name << " referred by "
-           << event.new_port_descriptor.referring_port_name << "@"
-           << event.new_port_descriptor.referring_node_name;
-
-  bool close_target_port = false;
-  bool close_new_port = false;
-
-  // Accept the new port. This is now the receiving end of the other port cycle
-  // to be merged with ours.
-  int rv = AcceptPort(event.new_port_name, event.new_port_descriptor);
-  if (rv != OK) {
-    close_target_port = true;
-  } else if (port) {
-    // BeginProxying_Locked may call MaybeRemoveProxy_Locked, which in turn
-    // needs to hold |ports_lock_|. We also acquire multiple port locks within.
-    base::AutoLock ports_lock(ports_lock_);
-    base::AutoLock lock(port->lock);
-
-    if (port->state != Port::kReceiving) {
-      close_new_port = true;
-    } else {
-      scoped_refptr<Port> new_port = GetPort_Locked(event.new_port_name);
-      base::AutoLock new_port_lock(new_port->lock);
-      DCHECK(new_port->state == Port::kReceiving);
-
-      // Both ports are locked. Now all we have to do is swap their peer
-      // information and set them up as proxies.
-
-      PortRef port0_ref(port_name, port);
-      PortRef port1_ref(event.new_port_name, new_port);
-      int rv = MergePorts_Locked(port0_ref, port1_ref);
-      if (rv == OK)
-        return rv;
-
-      close_new_port = true;
-      close_target_port = true;
-    }
-  } else {
-    close_new_port = true;
-  }
-
-  if (close_target_port) {
-    PortRef target_port;
-    rv = GetPort(port_name, &target_port);
-    DCHECK(rv == OK);
-
-    ClosePort(target_port);
-  }
-
-  if (close_new_port) {
-    PortRef new_port;
-    rv = GetPort(event.new_port_name, &new_port);
-    DCHECK(rv == OK);
-
-    ClosePort(new_port);
-  }
-
-  return ERROR_PORT_STATE_UNEXPECTED;
-}
-
-int Node::AddPortWithName(const PortName& port_name, scoped_refptr<Port> port) {
-  base::AutoLock lock(ports_lock_);
-
-  if (!ports_.insert(std::make_pair(port_name, std::move(port))).second)
-    return OOPS(ERROR_PORT_EXISTS);  // Suggests a bad UUID generator.
-
-  DVLOG(2) << "Created port " << port_name << "@" << name_;
-  return OK;
-}
-
-void Node::ErasePort(const PortName& port_name) {
-  base::AutoLock lock(ports_lock_);
-  ErasePort_Locked(port_name);
-}
-
-void Node::ErasePort_Locked(const PortName& port_name) {
-  ports_lock_.AssertAcquired();
-  ports_.erase(port_name);
-  DVLOG(2) << "Deleted port " << port_name << "@" << name_;
-}
-
-scoped_refptr<Port> Node::GetPort(const PortName& port_name) {
-  base::AutoLock lock(ports_lock_);
-  return GetPort_Locked(port_name);
-}
-
-scoped_refptr<Port> Node::GetPort_Locked(const PortName& port_name) {
-  ports_lock_.AssertAcquired();
-  auto iter = ports_.find(port_name);
-  if (iter == ports_.end())
-    return nullptr;
-
-#if (defined(OS_ANDROID) || defined(__ANDROID__)) && defined(ARCH_CPU_ARM64)
-  // Workaround for https://crbug.com/665869.
-  base::subtle::MemoryBarrier();
-#endif
-
-  return iter->second;
-}
-
-int Node::SendMessageInternal(const PortRef& port_ref, ScopedMessage* message) {
-  ScopedMessage& m = *message;
-  for (size_t i = 0; i < m->num_ports(); ++i) {
-    if (m->ports()[i] == port_ref.name())
-      return ERROR_PORT_CANNOT_SEND_SELF;
-  }
-
-  Port* port = port_ref.port();
-  NodeName peer_node_name;
-  {
-    // We must acquire |ports_lock_| before grabbing any port locks, because
-    // WillSendMessage_Locked may need to lock multiple ports out of order.
-    base::AutoLock ports_lock(ports_lock_);
-    base::AutoLock lock(port->lock);
-
-    if (port->state != Port::kReceiving)
-      return ERROR_PORT_STATE_UNEXPECTED;
-
-    if (port->peer_closed)
-      return ERROR_PORT_PEER_CLOSED;
-
-    int rv = WillSendMessage_Locked(LockedPort(port), port_ref.name(), m.get());
-    if (rv != OK)
-      return rv;
-
-    // Beyond this point there's no sense in returning anything but OK. Even if
-    // message forwarding or acceptance fails, there's nothing the embedder can
-    // do to recover. Assume that failure beyond this point must be treated as a
-    // transport failure.
-
-    peer_node_name = port->peer_node_name;
-  }
-
-  if (peer_node_name != name_) {
-    delegate_->ForwardMessage(peer_node_name, std::move(m));
-    return OK;
-  }
-
-  int rv = AcceptMessage(std::move(m));
-  if (rv != OK) {
-    // See comment above for why we don't return an error in this case.
-    DVLOG(2) << "AcceptMessage failed: " << rv;
-  }
-
-  return OK;
-}
-
-int Node::MergePorts_Locked(const PortRef& port0_ref,
-                            const PortRef& port1_ref) {
-  Port* port0 = port0_ref.port();
-  Port* port1 = port1_ref.port();
-
-  ports_lock_.AssertAcquired();
-  port0->lock.AssertAcquired();
-  port1->lock.AssertAcquired();
-
-  CHECK(port0->state == Port::kReceiving);
-  CHECK(port1->state == Port::kReceiving);
-
-  // Ports cannot be merged with their own receiving peer!
-  if (port0->peer_node_name == name_ &&
-      port0->peer_port_name == port1_ref.name())
-    return ERROR_PORT_STATE_UNEXPECTED;
-
-  if (port1->peer_node_name == name_ &&
-      port1->peer_port_name == port0_ref.name())
-    return ERROR_PORT_STATE_UNEXPECTED;
-
-  // Only merge if both ports have never sent a message.
-  if (port0->next_sequence_num_to_send == kInitialSequenceNum &&
-      port1->next_sequence_num_to_send == kInitialSequenceNum) {
-    // Swap the ports' peer information and switch them both into buffering
-    // (eventually proxying) mode.
-
-    std::swap(port0->peer_node_name, port1->peer_node_name);
-    std::swap(port0->peer_port_name, port1->peer_port_name);
-
-    port0->state = Port::kBuffering;
-    if (port0->peer_closed)
-      port0->remove_proxy_on_last_message = true;
-
-    port1->state = Port::kBuffering;
-    if (port1->peer_closed)
-      port1->remove_proxy_on_last_message = true;
-
-    int rv1 = BeginProxying_Locked(LockedPort(port0), port0_ref.name());
-    int rv2 = BeginProxying_Locked(LockedPort(port1), port1_ref.name());
-
-    if (rv1 == OK && rv2 == OK) {
-      // If either merged port had a closed peer, its new peer needs to be
-      // informed of this.
-      if (port1->peer_closed) {
-        ObserveClosureEventData data;
-        data.last_sequence_num = port0->last_sequence_num_to_receive;
-        delegate_->ForwardMessage(
-            port0->peer_node_name,
-            NewInternalMessage(port0->peer_port_name,
-                               EventType::kObserveClosure, data));
-      }
-
-      if (port0->peer_closed) {
-        ObserveClosureEventData data;
-        data.last_sequence_num = port1->last_sequence_num_to_receive;
-        delegate_->ForwardMessage(
-            port1->peer_node_name,
-            NewInternalMessage(port1->peer_port_name,
-                               EventType::kObserveClosure, data));
-      }
-
-      return OK;
-    }
-
-    // If either proxy failed to initialize (e.g. had undeliverable messages
-    // or ended up in a bad state somehow), we keep the system in a consistent
-    // state by undoing the peer swap.
-    std::swap(port0->peer_node_name, port1->peer_node_name);
-    std::swap(port0->peer_port_name, port1->peer_port_name);
-    port0->remove_proxy_on_last_message = false;
-    port1->remove_proxy_on_last_message = false;
-    port0->state = Port::kReceiving;
-    port1->state = Port::kReceiving;
-  }
-
-  return ERROR_PORT_STATE_UNEXPECTED;
-}
-
-void Node::WillSendPort(const LockedPort& port,
-                        const NodeName& to_node_name,
-                        PortName* port_name,
-                        PortDescriptor* port_descriptor) {
-  port->lock.AssertAcquired();
-
-  PortName local_port_name = *port_name;
-
-  PortName new_port_name;
-  delegate_->GenerateRandomPortName(&new_port_name);
-
-  // Make sure we don't send messages to the new peer until after we know it
-  // exists. In the meantime, just buffer messages locally.
-  DCHECK(port->state == Port::kReceiving);
-  port->state = Port::kBuffering;
-
-  // If we already know our peer is closed, we already know this proxy can
-  // be removed once it receives and forwards its last expected message.
-  if (port->peer_closed)
-    port->remove_proxy_on_last_message = true;
-
-  *port_name = new_port_name;
-
-  port_descriptor->peer_node_name = port->peer_node_name;
-  port_descriptor->peer_port_name = port->peer_port_name;
-  port_descriptor->referring_node_name = name_;
-  port_descriptor->referring_port_name = local_port_name;
-  port_descriptor->next_sequence_num_to_send = port->next_sequence_num_to_send;
-  port_descriptor->next_sequence_num_to_receive =
-      port->message_queue.next_sequence_num();
-  port_descriptor->last_sequence_num_to_receive =
-      port->last_sequence_num_to_receive;
-  port_descriptor->peer_closed = port->peer_closed;
-  memset(port_descriptor->padding, 0, sizeof(port_descriptor->padding));
-
-  // Configure the local port to point to the new port.
-  port->peer_node_name = to_node_name;
-  port->peer_port_name = new_port_name;
-}
-
-int Node::AcceptPort(const PortName& port_name,
-                     const PortDescriptor& port_descriptor) {
-  scoped_refptr<Port> port = make_scoped_refptr(
-      new Port(port_descriptor.next_sequence_num_to_send,
-               port_descriptor.next_sequence_num_to_receive));
-  port->state = Port::kReceiving;
-  port->peer_node_name = port_descriptor.peer_node_name;
-  port->peer_port_name = port_descriptor.peer_port_name;
-  port->last_sequence_num_to_receive =
-      port_descriptor.last_sequence_num_to_receive;
-  port->peer_closed = port_descriptor.peer_closed;
-
-  DVLOG(2) << "Accepting port " << port_name << " [peer_closed="
-           << port->peer_closed << "; last_sequence_num_to_receive="
-           << port->last_sequence_num_to_receive << "]";
-
-  // A newly accepted port is not signalable until the message referencing the
-  // new port finds its way to the consumer (see GetMessage).
-  port->message_queue.set_signalable(false);
-
-  int rv = AddPortWithName(port_name, std::move(port));
-  if (rv != OK)
-    return rv;
-
-  // Allow referring port to forward messages.
-  delegate_->ForwardMessage(
-      port_descriptor.referring_node_name,
-      NewInternalMessage(port_descriptor.referring_port_name,
-                         EventType::kPortAccepted));
-  return OK;
-}
-
-int Node::WillSendMessage_Locked(const LockedPort& port,
-                                 const PortName& port_name,
-                                 Message* message) {
-  ports_lock_.AssertAcquired();
-  port->lock.AssertAcquired();
-
-  DCHECK(message);
-
-  // Messages may already have a sequence number if they're being forwarded
-  // by a proxy. Otherwise, use the next outgoing sequence number.
-  uint64_t* sequence_num =
-      &GetMutableEventData<UserEventData>(message)->sequence_num;
-  if (*sequence_num == 0)
-    *sequence_num = port->next_sequence_num_to_send++;
-
-#if DCHECK_IS_ON()
-  std::ostringstream ports_buf;
-  for (size_t i = 0; i < message->num_ports(); ++i) {
-    if (i > 0)
-      ports_buf << ",";
-    ports_buf << message->ports()[i];
-  }
-#endif
-
-  if (message->num_ports() > 0) {
-    // Note: Another thread could be trying to send the same ports, so we need
-    // to ensure that they are ours to send before we mutate their state.
-
-    std::vector<scoped_refptr<Port>> ports;
-    ports.resize(message->num_ports());
-
-    {
-      for (size_t i = 0; i < message->num_ports(); ++i) {
-        ports[i] = GetPort_Locked(message->ports()[i]);
-        DCHECK(ports[i]);
-
-        ports[i]->lock.Acquire();
-        int error = OK;
-        if (ports[i]->state != Port::kReceiving)
-          error = ERROR_PORT_STATE_UNEXPECTED;
-        else if (message->ports()[i] == port->peer_port_name)
-          error = ERROR_PORT_CANNOT_SEND_PEER;
-
-        if (error != OK) {
-          // Oops, we cannot send this port.
-          for (size_t j = 0; j <= i; ++j)
-            ports[i]->lock.Release();
-          // Backpedal on the sequence number.
-          port->next_sequence_num_to_send--;
-          return error;
-        }
-      }
-    }
-
-    PortDescriptor* port_descriptors =
-        GetMutablePortDescriptors(GetMutableEventData<UserEventData>(message));
-
-    for (size_t i = 0; i < message->num_ports(); ++i) {
-      WillSendPort(LockedPort(ports[i].get()),
-                   port->peer_node_name,
-                   message->mutable_ports() + i,
-                   port_descriptors + i);
-    }
-
-    for (size_t i = 0; i < message->num_ports(); ++i)
-      ports[i]->lock.Release();
-  }
-
-#if DCHECK_IS_ON()
-  DVLOG(4) << "Sending message "
-           << GetEventData<UserEventData>(*message)->sequence_num
-           << " [ports=" << ports_buf.str() << "]"
-           << " from " << port_name << "@" << name_
-           << " to " << port->peer_port_name << "@" << port->peer_node_name;
-#endif
-
-  GetMutableEventHeader(message)->port_name = port->peer_port_name;
-  return OK;
-}
-
-int Node::BeginProxying_Locked(const LockedPort& port,
-                               const PortName& port_name) {
-  ports_lock_.AssertAcquired();
-  port->lock.AssertAcquired();
-
-  if (port->state != Port::kBuffering)
-    return OOPS(ERROR_PORT_STATE_UNEXPECTED);
-
-  port->state = Port::kProxying;
-
-  int rv = ForwardMessages_Locked(LockedPort(port), port_name);
-  if (rv != OK)
-    return rv;
-
-  // We may have observed closure while buffering. In that case, we can advance
-  // to removing the proxy without sending out an ObserveProxy message. We
-  // already know the last expected message, etc.
-
-  if (port->remove_proxy_on_last_message) {
-    MaybeRemoveProxy_Locked(LockedPort(port), port_name);
-
-    // Make sure we propagate closure to our current peer.
-    ObserveClosureEventData data;
-    data.last_sequence_num = port->last_sequence_num_to_receive;
-    delegate_->ForwardMessage(
-        port->peer_node_name,
-        NewInternalMessage(port->peer_port_name,
-                           EventType::kObserveClosure, data));
-  } else {
-    InitiateProxyRemoval(LockedPort(port), port_name);
-  }
-
-  return OK;
-}
-
-int Node::BeginProxying(PortRef port_ref) {
-  Port* port = port_ref.port();
-  {
-    base::AutoLock ports_lock(ports_lock_);
-    base::AutoLock lock(port->lock);
-
-    if (port->state != Port::kBuffering)
-      return OOPS(ERROR_PORT_STATE_UNEXPECTED);
-
-    port->state = Port::kProxying;
-
-    int rv = ForwardMessages_Locked(LockedPort(port), port_ref.name());
-    if (rv != OK)
-      return rv;
-  }
-
-  bool should_remove;
-  NodeName peer_node_name;
-  ScopedMessage closure_message;
-  {
-    base::AutoLock lock(port->lock);
-    if (port->state != Port::kProxying)
-      return OOPS(ERROR_PORT_STATE_UNEXPECTED);
-
-    should_remove = port->remove_proxy_on_last_message;
-    if (should_remove) {
-      // Make sure we propagate closure to our current peer.
-      ObserveClosureEventData data;
-      data.last_sequence_num = port->last_sequence_num_to_receive;
-      peer_node_name = port->peer_node_name;
-      closure_message = NewInternalMessage(port->peer_port_name,
-                                           EventType::kObserveClosure, data);
-    } else {
-      InitiateProxyRemoval(LockedPort(port), port_ref.name());
-    }
-  }
-
-  if (should_remove) {
-    TryRemoveProxy(port_ref);
-    delegate_->ForwardMessage(peer_node_name, std::move(closure_message));
-  }
-
-  return OK;
-}
-
-int Node::ForwardMessages_Locked(const LockedPort& port,
-                                 const PortName &port_name) {
-  ports_lock_.AssertAcquired();
-  port->lock.AssertAcquired();
-
-  for (;;) {
-    ScopedMessage message;
-    port->message_queue.GetNextMessage(&message, nullptr);
-    if (!message)
-      break;
-
-    int rv = WillSendMessage_Locked(LockedPort(port), port_name, message.get());
-    if (rv != OK)
-      return rv;
-
-    delegate_->ForwardMessage(port->peer_node_name, std::move(message));
-  }
-  return OK;
-}
-
-void Node::InitiateProxyRemoval(const LockedPort& port,
-                                const PortName& port_name) {
-  port->lock.AssertAcquired();
-
-  // To remove this node, we start by notifying the connected graph that we are
-  // a proxy. This allows whatever port is referencing this node to skip it.
-  // Eventually, this node will receive ObserveProxyAck (or ObserveClosure if
-  // the peer was closed in the meantime).
-
-  ObserveProxyEventData data;
-  data.proxy_node_name = name_;
-  data.proxy_port_name = port_name;
-  data.proxy_to_node_name = port->peer_node_name;
-  data.proxy_to_port_name = port->peer_port_name;
-
-  delegate_->ForwardMessage(
-      port->peer_node_name,
-      NewInternalMessage(port->peer_port_name, EventType::kObserveProxy, data));
-}
-
-void Node::MaybeRemoveProxy_Locked(const LockedPort& port,
-                                   const PortName& port_name) {
-  // |ports_lock_| must be held so we can potentilaly ErasePort_Locked().
-  ports_lock_.AssertAcquired();
-  port->lock.AssertAcquired();
-
-  DCHECK(port->state == Port::kProxying);
-
-  // Make sure we have seen ObserveProxyAck before removing the port.
-  if (!port->remove_proxy_on_last_message)
-    return;
-
-  if (!CanAcceptMoreMessages(port.get())) {
-    // This proxy port is done. We can now remove it!
-    ErasePort_Locked(port_name);
-
-    if (port->send_on_proxy_removal) {
-      NodeName to_node = port->send_on_proxy_removal->first;
-      ScopedMessage& message = port->send_on_proxy_removal->second;
-
-      delegate_->ForwardMessage(to_node, std::move(message));
-      port->send_on_proxy_removal.reset();
-    }
-  } else {
-    DVLOG(2) << "Cannot remove port " << port_name << "@" << name_
-             << " now; waiting for more messages";
-  }
-}
-
-void Node::TryRemoveProxy(PortRef port_ref) {
-  Port* port = port_ref.port();
-  bool should_erase = false;
-  ScopedMessage msg;
-  NodeName to_node;
-  {
-    base::AutoLock lock(port->lock);
-
-    // Port already removed. Nothing to do.
-    if (port->state == Port::kClosed)
-      return;
-
-    DCHECK(port->state == Port::kProxying);
-
-    // Make sure we have seen ObserveProxyAck before removing the port.
-    if (!port->remove_proxy_on_last_message)
-      return;
-
-    if (!CanAcceptMoreMessages(port)) {
-      // This proxy port is done. We can now remove it!
-      should_erase = true;
-
-      if (port->send_on_proxy_removal) {
-        to_node = port->send_on_proxy_removal->first;
-        msg = std::move(port->send_on_proxy_removal->second);
-        port->send_on_proxy_removal.reset();
-      }
-    } else {
-      DVLOG(2) << "Cannot remove port " << port_ref.name() << "@" << name_
-               << " now; waiting for more messages";
-    }
-  }
-
-  if (should_erase)
-    ErasePort(port_ref.name());
-
-  if (msg)
-    delegate_->ForwardMessage(to_node, std::move(msg));
-}
-
-void Node::DestroyAllPortsWithPeer(const NodeName& node_name,
-                                   const PortName& port_name) {
-  // Wipes out all ports whose peer node matches |node_name| and whose peer port
-  // matches |port_name|. If |port_name| is |kInvalidPortName|, only the peer
-  // node is matched.
-
-  std::vector<PortRef> ports_to_notify;
-  std::vector<PortName> dead_proxies_to_broadcast;
-  std::deque<PortName> referenced_port_names;
-
-  {
-    base::AutoLock ports_lock(ports_lock_);
-
-    for (auto iter = ports_.begin(); iter != ports_.end(); ++iter) {
-      Port* port = iter->second.get();
-      {
-        base::AutoLock port_lock(port->lock);
-
-        if (port->peer_node_name == node_name &&
-              (port_name == kInvalidPortName ||
-                    port->peer_port_name == port_name)) {
-          if (!port->peer_closed) {
-            // Treat this as immediate peer closure. It's an exceptional
-            // condition akin to a broken pipe, so we don't care about losing
-            // messages.
-
-            port->peer_closed = true;
-            port->last_sequence_num_to_receive =
-                port->message_queue.next_sequence_num() - 1;
-
-            if (port->state == Port::kReceiving)
-              ports_to_notify.push_back(PortRef(iter->first, port));
-          }
-
-          // We don't expect to forward any further messages, and we don't
-          // expect to receive a Port{Accepted,Rejected} event. Because we're
-          // a proxy with no active peer, we cannot use the normal proxy removal
-          // procedure of forward-propagating an ObserveProxy. Instead we
-          // broadcast our own death so it can be back-propagated. This is
-          // inefficient but rare.
-          if (port->state != Port::kReceiving) {
-            dead_proxies_to_broadcast.push_back(iter->first);
-            iter->second->message_queue.GetReferencedPorts(
-                &referenced_port_names);
-          }
-        }
-      }
-    }
-
-    for (const auto& proxy_name : dead_proxies_to_broadcast) {
-      ports_.erase(proxy_name);
-      DVLOG(2) << "Forcibly deleted port " << proxy_name << "@" << name_;
-    }
-  }
-
-  // Wake up any receiving ports who have just observed simulated peer closure.
-  for (const auto& port : ports_to_notify)
-    delegate_->PortStatusChanged(port);
-
-  for (const auto& proxy_name : dead_proxies_to_broadcast) {
-    // Broadcast an event signifying that this proxy is no longer functioning.
-    ObserveProxyEventData event;
-    event.proxy_node_name = name_;
-    event.proxy_port_name = proxy_name;
-    event.proxy_to_node_name = kInvalidNodeName;
-    event.proxy_to_port_name = kInvalidPortName;
-    delegate_->BroadcastMessage(NewInternalMessage(
-        kInvalidPortName, EventType::kObserveProxy, event));
-
-    // Also process death locally since the port that points this closed one
-    // could be on the current node.
-    // Note: Although this is recursive, only a single port is involved which
-    // limits the expected branching to 1.
-    DestroyAllPortsWithPeer(name_, proxy_name);
-  }
-
-  // Close any ports referenced by the closed proxies.
-  for (const auto& name : referenced_port_names) {
-    PortRef ref;
-    if (GetPort(name, &ref) == OK)
-      ClosePort(ref);
-  }
-}
-
-ScopedMessage Node::NewInternalMessage_Helper(const PortName& port_name,
-                                              const EventType& type,
-                                              const void* data,
-                                              size_t num_data_bytes) {
-  ScopedMessage message;
-  delegate_->AllocMessage(sizeof(EventHeader) + num_data_bytes, &message);
-
-  EventHeader* header = GetMutableEventHeader(message.get());
-  header->port_name = port_name;
-  header->type = type;
-  header->padding = 0;
-
-  if (num_data_bytes)
-    memcpy(header + 1, data, num_data_bytes);
-
-  return message;
-}
-
-}  // namespace ports
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/ports/node.h b/mojo/edk/system/ports/node.h
deleted file mode 100644
index 55b8d27..0000000
--- a/mojo/edk/system/ports/node.h
+++ /dev/null
@@ -1,228 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_SYSTEM_PORTS_NODE_H_
-#define MOJO_EDK_SYSTEM_PORTS_NODE_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <queue>
-#include <unordered_map>
-
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/synchronization/lock.h"
-#include "mojo/edk/system/ports/event.h"
-#include "mojo/edk/system/ports/message.h"
-#include "mojo/edk/system/ports/name.h"
-#include "mojo/edk/system/ports/port.h"
-#include "mojo/edk/system/ports/port_ref.h"
-#include "mojo/edk/system/ports/user_data.h"
-
-#undef SendMessage  // Gah, windows
-
-namespace mojo {
-namespace edk {
-namespace ports {
-
-enum : int {
-  OK = 0,
-  ERROR_PORT_UNKNOWN = -10,
-  ERROR_PORT_EXISTS = -11,
-  ERROR_PORT_STATE_UNEXPECTED = -12,
-  ERROR_PORT_CANNOT_SEND_SELF = -13,
-  ERROR_PORT_PEER_CLOSED = -14,
-  ERROR_PORT_CANNOT_SEND_PEER = -15,
-  ERROR_NOT_IMPLEMENTED = -100,
-};
-
-struct PortStatus {
-  bool has_messages;
-  bool receiving_messages;
-  bool peer_closed;
-};
-
-class MessageFilter;
-class NodeDelegate;
-
-class Node {
- public:
-  enum class ShutdownPolicy {
-    DONT_ALLOW_LOCAL_PORTS,
-    ALLOW_LOCAL_PORTS,
-  };
-
-  // Does not take ownership of the delegate.
-  Node(const NodeName& name, NodeDelegate* delegate);
-  ~Node();
-
-  // Returns true iff there are no open ports referring to another node or ports
-  // in the process of being transferred from this node to another. If this
-  // returns false, then to ensure clean shutdown, it is necessary to keep the
-  // node alive and continue routing messages to it via AcceptMessage. This
-  // method may be called again after AcceptMessage to check if the Node is now
-  // ready to be destroyed.
-  //
-  // If |policy| is set to |ShutdownPolicy::ALLOW_LOCAL_PORTS|, this will return
-  // |true| even if some ports remain alive, as long as none of them are proxies
-  // to another node.
-  bool CanShutdownCleanly(
-      ShutdownPolicy policy = ShutdownPolicy::DONT_ALLOW_LOCAL_PORTS);
-
-  // Lookup the named port.
-  int GetPort(const PortName& port_name, PortRef* port_ref);
-
-  // Creates a port on this node. Before the port can be used, it must be
-  // initialized using InitializePort. This method is useful for bootstrapping
-  // a connection between two nodes. Generally, ports are created using
-  // CreatePortPair instead.
-  int CreateUninitializedPort(PortRef* port_ref);
-
-  // Initializes a newly created port.
-  int InitializePort(const PortRef& port_ref,
-                     const NodeName& peer_node_name,
-                     const PortName& peer_port_name);
-
-  // Generates a new connected pair of ports bound to this node. These ports
-  // are initialized and ready to go.
-  int CreatePortPair(PortRef* port0_ref, PortRef* port1_ref);
-
-  // User data associated with the port.
-  int SetUserData(const PortRef& port_ref, scoped_refptr<UserData> user_data);
-  int GetUserData(const PortRef& port_ref,
-                  scoped_refptr<UserData>* user_data);
-
-  // Prevents further messages from being sent from this port or delivered to
-  // this port. The port is removed, and the port's peer is notified of the
-  // closure after it has consumed all pending messages.
-  int ClosePort(const PortRef& port_ref);
-
-  // Returns the current status of the port.
-  int GetStatus(const PortRef& port_ref, PortStatus* port_status);
-
-  // Returns the next available message on the specified port or returns a null
-  // message if there are none available. Returns ERROR_PORT_PEER_CLOSED to
-  // indicate that this port's peer has closed. In such cases GetMessage may
-  // be called until it yields a null message, indicating that no more messages
-  // may be read from the port.
-  //
-  // If |filter| is non-null, the next available message is returned only if it
-  // is matched by the filter. If the provided filter does not match the next
-  // available message, GetMessage() behaves as if there is no message
-  // available. Ownership of |filter| is not taken, and it must outlive the
-  // extent of this call.
-  int GetMessage(const PortRef& port_ref,
-                 ScopedMessage* message,
-                 MessageFilter* filter);
-
-  // Sends a message from the specified port to its peer. Note that the message
-  // notification may arrive synchronously (via PortStatusChanged() on the
-  // delegate) if the peer is local to this Node.
-  int SendMessage(const PortRef& port_ref, ScopedMessage message);
-
-  // Corresponding to NodeDelegate::ForwardMessage.
-  int AcceptMessage(ScopedMessage message);
-
-  // Called to merge two ports with each other. If you have two independent
-  // port pairs A <=> B and C <=> D, the net result of merging B and C is a
-  // single connected port pair A <=> D.
-  //
-  // Note that the behavior of this operation is undefined if either port to be
-  // merged (B or C above) has ever been read from or written to directly, and
-  // this must ONLY be called on one side of the merge, though it doesn't matter
-  // which side.
-  //
-  // It is safe for the non-merged peers (A and D above) to be transferred,
-  // closed, and/or written to before, during, or after the merge.
-  int MergePorts(const PortRef& port_ref,
-                 const NodeName& destination_node_name,
-                 const PortName& destination_port_name);
-
-  // Like above but merges two ports local to this node. Because both ports are
-  // local this can also verify that neither port has been written to before the
-  // merge. If this fails for any reason, both ports are closed. Otherwise OK
-  // is returned and the ports' receiving peers are connected to each other.
-  int MergeLocalPorts(const PortRef& port0_ref, const PortRef& port1_ref);
-
-  // Called to inform this node that communication with another node is lost
-  // indefinitely. This triggers cleanup of ports bound to this node.
-  int LostConnectionToNode(const NodeName& node_name);
-
- private:
-  class LockedPort;
-
-  // Note: Functions that end with _Locked require |ports_lock_| to be held
-  // before calling.
-  int OnUserMessage(ScopedMessage message);
-  int OnPortAccepted(const PortName& port_name);
-  int OnObserveProxy(const PortName& port_name,
-                     const ObserveProxyEventData& event);
-  int OnObserveProxyAck(const PortName& port_name, uint64_t last_sequence_num);
-  int OnObserveClosure(const PortName& port_name, uint64_t last_sequence_num);
-  int OnMergePort(const PortName& port_name, const MergePortEventData& event);
-
-  int AddPortWithName(const PortName& port_name, scoped_refptr<Port> port);
-  void ErasePort(const PortName& port_name);
-  void ErasePort_Locked(const PortName& port_name);
-  scoped_refptr<Port> GetPort(const PortName& port_name);
-  scoped_refptr<Port> GetPort_Locked(const PortName& port_name);
-
-  int SendMessageInternal(const PortRef& port_ref, ScopedMessage* message);
-  int MergePorts_Locked(const PortRef& port0_ref, const PortRef& port1_ref);
-  void WillSendPort(const LockedPort& port,
-                    const NodeName& to_node_name,
-                    PortName* port_name,
-                    PortDescriptor* port_descriptor);
-  int AcceptPort(const PortName& port_name,
-                 const PortDescriptor& port_descriptor);
-
-  int WillSendMessage_Locked(const LockedPort& port,
-                             const PortName& port_name,
-                             Message* message);
-  int BeginProxying_Locked(const LockedPort& port, const PortName& port_name);
-  int BeginProxying(PortRef port_ref);
-  int ForwardMessages_Locked(const LockedPort& port, const PortName& port_name);
-  void InitiateProxyRemoval(const LockedPort& port, const PortName& port_name);
-  void MaybeRemoveProxy_Locked(const LockedPort& port,
-                               const PortName& port_name);
-  void TryRemoveProxy(PortRef port_ref);
-  void DestroyAllPortsWithPeer(const NodeName& node_name,
-                               const PortName& port_name);
-
-  ScopedMessage NewInternalMessage_Helper(const PortName& port_name,
-                                          const EventType& type,
-                                          const void* data,
-                                          size_t num_data_bytes);
-
-  ScopedMessage NewInternalMessage(const PortName& port_name,
-                                   const EventType& type) {
-    return NewInternalMessage_Helper(port_name, type, nullptr, 0);
-  }
-
-  template <typename EventData>
-  ScopedMessage NewInternalMessage(const PortName& port_name,
-                                   const EventType& type,
-                                   const EventData& data) {
-    return NewInternalMessage_Helper(port_name, type, &data, sizeof(data));
-  }
-
-  const NodeName name_;
-  NodeDelegate* const delegate_;
-
-  // Guards |ports_| as well as any operation which needs to hold multiple port
-  // locks simultaneously. Usage of this is subtle: it must NEVER be acquired
-  // after a Port lock is acquired, and it must ALWAYS be acquired before
-  // calling WillSendMessage_Locked or ForwardMessages_Locked.
-  base::Lock ports_lock_;
-  std::unordered_map<PortName, scoped_refptr<Port>> ports_;
-
-  DISALLOW_COPY_AND_ASSIGN(Node);
-};
-
-}  // namespace ports
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_PORTS_NODE_H_
diff --git a/mojo/edk/system/ports/node_delegate.h b/mojo/edk/system/ports/node_delegate.h
deleted file mode 100644
index 8547302..0000000
--- a/mojo/edk/system/ports/node_delegate.h
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_SYSTEM_PORTS_NODE_DELEGATE_H_
-#define MOJO_EDK_SYSTEM_PORTS_NODE_DELEGATE_H_
-
-#include <stddef.h>
-
-#include "mojo/edk/system/ports/message.h"
-#include "mojo/edk/system/ports/name.h"
-#include "mojo/edk/system/ports/port_ref.h"
-
-namespace mojo {
-namespace edk {
-namespace ports {
-
-class NodeDelegate {
- public:
-  virtual ~NodeDelegate() {}
-
-  // Port names should be difficult to guess.
-  virtual void GenerateRandomPortName(PortName* port_name) = 0;
-
-  // Allocate a message, including a header that can be used by the Node
-  // implementation. |num_header_bytes| will be aligned. The newly allocated
-  // memory need not be zero-filled.
-  virtual void AllocMessage(size_t num_header_bytes,
-                            ScopedMessage* message) = 0;
-
-  // Forward a message asynchronously to the specified node. This method MUST
-  // NOT synchronously call any methods on Node.
-  virtual void ForwardMessage(const NodeName& node, ScopedMessage message) = 0;
-
-  // Broadcast a message to all nodes.
-  virtual void BroadcastMessage(ScopedMessage message) = 0;
-
-  // Indicates that the port's status has changed recently. Use Node::GetStatus
-  // to query the latest status of the port. Note, this event could be spurious
-  // if another thread is simultaneously modifying the status of the port.
-  virtual void PortStatusChanged(const PortRef& port_ref) = 0;
-};
-
-}  // namespace ports
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_PORTS_NODE_DELEGATE_H_
diff --git a/mojo/edk/system/ports/port.cc b/mojo/edk/system/ports/port.cc
deleted file mode 100644
index e4403ae..0000000
--- a/mojo/edk/system/ports/port.cc
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/system/ports/port.h"
-
-namespace mojo {
-namespace edk {
-namespace ports {
-
-Port::Port(uint64_t next_sequence_num_to_send,
-           uint64_t next_sequence_num_to_receive)
-    : state(kUninitialized),
-      next_sequence_num_to_send(next_sequence_num_to_send),
-      last_sequence_num_to_receive(0),
-      message_queue(next_sequence_num_to_receive),
-      remove_proxy_on_last_message(false),
-      peer_closed(false) {}
-
-Port::~Port() {}
-
-}  // namespace ports
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/ports/port.h b/mojo/edk/system/ports/port.h
deleted file mode 100644
index ea53d43..0000000
--- a/mojo/edk/system/ports/port.h
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_SYSTEM_PORTS_PORT_H_
-#define MOJO_EDK_SYSTEM_PORTS_PORT_H_
-
-#include <memory>
-#include <queue>
-#include <utility>
-#include <vector>
-
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/synchronization/lock.h"
-#include "mojo/edk/system/ports/message_queue.h"
-#include "mojo/edk/system/ports/user_data.h"
-
-namespace mojo {
-namespace edk {
-namespace ports {
-
-class Port : public base::RefCountedThreadSafe<Port> {
- public:
-  enum State {
-    kUninitialized,
-    kReceiving,
-    kBuffering,
-    kProxying,
-    kClosed
-  };
-
-  base::Lock lock;
-  State state;
-  NodeName peer_node_name;
-  PortName peer_port_name;
-  uint64_t next_sequence_num_to_send;
-  uint64_t last_sequence_num_to_receive;
-  MessageQueue message_queue;
-  std::unique_ptr<std::pair<NodeName, ScopedMessage>> send_on_proxy_removal;
-  scoped_refptr<UserData> user_data;
-  bool remove_proxy_on_last_message;
-  bool peer_closed;
-
-  Port(uint64_t next_sequence_num_to_send,
-       uint64_t next_sequence_num_to_receive);
-
- private:
-  friend class base::RefCountedThreadSafe<Port>;
-
-  ~Port();
-
-  DISALLOW_COPY_AND_ASSIGN(Port);
-};
-
-}  // namespace ports
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_PORTS_PORT_H_
diff --git a/mojo/edk/system/ports/port_ref.cc b/mojo/edk/system/ports/port_ref.cc
deleted file mode 100644
index 675754d..0000000
--- a/mojo/edk/system/ports/port_ref.cc
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/system/ports/port_ref.h"
-
-#include "mojo/edk/system/ports/port.h"
-
-namespace mojo {
-namespace edk {
-namespace ports {
-
-PortRef::~PortRef() {
-}
-
-PortRef::PortRef() {
-}
-
-PortRef::PortRef(const PortName& name, scoped_refptr<Port> port)
-    : name_(name), port_(std::move(port)) {}
-
-PortRef::PortRef(const PortRef& other)
-    : name_(other.name_), port_(other.port_) {
-}
-
-PortRef& PortRef::operator=(const PortRef& other) {
-  if (&other != this) {
-    name_ = other.name_;
-    port_ = other.port_;
-  }
-  return *this;
-}
-
-}  // namespace ports
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/ports/port_ref.h b/mojo/edk/system/ports/port_ref.h
deleted file mode 100644
index 59036c3..0000000
--- a/mojo/edk/system/ports/port_ref.h
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_SYSTEM_PORTS_PORT_REF_H_
-#define MOJO_EDK_SYSTEM_PORTS_PORT_REF_H_
-
-#include "base/memory/ref_counted.h"
-#include "mojo/edk/system/ports/name.h"
-
-namespace mojo {
-namespace edk {
-namespace ports {
-
-class Port;
-class Node;
-
-class PortRef {
- public:
-  ~PortRef();
-  PortRef();
-  PortRef(const PortName& name, scoped_refptr<Port> port);
-
-  PortRef(const PortRef& other);
-  PortRef& operator=(const PortRef& other);
-
-  const PortName& name() const { return name_; }
-
- private:
-  friend class Node;
-  Port* port() const { return port_.get(); }
-
-  PortName name_;
-  scoped_refptr<Port> port_;
-};
-
-}  // namespace ports
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_PORTS_PORT_REF_H_
diff --git a/mojo/edk/system/ports/ports_unittest.cc b/mojo/edk/system/ports/ports_unittest.cc
deleted file mode 100644
index cb48b3e..0000000
--- a/mojo/edk/system/ports/ports_unittest.cc
+++ /dev/null
@@ -1,1478 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <inttypes.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <map>
-#include <queue>
-#include <sstream>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/logging.h"
-#include "base/memory/ref_counted.h"
-#include "base/rand_util.h"
-#include "base/strings/string_piece.h"
-#include "base/strings/stringprintf.h"
-#include "base/synchronization/lock.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/threading/thread.h"
-#include "mojo/edk/system/ports/event.h"
-#include "mojo/edk/system/ports/node.h"
-#include "mojo/edk/system/ports/node_delegate.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace edk {
-namespace ports {
-namespace test {
-
-namespace {
-
-bool MessageEquals(const ScopedMessage& message, const base::StringPiece& s) {
-  return !strcmp(static_cast<const char*>(message->payload_bytes()), s.data());
-}
-
-class TestMessage : public Message {
- public:
-  static ScopedMessage NewUserMessage(size_t num_payload_bytes,
-                                      size_t num_ports) {
-    return ScopedMessage(new TestMessage(num_payload_bytes, num_ports));
-  }
-
-  TestMessage(size_t num_payload_bytes, size_t num_ports)
-      : Message(num_payload_bytes, num_ports) {
-    start_ = new char[num_header_bytes_ + num_ports_bytes_ + num_payload_bytes];
-    InitializeUserMessageHeader(start_);
-  }
-
-  TestMessage(size_t num_header_bytes,
-              size_t num_payload_bytes,
-              size_t num_ports_bytes)
-      : Message(num_header_bytes,
-                num_payload_bytes,
-                num_ports_bytes) {
-    start_ = new char[num_header_bytes + num_payload_bytes + num_ports_bytes];
-  }
-
-  ~TestMessage() override {
-    delete[] start_;
-  }
-};
-
-class TestNode;
-
-class MessageRouter {
- public:
-  virtual ~MessageRouter() {}
-
-  virtual void GeneratePortName(PortName* name) = 0;
-  virtual void ForwardMessage(TestNode* from_node,
-                              const NodeName& node_name,
-                              ScopedMessage message) = 0;
-  virtual void BroadcastMessage(TestNode* from_node, ScopedMessage message) = 0;
-};
-
-class TestNode : public NodeDelegate {
- public:
-  explicit TestNode(uint64_t id)
-      : node_name_(id, 1),
-        node_(node_name_, this),
-        node_thread_(base::StringPrintf("Node %" PRIu64 " thread", id)),
-        messages_available_event_(
-            base::WaitableEvent::ResetPolicy::AUTOMATIC,
-            base::WaitableEvent::InitialState::NOT_SIGNALED),
-        idle_event_(
-            base::WaitableEvent::ResetPolicy::MANUAL,
-            base::WaitableEvent::InitialState::SIGNALED) {
-  }
-
-  ~TestNode() override {
-    StopWhenIdle();
-    node_thread_.Stop();
-  }
-
-  const NodeName& name() const { return node_name_; }
-
-  // NOTE: Node is thread-safe.
-  Node& node() { return node_; }
-
-  base::WaitableEvent& idle_event() { return idle_event_; }
-
-  bool IsIdle() {
-    base::AutoLock lock(lock_);
-    return started_ && !dispatching_ &&
-        (incoming_messages_.empty() || (block_on_event_ && blocked_));
-  }
-
-  void BlockOnEvent(EventType type) {
-    base::AutoLock lock(lock_);
-    blocked_event_type_ = type;
-    block_on_event_ = true;
-  }
-
-  void Unblock() {
-    base::AutoLock lock(lock_);
-    block_on_event_ = false;
-    messages_available_event_.Signal();
-  }
-
-  void Start(MessageRouter* router) {
-    router_ = router;
-    node_thread_.Start();
-    node_thread_.task_runner()->PostTask(
-        FROM_HERE,
-        base::Bind(&TestNode::ProcessMessages, base::Unretained(this)));
-  }
-
-  void StopWhenIdle() {
-    base::AutoLock lock(lock_);
-    should_quit_ = true;
-    messages_available_event_.Signal();
-  }
-
-  void WakeUp() { messages_available_event_.Signal(); }
-
-  int SendStringMessage(const PortRef& port, const std::string& s) {
-    size_t size = s.size() + 1;
-    ScopedMessage message = TestMessage::NewUserMessage(size, 0);
-    memcpy(message->mutable_payload_bytes(), s.data(), size);
-    return node_.SendMessage(port, std::move(message));
-  }
-
-  int SendStringMessageWithPort(const PortRef& port,
-                                const std::string& s,
-                                const PortName& sent_port_name) {
-    size_t size = s.size() + 1;
-    ScopedMessage message = TestMessage::NewUserMessage(size, 1);
-    memcpy(message->mutable_payload_bytes(), s.data(), size);
-    message->mutable_ports()[0] = sent_port_name;
-    return node_.SendMessage(port, std::move(message));
-  }
-
-  int SendStringMessageWithPort(const PortRef& port,
-                                const std::string& s,
-                                const PortRef& sent_port) {
-    return SendStringMessageWithPort(port, s, sent_port.name());
-  }
-
-  void set_drop_messages(bool value) {
-    base::AutoLock lock(lock_);
-    drop_messages_ = value;
-  }
-
-  void set_save_messages(bool value) {
-    base::AutoLock lock(lock_);
-    save_messages_ = value;
-  }
-
-  bool ReadMessage(const PortRef& port, ScopedMessage* message) {
-    return node_.GetMessage(port, message, nullptr) == OK && *message;
-  }
-
-  bool GetSavedMessage(ScopedMessage* message) {
-    base::AutoLock lock(lock_);
-    if (saved_messages_.empty()) {
-      message->reset();
-      return false;
-    }
-    std::swap(*message, saved_messages_.front());
-    saved_messages_.pop();
-    return true;
-  }
-
-  void EnqueueMessage(ScopedMessage message) {
-    idle_event_.Reset();
-
-    // NOTE: This may be called from ForwardMessage and thus must not reenter
-    // |node_|.
-    base::AutoLock lock(lock_);
-    incoming_messages_.emplace(std::move(message));
-    messages_available_event_.Signal();
-  }
-
-  void GenerateRandomPortName(PortName* port_name) override {
-    DCHECK(router_);
-    router_->GeneratePortName(port_name);
-  }
-
-  void AllocMessage(size_t num_header_bytes, ScopedMessage* message) override {
-    message->reset(new TestMessage(num_header_bytes, 0, 0));
-  }
-
-  void ForwardMessage(const NodeName& node_name,
-                      ScopedMessage message) override {
-    {
-      base::AutoLock lock(lock_);
-      if (drop_messages_) {
-        DVLOG(1) << "Dropping ForwardMessage from node "
-                 << node_name_ << " to " << node_name;
-
-        base::AutoUnlock unlock(lock_);
-        ClosePortsInMessage(message.get());
-        return;
-      }
-    }
-
-    DCHECK(router_);
-    DVLOG(1) << "ForwardMessage from node "
-             << node_name_ << " to " << node_name;
-    router_->ForwardMessage(this, node_name, std::move(message));
-  }
-
-  void BroadcastMessage(ScopedMessage message) override {
-    router_->BroadcastMessage(this, std::move(message));
-  }
-
-  void PortStatusChanged(const PortRef& port) override {
-    // The port may be closed, in which case we ignore the notification.
-    base::AutoLock lock(lock_);
-    if (!save_messages_)
-      return;
-
-    for (;;) {
-      ScopedMessage message;
-      {
-        base::AutoUnlock unlock(lock_);
-        if (!ReadMessage(port, &message))
-          break;
-      }
-
-      saved_messages_.emplace(std::move(message));
-    }
-  }
-
-  void ClosePortsInMessage(Message* message) {
-    for (size_t i = 0; i < message->num_ports(); ++i) {
-      PortRef port;
-      ASSERT_EQ(OK, node_.GetPort(message->ports()[i], &port));
-      EXPECT_EQ(OK, node_.ClosePort(port));
-    }
-  }
-
- private:
-  void ProcessMessages() {
-    for (;;) {
-      messages_available_event_.Wait();
-
-      base::AutoLock lock(lock_);
-
-      if (should_quit_)
-        return;
-
-      dispatching_ = true;
-      while (!incoming_messages_.empty()) {
-        if (block_on_event_ &&
-            GetEventHeader(*incoming_messages_.front())->type ==
-                blocked_event_type_) {
-          blocked_ = true;
-          // Go idle if we hit a blocked event type.
-          break;
-        } else {
-          blocked_ = false;
-        }
-        ScopedMessage message = std::move(incoming_messages_.front());
-        incoming_messages_.pop();
-
-        // NOTE: AcceptMessage() can re-enter this object to call any of the
-        // NodeDelegate interface methods.
-        base::AutoUnlock unlock(lock_);
-        node_.AcceptMessage(std::move(message));
-      }
-
-      dispatching_ = false;
-      started_ = true;
-      idle_event_.Signal();
-    };
-  }
-
-  const NodeName node_name_;
-  Node node_;
-  MessageRouter* router_ = nullptr;
-
-  base::Thread node_thread_;
-  base::WaitableEvent messages_available_event_;
-  base::WaitableEvent idle_event_;
-
-  // Guards fields below.
-  base::Lock lock_;
-  bool started_ = false;
-  bool dispatching_ = false;
-  bool should_quit_ = false;
-  bool drop_messages_ = false;
-  bool save_messages_ = false;
-  bool blocked_ = false;
-  bool block_on_event_ = false;
-  EventType blocked_event_type_;
-  std::queue<ScopedMessage> incoming_messages_;
-  std::queue<ScopedMessage> saved_messages_;
-};
-
-class PortsTest : public testing::Test, public MessageRouter {
- public:
-  void AddNode(TestNode* node) {
-    {
-      base::AutoLock lock(lock_);
-      nodes_[node->name()] = node;
-    }
-    node->Start(this);
-  }
-
-  void RemoveNode(TestNode* node) {
-    {
-      base::AutoLock lock(lock_);
-      nodes_.erase(node->name());
-    }
-
-    for (const auto& entry : nodes_)
-      entry.second->node().LostConnectionToNode(node->name());
-  }
-
-  // Waits until all known Nodes are idle. Message forwarding and processing
-  // is handled in such a way that idleness is a stable state: once all nodes in
-  // the system are idle, they will remain idle until the test explicitly
-  // initiates some further event (e.g. sending a message, closing a port, or
-  // removing a Node).
-  void WaitForIdle() {
-    for (;;) {
-      base::AutoLock global_lock(global_lock_);
-      bool all_nodes_idle = true;
-      for (const auto& entry : nodes_) {
-        if (!entry.second->IsIdle())
-          all_nodes_idle = false;
-        entry.second->WakeUp();
-      }
-      if (all_nodes_idle)
-        return;
-
-      // Wait for any Node to signal that it's idle.
-      base::AutoUnlock global_unlock(global_lock_);
-      std::vector<base::WaitableEvent*> events;
-      for (const auto& entry : nodes_)
-        events.push_back(&entry.second->idle_event());
-      base::WaitableEvent::WaitMany(events.data(), events.size());
-    }
-  }
-
-  void CreatePortPair(TestNode* node0,
-                      PortRef* port0,
-                      TestNode* node1,
-                      PortRef* port1) {
-    if (node0 == node1) {
-      EXPECT_EQ(OK, node0->node().CreatePortPair(port0, port1));
-    } else {
-      EXPECT_EQ(OK, node0->node().CreateUninitializedPort(port0));
-      EXPECT_EQ(OK, node1->node().CreateUninitializedPort(port1));
-      EXPECT_EQ(OK, node0->node().InitializePort(*port0, node1->name(),
-                                                 port1->name()));
-      EXPECT_EQ(OK, node1->node().InitializePort(*port1, node0->name(),
-                                                 port0->name()));
-    }
-  }
-
- private:
-  // MessageRouter:
-  void GeneratePortName(PortName* name) override {
-    base::AutoLock lock(lock_);
-    name->v1 = next_port_id_++;
-    name->v2 = 0;
-  }
-
-  void ForwardMessage(TestNode* from_node,
-                      const NodeName& node_name,
-                      ScopedMessage message) override {
-    base::AutoLock global_lock(global_lock_);
-    base::AutoLock lock(lock_);
-    // Drop messages from nodes that have been removed.
-    if (nodes_.find(from_node->name()) == nodes_.end()) {
-      from_node->ClosePortsInMessage(message.get());
-      return;
-    }
-
-    auto it = nodes_.find(node_name);
-    if (it == nodes_.end()) {
-      DVLOG(1) << "Node not found: " << node_name;
-      return;
-    }
-
-    it->second->EnqueueMessage(std::move(message));
-  }
-
-  void BroadcastMessage(TestNode* from_node, ScopedMessage message) override {
-    base::AutoLock global_lock(global_lock_);
-    base::AutoLock lock(lock_);
-
-    // Drop messages from nodes that have been removed.
-    if (nodes_.find(from_node->name()) == nodes_.end())
-      return;
-
-    for (const auto& entry : nodes_) {
-      TestNode* node = entry.second;
-      // Broadcast doesn't deliver to the local node.
-      if (node == from_node)
-        continue;
-
-      // NOTE: We only need to support broadcast of events. Events have no
-      // payload or ports bytes.
-      ScopedMessage new_message(
-          new TestMessage(message->num_header_bytes(), 0, 0));
-      memcpy(new_message->mutable_header_bytes(), message->header_bytes(),
-             message->num_header_bytes());
-      node->EnqueueMessage(std::move(new_message));
-    }
-  }
-
-  base::MessageLoop message_loop_;
-
-  // Acquired before any operation which makes a Node busy, and before testing
-  // if all nodes are idle.
-  base::Lock global_lock_;
-
-  base::Lock lock_;
-  uint64_t next_port_id_ = 1;
-  std::map<NodeName, TestNode*> nodes_;
-};
-
-}  // namespace
-
-TEST_F(PortsTest, Basic1) {
-  TestNode node0(0);
-  AddNode(&node0);
-
-  TestNode node1(1);
-  AddNode(&node1);
-
-  PortRef x0, x1;
-  CreatePortPair(&node0, &x0, &node1, &x1);
-
-  PortRef a0, a1;
-  EXPECT_EQ(OK, node0.node().CreatePortPair(&a0, &a1));
-  EXPECT_EQ(OK, node0.SendStringMessageWithPort(x0, "hello", a1));
-  EXPECT_EQ(OK, node0.node().ClosePort(a0));
-
-  EXPECT_EQ(OK, node0.node().ClosePort(x0));
-  EXPECT_EQ(OK, node1.node().ClosePort(x1));
-
-  WaitForIdle();
-
-  EXPECT_TRUE(node0.node().CanShutdownCleanly());
-  EXPECT_TRUE(node1.node().CanShutdownCleanly());
-}
-
-TEST_F(PortsTest, Basic2) {
-  TestNode node0(0);
-  AddNode(&node0);
-
-  TestNode node1(1);
-  AddNode(&node1);
-
-  PortRef x0, x1;
-  CreatePortPair(&node0, &x0, &node1, &x1);
-
-  PortRef b0, b1;
-  EXPECT_EQ(OK, node0.node().CreatePortPair(&b0, &b1));
-  EXPECT_EQ(OK, node0.SendStringMessageWithPort(x0, "hello", b1));
-  EXPECT_EQ(OK, node0.SendStringMessage(b0, "hello again"));
-
-  EXPECT_EQ(OK, node0.node().ClosePort(b0));
-
-  EXPECT_EQ(OK, node0.node().ClosePort(x0));
-  EXPECT_EQ(OK, node1.node().ClosePort(x1));
-
-  WaitForIdle();
-
-  EXPECT_TRUE(node0.node().CanShutdownCleanly());
-  EXPECT_TRUE(node1.node().CanShutdownCleanly());
-}
-
-TEST_F(PortsTest, Basic3) {
-  TestNode node0(0);
-  AddNode(&node0);
-
-  TestNode node1(1);
-  AddNode(&node1);
-
-  PortRef x0, x1;
-  CreatePortPair(&node0, &x0, &node1, &x1);
-
-  PortRef a0, a1;
-  EXPECT_EQ(OK, node0.node().CreatePortPair(&a0, &a1));
-
-  EXPECT_EQ(OK, node0.SendStringMessageWithPort(x0, "hello", a1));
-  EXPECT_EQ(OK, node0.SendStringMessage(a0, "hello again"));
-
-  EXPECT_EQ(OK, node0.SendStringMessageWithPort(x0, "foo", a0));
-
-  PortRef b0, b1;
-  EXPECT_EQ(OK, node0.node().CreatePortPair(&b0, &b1));
-  EXPECT_EQ(OK, node0.SendStringMessageWithPort(x0, "bar", b1));
-  EXPECT_EQ(OK, node0.SendStringMessage(b0, "baz"));
-
-  EXPECT_EQ(OK, node0.node().ClosePort(b0));
-
-  EXPECT_EQ(OK, node0.node().ClosePort(x0));
-  EXPECT_EQ(OK, node1.node().ClosePort(x1));
-
-  WaitForIdle();
-
-  EXPECT_TRUE(node0.node().CanShutdownCleanly());
-  EXPECT_TRUE(node1.node().CanShutdownCleanly());
-}
-
-TEST_F(PortsTest, LostConnectionToNode1) {
-  TestNode node0(0);
-  AddNode(&node0);
-
-  TestNode node1(1);
-  AddNode(&node1);
-  node1.set_drop_messages(true);
-
-  PortRef x0, x1;
-  CreatePortPair(&node0, &x0, &node1, &x1);
-
-  // Transfer a port to node1 and simulate a lost connection to node1.
-
-  PortRef a0, a1;
-  EXPECT_EQ(OK, node0.node().CreatePortPair(&a0, &a1));
-  EXPECT_EQ(OK, node0.SendStringMessageWithPort(x0, "foo", a1));
-
-  WaitForIdle();
-
-  RemoveNode(&node1);
-
-  WaitForIdle();
-
-  EXPECT_EQ(OK, node0.node().ClosePort(a0));
-  EXPECT_EQ(OK, node0.node().ClosePort(x0));
-  EXPECT_EQ(OK, node1.node().ClosePort(x1));
-
-  WaitForIdle();
-
-  EXPECT_TRUE(node0.node().CanShutdownCleanly());
-  EXPECT_TRUE(node1.node().CanShutdownCleanly());
-}
-
-TEST_F(PortsTest, LostConnectionToNode2) {
-  TestNode node0(0);
-  AddNode(&node0);
-
-  TestNode node1(1);
-  AddNode(&node1);
-
-  PortRef x0, x1;
-  CreatePortPair(&node0, &x0, &node1, &x1);
-
-  PortRef a0, a1;
-  EXPECT_EQ(OK, node0.node().CreatePortPair(&a0, &a1));
-  EXPECT_EQ(OK, node0.SendStringMessageWithPort(x0, "take a1", a1));
-
-  WaitForIdle();
-
-  node1.set_drop_messages(true);
-
-  RemoveNode(&node1);
-
-  WaitForIdle();
-
-  // a0 should have eventually detected peer closure after node loss.
-  ScopedMessage message;
-  EXPECT_EQ(ERROR_PORT_PEER_CLOSED,
-            node0.node().GetMessage(a0, &message, nullptr));
-  EXPECT_FALSE(message);
-
-  EXPECT_EQ(OK, node0.node().ClosePort(a0));
-
-  EXPECT_EQ(OK, node0.node().ClosePort(x0));
-
-  EXPECT_EQ(OK, node1.node().GetMessage(x1, &message, nullptr));
-  EXPECT_TRUE(message);
-  node1.ClosePortsInMessage(message.get());
-
-  EXPECT_EQ(OK, node1.node().ClosePort(x1));
-
-  WaitForIdle();
-
-  EXPECT_TRUE(node0.node().CanShutdownCleanly());
-  EXPECT_TRUE(node1.node().CanShutdownCleanly());
-}
-
-TEST_F(PortsTest, LostConnectionToNodeWithSecondaryProxy) {
-  // Tests that a proxy gets cleaned up when its indirect peer lives on a lost
-  // node.
-
-  TestNode node0(0);
-  AddNode(&node0);
-
-  TestNode node1(1);
-  AddNode(&node1);
-
-  TestNode node2(2);
-  AddNode(&node2);
-
-  // Create A-B spanning nodes 0 and 1 and C-D spanning 1 and 2.
-  PortRef A, B, C, D;
-  CreatePortPair(&node0, &A, &node1, &B);
-  CreatePortPair(&node1, &C, &node2, &D);
-
-  // Create E-F and send F over A to node 1.
-  PortRef E, F;
-  EXPECT_EQ(OK, node0.node().CreatePortPair(&E, &F));
-  EXPECT_EQ(OK, node0.SendStringMessageWithPort(A, ".", F));
-
-  WaitForIdle();
-
-  ScopedMessage message;
-  ASSERT_TRUE(node1.ReadMessage(B, &message));
-  ASSERT_EQ(1u, message->num_ports());
-
-  EXPECT_EQ(OK, node1.node().GetPort(message->ports()[0], &F));
-
-  // Send F over C to node 2 and then simulate node 2 loss from node 1. Node 1
-  // will trivially become aware of the loss, and this test verifies that the
-  // port A on node 0 will eventually also become aware of it.
-
-  // Make sure node2 stops processing events when it encounters an ObserveProxy.
-  node2.BlockOnEvent(EventType::kObserveProxy);
-
-  EXPECT_EQ(OK, node1.SendStringMessageWithPort(C, ".", F));
-  WaitForIdle();
-
-  // Simulate node 1 and 2 disconnecting.
-  EXPECT_EQ(OK, node1.node().LostConnectionToNode(node2.name()));
-
-  // Let node2 continue processing events and wait for everyone to go idle.
-  node2.Unblock();
-  WaitForIdle();
-
-  // Port F should be gone.
-  EXPECT_EQ(ERROR_PORT_UNKNOWN, node1.node().GetPort(F.name(), &F));
-
-  // Port E should have detected peer closure despite the fact that there is
-  // no longer a continuous route from F to E over which the event could travel.
-  PortStatus status;
-  EXPECT_EQ(OK, node0.node().GetStatus(E, &status));
-  EXPECT_TRUE(status.peer_closed);
-
-  EXPECT_EQ(OK, node0.node().ClosePort(A));
-  EXPECT_EQ(OK, node1.node().ClosePort(B));
-  EXPECT_EQ(OK, node1.node().ClosePort(C));
-  EXPECT_EQ(OK, node0.node().ClosePort(E));
-
-  WaitForIdle();
-
-  EXPECT_TRUE(node0.node().CanShutdownCleanly());
-  EXPECT_TRUE(node1.node().CanShutdownCleanly());
-}
-
-TEST_F(PortsTest, LostConnectionToNodeWithLocalProxy) {
-  // Tests that a proxy gets cleaned up when its direct peer lives on a lost
-  // node and it's predecessor lives on the same node.
-
-  TestNode node0(0);
-  AddNode(&node0);
-
-  TestNode node1(1);
-  AddNode(&node1);
-
-  PortRef A, B;
-  CreatePortPair(&node0, &A, &node1, &B);
-
-  PortRef C, D;
-  EXPECT_EQ(OK, node0.node().CreatePortPair(&C, &D));
-
-  // Send D but block node0 on an ObserveProxy event.
-  node0.BlockOnEvent(EventType::kObserveProxy);
-  EXPECT_EQ(OK, node0.SendStringMessageWithPort(A, ".", D));
-
-  // node0 won't collapse the proxy but node1 will receive the message before
-  // going idle.
-  WaitForIdle();
-
-  ScopedMessage message;
-  ASSERT_TRUE(node1.ReadMessage(B, &message));
-  ASSERT_EQ(1u, message->num_ports());
-  PortRef E;
-  EXPECT_EQ(OK, node1.node().GetPort(message->ports()[0], &E));
-
-  RemoveNode(&node1);
-
-  node0.Unblock();
-  WaitForIdle();
-
-  // Port C should have detected peer closure.
-  PortStatus status;
-  EXPECT_EQ(OK, node0.node().GetStatus(C, &status));
-  EXPECT_TRUE(status.peer_closed);
-
-  EXPECT_EQ(OK, node0.node().ClosePort(A));
-  EXPECT_EQ(OK, node1.node().ClosePort(B));
-  EXPECT_EQ(OK, node0.node().ClosePort(C));
-  EXPECT_EQ(OK, node1.node().ClosePort(E));
-
-  EXPECT_TRUE(node0.node().CanShutdownCleanly());
-  EXPECT_TRUE(node1.node().CanShutdownCleanly());
-}
-
-TEST_F(PortsTest, GetMessage1) {
-  TestNode node(0);
-  AddNode(&node);
-
-  PortRef a0, a1;
-  EXPECT_EQ(OK, node.node().CreatePortPair(&a0, &a1));
-
-  ScopedMessage message;
-  EXPECT_EQ(OK, node.node().GetMessage(a0, &message, nullptr));
-  EXPECT_FALSE(message);
-
-  EXPECT_EQ(OK, node.node().ClosePort(a1));
-
-  WaitForIdle();
-
-  EXPECT_EQ(ERROR_PORT_PEER_CLOSED,
-            node.node().GetMessage(a0, &message, nullptr));
-  EXPECT_FALSE(message);
-
-  EXPECT_EQ(OK, node.node().ClosePort(a0));
-
-  WaitForIdle();
-
-  EXPECT_TRUE(node.node().CanShutdownCleanly());
-}
-
-TEST_F(PortsTest, GetMessage2) {
-  TestNode node(0);
-  AddNode(&node);
-
-  PortRef a0, a1;
-  EXPECT_EQ(OK, node.node().CreatePortPair(&a0, &a1));
-
-  EXPECT_EQ(OK, node.SendStringMessage(a1, "1"));
-
-  ScopedMessage message;
-  EXPECT_EQ(OK, node.node().GetMessage(a0, &message, nullptr));
-
-  ASSERT_TRUE(message);
-  EXPECT_TRUE(MessageEquals(message, "1"));
-
-  EXPECT_EQ(OK, node.node().ClosePort(a0));
-  EXPECT_EQ(OK, node.node().ClosePort(a1));
-
-  EXPECT_TRUE(node.node().CanShutdownCleanly());
-}
-
-TEST_F(PortsTest, GetMessage3) {
-  TestNode node(0);
-  AddNode(&node);
-
-  PortRef a0, a1;
-  EXPECT_EQ(OK, node.node().CreatePortPair(&a0, &a1));
-
-  const char* kStrings[] = {
-    "1",
-    "2",
-    "3"
-  };
-
-  for (size_t i = 0; i < sizeof(kStrings)/sizeof(kStrings[0]); ++i)
-    EXPECT_EQ(OK, node.SendStringMessage(a1, kStrings[i]));
-
-  ScopedMessage message;
-  for (size_t i = 0; i < sizeof(kStrings)/sizeof(kStrings[0]); ++i) {
-    EXPECT_EQ(OK, node.node().GetMessage(a0, &message, nullptr));
-    ASSERT_TRUE(message);
-    EXPECT_TRUE(MessageEquals(message, kStrings[i]));
-  }
-
-  EXPECT_EQ(OK, node.node().ClosePort(a0));
-  EXPECT_EQ(OK, node.node().ClosePort(a1));
-
-  EXPECT_TRUE(node.node().CanShutdownCleanly());
-}
-
-TEST_F(PortsTest, Delegation1) {
-  TestNode node0(0);
-  AddNode(&node0);
-
-  TestNode node1(1);
-  AddNode(&node1);
-
-  PortRef x0, x1;
-  CreatePortPair(&node0, &x0, &node1, &x1);
-
-  // In this test, we send a message to a port that has been moved.
-
-  PortRef a0, a1;
-  EXPECT_EQ(OK, node0.node().CreatePortPair(&a0, &a1));
-  EXPECT_EQ(OK, node0.SendStringMessageWithPort(x0, "a1", a1));
-  WaitForIdle();
-
-  ScopedMessage message;
-  ASSERT_TRUE(node1.ReadMessage(x1, &message));
-  ASSERT_EQ(1u, message->num_ports());
-  EXPECT_TRUE(MessageEquals(message, "a1"));
-
-  // This is "a1" from the point of view of node1.
-  PortName a2_name = message->ports()[0];
-  EXPECT_EQ(OK, node1.SendStringMessageWithPort(x1, "a2", a2_name));
-  EXPECT_EQ(OK, node0.SendStringMessage(a0, "hello"));
-
-  WaitForIdle();
-
-  ASSERT_TRUE(node0.ReadMessage(x0, &message));
-  ASSERT_EQ(1u, message->num_ports());
-  EXPECT_TRUE(MessageEquals(message, "a2"));
-
-  // This is "a2" from the point of view of node1.
-  PortName a3_name = message->ports()[0];
-
-  PortRef a3;
-  EXPECT_EQ(OK, node0.node().GetPort(a3_name, &a3));
-
-  ASSERT_TRUE(node0.ReadMessage(a3, &message));
-  EXPECT_EQ(0u, message->num_ports());
-  EXPECT_TRUE(MessageEquals(message, "hello"));
-
-  EXPECT_EQ(OK, node0.node().ClosePort(a0));
-  EXPECT_EQ(OK, node0.node().ClosePort(a3));
-
-  EXPECT_EQ(OK, node0.node().ClosePort(x0));
-  EXPECT_EQ(OK, node1.node().ClosePort(x1));
-
-  EXPECT_TRUE(node0.node().CanShutdownCleanly());
-  EXPECT_TRUE(node1.node().CanShutdownCleanly());
-}
-
-TEST_F(PortsTest, Delegation2) {
-  TestNode node0(0);
-  AddNode(&node0);
-
-  TestNode node1(1);
-  AddNode(&node1);
-
-  for (int i = 0; i < 100; ++i) {
-    // Setup pipe a<->b between node0 and node1.
-    PortRef A, B;
-    CreatePortPair(&node0, &A, &node1, &B);
-
-    PortRef C, D;
-    EXPECT_EQ(OK, node0.node().CreatePortPair(&C, &D));
-
-    PortRef E, F;
-    EXPECT_EQ(OK, node0.node().CreatePortPair(&E, &F));
-
-    node1.set_save_messages(true);
-
-    // Pass D over A to B.
-    EXPECT_EQ(OK, node0.SendStringMessageWithPort(A, "1", D));
-
-    // Pass F over C to D.
-    EXPECT_EQ(OK, node0.SendStringMessageWithPort(C, "1", F));
-
-    // This message should find its way to node1.
-    EXPECT_EQ(OK, node0.SendStringMessage(E, "hello"));
-
-    WaitForIdle();
-
-    EXPECT_EQ(OK, node0.node().ClosePort(C));
-    EXPECT_EQ(OK, node0.node().ClosePort(E));
-
-    EXPECT_EQ(OK, node0.node().ClosePort(A));
-    EXPECT_EQ(OK, node1.node().ClosePort(B));
-
-    bool got_hello = false;
-    ScopedMessage message;
-    while (node1.GetSavedMessage(&message)) {
-      node1.ClosePortsInMessage(message.get());
-      if (MessageEquals(message, "hello")) {
-        got_hello = true;
-        break;
-      }
-    }
-
-    EXPECT_TRUE(got_hello);
-
-    WaitForIdle();  // Because closing ports may have generated tasks.
-  }
-
-  EXPECT_TRUE(node0.node().CanShutdownCleanly());
-  EXPECT_TRUE(node1.node().CanShutdownCleanly());
-}
-
-TEST_F(PortsTest, SendUninitialized) {
-  TestNode node(0);
-  AddNode(&node);
-
-  PortRef x0;
-  EXPECT_EQ(OK, node.node().CreateUninitializedPort(&x0));
-  EXPECT_EQ(ERROR_PORT_STATE_UNEXPECTED, node.SendStringMessage(x0, "oops"));
-  EXPECT_EQ(OK, node.node().ClosePort(x0));
-  EXPECT_TRUE(node.node().CanShutdownCleanly());
-}
-
-TEST_F(PortsTest, SendFailure) {
-  TestNode node(0);
-  AddNode(&node);
-
-  node.set_save_messages(true);
-
-  PortRef A, B;
-  EXPECT_EQ(OK, node.node().CreatePortPair(&A, &B));
-
-  // Try to send A over itself.
-
-  EXPECT_EQ(ERROR_PORT_CANNOT_SEND_SELF,
-            node.SendStringMessageWithPort(A, "oops", A));
-
-  // Try to send B over A.
-
-  EXPECT_EQ(ERROR_PORT_CANNOT_SEND_PEER,
-            node.SendStringMessageWithPort(A, "nope", B));
-
-  // B should be closed immediately.
-  EXPECT_EQ(ERROR_PORT_UNKNOWN, node.node().GetPort(B.name(), &B));
-
-  WaitForIdle();
-
-  // There should have been no messages accepted.
-  ScopedMessage message;
-  EXPECT_FALSE(node.GetSavedMessage(&message));
-
-  EXPECT_EQ(OK, node.node().ClosePort(A));
-
-  WaitForIdle();
-
-  EXPECT_TRUE(node.node().CanShutdownCleanly());
-}
-
-TEST_F(PortsTest, DontLeakUnreceivedPorts) {
-  TestNode node(0);
-  AddNode(&node);
-
-  PortRef A, B, C, D;
-  EXPECT_EQ(OK, node.node().CreatePortPair(&A, &B));
-  EXPECT_EQ(OK, node.node().CreatePortPair(&C, &D));
-
-  EXPECT_EQ(OK, node.SendStringMessageWithPort(A, "foo", D));
-
-  EXPECT_EQ(OK, node.node().ClosePort(C));
-  EXPECT_EQ(OK, node.node().ClosePort(A));
-  EXPECT_EQ(OK, node.node().ClosePort(B));
-
-  WaitForIdle();
-
-  EXPECT_TRUE(node.node().CanShutdownCleanly());
-}
-
-TEST_F(PortsTest, AllowShutdownWithLocalPortsOpen) {
-  TestNode node(0);
-  AddNode(&node);
-
-  PortRef A, B, C, D;
-  EXPECT_EQ(OK, node.node().CreatePortPair(&A, &B));
-  EXPECT_EQ(OK, node.node().CreatePortPair(&C, &D));
-
-  EXPECT_EQ(OK, node.SendStringMessageWithPort(A, "foo", D));
-
-  ScopedMessage message;
-  EXPECT_TRUE(node.ReadMessage(B, &message));
-  ASSERT_EQ(1u, message->num_ports());
-  EXPECT_TRUE(MessageEquals(message, "foo"));
-  PortRef E;
-  ASSERT_EQ(OK, node.node().GetPort(message->ports()[0], &E));
-
-  EXPECT_TRUE(
-      node.node().CanShutdownCleanly(Node::ShutdownPolicy::ALLOW_LOCAL_PORTS));
-
-  WaitForIdle();
-
-  EXPECT_TRUE(
-      node.node().CanShutdownCleanly(Node::ShutdownPolicy::ALLOW_LOCAL_PORTS));
-  EXPECT_FALSE(node.node().CanShutdownCleanly());
-
-  EXPECT_EQ(OK, node.node().ClosePort(A));
-  EXPECT_EQ(OK, node.node().ClosePort(B));
-  EXPECT_EQ(OK, node.node().ClosePort(C));
-  EXPECT_EQ(OK, node.node().ClosePort(E));
-
-  WaitForIdle();
-
-  EXPECT_TRUE(node.node().CanShutdownCleanly());
-}
-
-TEST_F(PortsTest, ProxyCollapse1) {
-  TestNode node(0);
-  AddNode(&node);
-
-  PortRef A, B;
-  EXPECT_EQ(OK, node.node().CreatePortPair(&A, &B));
-
-  PortRef X, Y;
-  EXPECT_EQ(OK, node.node().CreatePortPair(&X, &Y));
-
-  ScopedMessage message;
-
-  // Send B and receive it as C.
-  EXPECT_EQ(OK, node.SendStringMessageWithPort(X, "foo", B));
-  ASSERT_TRUE(node.ReadMessage(Y, &message));
-  ASSERT_EQ(1u, message->num_ports());
-  PortRef C;
-  ASSERT_EQ(OK, node.node().GetPort(message->ports()[0], &C));
-
-  // Send C and receive it as D.
-  EXPECT_EQ(OK, node.SendStringMessageWithPort(X, "foo", C));
-  ASSERT_TRUE(node.ReadMessage(Y, &message));
-  ASSERT_EQ(1u, message->num_ports());
-  PortRef D;
-  ASSERT_EQ(OK, node.node().GetPort(message->ports()[0], &D));
-
-  // Send D and receive it as E.
-  EXPECT_EQ(OK, node.SendStringMessageWithPort(X, "foo", D));
-  ASSERT_TRUE(node.ReadMessage(Y, &message));
-  ASSERT_EQ(1u, message->num_ports());
-  PortRef E;
-  ASSERT_EQ(OK, node.node().GetPort(message->ports()[0], &E));
-
-  EXPECT_EQ(OK, node.node().ClosePort(X));
-  EXPECT_EQ(OK, node.node().ClosePort(Y));
-
-  EXPECT_EQ(OK, node.node().ClosePort(A));
-  EXPECT_EQ(OK, node.node().ClosePort(E));
-
-  // The node should not idle until all proxies are collapsed.
-  WaitForIdle();
-
-  EXPECT_TRUE(node.node().CanShutdownCleanly());
-}
-
-TEST_F(PortsTest, ProxyCollapse2) {
-  TestNode node(0);
-  AddNode(&node);
-
-  PortRef A, B;
-  EXPECT_EQ(OK, node.node().CreatePortPair(&A, &B));
-
-  PortRef X, Y;
-  EXPECT_EQ(OK, node.node().CreatePortPair(&X, &Y));
-
-  ScopedMessage message;
-
-  // Send B and A to create proxies in each direction.
-  EXPECT_EQ(OK, node.SendStringMessageWithPort(X, "foo", B));
-  EXPECT_EQ(OK, node.SendStringMessageWithPort(X, "foo", A));
-
-  EXPECT_EQ(OK, node.node().ClosePort(X));
-  EXPECT_EQ(OK, node.node().ClosePort(Y));
-
-  // At this point we have a scenario with:
-  //
-  // D -> [B] -> C -> [A]
-  //
-  // Ensure that the proxies can collapse. The sent ports will be closed
-  // eventually as a result of Y's closure.
-
-  WaitForIdle();
-
-  EXPECT_TRUE(node.node().CanShutdownCleanly());
-}
-
-TEST_F(PortsTest, SendWithClosedPeer) {
-  // This tests that if a port is sent when its peer is already known to be
-  // closed, the newly created port will be aware of that peer closure, and the
-  // proxy will eventually collapse.
-
-  TestNode node(0);
-  AddNode(&node);
-
-  // Send a message from A to B, then close A.
-  PortRef A, B;
-  EXPECT_EQ(OK, node.node().CreatePortPair(&A, &B));
-  EXPECT_EQ(OK, node.SendStringMessage(A, "hey"));
-  EXPECT_EQ(OK, node.node().ClosePort(A));
-
-  // Now send B over X-Y as new port C.
-  PortRef X, Y;
-  EXPECT_EQ(OK, node.node().CreatePortPair(&X, &Y));
-  EXPECT_EQ(OK, node.SendStringMessageWithPort(X, "foo", B));
-  ScopedMessage message;
-  ASSERT_TRUE(node.ReadMessage(Y, &message));
-  ASSERT_EQ(1u, message->num_ports());
-  PortRef C;
-  ASSERT_EQ(OK, node.node().GetPort(message->ports()[0], &C));
-
-  EXPECT_EQ(OK, node.node().ClosePort(X));
-  EXPECT_EQ(OK, node.node().ClosePort(Y));
-
-  WaitForIdle();
-
-  // C should have received the message originally sent to B, and it should also
-  // be aware of A's closure.
-
-  ASSERT_TRUE(node.ReadMessage(C, &message));
-  EXPECT_TRUE(MessageEquals(message, "hey"));
-
-  PortStatus status;
-  EXPECT_EQ(OK, node.node().GetStatus(C, &status));
-  EXPECT_FALSE(status.receiving_messages);
-  EXPECT_FALSE(status.has_messages);
-  EXPECT_TRUE(status.peer_closed);
-
-  node.node().ClosePort(C);
-
-  WaitForIdle();
-
-  EXPECT_TRUE(node.node().CanShutdownCleanly());
-}
-
-TEST_F(PortsTest, SendWithClosedPeerSent) {
-  // This tests that if a port is closed while some number of proxies are still
-  // routing messages (directly or indirectly) to it, that the peer port is
-  // eventually notified of the closure, and the dead-end proxies will
-  // eventually be removed.
-
-  TestNode node(0);
-  AddNode(&node);
-
-  PortRef X, Y;
-  EXPECT_EQ(OK, node.node().CreatePortPair(&X, &Y));
-
-  PortRef A, B;
-  EXPECT_EQ(OK, node.node().CreatePortPair(&A, &B));
-
-  ScopedMessage message;
-
-  // Send A as new port C.
-  EXPECT_EQ(OK, node.SendStringMessageWithPort(X, "foo", A));
-
-  ASSERT_TRUE(node.ReadMessage(Y, &message));
-  ASSERT_EQ(1u, message->num_ports());
-  PortRef C;
-  ASSERT_EQ(OK, node.node().GetPort(message->ports()[0], &C));
-
-  // Send C as new port D.
-  EXPECT_EQ(OK, node.SendStringMessageWithPort(X, "foo", C));
-
-  ASSERT_TRUE(node.ReadMessage(Y, &message));
-  ASSERT_EQ(1u, message->num_ports());
-  PortRef D;
-  ASSERT_EQ(OK, node.node().GetPort(message->ports()[0], &D));
-
-  // Send a message to B through D, then close D.
-  EXPECT_EQ(OK, node.SendStringMessage(D, "hey"));
-  EXPECT_EQ(OK, node.node().ClosePort(D));
-
-  // Now send B as new port E.
-
-  EXPECT_EQ(OK, node.SendStringMessageWithPort(X, "foo", B));
-  EXPECT_EQ(OK, node.node().ClosePort(X));
-
-  ASSERT_TRUE(node.ReadMessage(Y, &message));
-  ASSERT_EQ(1u, message->num_ports());
-  PortRef E;
-  ASSERT_EQ(OK, node.node().GetPort(message->ports()[0], &E));
-
-  EXPECT_EQ(OK, node.node().ClosePort(Y));
-
-  WaitForIdle();
-
-  // E should receive the message originally sent to B, and it should also be
-  // aware of D's closure.
-
-  ASSERT_TRUE(node.ReadMessage(E, &message));
-  EXPECT_TRUE(MessageEquals(message, "hey"));
-
-  PortStatus status;
-  EXPECT_EQ(OK, node.node().GetStatus(E, &status));
-  EXPECT_FALSE(status.receiving_messages);
-  EXPECT_FALSE(status.has_messages);
-  EXPECT_TRUE(status.peer_closed);
-
-  EXPECT_EQ(OK, node.node().ClosePort(E));
-
-  WaitForIdle();
-
-  EXPECT_TRUE(node.node().CanShutdownCleanly());
-}
-
-TEST_F(PortsTest, MergePorts) {
-  TestNode node0(0);
-  AddNode(&node0);
-
-  TestNode node1(1);
-  AddNode(&node1);
-
-  // Setup two independent port pairs, A-B on node0 and C-D on node1.
-  PortRef A, B, C, D;
-  EXPECT_EQ(OK, node0.node().CreatePortPair(&A, &B));
-  EXPECT_EQ(OK, node1.node().CreatePortPair(&C, &D));
-
-  // Write a message on A.
-  EXPECT_EQ(OK, node0.SendStringMessage(A, "hey"));
-
-  // Initiate a merge between B and C.
-  EXPECT_EQ(OK, node0.node().MergePorts(B, node1.name(), C.name()));
-
-  WaitForIdle();
-
-  // Expect all proxies to be gone once idle.
-  EXPECT_TRUE(
-      node0.node().CanShutdownCleanly(Node::ShutdownPolicy::ALLOW_LOCAL_PORTS));
-  EXPECT_TRUE(
-      node1.node().CanShutdownCleanly(Node::ShutdownPolicy::ALLOW_LOCAL_PORTS));
-
-  // Expect D to have received the message sent on A.
-  ScopedMessage message;
-  ASSERT_TRUE(node1.ReadMessage(D, &message));
-  EXPECT_TRUE(MessageEquals(message, "hey"));
-
-  EXPECT_EQ(OK, node0.node().ClosePort(A));
-  EXPECT_EQ(OK, node1.node().ClosePort(D));
-
-  // No more ports should be open.
-  EXPECT_TRUE(node0.node().CanShutdownCleanly());
-  EXPECT_TRUE(node1.node().CanShutdownCleanly());
-}
-
-TEST_F(PortsTest, MergePortWithClosedPeer1) {
-  // This tests that the right thing happens when initiating a merge on a port
-  // whose peer has already been closed.
-
-  TestNode node0(0);
-  AddNode(&node0);
-
-  TestNode node1(1);
-  AddNode(&node1);
-
-  // Setup two independent port pairs, A-B on node0 and C-D on node1.
-  PortRef A, B, C, D;
-  EXPECT_EQ(OK, node0.node().CreatePortPair(&A, &B));
-  EXPECT_EQ(OK, node1.node().CreatePortPair(&C, &D));
-
-  // Write a message on A.
-  EXPECT_EQ(OK, node0.SendStringMessage(A, "hey"));
-
-  // Close A.
-  EXPECT_EQ(OK, node0.node().ClosePort(A));
-
-  // Initiate a merge between B and C.
-  EXPECT_EQ(OK, node0.node().MergePorts(B, node1.name(), C.name()));
-
-  WaitForIdle();
-
-  // Expect all proxies to be gone once idle. node0 should have no ports since
-  // A was explicitly closed.
-  EXPECT_TRUE(node0.node().CanShutdownCleanly());
-  EXPECT_TRUE(
-      node1.node().CanShutdownCleanly(Node::ShutdownPolicy::ALLOW_LOCAL_PORTS));
-
-  // Expect D to have received the message sent on A.
-  ScopedMessage message;
-  ASSERT_TRUE(node1.ReadMessage(D, &message));
-  EXPECT_TRUE(MessageEquals(message, "hey"));
-
-  EXPECT_EQ(OK, node1.node().ClosePort(D));
-
-  // No more ports should be open.
-  EXPECT_TRUE(node0.node().CanShutdownCleanly());
-  EXPECT_TRUE(node1.node().CanShutdownCleanly());
-}
-
-TEST_F(PortsTest, MergePortWithClosedPeer2) {
-  // This tests that the right thing happens when merging into a port whose peer
-  // has already been closed.
-
-  TestNode node0(0);
-  AddNode(&node0);
-
-  TestNode node1(1);
-  AddNode(&node1);
-
-  // Setup two independent port pairs, A-B on node0 and C-D on node1.
-  PortRef A, B, C, D;
-  EXPECT_EQ(OK, node0.node().CreatePortPair(&A, &B));
-  EXPECT_EQ(OK, node1.node().CreatePortPair(&C, &D));
-
-  // Write a message on D and close it.
-  EXPECT_EQ(OK, node0.SendStringMessage(D, "hey"));
-  EXPECT_EQ(OK, node1.node().ClosePort(D));
-
-  // Initiate a merge between B and C.
-  EXPECT_EQ(OK, node0.node().MergePorts(B, node1.name(), C.name()));
-
-  WaitForIdle();
-
-  // Expect all proxies to be gone once idle. node1 should have no ports since
-  // D was explicitly closed.
-  EXPECT_TRUE(
-      node0.node().CanShutdownCleanly(Node::ShutdownPolicy::ALLOW_LOCAL_PORTS));
-  EXPECT_TRUE(node1.node().CanShutdownCleanly());
-
-  // Expect A to have received the message sent on D.
-  ScopedMessage message;
-  ASSERT_TRUE(node0.ReadMessage(A, &message));
-  EXPECT_TRUE(MessageEquals(message, "hey"));
-
-  EXPECT_EQ(OK, node0.node().ClosePort(A));
-
-  // No more ports should be open.
-  EXPECT_TRUE(node0.node().CanShutdownCleanly());
-  EXPECT_TRUE(node1.node().CanShutdownCleanly());
-}
-
-TEST_F(PortsTest, MergePortsWithClosedPeers) {
-  // This tests that no residual ports are left behind if two ports are merged
-  // when both of their peers have been closed.
-
-  TestNode node0(0);
-  AddNode(&node0);
-
-  TestNode node1(1);
-  AddNode(&node1);
-
-  // Setup two independent port pairs, A-B on node0 and C-D on node1.
-  PortRef A, B, C, D;
-  EXPECT_EQ(OK, node0.node().CreatePortPair(&A, &B));
-  EXPECT_EQ(OK, node1.node().CreatePortPair(&C, &D));
-
-  // Close A and D.
-  EXPECT_EQ(OK, node0.node().ClosePort(A));
-  EXPECT_EQ(OK, node1.node().ClosePort(D));
-
-  WaitForIdle();
-
-  // Initiate a merge between B and C.
-  EXPECT_EQ(OK, node0.node().MergePorts(B, node1.name(), C.name()));
-
-  WaitForIdle();
-
-  // Expect everything to have gone away.
-  EXPECT_TRUE(node0.node().CanShutdownCleanly());
-  EXPECT_TRUE(node1.node().CanShutdownCleanly());
-}
-
-TEST_F(PortsTest, MergePortsWithMovedPeers) {
-  // This tests that ports can be merged successfully even if their peers are
-  // moved around.
-
-  TestNode node0(0);
-  AddNode(&node0);
-
-  TestNode node1(1);
-  AddNode(&node1);
-
-  // Setup two independent port pairs, A-B on node0 and C-D on node1.
-  PortRef A, B, C, D;
-  EXPECT_EQ(OK, node0.node().CreatePortPair(&A, &B));
-  EXPECT_EQ(OK, node1.node().CreatePortPair(&C, &D));
-
-  // Set up another pair X-Y for moving ports on node0.
-  PortRef X, Y;
-  EXPECT_EQ(OK, node0.node().CreatePortPair(&X, &Y));
-
-  ScopedMessage message;
-
-  // Move A to new port E.
-  EXPECT_EQ(OK, node0.SendStringMessageWithPort(X, "foo", A));
-  ASSERT_TRUE(node0.ReadMessage(Y, &message));
-  ASSERT_EQ(1u, message->num_ports());
-  PortRef E;
-  ASSERT_EQ(OK, node0.node().GetPort(message->ports()[0], &E));
-
-  EXPECT_EQ(OK, node0.node().ClosePort(X));
-  EXPECT_EQ(OK, node0.node().ClosePort(Y));
-
-  // Write messages on E and D.
-  EXPECT_EQ(OK, node0.SendStringMessage(E, "hey"));
-  EXPECT_EQ(OK, node1.SendStringMessage(D, "hi"));
-
-  // Initiate a merge between B and C.
-  EXPECT_EQ(OK, node0.node().MergePorts(B, node1.name(), C.name()));
-
-  WaitForIdle();
-
-  // Expect to receive D's message on E and E's message on D.
-  ASSERT_TRUE(node0.ReadMessage(E, &message));
-  EXPECT_TRUE(MessageEquals(message, "hi"));
-  ASSERT_TRUE(node1.ReadMessage(D, &message));
-  EXPECT_TRUE(MessageEquals(message, "hey"));
-
-  // Close E and D.
-  EXPECT_EQ(OK, node0.node().ClosePort(E));
-  EXPECT_EQ(OK, node1.node().ClosePort(D));
-
-  WaitForIdle();
-
-  // Expect everything to have gone away.
-  EXPECT_TRUE(node0.node().CanShutdownCleanly());
-  EXPECT_TRUE(node1.node().CanShutdownCleanly());
-}
-
-TEST_F(PortsTest, MergePortsFailsGracefully) {
-  // This tests that the system remains in a well-defined state if something
-  // goes wrong during port merge.
-
-  TestNode node0(0);
-  AddNode(&node0);
-
-  TestNode node1(1);
-  AddNode(&node1);
-
-  // Setup two independent port pairs, A-B on node0 and C-D on node1.
-  PortRef A, B, C, D;
-  EXPECT_EQ(OK, node0.node().CreatePortPair(&A, &B));
-  EXPECT_EQ(OK, node1.node().CreatePortPair(&C, &D));
-
-  ScopedMessage message;
-  PortRef X, Y;
-  EXPECT_EQ(OK, node1.node().CreatePortPair(&X, &Y));
-
-  // Block the merge from proceeding until we can do something stupid with port
-  // C. This avoids the test logic racing with async merge logic.
-  node1.BlockOnEvent(EventType::kMergePort);
-
-  // Initiate the merge between B and C.
-  EXPECT_EQ(OK, node0.node().MergePorts(B, node1.name(), C.name()));
-
-  // Move C to a new port E. This is not a sane use of Node's public API but
-  // is still hypothetically possible. It allows us to force a merge failure
-  // because C will be in an invalid state by the term the merge is processed.
-  // As a result, B should be closed.
-  EXPECT_EQ(OK, node1.SendStringMessageWithPort(X, "foo", C));
-
-  node1.Unblock();
-
-  ASSERT_TRUE(node1.ReadMessage(Y, &message));
-  ASSERT_EQ(1u, message->num_ports());
-  PortRef E;
-  ASSERT_EQ(OK, node1.node().GetPort(message->ports()[0], &E));
-
-  EXPECT_EQ(OK, node1.node().ClosePort(X));
-  EXPECT_EQ(OK, node1.node().ClosePort(Y));
-
-  WaitForIdle();
-
-  // C goes away as a result of normal proxy removal. B should have been closed
-  // cleanly by the failed MergePorts.
-  EXPECT_EQ(ERROR_PORT_UNKNOWN, node1.node().GetPort(C.name(), &C));
-  EXPECT_EQ(ERROR_PORT_UNKNOWN, node0.node().GetPort(B.name(), &B));
-
-  // Close A, D, and E.
-  EXPECT_EQ(OK, node0.node().ClosePort(A));
-  EXPECT_EQ(OK, node1.node().ClosePort(D));
-  EXPECT_EQ(OK, node1.node().ClosePort(E));
-
-  WaitForIdle();
-
-  // Expect everything to have gone away.
-  EXPECT_TRUE(node0.node().CanShutdownCleanly());
-  EXPECT_TRUE(node1.node().CanShutdownCleanly());
-}
-
-}  // namespace test
-}  // namespace ports
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/ports/user_data.h b/mojo/edk/system/ports/user_data.h
deleted file mode 100644
index 73e7d17..0000000
--- a/mojo/edk/system/ports/user_data.h
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_SYSTEM_PORTS_USER_DATA_H_
-#define MOJO_EDK_SYSTEM_PORTS_USER_DATA_H_
-
-#include "base/memory/ref_counted.h"
-
-namespace mojo {
-namespace edk {
-namespace ports {
-
-class UserData : public base::RefCountedThreadSafe<UserData> {
- protected:
-  friend class base::RefCountedThreadSafe<UserData>;
-
-  virtual ~UserData() {}
-};
-
-}  // namespace ports
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_PORTS_USER_DATA_H_
diff --git a/mojo/edk/system/ports_message.cc b/mojo/edk/system/ports_message.cc
deleted file mode 100644
index 5f3e8c0..0000000
--- a/mojo/edk/system/ports_message.cc
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/system/ports_message.h"
-
-#include "base/memory/ptr_util.h"
-#include "mojo/edk/system/node_channel.h"
-
-namespace mojo {
-namespace edk {
-
-// static
-std::unique_ptr<PortsMessage> PortsMessage::NewUserMessage(
-    size_t num_payload_bytes,
-    size_t num_ports,
-    size_t num_handles) {
-  return base::WrapUnique(
-      new PortsMessage(num_payload_bytes, num_ports, num_handles));
-}
-
-PortsMessage::~PortsMessage() {}
-
-PortsMessage::PortsMessage(size_t num_payload_bytes,
-                           size_t num_ports,
-                           size_t num_handles)
-    : ports::Message(num_payload_bytes, num_ports) {
-  size_t size = num_header_bytes_ + num_ports_bytes_ + num_payload_bytes;
-  void* ptr;
-  channel_message_ = NodeChannel::CreatePortsMessage(size, &ptr, num_handles);
-  InitializeUserMessageHeader(ptr);
-}
-
-PortsMessage::PortsMessage(size_t num_header_bytes,
-                           size_t num_payload_bytes,
-                           size_t num_ports_bytes,
-                           Channel::MessagePtr channel_message)
-    : ports::Message(num_header_bytes,
-                     num_payload_bytes,
-                     num_ports_bytes) {
-  if (channel_message) {
-    channel_message_ = std::move(channel_message);
-    void* data;
-    size_t num_data_bytes;
-    NodeChannel::GetPortsMessageData(channel_message_.get(), &data,
-                                     &num_data_bytes);
-    start_ = static_cast<char*>(data);
-  } else {
-    // TODO: Clean this up. In practice this branch of the constructor should
-    // only be reached from Node-internal calls to AllocMessage, which never
-    // carry ports or non-header bytes.
-    CHECK_EQ(num_payload_bytes, 0u);
-    CHECK_EQ(num_ports_bytes, 0u);
-    void* ptr;
-    channel_message_ =
-        NodeChannel::CreatePortsMessage(num_header_bytes, &ptr, 0);
-    start_ = static_cast<char*>(ptr);
-  }
-}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/ports_message.h b/mojo/edk/system/ports_message.h
deleted file mode 100644
index 542b981..0000000
--- a/mojo/edk/system/ports_message.h
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_SYSTEM_PORTS_MESSAGE_H__
-#define MOJO_EDK_SYSTEM_PORTS_MESSAGE_H__
-
-#include <memory>
-#include <utility>
-
-#include "mojo/edk/embedder/platform_handle_vector.h"
-#include "mojo/edk/system/channel.h"
-#include "mojo/edk/system/ports/message.h"
-#include "mojo/edk/system/ports/name.h"
-
-namespace mojo {
-namespace edk {
-
-class NodeController;
-
-class PortsMessage : public ports::Message {
- public:
-  static std::unique_ptr<PortsMessage> NewUserMessage(size_t num_payload_bytes,
-                                                      size_t num_ports,
-                                                      size_t num_handles);
-
-  ~PortsMessage() override;
-
-  size_t num_handles() const { return channel_message_->num_handles(); }
-  bool has_handles() const { return channel_message_->has_handles(); }
-
-  void SetHandles(ScopedPlatformHandleVectorPtr handles) {
-    channel_message_->SetHandles(std::move(handles));
-  }
-
-  ScopedPlatformHandleVectorPtr TakeHandles() {
-    return channel_message_->TakeHandles();
-  }
-
-  Channel::MessagePtr TakeChannelMessage() {
-    return std::move(channel_message_);
-  }
-
-  void set_source_node(const ports::NodeName& name) { source_node_ = name; }
-  const ports::NodeName& source_node() const { return source_node_; }
-
- private:
-  friend class NodeController;
-
-  // Construct a new user PortsMessage backed by a new Channel::Message.
-  PortsMessage(size_t num_payload_bytes, size_t num_ports, size_t num_handles);
-
-  // Construct a new PortsMessage backed by a Channel::Message. If
-  // |channel_message| is null, a new one is allocated internally.
-  PortsMessage(size_t num_header_bytes,
-               size_t num_payload_bytes,
-               size_t num_ports_bytes,
-               Channel::MessagePtr channel_message);
-
-  Channel::MessagePtr channel_message_;
-
-  // The node name from which this message was received, if known.
-  ports::NodeName source_node_ = ports::kInvalidNodeName;
-};
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_PORTS_MESSAGE_H__
diff --git a/mojo/edk/system/request_context.cc b/mojo/edk/system/request_context.cc
deleted file mode 100644
index 5de65d7..0000000
--- a/mojo/edk/system/request_context.cc
+++ /dev/null
@@ -1,110 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/system/request_context.h"
-
-#include "base/lazy_instance.h"
-#include "base/logging.h"
-#include "base/threading/thread_local.h"
-
-namespace mojo {
-namespace edk {
-
-namespace {
-
-base::LazyInstance<base::ThreadLocalPointer<RequestContext>>::Leaky
-    g_current_context = LAZY_INSTANCE_INITIALIZER;
-
-}  // namespace
-
-RequestContext::RequestContext() : RequestContext(Source::LOCAL_API_CALL) {}
-
-RequestContext::RequestContext(Source source)
-    : source_(source), tls_context_(g_current_context.Pointer()) {
-  // We allow nested RequestContexts to exist as long as they aren't actually
-  // used for anything.
-  if (!tls_context_->Get())
-    tls_context_->Set(this);
-}
-
-RequestContext::~RequestContext() {
-  if (IsCurrent()) {
-    // NOTE: Callbacks invoked by this destructor are allowed to initiate new
-    // EDK requests on this thread, so we need to reset the thread-local context
-    // pointer before calling them. We persist the original notification source
-    // since we're starting over at the bottom of the stack.
-    tls_context_->Set(nullptr);
-
-    MojoWatcherNotificationFlags flags = MOJO_WATCHER_NOTIFICATION_FLAG_NONE;
-    if (source_ == Source::SYSTEM)
-      flags |= MOJO_WATCHER_NOTIFICATION_FLAG_FROM_SYSTEM;
-
-    // We send all cancellation notifications first. This is necessary because
-    // it's possible that cancelled watches have other pending notifications
-    // attached to this RequestContext.
-    //
-    // From the application's perspective the watch is cancelled as soon as this
-    // notification is received, and dispatching the cancellation notification
-    // updates some internal Watch state to ensure no further notifications
-    // fire. Because notifications on a single Watch are mutually exclusive,
-    // this is sufficient to guarantee that MOJO_RESULT_CANCELLED is the last
-    // notification received; which is the guarantee the API makes.
-    for (const scoped_refptr<Watch>& watch :
-         watch_cancel_finalizers_.container()) {
-      static const HandleSignalsState closed_state = {0, 0};
-
-      // Establish a new RequestContext to capture and run any new notifications
-      // triggered by the callback invocation.
-      RequestContext inner_context(source_);
-      watch->InvokeCallback(MOJO_RESULT_CANCELLED, closed_state, flags);
-    }
-
-    for (const WatchNotifyFinalizer& watch :
-         watch_notify_finalizers_.container()) {
-      RequestContext inner_context(source_);
-      watch.watch->InvokeCallback(watch.result, watch.state, flags);
-    }
-  } else {
-    // It should be impossible for nested contexts to have finalizers.
-    DCHECK(watch_notify_finalizers_.container().empty());
-    DCHECK(watch_cancel_finalizers_.container().empty());
-  }
-}
-
-// static
-RequestContext* RequestContext::current() {
-  DCHECK(g_current_context.Pointer()->Get());
-  return g_current_context.Pointer()->Get();
-}
-
-void RequestContext::AddWatchNotifyFinalizer(scoped_refptr<Watch> watch,
-                                             MojoResult result,
-                                             const HandleSignalsState& state) {
-  DCHECK(IsCurrent());
-  watch_notify_finalizers_->push_back(
-      WatchNotifyFinalizer(std::move(watch), result, state));
-}
-
-void RequestContext::AddWatchCancelFinalizer(scoped_refptr<Watch> watch) {
-  DCHECK(IsCurrent());
-  watch_cancel_finalizers_->push_back(std::move(watch));
-}
-
-bool RequestContext::IsCurrent() const {
-  return tls_context_->Get() == this;
-}
-
-RequestContext::WatchNotifyFinalizer::WatchNotifyFinalizer(
-    scoped_refptr<Watch> watch,
-    MojoResult result,
-    const HandleSignalsState& state)
-    : watch(std::move(watch)), result(result), state(state) {}
-
-RequestContext::WatchNotifyFinalizer::WatchNotifyFinalizer(
-    const WatchNotifyFinalizer& other) = default;
-
-RequestContext::WatchNotifyFinalizer::~WatchNotifyFinalizer() {}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/request_context.h b/mojo/edk/system/request_context.h
deleted file mode 100644
index d1f43bd..0000000
--- a/mojo/edk/system/request_context.h
+++ /dev/null
@@ -1,107 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_SYSTEM_REQUEST_CONTEXT_H_
-#define MOJO_EDK_SYSTEM_REQUEST_CONTEXT_H_
-
-#include "base/containers/stack_container.h"
-#include "base/macros.h"
-#include "mojo/edk/system/handle_signals_state.h"
-#include "mojo/edk/system/system_impl_export.h"
-#include "mojo/edk/system/watch.h"
-
-namespace base {
-template<typename T> class ThreadLocalPointer;
-}
-
-namespace mojo {
-namespace edk {
-
-// A RequestContext is a thread-local object which exists for the duration of
-// a single system API call. It is constructed immediately upon EDK entry and
-// destructed immediately before returning to the caller, after any internal
-// locks have been released.
-//
-// NOTE: It is legal to construct a RequestContext while another one already
-// exists on the current thread, but it is not safe to use the nested context
-// for any reason. Therefore it is important to always use
-// |RequestContext::current()| rather than referring to any local instance
-// directly.
-class MOJO_SYSTEM_IMPL_EXPORT RequestContext {
- public:
-  // Identifies the source of the current stack frame's RequestContext.
-  enum class Source {
-    LOCAL_API_CALL,
-    SYSTEM,
-  };
-
-  // Constructs a RequestContext with a LOCAL_API_CALL Source.
-  RequestContext();
-
-  explicit RequestContext(Source source);
-  ~RequestContext();
-
-  // Returns the current thread-local RequestContext.
-  static RequestContext* current();
-
-  Source source() const { return source_; }
-
-  // Adds a finalizer to this RequestContext corresponding to a watch callback
-  // which should be triggered in response to some handle state change. If
-  // the WatcherDispatcher hasn't been closed by the time this RequestContext is
-  // destroyed, its WatchCallback will be invoked with |result| and |state|
-  // arguments.
-  void AddWatchNotifyFinalizer(scoped_refptr<Watch> watch,
-                               MojoResult result,
-                               const HandleSignalsState& state);
-
-  // Adds a finalizer to this RequestContext corresponding to a watch callback
-  // which should be triggered to notify of watch cancellation. This appends to
-  // a separate finalizer list from AddWatchNotifyFinalizer, as pending
-  // cancellations must always preempt other pending notifications.
-  void AddWatchCancelFinalizer(scoped_refptr<Watch> watch);
-
- private:
-  // Is this request context the current one?
-  bool IsCurrent() const;
-
-  struct WatchNotifyFinalizer {
-    WatchNotifyFinalizer(scoped_refptr<Watch> watch,
-                         MojoResult result,
-                         const HandleSignalsState& state);
-    WatchNotifyFinalizer(const WatchNotifyFinalizer& other);
-    ~WatchNotifyFinalizer();
-
-    scoped_refptr<Watch> watch;
-    MojoResult result;
-    HandleSignalsState state;
-  };
-
-  // NOTE: This upper bound was chosen somewhat arbitrarily after observing some
-  // rare worst-case behavior in Chrome. A vast majority of RequestContexts only
-  // ever accumulate 0 or 1 finalizers.
-  static const size_t kStaticWatchFinalizersCapacity = 8;
-
-  using WatchNotifyFinalizerList =
-      base::StackVector<WatchNotifyFinalizer, kStaticWatchFinalizersCapacity>;
-  using WatchCancelFinalizerList =
-      base::StackVector<scoped_refptr<Watch>, kStaticWatchFinalizersCapacity>;
-
-  const Source source_;
-
-  WatchNotifyFinalizerList watch_notify_finalizers_;
-  WatchCancelFinalizerList watch_cancel_finalizers_;
-
-  // Pointer to the TLS context. Although this can easily be accessed via the
-  // global LazyInstance, accessing a LazyInstance has a large cost relative to
-  // the rest of this class and its usages.
-  base::ThreadLocalPointer<RequestContext>* tls_context_;
-
-  DISALLOW_COPY_AND_ASSIGN(RequestContext);
-};
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_REQUEST_CONTEXT_H_
diff --git a/mojo/edk/system/shared_buffer_dispatcher.cc b/mojo/edk/system/shared_buffer_dispatcher.cc
deleted file mode 100644
index df39105..0000000
--- a/mojo/edk/system/shared_buffer_dispatcher.cc
+++ /dev/null
@@ -1,339 +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 "mojo/edk/system/shared_buffer_dispatcher.h"
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <limits>
-#include <memory>
-#include <utility>
-
-#include "base/logging.h"
-#include "mojo/edk/embedder/embedder_internal.h"
-#include "mojo/edk/system/configuration.h"
-#include "mojo/edk/system/node_controller.h"
-#include "mojo/edk/system/options_validation.h"
-
-namespace mojo {
-namespace edk {
-
-namespace {
-
-#pragma pack(push, 1)
-
-struct SerializedState {
-  uint64_t num_bytes;
-  uint32_t flags;
-  uint32_t padding;
-};
-
-const uint32_t kSerializedStateFlagsReadOnly = 1 << 0;
-
-#pragma pack(pop)
-
-static_assert(sizeof(SerializedState) % 8 == 0,
-              "Invalid SerializedState size.");
-
-}  // namespace
-
-// static
-const MojoCreateSharedBufferOptions
-    SharedBufferDispatcher::kDefaultCreateOptions = {
-        static_cast<uint32_t>(sizeof(MojoCreateSharedBufferOptions)),
-        MOJO_CREATE_SHARED_BUFFER_OPTIONS_FLAG_NONE};
-
-// static
-MojoResult SharedBufferDispatcher::ValidateCreateOptions(
-    const MojoCreateSharedBufferOptions* in_options,
-    MojoCreateSharedBufferOptions* out_options) {
-  const MojoCreateSharedBufferOptionsFlags kKnownFlags =
-      MOJO_CREATE_SHARED_BUFFER_OPTIONS_FLAG_NONE;
-
-  *out_options = kDefaultCreateOptions;
-  if (!in_options)
-    return MOJO_RESULT_OK;
-
-  UserOptionsReader<MojoCreateSharedBufferOptions> reader(in_options);
-  if (!reader.is_valid())
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  if (!OPTIONS_STRUCT_HAS_MEMBER(MojoCreateSharedBufferOptions, flags, reader))
-    return MOJO_RESULT_OK;
-  if ((reader.options().flags & ~kKnownFlags))
-    return MOJO_RESULT_UNIMPLEMENTED;
-  out_options->flags = reader.options().flags;
-
-  // Checks for fields beyond |flags|:
-
-  // (Nothing here yet.)
-
-  return MOJO_RESULT_OK;
-}
-
-// static
-MojoResult SharedBufferDispatcher::Create(
-    const MojoCreateSharedBufferOptions& /*validated_options*/,
-    NodeController* node_controller,
-    uint64_t num_bytes,
-    scoped_refptr<SharedBufferDispatcher>* result) {
-  if (!num_bytes)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-  if (num_bytes > GetConfiguration().max_shared_memory_num_bytes)
-    return MOJO_RESULT_RESOURCE_EXHAUSTED;
-
-  scoped_refptr<PlatformSharedBuffer> shared_buffer;
-  if (node_controller) {
-    shared_buffer =
-        node_controller->CreateSharedBuffer(static_cast<size_t>(num_bytes));
-  } else {
-    shared_buffer =
-        PlatformSharedBuffer::Create(static_cast<size_t>(num_bytes));
-  }
-  if (!shared_buffer)
-    return MOJO_RESULT_RESOURCE_EXHAUSTED;
-
-  *result = CreateInternal(std::move(shared_buffer));
-  return MOJO_RESULT_OK;
-}
-
-// static
-MojoResult SharedBufferDispatcher::CreateFromPlatformSharedBuffer(
-    const scoped_refptr<PlatformSharedBuffer>& shared_buffer,
-    scoped_refptr<SharedBufferDispatcher>* result) {
-  if (!shared_buffer)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  *result = CreateInternal(shared_buffer);
-  return MOJO_RESULT_OK;
-}
-
-// static
-scoped_refptr<SharedBufferDispatcher> SharedBufferDispatcher::Deserialize(
-    const void* bytes,
-    size_t num_bytes,
-    const ports::PortName* ports,
-    size_t num_ports,
-    PlatformHandle* platform_handles,
-    size_t num_platform_handles) {
-  if (num_bytes != sizeof(SerializedState)) {
-    LOG(ERROR) << "Invalid serialized shared buffer dispatcher (bad size)";
-    return nullptr;
-  }
-
-  const SerializedState* serialization =
-      static_cast<const SerializedState*>(bytes);
-  if (!serialization->num_bytes) {
-    LOG(ERROR)
-        << "Invalid serialized shared buffer dispatcher (invalid num_bytes)";
-    return nullptr;
-  }
-
-  if (!platform_handles || num_platform_handles != 1 || num_ports) {
-    LOG(ERROR)
-        << "Invalid serialized shared buffer dispatcher (missing handles)";
-    return nullptr;
-  }
-
-  // Starts off invalid, which is what we want.
-  PlatformHandle platform_handle;
-  // We take ownership of the handle, so we have to invalidate the one in
-  // |platform_handles|.
-  std::swap(platform_handle, *platform_handles);
-
-  // Wrapping |platform_handle| in a |ScopedPlatformHandle| means that it'll be
-  // closed even if creation fails.
-  bool read_only = (serialization->flags & kSerializedStateFlagsReadOnly);
-  scoped_refptr<PlatformSharedBuffer> shared_buffer(
-      PlatformSharedBuffer::CreateFromPlatformHandle(
-          static_cast<size_t>(serialization->num_bytes), read_only,
-          ScopedPlatformHandle(platform_handle)));
-  if (!shared_buffer) {
-    LOG(ERROR)
-        << "Invalid serialized shared buffer dispatcher (invalid num_bytes?)";
-    return nullptr;
-  }
-
-  return CreateInternal(std::move(shared_buffer));
-}
-
-scoped_refptr<PlatformSharedBuffer>
-SharedBufferDispatcher::PassPlatformSharedBuffer() {
-  base::AutoLock lock(lock_);
-  if (!shared_buffer_ || in_transit_)
-    return nullptr;
-
-  scoped_refptr<PlatformSharedBuffer> retval = shared_buffer_;
-  shared_buffer_ = nullptr;
-  return retval;
-}
-
-Dispatcher::Type SharedBufferDispatcher::GetType() const {
-  return Type::SHARED_BUFFER;
-}
-
-MojoResult SharedBufferDispatcher::Close() {
-  base::AutoLock lock(lock_);
-  if (in_transit_)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  shared_buffer_ = nullptr;
-  return MOJO_RESULT_OK;
-}
-
-MojoResult SharedBufferDispatcher::DuplicateBufferHandle(
-    const MojoDuplicateBufferHandleOptions* options,
-    scoped_refptr<Dispatcher>* new_dispatcher) {
-  MojoDuplicateBufferHandleOptions validated_options;
-  MojoResult result = ValidateDuplicateOptions(options, &validated_options);
-  if (result != MOJO_RESULT_OK)
-    return result;
-
-  // Note: Since this is "duplicate", we keep our ref to |shared_buffer_|.
-  base::AutoLock lock(lock_);
-  if (in_transit_)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  if ((validated_options.flags &
-       MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_READ_ONLY) &&
-      (!shared_buffer_->IsReadOnly())) {
-    // If a read-only duplicate is requested and |shared_buffer_| is not
-    // read-only, make a read-only duplicate of |shared_buffer_|.
-    scoped_refptr<PlatformSharedBuffer> read_only_buffer =
-        shared_buffer_->CreateReadOnlyDuplicate();
-    if (!read_only_buffer)
-      return MOJO_RESULT_FAILED_PRECONDITION;
-    DCHECK(read_only_buffer->IsReadOnly());
-    *new_dispatcher = CreateInternal(std::move(read_only_buffer));
-    return MOJO_RESULT_OK;
-  }
-
-  *new_dispatcher = CreateInternal(shared_buffer_);
-  return MOJO_RESULT_OK;
-}
-
-MojoResult SharedBufferDispatcher::MapBuffer(
-    uint64_t offset,
-    uint64_t num_bytes,
-    MojoMapBufferFlags flags,
-    std::unique_ptr<PlatformSharedBufferMapping>* mapping) {
-  if (offset > static_cast<uint64_t>(std::numeric_limits<size_t>::max()))
-    return MOJO_RESULT_INVALID_ARGUMENT;
-  if (num_bytes > static_cast<uint64_t>(std::numeric_limits<size_t>::max()))
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  base::AutoLock lock(lock_);
-  DCHECK(shared_buffer_);
-  if (in_transit_ ||
-      !shared_buffer_->IsValidMap(static_cast<size_t>(offset),
-                                  static_cast<size_t>(num_bytes))) {
-    return MOJO_RESULT_INVALID_ARGUMENT;
-  }
-
-  DCHECK(mapping);
-  *mapping = shared_buffer_->MapNoCheck(static_cast<size_t>(offset),
-                                        static_cast<size_t>(num_bytes));
-  if (!*mapping) {
-    LOG(ERROR) << "Unable to map: read_only" << shared_buffer_->IsReadOnly();
-    return MOJO_RESULT_RESOURCE_EXHAUSTED;
-  }
-
-  return MOJO_RESULT_OK;
-}
-
-void SharedBufferDispatcher::StartSerialize(uint32_t* num_bytes,
-                                            uint32_t* num_ports,
-                                            uint32_t* num_platform_handles) {
-  *num_bytes = sizeof(SerializedState);
-  *num_ports = 0;
-  *num_platform_handles = 1;
-}
-
-bool SharedBufferDispatcher::EndSerialize(void* destination,
-                                          ports::PortName* ports,
-                                          PlatformHandle* handles) {
-  SerializedState* serialization =
-      static_cast<SerializedState*>(destination);
-  base::AutoLock lock(lock_);
-  serialization->num_bytes =
-        static_cast<uint64_t>(shared_buffer_->GetNumBytes());
-  serialization->flags =
-      (shared_buffer_->IsReadOnly() ? kSerializedStateFlagsReadOnly : 0);
-  serialization->padding = 0;
-
-  handle_for_transit_ = shared_buffer_->DuplicatePlatformHandle();
-  if (!handle_for_transit_.is_valid()) {
-    shared_buffer_ = nullptr;
-    return false;
-  }
-  handles[0] = handle_for_transit_.get();
-  return true;
-}
-
-bool SharedBufferDispatcher::BeginTransit() {
-  base::AutoLock lock(lock_);
-  if (in_transit_)
-    return false;
-  in_transit_ = static_cast<bool>(shared_buffer_);
-  return in_transit_;
-}
-
-void SharedBufferDispatcher::CompleteTransitAndClose() {
-  base::AutoLock lock(lock_);
-  in_transit_ = false;
-  shared_buffer_ = nullptr;
-  ignore_result(handle_for_transit_.release());
-}
-
-void SharedBufferDispatcher::CancelTransit() {
-  base::AutoLock lock(lock_);
-  in_transit_ = false;
-  handle_for_transit_.reset();
-}
-
-SharedBufferDispatcher::SharedBufferDispatcher(
-    scoped_refptr<PlatformSharedBuffer> shared_buffer)
-    : shared_buffer_(shared_buffer) {
-  DCHECK(shared_buffer_);
-}
-
-SharedBufferDispatcher::~SharedBufferDispatcher() {
-  DCHECK(!shared_buffer_ && !in_transit_);
-}
-
-// static
-MojoResult SharedBufferDispatcher::ValidateDuplicateOptions(
-    const MojoDuplicateBufferHandleOptions* in_options,
-    MojoDuplicateBufferHandleOptions* out_options) {
-  const MojoDuplicateBufferHandleOptionsFlags kKnownFlags =
-      MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_READ_ONLY;
-  static const MojoDuplicateBufferHandleOptions kDefaultOptions = {
-      static_cast<uint32_t>(sizeof(MojoDuplicateBufferHandleOptions)),
-      MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_NONE};
-
-  *out_options = kDefaultOptions;
-  if (!in_options)
-    return MOJO_RESULT_OK;
-
-  UserOptionsReader<MojoDuplicateBufferHandleOptions> reader(in_options);
-  if (!reader.is_valid())
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  if (!OPTIONS_STRUCT_HAS_MEMBER(MojoDuplicateBufferHandleOptions, flags,
-                                 reader))
-    return MOJO_RESULT_OK;
-  if ((reader.options().flags & ~kKnownFlags))
-    return MOJO_RESULT_UNIMPLEMENTED;
-  out_options->flags = reader.options().flags;
-
-  // Checks for fields beyond |flags|:
-
-  // (Nothing here yet.)
-
-  return MOJO_RESULT_OK;
-}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/shared_buffer_dispatcher.h b/mojo/edk/system/shared_buffer_dispatcher.h
deleted file mode 100644
index 6015595..0000000
--- a/mojo/edk/system/shared_buffer_dispatcher.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 MOJO_EDK_SYSTEM_SHARED_BUFFER_DISPATCHER_H_
-#define MOJO_EDK_SYSTEM_SHARED_BUFFER_DISPATCHER_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <utility>
-
-#include "base/macros.h"
-#include "mojo/edk/embedder/platform_handle_vector.h"
-#include "mojo/edk/embedder/platform_shared_buffer.h"
-#include "mojo/edk/embedder/scoped_platform_handle.h"
-#include "mojo/edk/system/dispatcher.h"
-#include "mojo/edk/system/system_impl_export.h"
-
-namespace mojo {
-
-namespace edk {
-class NodeController;
-
-class MOJO_SYSTEM_IMPL_EXPORT SharedBufferDispatcher final : public Dispatcher {
- public:
-  // The default options to use for |MojoCreateSharedBuffer()|. (Real uses
-  // should obtain this via |ValidateCreateOptions()| with a null |in_options|;
-  // this is exposed directly for testing convenience.)
-  static const MojoCreateSharedBufferOptions kDefaultCreateOptions;
-
-  // Validates and/or sets default options for |MojoCreateSharedBufferOptions|.
-  // If non-null, |in_options| must point to a struct of at least
-  // |in_options->struct_size| bytes. |out_options| must point to a (current)
-  // |MojoCreateSharedBufferOptions| and will be entirely overwritten on success
-  // (it may be partly overwritten on failure).
-  static MojoResult ValidateCreateOptions(
-      const MojoCreateSharedBufferOptions* in_options,
-      MojoCreateSharedBufferOptions* out_options);
-
-  // Static factory method: |validated_options| must be validated (obviously).
-  // On failure, |*result| will be left as-is.
-  // TODO(vtl): This should probably be made to return a scoped_refptr and have
-  // a MojoResult out parameter instead.
-  static MojoResult Create(
-      const MojoCreateSharedBufferOptions& validated_options,
-      NodeController* node_controller,
-      uint64_t num_bytes,
-      scoped_refptr<SharedBufferDispatcher>* result);
-
-  // Create a |SharedBufferDispatcher| from |shared_buffer|.
-  static MojoResult CreateFromPlatformSharedBuffer(
-      const scoped_refptr<PlatformSharedBuffer>& shared_buffer,
-      scoped_refptr<SharedBufferDispatcher>* result);
-
-  // The "opposite" of SerializeAndClose(). Called by Dispatcher::Deserialize().
-  static scoped_refptr<SharedBufferDispatcher> Deserialize(
-      const void* bytes,
-      size_t num_bytes,
-      const ports::PortName* ports,
-      size_t num_ports,
-      PlatformHandle* platform_handles,
-      size_t num_platform_handles);
-
-  // Passes the underlying platform shared buffer. This dispatcher must be
-  // closed after calling this function.
-  scoped_refptr<PlatformSharedBuffer> PassPlatformSharedBuffer();
-
-  // Dispatcher:
-  Type GetType() const override;
-  MojoResult Close() override;
-  MojoResult DuplicateBufferHandle(
-      const MojoDuplicateBufferHandleOptions* options,
-      scoped_refptr<Dispatcher>* new_dispatcher) override;
-  MojoResult MapBuffer(
-      uint64_t offset,
-      uint64_t num_bytes,
-      MojoMapBufferFlags flags,
-      std::unique_ptr<PlatformSharedBufferMapping>* mapping) override;
-  void StartSerialize(uint32_t* num_bytes,
-                      uint32_t* num_ports,
-                      uint32_t* num_platform_handles) override;
-  bool EndSerialize(void* destination,
-                    ports::PortName* ports,
-                    PlatformHandle* handles) override;
-  bool BeginTransit() override;
-  void CompleteTransitAndClose() override;
-  void CancelTransit() override;
-
- private:
-  static scoped_refptr<SharedBufferDispatcher> CreateInternal(
-      scoped_refptr<PlatformSharedBuffer> shared_buffer) {
-    return make_scoped_refptr(
-        new SharedBufferDispatcher(std::move(shared_buffer)));
-  }
-
-  explicit SharedBufferDispatcher(
-      scoped_refptr<PlatformSharedBuffer> shared_buffer);
-  ~SharedBufferDispatcher() override;
-
-  // Validates and/or sets default options for
-  // |MojoDuplicateBufferHandleOptions|. If non-null, |in_options| must point to
-  // a struct of at least |in_options->struct_size| bytes. |out_options| must
-  // point to a (current) |MojoDuplicateBufferHandleOptions| and will be
-  // entirely overwritten on success (it may be partly overwritten on failure).
-  static MojoResult ValidateDuplicateOptions(
-      const MojoDuplicateBufferHandleOptions* in_options,
-      MojoDuplicateBufferHandleOptions* out_options);
-
-  // Guards access to |shared_buffer_|.
-  base::Lock lock_;
-
-  bool in_transit_ = false;
-
-  // We keep a copy of the buffer's platform handle during transit so we can
-  // close it if something goes wrong.
-  ScopedPlatformHandle handle_for_transit_;
-
-  scoped_refptr<PlatformSharedBuffer> shared_buffer_;
-
-  DISALLOW_COPY_AND_ASSIGN(SharedBufferDispatcher);
-};
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_SHARED_BUFFER_DISPATCHER_H_
diff --git a/mojo/edk/system/shared_buffer_dispatcher_unittest.cc b/mojo/edk/system/shared_buffer_dispatcher_unittest.cc
deleted file mode 100644
index c95bdc3..0000000
--- a/mojo/edk/system/shared_buffer_dispatcher_unittest.cc
+++ /dev/null
@@ -1,312 +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 "mojo/edk/system/shared_buffer_dispatcher.h"
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <limits>
-
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "mojo/edk/embedder/platform_shared_buffer.h"
-#include "mojo/edk/system/dispatcher.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace edk {
-namespace {
-
-// NOTE(vtl): There's currently not much to test for in
-// |SharedBufferDispatcher::ValidateCreateOptions()|, but the tests should be
-// expanded if/when options are added, so I've kept the general form of the
-// tests from data_pipe_unittest.cc.
-
-const uint32_t kSizeOfCreateOptions = sizeof(MojoCreateSharedBufferOptions);
-
-// Does a cursory sanity check of |validated_options|. Calls
-// |ValidateCreateOptions()| on already-validated options. The validated options
-// should be valid, and the revalidated copy should be the same.
-void RevalidateCreateOptions(
-    const MojoCreateSharedBufferOptions& validated_options) {
-  EXPECT_EQ(kSizeOfCreateOptions, validated_options.struct_size);
-  // Nothing to check for flags.
-
-  MojoCreateSharedBufferOptions revalidated_options = {};
-  EXPECT_EQ(MOJO_RESULT_OK,
-            SharedBufferDispatcher::ValidateCreateOptions(
-                &validated_options, &revalidated_options));
-  EXPECT_EQ(validated_options.struct_size, revalidated_options.struct_size);
-  EXPECT_EQ(validated_options.flags, revalidated_options.flags);
-}
-
-class SharedBufferDispatcherTest : public testing::Test {
- public:
-  SharedBufferDispatcherTest() {}
-  ~SharedBufferDispatcherTest() override {}
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(SharedBufferDispatcherTest);
-};
-
-// Tests valid inputs to |ValidateCreateOptions()|.
-TEST_F(SharedBufferDispatcherTest, ValidateCreateOptionsValid) {
-  // Default options.
-  {
-    MojoCreateSharedBufferOptions validated_options = {};
-    EXPECT_EQ(MOJO_RESULT_OK, SharedBufferDispatcher::ValidateCreateOptions(
-                                  nullptr, &validated_options));
-    RevalidateCreateOptions(validated_options);
-  }
-
-  // Different flags.
-  MojoCreateSharedBufferOptionsFlags flags_values[] = {
-      MOJO_CREATE_SHARED_BUFFER_OPTIONS_FLAG_NONE};
-  for (size_t i = 0; i < arraysize(flags_values); i++) {
-    const MojoCreateSharedBufferOptionsFlags flags = flags_values[i];
-
-    // Different capacities (size 1).
-    for (uint32_t capacity = 1; capacity <= 100 * 1000 * 1000; capacity *= 10) {
-      MojoCreateSharedBufferOptions options = {
-          kSizeOfCreateOptions,  // |struct_size|.
-          flags                  // |flags|.
-      };
-      MojoCreateSharedBufferOptions validated_options = {};
-      EXPECT_EQ(MOJO_RESULT_OK,
-                SharedBufferDispatcher::ValidateCreateOptions(
-                    &options, &validated_options))
-          << capacity;
-      RevalidateCreateOptions(validated_options);
-      EXPECT_EQ(options.flags, validated_options.flags);
-    }
-  }
-}
-
-TEST_F(SharedBufferDispatcherTest, ValidateCreateOptionsInvalid) {
-  // Invalid |struct_size|.
-  {
-    MojoCreateSharedBufferOptions options = {
-        1,                                           // |struct_size|.
-        MOJO_CREATE_SHARED_BUFFER_OPTIONS_FLAG_NONE  // |flags|.
-    };
-    MojoCreateSharedBufferOptions unused;
-    EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-              SharedBufferDispatcher::ValidateCreateOptions(
-                  &options, &unused));
-  }
-
-  // Unknown |flags|.
-  {
-    MojoCreateSharedBufferOptions options = {
-        kSizeOfCreateOptions,  // |struct_size|.
-        ~0u                    // |flags|.
-    };
-    MojoCreateSharedBufferOptions unused;
-    EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED,
-              SharedBufferDispatcher::ValidateCreateOptions(
-                  &options, &unused));
-  }
-}
-
-TEST_F(SharedBufferDispatcherTest, CreateAndMapBuffer) {
-  scoped_refptr<SharedBufferDispatcher> dispatcher;
-  EXPECT_EQ(MOJO_RESULT_OK, SharedBufferDispatcher::Create(
-                                SharedBufferDispatcher::kDefaultCreateOptions,
-                                nullptr, 100, &dispatcher));
-  ASSERT_TRUE(dispatcher);
-  EXPECT_EQ(Dispatcher::Type::SHARED_BUFFER, dispatcher->GetType());
-
-  // Make a couple of mappings.
-  std::unique_ptr<PlatformSharedBufferMapping> mapping1;
-  EXPECT_EQ(MOJO_RESULT_OK, dispatcher->MapBuffer(
-                                0, 100, MOJO_MAP_BUFFER_FLAG_NONE, &mapping1));
-  ASSERT_TRUE(mapping1);
-  ASSERT_TRUE(mapping1->GetBase());
-  EXPECT_EQ(100u, mapping1->GetLength());
-  // Write something.
-  static_cast<char*>(mapping1->GetBase())[50] = 'x';
-
-  std::unique_ptr<PlatformSharedBufferMapping> mapping2;
-  EXPECT_EQ(MOJO_RESULT_OK, dispatcher->MapBuffer(
-                                50, 50, MOJO_MAP_BUFFER_FLAG_NONE, &mapping2));
-  ASSERT_TRUE(mapping2);
-  ASSERT_TRUE(mapping2->GetBase());
-  EXPECT_EQ(50u, mapping2->GetLength());
-  EXPECT_EQ('x', static_cast<char*>(mapping2->GetBase())[0]);
-
-  EXPECT_EQ(MOJO_RESULT_OK, dispatcher->Close());
-
-  // Check that we can still read/write to mappings after the dispatcher has
-  // gone away.
-  static_cast<char*>(mapping2->GetBase())[1] = 'y';
-  EXPECT_EQ('y', static_cast<char*>(mapping1->GetBase())[51]);
-}
-
-TEST_F(SharedBufferDispatcherTest, CreateAndMapBufferFromPlatformBuffer) {
-  scoped_refptr<PlatformSharedBuffer> platform_shared_buffer =
-      PlatformSharedBuffer::Create(100);
-  ASSERT_TRUE(platform_shared_buffer);
-  scoped_refptr<SharedBufferDispatcher> dispatcher;
-  EXPECT_EQ(MOJO_RESULT_OK,
-            SharedBufferDispatcher::CreateFromPlatformSharedBuffer(
-                platform_shared_buffer, &dispatcher));
-  ASSERT_TRUE(dispatcher);
-  EXPECT_EQ(Dispatcher::Type::SHARED_BUFFER, dispatcher->GetType());
-
-  // Make a couple of mappings.
-  std::unique_ptr<PlatformSharedBufferMapping> mapping1;
-  EXPECT_EQ(MOJO_RESULT_OK, dispatcher->MapBuffer(
-                                0, 100, MOJO_MAP_BUFFER_FLAG_NONE, &mapping1));
-  ASSERT_TRUE(mapping1);
-  ASSERT_TRUE(mapping1->GetBase());
-  EXPECT_EQ(100u, mapping1->GetLength());
-  // Write something.
-  static_cast<char*>(mapping1->GetBase())[50] = 'x';
-
-  std::unique_ptr<PlatformSharedBufferMapping> mapping2;
-  EXPECT_EQ(MOJO_RESULT_OK, dispatcher->MapBuffer(
-                                50, 50, MOJO_MAP_BUFFER_FLAG_NONE, &mapping2));
-  ASSERT_TRUE(mapping2);
-  ASSERT_TRUE(mapping2->GetBase());
-  EXPECT_EQ(50u, mapping2->GetLength());
-  EXPECT_EQ('x', static_cast<char*>(mapping2->GetBase())[0]);
-
-  EXPECT_EQ(MOJO_RESULT_OK, dispatcher->Close());
-
-  // Check that we can still read/write to mappings after the dispatcher has
-  // gone away.
-  static_cast<char*>(mapping2->GetBase())[1] = 'y';
-  EXPECT_EQ('y', static_cast<char*>(mapping1->GetBase())[51]);
-}
-
-TEST_F(SharedBufferDispatcherTest, DuplicateBufferHandle) {
-  scoped_refptr<SharedBufferDispatcher> dispatcher1;
-  EXPECT_EQ(MOJO_RESULT_OK, SharedBufferDispatcher::Create(
-                                SharedBufferDispatcher::kDefaultCreateOptions,
-                                nullptr, 100, &dispatcher1));
-
-  // Map and write something.
-  std::unique_ptr<PlatformSharedBufferMapping> mapping;
-  EXPECT_EQ(MOJO_RESULT_OK, dispatcher1->MapBuffer(
-                                0, 100, MOJO_MAP_BUFFER_FLAG_NONE, &mapping));
-  static_cast<char*>(mapping->GetBase())[0] = 'x';
-  mapping.reset();
-
-  // Duplicate |dispatcher1| and then close it.
-  scoped_refptr<Dispatcher> dispatcher2;
-  EXPECT_EQ(MOJO_RESULT_OK, dispatcher1->DuplicateBufferHandle(
-                                nullptr, &dispatcher2));
-  ASSERT_TRUE(dispatcher2);
-  EXPECT_EQ(Dispatcher::Type::SHARED_BUFFER, dispatcher2->GetType());
-
-  EXPECT_EQ(MOJO_RESULT_OK, dispatcher1->Close());
-
-  // Map |dispatcher2| and read something.
-  EXPECT_EQ(MOJO_RESULT_OK, dispatcher2->MapBuffer(
-                                0, 100, MOJO_MAP_BUFFER_FLAG_NONE, &mapping));
-  EXPECT_EQ('x', static_cast<char*>(mapping->GetBase())[0]);
-
-  EXPECT_EQ(MOJO_RESULT_OK, dispatcher2->Close());
-}
-
-TEST_F(SharedBufferDispatcherTest, DuplicateBufferHandleOptionsValid) {
-  scoped_refptr<SharedBufferDispatcher> dispatcher1;
-  EXPECT_EQ(MOJO_RESULT_OK, SharedBufferDispatcher::Create(
-                                SharedBufferDispatcher::kDefaultCreateOptions,
-                                nullptr, 100, &dispatcher1));
-
-  MojoDuplicateBufferHandleOptions options[] = {
-      {sizeof(MojoDuplicateBufferHandleOptions),
-       MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_NONE},
-      {sizeof(MojoDuplicateBufferHandleOptions),
-       MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_READ_ONLY},
-      {sizeof(MojoDuplicateBufferHandleOptionsFlags), ~0u}};
-  for (size_t i = 0; i < arraysize(options); i++) {
-    scoped_refptr<Dispatcher> dispatcher2;
-    EXPECT_EQ(MOJO_RESULT_OK, dispatcher1->DuplicateBufferHandle(
-                                  &options[i], &dispatcher2));
-    ASSERT_TRUE(dispatcher2);
-    EXPECT_EQ(Dispatcher::Type::SHARED_BUFFER, dispatcher2->GetType());
-    {
-      std::unique_ptr<PlatformSharedBufferMapping> mapping;
-      EXPECT_EQ(MOJO_RESULT_OK, dispatcher2->MapBuffer(0, 100, 0, &mapping));
-    }
-    EXPECT_EQ(MOJO_RESULT_OK, dispatcher2->Close());
-  }
-
-  EXPECT_EQ(MOJO_RESULT_OK, dispatcher1->Close());
-}
-
-TEST_F(SharedBufferDispatcherTest, DuplicateBufferHandleOptionsInvalid) {
-  scoped_refptr<SharedBufferDispatcher> dispatcher1;
-  EXPECT_EQ(MOJO_RESULT_OK, SharedBufferDispatcher::Create(
-                                SharedBufferDispatcher::kDefaultCreateOptions,
-                                nullptr, 100, &dispatcher1));
-
-  // Invalid |struct_size|.
-  {
-    MojoDuplicateBufferHandleOptions options = {
-        1u, MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_NONE};
-    scoped_refptr<Dispatcher> dispatcher2;
-    EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-              dispatcher1->DuplicateBufferHandle(&options, &dispatcher2));
-    EXPECT_FALSE(dispatcher2);
-  }
-
-  // Unknown |flags|.
-  {
-    MojoDuplicateBufferHandleOptions options = {
-        sizeof(MojoDuplicateBufferHandleOptions), ~0u};
-    scoped_refptr<Dispatcher> dispatcher2;
-    EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED,
-              dispatcher1->DuplicateBufferHandle(&options, &dispatcher2));
-    EXPECT_FALSE(dispatcher2);
-  }
-
-  EXPECT_EQ(MOJO_RESULT_OK, dispatcher1->Close());
-}
-
-TEST_F(SharedBufferDispatcherTest, CreateInvalidNumBytes) {
-  // Size too big.
-  scoped_refptr<SharedBufferDispatcher> dispatcher;
-  EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED,
-            SharedBufferDispatcher::Create(
-                SharedBufferDispatcher::kDefaultCreateOptions, nullptr,
-                std::numeric_limits<uint64_t>::max(), &dispatcher));
-  EXPECT_FALSE(dispatcher);
-
-  // Zero size.
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            SharedBufferDispatcher::Create(
-                SharedBufferDispatcher::kDefaultCreateOptions, nullptr, 0,
-                &dispatcher));
-  EXPECT_FALSE(dispatcher);
-}
-
-TEST_F(SharedBufferDispatcherTest, MapBufferInvalidArguments) {
-  scoped_refptr<SharedBufferDispatcher> dispatcher;
-  EXPECT_EQ(MOJO_RESULT_OK, SharedBufferDispatcher::Create(
-                                SharedBufferDispatcher::kDefaultCreateOptions,
-                                nullptr, 100, &dispatcher));
-
-  std::unique_ptr<PlatformSharedBufferMapping> mapping;
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            dispatcher->MapBuffer(0, 101, MOJO_MAP_BUFFER_FLAG_NONE, &mapping));
-  EXPECT_FALSE(mapping);
-
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            dispatcher->MapBuffer(1, 100, MOJO_MAP_BUFFER_FLAG_NONE, &mapping));
-  EXPECT_FALSE(mapping);
-
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            dispatcher->MapBuffer(0, 0, MOJO_MAP_BUFFER_FLAG_NONE, &mapping));
-  EXPECT_FALSE(mapping);
-
-  EXPECT_EQ(MOJO_RESULT_OK, dispatcher->Close());
-}
-
-}  // namespace
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/shared_buffer_unittest.cc b/mojo/edk/system/shared_buffer_unittest.cc
deleted file mode 100644
index 3a72872..0000000
--- a/mojo/edk/system/shared_buffer_unittest.cc
+++ /dev/null
@@ -1,318 +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 <string.h>
-
-#include <string>
-#include <utility>
-
-#include "base/logging.h"
-#include "base/memory/shared_memory.h"
-#include "base/strings/string_piece.h"
-#include "mojo/edk/test/mojo_test_base.h"
-#include "mojo/public/c/system/types.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace edk {
-namespace {
-
-using SharedBufferTest = test::MojoTestBase;
-
-TEST_F(SharedBufferTest, CreateSharedBuffer) {
-  const std::string message = "hello";
-  MojoHandle h = CreateBuffer(message.size());
-  WriteToBuffer(h, 0, message);
-  ExpectBufferContents(h, 0, message);
-}
-
-TEST_F(SharedBufferTest, DuplicateSharedBuffer) {
-  const std::string message = "hello";
-  MojoHandle h = CreateBuffer(message.size());
-  WriteToBuffer(h, 0, message);
-
-  MojoHandle dupe = DuplicateBuffer(h, false);
-  ExpectBufferContents(dupe, 0, message);
-}
-
-TEST_F(SharedBufferTest, PassSharedBufferLocal) {
-  const std::string message = "hello";
-  MojoHandle h = CreateBuffer(message.size());
-  WriteToBuffer(h, 0, message);
-
-  MojoHandle dupe = DuplicateBuffer(h, false);
-  MojoHandle p0, p1;
-  CreateMessagePipe(&p0, &p1);
-
-  WriteMessageWithHandles(p0, "...", &dupe, 1);
-  EXPECT_EQ("...", ReadMessageWithHandles(p1, &dupe, 1));
-
-  ExpectBufferContents(dupe, 0, message);
-}
-
-#if !defined(OS_IOS)
-
-// Reads a single message with a shared buffer handle, maps the buffer, copies
-// the message contents into it, then exits.
-DEFINE_TEST_CLIENT_TEST_WITH_PIPE(CopyToBufferClient, SharedBufferTest, h) {
-  MojoHandle b;
-  std::string message = ReadMessageWithHandles(h, &b, 1);
-  WriteToBuffer(b, 0, message);
-
-  EXPECT_EQ("quit", ReadMessage(h));
-}
-
-TEST_F(SharedBufferTest, PassSharedBufferCrossProcess) {
-  const std::string message = "hello";
-  MojoHandle b = CreateBuffer(message.size());
-
-  RUN_CHILD_ON_PIPE(CopyToBufferClient, h)
-    MojoHandle dupe = DuplicateBuffer(b, false);
-    WriteMessageWithHandles(h, message, &dupe, 1);
-    WriteMessage(h, "quit");
-  END_CHILD()
-
-  ExpectBufferContents(b, 0, message);
-}
-
-// Creates a new buffer, maps it, writes a message contents to it, unmaps it,
-// and finally passes it back to the parent.
-DEFINE_TEST_CLIENT_TEST_WITH_PIPE(CreateBufferClient, SharedBufferTest, h) {
-  std::string message = ReadMessage(h);
-  MojoHandle b = CreateBuffer(message.size());
-  WriteToBuffer(b, 0, message);
-  WriteMessageWithHandles(h, "have a buffer", &b, 1);
-
-  EXPECT_EQ("quit", ReadMessage(h));
-}
-
-TEST_F(SharedBufferTest, PassSharedBufferFromChild) {
-  const std::string message = "hello";
-  MojoHandle b;
-  RUN_CHILD_ON_PIPE(CreateBufferClient, h)
-    WriteMessage(h, message);
-    ReadMessageWithHandles(h, &b, 1);
-    WriteMessage(h, "quit");
-  END_CHILD()
-
-  ExpectBufferContents(b, 0, message);
-}
-
-DEFINE_TEST_CLIENT_TEST_WITH_PIPE(CreateAndPassBuffer, SharedBufferTest, h) {
-  // Receive a pipe handle over the primordial pipe. This will be connected to
-  // another child process.
-  MojoHandle other_child;
-  std::string message = ReadMessageWithHandles(h, &other_child, 1);
-
-  // Create a new shared buffer.
-  MojoHandle b = CreateBuffer(message.size());
-
-  // Send a copy of the buffer to the parent and the other child.
-  MojoHandle dupe = DuplicateBuffer(b, false);
-  WriteMessageWithHandles(h, "", &b, 1);
-  WriteMessageWithHandles(other_child, "", &dupe, 1);
-
-  EXPECT_EQ("quit", ReadMessage(h));
-}
-
-DEFINE_TEST_CLIENT_TEST_WITH_PIPE(ReceiveAndEditBuffer, SharedBufferTest, h) {
-  // Receive a pipe handle over the primordial pipe. This will be connected to
-  // another child process (running CreateAndPassBuffer).
-  MojoHandle other_child;
-  std::string message = ReadMessageWithHandles(h, &other_child, 1);
-
-  // Receive a shared buffer from the other child.
-  MojoHandle b;
-  ReadMessageWithHandles(other_child, &b, 1);
-
-  // Write the message from the parent into the buffer and exit.
-  WriteToBuffer(b, 0, message);
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(b));
-  EXPECT_EQ("quit", ReadMessage(h));
-}
-
-TEST_F(SharedBufferTest, PassSharedBufferFromChildToChild) {
-  const std::string message = "hello";
-  MojoHandle p0, p1;
-  CreateMessagePipe(&p0, &p1);
-
-  MojoHandle b;
-  RUN_CHILD_ON_PIPE(CreateAndPassBuffer, h0)
-    RUN_CHILD_ON_PIPE(ReceiveAndEditBuffer, h1)
-      // Send one end of the pipe to each child. The first child will create
-      // and pass a buffer to the second child and back to us. The second child
-      // will write our message into the buffer.
-      WriteMessageWithHandles(h0, message, &p0, 1);
-      WriteMessageWithHandles(h1, message, &p1, 1);
-
-      // Receive the buffer back from the first child.
-      ReadMessageWithHandles(h0, &b, 1);
-
-      WriteMessage(h1, "quit");
-    END_CHILD()
-    WriteMessage(h0, "quit");
-  END_CHILD()
-
-  // The second child should have written this message.
-  ExpectBufferContents(b, 0, message);
-}
-
-DEFINE_TEST_CLIENT_TEST_WITH_PIPE(CreateAndPassBufferParent, SharedBufferTest,
-                                  parent) {
-  RUN_CHILD_ON_PIPE(CreateAndPassBuffer, child)
-    // Read a pipe from the parent and forward it to our child.
-    MojoHandle pipe;
-    std::string message = ReadMessageWithHandles(parent, &pipe, 1);
-
-    WriteMessageWithHandles(child, message, &pipe, 1);
-
-    // Read a buffer handle from the child and pass it back to the parent.
-    MojoHandle buffer;
-    EXPECT_EQ("", ReadMessageWithHandles(child, &buffer, 1));
-    WriteMessageWithHandles(parent, "", &buffer, 1);
-
-    EXPECT_EQ("quit", ReadMessage(parent));
-    WriteMessage(child, "quit");
-  END_CHILD()
-}
-
-DEFINE_TEST_CLIENT_TEST_WITH_PIPE(ReceiveAndEditBufferParent, SharedBufferTest,
-                                  parent) {
-  RUN_CHILD_ON_PIPE(ReceiveAndEditBuffer, child)
-    // Read a pipe from the parent and forward it to our child.
-    MojoHandle pipe;
-    std::string message = ReadMessageWithHandles(parent, &pipe, 1);
-    WriteMessageWithHandles(child, message, &pipe, 1);
-
-    EXPECT_EQ("quit", ReadMessage(parent));
-    WriteMessage(child, "quit");
-  END_CHILD()
-}
-
-#if defined(OS_ANDROID) || defined(OS_MACOSX)
-// Android multi-process tests are not executing the new process. This is flaky.
-// Passing shared memory handles between cousins is not currently supported on
-// OSX.
-#define MAYBE_PassHandleBetweenCousins DISABLED_PassHandleBetweenCousins
-#else
-#define MAYBE_PassHandleBetweenCousins PassHandleBetweenCousins
-#endif
-TEST_F(SharedBufferTest, MAYBE_PassHandleBetweenCousins) {
-  const std::string message = "hello";
-  MojoHandle p0, p1;
-  CreateMessagePipe(&p0, &p1);
-
-  // Spawn two children who will each spawn their own child. Make sure the
-  // grandchildren (cousins to each other) can pass platform handles.
-  MojoHandle b;
-  RUN_CHILD_ON_PIPE(CreateAndPassBufferParent, child1)
-    RUN_CHILD_ON_PIPE(ReceiveAndEditBufferParent, child2)
-      MojoHandle pipe[2];
-      CreateMessagePipe(&pipe[0], &pipe[1]);
-
-      WriteMessageWithHandles(child1, message, &pipe[0], 1);
-      WriteMessageWithHandles(child2, message, &pipe[1], 1);
-
-      // Receive the buffer back from the first child.
-      ReadMessageWithHandles(child1, &b, 1);
-
-      WriteMessage(child2, "quit");
-    END_CHILD()
-    WriteMessage(child1, "quit");
-  END_CHILD()
-
-  // The second grandchild should have written this message.
-  ExpectBufferContents(b, 0, message);
-}
-
-DEFINE_TEST_CLIENT_TEST_WITH_PIPE(ReadAndMapWriteSharedBuffer,
-                                  SharedBufferTest, h) {
-  // Receive the shared buffer.
-  MojoHandle b;
-  EXPECT_EQ("hello", ReadMessageWithHandles(h, &b, 1));
-
-  // Read from the bufer.
-  ExpectBufferContents(b, 0, "hello");
-
-  // Extract the shared memory handle and try to map it writable.
-  base::SharedMemoryHandle shm_handle;
-  bool read_only = false;
-  ASSERT_EQ(MOJO_RESULT_OK,
-            PassSharedMemoryHandle(b, &shm_handle, nullptr, &read_only));
-  base::SharedMemory shared_memory(shm_handle, false);
-  EXPECT_TRUE(read_only);
-  EXPECT_FALSE(shared_memory.Map(1234));
-
-  EXPECT_EQ("quit", ReadMessage(h));
-  WriteMessage(h, "ok");
-}
-
-#if defined(OS_ANDROID)
-// Android multi-process tests are not executing the new process. This is flaky.
-#define MAYBE_CreateAndPassReadOnlyBuffer DISABLED_CreateAndPassReadOnlyBuffer
-#else
-#define MAYBE_CreateAndPassReadOnlyBuffer CreateAndPassReadOnlyBuffer
-#endif
-TEST_F(SharedBufferTest, MAYBE_CreateAndPassReadOnlyBuffer) {
-  RUN_CHILD_ON_PIPE(ReadAndMapWriteSharedBuffer, h)
-    // Create a new shared buffer.
-    MojoHandle b = CreateBuffer(1234);
-    WriteToBuffer(b, 0, "hello");
-
-    // Send a read-only copy of the buffer to the child.
-    MojoHandle dupe = DuplicateBuffer(b, true /* read_only */);
-    WriteMessageWithHandles(h, "hello", &dupe, 1);
-
-    WriteMessage(h, "quit");
-    EXPECT_EQ("ok", ReadMessage(h));
-  END_CHILD()
-}
-
-DEFINE_TEST_CLIENT_TEST_WITH_PIPE(CreateAndPassReadOnlyBuffer,
-                                  SharedBufferTest, h) {
-  // Create a new shared buffer.
-  MojoHandle b = CreateBuffer(1234);
-  WriteToBuffer(b, 0, "hello");
-
-  // Send a read-only copy of the buffer to the parent.
-  MojoHandle dupe = DuplicateBuffer(b, true /* read_only */);
-  WriteMessageWithHandles(h, "", &dupe, 1);
-
-  EXPECT_EQ("quit", ReadMessage(h));
-  WriteMessage(h, "ok");
-}
-
-#if defined(OS_ANDROID)
-// Android multi-process tests are not executing the new process. This is flaky.
-#define MAYBE_CreateAndPassFromChildReadOnlyBuffer \
-    DISABLED_CreateAndPassFromChildReadOnlyBuffer
-#else
-#define MAYBE_CreateAndPassFromChildReadOnlyBuffer \
-    CreateAndPassFromChildReadOnlyBuffer
-#endif
-TEST_F(SharedBufferTest, MAYBE_CreateAndPassFromChildReadOnlyBuffer) {
-  RUN_CHILD_ON_PIPE(CreateAndPassReadOnlyBuffer, h)
-    MojoHandle b;
-    EXPECT_EQ("", ReadMessageWithHandles(h, &b, 1));
-    ExpectBufferContents(b, 0, "hello");
-
-    // Extract the shared memory handle and try to map it writable.
-    base::SharedMemoryHandle shm_handle;
-    bool read_only = false;
-    ASSERT_EQ(MOJO_RESULT_OK,
-              PassSharedMemoryHandle(b, &shm_handle, nullptr, &read_only));
-    base::SharedMemory shared_memory(shm_handle, false);
-    EXPECT_TRUE(read_only);
-    EXPECT_FALSE(shared_memory.Map(1234));
-
-    WriteMessage(h, "quit");
-    EXPECT_EQ("ok", ReadMessage(h));
-  END_CHILD()
-}
-
-#endif  // !defined(OS_IOS)
-
-}  // namespace
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/signals_unittest.cc b/mojo/edk/system/signals_unittest.cc
deleted file mode 100644
index e8b0cd1..0000000
--- a/mojo/edk/system/signals_unittest.cc
+++ /dev/null
@@ -1,76 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/test/mojo_test_base.h"
-#include "mojo/public/c/system/buffer.h"
-#include "mojo/public/c/system/data_pipe.h"
-#include "mojo/public/c/system/functions.h"
-#include "mojo/public/c/system/message_pipe.h"
-#include "mojo/public/c/system/types.h"
-
-namespace mojo {
-namespace edk {
-namespace {
-
-using SignalsTest = test::MojoTestBase;
-
-TEST_F(SignalsTest, QueryInvalidArguments) {
-  MojoHandleSignalsState state = {0, 0};
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            MojoQueryHandleSignalsState(MOJO_HANDLE_INVALID, &state));
-
-  MojoHandle a, b;
-  CreateMessagePipe(&a, &b);
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            MojoQueryHandleSignalsState(a, nullptr));
-}
-
-TEST_F(SignalsTest, QueryMessagePipeSignals) {
-  MojoHandleSignalsState state = {0, 0};
-
-  MojoHandle a, b;
-  CreateMessagePipe(&a, &b);
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoQueryHandleSignalsState(a, &state));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, state.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
-                MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-            state.satisfiable_signals);
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoQueryHandleSignalsState(b, &state));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, state.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
-                MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-            state.satisfiable_signals);
-
-  WriteMessage(a, "ok");
-  EXPECT_EQ(MOJO_RESULT_OK, WaitForSignals(b, MOJO_HANDLE_SIGNAL_READABLE));
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoQueryHandleSignalsState(b, &state));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
-            state.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
-                MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-            state.satisfiable_signals);
-
-  EXPECT_EQ("ok", ReadMessage(b));
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoQueryHandleSignalsState(b, &state));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, state.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
-                MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-            state.satisfiable_signals);
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(a));
-
-  EXPECT_EQ(MOJO_RESULT_OK, WaitForSignals(b, MOJO_HANDLE_SIGNAL_PEER_CLOSED));
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoQueryHandleSignalsState(b, &state));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, state.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, state.satisfiable_signals);
-}
-
-}  // namespace
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/system_impl_export.h b/mojo/edk/system/system_impl_export.h
deleted file mode 100644
index 5bbf005..0000000
--- a/mojo/edk/system/system_impl_export.h
+++ /dev/null
@@ -1,29 +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 MOJO_EDK_SYSTEM_SYSTEM_IMPL_EXPORT_H_
-#define MOJO_EDK_SYSTEM_SYSTEM_IMPL_EXPORT_H_
-
-#if defined(COMPONENT_BUILD)
-#if defined(WIN32)
-
-#if defined(MOJO_SYSTEM_IMPL_IMPLEMENTATION)
-#define MOJO_SYSTEM_IMPL_EXPORT __declspec(dllexport)
-#else
-#define MOJO_SYSTEM_IMPL_EXPORT __declspec(dllimport)
-#endif  // defined(MOJO_SYSTEM_IMPL_IMPLEMENTATION)
-
-#else  // defined(WIN32)
-#if defined(MOJO_SYSTEM_IMPL_IMPLEMENTATION)
-#define MOJO_SYSTEM_IMPL_EXPORT __attribute__((visibility("default")))
-#else
-#define MOJO_SYSTEM_IMPL_EXPORT
-#endif
-#endif
-
-#else  // defined(COMPONENT_BUILD)
-#define MOJO_SYSTEM_IMPL_EXPORT
-#endif
-
-#endif  // MOJO_EDK_SYSTEM_SYSTEM_IMPL_EXPORT_H_
diff --git a/mojo/edk/system/test_utils.cc b/mojo/edk/system/test_utils.cc
deleted file mode 100644
index 4a39cf7..0000000
--- a/mojo/edk/system/test_utils.cc
+++ /dev/null
@@ -1,76 +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 "mojo/edk/system/test_utils.h"
-
-#include <stdint.h>
-
-#include <limits>
-
-#include "base/logging.h"
-#include "base/test/test_timeouts.h"
-#include "base/threading/platform_thread.h"  // For |Sleep()|.
-#include "build/build_config.h"
-
-namespace mojo {
-namespace edk {
-namespace test {
-
-MojoDeadline DeadlineFromMilliseconds(unsigned milliseconds) {
-  return static_cast<MojoDeadline>(milliseconds) * 1000;
-}
-
-MojoDeadline EpsilonDeadline() {
-// Originally, our epsilon timeout was 10 ms, which was mostly fine but flaky on
-// some Windows bots. I don't recall ever seeing flakes on other bots. At 30 ms
-// tests seem reliable on Windows bots, but not at 25 ms. We'd like this timeout
-// to be as small as possible (see the description in the .h file).
-//
-// Currently, |tiny_timeout()| is usually 100 ms (possibly scaled under ASAN,
-// etc.). Based on this, set it to (usually be) 30 ms on Windows and 20 ms
-// elsewhere.
-#if defined(OS_WIN) || defined(OS_ANDROID)
-  return (TinyDeadline() * 3) / 10;
-#else
-  return (TinyDeadline() * 2) / 10;
-#endif
-}
-
-MojoDeadline TinyDeadline() {
-  return static_cast<MojoDeadline>(
-      TestTimeouts::tiny_timeout().InMicroseconds());
-}
-
-MojoDeadline ActionDeadline() {
-  return static_cast<MojoDeadline>(
-      TestTimeouts::action_timeout().InMicroseconds());
-}
-
-void Sleep(MojoDeadline deadline) {
-  CHECK_LE(deadline,
-           static_cast<MojoDeadline>(std::numeric_limits<int64_t>::max()));
-  base::PlatformThread::Sleep(
-      base::TimeDelta::FromMicroseconds(static_cast<int64_t>(deadline)));
-}
-
-Stopwatch::Stopwatch() {
-}
-
-Stopwatch::~Stopwatch() {
-}
-
-void Stopwatch::Start() {
-  start_time_ = base::TimeTicks::Now();
-}
-
-MojoDeadline Stopwatch::Elapsed() {
-  int64_t result = (base::TimeTicks::Now() - start_time_).InMicroseconds();
-  // |DCHECK_GE|, not |CHECK_GE|, since this may be performance-important.
-  DCHECK_GE(result, 0);
-  return static_cast<MojoDeadline>(result);
-}
-
-}  // namespace test
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/test_utils.h b/mojo/edk/system/test_utils.h
deleted file mode 100644
index 1c90dc1..0000000
--- a/mojo/edk/system/test_utils.h
+++ /dev/null
@@ -1,59 +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 MOJO_EDK_SYSTEM_TEST_UTILS_H_
-#define MOJO_EDK_SYSTEM_TEST_UTILS_H_
-
-#include "base/macros.h"
-#include "base/time/time.h"
-#include "mojo/public/c/system/types.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace edk {
-namespace test {
-
-MojoDeadline DeadlineFromMilliseconds(unsigned milliseconds);
-
-// A timeout smaller than |TestTimeouts::tiny_timeout()|, as a |MojoDeadline|.
-// Warning: This may lead to flakiness, but this is unavoidable if, e.g., you're
-// trying to ensure that functions with timeouts are reasonably accurate. We
-// want this to be as small as possible without causing too much flakiness.
-MojoDeadline EpsilonDeadline();
-
-// |TestTimeouts::tiny_timeout()|, as a |MojoDeadline|. (Expect this to be on
-// the order of 100 ms.)
-MojoDeadline TinyDeadline();
-
-// |TestTimeouts::action_timeout()|, as a |MojoDeadline|. (Expect this to be on
-// the order of 10 s.)
-MojoDeadline ActionDeadline();
-
-// Sleeps for at least the specified duration.
-void Sleep(MojoDeadline deadline);
-
-// Stopwatch -------------------------------------------------------------------
-
-// A simple "stopwatch" for measuring time elapsed from a given starting point.
-class Stopwatch {
- public:
-  Stopwatch();
-  ~Stopwatch();
-
-  void Start();
-  // Returns the amount of time elapsed since the last call to |Start()| (in
-  // microseconds).
-  MojoDeadline Elapsed();
-
- private:
-  base::TimeTicks start_time_;
-
-  DISALLOW_COPY_AND_ASSIGN(Stopwatch);
-};
-
-}  // namespace test
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_TEST_UTILS_H_
diff --git a/mojo/edk/system/watch.cc b/mojo/edk/system/watch.cc
deleted file mode 100644
index cf08ac3..0000000
--- a/mojo/edk/system/watch.cc
+++ /dev/null
@@ -1,83 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/system/watch.h"
-
-#include "mojo/edk/system/request_context.h"
-#include "mojo/edk/system/watcher_dispatcher.h"
-
-namespace mojo {
-namespace edk {
-
-Watch::Watch(const scoped_refptr<WatcherDispatcher>& watcher,
-             const scoped_refptr<Dispatcher>& dispatcher,
-             uintptr_t context,
-             MojoHandleSignals signals)
-    : watcher_(watcher),
-      dispatcher_(dispatcher),
-      context_(context),
-      signals_(signals) {}
-
-bool Watch::NotifyState(const HandleSignalsState& state,
-                        bool allowed_to_call_callback) {
-  AssertWatcherLockAcquired();
-
-  // NOTE: This method must NEVER call into |dispatcher_| directly, because it
-  // may be called while |dispatcher_| holds a lock.
-
-  MojoResult rv = MOJO_RESULT_SHOULD_WAIT;
-  RequestContext* const request_context = RequestContext::current();
-  if (state.satisfies(signals_)) {
-    rv = MOJO_RESULT_OK;
-    if (allowed_to_call_callback && rv != last_known_result_) {
-      request_context->AddWatchNotifyFinalizer(this, MOJO_RESULT_OK, state);
-    }
-  } else if (!state.can_satisfy(signals_)) {
-    rv = MOJO_RESULT_FAILED_PRECONDITION;
-    if (allowed_to_call_callback && rv != last_known_result_) {
-      request_context->AddWatchNotifyFinalizer(
-          this, MOJO_RESULT_FAILED_PRECONDITION, state);
-    }
-  }
-
-  last_known_signals_state_ =
-      *static_cast<const MojoHandleSignalsState*>(&state);
-  last_known_result_ = rv;
-  return ready();
-}
-
-void Watch::Cancel() {
-  RequestContext::current()->AddWatchCancelFinalizer(this);
-}
-
-void Watch::InvokeCallback(MojoResult result,
-                           const HandleSignalsState& state,
-                           MojoWatcherNotificationFlags flags) {
-  // We hold the lock through invocation to ensure that only one notification
-  // callback runs for this context at any given time.
-  base::AutoLock lock(notification_lock_);
-  if (result == MOJO_RESULT_CANCELLED) {
-    // Make sure cancellation is the last notification we dispatch.
-    DCHECK(!is_cancelled_);
-    is_cancelled_ = true;
-  } else if (is_cancelled_) {
-    return;
-  }
-
-  // NOTE: This will acquire |watcher_|'s internal lock. It's safe because a
-  // thread can only enter InvokeCallback() from within a RequestContext
-  // destructor where no dispatcher locks are held.
-  watcher_->InvokeWatchCallback(context_, result, state, flags);
-}
-
-Watch::~Watch() {}
-
-#if DCHECK_IS_ON()
-void Watch::AssertWatcherLockAcquired() const {
-  watcher_->lock_.AssertAcquired();
-}
-#endif
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/watch.h b/mojo/edk/system/watch.h
deleted file mode 100644
index f277de9..0000000
--- a/mojo/edk/system/watch.h
+++ /dev/null
@@ -1,124 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_SYSTEM_WATCH_H_
-#define MOJO_EDK_SYSTEM_WATCH_H_
-
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/synchronization/lock.h"
-#include "mojo/edk/system/atomic_flag.h"
-#include "mojo/edk/system/handle_signals_state.h"
-
-namespace mojo {
-namespace edk {
-
-class Dispatcher;
-class WatcherDispatcher;
-
-// Encapsulates the state associated with a single watch context within a
-// watcher.
-//
-// Every Watch has its own cancellation state, and is captured by RequestContext
-// notification finalizers to avoid redundant context resolution during
-// finalizer execution.
-class Watch : public base::RefCountedThreadSafe<Watch> {
- public:
-  // Constructs a Watch which represents a watch within |watcher| associated
-  // with |context|, watching |dispatcher| for |signals|.
-  Watch(const scoped_refptr<WatcherDispatcher>& watcher,
-        const scoped_refptr<Dispatcher>& dispatcher,
-        uintptr_t context,
-        MojoHandleSignals signals);
-
-  // Notifies the Watch of a potential state change.
-  //
-  // If |allowed_to_call_callback| is true, this may add a notification
-  // finalizer to the current RequestContext to invoke the watcher's callback
-  // with this watch's context. See return values below.
-  //
-  // This is called directly by WatcherDispatcher whenever the Watch's observed
-  // dispatcher notifies the WatcherDispatcher of a state change.
-  //
-  // Returns |true| if the Watch entered or remains in a ready state as a result
-  // of the state change. If |allowed_to_call_callback| was true in this case,
-  // the Watch will have also attached a notification finalizer to the current
-  // RequestContext.
-  //
-  // Returns |false| if the
-  bool NotifyState(const HandleSignalsState& state,
-                   bool allowed_to_call_callback);
-
-  // Notifies the watch of cancellation ASAP. This will always be the last
-  // notification sent for the watch.
-  void Cancel();
-
-  // Finalizer method for RequestContexts. This method is invoked once for every
-  // notification finalizer added to a RequestContext by this object. This calls
-  // down into the WatcherDispatcher to do the actual notification call.
-  void InvokeCallback(MojoResult result,
-                      const HandleSignalsState& state,
-                      MojoWatcherNotificationFlags flags);
-
-  const scoped_refptr<Dispatcher>& dispatcher() const { return dispatcher_; }
-  uintptr_t context() const { return context_; }
-
-  MojoResult last_known_result() const {
-    AssertWatcherLockAcquired();
-    return last_known_result_;
-  }
-
-  MojoHandleSignalsState last_known_signals_state() const {
-    AssertWatcherLockAcquired();
-    return last_known_signals_state_;
-  }
-
-  bool ready() const {
-    AssertWatcherLockAcquired();
-    return last_known_result_ == MOJO_RESULT_OK ||
-           last_known_result_ == MOJO_RESULT_FAILED_PRECONDITION;
-  }
-
- private:
-  friend class base::RefCountedThreadSafe<Watch>;
-
-  ~Watch();
-
-#if DCHECK_IS_ON()
-  void AssertWatcherLockAcquired() const;
-#else
-  void AssertWatcherLockAcquired() const {}
-#endif
-
-  const scoped_refptr<WatcherDispatcher> watcher_;
-  const scoped_refptr<Dispatcher> dispatcher_;
-  const uintptr_t context_;
-  const MojoHandleSignals signals_;
-
-  // The result code with which this Watch would notify if currently armed,
-  // based on the last known signaling state of |dispatcher_|. Guarded by the
-  // owning WatcherDispatcher's lock.
-  MojoResult last_known_result_ = MOJO_RESULT_UNKNOWN;
-
-  // The last known signaling state of |dispatcher_|. Guarded by the owning
-  // WatcherDispatcher's lock.
-  MojoHandleSignalsState last_known_signals_state_ = {0, 0};
-
-  // Guards |is_cancelled_| below and mutually excludes individual watch
-  // notification executions for this same watch context.
-  //
-  // Note that this should only be acquired from a RequestContext finalizer to
-  // ensure that no other internal locks are already held.
-  base::Lock notification_lock_;
-
-  // Guarded by |notification_lock_|.
-  bool is_cancelled_ = false;
-
-  DISALLOW_COPY_AND_ASSIGN(Watch);
-};
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_WATCH_H_
diff --git a/mojo/edk/system/watcher_dispatcher.cc b/mojo/edk/system/watcher_dispatcher.cc
deleted file mode 100644
index 409dd2a..0000000
--- a/mojo/edk/system/watcher_dispatcher.cc
+++ /dev/null
@@ -1,232 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/system/watcher_dispatcher.h"
-
-#include <algorithm>
-#include <limits>
-#include <map>
-
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "mojo/edk/system/watch.h"
-
-namespace mojo {
-namespace edk {
-
-WatcherDispatcher::WatcherDispatcher(MojoWatcherCallback callback)
-    : callback_(callback) {}
-
-void WatcherDispatcher::NotifyHandleState(Dispatcher* dispatcher,
-                                          const HandleSignalsState& state) {
-  base::AutoLock lock(lock_);
-  auto it = watched_handles_.find(dispatcher);
-  if (it == watched_handles_.end())
-    return;
-
-  // Maybe fire a notification to the watch assoicated with this dispatcher,
-  // provided we're armed it cares about the new state.
-  if (it->second->NotifyState(state, armed_)) {
-    ready_watches_.insert(it->second.get());
-
-    // If we were armed and got here, we notified the watch. Disarm.
-    armed_ = false;
-  } else {
-    ready_watches_.erase(it->second.get());
-  }
-}
-
-void WatcherDispatcher::NotifyHandleClosed(Dispatcher* dispatcher) {
-  scoped_refptr<Watch> watch;
-  {
-    base::AutoLock lock(lock_);
-    auto it = watched_handles_.find(dispatcher);
-    if (it == watched_handles_.end())
-      return;
-
-    watch = std::move(it->second);
-
-    // Wipe out all state associated with the closed dispatcher.
-    watches_.erase(watch->context());
-    ready_watches_.erase(watch.get());
-    watched_handles_.erase(it);
-  }
-
-  // NOTE: It's important that this is called outside of |lock_| since it
-  // acquires internal Watch locks.
-  watch->Cancel();
-}
-
-void WatcherDispatcher::InvokeWatchCallback(
-    uintptr_t context,
-    MojoResult result,
-    const HandleSignalsState& state,
-    MojoWatcherNotificationFlags flags) {
-  {
-    // We avoid holding the lock during dispatch. It's OK for notification
-    // callbacks to close this watcher, and it's OK for notifications to race
-    // with closure, if for example the watcher is closed from another thread
-    // between this test and the invocation of |callback_| below.
-    //
-    // Because cancellation synchronously blocks all future notifications, and
-    // because notifications themselves are mutually exclusive for any given
-    // context, we still guarantee that a single MOJO_RESULT_CANCELLED result
-    // is the last notification received for any given context.
-    //
-    // This guarantee is sufficient to make safe, synchronized, per-context
-    // state management possible in user code.
-    base::AutoLock lock(lock_);
-    if (closed_ && result != MOJO_RESULT_CANCELLED)
-      return;
-  }
-
-  callback_(context, result, static_cast<MojoHandleSignalsState>(state), flags);
-}
-
-Dispatcher::Type WatcherDispatcher::GetType() const {
-  return Type::WATCHER;
-}
-
-MojoResult WatcherDispatcher::Close() {
-  // We swap out all the watched handle information onto the stack so we can
-  // call into their dispatchers without our own lock held.
-  std::map<uintptr_t, scoped_refptr<Watch>> watches;
-  {
-    base::AutoLock lock(lock_);
-    DCHECK(!closed_);
-    closed_ = true;
-    std::swap(watches, watches_);
-    watched_handles_.clear();
-  }
-
-  // Remove all refs from our watched dispatchers and fire cancellations.
-  for (auto& entry : watches) {
-    entry.second->dispatcher()->RemoveWatcherRef(this, entry.first);
-    entry.second->Cancel();
-  }
-
-  return MOJO_RESULT_OK;
-}
-
-MojoResult WatcherDispatcher::WatchDispatcher(
-    scoped_refptr<Dispatcher> dispatcher,
-    MojoHandleSignals signals,
-    uintptr_t context) {
-  // NOTE: Because it's critical to avoid acquiring any other dispatcher locks
-  // while |lock_| is held, we defer adding oursevles to the dispatcher until
-  // after we've updated all our own relevant state and released |lock_|.
-  {
-    base::AutoLock lock(lock_);
-    if (watches_.count(context) || watched_handles_.count(dispatcher.get()))
-      return MOJO_RESULT_ALREADY_EXISTS;
-
-    scoped_refptr<Watch> watch = new Watch(this, dispatcher, context, signals);
-    watches_.insert({context, watch});
-    auto result =
-        watched_handles_.insert(std::make_pair(dispatcher.get(), watch));
-    DCHECK(result.second);
-  }
-
-  MojoResult rv = dispatcher->AddWatcherRef(this, context);
-  if (rv != MOJO_RESULT_OK) {
-    // Oops. This was not a valid handle to watch. Undo the above work and
-    // fail gracefully.
-    base::AutoLock lock(lock_);
-    watches_.erase(context);
-    watched_handles_.erase(dispatcher.get());
-    return rv;
-  }
-
-  return MOJO_RESULT_OK;
-}
-
-MojoResult WatcherDispatcher::CancelWatch(uintptr_t context) {
-  // We may remove the last stored ref to the Watch below, so we retain
-  // a reference on the stack.
-  scoped_refptr<Watch> watch;
-  {
-    base::AutoLock lock(lock_);
-    auto it = watches_.find(context);
-    if (it == watches_.end())
-      return MOJO_RESULT_NOT_FOUND;
-    watch = it->second;
-    watches_.erase(it);
-  }
-
-  // Mark the watch as cancelled so no further notifications get through.
-  watch->Cancel();
-
-  // We remove the watcher ref for this context before updating any more
-  // internal watcher state, ensuring that we don't receiving further
-  // notifications for this context.
-  watch->dispatcher()->RemoveWatcherRef(this, context);
-
-  {
-    base::AutoLock lock(lock_);
-    auto handle_it = watched_handles_.find(watch->dispatcher().get());
-    DCHECK(handle_it != watched_handles_.end());
-    ready_watches_.erase(handle_it->second.get());
-    watched_handles_.erase(handle_it);
-  }
-
-  return MOJO_RESULT_OK;
-}
-
-MojoResult WatcherDispatcher::Arm(
-    uint32_t* num_ready_contexts,
-    uintptr_t* ready_contexts,
-    MojoResult* ready_results,
-    MojoHandleSignalsState* ready_signals_states) {
-  base::AutoLock lock(lock_);
-  if (num_ready_contexts &&
-      (!ready_contexts || !ready_results || !ready_signals_states)) {
-    return MOJO_RESULT_INVALID_ARGUMENT;
-  }
-
-  if (watched_handles_.empty())
-    return MOJO_RESULT_NOT_FOUND;
-
-  if (ready_watches_.empty()) {
-    // Fast path: No watches are ready to notify, so we're done.
-    armed_ = true;
-    return MOJO_RESULT_OK;
-  }
-
-  if (num_ready_contexts) {
-    DCHECK_LE(ready_watches_.size(), std::numeric_limits<uint32_t>::max());
-    *num_ready_contexts = std::min(
-        *num_ready_contexts, static_cast<uint32_t>(ready_watches_.size()));
-
-    WatchSet::const_iterator next_ready_iter = ready_watches_.begin();
-    if (last_watch_to_block_arming_) {
-      // Find the next watch to notify in simple round-robin order on the
-      // |ready_watches_| map, wrapping around to the beginning if necessary.
-      next_ready_iter = ready_watches_.find(last_watch_to_block_arming_);
-      if (next_ready_iter != ready_watches_.end())
-        ++next_ready_iter;
-      if (next_ready_iter == ready_watches_.end())
-        next_ready_iter = ready_watches_.begin();
-    }
-
-    for (size_t i = 0; i < *num_ready_contexts; ++i) {
-      const Watch* const watch = *next_ready_iter;
-      ready_contexts[i] = watch->context();
-      ready_results[i] = watch->last_known_result();
-      ready_signals_states[i] = watch->last_known_signals_state();
-
-      // Iterate and wrap around.
-      last_watch_to_block_arming_ = watch;
-      ++next_ready_iter;
-      if (next_ready_iter == ready_watches_.end())
-        next_ready_iter = ready_watches_.begin();
-    }
-  }
-
-  return MOJO_RESULT_FAILED_PRECONDITION;
-}
-
-WatcherDispatcher::~WatcherDispatcher() {}
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/watcher_dispatcher.h b/mojo/edk/system/watcher_dispatcher.h
deleted file mode 100644
index 605a315..0000000
--- a/mojo/edk/system/watcher_dispatcher.h
+++ /dev/null
@@ -1,101 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_SYSTEM_WATCHER_DISPATCHER_H_
-#define MOJO_EDK_SYSTEM_WATCHER_DISPATCHER_H_
-
-#include <map>
-#include <set>
-
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/synchronization/lock.h"
-#include "mojo/edk/system/dispatcher.h"
-#include "mojo/edk/system/handle_signals_state.h"
-#include "mojo/edk/system/system_impl_export.h"
-#include "mojo/public/c/system/watcher.h"
-
-namespace mojo {
-namespace edk {
-
-class Watch;
-
-// The dispatcher type which backs watcher handles.
-class WatcherDispatcher : public Dispatcher {
- public:
-  // Constructs a new WatcherDispatcher which invokes |callback| when a
-  // registered watch observes some relevant state change.
-  explicit WatcherDispatcher(MojoWatcherCallback callback);
-
-  // Methods used by watched dispatchers to notify watchers of events.
-  void NotifyHandleState(Dispatcher* dispatcher,
-                         const HandleSignalsState& state);
-  void NotifyHandleClosed(Dispatcher* dispatcher);
-
-  // Method used by RequestContext (indirectly, via Watch) to complete
-  // notification operations from a safe stack frame to avoid reentrancy.
-  void InvokeWatchCallback(uintptr_t context,
-                           MojoResult result,
-                           const HandleSignalsState& state,
-                           MojoWatcherNotificationFlags flags);
-
-  // Dispatcher:
-  Type GetType() const override;
-  MojoResult Close() override;
-  MojoResult WatchDispatcher(scoped_refptr<Dispatcher> dispatcher,
-                             MojoHandleSignals signals,
-                             uintptr_t context) override;
-  MojoResult CancelWatch(uintptr_t context) override;
-  MojoResult Arm(uint32_t* num_ready_contexts,
-                 uintptr_t* ready_contexts,
-                 MojoResult* ready_results,
-                 MojoHandleSignalsState* ready_signals_states) override;
-
- private:
-  friend class Watch;
-
-  using WatchSet = std::set<const Watch*>;
-
-  ~WatcherDispatcher() override;
-
-  const MojoWatcherCallback callback_;
-
-  // Guards access to the fields below.
-  //
-  // NOTE: This may be acquired while holding another dispatcher's lock, as
-  // watched dispatchers call into WatcherDispatcher methods which lock this
-  // when issuing state change notifications. WatcherDispatcher must therefore
-  // take caution to NEVER acquire other dispatcher locks while this is held.
-  base::Lock lock_;
-
-  bool armed_ = false;
-  bool closed_ = false;
-
-  // A mapping from context to Watch.
-  std::map<uintptr_t, scoped_refptr<Watch>> watches_;
-
-  // A mapping from watched dispatcher to Watch.
-  std::map<Dispatcher*, scoped_refptr<Watch>> watched_handles_;
-
-  // The set of all Watch instances which are currently ready to signal. This is
-  // used for efficient arming behavior, as it allows for O(1) discovery of
-  // whether or not arming can succeed and quick determination of who's
-  // responsible if it can't.
-  WatchSet ready_watches_;
-
-  // Tracks the last Watch whose state was returned by Arm(). This is used to
-  // ensure consistent round-robin behavior in the event that multiple Watches
-  // remain ready over the span of several Arm() attempts.
-  //
-  // NOTE: This pointer is only used to index |ready_watches_| and may point to
-  // an invalid object. It must therefore never be dereferenced.
-  const Watch* last_watch_to_block_arming_ = nullptr;
-
-  DISALLOW_COPY_AND_ASSIGN(WatcherDispatcher);
-};
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_WATCHER_DISPATCHER_H_
diff --git a/mojo/edk/system/watcher_set.cc b/mojo/edk/system/watcher_set.cc
deleted file mode 100644
index 0355b58..0000000
--- a/mojo/edk/system/watcher_set.cc
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/system/watcher_set.h"
-
-#include <utility>
-
-namespace mojo {
-namespace edk {
-
-WatcherSet::WatcherSet(Dispatcher* owner) : owner_(owner) {}
-
-WatcherSet::~WatcherSet() = default;
-
-void WatcherSet::NotifyState(const HandleSignalsState& state) {
-  // Avoid notifying watchers if they have already seen this state.
-  if (last_known_state_.has_value() && state.equals(last_known_state_.value()))
-    return;
-  last_known_state_ = state;
-  for (const auto& entry : watchers_)
-    entry.first->NotifyHandleState(owner_, state);
-}
-
-void WatcherSet::NotifyClosed() {
-  for (const auto& entry : watchers_)
-    entry.first->NotifyHandleClosed(owner_);
-}
-
-MojoResult WatcherSet::Add(const scoped_refptr<WatcherDispatcher>& watcher,
-                           uintptr_t context,
-                           const HandleSignalsState& current_state) {
-  auto it = watchers_.find(watcher.get());
-  if (it == watchers_.end()) {
-    auto result =
-        watchers_.insert(std::make_pair(watcher.get(), Entry{watcher}));
-    it = result.first;
-  }
-
-  if (!it->second.contexts.insert(context).second)
-    return MOJO_RESULT_ALREADY_EXISTS;
-
-  if (last_known_state_.has_value() &&
-      !current_state.equals(last_known_state_.value())) {
-    // This new state may be relevant to everyone, in which case we just
-    // notify everyone.
-    NotifyState(current_state);
-  } else {
-    // Otherwise only notify the newly added Watcher.
-    watcher->NotifyHandleState(owner_, current_state);
-  }
-  return MOJO_RESULT_OK;
-}
-
-MojoResult WatcherSet::Remove(WatcherDispatcher* watcher, uintptr_t context) {
-  auto it = watchers_.find(watcher);
-  if (it == watchers_.end())
-    return MOJO_RESULT_NOT_FOUND;
-
-  ContextSet& contexts = it->second.contexts;
-  auto context_it = contexts.find(context);
-  if (context_it == contexts.end())
-    return MOJO_RESULT_NOT_FOUND;
-
-  contexts.erase(context_it);
-  if (contexts.empty())
-    watchers_.erase(it);
-
-  return MOJO_RESULT_OK;
-}
-
-WatcherSet::Entry::Entry(const scoped_refptr<WatcherDispatcher>& dispatcher)
-    : dispatcher(dispatcher) {}
-
-WatcherSet::Entry::Entry(Entry&& other) = default;
-
-WatcherSet::Entry::~Entry() = default;
-
-WatcherSet::Entry& WatcherSet::Entry::operator=(Entry&& other) = default;
-
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/system/watcher_set.h b/mojo/edk/system/watcher_set.h
deleted file mode 100644
index 2b7ef2c..0000000
--- a/mojo/edk/system/watcher_set.h
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_SYSTEM_WATCHER_SET_H_
-#define MOJO_EDK_SYSTEM_WATCHER_SET_H_
-
-#include <map>
-
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/optional.h"
-#include "mojo/edk/system/handle_signals_state.h"
-#include "mojo/edk/system/watcher_dispatcher.h"
-
-namespace mojo {
-namespace edk {
-
-// A WatcherSet maintains a set of references to WatcherDispatchers to be
-// notified when a handle changes state.
-//
-// Dispatchers which may be watched by a watcher should own a WatcherSet and
-// notify it of all relevant state changes.
-class WatcherSet {
- public:
-  // |owner| is the Dispatcher who owns this WatcherSet.
-  explicit WatcherSet(Dispatcher* owner);
-  ~WatcherSet();
-
-  // Notifies all watchers of the handle's current signals state.
-  void NotifyState(const HandleSignalsState& state);
-
-  // Notifies all watchers that this handle has been closed.
-  void NotifyClosed();
-
-  // Adds a new watcher+context.
-  MojoResult Add(const scoped_refptr<WatcherDispatcher>& watcher,
-                 uintptr_t context,
-                 const HandleSignalsState& current_state);
-
-  // Removes a watcher+context.
-  MojoResult Remove(WatcherDispatcher* watcher, uintptr_t context);
-
- private:
-  using ContextSet = std::set<uintptr_t>;
-
-  struct Entry {
-    Entry(const scoped_refptr<WatcherDispatcher>& dispatcher);
-    Entry(Entry&& other);
-    ~Entry();
-
-    Entry& operator=(Entry&& other);
-
-    scoped_refptr<WatcherDispatcher> dispatcher;
-    ContextSet contexts;
-
-   private:
-    DISALLOW_COPY_AND_ASSIGN(Entry);
-  };
-
-  Dispatcher* const owner_;
-  std::map<WatcherDispatcher*, Entry> watchers_;
-  base::Optional<HandleSignalsState> last_known_state_;
-
-  DISALLOW_COPY_AND_ASSIGN(WatcherSet);
-};
-
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_SYSTEM_WATCHER_SET_H_
diff --git a/mojo/edk/system/watcher_unittest.cc b/mojo/edk/system/watcher_unittest.cc
deleted file mode 100644
index dd396cd..0000000
--- a/mojo/edk/system/watcher_unittest.cc
+++ /dev/null
@@ -1,1637 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <stdint.h>
-
-#include <map>
-#include <memory>
-#include <set>
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/threading/platform_thread.h"
-#include "base/threading/simple_thread.h"
-#include "base/time/time.h"
-#include "mojo/edk/test/mojo_test_base.h"
-#include "mojo/public/c/system/data_pipe.h"
-#include "mojo/public/c/system/types.h"
-#include "mojo/public/c/system/watcher.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace edk {
-namespace {
-
-using WatcherTest = test::MojoTestBase;
-
-class WatchHelper {
- public:
-  using ContextCallback =
-      base::Callback<void(MojoResult, MojoHandleSignalsState)>;
-
-  WatchHelper() {}
-  ~WatchHelper() {}
-
-  MojoResult CreateWatcher(MojoHandle* handle) {
-    return MojoCreateWatcher(&Notify, handle);
-  }
-
-  uintptr_t CreateContext(const ContextCallback& callback) {
-    return CreateContextWithCancel(callback, base::Closure());
-  }
-
-  uintptr_t CreateContextWithCancel(const ContextCallback& callback,
-                                    const base::Closure& cancel_callback) {
-    auto context = base::MakeUnique<NotificationContext>(callback);
-    NotificationContext* raw_context = context.get();
-    raw_context->SetCancelCallback(base::Bind(
-        [](std::unique_ptr<NotificationContext> context,
-           const base::Closure& cancel_callback) {
-          if (cancel_callback)
-            cancel_callback.Run();
-        },
-        base::Passed(&context), cancel_callback));
-    return reinterpret_cast<uintptr_t>(raw_context);
-  }
-
- private:
-  class NotificationContext {
-   public:
-    explicit NotificationContext(const ContextCallback& callback)
-        : callback_(callback) {}
-
-    ~NotificationContext() {}
-
-    void SetCancelCallback(const base::Closure& cancel_callback) {
-      cancel_callback_ = cancel_callback;
-    }
-
-    void Notify(MojoResult result, MojoHandleSignalsState state) {
-      if (result == MOJO_RESULT_CANCELLED)
-        cancel_callback_.Run();
-      else
-        callback_.Run(result, state);
-    }
-
-   private:
-    const ContextCallback callback_;
-    base::Closure cancel_callback_;
-
-    DISALLOW_COPY_AND_ASSIGN(NotificationContext);
-  };
-
-  static void Notify(uintptr_t context,
-                     MojoResult result,
-                     MojoHandleSignalsState state,
-                     MojoWatcherNotificationFlags flags) {
-    reinterpret_cast<NotificationContext*>(context)->Notify(result, state);
-  }
-
-  DISALLOW_COPY_AND_ASSIGN(WatchHelper);
-};
-
-class ThreadedRunner : public base::SimpleThread {
- public:
-  explicit ThreadedRunner(const base::Closure& callback)
-      : SimpleThread("ThreadedRunner"), callback_(callback) {}
-  ~ThreadedRunner() override {}
-
-  void Run() override { callback_.Run(); }
-
- private:
-  const base::Closure callback_;
-
-  DISALLOW_COPY_AND_ASSIGN(ThreadedRunner);
-};
-
-void ExpectNoNotification(uintptr_t context,
-                          MojoResult result,
-                          MojoHandleSignalsState state,
-                          MojoWatcherNotificationFlags flags) {
-  NOTREACHED();
-}
-
-void ExpectOnlyCancel(uintptr_t context,
-                      MojoResult result,
-                      MojoHandleSignalsState state,
-                      MojoWatcherNotificationFlags flags) {
-  EXPECT_EQ(result, MOJO_RESULT_CANCELLED);
-}
-
-TEST_F(WatcherTest, InvalidArguments) {
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            MojoCreateWatcher(&ExpectNoNotification, nullptr));
-  MojoHandle w;
-  EXPECT_EQ(MOJO_RESULT_OK, MojoCreateWatcher(&ExpectNoNotification, &w));
-
-  // Try to watch unwatchable handles.
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            MojoWatch(w, w, MOJO_HANDLE_SIGNAL_READABLE, 0));
-  MojoHandle buffer_handle = CreateBuffer(42);
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            MojoWatch(w, buffer_handle, MOJO_HANDLE_SIGNAL_READABLE, 0));
-
-  // Try to cancel a watch on an invalid watcher handle.
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoCancelWatch(buffer_handle, 0));
-
-  // Try to arm an invalid handle.
-  EXPECT_EQ(
-      MOJO_RESULT_INVALID_ARGUMENT,
-      MojoArmWatcher(MOJO_HANDLE_INVALID, nullptr, nullptr, nullptr, nullptr));
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            MojoArmWatcher(buffer_handle, nullptr, nullptr, nullptr, nullptr));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(buffer_handle));
-
-  // Try to arm with a non-null count but at least one null output buffer.
-  uint32_t num_ready_contexts = 1;
-  uintptr_t ready_context;
-  MojoResult ready_result;
-  MojoHandleSignalsState ready_state;
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            MojoArmWatcher(w, &num_ready_contexts, nullptr, &ready_result,
-                           &ready_state));
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            MojoArmWatcher(w, &num_ready_contexts, &ready_context, nullptr,
-                           &ready_state));
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            MojoArmWatcher(w, &num_ready_contexts, &ready_context,
-                           &ready_result, nullptr));
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(w));
-}
-
-TEST_F(WatcherTest, WatchMessagePipeReadable) {
-  MojoHandle a, b;
-  CreateMessagePipe(&a, &b);
-
-  base::WaitableEvent event(base::WaitableEvent::ResetPolicy::MANUAL,
-                            base::WaitableEvent::InitialState::NOT_SIGNALED);
-  WatchHelper helper;
-  int num_expected_notifications = 1;
-  const uintptr_t readable_a_context = helper.CreateContext(base::Bind(
-      [](base::WaitableEvent* event, int* expected_count, MojoResult result,
-         MojoHandleSignalsState state) {
-        EXPECT_GT(*expected_count, 0);
-        *expected_count -= 1;
-
-        EXPECT_EQ(MOJO_RESULT_OK, result);
-        event->Signal();
-      },
-      &event, &num_expected_notifications));
-
-  MojoHandle w;
-  EXPECT_EQ(MOJO_RESULT_OK, helper.CreateWatcher(&w));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoWatch(w, a, MOJO_HANDLE_SIGNAL_READABLE, readable_a_context));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoArmWatcher(w, nullptr, nullptr, nullptr, nullptr));
-
-  const char kMessage1[] = "hey hey hey hey";
-  const char kMessage2[] = "i said hey";
-  const char kMessage3[] = "what's goin' on?";
-
-  // Writing to |b| multiple times should notify exactly once.
-  WriteMessage(b, kMessage1);
-  WriteMessage(b, kMessage2);
-  event.Wait();
-
-  // This also shouldn't fire a notification; the watcher is still disarmed.
-  WriteMessage(b, kMessage3);
-
-  // Arming should fail with relevant information.
-  constexpr size_t kMaxReadyContexts = 10;
-  uint32_t num_ready_contexts = kMaxReadyContexts;
-  uintptr_t ready_contexts[kMaxReadyContexts];
-  MojoResult ready_results[kMaxReadyContexts];
-  MojoHandleSignalsState ready_states[kMaxReadyContexts];
-  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-            MojoArmWatcher(w, &num_ready_contexts, ready_contexts,
-                           ready_results, ready_states));
-  EXPECT_EQ(1u, num_ready_contexts);
-  EXPECT_EQ(readable_a_context, ready_contexts[0]);
-  EXPECT_EQ(MOJO_RESULT_OK, ready_results[0]);
-
-  // Flush the three messages from above.
-  EXPECT_EQ(kMessage1, ReadMessage(a));
-  EXPECT_EQ(kMessage2, ReadMessage(a));
-  EXPECT_EQ(kMessage3, ReadMessage(a));
-
-  // Now we can rearm the watcher.
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoArmWatcher(w, nullptr, nullptr, nullptr, nullptr));
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(w));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(b));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(a));
-}
-
-TEST_F(WatcherTest, CloseWatchedMessagePipeHandle) {
-  MojoHandle a, b;
-  CreateMessagePipe(&a, &b);
-
-  base::WaitableEvent event(base::WaitableEvent::ResetPolicy::MANUAL,
-                            base::WaitableEvent::InitialState::NOT_SIGNALED);
-  WatchHelper helper;
-  const uintptr_t readable_a_context = helper.CreateContextWithCancel(
-      WatchHelper::ContextCallback(),
-      base::Bind([](base::WaitableEvent* event) { event->Signal(); }, &event));
-
-  MojoHandle w;
-  EXPECT_EQ(MOJO_RESULT_OK, helper.CreateWatcher(&w));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoWatch(w, a, MOJO_HANDLE_SIGNAL_READABLE, readable_a_context));
-
-  // Test that closing a watched handle fires an appropriate notification, even
-  // when the watcher is unarmed.
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(a));
-  event.Wait();
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(b));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(w));
-}
-
-TEST_F(WatcherTest, CloseWatchedMessagePipeHandlePeer) {
-  MojoHandle a, b;
-  CreateMessagePipe(&a, &b);
-
-  base::WaitableEvent event(base::WaitableEvent::ResetPolicy::MANUAL,
-                            base::WaitableEvent::InitialState::NOT_SIGNALED);
-  WatchHelper helper;
-  const uintptr_t readable_a_context = helper.CreateContext(base::Bind(
-      [](base::WaitableEvent* event, MojoResult result,
-         MojoHandleSignalsState state) {
-        EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result);
-        event->Signal();
-      },
-      &event));
-
-  MojoHandle w;
-  EXPECT_EQ(MOJO_RESULT_OK, helper.CreateWatcher(&w));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoWatch(w, a, MOJO_HANDLE_SIGNAL_READABLE, readable_a_context));
-
-  // Test that closing a watched handle's peer with an armed watcher fires an
-  // appropriate notification.
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoArmWatcher(w, nullptr, nullptr, nullptr, nullptr));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(b));
-  event.Wait();
-
-  // And now arming should fail with correct information about |a|'s state.
-  constexpr size_t kMaxReadyContexts = 10;
-  uint32_t num_ready_contexts = kMaxReadyContexts;
-  uintptr_t ready_contexts[kMaxReadyContexts];
-  MojoResult ready_results[kMaxReadyContexts];
-  MojoHandleSignalsState ready_states[kMaxReadyContexts];
-  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-            MojoArmWatcher(w, &num_ready_contexts, ready_contexts,
-                           ready_results, ready_states));
-  EXPECT_EQ(1u, num_ready_contexts);
-  EXPECT_EQ(readable_a_context, ready_contexts[0]);
-  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, ready_results[0]);
-  EXPECT_TRUE(ready_states[0].satisfied_signals &
-              MOJO_HANDLE_SIGNAL_PEER_CLOSED);
-  EXPECT_FALSE(ready_states[0].satisfiable_signals &
-               MOJO_HANDLE_SIGNAL_READABLE);
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(w));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(a));
-}
-
-TEST_F(WatcherTest, WatchDataPipeConsumerReadable) {
-  constexpr size_t kTestPipeCapacity = 64;
-  MojoHandle producer, consumer;
-  CreateDataPipe(&producer, &consumer, kTestPipeCapacity);
-
-  base::WaitableEvent event(base::WaitableEvent::ResetPolicy::MANUAL,
-                            base::WaitableEvent::InitialState::NOT_SIGNALED);
-  WatchHelper helper;
-  int num_expected_notifications = 1;
-  const uintptr_t readable_consumer_context = helper.CreateContext(base::Bind(
-      [](base::WaitableEvent* event, int* expected_count, MojoResult result,
-         MojoHandleSignalsState state) {
-        EXPECT_GT(*expected_count, 0);
-        *expected_count -= 1;
-
-        EXPECT_EQ(MOJO_RESULT_OK, result);
-        event->Signal();
-      },
-      &event, &num_expected_notifications));
-
-  MojoHandle w;
-  EXPECT_EQ(MOJO_RESULT_OK, helper.CreateWatcher(&w));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoWatch(w, consumer, MOJO_HANDLE_SIGNAL_READABLE,
-                                      readable_consumer_context));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoArmWatcher(w, nullptr, nullptr, nullptr, nullptr));
-
-  const char kMessage1[] = "hey hey hey hey";
-  const char kMessage2[] = "i said hey";
-  const char kMessage3[] = "what's goin' on?";
-
-  // Writing to |producer| multiple times should notify exactly once.
-  WriteData(producer, kMessage1);
-  WriteData(producer, kMessage2);
-  event.Wait();
-
-  // This also shouldn't fire a notification; the watcher is still disarmed.
-  WriteData(producer, kMessage3);
-
-  // Arming should fail with relevant information.
-  constexpr size_t kMaxReadyContexts = 10;
-  uint32_t num_ready_contexts = kMaxReadyContexts;
-  uintptr_t ready_contexts[kMaxReadyContexts];
-  MojoResult ready_results[kMaxReadyContexts];
-  MojoHandleSignalsState ready_states[kMaxReadyContexts];
-  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-            MojoArmWatcher(w, &num_ready_contexts, ready_contexts,
-                           ready_results, ready_states));
-  EXPECT_EQ(1u, num_ready_contexts);
-  EXPECT_EQ(readable_consumer_context, ready_contexts[0]);
-  EXPECT_EQ(MOJO_RESULT_OK, ready_results[0]);
-
-  // Flush the three messages from above.
-  EXPECT_EQ(kMessage1, ReadData(consumer, sizeof(kMessage1) - 1));
-  EXPECT_EQ(kMessage2, ReadData(consumer, sizeof(kMessage2) - 1));
-  EXPECT_EQ(kMessage3, ReadData(consumer, sizeof(kMessage3) - 1));
-
-  // Now we can rearm the watcher.
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoArmWatcher(w, nullptr, nullptr, nullptr, nullptr));
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(w));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(producer));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(consumer));
-}
-
-TEST_F(WatcherTest, WatchDataPipeConsumerNewDataReadable) {
-  constexpr size_t kTestPipeCapacity = 64;
-  MojoHandle producer, consumer;
-  CreateDataPipe(&producer, &consumer, kTestPipeCapacity);
-
-  base::WaitableEvent event(base::WaitableEvent::ResetPolicy::MANUAL,
-                            base::WaitableEvent::InitialState::NOT_SIGNALED);
-  WatchHelper helper;
-  int num_new_data_notifications = 0;
-  const uintptr_t new_data_context = helper.CreateContext(base::Bind(
-      [](base::WaitableEvent* event, int* notification_count, MojoResult result,
-         MojoHandleSignalsState state) {
-        *notification_count += 1;
-
-        EXPECT_EQ(MOJO_RESULT_OK, result);
-        event->Signal();
-      },
-      &event, &num_new_data_notifications));
-
-  MojoHandle w;
-  EXPECT_EQ(MOJO_RESULT_OK, helper.CreateWatcher(&w));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoWatch(w, consumer, MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-                      new_data_context));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoArmWatcher(w, nullptr, nullptr, nullptr, nullptr));
-
-  const char kMessage1[] = "hey hey hey hey";
-  const char kMessage2[] = "i said hey";
-  const char kMessage3[] = "what's goin' on?";
-
-  // Writing to |producer| multiple times should notify exactly once.
-  WriteData(producer, kMessage1);
-  WriteData(producer, kMessage2);
-  event.Wait();
-
-  // This also shouldn't fire a notification; the watcher is still disarmed.
-  WriteData(producer, kMessage3);
-
-  // Arming should fail with relevant information.
-  constexpr size_t kMaxReadyContexts = 10;
-  uint32_t num_ready_contexts = kMaxReadyContexts;
-  uintptr_t ready_contexts[kMaxReadyContexts];
-  MojoResult ready_results[kMaxReadyContexts];
-  MojoHandleSignalsState ready_states[kMaxReadyContexts];
-  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-            MojoArmWatcher(w, &num_ready_contexts, ready_contexts,
-                           ready_results, ready_states));
-  EXPECT_EQ(1u, num_ready_contexts);
-  EXPECT_EQ(new_data_context, ready_contexts[0]);
-  EXPECT_EQ(MOJO_RESULT_OK, ready_results[0]);
-
-  // Attempt to read more data than is available. Should fail but clear the
-  // NEW_DATA_READABLE signal.
-  char large_buffer[512];
-  uint32_t large_read_size = 512;
-  EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE,
-            MojoReadData(consumer, large_buffer, &large_read_size,
-                         MOJO_READ_DATA_FLAG_ALL_OR_NONE));
-
-  // Attempt to arm again. Should succeed.
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoArmWatcher(w, nullptr, nullptr, nullptr, nullptr));
-
-  // Write more data. Should notify.
-  event.Reset();
-  WriteData(producer, kMessage1);
-  event.Wait();
-
-  // Reading some data should clear NEW_DATA_READABLE again so we can rearm.
-  EXPECT_EQ(kMessage1, ReadData(consumer, sizeof(kMessage1) - 1));
-
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoArmWatcher(w, nullptr, nullptr, nullptr, nullptr));
-
-  EXPECT_EQ(2, num_new_data_notifications);
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(w));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(producer));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(consumer));
-}
-
-TEST_F(WatcherTest, WatchDataPipeProducerWritable) {
-  constexpr size_t kTestPipeCapacity = 8;
-  MojoHandle producer, consumer;
-  CreateDataPipe(&producer, &consumer, kTestPipeCapacity);
-
-  // Half the capacity of the data pipe.
-  const char kTestData[] = "aaaa";
-  static_assert((sizeof(kTestData) - 1) * 2 == kTestPipeCapacity,
-                "Invalid test data for this test.");
-
-  base::WaitableEvent event(base::WaitableEvent::ResetPolicy::MANUAL,
-                            base::WaitableEvent::InitialState::NOT_SIGNALED);
-  WatchHelper helper;
-  int num_expected_notifications = 1;
-  const uintptr_t writable_producer_context = helper.CreateContext(base::Bind(
-      [](base::WaitableEvent* event, int* expected_count, MojoResult result,
-         MojoHandleSignalsState state) {
-        EXPECT_GT(*expected_count, 0);
-        *expected_count -= 1;
-
-        EXPECT_EQ(MOJO_RESULT_OK, result);
-        event->Signal();
-      },
-      &event, &num_expected_notifications));
-
-  MojoHandle w;
-  EXPECT_EQ(MOJO_RESULT_OK, helper.CreateWatcher(&w));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoWatch(w, producer, MOJO_HANDLE_SIGNAL_WRITABLE,
-                                      writable_producer_context));
-
-  // The producer is already writable, so arming should fail with relevant
-  // information.
-  constexpr size_t kMaxReadyContexts = 10;
-  uint32_t num_ready_contexts = kMaxReadyContexts;
-  uintptr_t ready_contexts[kMaxReadyContexts];
-  MojoResult ready_results[kMaxReadyContexts];
-  MojoHandleSignalsState ready_states[kMaxReadyContexts];
-  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-            MojoArmWatcher(w, &num_ready_contexts, ready_contexts,
-                           ready_results, ready_states));
-  EXPECT_EQ(1u, num_ready_contexts);
-  EXPECT_EQ(writable_producer_context, ready_contexts[0]);
-  EXPECT_EQ(MOJO_RESULT_OK, ready_results[0]);
-  EXPECT_TRUE(ready_states[0].satisfied_signals & MOJO_HANDLE_SIGNAL_WRITABLE);
-
-  // Write some data, but don't fill the pipe yet. Arming should fail again.
-  WriteData(producer, kTestData);
-  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-            MojoArmWatcher(w, &num_ready_contexts, ready_contexts,
-                           ready_results, ready_states));
-  EXPECT_EQ(1u, num_ready_contexts);
-  EXPECT_EQ(writable_producer_context, ready_contexts[0]);
-  EXPECT_EQ(MOJO_RESULT_OK, ready_results[0]);
-  EXPECT_TRUE(ready_states[0].satisfied_signals & MOJO_HANDLE_SIGNAL_WRITABLE);
-
-  // Write more data, filling the pipe to capacity. Arming should succeed now.
-  WriteData(producer, kTestData);
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoArmWatcher(w, nullptr, nullptr, nullptr, nullptr));
-
-  // Now read from the pipe, making the producer writable again. Should notify.
-  EXPECT_EQ(kTestData, ReadData(consumer, sizeof(kTestData) - 1));
-  event.Wait();
-
-  // Arming should fail again.
-  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-            MojoArmWatcher(w, &num_ready_contexts, ready_contexts,
-                           ready_results, ready_states));
-  EXPECT_EQ(1u, num_ready_contexts);
-  EXPECT_EQ(writable_producer_context, ready_contexts[0]);
-  EXPECT_EQ(MOJO_RESULT_OK, ready_results[0]);
-  EXPECT_TRUE(ready_states[0].satisfied_signals & MOJO_HANDLE_SIGNAL_WRITABLE);
-
-  // Fill the pipe once more and arm the watcher. Should succeed.
-  WriteData(producer, kTestData);
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoArmWatcher(w, nullptr, nullptr, nullptr, nullptr));
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(w));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(producer));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(consumer));
-};
-
-TEST_F(WatcherTest, CloseWatchedDataPipeConsumerHandle) {
-  constexpr size_t kTestPipeCapacity = 8;
-  MojoHandle producer, consumer;
-  CreateDataPipe(&producer, &consumer, kTestPipeCapacity);
-
-  base::WaitableEvent event(base::WaitableEvent::ResetPolicy::MANUAL,
-                            base::WaitableEvent::InitialState::NOT_SIGNALED);
-  WatchHelper helper;
-  const uintptr_t readable_consumer_context = helper.CreateContextWithCancel(
-      WatchHelper::ContextCallback(),
-      base::Bind([](base::WaitableEvent* event) { event->Signal(); }, &event));
-
-  MojoHandle w;
-  EXPECT_EQ(MOJO_RESULT_OK, helper.CreateWatcher(&w));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoWatch(w, consumer, MOJO_HANDLE_SIGNAL_READABLE,
-                                      readable_consumer_context));
-
-  // Closing the consumer should fire a cancellation notification.
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(consumer));
-  event.Wait();
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(producer));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(w));
-}
-
-TEST_F(WatcherTest, CloseWatcherDataPipeConsumerHandlePeer) {
-  constexpr size_t kTestPipeCapacity = 8;
-  MojoHandle producer, consumer;
-  CreateDataPipe(&producer, &consumer, kTestPipeCapacity);
-
-  base::WaitableEvent event(base::WaitableEvent::ResetPolicy::MANUAL,
-                            base::WaitableEvent::InitialState::NOT_SIGNALED);
-  WatchHelper helper;
-  const uintptr_t readable_consumer_context = helper.CreateContext(base::Bind(
-      [](base::WaitableEvent* event, MojoResult result,
-         MojoHandleSignalsState state) {
-        EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result);
-        event->Signal();
-      },
-      &event));
-
-  MojoHandle w;
-  EXPECT_EQ(MOJO_RESULT_OK, helper.CreateWatcher(&w));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoWatch(w, consumer, MOJO_HANDLE_SIGNAL_READABLE,
-                                      readable_consumer_context));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoArmWatcher(w, nullptr, nullptr, nullptr, nullptr));
-
-  // Closing the producer should fire a notification for an unsatisfiable watch.
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(producer));
-  event.Wait();
-
-  // Now attempt to rearm and expect appropriate error feedback.
-  constexpr size_t kMaxReadyContexts = 10;
-  uint32_t num_ready_contexts = kMaxReadyContexts;
-  uintptr_t ready_contexts[kMaxReadyContexts];
-  MojoResult ready_results[kMaxReadyContexts];
-  MojoHandleSignalsState ready_states[kMaxReadyContexts];
-  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-            MojoArmWatcher(w, &num_ready_contexts, ready_contexts,
-                           ready_results, ready_states));
-  EXPECT_EQ(1u, num_ready_contexts);
-  EXPECT_EQ(readable_consumer_context, ready_contexts[0]);
-  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, ready_results[0]);
-  EXPECT_FALSE(ready_states[0].satisfiable_signals &
-               MOJO_HANDLE_SIGNAL_READABLE);
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(w));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(consumer));
-}
-
-TEST_F(WatcherTest, CloseWatchedDataPipeProducerHandle) {
-  constexpr size_t kTestPipeCapacity = 8;
-  MojoHandle producer, consumer;
-  CreateDataPipe(&producer, &consumer, kTestPipeCapacity);
-
-  base::WaitableEvent event(base::WaitableEvent::ResetPolicy::MANUAL,
-                            base::WaitableEvent::InitialState::NOT_SIGNALED);
-  WatchHelper helper;
-  const uintptr_t writable_producer_context = helper.CreateContextWithCancel(
-      WatchHelper::ContextCallback(),
-      base::Bind([](base::WaitableEvent* event) { event->Signal(); }, &event));
-
-  MojoHandle w;
-  EXPECT_EQ(MOJO_RESULT_OK, helper.CreateWatcher(&w));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoWatch(w, producer, MOJO_HANDLE_SIGNAL_WRITABLE,
-                                      writable_producer_context));
-
-  // Closing the consumer should fire a cancellation notification.
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(producer));
-  event.Wait();
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(consumer));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(w));
-}
-
-TEST_F(WatcherTest, CloseWatchedDataPipeProducerHandlePeer) {
-  constexpr size_t kTestPipeCapacity = 8;
-  MojoHandle producer, consumer;
-  CreateDataPipe(&producer, &consumer, kTestPipeCapacity);
-
-  const char kTestMessageFullCapacity[] = "xxxxxxxx";
-  static_assert(sizeof(kTestMessageFullCapacity) - 1 == kTestPipeCapacity,
-                "Invalid test message size for this test.");
-
-  // Make the pipe unwritable initially.
-  WriteData(producer, kTestMessageFullCapacity);
-
-  base::WaitableEvent event(base::WaitableEvent::ResetPolicy::MANUAL,
-                            base::WaitableEvent::InitialState::NOT_SIGNALED);
-  WatchHelper helper;
-  const uintptr_t writable_producer_context = helper.CreateContext(base::Bind(
-      [](base::WaitableEvent* event, MojoResult result,
-         MojoHandleSignalsState state) {
-        EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result);
-        event->Signal();
-      },
-      &event));
-
-  MojoHandle w;
-  EXPECT_EQ(MOJO_RESULT_OK, helper.CreateWatcher(&w));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoWatch(w, producer, MOJO_HANDLE_SIGNAL_WRITABLE,
-                                      writable_producer_context));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoArmWatcher(w, nullptr, nullptr, nullptr, nullptr));
-
-  // Closing the consumer should fire a notification for an unsatisfiable watch,
-  // as the full data pipe can never be read from again and is therefore
-  // permanently full and unwritable.
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(consumer));
-  event.Wait();
-
-  // Now attempt to rearm and expect appropriate error feedback.
-  constexpr size_t kMaxReadyContexts = 10;
-  uint32_t num_ready_contexts = kMaxReadyContexts;
-  uintptr_t ready_contexts[kMaxReadyContexts];
-  MojoResult ready_results[kMaxReadyContexts];
-  MojoHandleSignalsState ready_states[kMaxReadyContexts];
-  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-            MojoArmWatcher(w, &num_ready_contexts, ready_contexts,
-                           ready_results, ready_states));
-  EXPECT_EQ(1u, num_ready_contexts);
-  EXPECT_EQ(writable_producer_context, ready_contexts[0]);
-  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, ready_results[0]);
-  EXPECT_FALSE(ready_states[0].satisfiable_signals &
-               MOJO_HANDLE_SIGNAL_WRITABLE);
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(w));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(producer));
-}
-
-TEST_F(WatcherTest, ArmWithNoWatches) {
-  MojoHandle w;
-  EXPECT_EQ(MOJO_RESULT_OK, MojoCreateWatcher(&ExpectNoNotification, &w));
-  EXPECT_EQ(MOJO_RESULT_NOT_FOUND,
-            MojoArmWatcher(w, nullptr, nullptr, nullptr, nullptr));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(w));
-}
-
-TEST_F(WatcherTest, WatchDuplicateContext) {
-  MojoHandle a, b;
-  CreateMessagePipe(&a, &b);
-
-  MojoHandle w;
-  EXPECT_EQ(MOJO_RESULT_OK, MojoCreateWatcher(&ExpectOnlyCancel, &w));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoWatch(w, a, MOJO_HANDLE_SIGNAL_READABLE, 0));
-  EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS,
-            MojoWatch(w, b, MOJO_HANDLE_SIGNAL_READABLE, 0));
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(w));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(a));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(b));
-}
-
-TEST_F(WatcherTest, CancelUnknownWatch) {
-  MojoHandle w;
-  EXPECT_EQ(MOJO_RESULT_OK, MojoCreateWatcher(&ExpectNoNotification, &w));
-  EXPECT_EQ(MOJO_RESULT_NOT_FOUND, MojoCancelWatch(w, 1234));
-}
-
-TEST_F(WatcherTest, ArmWithWatchAlreadySatisfied) {
-  MojoHandle a, b;
-  CreateMessagePipe(&a, &b);
-
-  MojoHandle w;
-  EXPECT_EQ(MOJO_RESULT_OK, MojoCreateWatcher(&ExpectOnlyCancel, &w));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoWatch(w, a, MOJO_HANDLE_SIGNAL_WRITABLE, 0));
-
-  // |a| is always writable, so we can never arm this watcher.
-  constexpr size_t kMaxReadyContexts = 10;
-  uint32_t num_ready_contexts = kMaxReadyContexts;
-  uintptr_t ready_contexts[kMaxReadyContexts];
-  MojoResult ready_results[kMaxReadyContexts];
-  MojoHandleSignalsState ready_states[kMaxReadyContexts];
-  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-            MojoArmWatcher(w, &num_ready_contexts, ready_contexts,
-                           ready_results, ready_states));
-  EXPECT_EQ(1u, num_ready_contexts);
-  EXPECT_EQ(0u, ready_contexts[0]);
-  EXPECT_EQ(MOJO_RESULT_OK, ready_results[0]);
-  EXPECT_TRUE(ready_states[0].satisfied_signals & MOJO_HANDLE_SIGNAL_WRITABLE);
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(w));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(b));
-}
-
-TEST_F(WatcherTest, ArmWithWatchAlreadyUnsatisfiable) {
-  MojoHandle a, b;
-  CreateMessagePipe(&a, &b);
-
-  MojoHandle w;
-  EXPECT_EQ(MOJO_RESULT_OK, MojoCreateWatcher(&ExpectOnlyCancel, &w));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoWatch(w, a, MOJO_HANDLE_SIGNAL_READABLE, 0));
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(b));
-
-  // |b| is closed and never wrote any messages, so |a| won't be readable again.
-  // MojoArmWatcher() should fail, incidcating as much.
-  constexpr size_t kMaxReadyContexts = 10;
-  uint32_t num_ready_contexts = kMaxReadyContexts;
-  uintptr_t ready_contexts[kMaxReadyContexts];
-  MojoResult ready_results[kMaxReadyContexts];
-  MojoHandleSignalsState ready_states[kMaxReadyContexts];
-  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-            MojoArmWatcher(w, &num_ready_contexts, ready_contexts,
-                           ready_results, ready_states));
-  EXPECT_EQ(1u, num_ready_contexts);
-  EXPECT_EQ(0u, ready_contexts[0]);
-  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, ready_results[0]);
-  EXPECT_TRUE(ready_states[0].satisfied_signals &
-              MOJO_HANDLE_SIGNAL_PEER_CLOSED);
-  EXPECT_FALSE(ready_states[0].satisfiable_signals &
-               MOJO_HANDLE_SIGNAL_READABLE);
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(w));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(a));
-}
-
-TEST_F(WatcherTest, MultipleWatches) {
-  MojoHandle a, b;
-  CreateMessagePipe(&a, &b);
-
-  base::WaitableEvent a_event(base::WaitableEvent::ResetPolicy::MANUAL,
-                              base::WaitableEvent::InitialState::NOT_SIGNALED);
-  base::WaitableEvent b_event(base::WaitableEvent::ResetPolicy::MANUAL,
-                              base::WaitableEvent::InitialState::NOT_SIGNALED);
-  WatchHelper helper;
-  int num_a_notifications = 0;
-  int num_b_notifications = 0;
-  auto notify_callback =
-      base::Bind([](base::WaitableEvent* event, int* notification_count,
-                    MojoResult result, MojoHandleSignalsState state) {
-        *notification_count += 1;
-        EXPECT_EQ(MOJO_RESULT_OK, result);
-        event->Signal();
-      });
-  uintptr_t readable_a_context = helper.CreateContext(
-      base::Bind(notify_callback, &a_event, &num_a_notifications));
-  uintptr_t readable_b_context = helper.CreateContext(
-      base::Bind(notify_callback, &b_event, &num_b_notifications));
-
-  MojoHandle w;
-  EXPECT_EQ(MOJO_RESULT_OK, helper.CreateWatcher(&w));
-
-  // Add two independent watch contexts to watch for |a| or |b| readability.
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoWatch(w, a, MOJO_HANDLE_SIGNAL_READABLE, readable_a_context));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoWatch(w, b, MOJO_HANDLE_SIGNAL_READABLE, readable_b_context));
-
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoArmWatcher(w, nullptr, nullptr, nullptr, nullptr));
-
-  const char kMessage1[] = "things are happening";
-  const char kMessage2[] = "ok. ok. ok. ok.";
-  const char kMessage3[] = "plz wake up";
-
-  // Writing to |b| should signal |a|'s watch.
-  WriteMessage(b, kMessage1);
-  a_event.Wait();
-  a_event.Reset();
-
-  // Subsequent messages on |b| should not trigger another notification.
-  WriteMessage(b, kMessage2);
-  WriteMessage(b, kMessage3);
-
-  // Messages on |a| also shouldn't trigger |b|'s notification, since the
-  // watcher should be disarmed by now.
-  WriteMessage(a, kMessage1);
-  WriteMessage(a, kMessage2);
-  WriteMessage(a, kMessage3);
-
-  // Arming should fail. Since we only ask for at most one context's information
-  // that's all we should get back. Which one we get is unspecified.
-  constexpr size_t kMaxReadyContexts = 10;
-  uint32_t num_ready_contexts = 1;
-  uintptr_t ready_contexts[kMaxReadyContexts];
-  MojoResult ready_results[kMaxReadyContexts];
-  MojoHandleSignalsState ready_states[kMaxReadyContexts];
-  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-            MojoArmWatcher(w, &num_ready_contexts, ready_contexts,
-                           ready_results, ready_states));
-  EXPECT_EQ(1u, num_ready_contexts);
-  EXPECT_TRUE(ready_contexts[0] == readable_a_context ||
-              ready_contexts[0] == readable_b_context);
-  EXPECT_EQ(MOJO_RESULT_OK, ready_results[0]);
-  EXPECT_TRUE(ready_states[0].satisfied_signals & MOJO_HANDLE_SIGNAL_WRITABLE);
-
-  // Now try arming again, verifying that both contexts are returned.
-  num_ready_contexts = kMaxReadyContexts;
-  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-            MojoArmWatcher(w, &num_ready_contexts, ready_contexts,
-                           ready_results, ready_states));
-  EXPECT_EQ(2u, num_ready_contexts);
-  EXPECT_EQ(MOJO_RESULT_OK, ready_results[0]);
-  EXPECT_EQ(MOJO_RESULT_OK, ready_results[1]);
-  EXPECT_TRUE(ready_states[0].satisfied_signals & MOJO_HANDLE_SIGNAL_WRITABLE);
-  EXPECT_TRUE(ready_states[1].satisfied_signals & MOJO_HANDLE_SIGNAL_WRITABLE);
-  EXPECT_TRUE((ready_contexts[0] == readable_a_context &&
-               ready_contexts[1] == readable_b_context) ||
-              (ready_contexts[0] == readable_b_context &&
-               ready_contexts[1] == readable_a_context));
-
-  // Flush out the test messages so we should be able to successfully rearm.
-  EXPECT_EQ(kMessage1, ReadMessage(a));
-  EXPECT_EQ(kMessage2, ReadMessage(a));
-  EXPECT_EQ(kMessage3, ReadMessage(a));
-  EXPECT_EQ(kMessage1, ReadMessage(b));
-  EXPECT_EQ(kMessage2, ReadMessage(b));
-  EXPECT_EQ(kMessage3, ReadMessage(b));
-
-  // Add a watch which is always satisfied, so we can't arm. Arming should fail
-  // with only this new watch's information.
-  uintptr_t writable_c_context = helper.CreateContext(base::Bind(
-      [](MojoResult result, MojoHandleSignalsState state) { NOTREACHED(); }));
-  MojoHandle c, d;
-  CreateMessagePipe(&c, &d);
-
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoWatch(w, c, MOJO_HANDLE_SIGNAL_WRITABLE, writable_c_context));
-  num_ready_contexts = kMaxReadyContexts;
-  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-            MojoArmWatcher(w, &num_ready_contexts, ready_contexts,
-                           ready_results, ready_states));
-  EXPECT_EQ(1u, num_ready_contexts);
-  EXPECT_EQ(writable_c_context, ready_contexts[0]);
-  EXPECT_EQ(MOJO_RESULT_OK, ready_results[0]);
-  EXPECT_TRUE(ready_states[0].satisfied_signals & MOJO_HANDLE_SIGNAL_WRITABLE);
-
-  // Cancel the new watch and arming should succeed once again.
-  EXPECT_EQ(MOJO_RESULT_OK, MojoCancelWatch(w, writable_c_context));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoArmWatcher(w, nullptr, nullptr, nullptr, nullptr));
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(w));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(a));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(b));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(c));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(d));
-}
-
-TEST_F(WatcherTest, NotifyOtherFromNotificationCallback) {
-  MojoHandle a, b;
-  CreateMessagePipe(&a, &b);
-
-  static const char kTestMessageToA[] = "hello a";
-  static const char kTestMessageToB[] = "hello b";
-
-  base::WaitableEvent event(base::WaitableEvent::ResetPolicy::MANUAL,
-                            base::WaitableEvent::InitialState::NOT_SIGNALED);
-
-  WatchHelper helper;
-  MojoHandle w;
-  EXPECT_EQ(MOJO_RESULT_OK, helper.CreateWatcher(&w));
-
-  uintptr_t readable_a_context = helper.CreateContext(base::Bind(
-      [](MojoHandle w, MojoHandle a, MojoResult result,
-         MojoHandleSignalsState state) {
-        EXPECT_EQ(MOJO_RESULT_OK, result);
-        EXPECT_EQ("hello a", ReadMessage(a));
-
-        // Re-arm the watcher and signal |b|.
-        EXPECT_EQ(MOJO_RESULT_OK,
-                  MojoArmWatcher(w, nullptr, nullptr, nullptr, nullptr));
-        WriteMessage(a, kTestMessageToB);
-      },
-      w, a));
-
-  uintptr_t readable_b_context = helper.CreateContext(base::Bind(
-      [](base::WaitableEvent* event, MojoHandle w, MojoHandle b,
-         MojoResult result, MojoHandleSignalsState state) {
-        EXPECT_EQ(MOJO_RESULT_OK, result);
-        EXPECT_EQ(kTestMessageToB, ReadMessage(b));
-        EXPECT_EQ(MOJO_RESULT_OK,
-                  MojoArmWatcher(w, nullptr, nullptr, nullptr, nullptr));
-        event->Signal();
-      },
-      &event, w, b));
-
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoWatch(w, a, MOJO_HANDLE_SIGNAL_READABLE, readable_a_context));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoWatch(w, b, MOJO_HANDLE_SIGNAL_READABLE, readable_b_context));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoArmWatcher(w, nullptr, nullptr, nullptr, nullptr));
-
-  // Send a message to |a|. The relevant watch context should be notified, and
-  // should in turn send a message to |b|, waking up the other context. The
-  // second context signals |event|.
-  WriteMessage(b, kTestMessageToA);
-  event.Wait();
-}
-
-TEST_F(WatcherTest, NotifySelfFromNotificationCallback) {
-  MojoHandle a, b;
-  CreateMessagePipe(&a, &b);
-
-  static const char kTestMessageToA[] = "hello a";
-
-  base::WaitableEvent event(base::WaitableEvent::ResetPolicy::MANUAL,
-                            base::WaitableEvent::InitialState::NOT_SIGNALED);
-
-  WatchHelper helper;
-  MojoHandle w;
-  EXPECT_EQ(MOJO_RESULT_OK, helper.CreateWatcher(&w));
-
-  int expected_notifications = 10;
-  uintptr_t readable_a_context = helper.CreateContext(base::Bind(
-      [](int* expected_count, MojoHandle w, MojoHandle a, MojoHandle b,
-         base::WaitableEvent* event, MojoResult result,
-         MojoHandleSignalsState state) {
-        EXPECT_EQ(MOJO_RESULT_OK, result);
-        EXPECT_EQ("hello a", ReadMessage(a));
-
-        EXPECT_GT(*expected_count, 0);
-        *expected_count -= 1;
-        if (*expected_count == 0) {
-          event->Signal();
-          return;
-        } else {
-          // Re-arm the watcher and signal |a| again.
-          EXPECT_EQ(MOJO_RESULT_OK,
-                    MojoArmWatcher(w, nullptr, nullptr, nullptr, nullptr));
-          WriteMessage(b, kTestMessageToA);
-        }
-      },
-      &expected_notifications, w, a, b, &event));
-
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoWatch(w, a, MOJO_HANDLE_SIGNAL_READABLE, readable_a_context));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoArmWatcher(w, nullptr, nullptr, nullptr, nullptr));
-
-  // Send a message to |a|. When the watch above is notified, it will rearm and
-  // send another message to |a|. This will happen until
-  // |expected_notifications| reaches 0.
-  WriteMessage(b, kTestMessageToA);
-  event.Wait();
-}
-
-TEST_F(WatcherTest, ImplicitCancelOtherFromNotificationCallback) {
-  MojoHandle a, b;
-  CreateMessagePipe(&a, &b);
-
-  MojoHandle c, d;
-  CreateMessagePipe(&c, &d);
-
-  static const char kTestMessageToA[] = "hi a";
-  static const char kTestMessageToC[] = "hi c";
-
-  base::WaitableEvent event(base::WaitableEvent::ResetPolicy::MANUAL,
-                            base::WaitableEvent::InitialState::NOT_SIGNALED);
-
-  WatchHelper helper;
-  MojoHandle w;
-  EXPECT_EQ(MOJO_RESULT_OK, helper.CreateWatcher(&w));
-
-  uintptr_t readable_a_context = helper.CreateContextWithCancel(
-      base::Bind([](MojoResult result, MojoHandleSignalsState state) {
-        NOTREACHED();
-      }),
-      base::Bind([](base::WaitableEvent* event) { event->Signal(); }, &event));
-
-  uintptr_t readable_c_context = helper.CreateContext(base::Bind(
-      [](MojoHandle w, MojoHandle a, MojoHandle b, MojoHandle c,
-         MojoResult result, MojoHandleSignalsState state) {
-        EXPECT_EQ(MOJO_RESULT_OK, result);
-        EXPECT_EQ(kTestMessageToC, ReadMessage(c));
-
-        // Now rearm the watcher.
-        EXPECT_EQ(MOJO_RESULT_OK,
-                  MojoArmWatcher(w, nullptr, nullptr, nullptr, nullptr));
-
-        // Must result in exactly ONE notification on the above context, for
-        // CANCELLED only. Because we cannot dispatch notifications until the
-        // stack unwinds, and because we must never dispatch non-cancellation
-        // notifications for a handle once it's been closed, we must be certain
-        // that cancellation due to closure preemptively invalidates any
-        // pending non-cancellation notifications queued on the current
-        // RequestContext, such as the one resulting from the WriteMessage here.
-        WriteMessage(b, kTestMessageToA);
-        EXPECT_EQ(MOJO_RESULT_OK, MojoClose(a));
-
-        // Rearming should be fine since |a|'s watch should already be
-        // implicitly cancelled (even though the notification will not have
-        // been invoked yet.)
-        EXPECT_EQ(MOJO_RESULT_OK,
-                  MojoArmWatcher(w, nullptr, nullptr, nullptr, nullptr));
-
-        // Nothing interesting should happen as a result of this.
-        EXPECT_EQ(MOJO_RESULT_OK, MojoClose(b));
-      },
-      w, a, b, c));
-
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoWatch(w, a, MOJO_HANDLE_SIGNAL_READABLE, readable_a_context));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoWatch(w, c, MOJO_HANDLE_SIGNAL_READABLE, readable_c_context));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoArmWatcher(w, nullptr, nullptr, nullptr, nullptr));
-
-  WriteMessage(d, kTestMessageToC);
-  event.Wait();
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(w));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(c));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(d));
-}
-
-TEST_F(WatcherTest, ExplicitCancelOtherFromNotificationCallback) {
-  MojoHandle a, b;
-  CreateMessagePipe(&a, &b);
-
-  MojoHandle c, d;
-  CreateMessagePipe(&c, &d);
-
-  static const char kTestMessageToA[] = "hi a";
-  static const char kTestMessageToC[] = "hi c";
-
-  base::WaitableEvent event(base::WaitableEvent::ResetPolicy::MANUAL,
-                            base::WaitableEvent::InitialState::NOT_SIGNALED);
-
-  WatchHelper helper;
-  MojoHandle w;
-  EXPECT_EQ(MOJO_RESULT_OK, helper.CreateWatcher(&w));
-
-  uintptr_t readable_a_context = helper.CreateContext(base::Bind(
-      [](MojoResult result, MojoHandleSignalsState state) { NOTREACHED(); }));
-
-  uintptr_t readable_c_context = helper.CreateContext(base::Bind(
-      [](base::WaitableEvent* event, uintptr_t readable_a_context, MojoHandle w,
-         MojoHandle a, MojoHandle b, MojoHandle c, MojoResult result,
-         MojoHandleSignalsState state) {
-        EXPECT_EQ(MOJO_RESULT_OK, result);
-        EXPECT_EQ(kTestMessageToC, ReadMessage(c));
-
-        // Now rearm the watcher.
-        EXPECT_EQ(MOJO_RESULT_OK,
-                  MojoArmWatcher(w, nullptr, nullptr, nullptr, nullptr));
-
-        // Should result in no notifications on the above context, because the
-        // watch will have been cancelled by the time the notification callback
-        // can execute.
-        WriteMessage(b, kTestMessageToA);
-        WriteMessage(b, kTestMessageToA);
-        EXPECT_EQ(MOJO_RESULT_OK, MojoCancelWatch(w, readable_a_context));
-
-        // Rearming should be fine now.
-        EXPECT_EQ(MOJO_RESULT_OK,
-                  MojoArmWatcher(w, nullptr, nullptr, nullptr, nullptr));
-
-        // Nothing interesting should happen as a result of these.
-        EXPECT_EQ(MOJO_RESULT_OK, MojoClose(a));
-        EXPECT_EQ(MOJO_RESULT_OK, MojoClose(b));
-
-        event->Signal();
-      },
-      &event, readable_a_context, w, a, b, c));
-
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoWatch(w, a, MOJO_HANDLE_SIGNAL_READABLE, readable_a_context));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoWatch(w, c, MOJO_HANDLE_SIGNAL_READABLE, readable_c_context));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoArmWatcher(w, nullptr, nullptr, nullptr, nullptr));
-
-  WriteMessage(d, kTestMessageToC);
-  event.Wait();
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(w));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(c));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(d));
-}
-
-TEST_F(WatcherTest, NestedCancellation) {
-  MojoHandle a, b;
-  CreateMessagePipe(&a, &b);
-
-  MojoHandle c, d;
-  CreateMessagePipe(&c, &d);
-
-  static const char kTestMessageToA[] = "hey a";
-  static const char kTestMessageToC[] = "hey c";
-  static const char kTestMessageToD[] = "hey d";
-
-  // This is a tricky test. It establishes a watch on |b| using one watcher and
-  // watches on |c| and |d| using another watcher.
-  //
-  // A message is written to |d| to wake up |c|'s watch, and the notification
-  // handler for that event does the following:
-  //   1. Writes to |a| to eventually wake up |b|'s watcher.
-  //   2. Rearms |c|'s watcher.
-  //   3. Writes to |d| to eventually wake up |c|'s watcher again.
-  //
-  // Meanwhile, |b|'s watch notification handler cancels |c|'s watch altogether
-  // before writing to |c| to wake up |d|.
-  //
-  // The net result should be that |c|'s context only gets notified once (from
-  // the first write to |d| above) and everyone else gets notified as expected.
-
-  MojoHandle b_watcher;
-  MojoHandle cd_watcher;
-  WatchHelper helper;
-  EXPECT_EQ(MOJO_RESULT_OK, helper.CreateWatcher(&b_watcher));
-  EXPECT_EQ(MOJO_RESULT_OK, helper.CreateWatcher(&cd_watcher));
-
-  base::WaitableEvent event(base::WaitableEvent::ResetPolicy::MANUAL,
-                            base::WaitableEvent::InitialState::NOT_SIGNALED);
-  uintptr_t readable_d_context = helper.CreateContext(base::Bind(
-      [](base::WaitableEvent* event, MojoHandle d, MojoResult result,
-         MojoHandleSignalsState state) {
-        EXPECT_EQ(MOJO_RESULT_OK, result);
-        EXPECT_EQ(kTestMessageToD, ReadMessage(d));
-        event->Signal();
-      },
-      &event, d));
-
-  static int num_expected_c_notifications = 1;
-  uintptr_t readable_c_context = helper.CreateContext(base::Bind(
-      [](MojoHandle cd_watcher, MojoHandle a, MojoHandle c, MojoHandle d,
-         MojoResult result, MojoHandleSignalsState state) {
-        EXPECT_EQ(MOJO_RESULT_OK, result);
-        EXPECT_GT(num_expected_c_notifications--, 0);
-
-        // Trigger an eventual |readable_b_context| notification.
-        WriteMessage(a, kTestMessageToA);
-
-        EXPECT_EQ(kTestMessageToC, ReadMessage(c));
-        EXPECT_EQ(MOJO_RESULT_OK, MojoArmWatcher(cd_watcher, nullptr, nullptr,
-                                                 nullptr, nullptr));
-
-        // Trigger another eventual |readable_c_context| notification.
-        WriteMessage(d, kTestMessageToC);
-      },
-      cd_watcher, a, c, d));
-
-  uintptr_t readable_b_context = helper.CreateContext(base::Bind(
-      [](MojoHandle cd_watcher, uintptr_t readable_c_context, MojoHandle c,
-         MojoResult result, MojoHandleSignalsState state) {
-        EXPECT_EQ(MOJO_RESULT_OK,
-                  MojoCancelWatch(cd_watcher, readable_c_context));
-
-        EXPECT_EQ(MOJO_RESULT_OK, MojoArmWatcher(cd_watcher, nullptr, nullptr,
-                                                 nullptr, nullptr));
-
-        WriteMessage(c, kTestMessageToD);
-      },
-      cd_watcher, readable_c_context, c));
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoWatch(b_watcher, b, MOJO_HANDLE_SIGNAL_READABLE,
-                                      readable_b_context));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoWatch(cd_watcher, c, MOJO_HANDLE_SIGNAL_READABLE,
-                      readable_c_context));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoWatch(cd_watcher, d, MOJO_HANDLE_SIGNAL_READABLE,
-                      readable_d_context));
-
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoArmWatcher(b_watcher, nullptr, nullptr, nullptr, nullptr));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoArmWatcher(cd_watcher, nullptr, nullptr, nullptr, nullptr));
-
-  WriteMessage(d, kTestMessageToC);
-  event.Wait();
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(cd_watcher));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(b_watcher));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(a));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(b));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(c));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(d));
-}
-
-TEST_F(WatcherTest, CancelSelfInNotificationCallback) {
-  MojoHandle a, b;
-  CreateMessagePipe(&a, &b);
-
-  static const char kTestMessageToA[] = "hey a";
-
-  MojoHandle w;
-  WatchHelper helper;
-  EXPECT_EQ(MOJO_RESULT_OK, helper.CreateWatcher(&w));
-
-  base::WaitableEvent event(base::WaitableEvent::ResetPolicy::MANUAL,
-                            base::WaitableEvent::InitialState::NOT_SIGNALED);
-
-  static uintptr_t readable_a_context = helper.CreateContext(base::Bind(
-      [](base::WaitableEvent* event, MojoHandle w, MojoHandle a,
-         MojoResult result, MojoHandleSignalsState state) {
-        EXPECT_EQ(MOJO_RESULT_OK, result);
-
-        // There should be no problem cancelling this watch from its own
-        // notification invocation.
-        EXPECT_EQ(MOJO_RESULT_OK, MojoCancelWatch(w, readable_a_context));
-        EXPECT_EQ(kTestMessageToA, ReadMessage(a));
-
-        // Arming should fail because there are no longer any registered
-        // watches on the watcher.
-        EXPECT_EQ(MOJO_RESULT_NOT_FOUND,
-                  MojoArmWatcher(w, nullptr, nullptr, nullptr, nullptr));
-
-        // And closing |a| should be fine (and should not invoke this
-        // notification with MOJO_RESULT_CANCELLED) for the same reason.
-        EXPECT_EQ(MOJO_RESULT_OK, MojoClose(a));
-
-        event->Signal();
-      },
-      &event, w, a));
-
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoWatch(w, a, MOJO_HANDLE_SIGNAL_READABLE, readable_a_context));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoArmWatcher(w, nullptr, nullptr, nullptr, nullptr));
-
-  WriteMessage(b, kTestMessageToA);
-  event.Wait();
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(b));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(w));
-}
-
-TEST_F(WatcherTest, CloseWatcherInNotificationCallback) {
-  MojoHandle a, b;
-  CreateMessagePipe(&a, &b);
-
-  static const char kTestMessageToA1[] = "hey a";
-  static const char kTestMessageToA2[] = "hey a again";
-
-  MojoHandle w;
-  WatchHelper helper;
-  EXPECT_EQ(MOJO_RESULT_OK, helper.CreateWatcher(&w));
-
-  base::WaitableEvent event(base::WaitableEvent::ResetPolicy::MANUAL,
-                            base::WaitableEvent::InitialState::NOT_SIGNALED);
-
-  uintptr_t readable_a_context = helper.CreateContext(base::Bind(
-      [](base::WaitableEvent* event, MojoHandle w, MojoHandle a, MojoHandle b,
-         MojoResult result, MojoHandleSignalsState state) {
-        EXPECT_EQ(MOJO_RESULT_OK, result);
-        EXPECT_EQ(kTestMessageToA1, ReadMessage(a));
-        EXPECT_EQ(MOJO_RESULT_OK,
-                  MojoArmWatcher(w, nullptr, nullptr, nullptr, nullptr));
-
-        // There should be no problem closing this watcher from its own
-        // notification callback.
-        EXPECT_EQ(MOJO_RESULT_OK, MojoClose(w));
-
-        // And these should not trigger more notifications, because |w| has been
-        // closed already.
-        WriteMessage(b, kTestMessageToA2);
-        EXPECT_EQ(MOJO_RESULT_OK, MojoClose(b));
-        EXPECT_EQ(MOJO_RESULT_OK, MojoClose(a));
-
-        event->Signal();
-      },
-      &event, w, a, b));
-
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoWatch(w, a, MOJO_HANDLE_SIGNAL_READABLE, readable_a_context));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoArmWatcher(w, nullptr, nullptr, nullptr, nullptr));
-
-  WriteMessage(b, kTestMessageToA1);
-  event.Wait();
-}
-
-TEST_F(WatcherTest, CloseWatcherAfterImplicitCancel) {
-  MojoHandle a, b;
-  CreateMessagePipe(&a, &b);
-
-  static const char kTestMessageToA[] = "hey a";
-
-  MojoHandle w;
-  WatchHelper helper;
-  EXPECT_EQ(MOJO_RESULT_OK, helper.CreateWatcher(&w));
-
-  base::WaitableEvent event(base::WaitableEvent::ResetPolicy::MANUAL,
-                            base::WaitableEvent::InitialState::NOT_SIGNALED);
-
-  uintptr_t readable_a_context = helper.CreateContext(base::Bind(
-      [](base::WaitableEvent* event, MojoHandle w, MojoHandle a,
-         MojoResult result, MojoHandleSignalsState state) {
-        EXPECT_EQ(MOJO_RESULT_OK, result);
-        EXPECT_EQ(kTestMessageToA, ReadMessage(a));
-        EXPECT_EQ(MOJO_RESULT_OK,
-                  MojoArmWatcher(w, nullptr, nullptr, nullptr, nullptr));
-
-        // This will cue up a notification for |MOJO_RESULT_CANCELLED|...
-        EXPECT_EQ(MOJO_RESULT_OK, MojoClose(a));
-
-        // ...but it should never fire because we close the watcher here.
-        EXPECT_EQ(MOJO_RESULT_OK, MojoClose(w));
-
-        event->Signal();
-      },
-      &event, w, a));
-
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoWatch(w, a, MOJO_HANDLE_SIGNAL_READABLE, readable_a_context));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoArmWatcher(w, nullptr, nullptr, nullptr, nullptr));
-
-  WriteMessage(b, kTestMessageToA);
-  event.Wait();
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(b));
-}
-
-TEST_F(WatcherTest, OtherThreadCancelDuringNotification) {
-  MojoHandle a, b;
-  CreateMessagePipe(&a, &b);
-
-  static const char kTestMessageToA[] = "hey a";
-
-  MojoHandle w;
-  WatchHelper helper;
-  EXPECT_EQ(MOJO_RESULT_OK, helper.CreateWatcher(&w));
-
-  base::WaitableEvent wait_for_notification(
-      base::WaitableEvent::ResetPolicy::MANUAL,
-      base::WaitableEvent::InitialState::NOT_SIGNALED);
-
-  base::WaitableEvent wait_for_cancellation(
-      base::WaitableEvent::ResetPolicy::MANUAL,
-      base::WaitableEvent::InitialState::NOT_SIGNALED);
-
-  static bool callback_done = false;
-  uintptr_t readable_a_context = helper.CreateContextWithCancel(
-      base::Bind(
-          [](base::WaitableEvent* wait_for_notification, MojoHandle w,
-             MojoHandle a, MojoResult result, MojoHandleSignalsState state) {
-            EXPECT_EQ(MOJO_RESULT_OK, result);
-            EXPECT_EQ(kTestMessageToA, ReadMessage(a));
-
-            wait_for_notification->Signal();
-
-            // Give the other thread sufficient time to race with the completion
-            // of this callback. There should be no race, since the cancellation
-            // notification must be mutually exclusive to this notification.
-            base::PlatformThread::Sleep(base::TimeDelta::FromSeconds(1));
-
-            callback_done = true;
-          },
-          &wait_for_notification, w, a),
-      base::Bind(
-          [](base::WaitableEvent* wait_for_cancellation) {
-            EXPECT_TRUE(callback_done);
-            wait_for_cancellation->Signal();
-          },
-          &wait_for_cancellation));
-
-  ThreadedRunner runner(base::Bind(
-      [](base::WaitableEvent* wait_for_notification,
-         base::WaitableEvent* wait_for_cancellation, MojoHandle w,
-         uintptr_t readable_a_context) {
-        wait_for_notification->Wait();
-
-        // Cancel the watch while the notification is still running.
-        EXPECT_EQ(MOJO_RESULT_OK, MojoCancelWatch(w, readable_a_context));
-
-        wait_for_cancellation->Wait();
-
-        EXPECT_TRUE(callback_done);
-      },
-      &wait_for_notification, &wait_for_cancellation, w, readable_a_context));
-  runner.Start();
-
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoWatch(w, a, MOJO_HANDLE_SIGNAL_READABLE, readable_a_context));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoArmWatcher(w, nullptr, nullptr, nullptr, nullptr));
-
-  WriteMessage(b, kTestMessageToA);
-  runner.Join();
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(b));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(w));
-}
-
-TEST_F(WatcherTest, WatchesCancelEachOtherFromNotifications) {
-  MojoHandle a, b;
-  CreateMessagePipe(&a, &b);
-
-  static const char kTestMessageToA[] = "hey a";
-  static const char kTestMessageToB[] = "hey b";
-
-  base::WaitableEvent wait_for_a_to_notify(
-      base::WaitableEvent::ResetPolicy::MANUAL,
-      base::WaitableEvent::InitialState::NOT_SIGNALED);
-  base::WaitableEvent wait_for_b_to_notify(
-      base::WaitableEvent::ResetPolicy::MANUAL,
-      base::WaitableEvent::InitialState::NOT_SIGNALED);
-  base::WaitableEvent wait_for_a_to_cancel(
-      base::WaitableEvent::ResetPolicy::MANUAL,
-      base::WaitableEvent::InitialState::NOT_SIGNALED);
-  base::WaitableEvent wait_for_b_to_cancel(
-      base::WaitableEvent::ResetPolicy::MANUAL,
-      base::WaitableEvent::InitialState::NOT_SIGNALED);
-
-  MojoHandle a_watcher;
-  MojoHandle b_watcher;
-  WatchHelper helper;
-  EXPECT_EQ(MOJO_RESULT_OK, helper.CreateWatcher(&a_watcher));
-  EXPECT_EQ(MOJO_RESULT_OK, helper.CreateWatcher(&b_watcher));
-
-  // We set up two watchers, one on |a| and one on |b|. They cancel each other
-  // from within their respective watch notifications. This should be safe,
-  // i.e., it should not deadlock, in spite of the fact that we also guarantee
-  // mutually exclusive notification execution (including cancellations) on any
-  // given watch.
-  bool a_cancelled = false;
-  bool b_cancelled = false;
-  static uintptr_t readable_b_context;
-  uintptr_t readable_a_context = helper.CreateContextWithCancel(
-      base::Bind(
-          [](base::WaitableEvent* wait_for_a_to_notify,
-             base::WaitableEvent* wait_for_b_to_notify, MojoHandle b_watcher,
-             MojoHandle a, MojoResult result, MojoHandleSignalsState state) {
-            EXPECT_EQ(MOJO_RESULT_OK, result);
-            EXPECT_EQ(kTestMessageToA, ReadMessage(a));
-            wait_for_a_to_notify->Signal();
-            wait_for_b_to_notify->Wait();
-            EXPECT_EQ(MOJO_RESULT_OK,
-                      MojoCancelWatch(b_watcher, readable_b_context));
-            EXPECT_EQ(MOJO_RESULT_OK, MojoClose(b_watcher));
-          },
-          &wait_for_a_to_notify, &wait_for_b_to_notify, b_watcher, a),
-      base::Bind(
-          [](base::WaitableEvent* wait_for_a_to_cancel,
-             base::WaitableEvent* wait_for_b_to_cancel, bool* a_cancelled) {
-            *a_cancelled = true;
-            wait_for_a_to_cancel->Signal();
-            wait_for_b_to_cancel->Wait();
-          },
-          &wait_for_a_to_cancel, &wait_for_b_to_cancel, &a_cancelled));
-
-  readable_b_context = helper.CreateContextWithCancel(
-      base::Bind(
-          [](base::WaitableEvent* wait_for_a_to_notify,
-             base::WaitableEvent* wait_for_b_to_notify,
-             uintptr_t readable_a_context, MojoHandle a_watcher, MojoHandle b,
-             MojoResult result, MojoHandleSignalsState state) {
-            EXPECT_EQ(MOJO_RESULT_OK, result);
-            EXPECT_EQ(kTestMessageToB, ReadMessage(b));
-            wait_for_b_to_notify->Signal();
-            wait_for_a_to_notify->Wait();
-            EXPECT_EQ(MOJO_RESULT_OK,
-                      MojoCancelWatch(a_watcher, readable_a_context));
-            EXPECT_EQ(MOJO_RESULT_OK, MojoClose(a_watcher));
-          },
-          &wait_for_a_to_notify, &wait_for_b_to_notify, readable_a_context,
-          a_watcher, b),
-      base::Bind(
-          [](base::WaitableEvent* wait_for_a_to_cancel,
-             base::WaitableEvent* wait_for_b_to_cancel, bool* b_cancelled) {
-            *b_cancelled = true;
-            wait_for_b_to_cancel->Signal();
-            wait_for_a_to_cancel->Wait();
-          },
-          &wait_for_a_to_cancel, &wait_for_b_to_cancel, &b_cancelled));
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoWatch(a_watcher, a, MOJO_HANDLE_SIGNAL_READABLE,
-                                      readable_a_context));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoArmWatcher(a_watcher, nullptr, nullptr, nullptr, nullptr));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoWatch(b_watcher, b, MOJO_HANDLE_SIGNAL_READABLE,
-                                      readable_b_context));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoArmWatcher(b_watcher, nullptr, nullptr, nullptr, nullptr));
-
-  ThreadedRunner runner(
-      base::Bind([](MojoHandle b) { WriteMessage(b, kTestMessageToA); }, b));
-  runner.Start();
-
-  WriteMessage(a, kTestMessageToB);
-
-  wait_for_a_to_cancel.Wait();
-  wait_for_b_to_cancel.Wait();
-  runner.Join();
-
-  EXPECT_TRUE(a_cancelled);
-  EXPECT_TRUE(b_cancelled);
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(a));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(b));
-}
-
-TEST_F(WatcherTest, AlwaysCancel) {
-  // Basic sanity check to ensure that all possible ways to cancel a watch
-  // result in a final MOJO_RESULT_CANCELLED notification.
-
-  MojoHandle a, b;
-  CreateMessagePipe(&a, &b);
-
-  MojoHandle w;
-  WatchHelper helper;
-  EXPECT_EQ(MOJO_RESULT_OK, helper.CreateWatcher(&w));
-
-  base::WaitableEvent event(base::WaitableEvent::ResetPolicy::MANUAL,
-                            base::WaitableEvent::InitialState::NOT_SIGNALED);
-  const base::Closure signal_event =
-      base::Bind(&base::WaitableEvent::Signal, base::Unretained(&event));
-
-  // Cancel via |MojoCancelWatch()|.
-  uintptr_t context = helper.CreateContextWithCancel(
-      WatchHelper::ContextCallback(), signal_event);
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoWatch(w, a, MOJO_HANDLE_SIGNAL_READABLE, context));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoCancelWatch(w, context));
-  event.Wait();
-  event.Reset();
-
-  // Cancel by closing the watched handle.
-  context = helper.CreateContextWithCancel(WatchHelper::ContextCallback(),
-                                           signal_event);
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoWatch(w, a, MOJO_HANDLE_SIGNAL_READABLE, context));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(a));
-  event.Wait();
-  event.Reset();
-
-  // Cancel by closing the watcher handle.
-  context = helper.CreateContextWithCancel(WatchHelper::ContextCallback(),
-                                           signal_event);
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoWatch(w, b, MOJO_HANDLE_SIGNAL_READABLE, context));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(w));
-  event.Wait();
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(b));
-}
-
-TEST_F(WatcherTest, ArmFailureCirculation) {
-  // Sanity check to ensure that all ready handles will eventually be returned
-  // over a finite number of calls to MojoArmWatcher().
-
-  constexpr size_t kNumTestPipes = 100;
-  constexpr size_t kNumTestHandles = kNumTestPipes * 2;
-  MojoHandle handles[kNumTestHandles];
-
-  // Create a bunch of pipes and make sure they're all readable.
-  for (size_t i = 0; i < kNumTestPipes; ++i) {
-    CreateMessagePipe(&handles[i], &handles[i + kNumTestPipes]);
-    WriteMessage(handles[i], "hey");
-    WriteMessage(handles[i + kNumTestPipes], "hay");
-    WaitForSignals(handles[i], MOJO_HANDLE_SIGNAL_READABLE);
-    WaitForSignals(handles[i + kNumTestPipes], MOJO_HANDLE_SIGNAL_READABLE);
-  }
-
-  // Create a watcher and watch all of them.
-  MojoHandle w;
-  EXPECT_EQ(MOJO_RESULT_OK, MojoCreateWatcher(&ExpectOnlyCancel, &w));
-  for (size_t i = 0; i < kNumTestHandles; ++i) {
-    EXPECT_EQ(MOJO_RESULT_OK,
-              MojoWatch(w, handles[i], MOJO_HANDLE_SIGNAL_READABLE, i));
-  }
-
-  // Keep trying to arm |w| until every watch gets an entry in |ready_contexts|.
-  // If MojoArmWatcher() is well-behaved, this should terminate eventually.
-  std::set<uintptr_t> ready_contexts;
-  while (ready_contexts.size() < kNumTestHandles) {
-    uint32_t num_ready_contexts = 1;
-    uintptr_t ready_context;
-    MojoResult ready_result;
-    MojoHandleSignalsState ready_state;
-    EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-              MojoArmWatcher(w, &num_ready_contexts, &ready_context,
-                             &ready_result, &ready_state));
-    EXPECT_EQ(1u, num_ready_contexts);
-    EXPECT_EQ(MOJO_RESULT_OK, ready_result);
-    ready_contexts.insert(ready_context);
-  }
-
-  for (size_t i = 0; i < kNumTestHandles; ++i)
-    EXPECT_EQ(MOJO_RESULT_OK, MojoClose(handles[i]));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(w));
-}
-
-}  // namespace
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/test/BUILD.gn b/mojo/edk/test/BUILD.gn
deleted file mode 100644
index a15456a..0000000
--- a/mojo/edk/test/BUILD.gn
+++ /dev/null
@@ -1,131 +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.
-
-import("//testing/test.gni")
-
-static_library("test_support") {
-  testonly = true
-  sources = [
-    "mojo_test_base.cc",
-    "mojo_test_base.h",
-    "test_utils.h",
-    "test_utils_posix.cc",
-    "test_utils_win.cc",
-  ]
-
-  if (!is_ios) {
-    sources += [
-      "multiprocess_test_helper.cc",
-      "multiprocess_test_helper.h",
-    ]
-  }
-
-  deps = [
-    "//base",
-    "//base/test:test_support",
-    "//mojo/edk/system",
-    "//mojo/public/cpp/system",
-    "//testing/gtest",
-  ]
-}
-
-source_set("run_all_unittests") {
-  testonly = true
-  sources = [
-    "run_all_unittests.cc",
-  ]
-
-  deps = [
-    ":test_support",
-    ":test_support_impl",
-    "//base",
-    "//base/test:test_support",
-    "//mojo/edk/system",
-    "//mojo/public/c/test_support",
-    "//testing/gtest",
-  ]
-
-  if (is_linux && !is_component_build) {
-    public_configs = [ "//build/config/gcc:rpath_for_built_shared_libraries" ]
-  }
-}
-
-source_set("run_all_perftests") {
-  testonly = true
-  deps = [
-    ":test_support_impl",
-    "//base",
-    "//base/test:test_support",
-    "//mojo/edk/system",
-    "//mojo/edk/test:test_support",
-    "//mojo/public/c/test_support",
-  ]
-
-  sources = [
-    "run_all_perftests.cc",
-  ]
-
-  if (is_linux && !is_component_build) {
-    public_configs = [ "//build/config/gcc:rpath_for_built_shared_libraries" ]
-  }
-}
-
-static_library("test_support_impl") {
-  testonly = true
-  deps = [
-    "//base",
-    "//base/test:test_support",
-    "//mojo/public/c/test_support",
-    "//mojo/public/cpp/system",
-  ]
-
-  sources = [
-    "test_support_impl.cc",
-    "test_support_impl.h",
-  ]
-}
-
-# Public SDK test targets follow. These targets are not defined within the
-# public SDK itself as running the unittests requires the EDK.
-# TODO(vtl): These don't really belong here. (They should be converted to
-# apptests, but even apart from that these targets belong somewhere else.)
-
-group("public_tests") {
-  testonly = true
-  deps = [
-    ":mojo_public_bindings_unittests",
-    ":mojo_public_system_perftests",
-    ":mojo_public_system_unittests",
-  ]
-}
-
-test("mojo_public_bindings_perftests") {
-  deps = [
-    ":run_all_perftests",
-    "//mojo/edk/test:test_support",
-    "//mojo/public/cpp/bindings/tests:perftests",
-  ]
-}
-
-test("mojo_public_bindings_unittests") {
-  deps = [
-    ":run_all_unittests",
-    "//mojo/edk/test:test_support",
-    "//mojo/public/cpp/bindings/tests",
-  ]
-}
-
-test("mojo_public_system_perftests") {
-  deps = [
-    ":run_all_perftests",
-    "//mojo/public/c/system/tests:perftests",
-  ]
-}
-
-test("mojo_public_system_unittests") {
-  deps = [
-    ":run_all_unittests",
-    "//mojo/public/cpp/system/tests",
-  ]
-}
diff --git a/mojo/edk/test/mojo_test_base.cc b/mojo/edk/test/mojo_test_base.cc
deleted file mode 100644
index 71a5e3b..0000000
--- a/mojo/edk/test/mojo_test_base.cc
+++ /dev/null
@@ -1,327 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/test/mojo_test_base.h"
-
-#include "base/memory/ptr_util.h"
-#include "base/memory/ref_counted.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "base/synchronization/waitable_event.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/system/handle_signals_state.h"
-#include "mojo/public/c/system/buffer.h"
-#include "mojo/public/c/system/data_pipe.h"
-#include "mojo/public/c/system/functions.h"
-#include "mojo/public/c/system/watcher.h"
-#include "mojo/public/cpp/system/wait.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-#include "base/mac/mach_port_broker.h"
-#endif
-
-namespace mojo {
-namespace edk {
-namespace test {
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-namespace {
-base::MachPortBroker* g_mach_broker = nullptr;
-}
-#endif
-
-MojoTestBase::MojoTestBase() {
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-  if (!g_mach_broker) {
-    g_mach_broker = new base::MachPortBroker("mojo_test");
-    CHECK(g_mach_broker->Init());
-    SetMachPortProvider(g_mach_broker);
-  }
-#endif
-}
-
-MojoTestBase::~MojoTestBase() {}
-
-MojoTestBase::ClientController& MojoTestBase::StartClient(
-    const std::string& client_name) {
-  clients_.push_back(base::MakeUnique<ClientController>(
-      client_name, this, process_error_callback_, launch_type_));
-  return *clients_.back();
-}
-
-MojoTestBase::ClientController::ClientController(
-    const std::string& client_name,
-    MojoTestBase* test,
-    const ProcessErrorCallback& process_error_callback,
-    LaunchType launch_type) {
-#if !defined(OS_IOS)
-#if defined(OS_MACOSX)
-  // This lock needs to be held while launching the child because the Mach port
-  // broker only allows task ports to be received from known child processes.
-  // However, it can only know the child process's pid after the child has
-  // launched. To prevent a race where the child process sends its task port
-  // before the pid has been registered, the lock needs to be held over both
-  // launch and child pid registration.
-  base::AutoLock lock(g_mach_broker->GetLock());
-#endif
-  helper_.set_process_error_callback(process_error_callback);
-  pipe_ = helper_.StartChild(client_name, launch_type);
-#if defined(OS_MACOSX)
-  g_mach_broker->AddPlaceholderForPid(helper_.test_child().Handle());
-#endif
-#endif
-}
-
-MojoTestBase::ClientController::~ClientController() {
-  CHECK(was_shutdown_)
-      << "Test clients should be waited on explicitly with WaitForShutdown().";
-}
-
-void MojoTestBase::ClientController::ClosePeerConnection() {
-#if !defined(OS_IOS)
-  helper_.ClosePeerConnection();
-#endif
-}
-
-int MojoTestBase::ClientController::WaitForShutdown() {
-  was_shutdown_ = true;
-#if !defined(OS_IOS)
-  int retval = helper_.WaitForChildShutdown();
-#if defined(OS_MACOSX)
-  base::AutoLock lock(g_mach_broker->GetLock());
-  g_mach_broker->InvalidatePid(helper_.test_child().Handle());
-#endif
-  return retval;
-#else
-  NOTREACHED();
-  return 1;
-#endif
-}
-
-// static
-void MojoTestBase::CloseHandle(MojoHandle h) {
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h));
-}
-
-// static
-void MojoTestBase::CreateMessagePipe(MojoHandle *p0, MojoHandle* p1) {
-  MojoCreateMessagePipe(nullptr, p0, p1);
-  CHECK_NE(*p0, MOJO_HANDLE_INVALID);
-  CHECK_NE(*p1, MOJO_HANDLE_INVALID);
-}
-
-// static
-void MojoTestBase::WriteMessageWithHandles(MojoHandle mp,
-                                           const std::string& message,
-                                           const MojoHandle *handles,
-                                           uint32_t num_handles) {
-  CHECK_EQ(MojoWriteMessage(mp, message.data(),
-                            static_cast<uint32_t>(message.size()),
-                            handles, num_handles, MOJO_WRITE_MESSAGE_FLAG_NONE),
-           MOJO_RESULT_OK);
-}
-
-// static
-void MojoTestBase::WriteMessage(MojoHandle mp, const std::string& message) {
-  WriteMessageWithHandles(mp, message, nullptr, 0);
-}
-
-// static
-std::string MojoTestBase::ReadMessageWithHandles(
-    MojoHandle mp,
-    MojoHandle* handles,
-    uint32_t expected_num_handles) {
-  CHECK_EQ(WaitForSignals(mp, MOJO_HANDLE_SIGNAL_READABLE), MOJO_RESULT_OK);
-
-  uint32_t message_size = 0;
-  uint32_t num_handles = 0;
-  CHECK_EQ(MojoReadMessage(mp, nullptr, &message_size, nullptr, &num_handles,
-                           MOJO_READ_MESSAGE_FLAG_NONE),
-           MOJO_RESULT_RESOURCE_EXHAUSTED);
-  CHECK_EQ(expected_num_handles, num_handles);
-
-  std::string message(message_size, 'x');
-  CHECK_EQ(MojoReadMessage(mp, &message[0], &message_size, handles,
-                           &num_handles, MOJO_READ_MESSAGE_FLAG_NONE),
-           MOJO_RESULT_OK);
-  CHECK_EQ(message_size, message.size());
-  CHECK_EQ(num_handles, expected_num_handles);
-
-  return message;
-}
-
-// static
-std::string MojoTestBase::ReadMessageWithOptionalHandle(MojoHandle mp,
-                                                        MojoHandle* handle) {
-  CHECK_EQ(WaitForSignals(mp, MOJO_HANDLE_SIGNAL_READABLE), MOJO_RESULT_OK);
-
-  uint32_t message_size = 0;
-  uint32_t num_handles = 0;
-  CHECK_EQ(MojoReadMessage(mp, nullptr, &message_size, nullptr, &num_handles,
-                           MOJO_READ_MESSAGE_FLAG_NONE),
-           MOJO_RESULT_RESOURCE_EXHAUSTED);
-  CHECK(num_handles == 0 || num_handles == 1);
-
-  CHECK(handle);
-
-  std::string message(message_size, 'x');
-  CHECK_EQ(MojoReadMessage(mp, &message[0], &message_size, handle,
-                           &num_handles, MOJO_READ_MESSAGE_FLAG_NONE),
-           MOJO_RESULT_OK);
-  CHECK_EQ(message_size, message.size());
-  CHECK(num_handles == 0 || num_handles == 1);
-
-  if (num_handles)
-    CHECK_NE(*handle, MOJO_HANDLE_INVALID);
-  else
-    *handle = MOJO_HANDLE_INVALID;
-
-  return message;
-}
-
-// static
-std::string MojoTestBase::ReadMessage(MojoHandle mp) {
-  return ReadMessageWithHandles(mp, nullptr, 0);
-}
-
-// static
-void MojoTestBase::ReadMessage(MojoHandle mp,
-                               char* data,
-                               size_t num_bytes) {
-  CHECK_EQ(WaitForSignals(mp, MOJO_HANDLE_SIGNAL_READABLE), MOJO_RESULT_OK);
-
-  uint32_t message_size = 0;
-  uint32_t num_handles = 0;
-  CHECK_EQ(MojoReadMessage(mp, nullptr, &message_size, nullptr, &num_handles,
-                           MOJO_READ_MESSAGE_FLAG_NONE),
-           MOJO_RESULT_RESOURCE_EXHAUSTED);
-  CHECK_EQ(num_handles, 0u);
-  CHECK_EQ(message_size, num_bytes);
-
-  CHECK_EQ(MojoReadMessage(mp, data, &message_size, nullptr, &num_handles,
-                           MOJO_READ_MESSAGE_FLAG_NONE),
-           MOJO_RESULT_OK);
-  CHECK_EQ(num_handles, 0u);
-  CHECK_EQ(message_size, num_bytes);
-}
-
-// static
-void MojoTestBase::VerifyTransmission(MojoHandle source,
-                                      MojoHandle dest,
-                                      const std::string& message) {
-  WriteMessage(source, message);
-
-  // We don't use EXPECT_EQ; failures on really long messages make life hard.
-  EXPECT_TRUE(message == ReadMessage(dest));
-}
-
-// static
-void MojoTestBase::VerifyEcho(MojoHandle mp,
-                              const std::string& message) {
-  VerifyTransmission(mp, mp, message);
-}
-
-// static
-MojoHandle MojoTestBase::CreateBuffer(uint64_t size) {
-  MojoHandle h;
-  EXPECT_EQ(MojoCreateSharedBuffer(nullptr, size, &h), MOJO_RESULT_OK);
-  return h;
-}
-
-// static
-MojoHandle MojoTestBase::DuplicateBuffer(MojoHandle h, bool read_only) {
-  MojoHandle new_handle;
-  MojoDuplicateBufferHandleOptions options = {
-    sizeof(MojoDuplicateBufferHandleOptions),
-    MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_NONE
-  };
-  if (read_only)
-    options.flags |= MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_READ_ONLY;
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoDuplicateBufferHandle(h, &options, &new_handle));
-  return new_handle;
-}
-
-// static
-void MojoTestBase::WriteToBuffer(MojoHandle h,
-                                 size_t offset,
-                                 const base::StringPiece& s) {
-  char* data;
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoMapBuffer(h, offset, s.size(), reinterpret_cast<void**>(&data),
-                          MOJO_MAP_BUFFER_FLAG_NONE));
-  memcpy(data, s.data(), s.size());
-  EXPECT_EQ(MOJO_RESULT_OK, MojoUnmapBuffer(static_cast<void*>(data)));
-}
-
-// static
-void MojoTestBase::ExpectBufferContents(MojoHandle h,
-                                        size_t offset,
-                                        const base::StringPiece& s) {
-  char* data;
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoMapBuffer(h, offset, s.size(), reinterpret_cast<void**>(&data),
-                          MOJO_MAP_BUFFER_FLAG_NONE));
-  EXPECT_EQ(s, base::StringPiece(data, s.size()));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoUnmapBuffer(static_cast<void*>(data)));
-}
-
-// static
-void MojoTestBase::CreateDataPipe(MojoHandle *p0,
-                                  MojoHandle* p1,
-                                  size_t capacity) {
-  MojoCreateDataPipeOptions options;
-  options.struct_size = static_cast<uint32_t>(sizeof(options));
-  options.flags = MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE;
-  options.element_num_bytes = 1;
-  options.capacity_num_bytes = static_cast<uint32_t>(capacity);
-
-  MojoCreateDataPipe(&options, p0, p1);
-  CHECK_NE(*p0, MOJO_HANDLE_INVALID);
-  CHECK_NE(*p1, MOJO_HANDLE_INVALID);
-}
-
-// static
-void MojoTestBase::WriteData(MojoHandle producer, const std::string& data) {
-  CHECK_EQ(WaitForSignals(producer, MOJO_HANDLE_SIGNAL_WRITABLE),
-           MOJO_RESULT_OK);
-  uint32_t num_bytes = static_cast<uint32_t>(data.size());
-  CHECK_EQ(MojoWriteData(producer, data.data(), &num_bytes,
-                         MOJO_WRITE_DATA_FLAG_ALL_OR_NONE),
-           MOJO_RESULT_OK);
-  CHECK_EQ(num_bytes, static_cast<uint32_t>(data.size()));
-}
-
-// static
-std::string MojoTestBase::ReadData(MojoHandle consumer, size_t size) {
-  CHECK_EQ(WaitForSignals(consumer, MOJO_HANDLE_SIGNAL_READABLE),
-           MOJO_RESULT_OK);
-  std::vector<char> buffer(size);
-  uint32_t num_bytes = static_cast<uint32_t>(size);
-  CHECK_EQ(MojoReadData(consumer, buffer.data(), &num_bytes,
-                         MOJO_WRITE_DATA_FLAG_ALL_OR_NONE),
-           MOJO_RESULT_OK);
-  CHECK_EQ(num_bytes, static_cast<uint32_t>(size));
-
-  return std::string(buffer.data(), buffer.size());
-}
-
-// static
-MojoHandleSignalsState MojoTestBase::GetSignalsState(MojoHandle handle) {
-  MojoHandleSignalsState signals_state;
-  CHECK_EQ(MOJO_RESULT_OK, MojoQueryHandleSignalsState(handle, &signals_state));
-  return signals_state;
-}
-
-// static
-MojoResult MojoTestBase::WaitForSignals(MojoHandle handle,
-                                        MojoHandleSignals signals,
-                                        MojoHandleSignalsState* state) {
-  return Wait(Handle(handle), signals, state);
-}
-
-}  // namespace test
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/test/mojo_test_base.h b/mojo/edk/test/mojo_test_base.h
deleted file mode 100644
index 35e2c2b..0000000
--- a/mojo/edk/test/mojo_test_base.h
+++ /dev/null
@@ -1,249 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_EDK_TEST_MOJO_TEST_BASE_H_
-#define MOJO_EDK_TEST_MOJO_TEST_BASE_H_
-
-#include <memory>
-#include <string>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/test/multiprocess_test_helper.h"
-#include "mojo/public/c/system/types.h"
-#include "mojo/public/cpp/system/message_pipe.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace edk {
-namespace test {
-
-class MojoTestBase : public testing::Test {
- public:
-  MojoTestBase();
-  ~MojoTestBase() override;
-
-  using LaunchType = MultiprocessTestHelper::LaunchType;
-  using HandlerCallback = base::Callback<void(ScopedMessagePipeHandle)>;
-
-  class ClientController {
-   public:
-    ClientController(const std::string& client_name,
-                     MojoTestBase* test,
-                     const ProcessErrorCallback& process_error_callback,
-                     LaunchType launch_type);
-    ~ClientController();
-
-    MojoHandle pipe() const { return pipe_.get().value(); }
-
-    void ClosePeerConnection();
-    int WaitForShutdown();
-
-   private:
-    friend class MojoTestBase;
-
-#if !defined(OS_IOS)
-    MultiprocessTestHelper helper_;
-#endif
-    ScopedMessagePipeHandle pipe_;
-    bool was_shutdown_ = false;
-
-    DISALLOW_COPY_AND_ASSIGN(ClientController);
-  };
-
-  // Set the callback to handle bad messages received from test client
-  // processes. This can be set to a different callback before starting each
-  // client.
-  void set_process_error_callback(const ProcessErrorCallback& callback) {
-    process_error_callback_ = callback;
-  }
-
-  ClientController& StartClient(const std::string& client_name);
-
-  template <typename HandlerFunc>
-  void StartClientWithHandler(const std::string& client_name,
-                              HandlerFunc handler) {
-    int expected_exit_code = 0;
-    ClientController& c = StartClient(client_name);
-    handler(c.pipe(), &expected_exit_code);
-    EXPECT_EQ(expected_exit_code, c.WaitForShutdown());
-  }
-
-  // Closes a handle and expects success.
-  static void CloseHandle(MojoHandle h);
-
-  ////// Message pipe test utilities ///////
-
-  // Creates a new pipe, returning endpoint handles in |p0| and |p1|.
-  static void CreateMessagePipe(MojoHandle* p0, MojoHandle* p1);
-
-  // Writes a string to the pipe, transferring handles in the process.
-  static void WriteMessageWithHandles(MojoHandle mp,
-                                     const std::string& message,
-                                     const MojoHandle* handles,
-                                     uint32_t num_handles);
-
-  // Writes a string to the pipe with no handles.
-  static void WriteMessage(MojoHandle mp, const std::string& message);
-
-  // Reads a string from the pipe, expecting to read an exact number of handles
-  // in the process. Returns the read string.
-  static std::string ReadMessageWithHandles(MojoHandle mp,
-                                           MojoHandle* handles,
-                                           uint32_t expected_num_handles);
-
-  // Reads a string from the pipe, expecting either zero or one handles.
-  // If no handle is read, |handle| will be reset.
-  static std::string ReadMessageWithOptionalHandle(MojoHandle mp,
-                                                  MojoHandle* handle);
-
-  // Reads a string from the pipe, expecting to read no handles.
-  // Returns the string.
-  static std::string ReadMessage(MojoHandle mp);
-
-  // Reads a string from the pipe, expecting to read no handles and exactly
-  // |num_bytes| bytes, which are read into |data|.
-  static void ReadMessage(MojoHandle mp, char* data, size_t num_bytes);
-
-  // Writes |message| to |in| and expects to read it back from |out|.
-  static void VerifyTransmission(MojoHandle in,
-                                 MojoHandle out,
-                                 const std::string& message);
-
-  // Writes |message| to |mp| and expects to read it back from the same handle.
-  static void VerifyEcho(MojoHandle mp, const std::string& message);
-
-  //////// Shared buffer test utilities /////////
-
-  // Creates a new shared buffer.
-  static MojoHandle CreateBuffer(uint64_t size);
-
-  // Duplicates a shared buffer to a new handle.
-  static MojoHandle DuplicateBuffer(MojoHandle h, bool read_only);
-
-  // Maps a buffer, writes some data into it, and unmaps it.
-  static void WriteToBuffer(MojoHandle h,
-                            size_t offset,
-                            const base::StringPiece& s);
-
-  // Maps a buffer, tests the value of some of its contents, and unmaps it.
-  static void ExpectBufferContents(MojoHandle h,
-                                   size_t offset,
-                                   const base::StringPiece& s);
-
-  //////// Data pipe test utilities /////////
-
-  // Creates a new data pipe.
-  static void CreateDataPipe(MojoHandle* producer,
-                             MojoHandle* consumer,
-                             size_t capacity);
-
-  // Writes data to a data pipe.
-  static void WriteData(MojoHandle producer, const std::string& data);
-
-  // Reads data from a data pipe.
-  static std::string ReadData(MojoHandle consumer, size_t size);
-
-  // Queries the signals state of |handle|.
-  static MojoHandleSignalsState GetSignalsState(MojoHandle handle);
-
-  // Helper to block the calling thread waiting for signals to be raised.
-  static MojoResult WaitForSignals(MojoHandle handle,
-                                   MojoHandleSignals signals,
-                                   MojoHandleSignalsState* state = nullptr);
-
-  void set_launch_type(LaunchType launch_type) { launch_type_ = launch_type; }
-
- private:
-  friend class ClientController;
-
-  std::vector<std::unique_ptr<ClientController>> clients_;
-
-  ProcessErrorCallback process_error_callback_;
-
-  LaunchType launch_type_ = LaunchType::CHILD;
-
-  DISALLOW_COPY_AND_ASSIGN(MojoTestBase);
-};
-
-// Launches a new child process running the test client |client_name| connected
-// to a new message pipe bound to |pipe_name|. |pipe_name| is automatically
-// closed on test teardown.
-#define RUN_CHILD_ON_PIPE(client_name, pipe_name)                   \
-    StartClientWithHandler(                                         \
-        #client_name,                                               \
-        [&](MojoHandle pipe_name, int *expected_exit_code) { {
-
-// Waits for the client to terminate and expects a return code of zero.
-#define END_CHILD()               \
-        }                         \
-        *expected_exit_code = 0;  \
-    });
-
-// Wait for the client to terminate with a specific return code.
-#define END_CHILD_AND_EXPECT_EXIT_CODE(code) \
-        }                                    \
-        *expected_exit_code = code;          \
-    });
-
-// Use this to declare the child process's "main()" function for tests using
-// MojoTestBase and MultiprocessTestHelper. It returns an |int|, which will
-// will be the process's exit code (but see the comment about
-// WaitForChildShutdown()).
-//
-// The function is defined as a subclass of |test_base| to facilitate shared
-// code between test clients and to allow clients to spawn children themselves.
-//
-// |pipe_name| will be bound to the MojoHandle of a message pipe connected
-// to the parent process (see RUN_CHILD_ON_PIPE above.) This pipe handle is
-// automatically closed on test client teardown.
-#if !defined(OS_IOS)
-#define DEFINE_TEST_CLIENT_WITH_PIPE(client_name, test_base, pipe_name)     \
-  class client_name##_MainFixture : public test_base {                      \
-    void TestBody() override {}                                             \
-   public:                                                                  \
-    int Main(MojoHandle);                                                   \
-  };                                                                        \
-  MULTIPROCESS_TEST_MAIN_WITH_SETUP(                                        \
-      client_name##TestChildMain,                                           \
-      ::mojo::edk::test::MultiprocessTestHelper::ChildSetup) {              \
-    client_name##_MainFixture test;                                         \
-    return ::mojo::edk::test::MultiprocessTestHelper::RunClientMain(        \
-        base::Bind(&client_name##_MainFixture::Main,                        \
-                   base::Unretained(&test)));                               \
-  }                                                                         \
-  int client_name##_MainFixture::Main(MojoHandle pipe_name)
-
-// This is a version of DEFINE_TEST_CLIENT_WITH_PIPE which can be used with
-// gtest ASSERT/EXPECT macros.
-#define DEFINE_TEST_CLIENT_TEST_WITH_PIPE(client_name, test_base, pipe_name) \
-  class client_name##_MainFixture : public test_base {                       \
-    void TestBody() override {}                                              \
-   public:                                                                   \
-    void Main(MojoHandle);                                                   \
-  };                                                                         \
-  MULTIPROCESS_TEST_MAIN_WITH_SETUP(                                         \
-      client_name##TestChildMain,                                            \
-      ::mojo::edk::test::MultiprocessTestHelper::ChildSetup) {               \
-    client_name##_MainFixture test;                                          \
-    return ::mojo::edk::test::MultiprocessTestHelper::RunClientTestMain(     \
-        base::Bind(&client_name##_MainFixture::Main,                         \
-                   base::Unretained(&test)));                                \
-  }                                                                          \
-  void client_name##_MainFixture::Main(MojoHandle pipe_name)
-#else  // !defined(OS_IOS)
-#define DEFINE_TEST_CLIENT_WITH_PIPE(client_name, test_base, pipe_name)
-#define DEFINE_TEST_CLIENT_TEST_WITH_PIPE(client_name, test_base, pipe_name)
-#endif  // !defined(OS_IOS)
-
-}  // namespace test
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_TEST_MOJO_TEST_BASE_H_
diff --git a/mojo/edk/test/multiprocess_test_helper.cc b/mojo/edk/test/multiprocess_test_helper.cc
deleted file mode 100644
index cf37782..0000000
--- a/mojo/edk/test/multiprocess_test_helper.cc
+++ /dev/null
@@ -1,263 +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 "mojo/edk/test/multiprocess_test_helper.h"
-
-#include <functional>
-#include <set>
-#include <utility>
-
-#include "base/base_paths.h"
-#include "base/base_switches.h"
-#include "base/bind.h"
-#include "base/command_line.h"
-#include "base/files/file_path.h"
-#include "base/logging.h"
-#include "base/memory/ref_counted.h"
-#include "base/path_service.h"
-#include "base/process/kill.h"
-#include "base/process/process_handle.h"
-#include "base/run_loop.h"
-#include "base/strings/stringprintf.h"
-#include "base/task_runner.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "build/build_config.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/embedder/named_platform_handle.h"
-#include "mojo/edk/embedder/named_platform_handle_utils.h"
-#include "mojo/edk/embedder/pending_process_connection.h"
-#include "mojo/edk/embedder/platform_channel_pair.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-#if defined(OS_WIN)
-#include "base/win/windows_version.h"
-#elif defined(OS_MACOSX) && !defined(OS_IOS)
-#include "base/mac/mach_port_broker.h"
-#endif
-
-namespace mojo {
-namespace edk {
-namespace test {
-
-namespace {
-
-const char kMojoPrimordialPipeToken[] = "mojo-primordial-pipe-token";
-const char kMojoNamedPipeName[] = "mojo-named-pipe-name";
-
-template <typename Func>
-int RunClientFunction(Func handler, bool pass_pipe_ownership_to_main) {
-  CHECK(MultiprocessTestHelper::primordial_pipe.is_valid());
-  ScopedMessagePipeHandle pipe =
-      std::move(MultiprocessTestHelper::primordial_pipe);
-  MessagePipeHandle pipe_handle =
-      pass_pipe_ownership_to_main ? pipe.release() : pipe.get();
-  return handler(pipe_handle.value());
-}
-
-}  // namespace
-
-MultiprocessTestHelper::MultiprocessTestHelper() {}
-
-MultiprocessTestHelper::~MultiprocessTestHelper() {
-  CHECK(!test_child_.process.IsValid());
-}
-
-ScopedMessagePipeHandle MultiprocessTestHelper::StartChild(
-    const std::string& test_child_name,
-    LaunchType launch_type) {
-  return StartChildWithExtraSwitch(test_child_name, std::string(),
-                                   std::string(), launch_type);
-}
-
-ScopedMessagePipeHandle MultiprocessTestHelper::StartChildWithExtraSwitch(
-    const std::string& test_child_name,
-    const std::string& switch_string,
-    const std::string& switch_value,
-    LaunchType launch_type) {
-  CHECK(!test_child_name.empty());
-  CHECK(!test_child_.process.IsValid());
-
-  std::string test_child_main = test_child_name + "TestChildMain";
-
-  // Manually construct the new child's commandline to avoid copying unwanted
-  // values.
-  base::CommandLine command_line(
-      base::GetMultiProcessTestChildBaseCommandLine().GetProgram());
-
-  std::set<std::string> uninherited_args;
-  uninherited_args.insert("mojo-platform-channel-handle");
-  uninherited_args.insert(switches::kTestChildProcess);
-
-  // Copy commandline switches from the parent process, except for the
-  // multiprocess client name and mojo message pipe handle; this allows test
-  // clients to spawn other test clients.
-  for (const auto& entry :
-          base::CommandLine::ForCurrentProcess()->GetSwitches()) {
-    if (uninherited_args.find(entry.first) == uninherited_args.end())
-      command_line.AppendSwitchNative(entry.first, entry.second);
-  }
-
-  PlatformChannelPair channel;
-  NamedPlatformHandle named_pipe;
-  HandlePassingInformation handle_passing_info;
-  if (launch_type == LaunchType::CHILD || launch_type == LaunchType::PEER) {
-    channel.PrepareToPassClientHandleToChildProcess(&command_line,
-                                                    &handle_passing_info);
-  } else if (launch_type == LaunchType::NAMED_CHILD ||
-             launch_type == LaunchType::NAMED_PEER) {
-#if defined(OS_POSIX)
-    base::FilePath temp_dir;
-    CHECK(base::PathService::Get(base::DIR_TEMP, &temp_dir));
-    named_pipe = NamedPlatformHandle(
-        temp_dir.AppendASCII(GenerateRandomToken()).value());
-#else
-    named_pipe = NamedPlatformHandle(GenerateRandomToken());
-#endif
-    command_line.AppendSwitchNative(kMojoNamedPipeName, named_pipe.name);
-  }
-
-  if (!switch_string.empty()) {
-    CHECK(!command_line.HasSwitch(switch_string));
-    if (!switch_value.empty())
-      command_line.AppendSwitchASCII(switch_string, switch_value);
-    else
-      command_line.AppendSwitch(switch_string);
-  }
-
-  base::LaunchOptions options;
-#if defined(OS_POSIX)
-  options.fds_to_remap = &handle_passing_info;
-#elif defined(OS_WIN)
-  options.start_hidden = true;
-  if (base::win::GetVersion() >= base::win::VERSION_VISTA)
-    options.handles_to_inherit = &handle_passing_info;
-  else
-    options.inherit_handles = true;
-#else
-#error "Not supported yet."
-#endif
-
-  // NOTE: In the case of named pipes, it's important that the server handle be
-  // created before the child process is launched; otherwise the server binding
-  // the pipe path can race with child's connection to the pipe.
-  ScopedPlatformHandle server_handle;
-  if (launch_type == LaunchType::CHILD || launch_type == LaunchType::PEER) {
-    server_handle = channel.PassServerHandle();
-  } else if (launch_type == LaunchType::NAMED_CHILD ||
-             launch_type == LaunchType::NAMED_PEER) {
-    server_handle = CreateServerHandle(named_pipe);
-  }
-
-  PendingProcessConnection process;
-  ScopedMessagePipeHandle pipe;
-  if (launch_type == LaunchType::CHILD ||
-      launch_type == LaunchType::NAMED_CHILD) {
-    std::string pipe_token;
-    pipe = process.CreateMessagePipe(&pipe_token);
-    command_line.AppendSwitchASCII(kMojoPrimordialPipeToken, pipe_token);
-  } else if (launch_type == LaunchType::PEER ||
-             launch_type == LaunchType::NAMED_PEER) {
-    peer_token_ = mojo::edk::GenerateRandomToken();
-    pipe = ConnectToPeerProcess(std::move(server_handle), peer_token_);
-  }
-
-  test_child_ =
-      base::SpawnMultiProcessTestChild(test_child_main, command_line, options);
-  if (launch_type == LaunchType::CHILD || launch_type == LaunchType::PEER)
-    channel.ChildProcessLaunched();
-
-  if (launch_type == LaunchType::CHILD ||
-      launch_type == LaunchType::NAMED_CHILD) {
-    DCHECK(server_handle.is_valid());
-    process.Connect(test_child_.process.Handle(),
-                    ConnectionParams(std::move(server_handle)),
-                    process_error_callback_);
-  }
-
-  CHECK(test_child_.process.IsValid());
-  return pipe;
-}
-
-int MultiprocessTestHelper::WaitForChildShutdown() {
-  CHECK(test_child_.process.IsValid());
-
-  int rv = -1;
-  WaitForMultiprocessTestChildExit(test_child_.process,
-                                   TestTimeouts::action_timeout(), &rv);
-  test_child_.process.Close();
-  return rv;
-}
-
-void MultiprocessTestHelper::ClosePeerConnection() {
-  DCHECK(!peer_token_.empty());
-  ::mojo::edk::ClosePeerConnection(peer_token_);
-  peer_token_.clear();
-}
-
-bool MultiprocessTestHelper::WaitForChildTestShutdown() {
-  return WaitForChildShutdown() == 0;
-}
-
-// static
-void MultiprocessTestHelper::ChildSetup() {
-  CHECK(base::CommandLine::InitializedForCurrentProcess());
-
-  std::string primordial_pipe_token =
-      base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
-          kMojoPrimordialPipeToken);
-  NamedPlatformHandle named_pipe(
-      base::CommandLine::ForCurrentProcess()->GetSwitchValueNative(
-          kMojoNamedPipeName));
-  if (!primordial_pipe_token.empty()) {
-    primordial_pipe = CreateChildMessagePipe(primordial_pipe_token);
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-    CHECK(base::MachPortBroker::ChildSendTaskPortToParent("mojo_test"));
-#endif
-    if (named_pipe.is_valid()) {
-      SetParentPipeHandle(CreateClientHandle(named_pipe));
-    } else {
-      SetParentPipeHandle(
-          PlatformChannelPair::PassClientHandleFromParentProcess(
-              *base::CommandLine::ForCurrentProcess()));
-    }
-  } else {
-    if (named_pipe.is_valid()) {
-      primordial_pipe = ConnectToPeerProcess(CreateClientHandle(named_pipe));
-    } else {
-      primordial_pipe = ConnectToPeerProcess(
-          PlatformChannelPair::PassClientHandleFromParentProcess(
-              *base::CommandLine::ForCurrentProcess()));
-    }
-  }
-}
-
-// static
-int MultiprocessTestHelper::RunClientMain(
-    const base::Callback<int(MojoHandle)>& main,
-    bool pass_pipe_ownership_to_main) {
-  return RunClientFunction(
-      [main](MojoHandle handle) { return main.Run(handle); },
-      pass_pipe_ownership_to_main);
-}
-
-// static
-int MultiprocessTestHelper::RunClientTestMain(
-    const base::Callback<void(MojoHandle)>& main) {
-  return RunClientFunction(
-      [main](MojoHandle handle) {
-        main.Run(handle);
-        return (::testing::Test::HasFatalFailure() ||
-                ::testing::Test::HasNonfatalFailure())
-                   ? 1
-                   : 0;
-      },
-      true /* close_pipe_on_exit */);
-}
-
-// static
-mojo::ScopedMessagePipeHandle MultiprocessTestHelper::primordial_pipe;
-
-}  // namespace test
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/test/multiprocess_test_helper.h b/mojo/edk/test/multiprocess_test_helper.h
deleted file mode 100644
index dc1c9bc..0000000
--- a/mojo/edk/test/multiprocess_test_helper.h
+++ /dev/null
@@ -1,110 +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 MOJO_EDK_TEST_MULTIPROCESS_TEST_HELPER_H_
-#define MOJO_EDK_TEST_MULTIPROCESS_TEST_HELPER_H_
-
-#include <string>
-
-#include "base/callback.h"
-#include "base/macros.h"
-#include "base/process/process.h"
-#include "base/test/multiprocess_test.h"
-#include "base/test/test_timeouts.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/public/cpp/system/message_pipe.h"
-#include "testing/multiprocess_func_list.h"
-
-namespace mojo {
-
-namespace edk {
-
-namespace test {
-
-class MultiprocessTestHelper {
- public:
-  using HandlerCallback = base::Callback<void(ScopedMessagePipeHandle)>;
-
-  enum class LaunchType {
-    // Launch the child process as a child in the mojo system.
-    CHILD,
-
-    // Launch the child process as an unrelated peer process in the mojo system.
-    PEER,
-
-    // Launch the child process as a child in the mojo system, using a named
-    // pipe.
-    NAMED_CHILD,
-
-    // Launch the child process as an unrelated peer process in the mojo
-    // system, using a named pipe.
-    NAMED_PEER,
-  };
-
-  MultiprocessTestHelper();
-  ~MultiprocessTestHelper();
-
-  // Start a child process and run the "main" function "named" |test_child_name|
-  // declared using |MOJO_MULTIPROCESS_TEST_CHILD_MAIN()| or
-  // |MOJO_MULTIPROCESS_TEST_CHILD_TEST()| (below).
-  ScopedMessagePipeHandle StartChild(
-      const std::string& test_child_name,
-      LaunchType launch_type = LaunchType::CHILD);
-
-  // Like |StartChild()|, but appends an extra switch (with ASCII value) to the
-  // command line. (The switch must not already be present in the default
-  // command line.)
-  ScopedMessagePipeHandle StartChildWithExtraSwitch(
-      const std::string& test_child_name,
-      const std::string& switch_string,
-      const std::string& switch_value,
-      LaunchType launch_type);
-
-  void set_process_error_callback(const ProcessErrorCallback& callback) {
-    process_error_callback_ = callback;
-  }
-
-  void ClosePeerConnection();
-
-  // Wait for the child process to terminate.
-  // Returns the exit code of the child process. Note that, though it's declared
-  // to be an |int|, the exit code is subject to mangling by the OS. E.g., we
-  // usually return -1 on error in the child (e.g., if |test_child_name| was not
-  // found), but this is mangled to 255 on Linux. You should only rely on codes
-  // 0-127 being preserved, and -1 being outside the range 0-127.
-  int WaitForChildShutdown();
-
-  // Like |WaitForChildShutdown()|, but returns true on success (exit code of 0)
-  // and false otherwise. You probably want to do something like
-  // |EXPECT_TRUE(WaitForChildTestShutdown());|.
-  bool WaitForChildTestShutdown();
-
-  const base::Process& test_child() const { return test_child_.process; }
-
-  // Used by macros in mojo/edk/test/mojo_test_base.h to support multiprocess
-  // test client initialization.
-  static void ChildSetup();
-  static int RunClientMain(const base::Callback<int(MojoHandle)>& main,
-                           bool pass_pipe_ownership_to_main = false);
-  static int RunClientTestMain(const base::Callback<void(MojoHandle)>& main);
-
-  // For use (and only valid) in the child process:
-  static mojo::ScopedMessagePipeHandle primordial_pipe;
-
- private:
-  // Valid after |StartChild()| and before |WaitForChildShutdown()|.
-  base::SpawnChildResult test_child_;
-
-  ProcessErrorCallback process_error_callback_;
-
-  std::string peer_token_;
-
-  DISALLOW_COPY_AND_ASSIGN(MultiprocessTestHelper);
-};
-
-}  // namespace test
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_TEST_MULTIPROCESS_TEST_HELPER_H_
diff --git a/mojo/edk/test/multiprocess_test_helper_unittest.cc b/mojo/edk/test/multiprocess_test_helper_unittest.cc
deleted file mode 100644
index f7e9e83..0000000
--- a/mojo/edk/test/multiprocess_test_helper_unittest.cc
+++ /dev/null
@@ -1,165 +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 "mojo/edk/test/multiprocess_test_helper.h"
-
-#include <stddef.h>
-
-#include <utility>
-
-#include "base/logging.h"
-#include "build/build_config.h"
-#include "mojo/edk/embedder/scoped_platform_handle.h"
-#include "mojo/edk/system/test_utils.h"
-#include "mojo/edk/test/test_utils.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-#if defined(OS_POSIX)
-#include <fcntl.h>
-#endif
-
-namespace mojo {
-namespace edk {
-namespace test {
-namespace {
-
-bool IsNonBlocking(const PlatformHandle& handle) {
-#if defined(OS_WIN)
-  // Haven't figured out a way to query whether a HANDLE was created with
-  // FILE_FLAG_OVERLAPPED.
-  return true;
-#else
-  return fcntl(handle.handle, F_GETFL) & O_NONBLOCK;
-#endif
-}
-
-bool WriteByte(const PlatformHandle& handle, char c) {
-  size_t bytes_written = 0;
-  BlockingWrite(handle, &c, 1, &bytes_written);
-  return bytes_written == 1;
-}
-
-bool ReadByte(const PlatformHandle& handle, char* c) {
-  size_t bytes_read = 0;
-  BlockingRead(handle, c, 1, &bytes_read);
-  return bytes_read == 1;
-}
-
-using MultiprocessTestHelperTest = testing::Test;
-
-TEST_F(MultiprocessTestHelperTest, RunChild) {
-  MultiprocessTestHelper helper;
-  EXPECT_TRUE(helper.server_platform_handle.is_valid());
-
-  helper.StartChild("RunChild");
-  EXPECT_EQ(123, helper.WaitForChildShutdown());
-}
-
-MOJO_MULTIPROCESS_TEST_CHILD_MAIN(RunChild) {
-  CHECK(MultiprocessTestHelper::client_platform_handle.is_valid());
-  return 123;
-}
-
-TEST_F(MultiprocessTestHelperTest, TestChildMainNotFound) {
-  MultiprocessTestHelper helper;
-  helper.StartChild("NoSuchTestChildMain");
-  int result = helper.WaitForChildShutdown();
-  EXPECT_FALSE(result >= 0 && result <= 127);
-}
-
-TEST_F(MultiprocessTestHelperTest, PassedChannel) {
-  MultiprocessTestHelper helper;
-  EXPECT_TRUE(helper.server_platform_handle.is_valid());
-  helper.StartChild("PassedChannel");
-
-  // Take ownership of the handle.
-  ScopedPlatformHandle handle = std::move(helper.server_platform_handle);
-
-  // The handle should be non-blocking.
-  EXPECT_TRUE(IsNonBlocking(handle.get()));
-
-  // Write a byte.
-  const char c = 'X';
-  EXPECT_TRUE(WriteByte(handle.get(), c));
-
-  // It'll echo it back to us, incremented.
-  char d = 0;
-  EXPECT_TRUE(ReadByte(handle.get(), &d));
-  EXPECT_EQ(c + 1, d);
-
-  // And return it, incremented again.
-  EXPECT_EQ(c + 2, helper.WaitForChildShutdown());
-}
-
-MOJO_MULTIPROCESS_TEST_CHILD_MAIN(PassedChannel) {
-  CHECK(MultiprocessTestHelper::client_platform_handle.is_valid());
-
-  // Take ownership of the handle.
-  ScopedPlatformHandle handle =
-      std::move(MultiprocessTestHelper::client_platform_handle);
-
-  // The handle should be non-blocking.
-  EXPECT_TRUE(IsNonBlocking(handle.get()));
-
-  // Read a byte.
-  char c = 0;
-  EXPECT_TRUE(ReadByte(handle.get(), &c));
-
-  // Write it back, incremented.
-  c++;
-  EXPECT_TRUE(WriteByte(handle.get(), c));
-
-  // And return it, incremented again.
-  c++;
-  return static_cast<int>(c);
-}
-
-TEST_F(MultiprocessTestHelperTest, ChildTestPasses) {
-  MultiprocessTestHelper helper;
-  EXPECT_TRUE(helper.server_platform_handle.is_valid());
-  helper.StartChild("ChildTestPasses");
-  EXPECT_TRUE(helper.WaitForChildTestShutdown());
-}
-
-MOJO_MULTIPROCESS_TEST_CHILD_TEST(ChildTestPasses) {
-  ASSERT_TRUE(MultiprocessTestHelper::client_platform_handle.is_valid());
-  EXPECT_TRUE(
-      IsNonBlocking(MultiprocessTestHelper::client_platform_handle.get()));
-}
-
-TEST_F(MultiprocessTestHelperTest, ChildTestFailsAssert) {
-  MultiprocessTestHelper helper;
-  EXPECT_TRUE(helper.server_platform_handle.is_valid());
-  helper.StartChild("ChildTestFailsAssert");
-  EXPECT_FALSE(helper.WaitForChildTestShutdown());
-}
-
-MOJO_MULTIPROCESS_TEST_CHILD_TEST(ChildTestFailsAssert) {
-  ASSERT_FALSE(MultiprocessTestHelper::client_platform_handle.is_valid())
-      << "DISREGARD: Expected failure in child process";
-  ASSERT_FALSE(
-      IsNonBlocking(MultiprocessTestHelper::client_platform_handle.get()))
-      << "Not reached";
-  CHECK(false) << "Not reached";
-}
-
-TEST_F(MultiprocessTestHelperTest, ChildTestFailsExpect) {
-  MultiprocessTestHelper helper;
-  EXPECT_TRUE(helper.server_platform_handle.is_valid());
-  helper.StartChild("ChildTestFailsExpect");
-  EXPECT_FALSE(helper.WaitForChildTestShutdown());
-}
-
-MOJO_MULTIPROCESS_TEST_CHILD_TEST(ChildTestFailsExpect) {
-  EXPECT_FALSE(MultiprocessTestHelper::client_platform_handle.is_valid())
-      << "DISREGARD: Expected failure #1 in child process";
-  EXPECT_FALSE(
-      IsNonBlocking(MultiprocessTestHelper::client_platform_handle.get()))
-      << "DISREGARD: Expected failure #2 in child process";
-}
-
-}  // namespace
-}  // namespace test
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/test/run_all_perftests.cc b/mojo/edk/test/run_all_perftests.cc
deleted file mode 100644
index 3ce3b47..0000000
--- a/mojo/edk/test/run_all_perftests.cc
+++ /dev/null
@@ -1,26 +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 "base/command_line.h"
-#include "base/test/multiprocess_test.h"
-#include "base/test/perf_test_suite.h"
-#include "base/test/test_io_thread.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/embedder/scoped_ipc_support.h"
-#include "mojo/edk/test/multiprocess_test_helper.h"
-#include "mojo/edk/test/test_support_impl.h"
-#include "mojo/public/tests/test_support_private.h"
-
-int main(int argc, char** argv) {
-  base::PerfTestSuite test(argc, argv);
-
-  mojo::edk::Init();
-  base::TestIOThread test_io_thread(base::TestIOThread::kAutoStart);
-  mojo::edk::ScopedIPCSupport ipc_support(
-      test_io_thread.task_runner(),
-      mojo::edk::ScopedIPCSupport::ShutdownPolicy::CLEAN);
-  mojo::test::TestSupport::Init(new mojo::edk::test::TestSupportImpl());
-
-  return test.Run();
-}
diff --git a/mojo/edk/test/run_all_unittests.cc b/mojo/edk/test/run_all_unittests.cc
deleted file mode 100644
index a057825..0000000
--- a/mojo/edk/test/run_all_unittests.cc
+++ /dev/null
@@ -1,49 +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 <signal.h>
-
-#include "base/bind.h"
-#include "base/command_line.h"
-#include "base/test/launcher/unit_test_launcher.h"
-#include "base/test/multiprocess_test.h"
-#include "base/test/test_io_thread.h"
-#include "base/test/test_suite.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/embedder/scoped_ipc_support.h"
-#include "mojo/edk/test/multiprocess_test_helper.h"
-#include "mojo/edk/test/test_support_impl.h"
-#include "mojo/public/tests/test_support_private.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-int main(int argc, char** argv) {
-#if !defined(OS_ANDROID)
-  // Silence death test thread warnings on Linux. We can afford to run our death
-  // tests a little more slowly (< 10 ms per death test on a Z620).
-  // On android, we need to run in the default mode, as the threadsafe mode
-  // relies on execve which is not available.
-  testing::GTEST_FLAG(death_test_style) = "threadsafe";
-#endif
-#if defined(OS_ANDROID)
-  // On android, the test framework has a signal handler that will print a
-  // [ CRASH ] line when the application crashes. This breaks death test has the
-  // test runner will consider the death of the child process a test failure.
-  // Removing the signal handler solves this issue.
-  signal(SIGABRT, SIG_DFL);
-#endif
-
-  base::TestSuite test_suite(argc, argv);
-
-  mojo::edk::Init();
-
-  mojo::test::TestSupport::Init(new mojo::edk::test::TestSupportImpl());
-  base::TestIOThread test_io_thread(base::TestIOThread::kAutoStart);
-
-  mojo::edk::ScopedIPCSupport ipc_support(
-      test_io_thread.task_runner(),
-      mojo::edk::ScopedIPCSupport::ShutdownPolicy::CLEAN);
-  return base::LaunchUnitTests(
-      argc, argv,
-      base::Bind(&base::TestSuite::Run, base::Unretained(&test_suite)));
-}
diff --git a/mojo/edk/test/test_support_impl.cc b/mojo/edk/test/test_support_impl.cc
deleted file mode 100644
index 25684e4..0000000
--- a/mojo/edk/test/test_support_impl.cc
+++ /dev/null
@@ -1,84 +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 "mojo/edk/test/test_support_impl.h"
-
-#include <stddef.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <string>
-
-#include "base/files/file_enumerator.h"
-#include "base/files/file_path.h"
-#include "base/files/file_util.h"
-#include "base/logging.h"
-#include "base/path_service.h"
-#include "base/strings/string_split.h"
-#include "base/strings/string_util.h"
-#include "base/strings/stringprintf.h"
-#include "base/test/perf_log.h"
-
-namespace mojo {
-namespace edk {
-namespace test {
-namespace {
-
-base::FilePath ResolveSourceRootRelativePath(const char* relative_path) {
-  base::FilePath path;
-  if (!PathService::Get(base::DIR_SOURCE_ROOT, &path))
-    return base::FilePath();
-
-  for (const base::StringPiece& component : base::SplitStringPiece(
-           relative_path, "/", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL)) {
-    if (!component.empty())
-      path = path.AppendASCII(component);
-  }
-
-  return path;
-}
-
-}  // namespace
-
-TestSupportImpl::TestSupportImpl() {
-}
-
-TestSupportImpl::~TestSupportImpl() {
-}
-
-void TestSupportImpl::LogPerfResult(const char* test_name,
-                                    const char* sub_test_name,
-                                    double value,
-                                    const char* units) {
-  DCHECK(test_name);
-  if (sub_test_name) {
-    std::string name = base::StringPrintf("%s/%s", test_name, sub_test_name);
-    base::LogPerfResult(name.c_str(), value, units);
-  } else {
-    base::LogPerfResult(test_name, value, units);
-  }
-}
-
-FILE* TestSupportImpl::OpenSourceRootRelativeFile(const char* relative_path) {
-  return base::OpenFile(ResolveSourceRootRelativePath(relative_path), "rb");
-}
-
-char** TestSupportImpl::EnumerateSourceRootRelativeDirectory(
-    const char* relative_path) {
-  std::vector<std::string> names;
-  base::FileEnumerator e(ResolveSourceRootRelativePath(relative_path), false,
-                         base::FileEnumerator::FILES);
-  for (base::FilePath name = e.Next(); !name.empty(); name = e.Next())
-    names.push_back(name.BaseName().AsUTF8Unsafe());
-
-  // |names.size() + 1| for null terminator.
-  char** rv = static_cast<char**>(calloc(names.size() + 1, sizeof(char*)));
-  for (size_t i = 0; i < names.size(); ++i)
-    rv[i] = base::strdup(names[i].c_str());
-  return rv;
-}
-
-}  // namespace test
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/test/test_support_impl.h b/mojo/edk/test/test_support_impl.h
deleted file mode 100644
index ebb5ce6..0000000
--- a/mojo/edk/test/test_support_impl.h
+++ /dev/null
@@ -1,38 +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 MOJO_EDK_TEST_TEST_SUPPORT_IMPL_H_
-#define MOJO_EDK_TEST_TEST_SUPPORT_IMPL_H_
-
-#include <stdio.h>
-
-#include "base/macros.h"
-#include "mojo/public/tests/test_support_private.h"
-
-namespace mojo {
-namespace edk {
-namespace test {
-
-class TestSupportImpl : public mojo::test::TestSupport {
- public:
-  TestSupportImpl();
-  ~TestSupportImpl() override;
-
-  void LogPerfResult(const char* test_name,
-                     const char* sub_test_name,
-                     double value,
-                     const char* units) override;
-  FILE* OpenSourceRootRelativeFile(const char* relative_path) override;
-  char** EnumerateSourceRootRelativeDirectory(
-      const char* relative_path) override;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(TestSupportImpl);
-};
-
-}  // namespace test
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_TEST_TEST_SUPPORT_IMPL_H_
diff --git a/mojo/edk/test/test_utils.h b/mojo/edk/test/test_utils.h
deleted file mode 100644
index 939171b..0000000
--- a/mojo/edk/test/test_utils.h
+++ /dev/null
@@ -1,55 +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 MOJO_EDK_TEST_TEST_UTILS_H_
-#define MOJO_EDK_TEST_TEST_UTILS_H_
-
-#include <stddef.h>
-#include <stdio.h>
-
-#include <string>
-
-#include "base/files/scoped_file.h"
-#include "mojo/edk/embedder/platform_handle.h"
-#include "mojo/edk/embedder/scoped_platform_handle.h"
-
-namespace mojo {
-namespace edk {
-namespace test {
-
-// On success, |bytes_written| is updated to the number of bytes written;
-// otherwise it is untouched.
-bool BlockingWrite(const PlatformHandle& handle,
-                   const void* buffer,
-                   size_t bytes_to_write,
-                   size_t* bytes_written);
-
-// On success, |bytes_read| is updated to the number of bytes read; otherwise it
-// is untouched.
-bool BlockingRead(const PlatformHandle& handle,
-                  void* buffer,
-                  size_t buffer_size,
-                  size_t* bytes_read);
-
-// If the read is done successfully or would block, the function returns true
-// and updates |bytes_read| to the number of bytes read (0 if the read would
-// block); otherwise it returns false and leaves |bytes_read| untouched.
-// |handle| must already be in non-blocking mode.
-bool NonBlockingRead(const PlatformHandle& handle,
-                     void* buffer,
-                     size_t buffer_size,
-                     size_t* bytes_read);
-
-// Gets a (scoped) |PlatformHandle| from the given (scoped) |FILE|.
-ScopedPlatformHandle PlatformHandleFromFILE(base::ScopedFILE fp);
-
-// Gets a (scoped) |FILE| from a (scoped) |PlatformHandle|.
-base::ScopedFILE FILEFromPlatformHandle(ScopedPlatformHandle h,
-                                        const char* mode);
-
-}  // namespace test
-}  // namespace edk
-}  // namespace mojo
-
-#endif  // MOJO_EDK_TEST_TEST_UTILS_H_
diff --git a/mojo/edk/test/test_utils_posix.cc b/mojo/edk/test/test_utils_posix.cc
deleted file mode 100644
index 60d5db5..0000000
--- a/mojo/edk/test/test_utils_posix.cc
+++ /dev/null
@@ -1,94 +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 "mojo/edk/test/test_utils.h"
-
-#include <fcntl.h>
-#include <stddef.h>
-#include <unistd.h>
-
-#include "base/posix/eintr_wrapper.h"
-
-namespace mojo {
-namespace edk {
-namespace test {
-
-bool BlockingWrite(const PlatformHandle& handle,
-                   const void* buffer,
-                   size_t bytes_to_write,
-                   size_t* bytes_written) {
-  int original_flags = fcntl(handle.handle, F_GETFL);
-  if (original_flags == -1 ||
-      fcntl(handle.handle, F_SETFL, original_flags & (~O_NONBLOCK)) != 0) {
-    return false;
-  }
-
-  ssize_t result = HANDLE_EINTR(write(handle.handle, buffer, bytes_to_write));
-
-  fcntl(handle.handle, F_SETFL, original_flags);
-
-  if (result < 0)
-    return false;
-
-  *bytes_written = result;
-  return true;
-}
-
-bool BlockingRead(const PlatformHandle& handle,
-                  void* buffer,
-                  size_t buffer_size,
-                  size_t* bytes_read) {
-  int original_flags = fcntl(handle.handle, F_GETFL);
-  if (original_flags == -1 ||
-      fcntl(handle.handle, F_SETFL, original_flags & (~O_NONBLOCK)) != 0) {
-    return false;
-  }
-
-  ssize_t result = HANDLE_EINTR(read(handle.handle, buffer, buffer_size));
-
-  fcntl(handle.handle, F_SETFL, original_flags);
-
-  if (result < 0)
-    return false;
-
-  *bytes_read = result;
-  return true;
-}
-
-bool NonBlockingRead(const PlatformHandle& handle,
-                     void* buffer,
-                     size_t buffer_size,
-                     size_t* bytes_read) {
-  ssize_t result = HANDLE_EINTR(read(handle.handle, buffer, buffer_size));
-
-  if (result < 0) {
-    if (errno != EAGAIN && errno != EWOULDBLOCK)
-      return false;
-
-    *bytes_read = 0;
-  } else {
-    *bytes_read = result;
-  }
-
-  return true;
-}
-
-ScopedPlatformHandle PlatformHandleFromFILE(base::ScopedFILE fp) {
-  CHECK(fp);
-  int rv = dup(fileno(fp.get()));
-  PCHECK(rv != -1) << "dup";
-  return ScopedPlatformHandle(PlatformHandle(rv));
-}
-
-base::ScopedFILE FILEFromPlatformHandle(ScopedPlatformHandle h,
-                                        const char* mode) {
-  CHECK(h.is_valid());
-  base::ScopedFILE rv(fdopen(h.release().handle, mode));
-  PCHECK(rv) << "fdopen";
-  return rv;
-}
-
-}  // namespace test
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/edk/test/test_utils_win.cc b/mojo/edk/test/test_utils_win.cc
deleted file mode 100644
index 17bf5bb..0000000
--- a/mojo/edk/test/test_utils_win.cc
+++ /dev/null
@@ -1,115 +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 "mojo/edk/test/test_utils.h"
-
-#include <windows.h>
-#include <fcntl.h>
-#include <io.h>
-#include <stddef.h>
-#include <string.h>
-
-namespace mojo {
-namespace edk {
-namespace test {
-
-bool BlockingWrite(const PlatformHandle& handle,
-                   const void* buffer,
-                   size_t bytes_to_write,
-                   size_t* bytes_written) {
-  OVERLAPPED overlapped = {0};
-  DWORD bytes_written_dword = 0;
-
-  if (!WriteFile(handle.handle, buffer, static_cast<DWORD>(bytes_to_write),
-                 &bytes_written_dword, &overlapped)) {
-    if (GetLastError() != ERROR_IO_PENDING ||
-        !GetOverlappedResult(handle.handle, &overlapped, &bytes_written_dword,
-                             TRUE)) {
-      return false;
-    }
-  }
-
-  *bytes_written = bytes_written_dword;
-  return true;
-}
-
-bool BlockingRead(const PlatformHandle& handle,
-                  void* buffer,
-                  size_t buffer_size,
-                  size_t* bytes_read) {
-  OVERLAPPED overlapped = {0};
-  DWORD bytes_read_dword = 0;
-
-  if (!ReadFile(handle.handle, buffer, static_cast<DWORD>(buffer_size),
-                &bytes_read_dword, &overlapped)) {
-    if (GetLastError() != ERROR_IO_PENDING ||
-        !GetOverlappedResult(handle.handle, &overlapped, &bytes_read_dword,
-                             TRUE)) {
-      return false;
-    }
-  }
-
-  *bytes_read = bytes_read_dword;
-  return true;
-}
-
-bool NonBlockingRead(const PlatformHandle& handle,
-                     void* buffer,
-                     size_t buffer_size,
-                     size_t* bytes_read) {
-  OVERLAPPED overlapped = {0};
-  DWORD bytes_read_dword = 0;
-
-  if (!ReadFile(handle.handle, buffer, static_cast<DWORD>(buffer_size),
-                &bytes_read_dword, &overlapped)) {
-    if (GetLastError() != ERROR_IO_PENDING)
-      return false;
-
-    CancelIo(handle.handle);
-
-    if (!GetOverlappedResult(handle.handle, &overlapped, &bytes_read_dword,
-                             TRUE)) {
-      *bytes_read = 0;
-      return true;
-    }
-  }
-
-  *bytes_read = bytes_read_dword;
-  return true;
-}
-
-ScopedPlatformHandle PlatformHandleFromFILE(base::ScopedFILE fp) {
-  CHECK(fp);
-
-  HANDLE rv = INVALID_HANDLE_VALUE;
-  PCHECK(DuplicateHandle(
-      GetCurrentProcess(),
-      reinterpret_cast<HANDLE>(_get_osfhandle(_fileno(fp.get()))),
-      GetCurrentProcess(), &rv, 0, TRUE, DUPLICATE_SAME_ACCESS))
-      << "DuplicateHandle";
-  return ScopedPlatformHandle(PlatformHandle(rv));
-}
-
-base::ScopedFILE FILEFromPlatformHandle(ScopedPlatformHandle h,
-                                        const char* mode) {
-  CHECK(h.is_valid());
-  // Microsoft's documentation for |_open_osfhandle()| only discusses these
-  // flags (and |_O_WTEXT|). Hmmm.
-  int flags = 0;
-  if (strchr(mode, 'a'))
-    flags |= _O_APPEND;
-  if (strchr(mode, 'r'))
-    flags |= _O_RDONLY;
-  if (strchr(mode, 't'))
-    flags |= _O_TEXT;
-  base::ScopedFILE rv(_fdopen(
-      _open_osfhandle(reinterpret_cast<intptr_t>(h.release().handle), flags),
-      mode));
-  PCHECK(rv) << "_fdopen";
-  return rv;
-}
-
-}  // namespace test
-}  // namespace edk
-}  // namespace mojo
diff --git a/mojo/public/BUILD.gn b/mojo/public/BUILD.gn
deleted file mode 100644
index 3baf667..0000000
--- a/mojo/public/BUILD.gn
+++ /dev/null
@@ -1,28 +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.
-
-group("public") {
-  # Meta-target, don't link into production code.
-  testonly = true
-  deps = [
-    ":sdk",
-    "cpp/bindings",
-    "interfaces/bindings/tests:test_interfaces",
-  ]
-
-  if (is_android) {
-    deps += [
-      "java:bindings_java",
-      "java:system_java",
-    ]
-  }
-}
-
-group("sdk") {
-  deps = [
-    "c/system",
-    "cpp/bindings",
-    "js",
-  ]
-}
diff --git a/mojo/public/DEPS b/mojo/public/DEPS
deleted file mode 100644
index 2e49995..0000000
--- a/mojo/public/DEPS
+++ /dev/null
@@ -1,11 +0,0 @@
-include_rules = [
-  # This code is checked into the chromium repo so it's fine to depend on this.
-  "+base",
-  "+build",
-  "+testing",
-
-  "+ipc/ipc_param_traits.h",
-
-  # internal includes.
-  "+mojo",
-]
diff --git a/mojo/public/LICENSE b/mojo/public/LICENSE
deleted file mode 100644
index 972bb2e..0000000
--- a/mojo/public/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-//    * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-//    * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-//    * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/mojo/public/c/system/BUILD.gn b/mojo/public/c/system/BUILD.gn
deleted file mode 100644
index 08185c7..0000000
--- a/mojo/public/c/system/BUILD.gn
+++ /dev/null
@@ -1,37 +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.
-
-component("system") {
-  output_name = "mojo_public_system"
-
-  sources = [
-    "buffer.h",
-    "core.h",
-    "data_pipe.h",
-    "functions.h",
-    "macros.h",
-    "message_pipe.h",
-    "platform_handle.h",
-    "system_export.h",
-    "thunks.cc",
-    "thunks.h",
-    "types.h",
-    "watcher.h",
-  ]
-
-  defines = [ "MOJO_SYSTEM_IMPLEMENTATION" ]
-}
-
-# This should ONLY be depended upon directly by shared_library targets which
-# need to export the MojoSetSystemThunks symbol, like targets generated by the
-# mojo_native_application template in //services/service_manager/public/cpp/service.gni.
-source_set("set_thunks_for_app") {
-  sources = [
-    "set_thunks_for_app.cc",
-  ]
-
-  public_deps = [
-    ":system",
-  ]
-}
diff --git a/mojo/public/c/system/README.md b/mojo/public/c/system/README.md
deleted file mode 100644
index 2abe80f..0000000
--- a/mojo/public/c/system/README.md
+++ /dev/null
@@ -1,869 +0,0 @@
-# ![Mojo Graphic](https://goo.gl/6CdlbH) Mojo C System API
-This document is a subset of the [Mojo documentation](/mojo).
-
-[TOC]
-
-## Overview
-The Mojo C System API is a lightweight API (with an eventually-stable ABI) upon
-which all higher layers of the Mojo system are built.
-
-This API exposes the fundamental capabilities to: create, read from, and write
-to **message pipes**; create, read from, and write to **data pipes**; create
-**shared buffers** and generate sharable handles to them; wrap platform-specific
-handle objects (such as **file descriptors**, **Windows handles**, and
-**Mach ports**) for seamless transit over message pipes; and efficiently watch
-handles for various types of state transitions.
-
-This document provides a brief guide to API usage with example code snippets.
-For a detailed API references please consult the headers in
-[//mojo/public/c/system](https://cs.chromium.org/chromium/src/mojo/public/c/system/).
-
-### A Note About Multithreading
-
-The Mojo C System API is entirely thread-agnostic. This means that all functions
-may be called from any thread in a process, and there are no restrictions on how
-many threads can use the same object at the same time.
-
-Of course this does not mean you can completely ignore potential concurrency
-issues -- such as a handle being closed on one thread while another thread is
-trying to perform an operation on the same handle -- but there is nothing
-fundamentally incorrect about using any given API or handle from multiple
-threads.
-
-### A Note About Synchronization
-
-Every Mojo API call is non-blocking and synchronously yields some kind of status
-result code, but the call's side effects -- such as affecting the state of
-one or more handles in the system -- may or may not occur asynchronously.
-
-Mojo objects can be observed for interesting state changes in a way that is
-thread-agnostic and in some ways similar to POSIX signal handlers: *i.e.*
-user-provided notification handlers may be invoked at any time on arbitrary
-threads in the process. It is entirely up to the API user to take appropriate
-measures to synchronize operations against other application state.
-
-The higher level [system](/mojo#High-Level-System-APIs) and
-[bindings](/mojo#High-Level-Bindings-APIs) APIs provide helpers to simplify Mojo
-usage in this regard, at the expense of some flexibility.
-
-## Result Codes
-
-Most API functions return a value of type `MojoResult`. This is an integral
-result code used to convey some meaningful level of detail about the result of a
-requested operation.
-
-See [//mojo/public/c/system/types.h](https://cs.chromium.org/chromium/src/mojo/public/c/system/types.h)
-for different possible values. See documentation for individual API calls for
-more specific contextual meaning of various result codes.
-
-## Handles
-
-Every Mojo IPC primitive is identified by a generic, opaque integer handle of
-type `MojoHandle`. Handles can be acquired by creating new objects using various
-API calls, or by reading messages which contain attached handles.
-
-A `MojoHandle` can represent a message pipe endpoint, a data pipe consumer,
-a data pipe producer, a shared buffer reference, a wrapped native platform
-handle such as a POSIX file descriptor or a Windows system handle, or a watcher
-object (see [Signals & Watchers](#Signals-Watchers) below.)
-
-All types of handles except for watchers (which are an inherently local concept)
-can be attached to messages and sent over message pipes.
-
-Any `MojoHandle` may be closed by calling `MojoClose`:
-
-``` c
-MojoHandle x = DoSomethingToGetAValidHandle();
-MojoResult result = MojoClose(x);
-```
-
-If the handle passed to `MojoClose` was a valid handle, it will be closed and
-`MojoClose` returns `MOJO_RESULT_OK`. Otherwise it returns
-`MOJO_RESULT_INVALID_ARGUMENT`.
-
-Similar to native system handles on various popular platforms, `MojoHandle`
-values may be reused over time. Thus it is important to avoid logical errors
-which lead to misplaced handle ownership, double-closes, *etc.*
-
-## Message Pipes
-
-A message pipe is a bidirectional messaging channel which can carry arbitrary
-unstructured binary messages with zero or more `MojoHandle` attachments to be
-transferred from one end of a pipe to the other. Message pipes work seamlessly
-across process boundaries or within a single process.
-
-The [Embedder Development Kit (EDK)](/mojo/edk/embedder) provides the means to
-bootstrap one or more primordial cross-process message pipes, and it's up to
-Mojo embedders to expose this capability in some useful way. Once such a pipe is
-established, additional handles -- including other message pipe handles -- may
-be sent to a remote process using that pipe (or in turn, over other pipes sent
-over that pipe, or pipes sent over *that* pipe, and so on...)
-
-The public C System API exposes the ability to read and write messages on pipes
-and to create new message pipes.
-
-See [//mojo/public/c/system/message_pipe.h](https://cs.chromium.org/chromium/src/mojo/public/c/system/message_pipe.h)
-for detailed message pipe API documentation.
-
-### Creating Message Pipes
-
-`MojoCreateMessagePipe` can be used to create a new message pipe:
-
-``` c
-MojoHandle a, b;
-MojoResult result = MojoCreateMessagePipe(NULL, &a, &b);
-```
-
-After this snippet, `result` should be `MOJO_RESULT_OK` (it's really hard for
-this to fail!), and `a` and `b` will contain valid Mojo handles, one for each
-end of the new message pipe.
-
-Any messages written to `a` are eventually readable from `b`, and any messages
-written to `b` are eventually readable from `a`. If `a` is closed at any point,
-`b` will eventually become aware of this fact; likewise if `b` is closed, `a`
-will become aware of that.
-
-The state of these conditions can be queried and watched asynchronously as
-described in the [Signals & Watchers](#Signals-Watchers) section below.
-
-### Allocating Messages
-
-In order to avoid redundant internal buffer copies, Mojo would like to allocate
-your message storage buffers for you. This is easy:
-
-``` c
-MojoMessageHandle message;
-MojoResult result = MojoAllocMessage(6, NULL, 0, MOJO_ALLOC_MESSAGE_FLAG_NONE,
-                                     &message);
-```
-
-Note that we have a special `MojoMessageHandle` type for message objects.
-
-The code above allocates a buffer for a message payload of 6 bytes with no
-handles attached.
-
-If we change our mind and decide not to send this message, we can delete it:
-
-``` c
-MojoResult result = MojoFreeMessage(message);
-```
-
-If we instead decide to send our newly allocated message, we first need to fill
-in the payload data with something interesting. How about a pleasant greeting:
-
-``` c
-void* buffer = NULL;
-MojoResult result = MojoGetMessageBuffer(message, &buffer);
-memcpy(buffer, "hello", 6);
-```
-
-Now we can write the message to a pipe. Note that attempting to write a message
-transfers ownership of the message object (and any attached handles) into the
-target pipe and there is therefore no need to subsequently call
-`MojoFreeMessage` on that message.
-
-### Writing Messages
-
-``` c
-result = MojoWriteMessageNew(a, message, MOJO_WRITE_MESSAGE_FLAG_NONE);
-```
-
-`MojoWriteMessage` is a *non-blocking* call: it always returns
-immediately. If its return code is `MOJO_RESULT_OK` the message will eventually
-find its way to the other end of the pipe -- assuming that end isn't closed
-first, of course. If the return code is anything else, the message is deleted
-and not transferred.
-
-In this case since we know `b` is still open, we also know the message will
-eventually arrive at `b`. `b` can be queried or watched to become aware of when
-the message arrives, but we'll ignore that complexity for now. See
-[Signals & Watchers](#Signals-Watchers) below for more information.
-
-*** aside
-**NOTE**: Although this is an implementation detail and not strictly guaranteed by the
-System API, it is true in the current implementation that the message will
-arrive at `b` before the above `MojoWriteMessage` call even returns, because `b`
-is in the same process as `a` and has never been transferred over another pipe.
-***
-
-### Reading Messages
-
-We can read a new message object from a pipe:
-
-``` c
-MojoMessageHandle message;
-uint32_t num_bytes;
-MojoResult result = MojoReadMessageNew(b, &message, &num_bytes, NULL, NULL,
-                                       MOJO_READ_MESSAGE_FLAG_NONE);
-```
-
-and map its buffer to retrieve the contents:
-
-``` c
-void* buffer = NULL;
-MojoResult result = MojoGetMessageBuffer(message, &buffer);
-printf("Pipe says: %s", (const char*)buffer);
-```
-
-`result` should be `MOJO_RESULT_OK` and this snippet should write `"hello"` to
-`stdout`.
-
-If we try were to try reading again now that there are no messages on `b`:
-
-``` c
-MojoMessageHandle message;
-MojoResult result = MojoReadMessageNew(b, &message, NULL, NULL, NULL,
-                                       MOJO_READ_MESSAGE_FLAG_NONE);
-```
-
-We'll get a `result` of `MOJO_RESULT_SHOULD_WAIT`, indicating that the pipe is
-not yet readable.
-
-### Messages With Handles
-
-Probably the most useful feature of Mojo IPC is that message pipes can carry
-arbitrary Mojo handles, including other message pipes. This is also
-straightforward.
-
-Here's an example which creates two pipes, using the first pipe to transfer
-one end of the second pipe. If you have a good imagination you can pretend the
-first pipe spans a process boundary, which makes the example more practically
-interesting:
-
-``` c
-MojoHandle a, b;
-MojoHandle c, d;
-MojoMessage message;
-
-// Allocate a message with an empty payload and handle |c| attached. Note that
-// this takes ownership of |c|, effectively invalidating its handle value.
-MojoResult result = MojoAllocMessage(0, &c, 1, MOJO_ALLOC_MESSAGE_FLAG_NONE,
-                                     message);
-
-result = MojoWriteMessageNew(a, message, MOJO_WRITE_MESSAGE_FLAG_NONE);
-
-// Some time later...
-uint32_t num_bytes;
-MojoHandle e;
-uint32_t num_handles = 1;
-MojoResult result = MojoReadMessageNew(b, &message, &num_bytes, &e,
-                                       &num_handles,
-                                       MOJO_READ_MESSAGE_FLAG_NONE);
-```
-
-At this point the handle in `e` is now referencing the same message pipe
-endpoint which was originally referenced by `c`.
-
-Note that `num_handles` above is initialized to 1 before we pass its address to
-`MojoReadMessageNew`. This is to indicate how much `MojoHandle` storage is
-available at the output buffer we gave it (`&e` above).
-
-If we didn't know how many handles to expect in an incoming message -- which is
-often the case -- we can use `MojoReadMessageNew` to query for this information
-first:
-
-``` c
-MojoMessageHandle message;
-uint32_t num_bytes = 0;
-uint32_t num_handles = 0;
-MojoResult result = MojoReadMessageNew(b, &message, &num_bytes, NULL,
-                                       &num_handles,
-                                       MOJO_READ_MESSAGE_FLAG_NONE);
-```
-
-If in this case there were a received message on `b` with some nonzero number
-of handles, `result` would be `MOJO_RESULT_RESOURCE_EXHAUSTED`, and both
-`num_bytes` and `num_handles` would be updated to reflect the payload size and
-number of attached handles on the next available message.
-
-It's also worth noting that if there did happen to be a message available with
-no payload and no handles (*i.e.* an empty message), this would actually return
-`MOJO_RESULT_OK`.
-
-## Data Pipes
-
-Data pipes provide an efficient unidirectional channel for moving large amounts
-of unframed data between two endpoints. Every data pipe has a fixed
-**element size** and **capacity**. Reads and writes must be done in sizes that
-are a multiple of the element size, and writes to the pipe can only be queued
-up to the pipe's capacity before reads must be done to make more space
-available.
-
-Every data pipe has a single **producer** handle used to write data into the
-pipe and a single **consumer** handle used to read data out of the pipe.
-
-Finally, data pipes support both immediate I/O -- reading into and writing out
-from user-supplied buffers -- as well as two-phase I/O, allowing callers to
-temporarily lock some portion of the data pipe in order to read or write its
-contents directly.
-
-See [//mojo/public/c/system/data_pipe.h](https://cs.chromium.org/chromium/src/mojo/public/c/system/data_pipe.h)
-for detailed data pipe API documentation.
-
-### Creating Data Pipes
-
-Use `MojoCreateDataPipe` to create a new data pipe. The
-`MojoCreateDataPipeOptions` structure is used to configure the new pipe, but
-this can be omitted to assume the default options of a single-byte element size
-and an implementation-defined default capacity (64 kB at the time of this
-writing.)
-
-``` c
-MojoHandle producer, consumer;
-MojoResult result = MojoCreateDataPipe(NULL, &producer, &consumer);
-```
-
-### Immediate I/O
-
-Data can be written into or read out of a data pipe using buffers provided by
-the caller. This is generally more convenient than two-phase I/O but is
-also less efficient due to extra copying.
-
-``` c
-uint32_t num_bytes = 12;
-MojoResult result = MojoWriteData(producer, "datadatadata", &num_bytes,
-                                  MOJO_WRITE_DATA_FLAG_NONE);
-```
-
-The above snippet will attempt to write 12 bytes into the data pipe, which
-should succeed and return `MOJO_RESULT_OK`. If the available capacity on the
-pipe was less than the amount requested (the input value of `*num_bytes`) this
-will copy what it can into the pipe and return the number of bytes written in
-`*num_bytes`. If no data could be copied this will instead return
-`MOJO_RESULT_SHOULD_WAIT`.
-
-Reading from the consumer is a similar operation.
-
-``` c
-char buffer[64];
-uint32_t num_bytes = 64;
-MojoResult result = MojoReadData(consumer, buffer, &num_bytes,
-                                 MOJO_READ_DATA_FLAG_NONE);
-```
-
-This will attempt to read up to 64 bytes, returning the actual number of bytes
-read in `*num_bytes`.
-
-`MojoReadData` supports a number of interesting flags to change the behavior:
-you can peek at the data (copy bytes out without removing them from the pipe),
-query the number of bytes available without doing any actual reading of the
-contents, or discard data from the pipe without bothering to copy it anywhere.
-
-This also supports a `MOJO_READ_DATA_FLAG_ALL_OR_NONE` which ensures that the
-call succeeds **only** if the exact number of bytes requested could be read.
-Otherwise such a request will fail with `MOJO_READ_DATA_OUT_OF_RANGE`.
-
-### Two-Phase I/O
-
-Data pipes also support two-phase I/O operations, allowing a caller to
-temporarily lock a portion of the data pipe's storage for direct memory access.
-
-``` c
-void* buffer;
-uint32_t num_bytes = 1024;
-MojoResult result = MojoBeginWriteData(producer, &buffer, &num_bytes,
-                                       MOJO_WRITE_DATA_FLAG_NONE);
-```
-
-This requests write access to a region of up to 1024 bytes of the data pipe's
-next available capacity. Upon success, `buffer` will point to the writable
-storage and `num_bytes` will indicate the size of the buffer there.
-
-The caller should then write some data into the memory region and release it
-ASAP, indicating the number of bytes actually written:
-
-``` c
-memcpy(buffer, "hello", 6);
-MojoResult result = MojoEndWriteData(producer, 6);
-```
-
-Two-phase reads look similar:
-
-``` c
-void* buffer;
-uint32_t num_bytes = 1024;
-MojoResult result = MojoBeginReadData(consumer, &buffer, &num_bytes,
-                                      MOJO_READ_DATA_FLAG_NONE);
-// result should be MOJO_RESULT_OK, since there is some data available.
-
-printf("Pipe says: %s", (const char*)buffer);  // Should say "hello".
-
-result = MojoEndReadData(consumer, 1);  // Say we only consumed one byte.
-
-num_bytes = 1024;
-result = MojoBeginReadData(consumer, &buffer, &num_bytes,
-                           MOJO_READ_DATA_FLAG_NONE);
-printf("Pipe says: %s", (const char*)buffer);  // Should say "ello".
-result = MojoEndReadData(consumer, 5);
-```
-
-## Shared Buffers
-
-Shared buffers are chunks of memory which can be mapped simultaneously by
-multiple processes. Mojo provides a simple API to make these available to
-applications.
-
-See [//mojo/public/c/system/buffer.h](https://cs.chromium.org/chromium/src/mojo/public/c/system/buffer.h)
-for detailed shared buffer API documentation.
-
-### Creating Buffer Handles
-
-Usage is straightforward. You can create a new buffer:
-
-``` c
-// Allocate a shared buffer of 4 kB.
-MojoHandle buffer;
-MojoResult result = MojoCreateSharedBuffer(NULL, 4096, &buffer);
-```
-
-You can also duplicate an existing shared buffer handle:
-
-``` c
-MojoHandle another_name_for_buffer;
-MojoResult result = MojoDuplicateBufferHandle(buffer, NULL,
-                                              &another_name_for_buffer);
-```
-
-This is useful if you want to retain a handle to the buffer while also sharing
-handles with one or more other clients. The allocated buffer remains valid as
-long as at least one shared buffer handle exists to reference it.
-
-### Mapping Buffers
-
-You can map (and later unmap) a specified range of the buffer to get direct
-memory access to its contents:
-
-``` c
-void* data;
-MojoResult result = MojoMapBuffer(buffer, 0, 64, &data,
-                                  MOJO_MAP_BUFFER_FLAG_NONE);
-
-*(int*)data = 42;
-result = MojoUnmapBuffer(data);
-```
-
-A buffer may have any number of active mappings at a time, in any number of
-processes.
-
-### Read-Only Handles
-
-An option can also be specified on `MojoDuplicateBufferHandle` to ensure
-that the newly duplicated handle can only be mapped to read-only memory:
-
-``` c
-MojoHandle read_only_buffer;
-MojoDuplicateBufferHandleOptions options;
-options.struct_size = sizeof(options);
-options.flags = MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_READ_ONLY;
-MojoResult result = MojoDuplicateBufferHandle(buffer, &options,
-                                              &read_only_buffer);
-
-// Attempt to map and write to the buffer using the read-only handle:
-void* data;
-result = MojoMapBuffer(read_only_buffer, 0, 64, &data,
-                       MOJO_MAP_BUFFER_FLAG_NONE);
-*(int*)data = 42;  // CRASH
-```
-
-*** note
-**NOTE:** One important limitation of the current implementation is that
-read-only handles can only be produced from a handle that was originally created
-by `MojoCreateSharedBuffer` (*i.e.*, you cannot create a read-only duplicate
-from a non-read-only duplicate), and the handle cannot have been transferred
-over a message pipe first.
-***
-
-## Native Platform Handles (File Descriptors, Windows Handles, *etc.*)
-
-Native platform handles to system objects can be wrapped as Mojo handles for
-seamless transit over message pipes. Mojo currently supports wrapping POSIX
-file descriptors, Windows handles, and Mach ports.
-
-See [//mojo/public/c/system/platform_handle.h](https://cs.chromium.org/chromium/src/mojo/public/c/system/platform_handle.h)
-for detailed platform handle API documentation.
-
-### Wrapping Basic Handle Types
-
-Wrapping a POSIX file descriptor is simple:
-
-``` c
-MojoPlatformHandle platform_handle;
-platform_handle.struct_size = sizeof(platform_handle);
-platform_handle.type = MOJO_PLATFORM_HANDLE_TYPE_FILE_DESCRIPTOR;
-platform_handle.value = (uint64_t)fd;
-MojoHandle handle;
-MojoResult result = MojoWrapPlatformHandle(&platform_handle, &handle);
-```
-
-Note that at this point `handle` effectively owns the file descriptor
-and if you were to call `MojoClose(handle)`, the file descriptor would be closed
-too; but we're not going to close it here! We're going to pretend we've sent it
-over a message pipe, and now we want to unwrap it on the other side:
-
-``` c
-MojoPlatformHandle platform_handle;
-platform_handle.struct_size = sizeof(platform_handle);
-MojoResult result = MojoUnwrapPlatformHandle(handle, &platform_handle);
-int fd = (int)platform_handle.value;
-```
-
-The situation looks nearly identical for wrapping and unwrapping Windows handles
-and Mach ports.
-
-### Wrapping Shared Buffer Handles
-
-Unlike other handle types, shared buffers have special meaning in Mojo, and it
-may be desirable to wrap a native platform handle -- along with some extra
-metadata -- such that be treated like a real Mojo shared buffer handle.
-Conversely it can also be useful to unpack a Mojo shared buffer handle into
-a native platform handle which references the buffer object. Both of these
-things can be done using the `MojoWrapPlatformSharedBuffer` and
-`MojoUnwrapPlatformSharedBuffer` APIs.
-
-On Windows, the wrapped platform handle must always be a Windows handle to
-a file mapping object.
-
-On OS X, the wrapped platform handle must be a memory-object send right.
-
-On all other POSIX systems, the wrapped platform handle must be a file
-descriptor for a shared memory object.
-
-## Signals & Watchers
-
-Message pipe and data pipe (producer and consumer) handles can change state in
-ways that may be interesting to a Mojo API user. For example, you may wish to
-know when a message pipe handle has messages available to be read or when its
-peer has been closed. Such states are reflected by a fixed set of boolean
-signals on each pipe handle.
-
-### Signals
-
-Every message pipe and data pipe handle maintains a notion of
-**signaling state** which may be queried at any time. For example:
-
-``` c
-MojoHandle a, b;
-MojoCreateMessagePipe(NULL, &a, &b);
-
-MojoHandleSignalsState state;
-MojoResult result = MojoQueryHandleSignalsState(a, &state);
-```
-
-The `MojoHandleSignalsState` structure exposes two fields: `satisfied_signals`
-and `satisfiable_signals`. Both of these are bitmasks of the type
-`MojoHandleSignals` (see [//mojo/public/c/system/types.h](https://cs.chromium.org/chromium/src/mojo/public/c/system/types.h)
-for more details.)
-
-The `satisfied_signals` bitmask indicates signals which were satisfied on the
-handle at the time of the call, while the `satisfiable_signals` bitmask
-indicates signals which were still possible to satisfy at the time of the call.
-It is thus by definition always true that:
-
-``` c
-(satisfied_signals | satisfiable_signals) == satisfiable_signals
-```
-
-In other words a signal obviously cannot be satisfied if it is no longer
-satisfiable. Furthermore once a signal is unsatisfiable, *i.e.* is no longer
-set in `sastisfiable_signals`, it can **never** become satisfiable again.
-
-To illustrate this more clearly, consider the message pipe created above. Both
-ends of the pipe are still open and neither has been written to yet. Thus both
-handles start out with the same signaling state:
-
-| Field                 | State |
-|-----------------------|-------|
-| `satisfied_signals`   | `MOJO_HANDLE_SIGNAL_WRITABLE`
-| `satisfiable_signals` | `MOJO_HANDLE_SIGNAL_READABLE + MOJO_HANDLE_SIGNAL_WRITABLE + MOJO_HANDLE_SIGNAL_PEER_CLOSED`
-
-Writing a message to handle `b` will eventually alter the signaling state of `a`
-such that `MOJO_HANDLE_SIGNAL_READABLE` also becomes satisfied. If we were to
-then close `b`, the signaling state of `a` would look like:
-
-| Field                 | State |
-|-----------------------|-------|
-| `satisfied_signals`   | `MOJO_HANDLE_SIGNAL_READABLE + MOJO_HANDLE_SIGNAL_PEER_CLOSED`
-| `satisfiable_signals` | `MOJO_HANDLE_SIGNAL_READABLE + MOJO_HANDLE_SIGNAL_PEER_CLOSED`
-
-Note that even though `a`'s peer is known to be closed (hence making `a`
-permanently unwritable) it remains readable because there's still an unread
-received message waiting to be read from `a`.
-
-Finally if we read the last message from `a` its signaling state becomes:
-
-| Field                 | State |
-|-----------------------|-------|
-| `satisfied_signals`   | `MOJO_HANDLE_SIGNAL_PEER_CLOSED`
-| `satisfiable_signals` | `MOJO_HANDLE_SIGNAL_PEER_CLOSED`
-
-and we know definitively that `a` can never be read from again.
-
-### Watching Signals
-
-The ability to query a handle's signaling state can be useful, but it's not
-sufficient to support robust and efficient pipe usage. Mojo watchers empower
-users with the ability to **watch** a handle's signaling state for interesting
-changes and automatically invoke a notification handler in response.
-
-When a watcher is created it must be bound to a function pointer matching
-the following signature, defined in
-[//mojo/public/c/system/watcher.h](https://cs.chromium.org/chromium/src/mojo/public/c/system/watcher.h):
-
-``` c
-typedef void (*MojoWatcherNotificationCallback)(
-    uintptr_t context,
-    MojoResult result,
-    MojoHandleSignalsState signals_state,
-    MojoWatcherNotificationFlags flags);
-```
-
-The `context` argument corresponds to a specific handle being watched by the
-watcher (read more below), and the remaining arguments provide details regarding
-the specific reason for the notification. It's important to be aware that a
-watcher's registered handler may be called **at any time** and
-**on any thread**.
-
-It's also helpful to understand a bit about the mechanism by which the handler
-can be invoked. Essentially, any Mojo C System API call may elicit a handle
-state change of some kind. If such a change is relevant to conditions watched by
-a watcher, and that watcher is in a state which allows it raise a corresponding
-notification, its notification handler will be invoked synchronously some time
-before the outermost System API call on the current thread's stack returns.
-
-Handle state changes can also occur as a result of incoming IPC from an external
-process. If a pipe in the current process is connected to an endpoint in another
-process and the internal Mojo system receives an incoming message bound for the
-local endpoint, the arrival of that message will trigger a state change on the
-receiving handle and may thus invoke one or more watchers' notification handlers
-as a result.
-
-The `MOJO_WATCHER_NOTIFICATION_FLAG_FROM_SYSTEM` flag on the notification
-handler's `flags` argument is used to indicate whether the handler was invoked
-due to such an internal system IPC event (if the flag is set), or if it was
-invoked synchronously due to some local API call (if the flag is unset.)
-This distinction can be useful to make in certain cases to *e.g.* avoid
-accidental reentrancy in user code.
-
-### Creating a Watcher
-
-Creating a watcher is simple:
-
-``` c
-
-void OnNotification(uintptr_t context,
-                    MojoResult result,
-                    MojoHandleSignalsState signals_state,
-                    MojoWatcherNotificationFlags flags) {
-  // ...
-}
-
-MojoHandle w;
-MojoResult result = MojoCreateWatcher(&OnNotification, &w);
-```
-
-Like all other `MojoHandle` types, watchers may be destroyed by closing them
-with `MojoClose`. Unlike other `MojoHandle` types, watcher handles are **not**
-transferrable across message pipes.
-
-In order for a watcher to be useful, it has to watch at least one handle.
-
-### Adding a Handle to a Watcher
-
-Any given watcher can watch any given (message or data pipe) handle for some set
-of signaling conditions. A handle may be watched simultaneously by multiple
-watchers, and a single watcher can watch multiple different handles
-simultaneously.
-
-``` c
-MojoHandle a, b;
-MojoCreateMessagePipe(NULL, &a, &b);
-
-// Watch handle |a| for readability.
-const uintptr_t context = 1234;
-MojoResult result = MojoWatch(w, a, MOJO_HANDLE_SIGNAL_READABLE, context);
-```
-
-We've successfully instructed watcher `w` to begin watching pipe handle `a` for
-readability. However, our recently created watcher is still in a **disarmed**
-state, meaning that it will never fire a notification pertaining to this watched
-signaling condition. It must be **armed** before that can happen.
-
-### Arming a Watcher
-
-In order for a watcher to invoke its notification handler in response to a
-relevant signaling state change on a watched handle, it must first be armed. A
-watcher may only be armed if none of its watched handles would elicit a
-notification immediately once armed.
-
-In this case `a` is clearly not yet readable, so arming should succeed:
-
-``` c
-MojoResult result = MojoArmWatcher(w, NULL, NULL, NULL, NULL);
-```
-
-Now we can write to `b` to make `a` readable:
-
-``` c
-MojoWriteMessage(b, NULL, 0, NULL, 0, MOJO_WRITE_MESSAGE_NONE);
-```
-
-Eventually -- and in practice possibly before `MojoWriteMessage` even
-returns -- this will cause `OnNotification` to be invoked on the calling thread
-with the `context` value (*i.e.* 1234) that was given when the handle was added
-to the watcher.
-
-The `result` parameter will be `MOJO_RESULT_OK` to indicate that the watched
-signaling condition has been *satisfied*. If the watched condition had instead
-become permanently *unsatisfiable* (*e.g.*, if `b` were instead closed), `result`
-would instead indicate `MOJO_RESULT_FAILED_PRECONDITION`.
-
-**NOTE:** Immediately before a watcher decides to invoke its notification
-handler, it automatically disarms itself to prevent another state change from
-eliciting another notification. Therefore a watcher must be repeatedly rearmed
-in order to continue dispatching signaling notifications.
-
-As noted above, arming a watcher may fail if any of the watched conditions for
-a handle are already partially satisfied or fully unsatisfiable. In that case
-the caller may provide buffers for `MojoArmWatcher` to store information about
-a subset of the relevant watches which caused it to fail:
-
-``` c
-// Provide some storage for information about watches that are already ready.
-uint32_t num_ready_contexts = 4;
-uintptr_t ready_contexts[4];
-MojoResult ready_results[4];
-struct MojoHandleSignalsStates ready_states[4];
-MojoResult result = MojoArmWatcher(w, &num_ready_contexts, ready_contexts,
-                                   ready_results, ready_states);
-```
-
-Because `a` is still readable this operation will fail with
-`MOJO_RESULT_FAILED_PRECONDITION`. The input value of `num_ready_contexts`
-informs `MojoArmWatcher` that it may store information regarding up to 4 watches
-which currently prevent arming. In this case of course there is only one active
-watch, so upon return we will see:
-
-* `num_ready_contexts` is `1`.
-* `ready_contexts[0]` is `1234`.
-* `ready_results[0]` is `MOJO_RESULT_OK`
-* `ready_states[0]` is the last known signaling state of handle `a`.
-
-In other words the stored information mirrors what would have been the
-notification handler's arguments if the watcher were allowed to arm and thus
-notify immediately.
-
-### Cancelling a Watch
-
-There are three ways a watch can be cancelled:
-
-* The watched handle is closed
-* The watcher handle is closed (in which case all of its watches are cancelled.)
-* `MojoCancelWatch` is explicitly called for a given `context`.
-
-In the above example this means any of the following operations will cancel the
-watch on `a`:
-
-``` c
-// Close the watched handle...
-MojoClose(a);
-
-// OR close the watcher handle...
-MojoClose(w);
-
-// OR explicitly cancel.
-MojoResult result = MojoCancelWatch(w, 1234);
-```
-
-In every case the watcher's notification handler is invoked for the cancelled
-watch(es) regardless of whether or not the watcher is or was armed at the time.
-The notification handler receives a `result` of `MOJO_RESULT_CANCELLED` for
-these notifications, and this is guaranteed to be the final notification for any
-given watch context.
-
-### Practical Watch Context Usage
-
-It is common and probably wise to treat a watch's `context` value as an opaque
-pointer to some thread-safe state associated in some way with the handle being
-watched. Here's a small example which uses a single watcher to watch both ends
-of a message pipe and accumulate a count of messages received at each end.
-
-``` c
-// NOTE: For the sake of simplicity this example code is not in fact
-// thread-safe. As long as there's only one thread running in the process and
-// no external process connections, this is fine.
-
-struct WatchedHandleState {
-  MojoHandle watcher;
-  MojoHandle handle;
-  int message_count;
-};
-
-void OnNotification(uintptr_t context,
-                    MojoResult result,
-                    MojoHandleSignalsState signals_state,
-                    MojoWatcherNotificationFlags flags) {
-  struct WatchedHandleState* state = (struct WatchedHandleState*)(context);
-  MojoResult rv;
-
-  if (result == MOJO_RESULT_CANCELLED) {
-    // Cancellation is always the last notification and is guaranteed to
-    // eventually happen for every context, assuming no handles are leaked. We
-    // treat this as an opportunity to free the WatchedHandleState.
-    free(state);
-    return;
-  }
-
-  if (result == MOJO_RESULT_FAILED_PRECONDITION) {
-    // No longer readable, i.e. the other handle must have been closed. Better
-    // cancel. Note that we could also just call MojoClose(state->watcher) here
-    // since we know |context| is its only registered watch.
-    MojoCancelWatch(state->watcher, context);
-    return;
-  }
-
-  // This is the only handle watched by the watcher, so as long as we can't arm
-  // the watcher we know something's up with this handle. Try to read messages
-  // until we can successfully arm again or something goes terribly wrong.
-  while (MojoArmWatcher(state->watcher, NULL, NULL, NULL, NULL) ==
-         MOJO_RESULT_FAILED_PRECONDITION) {
-    rv = MojoReadMessageNew(state->handle, NULL, NULL, NULL,
-                            MOJO_READ_MESSAGE_FLAG_MAY_DISCARD);
-    if (rv == MOJO_RESULT_OK) {
-      state->message_count++;
-    } else if (rv == MOJO_RESULT_FAILED_PRECONDITION) {
-      MojoCancelWatch(state->watcher, context);
-      return;
-    }
-  }
-}
-
-MojoHandle a, b;
-MojoCreateMessagePipe(NULL, &a, &b);
-
-MojoHandle a_watcher, b_watcher;
-MojoCreateWatcher(&OnNotification, &a_watcher);
-MojoCreateWatcher(&OnNotification, &b_watcher)
-
-struct WatchedHandleState* a_state = malloc(sizeof(struct WatchedHandleState));
-a_state->watcher = a_watcher;
-a_state->handle = a;
-a_state->message_count = 0;
-
-struct WatchedHandleState* b_state = malloc(sizeof(struct WatchedHandleState));
-b_state->watcher = b_watcher;
-b_state->handle = b;
-b_state->message_count = 0;
-
-MojoWatch(a_watcher, a, MOJO_HANDLE_SIGNAL_READABLE, (uintptr_t)a_state);
-MojoWatch(b_watcher, b, MOJO_HANDLE_SIGNAL_READABLE, (uintptr_t)b_state);
-
-MojoArmWatcher(a_watcher, NULL, NULL, NULL, NULL);
-MojoArmWatcher(b_watcher, NULL, NULL, NULL, NULL);
-```
-
-Now any writes to `a` will increment `message_count` in `b_state`, and any
-writes to `b` will increment `message_count` in `a_state`.
-
-If either `a` or `b` is closed, both watches will be cancelled - one because
-watch cancellation is implicit in handle closure, and the other because its
-watcher will eventually detect that the handle is no longer readable.
diff --git a/mojo/public/c/system/buffer.h b/mojo/public/c/system/buffer.h
deleted file mode 100644
index 285e0d7..0000000
--- a/mojo/public/c/system/buffer.h
+++ /dev/null
@@ -1,188 +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.
-
-// This file contains types/constants and functions specific to shared buffers.
-//
-// Note: This header should be compilable as C.
-
-#ifndef MOJO_PUBLIC_C_SYSTEM_BUFFER_H_
-#define MOJO_PUBLIC_C_SYSTEM_BUFFER_H_
-
-#include <stdint.h>
-
-#include "mojo/public/c/system/macros.h"
-#include "mojo/public/c/system/system_export.h"
-#include "mojo/public/c/system/types.h"
-
-// |MojoCreateSharedBufferOptions|: Used to specify creation parameters for a
-// shared buffer to |MojoCreateSharedBuffer()|.
-//
-//   |uint32_t struct_size|: Set to the size of the
-//       |MojoCreateSharedBufferOptions| struct. (Used to allow for future
-//       extensions.)
-//
-//   |MojoCreateSharedBufferOptionsFlags flags|: Reserved for future use.
-//       |MOJO_CREATE_SHARED_BUFFER_OPTIONS_FLAG_NONE|: No flags; default mode.
-
-typedef uint32_t MojoCreateSharedBufferOptionsFlags;
-
-#ifdef __cplusplus
-const MojoCreateSharedBufferOptionsFlags
-    MOJO_CREATE_SHARED_BUFFER_OPTIONS_FLAG_NONE = 0;
-#else
-#define MOJO_CREATE_SHARED_BUFFER_OPTIONS_FLAG_NONE \
-  ((MojoCreateSharedBufferOptionsFlags)0)
-#endif
-
-MOJO_STATIC_ASSERT(MOJO_ALIGNOF(int64_t) == 8, "int64_t has weird alignment");
-struct MOJO_ALIGNAS(8) MojoCreateSharedBufferOptions {
-  uint32_t struct_size;
-  MojoCreateSharedBufferOptionsFlags flags;
-};
-MOJO_STATIC_ASSERT(sizeof(MojoCreateSharedBufferOptions) == 8,
-                   "MojoCreateSharedBufferOptions has wrong size");
-
-// |MojoDuplicateBufferHandleOptions|: Used to specify parameters in duplicating
-// access to a shared buffer to |MojoDuplicateBufferHandle()|.
-//
-//   |uint32_t struct_size|: Set to the size of the
-//       |MojoDuplicateBufferHandleOptions| struct. (Used to allow for future
-//       extensions.)
-//
-//   |MojoDuplicateBufferHandleOptionsFlags flags|: Flags to control the
-//       behavior of |MojoDuplicateBufferHandle()|. May be some combination of
-//       the following:
-//
-//       |MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_NONE|: No flags; default
-//           mode.
-//       |MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_READ_ONLY|: The duplicate
-//           shared buffer can only be mapped read-only. A read-only duplicate
-//           may only be created before any handles to the buffer are passed
-//           over a message pipe.
-
-typedef uint32_t MojoDuplicateBufferHandleOptionsFlags;
-
-#ifdef __cplusplus
-const MojoDuplicateBufferHandleOptionsFlags
-    MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_NONE = 0;
-const MojoDuplicateBufferHandleOptionsFlags
-    MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_READ_ONLY = 1 << 0;
-#else
-#define MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_NONE \
-  ((MojoDuplicateBufferHandleOptionsFlags)0)
-#define MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_READ_ONLY \
-  ((MojoDuplicateBufferHandleOptionsFlags)1 << 0)
-#endif
-
-struct MojoDuplicateBufferHandleOptions {
-  uint32_t struct_size;
-  MojoDuplicateBufferHandleOptionsFlags flags;
-};
-MOJO_STATIC_ASSERT(sizeof(MojoDuplicateBufferHandleOptions) == 8,
-                   "MojoDuplicateBufferHandleOptions has wrong size");
-
-// |MojoMapBufferFlags|: Used to specify different modes to |MojoMapBuffer()|.
-//   |MOJO_MAP_BUFFER_FLAG_NONE| - No flags; default mode.
-
-typedef uint32_t MojoMapBufferFlags;
-
-#ifdef __cplusplus
-const MojoMapBufferFlags MOJO_MAP_BUFFER_FLAG_NONE = 0;
-#else
-#define MOJO_MAP_BUFFER_FLAG_NONE ((MojoMapBufferFlags)0)
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-// Note: See the comment in functions.h about the meaning of the "optional"
-// label for pointer parameters.
-
-// Creates a buffer of size |num_bytes| bytes that can be shared between
-// processes. The returned handle may be duplicated any number of times by
-// |MojoDuplicateBufferHandle()|.
-//
-// To access the buffer's storage, one must call |MojoMapBuffer()|.
-//
-// |options| may be set to null for a shared buffer with the default options.
-//
-// On success, |*shared_buffer_handle| will be set to the handle for the shared
-// buffer. On failure it is not modified.
-//
-// Returns:
-//   |MOJO_RESULT_OK| on success.
-//   |MOJO_RESULT_INVALID_ARGUMENT| if some argument was invalid (e.g.,
-//       |*options| is invalid).
-//   |MOJO_RESULT_RESOURCE_EXHAUSTED| if a process/system/quota/etc. limit has
-//       been reached (e.g., if the requested size was too large, or if the
-//       maximum number of handles was exceeded).
-//   |MOJO_RESULT_UNIMPLEMENTED| if an unsupported flag was set in |*options|.
-MOJO_SYSTEM_EXPORT MojoResult MojoCreateSharedBuffer(
-    const struct MojoCreateSharedBufferOptions* options,  // Optional.
-    uint64_t num_bytes,                                   // In.
-    MojoHandle* shared_buffer_handle);                    // Out.
-
-// Duplicates the handle |buffer_handle| as a new shared buffer handle. On
-// success this returns the new handle in |*new_buffer_handle|. A shared buffer
-// remains allocated as long as there is at least one shared buffer handle
-// referencing it in at least one process in the system.
-//
-// |options| may be set to null to duplicate the buffer handle with the default
-// options.
-//
-// Returns:
-//   |MOJO_RESULT_OK| on success.
-//   |MOJO_RESULT_INVALID_ARGUMENT| if some argument was invalid (e.g.,
-//       |buffer_handle| is not a valid buffer handle or |*options| is invalid).
-//   |MOJO_RESULT_UNIMPLEMENTED| if an unsupported flag was set in |*options|.
-MOJO_SYSTEM_EXPORT MojoResult MojoDuplicateBufferHandle(
-    MojoHandle buffer_handle,
-    const struct MojoDuplicateBufferHandleOptions* options,  // Optional.
-    MojoHandle* new_buffer_handle);                          // Out.
-
-// Maps the part (at offset |offset| of length |num_bytes|) of the buffer given
-// by |buffer_handle| into memory, with options specified by |flags|. |offset +
-// num_bytes| must be less than or equal to the size of the buffer. On success,
-// |*buffer| points to memory with the requested part of the buffer. On
-// failure |*buffer| it is not modified.
-//
-// A single buffer handle may have multiple active mappings The permissions
-// (e.g., writable or executable) of the returned memory depend on th
-// properties of the buffer and properties attached to the buffer handle, as
-// well as |flags|.
-//
-// A mapped buffer must eventually be unmapped by calling |MojoUnmapBuffer()|
-// with the value of |*buffer| returned by this function.
-//
-// Returns:
-//   |MOJO_RESULT_OK| on success.
-//   |MOJO_RESULT_INVALID_ARGUMENT| if some argument was invalid (e.g.,
-//       |buffer_handle| is not a valid buffer handle or the range specified by
-//       |offset| and |num_bytes| is not valid).
-//   |MOJO_RESULT_RESOURCE_EXHAUSTED| if the mapping operation itself failed
-//       (e.g., due to not having appropriate address space available).
-MOJO_SYSTEM_EXPORT MojoResult MojoMapBuffer(MojoHandle buffer_handle,
-                                            uint64_t offset,
-                                            uint64_t num_bytes,
-                                            void** buffer,  // Out.
-                                            MojoMapBufferFlags flags);
-
-// Unmaps a buffer pointer that was mapped by |MojoMapBuffer()|. |buffer| must
-// have been the result of |MojoMapBuffer()| (not some other pointer inside
-// the mapped memory), and the entire mapping will be removed.
-//
-// A mapping may only be unmapped once.
-//
-// Returns:
-//   |MOJO_RESULT_OK| on success.
-//   |MOJO_RESULT_INVALID_ARGUMENT| if |buffer| is invalid (e.g., is not the
-//       result of |MojoMapBuffer()| or has already been unmapped).
-MOJO_SYSTEM_EXPORT MojoResult MojoUnmapBuffer(void* buffer);  // In.
-
-#ifdef __cplusplus
-}  // extern "C"
-#endif
-
-#endif  // MOJO_PUBLIC_C_SYSTEM_BUFFER_H_
diff --git a/mojo/public/c/system/core.h b/mojo/public/c/system/core.h
deleted file mode 100644
index 03c0652..0000000
--- a/mojo/public/c/system/core.h
+++ /dev/null
@@ -1,22 +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.
-
-// This is a catch-all header that includes everything.
-//
-// Note: This header should be compilable as C.
-
-#ifndef MOJO_PUBLIC_C_SYSTEM_CORE_H_
-#define MOJO_PUBLIC_C_SYSTEM_CORE_H_
-
-#include "mojo/public/c/system/buffer.h"
-#include "mojo/public/c/system/data_pipe.h"
-#include "mojo/public/c/system/functions.h"
-#include "mojo/public/c/system/macros.h"
-#include "mojo/public/c/system/message_pipe.h"
-#include "mojo/public/c/system/platform_handle.h"
-#include "mojo/public/c/system/system_export.h"
-#include "mojo/public/c/system/types.h"
-#include "mojo/public/c/system/watcher.h"
-
-#endif  // MOJO_PUBLIC_C_SYSTEM_CORE_H_
diff --git a/mojo/public/c/system/data_pipe.h b/mojo/public/c/system/data_pipe.h
deleted file mode 100644
index f51e36c..0000000
--- a/mojo/public/c/system/data_pipe.h
+++ /dev/null
@@ -1,344 +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.
-
-// This file contains types/constants and functions specific to data pipes.
-//
-// Note: This header should be compilable as C.
-
-#ifndef MOJO_PUBLIC_C_SYSTEM_DATA_PIPE_H_
-#define MOJO_PUBLIC_C_SYSTEM_DATA_PIPE_H_
-
-#include <stdint.h>
-
-#include "mojo/public/c/system/macros.h"
-#include "mojo/public/c/system/system_export.h"
-#include "mojo/public/c/system/types.h"
-
-// |MojoCreateDataPipeOptions|: Used to specify creation parameters for a data
-// pipe to |MojoCreateDataPipe()|.
-//
-//   |uint32_t struct_size|: Set to the size of the |MojoCreateDataPipeOptions|
-//       struct. (Used to allow for future extensions.)
-//
-//   |MojoCreateDataPipeOptionsFlags flags|: Used to specify different modes of
-//       operation. May be some combination of the following values:
-//
-//       |MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE|: No flags; default mode.
-//
-//   |uint32_t element_num_bytes|: The size of an element, in bytes. All
-//       transactions and buffers will consist of an integral number of
-//       elements. Must be nonzero.
-//
-//   |uint32_t capacity_num_bytes|: The capacity of the data pipe, in number of
-//       bytes; must be a multiple of |element_num_bytes|. The data pipe will
-//       always be able to queue AT LEAST this much data. Set to zero to opt for
-//       a system-dependent automatically-calculated capacity (which will always
-//       be at least one element).
-
-typedef uint32_t MojoCreateDataPipeOptionsFlags;
-
-#ifdef __cplusplus
-const MojoCreateDataPipeOptionsFlags MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE =
-    0;
-#else
-#define MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE \
-  ((MojoCreateDataPipeOptionsFlags)0)
-#endif
-
-MOJO_STATIC_ASSERT(MOJO_ALIGNOF(int64_t) == 8, "int64_t has weird alignment");
-struct MOJO_ALIGNAS(8) MojoCreateDataPipeOptions {
-  MOJO_ALIGNAS(4) uint32_t struct_size;
-  MOJO_ALIGNAS(4) MojoCreateDataPipeOptionsFlags flags;
-  MOJO_ALIGNAS(4) uint32_t element_num_bytes;
-  MOJO_ALIGNAS(4) uint32_t capacity_num_bytes;
-};
-MOJO_STATIC_ASSERT(sizeof(MojoCreateDataPipeOptions) == 16,
-                   "MojoCreateDataPipeOptions has wrong size");
-
-// |MojoWriteDataFlags|: Used to specify different modes to |MojoWriteData()|
-// and |MojoBeginWriteData()|. May be some combination of the following values:
-//
-//   |MOJO_WRITE_DATA_FLAG_NONE| - No flags; default mode.
-//   |MOJO_WRITE_DATA_FLAG_ALL_OR_NONE| - Write either all the elements
-//      requested or none of them.
-
-typedef uint32_t MojoWriteDataFlags;
-
-#ifdef __cplusplus
-const MojoWriteDataFlags MOJO_WRITE_DATA_FLAG_NONE = 0;
-const MojoWriteDataFlags MOJO_WRITE_DATA_FLAG_ALL_OR_NONE = 1 << 0;
-#else
-#define MOJO_WRITE_DATA_FLAG_NONE ((MojoWriteDataFlags)0)
-#define MOJO_WRITE_DATA_FLAG_ALL_OR_NONE ((MojoWriteDataFlags)1 << 0)
-#endif
-
-// |MojoReadDataFlags|: Used to specify different modes to |MojoReadData()| and
-// |MojoBeginReadData()|. May be some combination of the following values:
-//
-//   |MOJO_READ_DATA_FLAG_NONE| - No flags; default mode.
-//   |MOJO_READ_DATA_FLAG_ALL_OR_NONE| - Read (or discard) either the requested
-//        number of elements or none. NOTE: This flag is not currently supported
-//        by |MojoBeginReadData()|.
-//   |MOJO_READ_DATA_FLAG_DISCARD| - Discard (up to) the requested number of
-//        elements.
-//   |MOJO_READ_DATA_FLAG_QUERY| - Query the number of elements available to
-//       read. For use with |MojoReadData()| only. Mutually exclusive with
-//       |MOJO_READ_DATA_FLAG_DISCARD|, and |MOJO_READ_DATA_FLAG_ALL_OR_NONE|
-//       is ignored if this flag is set.
-//   |MOJO_READ_DATA_FLAG_PEEK| - Read elements without removing them. For use
-//       with |MojoReadData()| only. Mutually exclusive with
-//       |MOJO_READ_DATA_FLAG_DISCARD| and |MOJO_READ_DATA_FLAG_QUERY|.
-
-typedef uint32_t MojoReadDataFlags;
-
-#ifdef __cplusplus
-const MojoReadDataFlags MOJO_READ_DATA_FLAG_NONE = 0;
-const MojoReadDataFlags MOJO_READ_DATA_FLAG_ALL_OR_NONE = 1 << 0;
-const MojoReadDataFlags MOJO_READ_DATA_FLAG_DISCARD = 1 << 1;
-const MojoReadDataFlags MOJO_READ_DATA_FLAG_QUERY = 1 << 2;
-const MojoReadDataFlags MOJO_READ_DATA_FLAG_PEEK = 1 << 3;
-#else
-#define MOJO_READ_DATA_FLAG_NONE ((MojoReadDataFlags)0)
-#define MOJO_READ_DATA_FLAG_ALL_OR_NONE ((MojoReadDataFlags)1 << 0)
-#define MOJO_READ_DATA_FLAG_DISCARD ((MojoReadDataFlags)1 << 1)
-#define MOJO_READ_DATA_FLAG_QUERY ((MojoReadDataFlags)1 << 2)
-#define MOJO_READ_DATA_FLAG_PEEK ((MojoReadDataFlags)1 << 3)
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-// Note: See the comment in functions.h about the meaning of the "optional"
-// label for pointer parameters.
-
-// Creates a data pipe, which is a unidirectional communication channel for
-// unframed data. Data must be read and written in multiples of discrete
-// discrete elements of size given in |options|.
-//
-// See |MojoCreateDataPipeOptions| for a description of the different options
-// available for data pipes.
-//
-// |options| may be set to null for a data pipe with the default options (which
-// will have an element size of one byte and have some system-dependent
-// capacity).
-//
-// On success, |*data_pipe_producer_handle| will be set to the handle for the
-// producer and |*data_pipe_consumer_handle| will be set to the handle for the
-// consumer. On failure they are not modified.
-//
-// Returns:
-//   |MOJO_RESULT_OK| on success.
-//   |MOJO_RESULT_INVALID_ARGUMENT| if some argument was invalid (e.g.,
-//       |*options| is invalid).
-//   |MOJO_RESULT_RESOURCE_EXHAUSTED| if a process/system/quota/etc. limit has
-//       been reached (e.g., if the requested capacity was too large, or if the
-//       maximum number of handles was exceeded).
-//   |MOJO_RESULT_UNIMPLEMENTED| if an unsupported flag was set in |*options|.
-MOJO_SYSTEM_EXPORT MojoResult MojoCreateDataPipe(
-    const struct MojoCreateDataPipeOptions* options,  // Optional.
-    MojoHandle* data_pipe_producer_handle,            // Out.
-    MojoHandle* data_pipe_consumer_handle);           // Out.
-
-// Writes the data pipe producer given by |data_pipe_producer_handle|.
-//
-// |elements| points to data of size |*num_bytes|; |*num_bytes| must be a
-// multiple of the data pipe's element size. If
-// |MOJO_WRITE_DATA_FLAG_ALL_OR_NONE| is set in |flags|, either all the data
-// is written (if enough write capacity is available) or none is.
-//
-// On success |*num_bytes| is set to the amount of data that was actually
-// written. On failure it is unmodified.
-//
-// Returns:
-//   |MOJO_RESULT_OK| on success.
-//   |MOJO_RESULT_INVALID_ARGUMENT| if some argument was invalid (e.g.,
-//       |data_pipe_producer_dispatcher| is not a handle to a data pipe
-//       producer or |*num_bytes| is not a multiple of the data pipe's element
-//       size.)
-//   |MOJO_RESULT_FAILED_PRECONDITION| if the data pipe consumer handle has been
-//       closed.
-//   |MOJO_RESULT_OUT_OF_RANGE| if |flags| has
-//       |MOJO_WRITE_DATA_FLAG_ALL_OR_NONE| set and the required amount of data
-//       (specified by |*num_bytes|) could not be written.
-//   |MOJO_RESULT_BUSY| if there is a two-phase write ongoing with
-//       |data_pipe_producer_handle| (i.e., |MojoBeginWriteData()| has been
-//       called, but not yet the matching |MojoEndWriteData()|).
-//   |MOJO_RESULT_SHOULD_WAIT| if no data can currently be written (and the
-//       consumer is still open) and |flags| does *not* have
-//       |MOJO_WRITE_DATA_FLAG_ALL_OR_NONE| set.
-MOJO_SYSTEM_EXPORT MojoResult
-    MojoWriteData(MojoHandle data_pipe_producer_handle,
-                  const void* elements,
-                  uint32_t* num_bytes,  // In/out.
-                  MojoWriteDataFlags flags);
-
-// Begins a two-phase write to the data pipe producer given by
-// |data_pipe_producer_handle|. On success |*buffer| will be a pointer to which
-// the caller can write up to |*buffer_num_bytes| bytes of data.
-//
-// During a two-phase write, |data_pipe_producer_handle| is *not* writable.
-// If another caller tries to write to it by calling |MojoWriteData()| or
-// |MojoBeginWriteData()|, their request will fail with |MOJO_RESULT_BUSY|.
-//
-// If |MojoBeginWriteData()| returns MOJO_RESULT_OK and once the caller has
-// finished writing data to |*buffer|, |MojoEndWriteData()| must be called to
-// indicate the amount of data actually written and to complete the two-phase
-// write operation. |MojoEndWriteData()| need not be called when
-// |MojoBeginWriteData()| fails.
-//
-// Returns:
-//   |MOJO_RESULT_OK| on success.
-//   |MOJO_RESULT_INVALID_ARGUMENT| if some argument was invalid (e.g.,
-//       |data_pipe_producer_handle| is not a handle to a data pipe producer or
-//       flags has |MOJO_WRITE_DATA_FLAG_ALL_OR_NONE| set.
-//   |MOJO_RESULT_FAILED_PRECONDITION| if the data pipe consumer handle has been
-//       closed.
-//   |MOJO_RESULT_BUSY| if there is already a two-phase write ongoing with
-//       |data_pipe_producer_handle| (i.e., |MojoBeginWriteData()| has been
-//       called, but not yet the matching |MojoEndWriteData()|).
-//   |MOJO_RESULT_SHOULD_WAIT| if no data can currently be written (and the
-//       consumer is still open).
-MOJO_SYSTEM_EXPORT MojoResult
-    MojoBeginWriteData(MojoHandle data_pipe_producer_handle,
-                       void** buffer,               // Out.
-                       uint32_t* buffer_num_bytes,  // In/out.
-                       MojoWriteDataFlags flags);
-
-// Ends a two-phase write that was previously initiated by
-// |MojoBeginWriteData()| for the same |data_pipe_producer_handle|.
-//
-// |num_bytes_written| must indicate the number of bytes actually written into
-// the two-phase write buffer. It must be less than or equal to the value of
-// |*buffer_num_bytes| output by |MojoBeginWriteData()|, and it must be a
-// multiple of the data pipe's element size.
-//
-// On failure, the two-phase write (if any) is ended (so the handle may become
-// writable again if there's space available) but no data written to |*buffer|
-// is "put into" the data pipe.
-//
-// Returns:
-//   |MOJO_RESULT_OK| on success.
-//   |MOJO_RESULT_INVALID_ARGUMENT| if some argument was invalid (e.g.,
-//       |data_pipe_producer_handle| is not a handle to a data pipe producer or
-//       |num_bytes_written| is invalid (greater than the maximum value provided
-//       by |MojoBeginWriteData()| or not a multiple of the element size).
-//   |MOJO_RESULT_FAILED_PRECONDITION| if the data pipe producer is not in a
-//       two-phase write (e.g., |MojoBeginWriteData()| was not called or
-//       |MojoEndWriteData()| has already been called).
-MOJO_SYSTEM_EXPORT MojoResult
-    MojoEndWriteData(MojoHandle data_pipe_producer_handle,
-                     uint32_t num_bytes_written);
-
-// Reads data from the data pipe consumer given by |data_pipe_consumer_handle|.
-// May also be used to discard data or query the amount of data available.
-//
-// If |flags| has neither |MOJO_READ_DATA_FLAG_DISCARD| nor
-// |MOJO_READ_DATA_FLAG_QUERY| set, this tries to read up to |*num_bytes| (which
-// must be a multiple of the data pipe's element size) bytes of data to
-// |elements| and set |*num_bytes| to the amount actually read. If flags has
-// |MOJO_READ_DATA_FLAG_ALL_OR_NONE| set, it will either read exactly
-// |*num_bytes| bytes of data or none. Additionally, if flags has
-// |MOJO_READ_DATA_FLAG_PEEK| set, the data read will remain in the pipe and be
-// available to future reads.
-//
-// If flags has |MOJO_READ_DATA_FLAG_DISCARD| set, it discards up to
-// |*num_bytes| (which again must be a multiple of the element size) bytes of
-// data, setting |*num_bytes| to the amount actually discarded. If flags has
-// |MOJO_READ_DATA_FLAG_ALL_OR_NONE|, it will either discard exactly
-// |*num_bytes| bytes of data or none. In this case, |MOJO_READ_DATA_FLAG_QUERY|
-// must not be set, and |elements| is ignored (and should typically be set to
-// null).
-//
-// If flags has |MOJO_READ_DATA_FLAG_QUERY| set, it queries the amount of data
-// available, setting |*num_bytes| to the number of bytes available. In this
-// case, |MOJO_READ_DATA_FLAG_DISCARD| must not be set, and
-// |MOJO_READ_DATA_FLAG_ALL_OR_NONE| is ignored, as are |elements| and the input
-// value of |*num_bytes|.
-//
-// Returns:
-//   |MOJO_RESULT_OK| on success (see above for a description of the different
-//       operations).
-//   |MOJO_RESULT_INVALID_ARGUMENT| if some argument was invalid (e.g.,
-//       |data_pipe_consumer_handle| is invalid, the combination of flags in
-//       |flags| is invalid, etc.).
-//   |MOJO_RESULT_FAILED_PRECONDITION| if the data pipe producer handle has been
-//       closed and data (or the required amount of data) was not available to
-//       be read or discarded.
-//   |MOJO_RESULT_OUT_OF_RANGE| if |flags| has |MOJO_READ_DATA_FLAG_ALL_OR_NONE|
-//       set and the required amount of data is not available to be read or
-//       discarded (and the producer is still open).
-//   |MOJO_RESULT_BUSY| if there is a two-phase read ongoing with
-//       |data_pipe_consumer_handle| (i.e., |MojoBeginReadData()| has been
-//       called, but not yet the matching |MojoEndReadData()|).
-//   |MOJO_RESULT_SHOULD_WAIT| if there is no data to be read or discarded (and
-//       the producer is still open) and |flags| does *not* have
-//       |MOJO_READ_DATA_FLAG_ALL_OR_NONE| set.
-MOJO_SYSTEM_EXPORT MojoResult MojoReadData(MojoHandle data_pipe_consumer_handle,
-                                           void* elements,       // Out.
-                                           uint32_t* num_bytes,  // In/out.
-                                           MojoReadDataFlags flags);
-
-// Begins a two-phase read from the data pipe consumer given by
-// |data_pipe_consumer_handle|. On success, |*buffer| will be a pointer from
-// which the caller can read up to |*buffer_num_bytes| bytes of data.
-//
-// During a two-phase read, |data_pipe_consumer_handle| is *not* readable.
-// If another caller tries to read from it by calling |MojoReadData()| or
-// |MojoBeginReadData()|, their request will fail with |MOJO_RESULT_BUSY|.
-//
-// Once the caller has finished reading data from |*buffer|, |MojoEndReadData()|
-// must be called to indicate the number of bytes read and to complete the
-// two-phase read operation.
-//
-// |flags| must not have |MOJO_READ_DATA_FLAG_DISCARD|,
-// |MOJO_READ_DATA_FLAG_QUERY|, |MOJO_READ_DATA_FLAG_PEEK|, or
-// |MOJO_READ_DATA_FLAG_ALL_OR_NONE| set.
-//
-// Returns:
-//   |MOJO_RESULT_OK| on success.
-//   |MOJO_RESULT_INVALID_ARGUMENT| if some argument was invalid (e.g.,
-//       |data_pipe_consumer_handle| is not a handle to a data pipe consumer,
-//       or |flags| has invalid flags set.)
-//   |MOJO_RESULT_FAILED_PRECONDITION| if the data pipe producer handle has been
-//       closed.
-//   |MOJO_RESULT_BUSY| if there is already a two-phase read ongoing with
-//       |data_pipe_consumer_handle| (i.e., |MojoBeginReadData()| has been
-//       called, but not yet the matching |MojoEndReadData()|).
-//   |MOJO_RESULT_SHOULD_WAIT| if no data can currently be read (and the
-//       producer is still open).
-MOJO_SYSTEM_EXPORT MojoResult
-    MojoBeginReadData(MojoHandle data_pipe_consumer_handle,
-                      const void** buffer,         // Out.
-                      uint32_t* buffer_num_bytes,  // In/out.
-                      MojoReadDataFlags flags);
-
-// Ends a two-phase read from the data pipe consumer given by
-// |data_pipe_consumer_handle| that was begun by a call to |MojoBeginReadData()|
-// on the same handle. |num_bytes_read| should indicate the amount of data
-// actually read; it must be less than or equal to the value of
-// |*buffer_num_bytes| output by |MojoBeginReadData()| and must be a multiple of
-// the element size.
-//
-// On failure, the two-phase read (if any) is ended (so the handle may become
-// readable again) but no data is "removed" from the data pipe.
-//
-// Returns:
-//   |MOJO_RESULT_OK| on success.
-//   |MOJO_RESULT_INVALID_ARGUMENT| if some argument was invalid (e.g.,
-//       |data_pipe_consumer_handle| is not a handle to a data pipe consumer or
-//       |num_bytes_written| is greater than the maximum value provided by
-//       |MojoBeginReadData()| or not a multiple of the element size).
-//   |MOJO_RESULT_FAILED_PRECONDITION| if the data pipe consumer is not in a
-//       two-phase read (e.g., |MojoBeginReadData()| was not called or
-//       |MojoEndReadData()| has already been called).
-MOJO_SYSTEM_EXPORT MojoResult
-    MojoEndReadData(MojoHandle data_pipe_consumer_handle,
-                    uint32_t num_bytes_read);
-
-#ifdef __cplusplus
-}  // extern "C"
-#endif
-
-#endif  // MOJO_PUBLIC_C_SYSTEM_DATA_PIPE_H_
diff --git a/mojo/public/c/system/functions.h b/mojo/public/c/system/functions.h
deleted file mode 100644
index d0656c6..0000000
--- a/mojo/public/c/system/functions.h
+++ /dev/null
@@ -1,78 +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.
-
-// This file contains basic functions common to different Mojo system APIs.
-//
-// Note: This header should be compilable as C.
-
-#ifndef MOJO_PUBLIC_C_SYSTEM_FUNCTIONS_H_
-#define MOJO_PUBLIC_C_SYSTEM_FUNCTIONS_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include "mojo/public/c/system/system_export.h"
-#include "mojo/public/c/system/types.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-// Note: Pointer parameters that are labelled "optional" may be null (at least
-// under some circumstances). Non-const pointer parameters are also labeled
-// "in", "out", or "in/out", to indicate how they are used. (Note that how/if
-// such a parameter is used may depend on other parameters or the requested
-// operation's success/failure. E.g., a separate |flags| parameter may control
-// whether a given "in/out" parameter is used for input, output, or both.)
-
-// Returns the time, in microseconds, since some undefined point in the past.
-// The values are only meaningful relative to other values that were obtained
-// from the same device without an intervening system restart. Such values are
-// guaranteed to be monotonically non-decreasing with the passage of real time.
-// Although the units are microseconds, the resolution of the clock may vary and
-// is typically in the range of ~1-15 ms.
-MOJO_SYSTEM_EXPORT MojoTimeTicks MojoGetTimeTicksNow(void);
-
-// Closes the given |handle|.
-//
-// Returns:
-//   |MOJO_RESULT_OK| on success.
-//   |MOJO_RESULT_INVALID_ARGUMENT| if |handle| is not a valid handle.
-//
-// Concurrent operations on |handle| may succeed (or fail as usual) if they
-// happen before the close, be cancelled with result |MOJO_RESULT_CANCELLED| if
-// they properly overlap (this is likely the case with watchers), or fail with
-// |MOJO_RESULT_INVALID_ARGUMENT| if they happen after.
-MOJO_SYSTEM_EXPORT MojoResult MojoClose(MojoHandle handle);
-
-// Queries the last known signals state of a handle.
-//
-// Note that no guarantees can be made about the accuracy of the returned
-// signals state by the time this returns, as other threads in the system may
-// change the handle's state at any time. Use with appropriate discretion.
-//
-// Returns:
-//   |MOJO_RESULT_OK| on success. |*signals_state| is populated with the
-//       last known signals state of |handle|.
-//   |MOJO_RESULT_INVALID_ARGUMENT| if |handle| is not a valid handle or
-//       |signals_state| is null.
-MOJO_SYSTEM_EXPORT MojoResult
-MojoQueryHandleSignalsState(MojoHandle handle,
-                            struct MojoHandleSignalsState* signals_state);
-
-// Retrieves system properties. See the documentation for |MojoPropertyType| for
-// supported property types and their corresponding output value type.
-//
-// Returns:
-//     |MOJO_RESULT_OK| on success.
-//     |MOJO_RESULT_INVALID_ARGUMENT| if |type| is not recognized. In this case,
-//         |value| is untouched.
-MOJO_SYSTEM_EXPORT MojoResult MojoGetProperty(MojoPropertyType type,
-                                              void* value);
-
-#ifdef __cplusplus
-}  // extern "C"
-#endif
-
-#endif  // MOJO_PUBLIC_C_SYSTEM_FUNCTIONS_H_
diff --git a/mojo/public/c/system/macros.h b/mojo/public/c/system/macros.h
deleted file mode 100644
index 917c69c..0000000
--- a/mojo/public/c/system/macros.h
+++ /dev/null
@@ -1,49 +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 MOJO_PUBLIC_C_SYSTEM_MACROS_H_
-#define MOJO_PUBLIC_C_SYSTEM_MACROS_H_
-
-#include <stddef.h>
-
-// Assert things at compile time. (|msg| should be a valid identifier name.)
-// This macro is currently C++-only, but we want to use it in the C core.h.
-// Use like:
-//   MOJO_STATIC_ASSERT(sizeof(Foo) == 12, "Foo has invalid size");
-#if defined(__cplusplus)
-#define MOJO_STATIC_ASSERT(expr, msg) static_assert(expr, msg)
-#else
-#define MOJO_STATIC_ASSERT(expr, msg)
-#endif
-
-// Like the C++11 |alignof| operator.
-#if __cplusplus >= 201103L
-#define MOJO_ALIGNOF(type) alignof(type)
-#elif defined(__GNUC__)
-#define MOJO_ALIGNOF(type) __alignof__(type)
-#elif defined(_MSC_VER)
-// The use of |sizeof| is to work around a bug in MSVC 2010 (see
-// http://goo.gl/isH0C; supposedly fixed since then).
-#define MOJO_ALIGNOF(type) (sizeof(type) - sizeof(type) + __alignof(type))
-#else
-#error "Please define MOJO_ALIGNOF() for your compiler."
-#endif
-
-// Specify the alignment of a |struct|, etc.
-// Use like:
-//   struct MOJO_ALIGNAS(8) Foo { ... };
-// Unlike the C++11 |alignas()|, |alignment| must be an integer. It may not be a
-// type, nor can it be an expression like |MOJO_ALIGNOF(type)| (due to the
-// non-C++11 MSVS version).
-#if __cplusplus >= 201103L
-#define MOJO_ALIGNAS(alignment) alignas(alignment)
-#elif defined(__GNUC__)
-#define MOJO_ALIGNAS(alignment) __attribute__((aligned(alignment)))
-#elif defined(_MSC_VER)
-#define MOJO_ALIGNAS(alignment) __declspec(align(alignment))
-#else
-#error "Please define MOJO_ALIGNAS() for your compiler."
-#endif
-
-#endif  // MOJO_PUBLIC_C_SYSTEM_MACROS_H_
diff --git a/mojo/public/c/system/message_pipe.h b/mojo/public/c/system/message_pipe.h
deleted file mode 100644
index b759bc7..0000000
--- a/mojo/public/c/system/message_pipe.h
+++ /dev/null
@@ -1,341 +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.
-
-// This file contains types/constants and functions specific to message pipes.
-//
-// Note: This header should be compilable as C.
-
-#ifndef MOJO_PUBLIC_C_SYSTEM_MESSAGE_PIPE_H_
-#define MOJO_PUBLIC_C_SYSTEM_MESSAGE_PIPE_H_
-
-#include <stdint.h>
-
-#include "mojo/public/c/system/macros.h"
-#include "mojo/public/c/system/system_export.h"
-#include "mojo/public/c/system/types.h"
-
-// |MojoMessageHandle|: Used to refer to message objects created by
-//     |MojoAllocMessage()| and transferred by |MojoWriteMessageNew()| or
-//     |MojoReadMessageNew()|.
-
-typedef uintptr_t MojoMessageHandle;
-
-#ifdef __cplusplus
-const MojoMessageHandle MOJO_MESSAGE_HANDLE_INVALID = 0;
-#else
-#define MOJO_MESSAGE_HANDLE_INVALID ((MojoMessageHandle)0)
-#endif
-
-// |MojoCreateMessagePipeOptions|: Used to specify creation parameters for a
-// message pipe to |MojoCreateMessagePipe()|.
-//   |uint32_t struct_size|: Set to the size of the
-//       |MojoCreateMessagePipeOptions| struct. (Used to allow for future
-//       extensions.)
-//   |MojoCreateMessagePipeOptionsFlags flags|: Used to specify different modes
-//       of operation.
-//       |MOJO_CREATE_MESSAGE_PIPE_OPTIONS_FLAG_NONE|: No flags; default mode.
-
-typedef uint32_t MojoCreateMessagePipeOptionsFlags;
-
-#ifdef __cplusplus
-const MojoCreateMessagePipeOptionsFlags
-    MOJO_CREATE_MESSAGE_PIPE_OPTIONS_FLAG_NONE = 0;
-#else
-#define MOJO_CREATE_MESSAGE_PIPE_OPTIONS_FLAG_NONE \
-  ((MojoCreateMessagePipeOptionsFlags)0)
-#endif
-
-MOJO_STATIC_ASSERT(MOJO_ALIGNOF(int64_t) == 8, "int64_t has weird alignment");
-struct MOJO_ALIGNAS(8) MojoCreateMessagePipeOptions {
-  uint32_t struct_size;
-  MojoCreateMessagePipeOptionsFlags flags;
-};
-MOJO_STATIC_ASSERT(sizeof(MojoCreateMessagePipeOptions) == 8,
-                   "MojoCreateMessagePipeOptions has wrong size");
-
-// |MojoWriteMessageFlags|: Used to specify different modes to
-// |MojoWriteMessage()|.
-//   |MOJO_WRITE_MESSAGE_FLAG_NONE| - No flags; default mode.
-
-typedef uint32_t MojoWriteMessageFlags;
-
-#ifdef __cplusplus
-const MojoWriteMessageFlags MOJO_WRITE_MESSAGE_FLAG_NONE = 0;
-#else
-#define MOJO_WRITE_MESSAGE_FLAG_NONE ((MojoWriteMessageFlags)0)
-#endif
-
-// |MojoReadMessageFlags|: Used to specify different modes to
-// |MojoReadMessage()|.
-//   |MOJO_READ_MESSAGE_FLAG_NONE| - No flags; default mode.
-//   |MOJO_READ_MESSAGE_FLAG_MAY_DISCARD| - If the message is unable to be read
-//       for whatever reason (e.g., the caller-supplied buffer is too small),
-//       discard the message (i.e., simply dequeue it).
-
-typedef uint32_t MojoReadMessageFlags;
-
-#ifdef __cplusplus
-const MojoReadMessageFlags MOJO_READ_MESSAGE_FLAG_NONE = 0;
-const MojoReadMessageFlags MOJO_READ_MESSAGE_FLAG_MAY_DISCARD = 1 << 0;
-#else
-#define MOJO_READ_MESSAGE_FLAG_NONE ((MojoReadMessageFlags)0)
-#define MOJO_READ_MESSAGE_FLAG_MAY_DISCARD ((MojoReadMessageFlags)1 << 0)
-#endif
-
-// |MojoAllocMessageFlags|: Used to specify different options for
-// |MojoAllocMessage()|.
-//   |MOJO_ALLOC_MESSAGE_FLAG_NONE| - No flags; default mode.
-
-typedef uint32_t MojoAllocMessageFlags;
-
-#ifdef __cplusplus
-const MojoAllocMessageFlags MOJO_ALLOC_MESSAGE_FLAG_NONE = 0;
-#else
-#define MOJO_ALLOC_MESSAGE_FLAG_NONE ((MojoAllocMessageFlags)0)
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-// Note: See the comment in functions.h about the meaning of the "optional"
-// label for pointer parameters.
-
-// Creates a message pipe, which is a bidirectional communication channel for
-// framed data (i.e., messages). Messages can contain plain data and/or Mojo
-// handles.
-//
-// |options| may be set to null for a message pipe with the default options.
-//
-// On success, |*message_pipe_handle0| and |*message_pipe_handle1| are set to
-// handles for the two endpoints (ports) for the message pipe.
-//
-// Returns:
-//   |MOJO_RESULT_OK| on success.
-//   |MOJO_RESULT_INVALID_ARGUMENT| if some argument was invalid (e.g.,
-//       |*options| is invalid).
-//   |MOJO_RESULT_RESOURCE_EXHAUSTED| if a process/system/quota/etc. limit has
-//       been reached.
-MOJO_SYSTEM_EXPORT MojoResult MojoCreateMessagePipe(
-    const struct MojoCreateMessagePipeOptions* options,  // Optional.
-    MojoHandle* message_pipe_handle0,                    // Out.
-    MojoHandle* message_pipe_handle1);                   // Out.
-
-// Writes a message to the message pipe endpoint given by |message_pipe_handle|,
-// with message data specified by |bytes| of size |num_bytes| and attached
-// handles specified by |handles| of count |num_handles|, and options specified
-// by |flags|. If there is no message data, |bytes| may be null, in which case
-// |num_bytes| must be zero. If there are no attached handles, |handles| may be
-// null, in which case |num_handles| must be zero.
-//
-// If handles are attached, the handles will no longer be valid (on success the
-// receiver will receive equivalent, but logically different, handles). Handles
-// to be sent should not be in simultaneous use (e.g., on another thread).
-//
-// Returns:
-//   |MOJO_RESULT_OK| on success (i.e., the message was enqueued).
-//   |MOJO_RESULT_INVALID_ARGUMENT| if some argument was invalid (e.g., if
-//       |message_pipe_handle| is not a valid handle, or some of the
-//       requirements above are not satisfied).
-//   |MOJO_RESULT_RESOURCE_EXHAUSTED| if some system limit has been reached, or
-//       the number of handles to send is too large (TODO(vtl): reconsider the
-//       latter case).
-//   |MOJO_RESULT_FAILED_PRECONDITION| if the other endpoint has been closed.
-//       Note that closing an endpoint is not necessarily synchronous (e.g.,
-//       across processes), so this function may succeed even if the other
-//       endpoint has been closed (in which case the message would be dropped).
-//   |MOJO_RESULT_UNIMPLEMENTED| if an unsupported flag was set in |*options|.
-//   |MOJO_RESULT_BUSY| if some handle to be sent is currently in use.
-//
-// TODO(vtl): Add a notion of capacity for message pipes, and return
-// |MOJO_RESULT_SHOULD_WAIT| if the message pipe is full.
-MOJO_SYSTEM_EXPORT MojoResult
-    MojoWriteMessage(MojoHandle message_pipe_handle,
-                     const void* bytes,  // Optional.
-                     uint32_t num_bytes,
-                     const MojoHandle* handles,  // Optional.
-                     uint32_t num_handles,
-                     MojoWriteMessageFlags flags);
-
-// Writes a message to the message pipe endpoint given by |message_pipe_handle|.
-//
-// |message|: A message object allocated by |MojoAllocMessage()|. Ownership of
-//     the message is passed into Mojo.
-//
-// Returns results corresponding to |MojoWriteMessage()| above.
-MOJO_SYSTEM_EXPORT MojoResult
-    MojoWriteMessageNew(MojoHandle message_pipe_handle,
-                        MojoMessageHandle message,
-                        MojoWriteMessageFlags);
-
-// Reads the next message from a message pipe, or indicates the size of the
-// message if it cannot fit in the provided buffers. The message will be read
-// in its entirety or not at all; if it is not, it will remain enqueued unless
-// the |MOJO_READ_MESSAGE_FLAG_MAY_DISCARD| flag was passed. At most one
-// message will be consumed from the queue, and the return value will indicate
-// whether a message was successfully read.
-//
-// |num_bytes| and |num_handles| are optional in/out parameters that on input
-// must be set to the sizes of the |bytes| and |handles| arrays, and on output
-// will be set to the actual number of bytes or handles contained in the
-// message (even if the message was not retrieved due to being too large).
-// Either |num_bytes| or |num_handles| may be null if the message is not
-// expected to contain the corresponding type of data, but such a call would
-// fail with |MOJO_RESULT_RESOURCE_EXHAUSTED| if the message in fact did
-// contain that type of data.
-//
-// |bytes| and |handles| will receive the contents of the message, if it is
-// retrieved. Either or both may be null, in which case the corresponding size
-// parameter(s) must also be set to zero or passed as null.
-//
-// Returns:
-//   |MOJO_RESULT_OK| on success (i.e., a message was actually read).
-//   |MOJO_RESULT_INVALID_ARGUMENT| if some argument was invalid.
-//   |MOJO_RESULT_FAILED_PRECONDITION| if the other endpoint has been closed.
-//   |MOJO_RESULT_RESOURCE_EXHAUSTED| if the message was too large to fit in the
-//       provided buffer(s). The message will have been left in the queue or
-//       discarded, depending on flags.
-//   |MOJO_RESULT_SHOULD_WAIT| if no message was available to be read.
-//
-// TODO(vtl): Reconsider the |MOJO_RESULT_RESOURCE_EXHAUSTED| error code; should
-// distinguish this from the hitting-system-limits case.
-MOJO_SYSTEM_EXPORT MojoResult
-    MojoReadMessage(MojoHandle message_pipe_handle,
-                    void* bytes,            // Optional out.
-                    uint32_t* num_bytes,    // Optional in/out.
-                    MojoHandle* handles,    // Optional out.
-                    uint32_t* num_handles,  // Optional in/out.
-                    MojoReadMessageFlags flags);
-
-// Reads the next message from a message pipe and returns a message containing
-// the message bytes. The returned message must eventually be freed using
-// |MojoFreeMessage()|.
-//
-// Message payload can be accessed using |MojoGetMessageBuffer()|.
-//
-//   |message_pipe_handle|, |num_bytes|, |handles|, |num_handles|, and |flags|
-//       correspond to their use in |MojoReadMessage()| above, with the
-//       exception that |num_bytes| is only an output argument.
-//   |message| must be non-null unless |MOJO_READ_MESSAGE_FLAG_MAY_DISCARD| is
-//       set in flags.
-//
-// Return values correspond to the return values for |MojoReadMessage()| above.
-// On success (MOJO_RESULT_OK), |*message| will contain a handle to a message
-// object which may be passed to |MojoGetMessageBuffer()|. The caller owns the
-// message object and is responsible for freeing it via |MojoFreeMessage()|.
-MOJO_SYSTEM_EXPORT MojoResult
-    MojoReadMessageNew(MojoHandle message_pipe_handle,
-                       MojoMessageHandle* message,  // Optional out.
-                       uint32_t* num_bytes,         // Optional out.
-                       MojoHandle* handles,         // Optional out.
-                       uint32_t* num_handles,       // Optional in/out.
-                       MojoReadMessageFlags flags);
-
-// Fuses two message pipe endpoints together. Given two pipes:
-//
-//     A <-> B    and    C <-> D
-//
-// Fusing handle B and handle C results in a single pipe:
-//
-//     A <-> D
-//
-// Handles B and C are ALWAYS closed. Any unread messages at C will eventually
-// be delivered to A, and any unread messages at B will eventually be delivered
-// to D.
-//
-// NOTE: A handle may only be fused if it is an open message pipe handle which
-// has not been written to.
-//
-// Returns:
-//   |MOJO_RESULT_OK| on success.
-//   |MOJO_RESULT_FAILED_PRECONDITION| if both handles were valid message pipe
-//       handles but could not be merged (e.g. one of them has been written to).
-//   |MOJO_INVALID_ARGUMENT| if either handle is not a fusable message pipe
-//       handle.
-MOJO_SYSTEM_EXPORT MojoResult
-    MojoFuseMessagePipes(MojoHandle handle0, MojoHandle handle1);
-
-// Allocates a new message whose ownership may be passed to
-// |MojoWriteMessageNew()|. Use |MojoGetMessageBuffer()| to retrieve the address
-// of the mutable message payload.
-//
-// |num_bytes|: The size of the message payload in bytes.
-// |handles|: An array of handles to transfer in the message. This takes
-//     ownership of and invalidates all contained handles. Must be null if and
-//     only if |num_handles| is 0.
-// |num_handles|: The number of handles contained in |handles|.
-// |flags|: Must be |MOJO_CREATE_MESSAGE_FLAG_NONE|.
-// |message|: The address of a handle to be filled with the allocated message's
-//     handle. Must be non-null.
-//
-// Returns:
-//   |MOJO_RESULT_OK| if the message was successfully allocated. In this case
-//       |*message| will be populated with a handle to an allocated message
-//       with a buffer large enough to hold |num_bytes| contiguous bytes.
-//   |MOJO_RESULT_INVALID_ARGUMENT| if one or more handles in |handles| was
-//       invalid, or |handles| was null with a non-zero |num_handles|.
-//   |MOJO_RESULT_RESOURCE_EXHAUSTED| if allocation failed because either
-//       |num_bytes| or |num_handles| exceeds an implementation-defined maximum.
-//   |MOJO_RESULT_BUSY| if one or more handles in |handles| cannot be sent at
-//       the time of this call.
-//
-// Only upon successful message allocation will all handles in |handles| be
-// transferred into the message and invalidated.
-MOJO_SYSTEM_EXPORT MojoResult
-MojoAllocMessage(uint32_t num_bytes,
-                 const MojoHandle* handles,
-                 uint32_t num_handles,
-                 MojoAllocMessageFlags flags,
-                 MojoMessageHandle* message);  // Out
-
-// Frees a message allocated by |MojoAllocMessage()| or |MojoReadMessageNew()|.
-//
-// |message|: The message to free. This must correspond to a message previously
-//     allocated by |MojoAllocMessage()| or |MojoReadMessageNew()|. Note that if
-//     the message has already been passed to |MojoWriteMessageNew()| it should
-//     NOT also be freed with this API.
-//
-// Returns:
-//   |MOJO_RESULT_OK| if |message| was valid and has been freed.
-//   |MOJO_RESULT_INVALID_ARGUMENT| if |message| was not a valid message.
-MOJO_SYSTEM_EXPORT MojoResult MojoFreeMessage(MojoMessageHandle message);
-
-// Retrieves the address of mutable message bytes for a message allocated by
-// either |MojoAllocMessage()| or |MojoReadMessageNew()|.
-//
-// Returns:
-//   |MOJO_RESULT_OK| if |message| is a valid message object. |*buffer| will
-//       be updated to point to mutable message bytes.
-//   |MOJO_RESULT_INVALID_ARGUMENT| if |message| is not a valid message object.
-//
-// NOTE: A returned buffer address is always guaranteed to be 8-byte aligned.
-MOJO_SYSTEM_EXPORT MojoResult MojoGetMessageBuffer(MojoMessageHandle message,
-                                                   void** buffer);  // Out
-
-// Notifies the system that a bad message was received on a message pipe,
-// according to whatever criteria the caller chooses. This ultimately tries to
-// notify the embedder about the bad message, and the embedder may enforce some
-// policy for dealing with the source of the message (e.g. close the pipe,
-// terminate, a process, etc.) The embedder may not be notified if the calling
-// process has lost its connection to the source process.
-//
-// |message|: The message to report as bad. This must have come from a call to
-//     |MojoReadMessageNew()|.
-// |error|: An error string which may provide the embedder with context when
-//     notified of this error.
-// |error_num_bytes|: The length of |error| in bytes.
-//
-// Returns:
-//   |MOJO_RESULT_OK| if successful.
-//   |MOJO_RESULT_INVALID_ARGUMENT| if |message| is not a valid message.
-MOJO_SYSTEM_EXPORT MojoResult
-MojoNotifyBadMessage(MojoMessageHandle message,
-                     const char* error,
-                     size_t error_num_bytes);
-
-#ifdef __cplusplus
-}  // extern "C"
-#endif
-
-#endif  // MOJO_PUBLIC_C_SYSTEM_MESSAGE_PIPE_H_
diff --git a/mojo/public/c/system/platform_handle.h b/mojo/public/c/system/platform_handle.h
deleted file mode 100644
index 7449c2e..0000000
--- a/mojo/public/c/system/platform_handle.h
+++ /dev/null
@@ -1,191 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// This file contains types/functions and constants for platform handle wrapping
-// and unwrapping APIs.
-//
-// Note: This header should be compilable as C.
-
-#ifndef MOJO_PUBLIC_C_SYSTEM_PLATFORM_HANDLE_H_
-#define MOJO_PUBLIC_C_SYSTEM_PLATFORM_HANDLE_H_
-
-#include <stdint.h>
-
-#include "mojo/public/c/system/system_export.h"
-#include "mojo/public/c/system/types.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-// |MojoPlatformHandleType|: A value indicating the specific type of platform
-//     handle encapsulated by a MojoPlatformHandle (see below.) This is stored
-//     in the MojoPlatformHandle's |type| field and determines how the |value|
-//     field is interpreted.
-//
-//   |MOJO_PLATFORM_HANDLE_TYPE_INVALID| - An invalid platform handle.
-//   |MOJO_PLATFORM_HANDLE_TYPE_FILE_DESCRIPTOR| - A file descriptor. Only valid
-//       on POSIX systems.
-//   |MOJO_PLATFORM_HANDLE_TYPE_MACH_PORT| - A Mach port. Only valid on OS X.
-//   |MOJO_PLATFORM_HANDLE_TYPE_WINDOWS_HANDLE| - A Windows HANDLE value. Only
-//       valid on Windows.
-
-typedef uint32_t MojoPlatformHandleType;
-
-#ifdef __cplusplus
-const MojoPlatformHandleType MOJO_PLATFORM_HANDLE_TYPE_INVALID = 0;
-const MojoPlatformHandleType MOJO_PLATFORM_HANDLE_TYPE_FILE_DESCRIPTOR = 1;
-const MojoPlatformHandleType MOJO_PLATFORM_HANDLE_TYPE_MACH_PORT = 2;
-const MojoPlatformHandleType MOJO_PLATFORM_HANDLE_TYPE_WINDOWS_HANDLE = 3;
-#else
-#define MOJO_PLATFORM_HANDLE_TYPE_INVALID ((MojoPlatformHandleType)0)
-#define MOJO_PLATFORM_HANDLE_TYPE_FILE_DESCRIPTOR ((MojoPlatformHandleType)1)
-#define MOJO_PLATFORM_HANDLE_TYPE_MACH_PORT ((MojoPlatformHandleType)2)
-#define MOJO_PLATFORM_HANDLE_TYPE_WINDOWS_HANDLE ((MojoPlatformHandleType)3)
-#endif
-
-// |MojoPlatformHandle|: A handle to a native platform object.
-//
-//     |uint32_t struct_size|: The size of this structure. Used for versioning
-//         to allow for future extensions.
-//
-//     |MojoPlatformHandleType type|: The type of handle stored in |value|.
-//
-//     |uint64_t value|: The value of this handle. Ignored if |type| is
-//         MOJO_PLATFORM_HANDLE_TYPE_INVALID. Otherwise the meaning of this
-//         value depends on the value of |type|.
-//
-
-struct MOJO_ALIGNAS(8) MojoPlatformHandle {
-  uint32_t struct_size;
-  MojoPlatformHandleType type;
-  uint64_t value;
-};
-MOJO_STATIC_ASSERT(sizeof(MojoPlatformHandle) == 16,
-                   "MojoPlatformHandle has wrong size");
-
-// |MojoPlatformSharedBufferHandleFlags|: Flags relevant to wrapped platform
-//     shared buffers.
-//
-//   |MOJO_PLATFORM_SHARED_BUFFER_HANDLE_NONE| - No flags.
-//   |MOJO_PLATFORM_SHARED_BUFFER_HANDLE_READ_ONLY| - Indicates that the wrapped
-//       buffer handle may only be mapped for reading.
-
-typedef uint32_t MojoPlatformSharedBufferHandleFlags;
-
-#ifdef __cplusplus
-const MojoPlatformSharedBufferHandleFlags
-MOJO_PLATFORM_SHARED_BUFFER_HANDLE_FLAG_NONE = 0;
-
-const MojoPlatformSharedBufferHandleFlags
-MOJO_PLATFORM_SHARED_BUFFER_HANDLE_FLAG_READ_ONLY = 1 << 0;
-#else
-#define MOJO_PLATFORM_SHARED_BUFFER_HANDLE_FLAG_NONE \
-    ((MojoPlatformSharedBufferHandleFlags)0)
-
-#define MOJO_PLATFORM_SHARED_BUFFER_HANDLE_FLAG_READ_ONLY \
-    ((MojoPlatformSharedBufferHandleFlags)1 << 0)
-#endif
-
-// Wraps a native platform handle as a Mojo handle which can be transferred
-// over a message pipe. Takes ownership of the underlying native platform
-// object.
-//
-// |platform_handle|: The platform handle to wrap.
-//
-// Returns:
-//     |MOJO_RESULT_OK| if the handle was successfully wrapped. In this case
-//         |*mojo_handle| contains the Mojo handle of the wrapped object.
-//     |MOJO_RESULT_RESOURCE_EXHAUSTED| if the system is out of handles.
-//     |MOJO_RESULT_INVALID_ARGUMENT| if |platform_handle| was not a valid
-//          platform handle.
-//
-// NOTE: It is not always possible to detect if |platform_handle| is valid,
-// particularly when |platform_handle->type| is valid but
-// |platform_handle->value| does not represent a valid platform object.
-MOJO_SYSTEM_EXPORT MojoResult
-MojoWrapPlatformHandle(const struct MojoPlatformHandle* platform_handle,
-                       MojoHandle* mojo_handle);  // Out
-
-// Unwraps a native platform handle from a Mojo handle. If this call succeeds,
-// ownership of the underlying platform object is assumed by the caller. The
-// The Mojo handle is always closed regardless of success or failure.
-//
-// |mojo_handle|: The Mojo handle from which to unwrap the native platform
-//     handle.
-//
-// Returns:
-//     |MOJO_RESULT_OK| if the handle was successfully unwrapped. In this case
-//         |*platform_handle| contains the unwrapped platform handle.
-//     |MOJO_RESULT_INVALID_ARGUMENT| if |mojo_handle| was not a valid Mojo
-//         handle wrapping a platform handle.
-MOJO_SYSTEM_EXPORT MojoResult
-MojoUnwrapPlatformHandle(MojoHandle mojo_handle,
-                         struct MojoPlatformHandle* platform_handle);  // Out
-
-// Wraps a native platform shared buffer handle as a Mojo shared buffer handle
-// which can be used exactly like a shared buffer handle created by
-// |MojoCreateSharedBuffer()| or |MojoDuplicateBufferHandle()|.
-//
-// Takes ownership of the native platform shared buffer handle.
-//
-// |platform_handle|: The platform handle to wrap. Must be a native handle to a
-//     shared buffer object.
-// |num_bytes|: The size of the shared buffer in bytes.
-// |flags|: Flags which influence the treatment of the shared buffer object. See
-//     below.
-//
-// Flags:
-//    |MOJO_PLATFORM_SHARED_BUFFER_HANDLE_FLAG_NONE| indicates default behavior.
-//        No flags set.
-//    |MOJO_PLATFORM_SHARED_BUFFER_HANDLE_FLAG_READ_ONLY| indicates that the
-//        buffer handled to be wrapped may only be mapped as read-only. This
-//        flag does NOT change the access control of the buffer in any way.
-//
-// Returns:
-//     |MOJO_RESULT_OK| if the handle was successfully wrapped. In this case
-//         |*mojo_handle| contains a Mojo shared buffer handle.
-//     |MOJO_RESULT_INVALID_ARGUMENT| if |platform_handle| was not a valid
-//         platform shared buffer handle.
-MOJO_SYSTEM_EXPORT MojoResult
-MojoWrapPlatformSharedBufferHandle(
-    const struct MojoPlatformHandle* platform_handle,
-    size_t num_bytes,
-    MojoPlatformSharedBufferHandleFlags flags,
-    MojoHandle* mojo_handle);  // Out
-
-// Unwraps a native platform shared buffer handle from a Mojo shared buffer
-// handle. If this call succeeds, ownership of the underlying shared buffer
-// object is assumed by the caller.
-//
-// The Mojo handle is always closed regardless of success or failure.
-//
-// |mojo_handle|: The Mojo shared buffer handle to unwrap.
-//
-// |platform_handle|, |num_bytes| and |flags| are used to receive output values
-// and MUST always be non-null.
-//
-// Returns:
-//    |MOJO_RESULT_OK| if the handle was successfully unwrapped. In this case
-//        |*platform_handle| contains a platform shared buffer handle,
-//        |*num_bytes| contains the size of the shared buffer object, and
-//        |*flags| indicates flags relevant to the wrapped buffer (see below).
-//    |MOJO_RESULT_INVALID_ARGUMENT| if |mojo_handle| is not a valid Mojo
-//        shared buffer handle.
-//
-// Flags which may be set in |*flags| upon success:
-//    |MOJO_PLATFORM_SHARED_BUFFER_FLAG_READ_ONLY| is set iff the unwrapped
-//        shared buffer handle may only be mapped as read-only.
-MOJO_SYSTEM_EXPORT MojoResult
-MojoUnwrapPlatformSharedBufferHandle(
-    MojoHandle mojo_handle,
-    struct MojoPlatformHandle* platform_handle,
-    size_t* num_bytes,
-    MojoPlatformSharedBufferHandleFlags* flags);
-
-#ifdef __cplusplus
-}  // extern "C"
-#endif
-
-#endif  // MOJO_PUBLIC_C_SYSTEM_PLATFORM_HANDLE_H_
diff --git a/mojo/public/c/system/set_thunks_for_app.cc b/mojo/public/c/system/set_thunks_for_app.cc
deleted file mode 100644
index 335cc02..0000000
--- a/mojo/public/c/system/set_thunks_for_app.cc
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/c/system/thunks.h"
-
-extern "C" {
-
-#if defined(WIN32)
-#define THUNKS_EXPORT __declspec(dllexport)
-#else
-#define THUNKS_EXPORT __attribute__((visibility("default")))
-#endif
-
-THUNKS_EXPORT size_t MojoSetSystemThunks(
-    const MojoSystemThunks* system_thunks) {
-  return MojoEmbedderSetSystemThunks(system_thunks);
-}
-
-}  // extern "C"
diff --git a/mojo/public/c/system/system_export.h b/mojo/public/c/system/system_export.h
deleted file mode 100644
index 775f667..0000000
--- a/mojo/public/c/system/system_export.h
+++ /dev/null
@@ -1,33 +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 MOJO_PUBLIC_C_SYSTEM_SYSTEM_EXPORT_H_
-#define MOJO_PUBLIC_C_SYSTEM_SYSTEM_EXPORT_H_
-
-#if defined(COMPONENT_BUILD)
-#if defined(WIN32)
-
-#if defined(MOJO_SYSTEM_IMPLEMENTATION)
-#define MOJO_SYSTEM_EXPORT __declspec(dllexport)
-#else
-#define MOJO_SYSTEM_EXPORT __declspec(dllimport)
-#endif
-
-#else  // !defined(WIN32)
-
-#if defined(MOJO_SYSTEM_IMPLEMENTATION)
-#define MOJO_SYSTEM_EXPORT __attribute__((visibility("default")))
-#else
-#define MOJO_SYSTEM_EXPORT
-#endif
-
-#endif  // defined(WIN32)
-
-#else  // !defined(COMPONENT_BUILD)
-
-#define MOJO_SYSTEM_EXPORT
-
-#endif  // defined(COMPONENT_BUILD)
-
-#endif  // MOJO_PUBLIC_C_SYSTEM_SYSTEM_EXPORT_H_
diff --git a/mojo/public/c/system/tests/BUILD.gn b/mojo/public/c/system/tests/BUILD.gn
deleted file mode 100644
index bace63c..0000000
--- a/mojo/public/c/system/tests/BUILD.gn
+++ /dev/null
@@ -1,38 +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.
-
-source_set("tests") {
-  testonly = true
-
-  visibility = [
-    "//mojo/public/cpp/system/tests:mojo_public_system_unittests",
-    "//mojo/public/cpp/system/tests:tests",
-  ]
-
-  sources = [
-    "core_unittest.cc",
-    "core_unittest_pure_c.c",
-    "macros_unittest.cc",
-  ]
-
-  deps = [
-    "//mojo/public/c/system",
-    "//mojo/public/cpp/system",
-    "//testing/gtest",
-  ]
-}
-
-source_set("perftests") {
-  testonly = true
-
-  sources = [
-    "core_perftest.cc",
-  ]
-
-  deps = [
-    "//mojo/public/cpp/system",
-    "//mojo/public/cpp/test_support:test_utils",
-    "//testing/gtest",
-  ]
-}
diff --git a/mojo/public/c/system/tests/core_perftest.cc b/mojo/public/c/system/tests/core_perftest.cc
deleted file mode 100644
index cab465b..0000000
--- a/mojo/public/c/system/tests/core_perftest.cc
+++ /dev/null
@@ -1,329 +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.
-
-// This tests the performance of the C API.
-
-#include "mojo/public/c/system/core.h"
-
-#include <assert.h>
-#include <stdint.h>
-#include <stdio.h>
-
-#include "base/macros.h"
-#include "base/threading/simple_thread.h"
-#include "mojo/public/cpp/system/wait.h"
-#include "mojo/public/cpp/test_support/test_support.h"
-#include "mojo/public/cpp/test_support/test_utils.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-#if !defined(WIN32)
-#include <time.h>
-#endif  // !defined(WIN32)
-
-namespace {
-
-#if !defined(WIN32)
-class MessagePipeWriterThread : public base::SimpleThread {
- public:
-  MessagePipeWriterThread(MojoHandle handle, uint32_t num_bytes)
-      : SimpleThread("MessagePipeWriterThread"),
-        handle_(handle),
-        num_bytes_(num_bytes),
-        num_writes_(0) {}
-  ~MessagePipeWriterThread() override {}
-
-  void Run() override {
-    char buffer[10000];
-    assert(num_bytes_ <= sizeof(buffer));
-
-    // TODO(vtl): Should I throttle somehow?
-    for (;;) {
-      MojoResult result = MojoWriteMessage(handle_, buffer, num_bytes_, nullptr,
-                                           0, MOJO_WRITE_MESSAGE_FLAG_NONE);
-      if (result == MOJO_RESULT_OK) {
-        num_writes_++;
-        continue;
-      }
-
-      // We failed to write.
-      // Either |handle_| or its peer was closed.
-      assert(result == MOJO_RESULT_INVALID_ARGUMENT ||
-             result == MOJO_RESULT_FAILED_PRECONDITION);
-      break;
-    }
-  }
-
-  // Use only after joining the thread.
-  int64_t num_writes() const { return num_writes_; }
-
- private:
-  const MojoHandle handle_;
-  const uint32_t num_bytes_;
-  int64_t num_writes_;
-
-  DISALLOW_COPY_AND_ASSIGN(MessagePipeWriterThread);
-};
-
-class MessagePipeReaderThread : public base::SimpleThread {
- public:
-  explicit MessagePipeReaderThread(MojoHandle handle)
-      : SimpleThread("MessagePipeReaderThread"),
-        handle_(handle),
-        num_reads_(0) {}
-  ~MessagePipeReaderThread() override {}
-
-  void Run() override {
-    char buffer[10000];
-
-    for (;;) {
-      uint32_t num_bytes = static_cast<uint32_t>(sizeof(buffer));
-      MojoResult result = MojoReadMessage(handle_, buffer, &num_bytes, nullptr,
-                                          nullptr, MOJO_READ_MESSAGE_FLAG_NONE);
-      if (result == MOJO_RESULT_OK) {
-        num_reads_++;
-        continue;
-      }
-
-      if (result == MOJO_RESULT_SHOULD_WAIT) {
-        result = mojo::Wait(mojo::Handle(handle_), MOJO_HANDLE_SIGNAL_READABLE);
-        if (result == MOJO_RESULT_OK) {
-          // Go to the top of the loop to read again.
-          continue;
-        }
-      }
-
-      // We failed to read and possibly failed to wait.
-      // Either |handle_| or its peer was closed.
-      assert(result == MOJO_RESULT_INVALID_ARGUMENT ||
-             result == MOJO_RESULT_FAILED_PRECONDITION);
-      break;
-    }
-  }
-
-  // Use only after joining the thread.
-  int64_t num_reads() const { return num_reads_; }
-
- private:
-  const MojoHandle handle_;
-  int64_t num_reads_;
-
-  DISALLOW_COPY_AND_ASSIGN(MessagePipeReaderThread);
-};
-#endif  // !defined(WIN32)
-
-class CorePerftest : public testing::Test {
- public:
-  CorePerftest() : buffer_(nullptr), num_bytes_(0) {}
-  ~CorePerftest() override {}
-
-  static void NoOp(void* /*closure*/) {}
-
-  static void MessagePipe_CreateAndClose(void* closure) {
-    CorePerftest* self = static_cast<CorePerftest*>(closure);
-    MojoResult result = MojoCreateMessagePipe(nullptr, &self->h0_, &self->h1_);
-    ALLOW_UNUSED_LOCAL(result);
-    assert(result == MOJO_RESULT_OK);
-    result = MojoClose(self->h0_);
-    assert(result == MOJO_RESULT_OK);
-    result = MojoClose(self->h1_);
-    assert(result == MOJO_RESULT_OK);
-  }
-
-  static void MessagePipe_WriteAndRead(void* closure) {
-    CorePerftest* self = static_cast<CorePerftest*>(closure);
-    MojoResult result =
-        MojoWriteMessage(self->h0_, self->buffer_, self->num_bytes_, nullptr, 0,
-                         MOJO_WRITE_MESSAGE_FLAG_NONE);
-    ALLOW_UNUSED_LOCAL(result);
-    assert(result == MOJO_RESULT_OK);
-    uint32_t read_bytes = self->num_bytes_;
-    result = MojoReadMessage(self->h1_, self->buffer_, &read_bytes, nullptr,
-                             nullptr, MOJO_READ_MESSAGE_FLAG_NONE);
-    assert(result == MOJO_RESULT_OK);
-  }
-
-  static void MessagePipe_EmptyRead(void* closure) {
-    CorePerftest* self = static_cast<CorePerftest*>(closure);
-    MojoResult result =
-        MojoReadMessage(self->h0_, nullptr, nullptr, nullptr, nullptr,
-                        MOJO_READ_MESSAGE_FLAG_MAY_DISCARD);
-    ALLOW_UNUSED_LOCAL(result);
-    assert(result == MOJO_RESULT_SHOULD_WAIT);
-  }
-
- protected:
-#if !defined(WIN32)
-  void DoMessagePipeThreadedTest(unsigned num_writers,
-                                 unsigned num_readers,
-                                 uint32_t num_bytes) {
-    static const int64_t kPerftestTimeMicroseconds = 3 * 1000000;
-
-    assert(num_writers > 0);
-    assert(num_readers > 0);
-
-    MojoResult result = MojoCreateMessagePipe(nullptr, &h0_, &h1_);
-    ALLOW_UNUSED_LOCAL(result);
-    assert(result == MOJO_RESULT_OK);
-
-    std::vector<MessagePipeWriterThread*> writers;
-    for (unsigned i = 0; i < num_writers; i++)
-      writers.push_back(new MessagePipeWriterThread(h0_, num_bytes));
-
-    std::vector<MessagePipeReaderThread*> readers;
-    for (unsigned i = 0; i < num_readers; i++)
-      readers.push_back(new MessagePipeReaderThread(h1_));
-
-    // Start time here, just before we fire off the threads.
-    const MojoTimeTicks start_time = MojoGetTimeTicksNow();
-
-    // Interleave the starts.
-    for (unsigned i = 0; i < num_writers || i < num_readers; i++) {
-      if (i < num_writers)
-        writers[i]->Start();
-      if (i < num_readers)
-        readers[i]->Start();
-    }
-
-    Sleep(kPerftestTimeMicroseconds);
-
-    // Close both handles to make writers and readers stop immediately.
-    result = MojoClose(h0_);
-    assert(result == MOJO_RESULT_OK);
-    result = MojoClose(h1_);
-    assert(result == MOJO_RESULT_OK);
-
-    // Join everything.
-    for (unsigned i = 0; i < num_writers; i++)
-      writers[i]->Join();
-    for (unsigned i = 0; i < num_readers; i++)
-      readers[i]->Join();
-
-    // Stop time here.
-    MojoTimeTicks end_time = MojoGetTimeTicksNow();
-
-    // Add up write and read counts, and destroy the threads.
-    int64_t num_writes = 0;
-    for (unsigned i = 0; i < num_writers; i++) {
-      num_writes += writers[i]->num_writes();
-      delete writers[i];
-    }
-    writers.clear();
-    int64_t num_reads = 0;
-    for (unsigned i = 0; i < num_readers; i++) {
-      num_reads += readers[i]->num_reads();
-      delete readers[i];
-    }
-    readers.clear();
-
-    char sub_test_name[200];
-    sprintf(sub_test_name, "%uw_%ur_%ubytes", num_writers, num_readers,
-            static_cast<unsigned>(num_bytes));
-    mojo::test::LogPerfResult(
-        "MessagePipe_Threaded_Writes", sub_test_name,
-        1000000.0 * static_cast<double>(num_writes) / (end_time - start_time),
-        "writes/second");
-    mojo::test::LogPerfResult(
-        "MessagePipe_Threaded_Reads", sub_test_name,
-        1000000.0 * static_cast<double>(num_reads) / (end_time - start_time),
-        "reads/second");
-  }
-#endif  // !defined(WIN32)
-
-  MojoHandle h0_;
-  MojoHandle h1_;
-
-  void* buffer_;
-  uint32_t num_bytes_;
-
- private:
-#if !defined(WIN32)
-  void Sleep(int64_t microseconds) {
-    struct timespec req = {
-        static_cast<time_t>(microseconds / 1000000),       // Seconds.
-        static_cast<long>(microseconds % 1000000) * 1000L  // Nanoseconds.
-    };
-    int rv = nanosleep(&req, nullptr);
-    ALLOW_UNUSED_LOCAL(rv);
-    assert(rv == 0);
-  }
-#endif  // !defined(WIN32)
-
-  DISALLOW_COPY_AND_ASSIGN(CorePerftest);
-};
-
-// A no-op test so we can compare performance.
-TEST_F(CorePerftest, NoOp) {
-  mojo::test::IterateAndReportPerf("Iterate_NoOp", nullptr, &CorePerftest::NoOp,
-                                   this);
-}
-
-TEST_F(CorePerftest, MessagePipe_CreateAndClose) {
-  mojo::test::IterateAndReportPerf("MessagePipe_CreateAndClose", nullptr,
-                                   &CorePerftest::MessagePipe_CreateAndClose,
-                                   this);
-}
-
-TEST_F(CorePerftest, MessagePipe_WriteAndRead) {
-  MojoResult result = MojoCreateMessagePipe(nullptr, &h0_, &h1_);
-  ALLOW_UNUSED_LOCAL(result);
-  assert(result == MOJO_RESULT_OK);
-  char buffer[10000] = {0};
-  buffer_ = buffer;
-  num_bytes_ = 10u;
-  mojo::test::IterateAndReportPerf("MessagePipe_WriteAndRead", "10bytes",
-                                   &CorePerftest::MessagePipe_WriteAndRead,
-                                   this);
-  num_bytes_ = 100u;
-  mojo::test::IterateAndReportPerf("MessagePipe_WriteAndRead", "100bytes",
-                                   &CorePerftest::MessagePipe_WriteAndRead,
-                                   this);
-  num_bytes_ = 1000u;
-  mojo::test::IterateAndReportPerf("MessagePipe_WriteAndRead", "1000bytes",
-                                   &CorePerftest::MessagePipe_WriteAndRead,
-                                   this);
-  num_bytes_ = 10000u;
-  mojo::test::IterateAndReportPerf("MessagePipe_WriteAndRead", "10000bytes",
-                                   &CorePerftest::MessagePipe_WriteAndRead,
-                                   this);
-  result = MojoClose(h0_);
-  assert(result == MOJO_RESULT_OK);
-  result = MojoClose(h1_);
-  assert(result == MOJO_RESULT_OK);
-}
-
-TEST_F(CorePerftest, MessagePipe_EmptyRead) {
-  MojoResult result = MojoCreateMessagePipe(nullptr, &h0_, &h1_);
-  ALLOW_UNUSED_LOCAL(result);
-  assert(result == MOJO_RESULT_OK);
-  mojo::test::IterateAndReportPerf("MessagePipe_EmptyRead", nullptr,
-                                   &CorePerftest::MessagePipe_EmptyRead, this);
-  result = MojoClose(h0_);
-  assert(result == MOJO_RESULT_OK);
-  result = MojoClose(h1_);
-  assert(result == MOJO_RESULT_OK);
-}
-
-#if !defined(WIN32)
-TEST_F(CorePerftest, MessagePipe_Threaded) {
-  DoMessagePipeThreadedTest(1u, 1u, 100u);
-  DoMessagePipeThreadedTest(2u, 2u, 100u);
-  DoMessagePipeThreadedTest(3u, 3u, 100u);
-  DoMessagePipeThreadedTest(10u, 10u, 100u);
-  DoMessagePipeThreadedTest(10u, 1u, 100u);
-  DoMessagePipeThreadedTest(1u, 10u, 100u);
-
-  // For comparison of overhead:
-  DoMessagePipeThreadedTest(1u, 1u, 10u);
-  // 100 was done above.
-  DoMessagePipeThreadedTest(1u, 1u, 1000u);
-  DoMessagePipeThreadedTest(1u, 1u, 10000u);
-
-  DoMessagePipeThreadedTest(3u, 3u, 10u);
-  // 100 was done above.
-  DoMessagePipeThreadedTest(3u, 3u, 1000u);
-  DoMessagePipeThreadedTest(3u, 3u, 10000u);
-}
-#endif  // !defined(WIN32)
-
-}  // namespace
diff --git a/mojo/public/c/system/tests/core_unittest.cc b/mojo/public/c/system/tests/core_unittest.cc
deleted file mode 100644
index a9da255..0000000
--- a/mojo/public/c/system/tests/core_unittest.cc
+++ /dev/null
@@ -1,322 +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.
-
-// This file tests the C API.
-
-#include "mojo/public/c/system/core.h"
-
-#include <stdint.h>
-#include <string.h>
-
-#include "mojo/public/cpp/system/wait.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace {
-
-const MojoHandleSignals kSignalReadadableWritable =
-    MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE;
-
-const MojoHandleSignals kSignalAll = MOJO_HANDLE_SIGNAL_READABLE |
-                                     MOJO_HANDLE_SIGNAL_WRITABLE |
-                                     MOJO_HANDLE_SIGNAL_PEER_CLOSED;
-
-TEST(CoreTest, GetTimeTicksNow) {
-  const MojoTimeTicks start = MojoGetTimeTicksNow();
-  EXPECT_NE(static_cast<MojoTimeTicks>(0), start)
-      << "MojoGetTimeTicksNow should return nonzero value";
-}
-
-// The only handle that's guaranteed to be invalid is |MOJO_HANDLE_INVALID|.
-// Tests that everything that takes a handle properly recognizes it.
-TEST(CoreTest, InvalidHandle) {
-  MojoHandle h0, h1;
-  char buffer[10] = {0};
-  uint32_t buffer_size;
-  void* write_pointer;
-  const void* read_pointer;
-
-  // Close:
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(MOJO_HANDLE_INVALID));
-
-  // Message pipe:
-  h0 = MOJO_HANDLE_INVALID;
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            MojoWriteMessage(h0, buffer, 3, nullptr, 0,
-                             MOJO_WRITE_MESSAGE_FLAG_NONE));
-  buffer_size = static_cast<uint32_t>(sizeof(buffer));
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            MojoReadMessage(h0, buffer, &buffer_size, nullptr, nullptr,
-                            MOJO_READ_MESSAGE_FLAG_NONE));
-
-  // Data pipe:
-  buffer_size = static_cast<uint32_t>(sizeof(buffer));
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            MojoWriteData(h0, buffer, &buffer_size, MOJO_WRITE_DATA_FLAG_NONE));
-  write_pointer = nullptr;
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            MojoBeginWriteData(h0, &write_pointer, &buffer_size,
-                               MOJO_WRITE_DATA_FLAG_NONE));
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoEndWriteData(h0, 1));
-  buffer_size = static_cast<uint32_t>(sizeof(buffer));
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            MojoReadData(h0, buffer, &buffer_size, MOJO_READ_DATA_FLAG_NONE));
-  read_pointer = nullptr;
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            MojoBeginReadData(h0, &read_pointer, &buffer_size,
-                              MOJO_READ_DATA_FLAG_NONE));
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoEndReadData(h0, 1));
-
-  // Shared buffer:
-  h1 = MOJO_HANDLE_INVALID;
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            MojoDuplicateBufferHandle(h0, nullptr, &h1));
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            MojoMapBuffer(h0, 0, 1, &write_pointer, MOJO_MAP_BUFFER_FLAG_NONE));
-}
-
-TEST(CoreTest, BasicMessagePipe) {
-  MojoHandle h0, h1;
-  MojoHandleSignals sig;
-  char buffer[10] = {0};
-  uint32_t buffer_size;
-
-  h0 = MOJO_HANDLE_INVALID;
-  h1 = MOJO_HANDLE_INVALID;
-  EXPECT_EQ(MOJO_RESULT_OK, MojoCreateMessagePipe(nullptr, &h0, &h1));
-  EXPECT_NE(h0, MOJO_HANDLE_INVALID);
-  EXPECT_NE(h1, MOJO_HANDLE_INVALID);
-
-  // Shouldn't be readable, we haven't written anything. Should be writable.
-  MojoHandleSignalsState state;
-  EXPECT_EQ(MOJO_RESULT_OK, MojoQueryHandleSignalsState(h0, &state));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, state.satisfied_signals);
-  EXPECT_EQ(kSignalAll, state.satisfiable_signals);
-
-  // Try to read.
-  buffer_size = static_cast<uint32_t>(sizeof(buffer));
-  EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT,
-            MojoReadMessage(h0, buffer, &buffer_size, nullptr, nullptr,
-                            MOJO_READ_MESSAGE_FLAG_NONE));
-
-  // Write to |h1|.
-  static const char kHello[] = "hello";
-  buffer_size = static_cast<uint32_t>(sizeof(kHello));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoWriteMessage(h1, kHello, buffer_size, nullptr,
-                                             0, MOJO_WRITE_MESSAGE_FLAG_NONE));
-
-  // |h0| should be readable.
-  size_t result_index = 1;
-  MojoHandleSignalsState states[1];
-  sig = MOJO_HANDLE_SIGNAL_READABLE;
-  Handle handle0(h0);
-  EXPECT_EQ(MOJO_RESULT_OK,
-            mojo::WaitMany(&handle0, &sig, 1, &result_index, states));
-
-  EXPECT_EQ(0u, result_index);
-  EXPECT_EQ(kSignalReadadableWritable, states[0].satisfied_signals);
-  EXPECT_EQ(kSignalAll, states[0].satisfiable_signals);
-
-  // Read from |h0|.
-  buffer_size = static_cast<uint32_t>(sizeof(buffer));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoReadMessage(h0, buffer, &buffer_size, nullptr, nullptr,
-                            MOJO_READ_MESSAGE_FLAG_NONE));
-  EXPECT_EQ(static_cast<uint32_t>(sizeof(kHello)), buffer_size);
-  EXPECT_STREQ(kHello, buffer);
-
-  // |h0| should no longer be readable.
-  EXPECT_EQ(MOJO_RESULT_OK, MojoQueryHandleSignalsState(h0, &state));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, state.satisfied_signals);
-  EXPECT_EQ(kSignalAll, state.satisfiable_signals);
-
-  // Close |h0|.
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h0));
-
-  EXPECT_EQ(MOJO_RESULT_OK, mojo::Wait(mojo::Handle(h1),
-                                       MOJO_HANDLE_SIGNAL_PEER_CLOSED, &state));
-
-  // |h1| should no longer be readable or writable.
-  EXPECT_EQ(
-      MOJO_RESULT_FAILED_PRECONDITION,
-      mojo::Wait(mojo::Handle(h1),
-                 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
-                 &state));
-
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, state.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, state.satisfiable_signals);
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h1));
-}
-
-TEST(CoreTest, BasicDataPipe) {
-  MojoHandle hp, hc;
-  MojoHandleSignals sig;
-  char buffer[20] = {0};
-  uint32_t buffer_size;
-  void* write_pointer;
-  const void* read_pointer;
-
-  hp = MOJO_HANDLE_INVALID;
-  hc = MOJO_HANDLE_INVALID;
-  EXPECT_EQ(MOJO_RESULT_OK, MojoCreateDataPipe(nullptr, &hp, &hc));
-  EXPECT_NE(hp, MOJO_HANDLE_INVALID);
-  EXPECT_NE(hc, MOJO_HANDLE_INVALID);
-
-  // The consumer |hc| shouldn't be readable.
-  MojoHandleSignalsState state;
-  EXPECT_EQ(MOJO_RESULT_OK, MojoQueryHandleSignalsState(hc, &state));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_NONE, state.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            state.satisfiable_signals);
-
-  // The producer |hp| should be writable.
-  EXPECT_EQ(MOJO_RESULT_OK, MojoQueryHandleSignalsState(hp, &state));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, state.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-            state.satisfiable_signals);
-
-  // Try to read from |hc|.
-  buffer_size = static_cast<uint32_t>(sizeof(buffer));
-  EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT,
-            MojoReadData(hc, buffer, &buffer_size, MOJO_READ_DATA_FLAG_NONE));
-
-  // Try to begin a two-phase read from |hc|.
-  read_pointer = nullptr;
-  EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT,
-            MojoBeginReadData(hc, &read_pointer, &buffer_size,
-                              MOJO_READ_DATA_FLAG_NONE));
-
-  // Write to |hp|.
-  static const char kHello[] = "hello ";
-  // Don't include terminating null.
-  buffer_size = static_cast<uint32_t>(strlen(kHello));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoWriteData(hp, kHello, &buffer_size,
-                                          MOJO_WRITE_MESSAGE_FLAG_NONE));
-
-  // |hc| should be(come) readable.
-  size_t result_index = 1;
-  MojoHandleSignalsState states[1];
-  sig = MOJO_HANDLE_SIGNAL_READABLE;
-  Handle consumer_handle(hc);
-  EXPECT_EQ(MOJO_RESULT_OK,
-            mojo::WaitMany(&consumer_handle, &sig, 1, &result_index, states));
-
-  EXPECT_EQ(0u, result_index);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            states[0].satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
-                MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE,
-            states[0].satisfiable_signals);
-
-  // Do a two-phase write to |hp|.
-  EXPECT_EQ(MOJO_RESULT_OK, MojoBeginWriteData(hp, &write_pointer, &buffer_size,
-                                               MOJO_WRITE_DATA_FLAG_NONE));
-  static const char kWorld[] = "world";
-  ASSERT_GE(buffer_size, sizeof(kWorld));
-  // Include the terminating null.
-  memcpy(write_pointer, kWorld, sizeof(kWorld));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoEndWriteData(hp, static_cast<uint32_t>(sizeof(kWorld))));
-
-  // Read one character from |hc|.
-  memset(buffer, 0, sizeof(buffer));
-  buffer_size = 1;
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoReadData(hc, buffer, &buffer_size, MOJO_READ_DATA_FLAG_NONE));
-
-  // Close |hp|.
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(hp));
-
-  // |hc| should still be readable.
-  EXPECT_EQ(MOJO_RESULT_OK, mojo::Wait(mojo::Handle(hc),
-                                       MOJO_HANDLE_SIGNAL_PEER_CLOSED, &state));
-
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-            state.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-            state.satisfiable_signals);
-
-  // Do a two-phase read from |hc|.
-  read_pointer = nullptr;
-  EXPECT_EQ(MOJO_RESULT_OK, MojoBeginReadData(hc, &read_pointer, &buffer_size,
-                                              MOJO_READ_DATA_FLAG_NONE));
-  ASSERT_LE(buffer_size, sizeof(buffer) - 1);
-  memcpy(&buffer[1], read_pointer, buffer_size);
-  EXPECT_EQ(MOJO_RESULT_OK, MojoEndReadData(hc, buffer_size));
-  EXPECT_STREQ("hello world", buffer);
-
-  // |hc| should no longer be readable.
-  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-            mojo::Wait(mojo::Handle(hc), MOJO_HANDLE_SIGNAL_READABLE, &state));
-
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, state.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, state.satisfiable_signals);
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(hc));
-
-  // TODO(vtl): Test the other way around -- closing the consumer should make
-  // the producer never-writable?
-}
-
-TEST(CoreTest, BasicSharedBuffer) {
-  MojoHandle h0, h1;
-  void* pointer;
-
-  // Create a shared buffer (|h0|).
-  h0 = MOJO_HANDLE_INVALID;
-  EXPECT_EQ(MOJO_RESULT_OK, MojoCreateSharedBuffer(nullptr, 100, &h0));
-  EXPECT_NE(h0, MOJO_HANDLE_INVALID);
-
-  // Map everything.
-  pointer = nullptr;
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoMapBuffer(h0, 0, 100, &pointer, MOJO_MAP_BUFFER_FLAG_NONE));
-  ASSERT_TRUE(pointer);
-  static_cast<char*>(pointer)[50] = 'x';
-
-  // Duplicate |h0| to |h1|.
-  h1 = MOJO_HANDLE_INVALID;
-  EXPECT_EQ(MOJO_RESULT_OK, MojoDuplicateBufferHandle(h0, nullptr, &h1));
-  EXPECT_NE(h1, MOJO_HANDLE_INVALID);
-
-  // Close |h0|.
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h0));
-
-  // The mapping should still be good.
-  static_cast<char*>(pointer)[51] = 'y';
-
-  // Unmap it.
-  EXPECT_EQ(MOJO_RESULT_OK, MojoUnmapBuffer(pointer));
-
-  // Map half of |h1|.
-  pointer = nullptr;
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoMapBuffer(h1, 50, 50, &pointer, MOJO_MAP_BUFFER_FLAG_NONE));
-  ASSERT_TRUE(pointer);
-
-  // It should have what we wrote.
-  EXPECT_EQ('x', static_cast<char*>(pointer)[0]);
-  EXPECT_EQ('y', static_cast<char*>(pointer)[1]);
-
-  // Unmap it.
-  EXPECT_EQ(MOJO_RESULT_OK, MojoUnmapBuffer(pointer));
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h1));
-}
-
-// Defined in core_unittest_pure_c.c.
-extern "C" const char* MinimalCTest(void);
-
-// This checks that things actually work in C (not C++).
-TEST(CoreTest, MinimalCTest) {
-  const char* failure = MinimalCTest();
-  EXPECT_FALSE(failure) << failure;
-}
-
-// TODO(vtl): Add multi-threaded tests.
-
-}  // namespace
-}  // namespace mojo
diff --git a/mojo/public/c/system/tests/core_unittest_pure_c.c b/mojo/public/c/system/tests/core_unittest_pure_c.c
deleted file mode 100644
index 3164649..0000000
--- a/mojo/public/c/system/tests/core_unittest_pure_c.c
+++ /dev/null
@@ -1,77 +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.
-
-#ifdef __cplusplus
-#error "This file should be compiled as C, not C++."
-#endif
-
-#include <stddef.h>
-#include <stdint.h>
-#include <string.h>
-
-// Include all the header files that are meant to be compilable as C. Start with
-// core.h, since it's the most important one.
-#include "mojo/public/c/system/core.h"
-#include "mojo/public/c/system/macros.h"
-
-// The joys of the C preprocessor....
-#define STRINGIFY(x) #x
-#define STRINGIFY2(x) STRINGIFY(x)
-#define FAILURE(message) \
-  __FILE__ "(" STRINGIFY2(__LINE__) "): Failure: " message
-
-// Makeshift gtest.
-#define EXPECT_EQ(a, b)                                                  \
-  do {                                                                   \
-    if ((a) != (b))                                                      \
-      return FAILURE(STRINGIFY(a) " != " STRINGIFY(b) " (expected ==)"); \
-  } while (0)
-#define EXPECT_NE(a, b)                                                  \
-  do {                                                                   \
-    if ((a) == (b))                                                      \
-      return FAILURE(STRINGIFY(a) " == " STRINGIFY(b) " (expected !=)"); \
-  } while (0)
-
-// This function exists mainly to be compiled and linked. We do some cursory
-// checks and call it from a unit test, to make sure that link problems aren't
-// missed due to deadstripping. Returns null on success and a string on failure
-// (describing the failure).
-const char* MinimalCTest(void) {
-  // MSVS before 2013 *really* only supports C90: All variables must be declared
-  // at the top. (MSVS 2013 is more reasonable.)
-  MojoTimeTicks ticks;
-  MojoHandle handle0, handle1;
-  const char kHello[] = "hello";
-  char buffer[200] = {0};
-  uint32_t num_bytes;
-
-  ticks = MojoGetTimeTicksNow();
-  EXPECT_NE(ticks, 0);
-
-  handle0 = MOJO_HANDLE_INVALID;
-  EXPECT_NE(MOJO_RESULT_OK, MojoClose(handle0));
-
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            MojoQueryHandleSignalsState(handle0, NULL));
-
-  handle1 = MOJO_HANDLE_INVALID;
-  EXPECT_EQ(MOJO_RESULT_OK, MojoCreateMessagePipe(NULL, &handle0, &handle1));
-
-  EXPECT_EQ(MOJO_RESULT_OK,
-            MojoWriteMessage(handle0, kHello, (uint32_t)sizeof(kHello), NULL,
-                             0u, MOJO_WRITE_DATA_FLAG_NONE));
-
-  num_bytes = (uint32_t)sizeof(buffer);
-  EXPECT_EQ(MOJO_RESULT_OK, MojoReadMessage(handle1, buffer, &num_bytes, NULL,
-                                            NULL, MOJO_READ_MESSAGE_FLAG_NONE));
-  EXPECT_EQ((uint32_t)sizeof(kHello), num_bytes);
-  EXPECT_EQ(0, memcmp(buffer, kHello, sizeof(kHello)));
-
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(handle0));
-  EXPECT_EQ(MOJO_RESULT_OK, MojoClose(handle1));
-
-  // TODO(vtl): data pipe
-
-  return NULL;
-}
diff --git a/mojo/public/c/system/tests/macros_unittest.cc b/mojo/public/c/system/tests/macros_unittest.cc
deleted file mode 100644
index fb9ff76..0000000
--- a/mojo/public/c/system/tests/macros_unittest.cc
+++ /dev/null
@@ -1,68 +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.
-
-// This file tests the C Mojo system macros and consists of "positive" tests,
-// i.e., those verifying that things work (without compile errors, or even
-// warnings if warnings are treated as errors).
-// TODO(vtl): Fix no-compile tests (which are all disabled; crbug.com/105388)
-// and write some "negative" tests.
-
-#include "mojo/public/c/system/macros.h"
-
-#include <assert.h>
-#include <stdint.h>
-#include <stdlib.h>
-
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace {
-
-// First test |MOJO_STATIC_ASSERT()| in a global scope.
-MOJO_STATIC_ASSERT(sizeof(int64_t) == 2 * sizeof(int32_t),
-                   "Bad static_assert() failure in global scope");
-
-TEST(MacrosTest, CompileAssert) {
-  // Then in a local scope.
-  MOJO_STATIC_ASSERT(sizeof(int32_t) == 2 * sizeof(int16_t),
-                     "Bad static_assert() failure");
-}
-
-TEST(MacrosTest, Alignof) {
-  // Strictly speaking, this isn't a portable test, but I think it'll pass on
-  // all the platforms we currently support.
-  EXPECT_EQ(1u, MOJO_ALIGNOF(char));
-  EXPECT_EQ(4u, MOJO_ALIGNOF(int32_t));
-  EXPECT_EQ(8u, MOJO_ALIGNOF(int64_t));
-  EXPECT_EQ(8u, MOJO_ALIGNOF(double));
-}
-
-// These structs are used in the Alignas test. Define them globally to avoid
-// MSVS warnings/errors.
-#if defined(_MSC_VER)
-#pragma warning(push)
-// Disable the warning "structure was padded due to __declspec(align())".
-#pragma warning(disable : 4324)
-#endif
-struct MOJO_ALIGNAS(1) StructAlignas1 {
-  char x;
-};
-struct MOJO_ALIGNAS(4) StructAlignas4 {
-  char x;
-};
-struct MOJO_ALIGNAS(8) StructAlignas8 {
-  char x;
-};
-#if defined(_MSC_VER)
-#pragma warning(pop)
-#endif
-
-TEST(MacrosTest, Alignas) {
-  EXPECT_EQ(1u, MOJO_ALIGNOF(StructAlignas1));
-  EXPECT_EQ(4u, MOJO_ALIGNOF(StructAlignas4));
-  EXPECT_EQ(8u, MOJO_ALIGNOF(StructAlignas8));
-}
-
-}  // namespace
-}  // namespace mojo
diff --git a/mojo/public/c/system/thunks.cc b/mojo/public/c/system/thunks.cc
deleted file mode 100644
index 67c568f..0000000
--- a/mojo/public/c/system/thunks.cc
+++ /dev/null
@@ -1,273 +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 "mojo/public/c/system/thunks.h"
-
-#include <assert.h>
-#include <stddef.h>
-#include <stdint.h>
-
-extern "C" {
-
-static MojoSystemThunks g_thunks = {0};
-
-MojoTimeTicks MojoGetTimeTicksNow() {
-  assert(g_thunks.GetTimeTicksNow);
-  return g_thunks.GetTimeTicksNow();
-}
-
-MojoResult MojoClose(MojoHandle handle) {
-  assert(g_thunks.Close);
-  return g_thunks.Close(handle);
-}
-
-MojoResult MojoQueryHandleSignalsState(
-    MojoHandle handle,
-    struct MojoHandleSignalsState* signals_state) {
-  assert(g_thunks.QueryHandleSignalsState);
-  return g_thunks.QueryHandleSignalsState(handle, signals_state);
-}
-
-MojoResult MojoCreateMessagePipe(const MojoCreateMessagePipeOptions* options,
-                                 MojoHandle* message_pipe_handle0,
-                                 MojoHandle* message_pipe_handle1) {
-  assert(g_thunks.CreateMessagePipe);
-  return g_thunks.CreateMessagePipe(options, message_pipe_handle0,
-                                    message_pipe_handle1);
-}
-
-MojoResult MojoWriteMessage(MojoHandle message_pipe_handle,
-                            const void* bytes,
-                            uint32_t num_bytes,
-                            const MojoHandle* handles,
-                            uint32_t num_handles,
-                            MojoWriteMessageFlags flags) {
-  assert(g_thunks.WriteMessage);
-  return g_thunks.WriteMessage(message_pipe_handle, bytes, num_bytes, handles,
-                               num_handles, flags);
-}
-
-MojoResult MojoReadMessage(MojoHandle message_pipe_handle,
-                           void* bytes,
-                           uint32_t* num_bytes,
-                           MojoHandle* handles,
-                           uint32_t* num_handles,
-                           MojoReadMessageFlags flags) {
-  assert(g_thunks.ReadMessage);
-  return g_thunks.ReadMessage(message_pipe_handle, bytes, num_bytes, handles,
-                              num_handles, flags);
-}
-
-MojoResult MojoCreateDataPipe(const MojoCreateDataPipeOptions* options,
-                              MojoHandle* data_pipe_producer_handle,
-                              MojoHandle* data_pipe_consumer_handle) {
-  assert(g_thunks.CreateDataPipe);
-  return g_thunks.CreateDataPipe(options, data_pipe_producer_handle,
-                                 data_pipe_consumer_handle);
-}
-
-MojoResult MojoWriteData(MojoHandle data_pipe_producer_handle,
-                         const void* elements,
-                         uint32_t* num_elements,
-                         MojoWriteDataFlags flags) {
-  assert(g_thunks.WriteData);
-  return g_thunks.WriteData(data_pipe_producer_handle, elements, num_elements,
-                            flags);
-}
-
-MojoResult MojoBeginWriteData(MojoHandle data_pipe_producer_handle,
-                              void** buffer,
-                              uint32_t* buffer_num_elements,
-                              MojoWriteDataFlags flags) {
-  assert(g_thunks.BeginWriteData);
-  return g_thunks.BeginWriteData(data_pipe_producer_handle, buffer,
-                                 buffer_num_elements, flags);
-}
-
-MojoResult MojoEndWriteData(MojoHandle data_pipe_producer_handle,
-                            uint32_t num_elements_written) {
-  assert(g_thunks.EndWriteData);
-  return g_thunks.EndWriteData(data_pipe_producer_handle, num_elements_written);
-}
-
-MojoResult MojoReadData(MojoHandle data_pipe_consumer_handle,
-                        void* elements,
-                        uint32_t* num_elements,
-                        MojoReadDataFlags flags) {
-  assert(g_thunks.ReadData);
-  return g_thunks.ReadData(data_pipe_consumer_handle, elements, num_elements,
-                           flags);
-}
-
-MojoResult MojoBeginReadData(MojoHandle data_pipe_consumer_handle,
-                             const void** buffer,
-                             uint32_t* buffer_num_elements,
-                             MojoReadDataFlags flags) {
-  assert(g_thunks.BeginReadData);
-  return g_thunks.BeginReadData(data_pipe_consumer_handle, buffer,
-                                buffer_num_elements, flags);
-}
-
-MojoResult MojoEndReadData(MojoHandle data_pipe_consumer_handle,
-                           uint32_t num_elements_read) {
-  assert(g_thunks.EndReadData);
-  return g_thunks.EndReadData(data_pipe_consumer_handle, num_elements_read);
-}
-
-MojoResult MojoCreateSharedBuffer(
-    const struct MojoCreateSharedBufferOptions* options,
-    uint64_t num_bytes,
-    MojoHandle* shared_buffer_handle) {
-  assert(g_thunks.CreateSharedBuffer);
-  return g_thunks.CreateSharedBuffer(options, num_bytes, shared_buffer_handle);
-}
-
-MojoResult MojoDuplicateBufferHandle(
-    MojoHandle buffer_handle,
-    const struct MojoDuplicateBufferHandleOptions* options,
-    MojoHandle* new_buffer_handle) {
-  assert(g_thunks.DuplicateBufferHandle);
-  return g_thunks.DuplicateBufferHandle(buffer_handle, options,
-                                        new_buffer_handle);
-}
-
-MojoResult MojoMapBuffer(MojoHandle buffer_handle,
-                         uint64_t offset,
-                         uint64_t num_bytes,
-                         void** buffer,
-                         MojoMapBufferFlags flags) {
-  assert(g_thunks.MapBuffer);
-  return g_thunks.MapBuffer(buffer_handle, offset, num_bytes, buffer, flags);
-}
-
-MojoResult MojoUnmapBuffer(void* buffer) {
-  assert(g_thunks.UnmapBuffer);
-  return g_thunks.UnmapBuffer(buffer);
-}
-
-MojoResult MojoCreateWatcher(MojoWatcherCallback callback,
-                             MojoHandle* watcher_handle) {
-  assert(g_thunks.CreateWatcher);
-  return g_thunks.CreateWatcher(callback, watcher_handle);
-}
-
-MojoResult MojoWatch(MojoHandle watcher_handle,
-                     MojoHandle handle,
-                     MojoHandleSignals signals,
-                     uintptr_t context) {
-  assert(g_thunks.Watch);
-  return g_thunks.Watch(watcher_handle, handle, signals, context);
-}
-
-MojoResult MojoCancelWatch(MojoHandle watcher_handle, uintptr_t context) {
-  assert(g_thunks.CancelWatch);
-  return g_thunks.CancelWatch(watcher_handle, context);
-}
-
-MojoResult MojoArmWatcher(MojoHandle watcher_handle,
-                          uint32_t* num_ready_contexts,
-                          uintptr_t* ready_contexts,
-                          MojoResult* ready_results,
-                          MojoHandleSignalsState* ready_signals_states) {
-  assert(g_thunks.ArmWatcher);
-  return g_thunks.ArmWatcher(watcher_handle, num_ready_contexts, ready_contexts,
-                             ready_results, ready_signals_states);
-}
-
-MojoResult MojoFuseMessagePipes(MojoHandle handle0, MojoHandle handle1) {
-  assert(g_thunks.FuseMessagePipes);
-  return g_thunks.FuseMessagePipes(handle0, handle1);
-}
-
-MojoResult MojoWriteMessageNew(MojoHandle message_pipe_handle,
-                               MojoMessageHandle message,
-                               MojoWriteMessageFlags flags) {
-  assert(g_thunks.WriteMessageNew);
-  return g_thunks.WriteMessageNew(message_pipe_handle, message, flags);
-}
-
-MojoResult MojoReadMessageNew(MojoHandle message_pipe_handle,
-                              MojoMessageHandle* message,
-                              uint32_t* num_bytes,
-                              MojoHandle* handles,
-                              uint32_t* num_handles,
-                              MojoReadMessageFlags flags) {
-  assert(g_thunks.ReadMessageNew);
-  return g_thunks.ReadMessageNew(message_pipe_handle, message, num_bytes,
-                                 handles, num_handles, flags);
-}
-
-MojoResult MojoAllocMessage(uint32_t num_bytes,
-                            const MojoHandle* handles,
-                            uint32_t num_handles,
-                            MojoAllocMessageFlags flags,
-                            MojoMessageHandle* message) {
-  assert(g_thunks.AllocMessage);
-  return g_thunks.AllocMessage(
-      num_bytes, handles, num_handles, flags, message);
-}
-
-MojoResult MojoFreeMessage(MojoMessageHandle message) {
-  assert(g_thunks.FreeMessage);
-  return g_thunks.FreeMessage(message);
-}
-
-MojoResult MojoGetMessageBuffer(MojoMessageHandle message, void** buffer) {
-  assert(g_thunks.GetMessageBuffer);
-  return g_thunks.GetMessageBuffer(message, buffer);
-}
-
-MojoResult MojoWrapPlatformHandle(
-    const struct MojoPlatformHandle* platform_handle,
-    MojoHandle* mojo_handle) {
-  assert(g_thunks.WrapPlatformHandle);
-  return g_thunks.WrapPlatformHandle(platform_handle, mojo_handle);
-}
-
-MojoResult MojoUnwrapPlatformHandle(
-    MojoHandle mojo_handle,
-    struct MojoPlatformHandle* platform_handle) {
-  assert(g_thunks.UnwrapPlatformHandle);
-  return g_thunks.UnwrapPlatformHandle(mojo_handle, platform_handle);
-}
-
-MojoResult MojoWrapPlatformSharedBufferHandle(
-    const struct MojoPlatformHandle* platform_handle,
-    size_t num_bytes,
-    MojoPlatformSharedBufferHandleFlags flags,
-    MojoHandle* mojo_handle) {
-  assert(g_thunks.WrapPlatformSharedBufferHandle);
-  return g_thunks.WrapPlatformSharedBufferHandle(platform_handle, num_bytes,
-                                                 flags, mojo_handle);
-}
-
-MojoResult MojoUnwrapPlatformSharedBufferHandle(
-    MojoHandle mojo_handle,
-    struct MojoPlatformHandle* platform_handle,
-    size_t* num_bytes,
-    MojoPlatformSharedBufferHandleFlags* flags) {
-  assert(g_thunks.UnwrapPlatformSharedBufferHandle);
-  return g_thunks.UnwrapPlatformSharedBufferHandle(mojo_handle, platform_handle,
-                                                   num_bytes, flags);
-}
-
-MojoResult MojoNotifyBadMessage(MojoMessageHandle message,
-                                const char* error,
-                                size_t error_num_bytes) {
-  assert(g_thunks.NotifyBadMessage);
-  return g_thunks.NotifyBadMessage(message, error, error_num_bytes);
-}
-
-MojoResult MojoGetProperty(MojoPropertyType type, void* value) {
-  assert(g_thunks.GetProperty);
-  return g_thunks.GetProperty(type, value);
-}
-
-}  // extern "C"
-
-size_t MojoEmbedderSetSystemThunks(const MojoSystemThunks* system_thunks) {
-  if (system_thunks->size >= sizeof(g_thunks))
-    g_thunks = *system_thunks;
-  return sizeof(g_thunks);
-}
diff --git a/mojo/public/c/system/thunks.h b/mojo/public/c/system/thunks.h
deleted file mode 100644
index e61bb46..0000000
--- a/mojo/public/c/system/thunks.h
+++ /dev/null
@@ -1,148 +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.
-
-// Note: This header should be compilable as C.
-
-#ifndef MOJO_PUBLIC_C_SYSTEM_THUNKS_H_
-#define MOJO_PUBLIC_C_SYSTEM_THUNKS_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include "mojo/public/c/system/core.h"
-#include "mojo/public/c/system/system_export.h"
-
-// Structure used to bind the basic Mojo Core functions to an embedder
-// implementation. This is intended to eventually be used as a stable ABI
-// between a Mojo embedder and some loaded application code, but for now it is
-// still effectively safe to rearrange entries as needed.
-#pragma pack(push, 8)
-struct MojoSystemThunks {
-  size_t size;  // Should be set to sizeof(MojoSystemThunks).
-  MojoTimeTicks (*GetTimeTicksNow)();
-  MojoResult (*Close)(MojoHandle handle);
-  MojoResult (*QueryHandleSignalsState)(
-      MojoHandle handle,
-      struct MojoHandleSignalsState* signals_state);
-  MojoResult (*CreateMessagePipe)(
-      const struct MojoCreateMessagePipeOptions* options,
-      MojoHandle* message_pipe_handle0,
-      MojoHandle* message_pipe_handle1);
-  MojoResult (*WriteMessage)(MojoHandle message_pipe_handle,
-                             const void* bytes,
-                             uint32_t num_bytes,
-                             const MojoHandle* handles,
-                             uint32_t num_handles,
-                             MojoWriteMessageFlags flags);
-  MojoResult (*ReadMessage)(MojoHandle message_pipe_handle,
-                            void* bytes,
-                            uint32_t* num_bytes,
-                            MojoHandle* handles,
-                            uint32_t* num_handles,
-                            MojoReadMessageFlags flags);
-  MojoResult (*CreateDataPipe)(const struct MojoCreateDataPipeOptions* options,
-                               MojoHandle* data_pipe_producer_handle,
-                               MojoHandle* data_pipe_consumer_handle);
-  MojoResult (*WriteData)(MojoHandle data_pipe_producer_handle,
-                          const void* elements,
-                          uint32_t* num_elements,
-                          MojoWriteDataFlags flags);
-  MojoResult (*BeginWriteData)(MojoHandle data_pipe_producer_handle,
-                               void** buffer,
-                               uint32_t* buffer_num_elements,
-                               MojoWriteDataFlags flags);
-  MojoResult (*EndWriteData)(MojoHandle data_pipe_producer_handle,
-                             uint32_t num_elements_written);
-  MojoResult (*ReadData)(MojoHandle data_pipe_consumer_handle,
-                         void* elements,
-                         uint32_t* num_elements,
-                         MojoReadDataFlags flags);
-  MojoResult (*BeginReadData)(MojoHandle data_pipe_consumer_handle,
-                              const void** buffer,
-                              uint32_t* buffer_num_elements,
-                              MojoReadDataFlags flags);
-  MojoResult (*EndReadData)(MojoHandle data_pipe_consumer_handle,
-                            uint32_t num_elements_read);
-  MojoResult (*CreateSharedBuffer)(
-      const struct MojoCreateSharedBufferOptions* options,
-      uint64_t num_bytes,
-      MojoHandle* shared_buffer_handle);
-  MojoResult (*DuplicateBufferHandle)(
-      MojoHandle buffer_handle,
-      const struct MojoDuplicateBufferHandleOptions* options,
-      MojoHandle* new_buffer_handle);
-  MojoResult (*MapBuffer)(MojoHandle buffer_handle,
-                          uint64_t offset,
-                          uint64_t num_bytes,
-                          void** buffer,
-                          MojoMapBufferFlags flags);
-  MojoResult (*UnmapBuffer)(void* buffer);
-  MojoResult (*CreateWatcher)(MojoWatcherCallback callback,
-                              MojoHandle* watcher_handle);
-  MojoResult (*Watch)(MojoHandle watcher_handle,
-                      MojoHandle handle,
-                      MojoHandleSignals signals,
-                      uintptr_t context);
-  MojoResult (*CancelWatch)(MojoHandle watcher_handle, uintptr_t context);
-  MojoResult (*ArmWatcher)(MojoHandle watcher_handle,
-                           uint32_t* num_ready_contexts,
-                           uintptr_t* ready_contexts,
-                           MojoResult* ready_results,
-                           MojoHandleSignalsState* ready_signals_states);
-  MojoResult (*FuseMessagePipes)(MojoHandle handle0, MojoHandle handle1);
-  MojoResult (*WriteMessageNew)(MojoHandle message_pipe_handle,
-                                MojoMessageHandle message,
-                                MojoWriteMessageFlags flags);
-  MojoResult (*ReadMessageNew)(MojoHandle message_pipe_handle,
-                               MojoMessageHandle* message,
-                               uint32_t* num_bytes,
-                               MojoHandle* handles,
-                               uint32_t* num_handles,
-                               MojoReadMessageFlags flags);
-  MojoResult (*AllocMessage)(uint32_t num_bytes,
-                             const MojoHandle* handles,
-                             uint32_t num_handles,
-                             MojoAllocMessageFlags flags,
-                             MojoMessageHandle* message);
-  MojoResult (*FreeMessage)(MojoMessageHandle message);
-  MojoResult (*GetMessageBuffer)(MojoMessageHandle message, void** buffer);
-  MojoResult (*WrapPlatformHandle)(
-      const struct MojoPlatformHandle* platform_handle,
-      MojoHandle* mojo_handle);
-  MojoResult (*UnwrapPlatformHandle)(
-      MojoHandle mojo_handle,
-      struct MojoPlatformHandle* platform_handle);
-  MojoResult (*WrapPlatformSharedBufferHandle)(
-      const struct MojoPlatformHandle* platform_handle,
-      size_t num_bytes,
-      MojoPlatformSharedBufferHandleFlags flags,
-      MojoHandle* mojo_handle);
-  MojoResult (*UnwrapPlatformSharedBufferHandle)(
-      MojoHandle mojo_handle,
-      struct MojoPlatformHandle* platform_handle,
-      size_t* num_bytes,
-      MojoPlatformSharedBufferHandleFlags* flags);
-  MojoResult (*NotifyBadMessage)(MojoMessageHandle message,
-                                 const char* error,
-                                 size_t error_num_bytes);
-  MojoResult (*GetProperty)(MojoPropertyType type, void* value);
-};
-#pragma pack(pop)
-
-// Use this type for the function found by dynamically discovering it in
-// a DSO linked with mojo_system. For example:
-// MojoSetSystemThunksFn mojo_set_system_thunks_fn =
-//     reinterpret_cast<MojoSetSystemThunksFn>(app_library.GetFunctionPointer(
-//         "MojoSetSystemThunks"));
-// The expected size of |system_thunks| is returned.
-// The contents of |system_thunks| are copied.
-typedef size_t (*MojoSetSystemThunksFn)(
-    const struct MojoSystemThunks* system_thunks);
-
-// A function for setting up the embedder's own system thunks. This should only
-// be called by Mojo embedder code.
-MOJO_SYSTEM_EXPORT size_t MojoEmbedderSetSystemThunks(
-    const struct MojoSystemThunks* system_thunks);
-
-#endif  // MOJO_PUBLIC_C_SYSTEM_THUNKS_H_
diff --git a/mojo/public/c/system/types.h b/mojo/public/c/system/types.h
deleted file mode 100644
index 15813b6..0000000
--- a/mojo/public/c/system/types.h
+++ /dev/null
@@ -1,223 +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.
-
-// This file contains types and constants/macros common to different Mojo system
-// APIs.
-//
-// Note: This header should be compilable as C.
-
-#ifndef MOJO_PUBLIC_C_SYSTEM_TYPES_H_
-#define MOJO_PUBLIC_C_SYSTEM_TYPES_H_
-
-#include <stdint.h>
-
-#include "mojo/public/c/system/macros.h"
-
-// |MojoTimeTicks|: A time delta, in microseconds, the meaning of which is
-// source-dependent.
-
-typedef int64_t MojoTimeTicks;
-
-// |MojoHandle|: Handles to Mojo objects.
-//   |MOJO_HANDLE_INVALID| - A value that is never a valid handle.
-
-typedef uint32_t MojoHandle;
-
-#ifdef __cplusplus
-const MojoHandle MOJO_HANDLE_INVALID = 0;
-#else
-#define MOJO_HANDLE_INVALID ((MojoHandle)0)
-#endif
-
-// |MojoResult|: Result codes for Mojo operations. The only success code is zero
-// (|MOJO_RESULT_OK|); all non-zero values should be considered as error/failure
-// codes (even if the value is not recognized).
-//   |MOJO_RESULT_OK| - Not an error; returned on success.
-//   |MOJO_RESULT_CANCELLED| - Operation was cancelled, typically by the caller.
-//   |MOJO_RESULT_UNKNOWN| - Unknown error (e.g., if not enough information is
-//       available for a more specific error).
-//   |MOJO_RESULT_INVALID_ARGUMENT| - Caller specified an invalid argument. This
-//       differs from |MOJO_RESULT_FAILED_PRECONDITION| in that the former
-//       indicates arguments that are invalid regardless of the state of the
-//       system.
-//   |MOJO_RESULT_DEADLINE_EXCEEDED| - Deadline expired before the operation
-//       could complete.
-//   |MOJO_RESULT_NOT_FOUND| - Some requested entity was not found (i.e., does
-//       not exist).
-//   |MOJO_RESULT_ALREADY_EXISTS| - Some entity or condition that we attempted
-//       to create already exists.
-//   |MOJO_RESULT_PERMISSION_DENIED| - The caller does not have permission to
-//       for the operation (use |MOJO_RESULT_RESOURCE_EXHAUSTED| for rejections
-//       caused by exhausting some resource instead).
-//   |MOJO_RESULT_RESOURCE_EXHAUSTED| - Some resource required for the call
-//       (possibly some quota) has been exhausted.
-//   |MOJO_RESULT_FAILED_PRECONDITION| - The system is not in a state required
-//       for the operation (use this if the caller must do something to rectify
-//       the state before retrying).
-//   |MOJO_RESULT_ABORTED| - The operation was aborted by the system, possibly
-//       due to a concurrency issue (use this if the caller may retry at a
-//       higher level).
-//   |MOJO_RESULT_OUT_OF_RANGE| - The operation was attempted past the valid
-//       range. Unlike |MOJO_RESULT_INVALID_ARGUMENT|, this indicates that the
-//       operation may be/become valid depending on the system state. (This
-//       error is similar to |MOJO_RESULT_FAILED_PRECONDITION|, but is more
-//       specific.)
-//   |MOJO_RESULT_UNIMPLEMENTED| - The operation is not implemented, supported,
-//       or enabled.
-//   |MOJO_RESULT_INTERNAL| - Internal error: this should never happen and
-//       indicates that some invariant expected by the system has been broken.
-//   |MOJO_RESULT_UNAVAILABLE| - The operation is (temporarily) currently
-//       unavailable. The caller may simply retry the operation (possibly with a
-//       backoff).
-//   |MOJO_RESULT_DATA_LOSS| - Unrecoverable data loss or corruption.
-//   |MOJO_RESULT_BUSY| - One of the resources involved is currently being used
-//       (possibly on another thread) in a way that prevents the current
-//       operation from proceeding, e.g., if the other operation may result in
-//       the resource being invalidated.
-//   |MOJO_RESULT_SHOULD_WAIT| - The request cannot currently be completed
-//       (e.g., if the data requested is not yet available). The caller should
-//       wait for it to be feasible using a watcher.
-//
-// The codes from |MOJO_RESULT_OK| to |MOJO_RESULT_DATA_LOSS| come from
-// Google3's canonical error codes.
-
-typedef uint32_t MojoResult;
-
-#ifdef __cplusplus
-const MojoResult MOJO_RESULT_OK = 0;
-const MojoResult MOJO_RESULT_CANCELLED = 1;
-const MojoResult MOJO_RESULT_UNKNOWN = 2;
-const MojoResult MOJO_RESULT_INVALID_ARGUMENT = 3;
-const MojoResult MOJO_RESULT_DEADLINE_EXCEEDED = 4;
-const MojoResult MOJO_RESULT_NOT_FOUND = 5;
-const MojoResult MOJO_RESULT_ALREADY_EXISTS = 6;
-const MojoResult MOJO_RESULT_PERMISSION_DENIED = 7;
-const MojoResult MOJO_RESULT_RESOURCE_EXHAUSTED = 8;
-const MojoResult MOJO_RESULT_FAILED_PRECONDITION = 9;
-const MojoResult MOJO_RESULT_ABORTED = 10;
-const MojoResult MOJO_RESULT_OUT_OF_RANGE = 11;
-const MojoResult MOJO_RESULT_UNIMPLEMENTED = 12;
-const MojoResult MOJO_RESULT_INTERNAL = 13;
-const MojoResult MOJO_RESULT_UNAVAILABLE = 14;
-const MojoResult MOJO_RESULT_DATA_LOSS = 15;
-const MojoResult MOJO_RESULT_BUSY = 16;
-const MojoResult MOJO_RESULT_SHOULD_WAIT = 17;
-#else
-#define MOJO_RESULT_OK ((MojoResult)0)
-#define MOJO_RESULT_CANCELLED ((MojoResult)1)
-#define MOJO_RESULT_UNKNOWN ((MojoResult)2)
-#define MOJO_RESULT_INVALID_ARGUMENT ((MojoResult)3)
-#define MOJO_RESULT_DEADLINE_EXCEEDED ((MojoResult)4)
-#define MOJO_RESULT_NOT_FOUND ((MojoResult)5)
-#define MOJO_RESULT_ALREADY_EXISTS ((MojoResult)6)
-#define MOJO_RESULT_PERMISSION_DENIED ((MojoResult)7)
-#define MOJO_RESULT_RESOURCE_EXHAUSTED ((MojoResult)8)
-#define MOJO_RESULT_FAILED_PRECONDITION ((MojoResult)9)
-#define MOJO_RESULT_ABORTED ((MojoResult)10)
-#define MOJO_RESULT_OUT_OF_RANGE ((MojoResult)11)
-#define MOJO_RESULT_UNIMPLEMENTED ((MojoResult)12)
-#define MOJO_RESULT_INTERNAL ((MojoResult)13)
-#define MOJO_RESULT_UNAVAILABLE ((MojoResult)14)
-#define MOJO_RESULT_DATA_LOSS ((MojoResult)15)
-#define MOJO_RESULT_BUSY ((MojoResult)16)
-#define MOJO_RESULT_SHOULD_WAIT ((MojoResult)17)
-#endif
-
-// |MojoDeadline|: Used to specify deadlines (timeouts), in microseconds (except
-// for |MOJO_DEADLINE_INDEFINITE|).
-//   |MOJO_DEADLINE_INDEFINITE| - Used to indicate "forever".
-
-typedef uint64_t MojoDeadline;
-
-#ifdef __cplusplus
-const MojoDeadline MOJO_DEADLINE_INDEFINITE = static_cast<MojoDeadline>(-1);
-#else
-#define MOJO_DEADLINE_INDEFINITE ((MojoDeadline) - 1)
-#endif
-
-// |MojoHandleSignals|: Used to specify signals that can be watched for on a
-// handle (and which can be triggered), e.g., the ability to read or write to
-// the handle.
-//   |MOJO_HANDLE_SIGNAL_NONE| - No flags. A registered watch will always fail
-//       to arm with |MOJO_RESULT_FAILED_PRECONDITION| when watching for this.
-//   |MOJO_HANDLE_SIGNAL_READABLE| - Can read (e.g., a message) from the handle.
-//   |MOJO_HANDLE_SIGNAL_WRITABLE| - Can write (e.g., a message) to the handle.
-//   |MOJO_HANDLE_SIGNAL_PEER_CLOSED| - The peer handle is closed.
-//   |MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE| - Can read data from a data pipe
-//       consumer handle (implying MOJO_HANDLE_SIGNAL_READABLE is also set),
-//       AND there is some nonzero quantity of new data available on the pipe
-//       since the last |MojoReadData()| or |MojoBeginReadData()| call on the
-//       handle.
-
-typedef uint32_t MojoHandleSignals;
-
-#ifdef __cplusplus
-const MojoHandleSignals MOJO_HANDLE_SIGNAL_NONE = 0;
-const MojoHandleSignals MOJO_HANDLE_SIGNAL_READABLE = 1 << 0;
-const MojoHandleSignals MOJO_HANDLE_SIGNAL_WRITABLE = 1 << 1;
-const MojoHandleSignals MOJO_HANDLE_SIGNAL_PEER_CLOSED = 1 << 2;
-const MojoHandleSignals MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE = 1 << 3;
-#else
-#define MOJO_HANDLE_SIGNAL_NONE ((MojoHandleSignals)0)
-#define MOJO_HANDLE_SIGNAL_READABLE ((MojoHandleSignals)1 << 0)
-#define MOJO_HANDLE_SIGNAL_WRITABLE ((MojoHandleSignals)1 << 1)
-#define MOJO_HANDLE_SIGNAL_PEER_CLOSED ((MojoHandleSignals)1 << 2)
-#define MOJO_HANDLE_SIGNAL_NEW_DATA_READABLE ((MojoHandleSignals)1 << 3);
-#endif
-
-// |MojoHandleSignalsState|: Returned by watch notification callbacks and
-// |MojoQueryHandleSignalsState| functions to indicate the signaling state of
-// handles. Members are as follows:
-//   - |satisfied signals|: Bitmask of signals that were satisfied at some time
-//         before the call returned.
-//   - |satisfiable signals|: These are the signals that are possible to
-//         satisfy. For example, if the return value was
-//         |MOJO_RESULT_FAILED_PRECONDITION|, you can use this field to
-//         determine which, if any, of the signals can still be satisfied.
-// Note: This struct is not extensible (and only has 32-bit quantities), so it's
-// 32-bit-aligned.
-MOJO_STATIC_ASSERT(MOJO_ALIGNOF(int32_t) == 4, "int32_t has weird alignment");
-struct MOJO_ALIGNAS(4) MojoHandleSignalsState {
-  MojoHandleSignals satisfied_signals;
-  MojoHandleSignals satisfiable_signals;
-};
-MOJO_STATIC_ASSERT(sizeof(MojoHandleSignalsState) == 8,
-                   "MojoHandleSignalsState has wrong size");
-
-// |MojoWatcherNotificationFlags|: Passed to a callback invoked by a watcher
-// when some observed signals are raised or a watched handle is closed. May take
-// on any combination of the following values:
-//
-//   |MOJO_WATCHER_NOTIFICATION_FLAG_FROM_SYSTEM| - The callback is being
-//       invoked as a result of a system-level event rather than a direct API
-//       call from user code. This may be used as an indication that user code
-//       is safe to call without fear of reentry.
-
-typedef uint32_t MojoWatcherNotificationFlags;
-
-#ifdef __cplusplus
-const MojoWatcherNotificationFlags MOJO_WATCHER_NOTIFICATION_FLAG_NONE = 0;
-const MojoWatcherNotificationFlags MOJO_WATCHER_NOTIFICATION_FLAG_FROM_SYSTEM =
-    1 << 0;
-#else
-#define MOJO_WATCHER_NOTIFICATION_FLAG_NONE ((MojoWatcherNotificationFlags)0)
-#define MOJO_WATCHER_NOTIFICATION_FLAG_FROM_SYSTEM \
-  ((MojoWatcherNotificationFlags)1 << 0);
-#endif
-
-// |MojoPropertyType|: Property types that can be passed to |MojoGetProperty()|
-// to retrieve system properties. May take the following values:
-//   |MOJO_PROPERTY_TYPE_SYNC_CALL_ALLOWED| - Whether making synchronous calls
-//       (i.e., blocking to wait for a response to an outbound message) is
-//       allowed. The property value is of boolean type. If the value is true,
-//       users should refrain from making sync calls.
-typedef uint32_t MojoPropertyType;
-
-#ifdef __cplusplus
-const MojoPropertyType MOJO_PROPERTY_TYPE_SYNC_CALL_ALLOWED = 0;
-#else
-#define MOJO_PROPERTY_TYPE_SYNC_CALL_ALLOWED ((MojoPropertyType)0)
-#endif
-
-#endif  // MOJO_PUBLIC_C_SYSTEM_TYPES_H_
diff --git a/mojo/public/c/system/watcher.h b/mojo/public/c/system/watcher.h
deleted file mode 100644
index e32856b..0000000
--- a/mojo/public/c/system/watcher.h
+++ /dev/null
@@ -1,184 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_C_SYSTEM_WATCHER_H_
-#define MOJO_PUBLIC_C_SYSTEM_WATCHER_H_
-
-#include <stdint.h>
-
-#include "mojo/public/c/system/system_export.h"
-#include "mojo/public/c/system/types.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-// A callback used to notify watchers about events on their watched handles.
-//
-// See documentation for |MojoWatcherNotificationFlags| for details regarding
-// the possible values of |flags|.
-//
-// See documentation for |MojoWatch()| for details regarding the other arguments
-// this callback receives when called.
-typedef void (*MojoWatcherCallback)(uintptr_t context,
-                                    MojoResult result,
-                                    struct MojoHandleSignalsState signals_state,
-                                    MojoWatcherNotificationFlags flags);
-
-// Creates a new watcher.
-//
-// Watchers are used to trigger arbitrary code execution when one or more
-// handles change state to meet certain conditions.
-//
-// A newly registered watcher is initially disarmed and may be armed using
-// |MojoArmWatcher()|. A watcher is also always disarmed immediately before any
-// invocation of one or more notification callbacks in response to a single
-// handle's state changing in some relevant way.
-//
-// Parameters:
-//   |callback|: The |MojoWatcherCallback| to invoke any time the watcher is
-//       notified of an event. See |MojoWatch()| for details regarding arguments
-//       passed to the callback. Note that this may be called from any arbitrary
-//       thread.
-//   |watcher_handle|: The address at which to store the MojoHandle
-//       corresponding to the new watcher if successfully created.
-//
-// Returns:
-//   |MOJO_RESULT_OK| if the watcher has been successfully created.
-//   |MOJO_RESULT_RESOURCE_EXHAUSTED| if a handle could not be allocated for
-//       this watcher.
-MOJO_SYSTEM_EXPORT MojoResult MojoCreateWatcher(MojoWatcherCallback callback,
-                                                MojoHandle* watcher_handle);
-
-// Adds a watch to a watcher. This allows the watcher to fire notifications
-// regarding state changes on the handle corresponding to the arguments given.
-//
-// Note that notifications for a given watch context are guaranteed to be
-// mutually exclusive in execution: the callback will never be entered for a
-// given context while another invocation of the callback is still executing for
-// the same context. As a result it is generally a good idea to ensure that
-// callbacks do as little work as necessary in order to process the
-// notification.
-//
-// Parameters:
-//   |watcher_handle|: The watcher to which |handle| is to be added.
-//   |handle|: The handle to add to the watcher.
-//   |signals|: The signals to watch for on |handle|.
-//   |context|: An arbitrary context value given to any invocation of the
-//       watcher's callback when invoked as a result of some state change
-//       relevant to this combination of |handle| and |signals|. Must be
-//       unique within any given watcher.
-//
-// Callback parameters (see |MojoWatcherNotificationCallback| above):
-//   When the watcher invokes its callback as a result of some notification
-//   relevant to this watch operation, |context| receives the value given here
-//   and |signals_state| receives the last known signals state of this handle.
-//
-//   |result| is one of the following:
-//     |MOJO_RESULT_OK| if at least one of the watched signals is satisfied. The
-//         watcher must be armed for this notification to fire.
-//     |MOJO_RESULT_FAILED_PRECONDITION| if all of the watched signals are
-//         permanently unsatisfiable. The watcher must be armed for this
-//         notification to fire.
-//     |MOJO_RESULT_CANCELLED| if the watch has been cancelled. The may occur if
-//         the watcher has been closed, the watched handle has been closed, or
-//         the watch for |context| has been explicitly cancelled. This is always
-//         the last result received for any given context, and it is guaranteed
-//         to be received exactly once per watch, regardless of how the watch
-//         was cancelled.
-//
-// Returns:
-//   |MOJO_RESULT_OK| if the handle is now being watched by the watcher.
-//   |MOJO_RESULT_INVALID_ARGUMENT| if |watcher_handle| is not a watcher handle,
-//       |handle| is not a valid message pipe or data pipe handle.
-//   |MOJO_RESULT_ALREADY_EXISTS| if the watcher already has a watch registered
-//       for the given value of |context| or for the given |handle|.
-MOJO_SYSTEM_EXPORT MojoResult MojoWatch(MojoHandle watcher_handle,
-                                        MojoHandle handle,
-                                        MojoHandleSignals signals,
-                                        uintptr_t context);
-
-// Removes a watch from a watcher.
-//
-// This ensures that the watch is cancelled as soon as possible. Cancellation
-// may be deferred (or may even block) an aritrarily long time if the watch is
-// already dispatching one or more notifications.
-//
-// When cancellation is complete, the watcher's callback is invoked one final
-// time for |context|, with the result |MOJO_RESULT_CANCELLED|.
-//
-// The same behavior can be elicted by either closing the watched handle
-// associated with this context, or by closing |watcher_handle| itself. In the
-// lastter case, all registered contexts on the watcher are implicitly cancelled
-// in a similar fashion.
-//
-// Parameters:
-//   |watcher_handle|: The handle of the watcher from which to remove a watch.
-//   |context|: The context of the watch to be removed.
-//
-// Returns:
-//   |MOJO_RESULT_OK| if the watch has been cancelled.
-//   |MOJO_RESULT_INVALID_ARGUMENT| if |watcher_handle| is not a watcher handle.
-//   |MOJO_RESULT_NOT_FOUND| if there is no watch registered on this watcher for
-//       the given value of |context|.
-MOJO_SYSTEM_EXPORT MojoResult MojoCancelWatch(MojoHandle watcher_handle,
-                                              uintptr_t context);
-
-// Arms a watcher, enabling a single future event on one of the watched handles
-// to trigger a single notification for each relevant watch context associated
-// with that handle.
-//
-// Parameters:
-//   |watcher_handle|: The handle of the watcher.
-//   |num_ready_contexts|: An address pointing to the number of elements
-//       available for storage in the remaining output buffers. Optional and
-//       only used on failure. See |MOJO_RESULT_FAILED_PRECONDITION| below for
-//       more details.
-//   |ready_contexts|: An output buffer for contexts corresponding to the
-//       watches which would have notified if the watcher were armed. Optional
-//       and only uesd on failure. See |MOJO_RESULT_FAILED_PRECONDITION| below
-//       for more details.
-//   |ready_results|: An output buffer for MojoResult values corresponding to
-//       each context in |ready_contexts|. Optional and only used on failure.
-//       See |MOJO_RESULT_FAILED_PRECONDITION| below for more details.
-//   |ready_signals_states|: An output buffer for |MojoHandleSignalsState|
-//       structures corresponding to each context in |ready_contexts|. Optional
-//       and only used on failure. See |MOJO_RESULT_FAILED_PRECONDITION| below
-//       for more details.
-//
-// Returns:
-//   |MOJO_RESULT_OK| if the watcher has been successfully armed. All arguments
-//       other than |watcher_handle| are ignored in this case.
-//   |MOJO_RESULT_NOT_FOUND| if the watcher does not have any registered watch
-//       contexts. All arguments other than |watcher_handle| are ignored in this
-//       case.
-//   |MOJO_RESULT_INVALID_ARGUMENT| if |watcher_handle| is not a valid watcher
-//       handle, or if |num_ready_contexts| is non-null but any of the output
-//       buffer paramters is null.
-//   |MOJO_RESULT_FAILED_PRECONDITION| if one or more watches would have
-//       notified immediately upon arming the watcher. If |num_handles| is
-//       non-null, this assumes there is enough space for |*num_handles| entries
-//       in each of the subsequent output buffer arguments.
-//
-//       At most that many entries are placed in the output buffers,
-//       corresponding to the watches which would have signalled if the watcher
-//       had been armed successfully. The actual number of entries placed in the
-//       output buffers is written to |*num_ready_contexts| before returning.
-//
-//       If more than (input) |*num_ready_contexts| watch contexts were ready to
-//       notify, the subset presented in output buffers is arbitrary, but the
-//       implementation makes a best effort to circulate the outputs across
-//       consecutive calls so that callers may reliably avoid handle starvation.
-MOJO_SYSTEM_EXPORT MojoResult
-MojoArmWatcher(MojoHandle watcher_handle,
-               uint32_t* num_ready_contexts,
-               uintptr_t* ready_contexts,
-               MojoResult* ready_results,
-               struct MojoHandleSignalsState* ready_signals_states);
-
-#ifdef __cplusplus
-}  // extern "C"
-#endif
-
-#endif  // MOJO_PUBLIC_C_SYSTEM_WATCHER_H_
diff --git a/mojo/public/c/test_support/BUILD.gn b/mojo/public/c/test_support/BUILD.gn
deleted file mode 100644
index e2abd58..0000000
--- a/mojo/public/c/test_support/BUILD.gn
+++ /dev/null
@@ -1,15 +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.
-
-static_library("test_support") {
-  output_name = "mojo_public_test_support"
-
-  sources = [
-    "test_support.h",
-
-    # TODO(vtl): Convert this to thunks http://crbug.com/386799
-    "../../tests/test_support_private.cc",
-    "../../tests/test_support_private.h",
-  ]
-}
diff --git a/mojo/public/c/test_support/test_support.h b/mojo/public/c/test_support/test_support.h
deleted file mode 100644
index 8e50441..0000000
--- a/mojo/public/c/test_support/test_support.h
+++ /dev/null
@@ -1,52 +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 MOJO_PUBLIC_C_TEST_SUPPORT_TEST_SUPPORT_H_
-#define MOJO_PUBLIC_C_TEST_SUPPORT_TEST_SUPPORT_H_
-
-// Note: This header should be compilable as C.
-
-#include <stdio.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-// |sub_test_name| is optional. If not null, it usually describes one particular
-// configuration of the test. For example, if |test_name| is "TestPacketRate",
-// |sub_test_name| could be "100BytesPerPacket".
-// When the perf data is visualized by the performance dashboard, data with
-// different |sub_test_name|s (but the same |test_name|) are depicted as
-// different traces on the same chart.
-void MojoTestSupportLogPerfResult(
-    const char* test_name,
-    const char* sub_test_name,
-    double value,
-    const char* units);
-
-// Opens a "/"-delimited file path relative to the source root.
-FILE* MojoTestSupportOpenSourceRootRelativeFile(
-    const char* source_root_relative_path);
-
-// Enumerates a "/"-delimited directory path relative to the source root.
-// Returns only regular files. The return value is a heap-allocated array of
-// heap-allocated strings. Each must be free'd separately.
-//
-// The return value is built like so:
-//
-//   char** rv = (char**) calloc(N + 1, sizeof(char*));
-//   rv[0] = strdup("a");
-//   rv[1] = strdup("b");
-//   rv[2] = strdup("c");
-//   ...
-//   rv[N] = NULL;
-//
-char** MojoTestSupportEnumerateSourceRootRelativeDirectory(
-    const char* source_root_relative_path);
-
-#ifdef __cplusplus
-}  // extern "C"
-#endif
-
-#endif  // MOJO_PUBLIC_C_TEST_SUPPORT_TEST_SUPPORT_H_
diff --git a/mojo/public/cpp/bindings/BUILD.gn b/mojo/public/cpp/bindings/BUILD.gn
deleted file mode 100644
index bd87965..0000000
--- a/mojo/public/cpp/bindings/BUILD.gn
+++ /dev/null
@@ -1,194 +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.
-
-interfaces_bindings_gen_dir = "$root_gen_dir/mojo/public/interfaces/bindings"
-
-component("bindings") {
-  sources = [
-    # Normally, targets should depend on the source_sets generated by mojom
-    # targets. However, the generated source_sets use portions of the bindings
-    # library. In order to avoid linker warnings about locally-defined imports
-    # in Windows components build, this target depends on the generated C++
-    # files directly so that the EXPORT macro defintions match.
-    "$interfaces_bindings_gen_dir/interface_control_messages.mojom-shared-internal.h",
-    "$interfaces_bindings_gen_dir/interface_control_messages.mojom-shared.cc",
-    "$interfaces_bindings_gen_dir/interface_control_messages.mojom-shared.h",
-    "$interfaces_bindings_gen_dir/interface_control_messages.mojom.cc",
-    "$interfaces_bindings_gen_dir/interface_control_messages.mojom.h",
-    "$interfaces_bindings_gen_dir/pipe_control_messages.mojom-shared-internal.h",
-    "$interfaces_bindings_gen_dir/pipe_control_messages.mojom-shared.cc",
-    "$interfaces_bindings_gen_dir/pipe_control_messages.mojom-shared.h",
-    "$interfaces_bindings_gen_dir/pipe_control_messages.mojom.cc",
-    "$interfaces_bindings_gen_dir/pipe_control_messages.mojom.h",
-    "array_data_view.h",
-    "array_traits.h",
-    "array_traits_carray.h",
-    "array_traits_stl.h",
-    "associated_binding.h",
-    "associated_binding_set.h",
-    "associated_group.h",
-    "associated_group_controller.h",
-    "associated_interface_ptr.h",
-    "associated_interface_ptr_info.h",
-    "associated_interface_request.h",
-    "binding.h",
-    "binding_set.h",
-    "bindings_export.h",
-    "clone_traits.h",
-    "connection_error_callback.h",
-    "connector.h",
-    "disconnect_reason.h",
-    "filter_chain.h",
-    "interface_data_view.h",
-    "interface_endpoint_client.h",
-    "interface_endpoint_controller.h",
-    "interface_id.h",
-    "interface_ptr.h",
-    "interface_ptr_info.h",
-    "interface_ptr_set.h",
-    "interface_request.h",
-    "lib/array_internal.cc",
-    "lib/array_internal.h",
-    "lib/array_serialization.h",
-    "lib/associated_binding.cc",
-    "lib/associated_group.cc",
-    "lib/associated_group_controller.cc",
-    "lib/associated_interface_ptr.cc",
-    "lib/associated_interface_ptr_state.h",
-    "lib/binding_state.cc",
-    "lib/binding_state.h",
-    "lib/bindings_internal.h",
-    "lib/buffer.h",
-    "lib/connector.cc",
-    "lib/control_message_handler.cc",
-    "lib/control_message_handler.h",
-    "lib/control_message_proxy.cc",
-    "lib/control_message_proxy.h",
-    "lib/equals_traits.h",
-    "lib/filter_chain.cc",
-    "lib/fixed_buffer.cc",
-    "lib/fixed_buffer.h",
-    "lib/handle_interface_serialization.h",
-    "lib/hash_util.h",
-    "lib/interface_endpoint_client.cc",
-    "lib/interface_ptr_state.h",
-    "lib/map_data_internal.h",
-    "lib/map_serialization.h",
-    "lib/may_auto_lock.h",
-    "lib/message.cc",
-    "lib/message_buffer.cc",
-    "lib/message_buffer.h",
-    "lib/message_builder.cc",
-    "lib/message_builder.h",
-    "lib/message_header_validator.cc",
-    "lib/message_internal.h",
-    "lib/multiplex_router.cc",
-    "lib/multiplex_router.h",
-    "lib/native_enum_data.h",
-    "lib/native_enum_serialization.h",
-    "lib/native_struct.cc",
-    "lib/native_struct_data.cc",
-    "lib/native_struct_data.h",
-    "lib/native_struct_serialization.cc",
-    "lib/native_struct_serialization.h",
-    "lib/pipe_control_message_handler.cc",
-    "lib/pipe_control_message_proxy.cc",
-    "lib/scoped_interface_endpoint_handle.cc",
-    "lib/serialization.h",
-    "lib/serialization_context.cc",
-    "lib/serialization_context.h",
-    "lib/serialization_forward.h",
-    "lib/serialization_util.h",
-    "lib/string_serialization.h",
-    "lib/string_traits_string16.cc",
-    "lib/sync_call_restrictions.cc",
-    "lib/sync_event_watcher.cc",
-    "lib/sync_handle_registry.cc",
-    "lib/sync_handle_watcher.cc",
-    "lib/template_util.h",
-    "lib/union_accessor.h",
-    "lib/validate_params.h",
-    "lib/validation_context.cc",
-    "lib/validation_context.h",
-    "lib/validation_errors.cc",
-    "lib/validation_errors.h",
-    "lib/validation_util.cc",
-    "lib/validation_util.h",
-    "map.h",
-    "map_data_view.h",
-    "map_traits.h",
-    "map_traits_stl.h",
-    "message.h",
-    "message_header_validator.h",
-    "native_enum.h",
-    "native_struct.h",
-    "native_struct_data_view.h",
-    "pipe_control_message_handler.h",
-    "pipe_control_message_handler_delegate.h",
-    "pipe_control_message_proxy.h",
-    "raw_ptr_impl_ref_traits.h",
-    "scoped_interface_endpoint_handle.h",
-    "string_data_view.h",
-    "string_traits.h",
-    "string_traits_stl.h",
-    "string_traits_string16.h",
-    "string_traits_string_piece.h",
-    "strong_associated_binding.h",
-    "strong_binding.h",
-    "strong_binding_set.h",
-    "struct_ptr.h",
-    "sync_call_restrictions.h",
-    "sync_event_watcher.h",
-    "sync_handle_registry.h",
-    "sync_handle_watcher.h",
-    "thread_safe_interface_ptr.h",
-    "type_converter.h",
-    "union_traits.h",
-    "unique_ptr_impl_ref_traits.h",
-  ]
-
-  public_deps = [
-    ":struct_traits",
-    "//base",
-    "//ipc:param_traits",
-    "//mojo/public/cpp/system",
-  ]
-
-  deps = [
-    "//base",
-    "//mojo/public/interfaces/bindings:bindings__generator",
-    "//mojo/public/interfaces/bindings:bindings_shared__generator",
-  ]
-
-  defines = [ "MOJO_CPP_BINDINGS_IMPLEMENTATION" ]
-}
-
-source_set("struct_traits") {
-  sources = [
-    "enum_traits.h",
-    "struct_traits.h",
-  ]
-}
-
-if (!is_ios) {
-  # TODO(yzshen): crbug.com/617718 Consider moving this into blink.
-  source_set("wtf_support") {
-    sources = [
-      "array_traits_wtf_vector.h",
-      "lib/string_traits_wtf.cc",
-      "lib/wtf_clone_equals_util.h",
-      "lib/wtf_hash_util.h",
-      "lib/wtf_serialization.h",
-      "map_traits_wtf_hash_map.h",
-      "string_traits_wtf.h",
-    ]
-
-    public_deps = [
-      ":bindings",
-      "//third_party/WebKit/Source/wtf",
-    ]
-
-    public_configs = [ "//third_party/WebKit/Source:config" ]
-  }
-}
diff --git a/mojo/public/cpp/bindings/DEPS b/mojo/public/cpp/bindings/DEPS
deleted file mode 100644
index 36eba44..0000000
--- a/mojo/public/cpp/bindings/DEPS
+++ /dev/null
@@ -1,3 +0,0 @@
-include_rules = [
-  "+third_party/WebKit/Source/wtf",
-]
diff --git a/mojo/public/cpp/bindings/README.md b/mojo/public/cpp/bindings/README.md
deleted file mode 100644
index b37267a..0000000
--- a/mojo/public/cpp/bindings/README.md
+++ /dev/null
@@ -1,1231 +0,0 @@
-# ![Mojo Graphic](https://goo.gl/6CdlbH) Mojo C++ Bindings API
-This document is a subset of the [Mojo documentation](/mojo).
-
-[TOC]
-
-## Overview
-The Mojo C++ Bindings API leverages the
-[C++ System API](/mojo/public/cpp/system) to provide a more natural set of
-primitives for communicating over Mojo message pipes. Combined with generated
-code from the [Mojom IDL and bindings generator](/mojo/public/tools/bindings),
-users can easily connect interface clients and implementations across arbitrary
-intra- and inter-process bounaries.
-
-This document provides a detailed guide to bindings API usage with example code
-snippets. For a detailed API references please consult the headers in
-[//mojo/public/cpp/bindings](https://cs.chromium.org/chromium/src/mojo/public/cpp/bindings/).
-
-## Getting Started
-
-When a Mojom IDL file is processed by the bindings generator, C++ code is
-emitted in a series of `.h` and `.cc` files with names based on the input
-`.mojom` file. Suppose we create the following Mojom file at
-`//services/db/public/interfaces/db.mojom`:
-
-```
-module db.mojom;
-
-interface Table {
-  AddRow(int32 key, string data);
-};
-
-interface Database {
-  CreateTable(Table& table);
-};
-```
-
-And a GN target to generate the bindings in
-`//services/db/public/interfaces/BUILD.gn`:
-
-```
-import("//mojo/public/tools/bindings/mojom.gni")
-
-mojom("interfaces") {
-  sources = [
-    "db.mojom",
-  ]
-}
-```
-
-If we then build this target:
-
-```
-ninja -C out/r services/db/public/interfaces
-```
-
-This will produce several generated source files, some of which are relevant to
-C++ bindings. Two of these files are:
-
-```
-out/gen/services/business/public/interfaces/factory.mojom.cc
-out/gen/services/business/public/interfaces/factory.mojom.h
-```
-
-You can include the above generated header in your sources in order to use the
-definitions therein:
-
-``` cpp
-#include "services/business/public/interfaces/factory.mojom.h"
-
-class TableImpl : public db::mojom::Table {
-  // ...
-};
-```
-
-This document covers the different kinds of definitions generated by Mojom IDL
-for C++ consumers and how they can effectively be used to communicate across
-message pipes.
-
-*** note
-**NOTE:** Using C++ bindings from within Blink code is typically subject to
-special constraints which require the use of a different generated header.
-For details, see [Blink Type Mapping](#Blink-Type-Mapping).
-***
-
-## Interfaces
-
-Mojom IDL interfaces are translated to corresponding C++ (pure virtual) class
-interface definitions in the generated header, consisting of a single generated
-method signature for each request message on the interface. Internally there is
-also generated code for serialization and deserialization of messages, but this
-detail is hidden from bindings consumers.
-
-### Basic Usage
-
-Let's consider a new `//sample/logger.mojom` to define a simple logging
-interface which clients can use to log simple string messages:
-
-``` cpp
-module sample.mojom;
-
-interface Logger {
-  Log(string message);
-};
-```
-
-Running this through the bindings generator will produce a `logging.mojom.h`
-with the following definitions (modulo unimportant details):
-
-``` cpp
-namespace sample {
-namespace mojom {
-
-class Logger {
-  virtual ~Logger() {}
-
-  virtual void Log(const std::string& message) = 0;
-};
-
-using LoggerPtr = mojo::InterfacePtr<Logger>;
-using LoggerRequest = mojo::InterfaceRequest<Logger>;
-
-}  // namespace mojom
-}  // namespace sample
-```
-
-Makes sense. Let's take a closer look at those type aliases at the end.
-
-### InterfacePtr and InterfaceRequest
-
-You will notice the type aliases for `LoggerPtr` and
-`LoggerRequest` are using two of the most fundamental template types in the C++
-bindings library: **`InterfacePtr<T>`** and **`InterfaceRequest<T>`**.
-
-In the world of Mojo bindings libraries these are effectively strongly-typed
-message pipe endpoints. If an `InterfacePtr<T>` is bound to a message pipe
-endpoint, it can be dereferenced to make calls on an opaque `T` interface. These
-calls immediately serialize their arguments (using generated code) and write a
-corresponding message to the pipe.
-
-An `InterfaceRequest<T>` is essentially just a typed container to hold the other
-end of an `InterfacePtr<T>`'s pipe -- the receiving end -- until it can be
-routed to some implementation which will **bind** it. The `InterfaceRequest<T>`
-doesn't actually *do* anything other than hold onto a pipe endpoint and carry
-useful compile-time type information.
-
-![Diagram illustrating InterfacePtr and InterfaceRequest on either end of a message pipe](https://docs.google.com/drawings/d/17d5gvErbQ6DthEBMS7I1WhCh9bz0n12pvNjydzuRfTI/pub?w=600&h=100)
-
-So how do we create a strongly-typed message pipe?
-
-### Creating Interface Pipes
-
-One way to do this is by manually creating a pipe and binding each end:
-
-``` cpp
-#include "sample/logger.mojom.h"
-
-mojo::MessagePipe pipe;
-sample::mojom::LoggerPtr logger;
-sample::mojom::LoggerRequest request;
-
-logger.Bind(sample::mojom::LoggerPtrInfo(std::move(pipe.handle0), 0u));
-request.Bind(std::move(pipe.handle1));
-```
-
-That's pretty verbose, but the C++ Bindings library provides more convenient
-ways to accomplish the same thing. [interface_request.h](https://cs.chromium.org/chromium/src/mojo/public/cpp/bindings/interface_request.h)
-defines a `MakeRequest` function:
-
-``` cpp
-sample::mojom::LoggerPtr logger;
-sample::mojom::LoggerRequest request = mojo::MakeRequest(&logger);
-```
-
-and the `InterfaceRequest<T>` constructor can also take an explicit
-`InterfacePtr<T>*` output argument:
-
-``` cpp
-sample::mojom::LoggerPtr logger;
-sample::mojom::LoggerRequest request(&logger);
-```
-
-Both of these last two snippets are equivalent to the first one.
-
-*** note
-**NOTE:** In the first example above you may notice usage of the `LoggerPtrInfo`
-type, which is a generated alias for `mojo::InterfacePtrInfo<Logger>`. This is
-similar to an `InterfaceRequest<T>` in that it merely holds onto a pipe handle
-and cannot actually read or write messages on the pipe. Both this type and
-`InterfaceRequest<T>` are safe to move freely from thread to thread, whereas a
-bound `InterfacePtr<T>` is bound to a single thread.
-
-An `InterfacePtr<T>` may be unbound by calling its `PassInterface()` method,
-which returns a new `InterfacePtrInfo<T>`. Conversely, an `InterfacePtr<T>` may
-bind (and thus take ownership of) an `InterfacePtrInfo<T>` so that interface
-calls can be made on the pipe.
-
-The thread-bound nature of `InterfacePtr<T>` is necessary to support safe
-dispatch of its [message responses](#Receiving-Responses) and
-[connection error notifications](#Connection-Errors).
-***
-
-Once the `LoggerPtr` is bound we can immediately begin calling `Logger`
-interface methods on it, which will immediately write messages into the pipe.
-These messages will stay queued on the receiving end of the pipe until someone
-binds to it and starts reading them.
-
-``` cpp
-logger->Log("Hello!");
-```
-
-This actually writes a `Log` message to the pipe.
-
-![Diagram illustrating a message traveling on a pipe from LoggerPtr to LoggerRequest](https://docs.google.com/a/google.com/drawings/d/1jWEc6jJIP2ed77Gg4JJ3EVC7hvnwcImNqQJywFwpT8g/pub?w=648&h=123)
-
-But as mentioned above, `InterfaceRequest` *doesn't actually do anything*, so
-that message will just sit on the pipe forever. We need a way to read messages
-off the other end of the pipe and dispatch them. We have to
-**bind the interface request**.
-
-### Binding an Interface Request
-
-There are many different helper classes in the bindings library for binding the
-receiving end of a message pipe. The most primitive among them is the aptly
-named `mojo::Binding<T>`. A `mojo::Binding<T>` bridges an implementation of `T`
-with a single bound message pipe endpoint (via a `mojo::InterfaceRequest<T>`),
-which it continuously watches for readability.
-
-Any time the bound pipe becomes readable, the `Binding` will schedule a task to
-read, deserialize (using generated code), and dispatch all available messages to
-the bound `T` implementation. Below is a sample implementation of the `Logger`
-interface. Notice that the implementation itself owns a `mojo::Binding`. This is
-a common pattern, since a bound implementation must outlive any `mojo::Binding`
-which binds it.
-
-``` cpp
-#include "base/logging.h"
-#include "base/macros.h"
-#include "sample/logger.mojom.h"
-
-class LoggerImpl : public sample::mojom::Logger {
- public:
-  // NOTE: A common pattern for interface implementations which have one
-  // instance per client is to take an InterfaceRequest in the constructor.
-
-  explicit LoggerImpl(sample::mojom::LoggerRequest request)
-      : binding_(this, std::move(request)) {}
-  ~Logger() override {}
-
-  // sample::mojom::Logger:
-  void Log(const std::string& message) override {
-    LOG(ERROR) << "[Logger] " << message;
-  }
-
- private:
-  mojo::Binding<sample::mojom::Logger> binding_;
-
-  DISALLOW_COPY_AND_ASSIGN(LoggerImpl);
-};
-```
-
-Now we can construct a `LoggerImpl` over our pending `LoggerRequest`, and the
-previously queued `Log` message will be dispatched ASAP on the `LoggerImpl`'s
-thread:
-
-``` cpp
-LoggerImpl impl(std::move(request));
-```
-
-The diagram below illustrates the following sequence of events, all set in
-motion by the above line of code:
-
-1. The `LoggerImpl` constructor is called, passing the `LoggerRequest` along
-   to the `Binding`.
-2. The `Binding` takes ownership of the `LoggerRequest`'s pipe endpoint and
-   begins watching it for readability. The pipe is readable immediately, so a
-   task is scheduled to read the pending `Log` message from the pipe ASAP.
-3. The `Log` message is read and deserialized, causing the `Binding` to invoke
-   the `Logger::Log` implementation on its bound `LoggerImpl`.
-
-![Diagram illustrating the progression of binding a request, reading a pending message, and dispatching it](https://docs.google.com/drawings/d/1c73-PegT4lmjfHoxhWrHTQXRvzxgb0wdeBa35WBwZ3Q/pub?w=550&h=500)
-
-As a result, our implementation will eventually log the client's `"Hello!"`
-message via `LOG(ERROR)`.
-
-*** note
-**NOTE:** Messages will only be read and dispatched from a pipe as long as the
-object which binds it (*i.e.* the `mojo::Binding` in the above example) remains
-alive.
-***
-
-### Receiving Responses
-
-Some Mojom interface methods expect a response. Suppose we modify our `Logger`
-interface so that the last logged line can be queried like so:
-
-``` cpp
-module sample.mojom;
-
-interface Logger {
-  Log(string message);
-  GetTail() => (string message);
-};
-```
-
-The generated C++ interface will now look like:
-
-``` cpp
-namespace sample {
-namespace mojom {
-
-class Logger {
- public:
-  virtual ~Logger() {}
-
-  virtual void Log(const std::string& message) = 0;
-
-  using GetTailCallback = base::Callback<void(const std::string& message)>;
-
-  virtual void GetTail(const GetTailCallback& callback) = 0;
-}
-
-}  // namespace mojom
-}  // namespace sample
-```
-
-As before, both clients and implementations of this interface use the same
-signature for the `GetTail` method: implementations use the `callback` argument
-to *respond* to the request, while clients pass a `callback` argument to
-asynchronously `receive` the response. Here's an updated implementation:
-
-```cpp
-class LoggerImpl : public sample::mojom::Logger {
- public:
-  // NOTE: A common pattern for interface implementations which have one
-  // instance per client is to take an InterfaceRequest in the constructor.
-
-  explicit LoggerImpl(sample::mojom::LoggerRequest request)
-      : binding_(this, std::move(request)) {}
-  ~Logger() override {}
-
-  // sample::mojom::Logger:
-  void Log(const std::string& message) override {
-    LOG(ERROR) << "[Logger] " << message;
-    lines_.push_back(message);
-  }
-
-  void GetTail(const GetTailCallback& callback) override {
-    callback.Run(lines_.back());
-  }
-
- private:
-  mojo::Binding<sample::mojom::Logger> binding_;
-  std::vector<std::string> lines_;
-
-  DISALLOW_COPY_AND_ASSIGN(LoggerImpl);
-};
-```
-
-And an updated client call:
-
-``` cpp
-void OnGetTail(const std::string& message) {
-  LOG(ERROR) << "Tail was: " << message;
-}
-
-logger->GetTail(base::Bind(&OnGetTail));
-```
-
-Behind the scenes, the implementation-side callback is actually serializing the
-response arguments and writing them onto the pipe for delivery back to the
-client. Meanwhile the client-side callback is invoked by some internal logic
-which watches the pipe for an incoming response message, reads and deserializes
-it once it arrives, and then invokes the callback with the deserialized
-parameters.
-
-### Connection Errors
-
-If there are no remaining messages available on a pipe and the remote end has
-been closed, a connection error will be triggered on the local end. Connection
-errors may also be triggered by automatic forced local pipe closure due to
-*e.g.* a validation error when processing a received message.
-
-Regardless of the underlying cause, when a connection error is encountered on
-a binding endpoint, that endpoint's **connection error handler** (if set) is
-invoked. This handler is a simple `base::Closure` and may only be invoked
-*once* as long as the endpoint is bound to the same pipe. Typically clients and
-implementations use this handler to do some kind of cleanup or -- particuarly if
-the error was unexpected -- create a new pipe and attempt to establish a new
-connection with it.
-
-All message pipe-binding C++ objects (*e.g.*, `mojo::Binding<T>`,
-`mojo::InterfacePtr<T>`, *etc.*) support setting their connection error handler
-via a `set_connection_error_handler` method.
-
-We can set up another end-to-end `Logger` example to demonstrate error handler
-invocation:
-
-``` cpp
-sample::mojom::LoggerPtr logger;
-LoggerImpl impl(mojo::MakeRequest(&logger));
-impl.set_connection_error_handler(base::Bind([] { LOG(ERROR) << "Bye."; }));
-logger->Log("OK cool");
-logger.reset();  // Closes the client end.
-```
-
-As long as `impl` stays alive here, it will eventually receive the `Log` message
-followed immediately by an invocation of the bound callback which outputs
-`"Bye."`. Like all other bindings callbacks, a connection error handler will
-**never** be invoked once its corresponding binding object has been destroyed.
-
-In fact, suppose instead that `LoggerImpl` had set up the following error
-handler within its constructor:
-
-``` cpp
-LoggerImpl::LoggerImpl(sample::mojom::LoggerRequest request)
-    : binding_(this, std::move(request)) {
-  binding_.set_connection_error_handler(
-      base::Bind(&LoggerImpl::OnError, base::Unretained(this)));
-}
-
-void LoggerImpl::OnError() {
-  LOG(ERROR) << "Client disconnected! Purging log lines.";
-  lines_.clear();
-}
-```
-
-The use of `base::Unretained` is *safe* because the error handler will never be
-invoked beyond the lifetime of `binding_`, and `this` owns `binding_`.
-
-### A Note About Ordering
-
-As mentioned in the previous section, closing one end of a pipe will eventually
-trigger a connection error on the other end. However it's important to note that
-this event is itself ordered with respect to any other event (*e.g.* writing a
-message) on the pipe.
-
-This means that it's safe to write something contrived like:
-
-``` cpp
-void GoBindALogger(sample::mojom::LoggerRequest request) {
-  LoggerImpl impl(std::move(request));
-  base::RunLoop loop;
-  impl.set_connection_error_handler(loop.QuitClosure());
-  loop.Run();
-}
-
-void LogSomething() {
-  sample::mojom::LoggerPtr logger;
-  bg_thread->task_runner()->PostTask(
-      FROM_HERE, base::BindOnce(&GoBindALogger, mojo::MakeRequest(&logger)));
-  logger->Log("OK Computer");
-}
-```
-
-When `logger` goes out of scope it immediately closes its end of the message
-pipe, but the impl-side won't notice this until it receives the sent `Log`
-message. Thus the `impl` above will first log our message and *then* see a
-connection error and break out of the run loop.
-
-### Sending Interfaces Over Interfaces
-
-Now we know how to create interface pipes and use their Ptr and Request
-endpoints in some interesting ways. This still doesn't add up to interesting
-IPC! The bread and butter of Mojo IPC is the ability to transfer interface
-endpoints across other interfaces, so let's take a look at how to accomplish
-that.
-
-#### Sending Interface Requests
-
-Consider a new example Mojom in `//sample/db.mojom`:
-
-``` cpp
-module db.mojom;
-
-interface Table {
-  void AddRow(int32 key, string data);
-};
-
-interface Database {
-  AddTable(Table& table);
-};
-```
-
-As noted in the
-[Mojom IDL documentation](/mojo/public/tools/bindings#Primitive-Types),
-the `Table&` syntax denotes a `Table` interface request. This corresponds
-precisely to the `InterfaceRequest<T>` type discussed in the sections above, and
-in fact the generated code for these interfaces is approximately:
-
-``` cpp
-namespace db {
-namespace mojom {
-
-class Table {
- public:
-  virtual ~Table() {}
-
-  virtual void AddRow(int32_t key, const std::string& data) = 0;
-}
-
-using TablePtr = mojo::InterfacePtr<Table>;
-using TableRequest = mojo::InterfaceRequest<Table>;
-
-class Database {
- public:
-  virtual ~Database() {}
-
-  virtual void AddTable(TableRequest table);
-};
-
-using DatabasePtr = mojo::InterfacePtr<Database>;
-using DatabaseRequest = mojo::InterfaceRequest<Database>;
-
-}  // namespace mojom
-}  // namespace db
-```
-
-We can put this all together now with an implementation of `Table` and
-`Database`:
-
-``` cpp
-#include "sample/db.mojom.h"
-
-class TableImpl : public db::mojom:Table {
- public:
-  explicit TableImpl(db::mojom::TableRequest request)
-      : binding_(this, std::move(request)) {}
-  ~TableImpl() override {}
-
-  // db::mojom::Table:
-  void AddRow(int32_t key, const std::string& data) override {
-    rows_.insert({key, data});
-  }
-
- private:
-  mojo::Binding<db::mojom::Table> binding_;
-  std::map<int32_t, std::string> rows_;
-};
-
-class DatabaseImpl : public db::mojom::Database {
- public:
-  explicit DatabaseImpl(db::mojom::DatabaseRequest request)
-      : binding_(this, std::move(request)) {}
-  ~DatabaseImpl() override {}
-
-  // db::mojom::Database:
-  void AddTable(db::mojom::TableRequest table) {
-    tables_.emplace_back(base::MakeUnique<TableImpl>(std::move(table)));
-  }
-
- private:
-  mojo::Binding<db::mojom::Database> binding_;
-  std::vector<std::unique_ptr<TableImpl>> tables_;
-};
-```
-
-Pretty straightforward. The `Table&` Mojom paramter to `AddTable` translates to
-a C++ `db::mojom::TableRequest`, aliased from
-`mojo::InterfaceRequest<db::mojom::Table>`, which we know is just a
-strongly-typed message pipe handle. When `DatabaseImpl` gets an `AddTable` call,
-it constructs a new `TableImpl` and binds it to the received `TableRequest`.
-
-Let's see how this can be used.
-
-``` cpp
-db::mojom::DatabasePtr database;
-DatabaseImpl db_impl(mojo::MakeRequest(&database));
-
-db::mojom::TablePtr table1, table2;
-database->AddTable(mojo::MakeRequest(&table1));
-database->AddTable(mojo::MakeRequest(&table2));
-
-table1->AddRow(1, "hiiiiiiii");
-table2->AddRow(2, "heyyyyyy");
-```
-
-Notice that we can again start using the new `Table` pipes immediately, even
-while their `TableRequest` endpoints are still in transit.
-
-#### Sending InterfacePtrs
-
-Of course we can also send `InterfacePtr`s:
-
-``` cpp
-interface TableListener {
-  OnRowAdded(int32 key, string data);
-};
-
-interface Table {
-  AddRow(int32 key, string data);
-
-  AddListener(TableListener listener);
-};
-```
-
-This would generate a `Table::AddListener` signature like so:
-
-``` cpp
-  virtual void AddListener(TableListenerPtr listener) = 0;
-```
-
-and this could be used like so:
-
-``` cpp
-db::mojom::TableListenerPtr listener;
-TableListenerImpl impl(mojo::MakeRequest(&listener));
-table->AddListener(std::move(listener));
-```
-
-## Other Interface Binding Types
-
-The [Interfaces](#Interfaces) section above covers basic usage of the most
-common bindings object types: `InterfacePtr`, `InterfaceRequest`, and `Binding`.
-While these types are probably the most commonly used in practice, there are
-several other ways of binding both client- and implementation-side interface
-pipes.
-
-### Strong Bindings
-
-A **strong binding** exists as a standalone object which owns its interface
-implementation and automatically cleans itself up when its bound interface
-endpoint detects an error. The
-[**`MakeStrongBinding`**](https://cs.chromim.org/chromium/src//mojo/public/cpp/bindings/strong_binding.h)
-function is used to create such a binding.
-.
-
-``` cpp
-class LoggerImpl : public sample::mojom::Logger {
- public:
-  LoggerImpl() {}
-  ~LoggerImpl() override {}
-
-  // sample::mojom::Logger:
-  void Log(const std::string& message) override {
-    LOG(ERROR) << "[Logger] " << message;
-  }
-
- private:
-  // NOTE: This doesn't own any Binding object!
-};
-
-db::mojom::LoggerPtr logger;
-mojo::MakeStrongBinding(base::MakeUnique<DatabaseImpl>(),
-                        mojo::MakeRequest(&logger));
-
-logger->Log("NOM NOM NOM MESSAGES");
-```
-
-Now as long as `logger` remains open somewhere in the system, the bound
-`DatabaseImpl` on the other end will remain alive.
-
-### Binding Sets
-
-Sometimes it's useful to share a single implementation instance with multiple
-clients. [**`BindingSet`**](https://cs.chromium.org/chromium/src/mojo/public/cpp/bindings/binding_set.h)
-makes this easy. Consider the Mojom:
-
-``` cpp
-module system.mojom;
-
-interface Logger {
-  Log(string message);
-};
-
-interface LoggerProvider {
-  GetLogger(Logger& logger);
-};
-```
-
-We can use `BindingSet` to bind multiple `Logger` requests to a single
-implementation instance:
-
-``` cpp
-class LogManager : public system::mojom::LoggerProvider,
-                   public system::mojom::Logger {
- public:
-  explicit LogManager(system::mojom::LoggerProviderRequest request)
-      : provider_binding_(this, std::move(request)) {}
-  ~LogManager() {}
-
-  // system::mojom::LoggerProvider:
-  void GetLogger(LoggerRequest request) override {
-    logger_bindings_.AddBinding(this, std::move(request));
-  }
-
-  // system::mojom::Logger:
-  void Log(const std::string& message) override {
-    LOG(ERROR) << "[Logger] " << message;
-  }
-
- private:
-  mojo::Binding<system::mojom::LoggerProvider> provider_binding_;
-  mojo::BindingSet<system::mojom::Logger> logger_bindings_;
-};
-
-```
-
-
-### InterfacePtr Sets
-
-Similar to the `BindingSet` above, sometimes it's useful to maintain a set of
-`InterfacePtr`s for *e.g.* a set of clients observing some event.
-[**`InterfacePtrSet`**](https://cs.chromium.org/chromium/src/mojo/public/cpp/bindings/interface_ptr_set.h)
-is here to help. Take the Mojom:
-
-``` cpp
-module db.mojom;
-
-interface TableListener {
-  OnRowAdded(int32 key, string data);
-};
-
-interface Table {
-  AddRow(int32 key, string data);
-  AddListener(TableListener listener);
-};
-```
-
-An implementation of `Table` might look something like like this:
-
-``` cpp
-class TableImpl : public db::mojom::Table {
- public:
-  TableImpl() {}
-  ~TableImpl() override {}
-
-  // db::mojom::Table:
-  void AddRow(int32_t key, const std::string& data) override {
-    rows_.insert({key, data});
-    listeners_.ForEach([key, &data](db::mojom::TableListener* listener) {
-      listener->OnRowAdded(key, data);
-    });
-  }
-
-  void AddListener(db::mojom::TableListenerPtr listener) {
-    listeners_.AddPtr(std::move(listener));
-  }
-
- private:
-  mojo::InterfacePtrSet<db::mojom::Table> listeners_;
-  std::map<int32_t, std::string> rows_;
-};
-```
-
-## Associated Interfaces
-
-See [this document](https://www.chromium.org/developers/design-documents/mojo/associated-interfaces).
-
-TODO: Move the above doc into the repository markdown docs.
-
-## Synchronous Calls
-
-See [this document](https://www.chromium.org/developers/design-documents/mojo/synchronous-calls)
-
-TODO: Move the above doc into the repository markdown docs.
-
-## Type Mapping
-
-In many instances you might prefer that your generated C++ bindings use a more
-natural type to represent certain Mojom types in your interface methods. For one
-example consider a Mojom struct such as the `Rect` below:
-
-``` cpp
-module gfx.mojom;
-
-struct Rect {
-  int32 x;
-  int32 y;
-  int32 width;
-  int32 height;
-};
-
-interface Canvas {
-  void FillRect(Rect rect);
-};
-```
-
-The `Canvas` Mojom interface would normally generate a C++ interface like:
-
-``` cpp
-class Canvas {
- public:
-  virtual void FillRect(RectPtr rect) = 0;
-};
-```
-
-However, the Chromium tree already defines a native
-[`gfx::Rect`](https://cs.chromium.org/chromium/src/ui/gfx/geometry/rect.h) which
-is equivalent in meaning but which also has useful helper methods. Instead of
-manually converting between a `gfx::Rect` and the Mojom-generated `RectPtr` at
-every message boundary, wouldn't it be nice if the Mojom bindings generator
-could instead generate:
-
-``` cpp
-class Canvas {
- public:
-  virtual void FillRect(const gfx::Rect& rect) = 0;
-}
-```
-
-The correct answer is, "Yes! That would be nice!" And fortunately, it can!
-
-### Global Configuration
-
-While this feature is quite powerful, it introduces some unavoidable complexity
-into build system. This stems from the fact that type-mapping is an inherently
-viral concept: if `gfx::mojom::Rect` is mapped to `gfx::Rect` anywhere, the
-mapping needs to apply *everywhere*.
-
-For this reason we have a few global typemap configurations defined in
-[chromium_bindings_configuration.gni](https://cs.chromium.com/chromium/src/mojo/public/tools/bindings/chromium_bindings_configuration.gni)
-and
-[blink_bindings_configuration.gni](https://cs.chromium.com/chromium/src/mojo/public/tools/bindings/blink_bindings_configuration.gni). These configure the two supported [variants](#Variants) of Mojom generated
-bindings in the repository. Read more on this in the sections that follow.
-
-For now, let's take a look at how to express the mapping from `gfx::mojom::Rect`
-to `gfx::Rect`.
-
-### Defining `StructTraits`
-
-In order to teach generated bindings code how to serialize an arbitrary native
-type `T` as an arbitrary Mojom type `mojom::U`, we need to define an appropriate
-specialization of the
-[`mojo::StructTraits`](https://cs.chromium.org/chromium/src/mojo/public/cpp/bindings/struct_traits.h)
-template.
-
-A valid specialization of `StructTraits` MUST define the following static
-methods:
-
-* A single static accessor for every field of the Mojom struct, with the exact
-  same name as the struct field. These accessors must all take a const ref to
-  an object of the native type, and must return a value compatible with the
-  Mojom struct field's type. This is used to safely and consistently extract
-  data from the native type during message serialization without incurring extra
-  copying costs.
-
-* A single static `Read` method which initializes an instance of the the native
-  type given a serialized representation of the Mojom struct. The `Read` method
-  must return a `bool` to indicate whether the incoming data is accepted
-  (`true`) or rejected (`false`).
-
-There are other methods a `StructTraits` specialization may define to satisfy
-some less common requirements. See
-[Advanced StructTraits Usage](#Advanced-StructTraits-Usage) for details.
-
-In order to define the mapping for `gfx::Rect`, we want the following
-`StructTraits` specialization, which we'll define in
-`//ui/gfx/geometry/mojo/geometry_struct_traits.h`:
-
-``` cpp
-#include "mojo/public/cpp/bindings/struct_traits.h"
-#include "ui/gfx/geometry/rect.h"
-#include "ui/gfx/geometry/mojo/geometry.mojom.h"
-
-namespace mojo {
-
-template <>
-class StructTraits<gfx::mojom::RectDataView, gfx::Rect> {
- public:
-  static int32_t x(const gfx::Rect& r) { return r.x(); }
-  static int32_t y(const gfx::Rect& r) { return r.y(); }
-  static int32_t width(const gfx::Rect& r) { return r.width(); }
-  static int32_t height(const gfx::Rect& r) { return r.height(); }
-
-  static bool Read(gfx::mojom::RectDataView data, gfx::Rect* out_rect);
-};
-
-}  // namespace mojo
-```
-
-And in `//ui/gfx/geometry/mojo/geometry_struct_traits.cc`:
-
-``` cpp
-#include "ui/gfx/geometry/mojo/geometry_struct_traits.h"
-
-namespace mojo {
-
-// static
-template <>
-bool StructTraits<gfx::mojom::RectDataView, gfx::Rect>::Read(
-    gfx::mojom::RectDataView data,
-  gfx::Rect* out_rect) {
-  if (data.width() < 0 || data.height() < 0)
-    return false;
-
-  out_rect->SetRect(data.x(), data.y(), data.width(), data.height());
-  return true;
-};
-
-}  // namespace mojo
-```
-
-Note that the `Read()` method returns `false` if either the incoming `width` or
-`height` fields are negative. This acts as a validation step during
-deserialization: if a client sends a `gfx::Rect` with a negative width or
-height, its message will be rejected and the pipe will be closed. In this way,
-type mapping can serve to enable custom validation logic in addition to making
-callsites and interface implemention more convenient.
-
-### Enabling a New Type Mapping
-
-We've defined the `StructTraits` necessary, but we still need to teach the
-bindings generator (and hence the build system) about the mapping. To do this we
-must create a **typemap** file, which uses familiar GN syntax to describe the
-new type mapping.
-
-Let's place this `geometry.typemap` file alongside our Mojom file:
-
-```
-mojom = "//ui/gfx/geometry/mojo/geometry.mojom"
-public_headers = [ "//ui/gfx/geometry/rect.h" ]
-traits_headers = [ "//ui/gfx/geometry/mojo/geometry_struct_traits.h" ]
-sources = [ "//ui/gfx/geometry/mojo/geometry_struct_traits.cc" ]
-public_deps = [ "//ui/gfx/geometry" ]
-type_mappings = [
-  "gfx.mojom.Rect=gfx::Rect",
-]
-```
-
-Let's look at each of the variables above:
-
-* `mojom`: Specifies the `mojom` file to which the typemap applies. Many
-  typemaps may apply to the same `mojom` file, but any given typemap may only
-  apply to a single `mojom` file.
-* `public_headers`: Additional headers required by any code which would depend
-  on the Mojom definition of `gfx.mojom.Rect` now that the typemap is applied.
-  Any headers required for the native target type definition should be listed
-  here.
-* `traits_headers`: Headers which contain the relevant `StructTraits`
-  specialization(s) for any type mappings described by this file.
-* `sources`: Any private implementation sources needed for the `StructTraits`
-  definition.
-* `public_deps`: Target dependencies exposed by the `public_headers` and
-  `traits_headers`.
-* `deps`: Target dependencies exposed by `sources` but not already covered by
-  `public_deps`.
-* `type_mappings`: A list of type mappings to be applied for this typemap. The
-  strings in this list are of the format `"MojomType=CppType"`, where
-  `MojomType` must be a fully qualified Mojom typename and `CppType` must be a
-  fully qualified C++ typename. Additional attributes may be specified in square
-  brackets following the `CppType`:
-    * `move_only`: The `CppType` is move-only and should be passed by value
-      in any generated method signatures. Note that `move_only` is transitive,
-      so containers of `MojomType` will translate to containers of `CppType`
-      also passed by value.
-    * `copyable_pass_by_value`: Forces values of type `CppType` to be passed by
-      value without moving them. Unlike `move_only`, this is not transitive.
-    * `nullable_is_same_type`: By default a non-nullable `MojomType` will be
-      mapped to `CppType` while a nullable `MojomType?` will be mapped to
-      `base::Optional<CppType>`. If this attribute is set, the `base::Optional`
-      wrapper is omitted for nullable `MojomType?` values, but the
-      `StructTraits` definition for this type mapping must define additional
-      `IsNull` and `SetToNull` methods. See
-      [Specializing Nullability](#Specializing-Nullability) below.
-
-
-Now that we have the typemap file we need to add it to a local list of typemaps
-that can be added to the global configuration. We create a new
-`//ui/gfx/typemaps.gni` file with the following contents:
-
-```
-typemaps = [
-  "//ui/gfx/geometry/mojo/geometry.typemap",
-]
-```
-
-And finally we can reference this file in the global default (Chromium) bindings
-configuration by adding it to `_typemap_imports` in
-[chromium_bindings_configuration.gni](https://cs.chromium.com/chromium/src/mojo/public/tools/bindings/chromium_bindings_configuration.gni):
-
-```
-_typemap_imports = [
-  ...,
-  "//ui/gfx/typemaps.gni",
-  ...,
-]
-```
-
-### StructTraits Reference
-
-Each of a `StructTraits` specialization's static getter methods -- one per
-struct field -- must return a type which can be used as a data source for the
-field during serialization. This is a quick reference mapping Mojom field type
-to valid getter return types:
-
-| Mojom Field Type             | C++ Getter Return Type |
-|------------------------------|------------------------|
-| `bool`                       | `bool`
-| `int8`                       | `int8_t`
-| `uint8`                      | `uint8_t`
-| `int16`                      | `int16_t`
-| `uint16`                     | `uint16_t`
-| `int32`                      | `int32_t`
-| `uint32`                     | `uint32_t`
-| `int64`                      | `int64_t`
-| `uint64`                     | `uint64_t`
-| `float`                      | `float`
-| `double`                     | `double`
-| `handle`                     | `mojo::ScopedHandle`
-| `handle<message_pipe>`       | `mojo::ScopedMessagePipeHandle`
-| `handle<data_pipe_consumer>` | `mojo::ScopedDataPipeConsumerHandle`
-| `handle<data_pipe_producer>` | `mojo::ScopedDataPipeProducerHandle`
-| `handle<shared_buffer>`      | `mojo::ScopedSharedBufferHandle`
-| `FooInterface`               | `FooInterfacePtr`
-| `FooInterface&`              | `FooInterfaceRequest`
-| `associated FooInterface`    | `FooAssociatedInterfacePtr`
-| `associated FooInterface&`   | `FooAssociatedInterfaceRequest`
-| `string`                     | Value or reference to any type `T` that has a `mojo::StringTraits` specialization defined. By default this includes `std::string`, `base::StringPiece`, and `WTF::String` (Blink).
-| `array<T>`                   | Value or reference to any type `T` that has a `mojo::ArrayTraits` specialization defined. By default this includes `std::vector<T>`, `mojo::CArray<T>`, and `WTF::Vector<T>` (Blink).
-| `map<K, V>`                  | Value or reference to any type `T` that has a `mojo::MapTraits` specialization defined. By default this includes `std::map<T>`, `mojo::unordered_map<T>`, and `WTF::HashMap<T>` (Blink).
-| `FooEnum`                    | Value of any type that has an appropriate `EnumTraits` specialization defined. By default this inlcudes only the generated `FooEnum` type.
-| `FooStruct`                  | Value or reference to any type that has an appropriate `StructTraits` specialization defined. By default this includes only the generated `FooStructPtr` type.
-| `FooUnion`                   | Value of reference to any type that has an appropriate `UnionTraits` specialization defined. By default this includes only the generated `FooUnionPtr` type.
-
-### Using Generated DataView Types
-
-Static `Read` methods on `StructTraits` specializations get a generated
-`FooDataView` argument (such as the `RectDataView` in the example above) which
-exposes a direct view of the serialized Mojom structure within an incoming
-message's contents. In order to make this as easy to work with as possible, the
-generated `FooDataView` types have a generated method corresponding to every
-struct field:
-
-* For POD field types (*e.g.* bools, floats, integers) these are simple accessor
-  methods with names identical to the field name. Hence in the `Rect` example we
-  can access things like `data.x()` and `data.width()`. The return types
-  correspond exactly to the mappings listed in the table above, under
-  [StructTraits Reference](#StructTraits-Reference).
-
-* For handle and interface types (*e.g* `handle` or `FooInterface&`) these
-  are named `TakeFieldName` (for a field named `field_name`) and they return an
-  appropriate move-only handle type by value. The return types correspond
-  exactly to the mappings listed in the table above, under
-  [StructTraits Reference](#StructTraits-Reference).
-
-* For all other field types (*e.g.*, enums, strings, arrays, maps, structs)
-  these are named `ReadFieldName` (for a field named `field_name`) and they
-  return a `bool` (to indicate success or failure in reading). On success they
-  fill their output argument with the deserialized field value. The output
-  argument may be a pointer to any type with an appropriate `StructTraits`
-  specialization defined, as mentioned in the table above, under
-  [StructTraits Reference](#StructTraits-Reference).
-
-An example would be useful here. Suppose we introduced a new Mojom struct:
-
-``` cpp
-struct RectPair {
-  Rect left;
-  Rect right;
-};
-```
-
-and a corresponding C++ type:
-
-``` cpp
-class RectPair {
- public:
-  RectPair() {}
-
-  const gfx::Rect& left() const { return left_; }
-  const gfx::Rect& right() const { return right_; }
-
-  void Set(const gfx::Rect& left, const gfx::Rect& right) {
-    left_ = left;
-    right_ = right;
-  }
-
-  // ... some other stuff
-
- private:
-  gfx::Rect left_;
-  gfx::Rect right_;
-};
-```
-
-Our traits to map `gfx::mojom::RectPair` to `gfx::RectPair` might look like
-this:
-
-``` cpp
-namespace mojo {
-
-template <>
-class StructTraits
- public:
-  static const gfx::Rect& left(const gfx::RectPair& pair) {
-    return pair.left();
-  }
-
-  static const gfx::Rect& right(const gfx::RectPair& pair) {
-    return pair.right();
-  }
-
-  static bool Read(gfx::mojom::RectPairDataView data, gfx::RectPair* out_pair) {
-    gfx::Rect left, right;
-    if (!data.ReadLeft(&left) || !data.ReadRight(&right))
-      return false;
-    out_pair->Set(left, right);
-    return true;
-  }
-}  // namespace mojo
-```
-
-Generated `ReadFoo` methods always convert `multi_word_field_name` fields to
-`ReadMultiWordFieldName` methods.
-
-### Variants
-
-By now you may have noticed that additional C++ sources are generated when a
-Mojom is processed. These exist due to type mapping, and the source files we
-refer to throughout this docuemnt (namely `foo.mojom.cc` and `foo.mojom.h`) are
-really only one **variant** (the *default* or *chromium* variant) of the C++
-bindings for a given Mojom file.
-
-The only other variant currently defined in the tree is the *blink* variant,
-which produces a few additional files:
-
-```
-out/gen/sample/db.mojom-blink.cc
-out/gen/sample/db.mojom-blink.h
-```
-
-These files mirror the definitions in the default variant but with different
-C++ types in place of certain builtin field and parameter types. For example,
-Mojom strings are represented by `WTF::String` instead of `std::string`. To
-avoid symbol collisions, the variant's symbols are nested in an extra inner
-namespace, so Blink consumer of the interface might write something like:
-
-```
-#include "sample/db.mojom-blink.h"
-
-class TableImpl : public db::mojom::blink::Table {
- public:
-  void AddRow(int32_t key, const WTF::String& data) override {
-    // ...
-  }
-};
-```
-
-In addition to using different C++ types for builtin strings, arrays, and maps,
-the global typemap configuration for default and "blink" variants are completely
-separate. To add a typemap for the Blink configuration, you can modify
-[blink_bindings_configuration.gni](https://cs.chromium.org/chromium/src/mojo/public/tools/bindings/blink_bindings_configuration.gni).
-
-All variants share some definitions which are unaffected by differences in the
-type mapping configuration (enums, for example). These definitions are generated
-in *shared* sources:
-
-```
-out/gen/sample/db.mojom-shared.cc
-out/gen/sample/db.mojom-shared.h
-out/gen/sample/db.mojom-shared-internal.h
-```
-
-Including either variant's header (`db.mojom.h` or `db.mojom-blink.h`)
-implicitly includes the shared header, but you have on some occasions wish to
-include *only* the shared header in some instances.
-
-Finally, note that for `mojom` GN targets, there is implicitly a corresponding
-`mojom_{variant}` target defined for any supported bindings configuration. So
-for example if you've defined in `//sample/BUILD.gn`:
-
-```
-import("mojo/public/tools/bindings/mojom.gni")
-
-mojom("interfaces") {
-  sources = [
-    "db.mojom",
-  ]
-}
-```
-
-Code in Blink which wishes to use the generated Blink-variant definitions must
-depend on `"//sample:interfaces_blink"`.
-
-## Versioning Considerations
-
-For general documentation of versioning in the Mojom IDL see
-[Versioning](/mojo/public/tools/bindings#Versioning).
-
-This section briefly discusses some C++-specific considerations relevant to
-versioned Mojom types.
-
-### Querying Interface Versions
-
-`InterfacePtr` defines the following methods to query or assert remote interface
-version:
-
-```cpp
-void QueryVersion(const base::Callback<void(uint32_t)>& callback);
-```
-
-This queries the remote endpoint for the version number of its binding. When a
-response is received `callback` is invoked with the remote version number. Note
-that this value is cached by the `InterfacePtr` instance to avoid redundant
-queries.
-
-```cpp
-void RequireVersion(uint32_t version);
-```
-
-Informs the remote endpoint that a minimum version of `version` is required by
-the client. If the remote endpoint cannot support that version, it will close
-its end of the pipe immediately, preventing any other requests from being
-received.
-
-### Versioned Enums
-
-For convenience, every extensible enum has a generated helper function to
-determine whether a received enum value is known by the implementation's current
-version of the enum definition. For example:
-
-```cpp
-[Extensible]
-enum Department {
-  SALES,
-  DEV,
-  RESEARCH,
-};
-```
-
-generates the function in the same namespace as the generated C++ enum type:
-
-```cpp
-inline bool IsKnownEnumValue(Department value);
-```
-
-### Additional Documentation
-
-[Calling Mojo From Blink](https://www.chromium.org/developers/design-documents/mojo/calling-mojo-from-blink)
-:    A brief overview of what it looks like to use Mojom C++ bindings from
-     within Blink code.
diff --git a/mojo/public/cpp/bindings/array_data_view.h b/mojo/public/cpp/bindings/array_data_view.h
deleted file mode 100644
index d02a884..0000000
--- a/mojo/public/cpp/bindings/array_data_view.h
+++ /dev/null
@@ -1,244 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_ARRAY_DATA_VIEW_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_ARRAY_DATA_VIEW_H_
-
-#include <type_traits>
-
-#include "mojo/public/cpp/bindings/lib/array_internal.h"
-#include "mojo/public/cpp/bindings/lib/bindings_internal.h"
-#include "mojo/public/cpp/bindings/lib/serialization_context.h"
-#include "mojo/public/cpp/bindings/lib/serialization_forward.h"
-
-namespace mojo {
-namespace internal {
-
-template <typename T, typename EnableType = void>
-class ArrayDataViewImpl;
-
-template <typename T>
-class ArrayDataViewImpl<
-    T,
-    typename std::enable_if<
-        BelongsTo<T, MojomTypeCategory::POD>::value>::type> {
- public:
-  using Data_ = typename MojomTypeTraits<ArrayDataView<T>>::Data;
-
-  ArrayDataViewImpl(Data_* data, SerializationContext* context)
-      : data_(data), context_(context) {}
-
-  T operator[](size_t index) const { return data_->at(index); }
-
-  const T* data() const { return data_->storage(); }
-
- protected:
-  Data_* data_;
-  SerializationContext* context_;
-};
-
-template <typename T>
-class ArrayDataViewImpl<
-    T,
-    typename std::enable_if<
-        BelongsTo<T, MojomTypeCategory::BOOLEAN>::value>::type> {
- public:
-  using Data_ = typename MojomTypeTraits<ArrayDataView<T>>::Data;
-
-  ArrayDataViewImpl(Data_* data, SerializationContext* context)
-      : data_(data), context_(context) {}
-
-  bool operator[](size_t index) const { return data_->at(index); }
-
- protected:
-  Data_* data_;
-  SerializationContext* context_;
-};
-
-template <typename T>
-class ArrayDataViewImpl<
-    T,
-    typename std::enable_if<
-        BelongsTo<T, MojomTypeCategory::ENUM>::value>::type> {
- public:
-  static_assert(sizeof(T) == sizeof(int32_t), "Unexpected enum size");
-
-  using Data_ = typename MojomTypeTraits<ArrayDataView<T>>::Data;
-
-  ArrayDataViewImpl(Data_* data, SerializationContext* context)
-      : data_(data), context_(context) {}
-
-  T operator[](size_t index) const { return static_cast<T>(data_->at(index)); }
-
-  const T* data() const { return reinterpret_cast<const T*>(data_->storage()); }
-
-  template <typename U>
-  bool Read(size_t index, U* output) {
-    return Deserialize<T>(data_->at(index), output);
-  }
-
- protected:
-  Data_* data_;
-  SerializationContext* context_;
-};
-
-template <typename T>
-class ArrayDataViewImpl<
-    T,
-    typename std::enable_if<
-        BelongsTo<T,
-                  MojomTypeCategory::ASSOCIATED_INTERFACE |
-                      MojomTypeCategory::ASSOCIATED_INTERFACE_REQUEST |
-                      MojomTypeCategory::INTERFACE |
-                      MojomTypeCategory::INTERFACE_REQUEST>::value>::type> {
- public:
-  using Data_ = typename MojomTypeTraits<ArrayDataView<T>>::Data;
-
-  ArrayDataViewImpl(Data_* data, SerializationContext* context)
-      : data_(data), context_(context) {}
-
-  template <typename U>
-  U Take(size_t index) {
-    U result;
-    bool ret = Deserialize<T>(&data_->at(index), &result, context_);
-    DCHECK(ret);
-    return result;
-  }
-
- protected:
-  Data_* data_;
-  SerializationContext* context_;
-};
-
-template <typename T>
-class ArrayDataViewImpl<
-    T,
-    typename std::enable_if<
-        BelongsTo<T, MojomTypeCategory::HANDLE>::value>::type> {
- public:
-  using Data_ = typename MojomTypeTraits<ArrayDataView<T>>::Data;
-
-  ArrayDataViewImpl(Data_* data, SerializationContext* context)
-      : data_(data), context_(context) {}
-
-  T Take(size_t index) {
-    T result;
-    bool ret = Deserialize<T>(&data_->at(index), &result, context_);
-    DCHECK(ret);
-    return result;
-  }
-
- protected:
-  Data_* data_;
-  SerializationContext* context_;
-};
-
-template <typename T>
-class ArrayDataViewImpl<T,
-                        typename std::enable_if<BelongsTo<
-                            T,
-                            MojomTypeCategory::ARRAY | MojomTypeCategory::MAP |
-                                MojomTypeCategory::STRING |
-                                MojomTypeCategory::STRUCT>::value>::type> {
- public:
-  using Data_ = typename MojomTypeTraits<ArrayDataView<T>>::Data;
-
-  ArrayDataViewImpl(Data_* data, SerializationContext* context)
-      : data_(data), context_(context) {}
-
-  void GetDataView(size_t index, T* output) {
-    *output = T(data_->at(index).Get(), context_);
-  }
-
-  template <typename U>
-  bool Read(size_t index, U* output) {
-    return Deserialize<T>(data_->at(index).Get(), output, context_);
-  }
-
- protected:
-  Data_* data_;
-  SerializationContext* context_;
-};
-
-template <typename T>
-class ArrayDataViewImpl<
-    T,
-    typename std::enable_if<
-        BelongsTo<T, MojomTypeCategory::UNION>::value>::type> {
- public:
-  using Data_ = typename MojomTypeTraits<ArrayDataView<T>>::Data;
-
-  ArrayDataViewImpl(Data_* data, SerializationContext* context)
-      : data_(data), context_(context) {}
-
-  void GetDataView(size_t index, T* output) {
-    *output = T(&data_->at(index), context_);
-  }
-
-  template <typename U>
-  bool Read(size_t index, U* output) {
-    return Deserialize<T>(&data_->at(index), output, context_);
-  }
-
- protected:
-  Data_* data_;
-  SerializationContext* context_;
-};
-
-}  // namespace internal
-
-template <typename K, typename V>
-class MapDataView;
-
-template <typename T>
-class ArrayDataView : public internal::ArrayDataViewImpl<T> {
- public:
-  using Element = T;
-  using Data_ = typename internal::ArrayDataViewImpl<T>::Data_;
-
-  ArrayDataView() : internal::ArrayDataViewImpl<T>(nullptr, nullptr) {}
-
-  ArrayDataView(Data_* data, internal::SerializationContext* context)
-      : internal::ArrayDataViewImpl<T>(data, context) {}
-
-  bool is_null() const { return !this->data_; }
-
-  size_t size() const { return this->data_->size(); }
-
-  // Methods to access elements are different for different element types. They
-  // are inherited from internal::ArrayDataViewImpl:
-
-  // POD types except boolean and enums:
-  //   T operator[](size_t index) const;
-  //   const T* data() const;
-
-  // Boolean:
-  //   bool operator[](size_t index) const;
-
-  // Enums:
-  //   T operator[](size_t index) const;
-  //   const T* data() const;
-  //   template <typename U>
-  //   bool Read(size_t index, U* output);
-
-  // Handles:
-  //   T Take(size_t index);
-
-  // Interfaces:
-  //   template <typename U>
-  //   U Take(size_t index);
-
-  // Object types:
-  //   void GetDataView(size_t index, T* output);
-  //   template <typename U>
-  //   bool Read(size_t index, U* output);
-
- private:
-  template <typename K, typename V>
-  friend class MapDataView;
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_ARRAY_DATA_VIEW_H_
diff --git a/mojo/public/cpp/bindings/array_traits.h b/mojo/public/cpp/bindings/array_traits.h
deleted file mode 100644
index 594b2e0..0000000
--- a/mojo/public/cpp/bindings/array_traits.h
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_ARRAY_TRAITS_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_ARRAY_TRAITS_H_
-
-namespace mojo {
-
-// This must be specialized for any type |T| to be serialized/deserialized as
-// a mojom array.
-//
-// Usually you would like to do a partial specialization for a container (e.g.
-// vector) template. Imagine you want to specialize it for Container<>, you need
-// to implement:
-//
-//   template <typename T>
-//   struct ArrayTraits<Container<T>> {
-//     using Element = T;
-//     // These two statements are optional. Use them if you'd like to serialize
-//     // a container that supports iterators but does not support O(1) random
-//     // access and so GetAt(...) would be expensive.
-//     // using Iterator = T::iterator;
-//     // using ConstIterator = T::const_iterator;
-//
-//     // These two methods are optional. Please see comments in struct_traits.h
-//     static bool IsNull(const Container<T>& input);
-//     static void SetToNull(Container<T>* output);
-//
-//     static size_t GetSize(const Container<T>& input);
-//
-//     // These two methods are optional. They are used to access the
-//     // underlying storage of the array to speed up copy of POD types.
-//     static T* GetData(Container<T>& input);
-//     static const T* GetData(const Container<T>& input);
-//
-//     // The following six methods are optional if the GetAt(...) methods are
-//     // implemented. These methods specify how to read the elements of
-//     // Container in some sequential order specified by the iterator.
-//     //
-//     // Acquires an iterator positioned at the first element in the container.
-//     static ConstIterator GetBegin(const Container<T>& input);
-//     static Iterator GetBegin(Container<T>& input);
-//
-//     // Advances |iterator| to the next position within the container.
-//     static void AdvanceIterator(ConstIterator& iterator);
-//     static void AdvanceIterator(Iterator& iterator);
-//
-//     // Returns a reference to the value at the current position of
-//     // |iterator|. Optionally, the ConstIterator version of GetValue can
-//     // return by value instead of by reference if it makes sense for the
-//     // type.
-//     static const T& GetValue(ConstIterator& iterator);
-//     static T& GetValue(Iterator& iterator);
-//
-//     // These two methods are optional if the iterator methods are
-//     // implemented.
-//     static T& GetAt(Container<T>& input, size_t index);
-//     static const T& GetAt(const Container<T>& input, size_t index);
-//
-//     // Returning false results in deserialization failure and causes the
-//     // message pipe receiving it to be disconnected.
-//     static bool Resize(Container<T>& input, size_t size);
-//   };
-//
-template <typename T>
-struct ArrayTraits;
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_ARRAY_TRAITS_H_
diff --git a/mojo/public/cpp/bindings/array_traits_carray.h b/mojo/public/cpp/bindings/array_traits_carray.h
deleted file mode 100644
index 3ff694b..0000000
--- a/mojo/public/cpp/bindings/array_traits_carray.h
+++ /dev/null
@@ -1,76 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_ARRAY_TRAITS_CARRAY_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_ARRAY_TRAITS_CARRAY_H_
-
-#include "mojo/public/cpp/bindings/array_traits.h"
-
-namespace mojo {
-
-template <typename T>
-struct CArray {
-  CArray() : size(0), max_size(0), data(nullptr) {}
-  CArray(size_t size, size_t max_size, T* data)
-      : size(size), max_size(max_size), data(data) {}
-  size_t size;
-  const size_t max_size;
-  T* data;
-};
-
-template <typename T>
-struct ConstCArray {
-  ConstCArray() : size(0), data(nullptr) {}
-  ConstCArray(size_t size, const T* data) : size(size), data(data) {}
-  size_t size;
-  const T* data;
-};
-
-template <typename T>
-struct ArrayTraits<CArray<T>> {
-  using Element = T;
-
-  static bool IsNull(const CArray<T>& input) { return !input.data; }
-
-  static void SetToNull(CArray<T>* output) { output->data = nullptr; }
-
-  static size_t GetSize(const CArray<T>& input) { return input.size; }
-
-  static T* GetData(CArray<T>& input) { return input.data; }
-
-  static const T* GetData(const CArray<T>& input) { return input.data; }
-
-  static T& GetAt(CArray<T>& input, size_t index) { return input.data[index]; }
-
-  static const T& GetAt(const CArray<T>& input, size_t index) {
-    return input.data[index];
-  }
-
-  static bool Resize(CArray<T>& input, size_t size) {
-    if (size > input.max_size)
-      return false;
-
-    input.size = size;
-    return true;
-  }
-};
-
-template <typename T>
-struct ArrayTraits<ConstCArray<T>> {
-  using Element = T;
-
-  static bool IsNull(const ConstCArray<T>& input) { return !input.data; }
-
-  static size_t GetSize(const ConstCArray<T>& input) { return input.size; }
-
-  static const T* GetData(const ConstCArray<T>& input) { return input.data; }
-
-  static const T& GetAt(const ConstCArray<T>& input, size_t index) {
-    return input.data[index];
-  }
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_ARRAY_TRAITS_CARRAY_H_
diff --git a/mojo/public/cpp/bindings/array_traits_stl.h b/mojo/public/cpp/bindings/array_traits_stl.h
deleted file mode 100644
index dec47bf..0000000
--- a/mojo/public/cpp/bindings/array_traits_stl.h
+++ /dev/null
@@ -1,127 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_ARRAY_TRAITS_STL_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_ARRAY_TRAITS_STL_H_
-
-#include <map>
-#include <set>
-#include <vector>
-
-#include "mojo/public/cpp/bindings/array_traits.h"
-
-namespace mojo {
-
-template <typename T>
-struct ArrayTraits<std::vector<T>> {
-  using Element = T;
-
-  static bool IsNull(const std::vector<T>& input) {
-    // std::vector<> is always converted to non-null mojom array.
-    return false;
-  }
-
-  static void SetToNull(std::vector<T>* output) {
-    // std::vector<> doesn't support null state. Set it to empty instead.
-    output->clear();
-  }
-
-  static size_t GetSize(const std::vector<T>& input) { return input.size(); }
-
-  static T* GetData(std::vector<T>& input) { return input.data(); }
-
-  static const T* GetData(const std::vector<T>& input) { return input.data(); }
-
-  static typename std::vector<T>::reference GetAt(std::vector<T>& input,
-                                                  size_t index) {
-    return input[index];
-  }
-
-  static typename std::vector<T>::const_reference GetAt(
-      const std::vector<T>& input,
-      size_t index) {
-    return input[index];
-  }
-
-  static inline bool Resize(std::vector<T>& input, size_t size) {
-    // Instead of calling std::vector<T>::resize() directly, this is a hack to
-    // make compilers happy. Some compilers (e.g., Mac, Android, Linux MSan)
-    // currently don't allow resizing types like
-    // std::vector<std::vector<MoveOnlyType>>.
-    // Because the deserialization code doesn't care about the original contents
-    // of |input|, we discard them directly.
-    //
-    // The "inline" keyword of this method matters. Without it, we have observed
-    // significant perf regression with some tests on Mac. crbug.com/631415
-    if (input.size() != size) {
-      std::vector<T> temp(size);
-      input.swap(temp);
-    }
-
-    return true;
-  }
-};
-
-// This ArrayTraits specialization is used only for serialization.
-template <typename T>
-struct ArrayTraits<std::set<T>> {
-  using Element = T;
-  using ConstIterator = typename std::set<T>::const_iterator;
-
-  static bool IsNull(const std::set<T>& input) {
-    // std::set<> is always converted to non-null mojom array.
-    return false;
-  }
-
-  static size_t GetSize(const std::set<T>& input) { return input.size(); }
-
-  static ConstIterator GetBegin(const std::set<T>& input) {
-    return input.begin();
-  }
-  static void AdvanceIterator(ConstIterator& iterator) {
-    ++iterator;
-  }
-  static const T& GetValue(ConstIterator& iterator) {
-    return *iterator;
-  }
-};
-
-template <typename K, typename V>
-struct MapValuesArrayView {
-  explicit MapValuesArrayView(const std::map<K, V>& map) : map(map) {}
-  const std::map<K, V>& map;
-};
-
-// Convenience function to create a MapValuesArrayView<> that infers the
-// template arguments from its argument type.
-template <typename K, typename V>
-MapValuesArrayView<K, V> MapValuesToArray(const std::map<K, V>& map) {
-  return MapValuesArrayView<K, V>(map);
-}
-
-// This ArrayTraits specialization is used only for serialization and converts
-// a map<K, V> into an array<V>, discarding the keys.
-template <typename K, typename V>
-struct ArrayTraits<MapValuesArrayView<K, V>> {
-  using Element = V;
-  using ConstIterator = typename std::map<K, V>::const_iterator;
-
-  static bool IsNull(const MapValuesArrayView<K, V>& input) {
-    // std::map<> is always converted to non-null mojom array.
-    return false;
-  }
-
-  static size_t GetSize(const MapValuesArrayView<K, V>& input) {
-    return input.map.size();
-  }
-  static ConstIterator GetBegin(const MapValuesArrayView<K, V>& input) {
-    return input.map.begin();
-  }
-  static void AdvanceIterator(ConstIterator& iterator) { ++iterator; }
-  static const V& GetValue(ConstIterator& iterator) { return iterator->second; }
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_ARRAY_TRAITS_STL_H_
diff --git a/mojo/public/cpp/bindings/array_traits_wtf_vector.h b/mojo/public/cpp/bindings/array_traits_wtf_vector.h
deleted file mode 100644
index 6e20735..0000000
--- a/mojo/public/cpp/bindings/array_traits_wtf_vector.h
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_ARRAY_TRAITS_WTF_VECTOR_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_ARRAY_TRAITS_WTF_VECTOR_H_
-
-#include "mojo/public/cpp/bindings/array_traits.h"
-#include "third_party/WebKit/Source/wtf/Vector.h"
-
-namespace mojo {
-
-template <typename U>
-struct ArrayTraits<WTF::Vector<U>> {
-  using Element = U;
-
-  static bool IsNull(const WTF::Vector<U>& input) {
-    // WTF::Vector<> is always converted to non-null mojom array.
-    return false;
-  }
-
-  static void SetToNull(WTF::Vector<U>* output) {
-    // WTF::Vector<> doesn't support null state. Set it to empty instead.
-    output->clear();
-  }
-
-  static size_t GetSize(const WTF::Vector<U>& input) { return input.size(); }
-
-  static U* GetData(WTF::Vector<U>& input) { return input.data(); }
-
-  static const U* GetData(const WTF::Vector<U>& input) { return input.data(); }
-
-  static U& GetAt(WTF::Vector<U>& input, size_t index) { return input[index]; }
-
-  static const U& GetAt(const WTF::Vector<U>& input, size_t index) {
-    return input[index];
-  }
-
-  static bool Resize(WTF::Vector<U>& input, size_t size) {
-    input.resize(size);
-    return true;
-  }
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_ARRAY_TRAITS_WTF_VECTOR_H_
diff --git a/mojo/public/cpp/bindings/associated_binding.h b/mojo/public/cpp/bindings/associated_binding.h
deleted file mode 100644
index 5941166..0000000
--- a/mojo/public/cpp/bindings/associated_binding.h
+++ /dev/null
@@ -1,171 +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 MOJO_PUBLIC_CPP_BINDINGS_ASSOCIATED_BINDING_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_ASSOCIATED_BINDING_H_
-
-#include <memory>
-#include <string>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "base/memory/ref_counted.h"
-#include "base/single_thread_task_runner.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "mojo/public/cpp/bindings/associated_interface_ptr_info.h"
-#include "mojo/public/cpp/bindings/associated_interface_request.h"
-#include "mojo/public/cpp/bindings/bindings_export.h"
-#include "mojo/public/cpp/bindings/connection_error_callback.h"
-#include "mojo/public/cpp/bindings/interface_endpoint_client.h"
-#include "mojo/public/cpp/bindings/raw_ptr_impl_ref_traits.h"
-#include "mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h"
-
-namespace mojo {
-
-class MessageReceiver;
-
-// Base class used to factor out code in AssociatedBinding<T> expansions, in
-// particular for Bind().
-class MOJO_CPP_BINDINGS_EXPORT AssociatedBindingBase {
- public:
-  AssociatedBindingBase();
-  ~AssociatedBindingBase();
-
-  // Adds a message filter to be notified of each incoming message before
-  // dispatch. If a filter returns |false| from Accept(), the message is not
-  // dispatched and the pipe is closed. Filters cannot be removed.
-  void AddFilter(std::unique_ptr<MessageReceiver> filter);
-
-  // Closes the associated interface. Puts this object into a state where it can
-  // be rebound.
-  void Close();
-
-  // Similar to the method above, but also specifies a disconnect reason.
-  void CloseWithReason(uint32_t custom_reason, const std::string& description);
-
-  // Sets an error handler that will be called if a connection error occurs.
-  //
-  // This method may only be called after this AssociatedBinding has been bound
-  // to a message pipe. The error handler will be reset when this
-  // AssociatedBinding is unbound or closed.
-  void set_connection_error_handler(const base::Closure& error_handler);
-
-  void set_connection_error_with_reason_handler(
-      const ConnectionErrorWithReasonCallback& error_handler);
-
-  // Indicates whether the associated binding has been completed.
-  bool is_bound() const { return !!endpoint_client_; }
-
-  // Sends a message on the underlying message pipe and runs the current
-  // message loop until its response is received. This can be used in tests to
-  // verify that no message was sent on a message pipe in response to some
-  // stimulus.
-  void FlushForTesting();
-
- protected:
-  void BindImpl(ScopedInterfaceEndpointHandle handle,
-                MessageReceiverWithResponderStatus* receiver,
-                std::unique_ptr<MessageReceiver> payload_validator,
-                bool expect_sync_requests,
-                scoped_refptr<base::SingleThreadTaskRunner> runner,
-                uint32_t interface_version);
-
-  std::unique_ptr<InterfaceEndpointClient> endpoint_client_;
-};
-
-// Represents the implementation side of an associated interface. It is similar
-// to Binding, except that it doesn't own a message pipe handle.
-//
-// When you bind this class to a request, optionally you can specify a
-// base::SingleThreadTaskRunner. This task runner must belong to the same
-// thread. It will be used to dispatch incoming method calls and connection
-// error notification. It is useful when you attach multiple task runners to a
-// single thread for the purposes of task scheduling. Please note that incoming
-// synchrounous method calls may not be run from this task runner, when they
-// reenter outgoing synchrounous calls on the same thread.
-template <typename Interface,
-          typename ImplRefTraits = RawPtrImplRefTraits<Interface>>
-class AssociatedBinding : public AssociatedBindingBase {
- public:
-  using ImplPointerType = typename ImplRefTraits::PointerType;
-
-  // Constructs an incomplete associated binding that will use the
-  // implementation |impl|. It may be completed with a subsequent call to the
-  // |Bind| method. Does not take ownership of |impl|, which must outlive this
-  // object.
-  explicit AssociatedBinding(ImplPointerType impl) { stub_.set_sink(impl); }
-
-  // Constructs a completed associated binding of |impl|. The output |ptr_info|
-  // should be sent by another interface. |impl| must outlive this object.
-  AssociatedBinding(ImplPointerType impl,
-                    AssociatedInterfacePtrInfo<Interface>* ptr_info,
-                    scoped_refptr<base::SingleThreadTaskRunner> runner =
-                        base::ThreadTaskRunnerHandle::Get())
-      : AssociatedBinding(std::move(impl)) {
-    Bind(ptr_info, std::move(runner));
-  }
-
-  // Constructs a completed associated binding of |impl|. |impl| must outlive
-  // the binding.
-  AssociatedBinding(ImplPointerType impl,
-                    AssociatedInterfaceRequest<Interface> request,
-                    scoped_refptr<base::SingleThreadTaskRunner> runner =
-                        base::ThreadTaskRunnerHandle::Get())
-      : AssociatedBinding(std::move(impl)) {
-    Bind(std::move(request), std::move(runner));
-  }
-
-  ~AssociatedBinding() {}
-
-  // Creates an associated inteface and sets up this object as the
-  // implementation side. The output |ptr_info| should be sent by another
-  // interface.
-  void Bind(AssociatedInterfacePtrInfo<Interface>* ptr_info,
-            scoped_refptr<base::SingleThreadTaskRunner> runner =
-                base::ThreadTaskRunnerHandle::Get()) {
-    auto request = MakeRequest(ptr_info);
-    ptr_info->set_version(Interface::Version_);
-    Bind(std::move(request), std::move(runner));
-  }
-
-  // Sets up this object as the implementation side of an associated interface.
-  void Bind(AssociatedInterfaceRequest<Interface> request,
-            scoped_refptr<base::SingleThreadTaskRunner> runner =
-                base::ThreadTaskRunnerHandle::Get()) {
-    BindImpl(request.PassHandle(), &stub_,
-             base::WrapUnique(new typename Interface::RequestValidator_()),
-             Interface::HasSyncMethods_, std::move(runner),
-             Interface::Version_);
-  }
-
-  // Unbinds and returns the associated interface request so it can be
-  // used in another context, such as on another thread or with a different
-  // implementation. Puts this object into a state where it can be rebound.
-  AssociatedInterfaceRequest<Interface> Unbind() {
-    DCHECK(endpoint_client_);
-
-    AssociatedInterfaceRequest<Interface> request;
-    request.Bind(endpoint_client_->PassHandle());
-
-    endpoint_client_.reset();
-
-    return request;
-  }
-
-  // Returns the interface implementation that was previously specified.
-  Interface* impl() { return ImplRefTraits::GetRawPointer(&stub_.sink()); }
-
- private:
-  typename Interface::template Stub_<ImplRefTraits> stub_;
-
-  DISALLOW_COPY_AND_ASSIGN(AssociatedBinding);
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_ASSOCIATED_BINDING_H_
diff --git a/mojo/public/cpp/bindings/associated_binding_set.h b/mojo/public/cpp/bindings/associated_binding_set.h
deleted file mode 100644
index 59600c6..0000000
--- a/mojo/public/cpp/bindings/associated_binding_set.h
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_ASSOCIATED_BINDING_SET_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_ASSOCIATED_BINDING_SET_H_
-
-#include "mojo/public/cpp/bindings/associated_binding.h"
-#include "mojo/public/cpp/bindings/associated_interface_ptr.h"
-#include "mojo/public/cpp/bindings/associated_interface_request.h"
-#include "mojo/public/cpp/bindings/binding_set.h"
-
-namespace mojo {
-
-template <typename Interface, typename ImplRefTraits>
-struct BindingSetTraits<AssociatedBinding<Interface, ImplRefTraits>> {
-  using ProxyType = AssociatedInterfacePtr<Interface>;
-  using RequestType = AssociatedInterfaceRequest<Interface>;
-  using BindingType = AssociatedBinding<Interface, ImplRefTraits>;
-  using ImplPointerType = typename BindingType::ImplPointerType;
-};
-
-template <typename Interface, typename ContextType = void>
-using AssociatedBindingSet =
-    BindingSetBase<Interface, AssociatedBinding<Interface>, ContextType>;
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_ASSOCIATED_BINDING_SET_H_
diff --git a/mojo/public/cpp/bindings/associated_group.h b/mojo/public/cpp/bindings/associated_group.h
deleted file mode 100644
index 14e78ec..0000000
--- a/mojo/public/cpp/bindings/associated_group.h
+++ /dev/null
@@ -1,51 +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 MOJO_PUBLIC_CPP_BINDINGS_ASSOCIATED_GROUP_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_ASSOCIATED_GROUP_H_
-
-#include "base/callback.h"
-#include "base/memory/ref_counted.h"
-#include "mojo/public/cpp/bindings/bindings_export.h"
-#include "mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h"
-
-namespace mojo {
-
-class AssociatedGroupController;
-
-// AssociatedGroup refers to all the interface endpoints running at one end of a
-// message pipe.
-// It is thread safe and cheap to make copies.
-class MOJO_CPP_BINDINGS_EXPORT AssociatedGroup {
- public:
-  AssociatedGroup();
-
-  explicit AssociatedGroup(scoped_refptr<AssociatedGroupController> controller);
-
-  explicit AssociatedGroup(const ScopedInterfaceEndpointHandle& handle);
-
-  AssociatedGroup(const AssociatedGroup& other);
-
-  ~AssociatedGroup();
-
-  AssociatedGroup& operator=(const AssociatedGroup& other);
-
-  // The return value of this getter if this object is initialized with a
-  // ScopedInterfaceEndpointHandle:
-  //   - If the handle is invalid, the return value will always be null.
-  //   - If the handle is valid and non-pending, the return value will be
-  //     non-null and remain unchanged even if the handle is later reset.
-  //   - If the handle is pending asssociation, the return value will initially
-  //     be null, change to non-null when/if the handle is associated, and
-  //     remain unchanged ever since.
-  AssociatedGroupController* GetController();
-
- private:
-  base::Callback<AssociatedGroupController*()> controller_getter_;
-  scoped_refptr<AssociatedGroupController> controller_;
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_ASSOCIATED_GROUP_H_
diff --git a/mojo/public/cpp/bindings/associated_group_controller.h b/mojo/public/cpp/bindings/associated_group_controller.h
deleted file mode 100644
index d33c277..0000000
--- a/mojo/public/cpp/bindings/associated_group_controller.h
+++ /dev/null
@@ -1,93 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_ASSOCIATED_GROUP_CONTROLLER_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_ASSOCIATED_GROUP_CONTROLLER_H_
-
-#include <memory>
-
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/optional.h"
-#include "base/single_thread_task_runner.h"
-#include "mojo/public/cpp/bindings/bindings_export.h"
-#include "mojo/public/cpp/bindings/disconnect_reason.h"
-#include "mojo/public/cpp/bindings/interface_id.h"
-#include "mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h"
-
-namespace mojo {
-
-class InterfaceEndpointClient;
-class InterfaceEndpointController;
-
-// An internal interface used to manage endpoints within an associated group,
-// which corresponds to one end of a message pipe.
-class MOJO_CPP_BINDINGS_EXPORT AssociatedGroupController
-    : public base::RefCountedThreadSafe<AssociatedGroupController> {
- public:
-  // Associates an interface with this AssociatedGroupController's message pipe.
-  // It takes ownership of |handle_to_send| and returns an interface ID that
-  // could be sent by any endpoints within the same associated group.
-  // If |handle_to_send| is not in pending association state, it returns
-  // kInvalidInterfaceId. Otherwise, the peer handle of |handle_to_send| joins
-  // the associated group and is no longer pending.
-  virtual InterfaceId AssociateInterface(
-      ScopedInterfaceEndpointHandle handle_to_send) = 0;
-
-  // Creates an interface endpoint handle from a given interface ID. The handle
-  // joins this associated group.
-  // Typically, this method is used to (1) create an endpoint handle for the
-  // master interface; or (2) create an endpoint handle on receiving an
-  // interface ID from the message pipe.
-  //
-  // On failure, the method returns an invalid handle. Usually that is because
-  // the ID has already been used to create a handle.
-  virtual ScopedInterfaceEndpointHandle CreateLocalEndpointHandle(
-      InterfaceId id) = 0;
-
-  // Closes an interface endpoint handle.
-  virtual void CloseEndpointHandle(
-      InterfaceId id,
-      const base::Optional<DisconnectReason>& reason) = 0;
-
-  // Attaches a client to the specified endpoint to send and receive messages.
-  // The returned object is still owned by the controller. It must only be used
-  // on the same thread as this call, and only before the client is detached
-  // using DetachEndpointClient().
-  virtual InterfaceEndpointController* AttachEndpointClient(
-      const ScopedInterfaceEndpointHandle& handle,
-      InterfaceEndpointClient* endpoint_client,
-      scoped_refptr<base::SingleThreadTaskRunner> runner) = 0;
-
-  // Detaches the client attached to the specified endpoint. It must be called
-  // on the same thread as the corresponding AttachEndpointClient() call.
-  virtual void DetachEndpointClient(
-      const ScopedInterfaceEndpointHandle& handle) = 0;
-
-  // Raises an error on the underlying message pipe. It disconnects the pipe
-  // and notifies all interfaces running on this pipe.
-  virtual void RaiseError() = 0;
-
- protected:
-  friend class base::RefCountedThreadSafe<AssociatedGroupController>;
-
-  // Creates a new ScopedInterfaceEndpointHandle within this associated group.
-  ScopedInterfaceEndpointHandle CreateScopedInterfaceEndpointHandle(
-      InterfaceId id);
-
-  // Notifies that the interface represented by |handle_to_send| and its peer
-  // has been associated with this AssociatedGroupController's message pipe, and
-  // |handle_to_send|'s peer has joined this associated group. (Note: it is the
-  // peer who has joined the associated group; |handle_to_send| will be sent to
-  // the remote side.)
-  // Returns false if |handle_to_send|'s peer has closed.
-  bool NotifyAssociation(ScopedInterfaceEndpointHandle* handle_to_send,
-                         InterfaceId id);
-
-  virtual ~AssociatedGroupController();
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_ASSOCIATED_GROUP_CONTROLLER_H_
diff --git a/mojo/public/cpp/bindings/associated_interface_ptr.h b/mojo/public/cpp/bindings/associated_interface_ptr.h
deleted file mode 100644
index 8806a3e..0000000
--- a/mojo/public/cpp/bindings/associated_interface_ptr.h
+++ /dev/null
@@ -1,283 +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 MOJO_PUBLIC_CPP_BINDINGS_ASSOCIATED_INTERFACE_PTR_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_ASSOCIATED_INTERFACE_PTR_H_
-
-#include <stdint.h>
-
-#include <string>
-#include <utility>
-
-#include "base/callback.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/single_thread_task_runner.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "mojo/public/cpp/bindings/associated_interface_ptr_info.h"
-#include "mojo/public/cpp/bindings/associated_interface_request.h"
-#include "mojo/public/cpp/bindings/bindings_export.h"
-#include "mojo/public/cpp/bindings/connection_error_callback.h"
-#include "mojo/public/cpp/bindings/lib/associated_interface_ptr_state.h"
-#include "mojo/public/cpp/bindings/lib/multiplex_router.h"
-#include "mojo/public/cpp/system/message_pipe.h"
-
-namespace mojo {
-
-// Represents the client side of an associated interface. It is similar to
-// InterfacePtr, except that it doesn't own a message pipe handle.
-template <typename Interface>
-class AssociatedInterfacePtr {
- public:
-  using InterfaceType = Interface;
-  using PtrInfoType = AssociatedInterfacePtrInfo<Interface>;
-
-  // Constructs an unbound AssociatedInterfacePtr.
-  AssociatedInterfacePtr() {}
-  AssociatedInterfacePtr(decltype(nullptr)) {}
-
-  AssociatedInterfacePtr(AssociatedInterfacePtr&& other) {
-    internal_state_.Swap(&other.internal_state_);
-  }
-
-  AssociatedInterfacePtr& operator=(AssociatedInterfacePtr&& other) {
-    reset();
-    internal_state_.Swap(&other.internal_state_);
-    return *this;
-  }
-
-  // Assigning nullptr to this class causes it to closes the associated
-  // interface (if any) and returns the pointer to the unbound state.
-  AssociatedInterfacePtr& operator=(decltype(nullptr)) {
-    reset();
-    return *this;
-  }
-
-  ~AssociatedInterfacePtr() {}
-
-  // Sets up this object as the client side of an associated interface.
-  // Calling with an invalid |info| has the same effect as reset(). In this
-  // case, the AssociatedInterfacePtr is not considered as bound.
-  //
-  // |runner| must belong to the same thread. It will be used to dispatch all
-  // callbacks and connection error notification. It is useful when you attach
-  // multiple task runners to a single thread for the purposes of task
-  // scheduling.
-  //
-  // NOTE: The corresponding AssociatedInterfaceRequest must be sent over
-  // another interface before using this object to make calls. Please see the
-  // comments of MakeRequest(AssociatedInterfacePtr<Interface>*) for more
-  // details.
-  void Bind(AssociatedInterfacePtrInfo<Interface> info,
-            scoped_refptr<base::SingleThreadTaskRunner> runner =
-                base::ThreadTaskRunnerHandle::Get()) {
-    reset();
-
-    if (info.is_valid())
-      internal_state_.Bind(std::move(info), std::move(runner));
-  }
-
-  bool is_bound() const { return internal_state_.is_bound(); }
-
-  Interface* get() const { return internal_state_.instance(); }
-
-  // Functions like a pointer to Interface. Must already be bound.
-  Interface* operator->() const { return get(); }
-  Interface& operator*() const { return *get(); }
-
-  // Returns the version number of the interface that the remote side supports.
-  uint32_t version() const { return internal_state_.version(); }
-
-  // Queries the max version that the remote side supports. On completion, the
-  // result will be returned as the input of |callback|. The version number of
-  // this object will also be updated.
-  void QueryVersion(const base::Callback<void(uint32_t)>& callback) {
-    internal_state_.QueryVersion(callback);
-  }
-
-  // If the remote side doesn't support the specified version, it will close the
-  // associated interface asynchronously. This does nothing if it's already
-  // known that the remote side supports the specified version, i.e., if
-  // |version <= this->version()|.
-  //
-  // After calling RequireVersion() with a version not supported by the remote
-  // side, all subsequent calls to interface methods will be ignored.
-  void RequireVersion(uint32_t version) {
-    internal_state_.RequireVersion(version);
-  }
-
-  // Sends a message on the underlying message pipe and runs the current
-  // message loop until its response is received. This can be used in tests to
-  // verify that no message was sent on a message pipe in response to some
-  // stimulus.
-  void FlushForTesting() { internal_state_.FlushForTesting(); }
-
-  // Closes the associated interface (if any) and returns the pointer to the
-  // unbound state.
-  void reset() {
-    State doomed;
-    internal_state_.Swap(&doomed);
-  }
-
-  // Similar to the method above, but also specifies a disconnect reason.
-  void ResetWithReason(uint32_t custom_reason, const std::string& description) {
-    if (internal_state_.is_bound())
-      internal_state_.CloseWithReason(custom_reason, description);
-    reset();
-  }
-
-  // Indicates whether an error has been encountered. If true, method calls made
-  // on this interface will be dropped (and may already have been dropped).
-  bool encountered_error() const { return internal_state_.encountered_error(); }
-
-  // Registers a handler to receive error notifications.
-  //
-  // This method may only be called after the AssociatedInterfacePtr has been
-  // bound.
-  void set_connection_error_handler(const base::Closure& error_handler) {
-    internal_state_.set_connection_error_handler(error_handler);
-  }
-
-  void set_connection_error_with_reason_handler(
-      const ConnectionErrorWithReasonCallback& error_handler) {
-    internal_state_.set_connection_error_with_reason_handler(error_handler);
-  }
-
-  // Unbinds and returns the associated interface pointer information which
-  // could be used to setup an AssociatedInterfacePtr again. This method may be
-  // used to move the proxy to a different thread.
-  //
-  // It is an error to call PassInterface() while there are pending responses.
-  // TODO: fix this restriction, it's not always obvious when there is a
-  // pending response.
-  AssociatedInterfacePtrInfo<Interface> PassInterface() {
-    DCHECK(!internal_state_.has_pending_callbacks());
-    State state;
-    internal_state_.Swap(&state);
-
-    return state.PassInterface();
-  }
-
-  // DO NOT USE. Exposed only for internal use and for testing.
-  internal::AssociatedInterfacePtrState<Interface>* internal_state() {
-    return &internal_state_;
-  }
-
-  // Allow AssociatedInterfacePtr<> to be used in boolean expressions, but not
-  // implicitly convertible to a real bool (which is dangerous).
- private:
-  // TODO(dcheng): Use an explicit conversion operator.
-  typedef internal::AssociatedInterfacePtrState<Interface>
-      AssociatedInterfacePtr::*Testable;
-
- public:
-  operator Testable() const {
-    return internal_state_.is_bound() ? &AssociatedInterfacePtr::internal_state_
-                                      : nullptr;
-  }
-
- private:
-  // Forbid the == and != operators explicitly, otherwise AssociatedInterfacePtr
-  // will be converted to Testable to do == or != comparison.
-  template <typename T>
-  bool operator==(const AssociatedInterfacePtr<T>& other) const = delete;
-  template <typename T>
-  bool operator!=(const AssociatedInterfacePtr<T>& other) const = delete;
-
-  typedef internal::AssociatedInterfacePtrState<Interface> State;
-  mutable State internal_state_;
-
-  DISALLOW_COPY_AND_ASSIGN(AssociatedInterfacePtr);
-};
-
-// Creates an associated interface. The returned request is supposed to be sent
-// over another interface (either associated or non-associated).
-//
-// NOTE: |ptr| must NOT be used to make calls before the request is sent.
-// Violating that will lead to crash. On the other hand, as soon as the request
-// is sent, |ptr| is usable. There is no need to wait until the request is bound
-// to an implementation at the remote side.
-template <typename Interface>
-AssociatedInterfaceRequest<Interface> MakeRequest(
-    AssociatedInterfacePtr<Interface>* ptr,
-    scoped_refptr<base::SingleThreadTaskRunner> runner =
-        base::ThreadTaskRunnerHandle::Get()) {
-  AssociatedInterfacePtrInfo<Interface> ptr_info;
-  auto request = MakeRequest(&ptr_info);
-  ptr->Bind(std::move(ptr_info), std::move(runner));
-  return request;
-}
-
-// Creates an associated interface. One of the two endpoints is supposed to be
-// sent over another interface (either associated or non-associated); while the
-// other is used locally.
-//
-// NOTE: If |ptr_info| is used locally and bound to an AssociatedInterfacePtr,
-// the interface pointer must NOT be used to make calls before the request is
-// sent. Please see NOTE of the previous function for more details.
-template <typename Interface>
-AssociatedInterfaceRequest<Interface> MakeRequest(
-    AssociatedInterfacePtrInfo<Interface>* ptr_info) {
-  ScopedInterfaceEndpointHandle handle0;
-  ScopedInterfaceEndpointHandle handle1;
-  ScopedInterfaceEndpointHandle::CreatePairPendingAssociation(&handle0,
-                                                              &handle1);
-
-  ptr_info->set_handle(std::move(handle0));
-  ptr_info->set_version(0);
-
-  AssociatedInterfaceRequest<Interface> request;
-  request.Bind(std::move(handle1));
-  return request;
-}
-
-// Like MakeRequest() above, but it creates a dedicated message pipe. The
-// returned request can be bound directly to an implementation, without being
-// first passed through a message pipe endpoint.
-//
-// This function has two main uses:
-//
-//  * In testing, where the returned request is bound to e.g. a mock and there
-//    are no other interfaces involved.
-//
-//  * When discarding messages sent on an interface, which can be done by
-//    discarding the returned request.
-template <typename Interface>
-AssociatedInterfaceRequest<Interface> MakeIsolatedRequest(
-    AssociatedInterfacePtr<Interface>* ptr) {
-  MessagePipe pipe;
-  scoped_refptr<internal::MultiplexRouter> router0 =
-      new internal::MultiplexRouter(std::move(pipe.handle0),
-                                    internal::MultiplexRouter::MULTI_INTERFACE,
-                                    false, base::ThreadTaskRunnerHandle::Get());
-  scoped_refptr<internal::MultiplexRouter> router1 =
-      new internal::MultiplexRouter(std::move(pipe.handle1),
-                                    internal::MultiplexRouter::MULTI_INTERFACE,
-                                    true, base::ThreadTaskRunnerHandle::Get());
-
-  ScopedInterfaceEndpointHandle endpoint0, endpoint1;
-  ScopedInterfaceEndpointHandle::CreatePairPendingAssociation(&endpoint0,
-                                                              &endpoint1);
-  InterfaceId id = router1->AssociateInterface(std::move(endpoint0));
-  endpoint0 = router0->CreateLocalEndpointHandle(id);
-
-  ptr->Bind(AssociatedInterfacePtrInfo<Interface>(std::move(endpoint0),
-                                                  Interface::Version_));
-
-  AssociatedInterfaceRequest<Interface> request;
-  request.Bind(std::move(endpoint1));
-  return request;
-}
-
-// |handle| is supposed to be the request of an associated interface. This
-// method associates the interface with a dedicated, disconnected message pipe.
-// That way, the corresponding associated interface pointer of |handle| can
-// safely make calls (although those calls are silently dropped).
-MOJO_CPP_BINDINGS_EXPORT void GetIsolatedInterface(
-    ScopedInterfaceEndpointHandle handle);
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_ASSOCIATED_INTERFACE_PTR_H_
diff --git a/mojo/public/cpp/bindings/associated_interface_ptr_info.h b/mojo/public/cpp/bindings/associated_interface_ptr_info.h
deleted file mode 100644
index 3c6ca54..0000000
--- a/mojo/public/cpp/bindings/associated_interface_ptr_info.h
+++ /dev/null
@@ -1,77 +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 MOJO_PUBLIC_CPP_BINDINGS_ASSOCIATED_INTERFACE_PTR_INFO_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_ASSOCIATED_INTERFACE_PTR_INFO_H_
-
-#include <stdint.h>
-#include <utility>
-
-#include "base/macros.h"
-#include "mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h"
-
-namespace mojo {
-
-// AssociatedInterfacePtrInfo stores necessary information to construct an
-// associated interface pointer. It is similar to InterfacePtrInfo except that
-// it doesn't own a message pipe handle.
-template <typename Interface>
-class AssociatedInterfacePtrInfo {
- public:
-  AssociatedInterfacePtrInfo() : version_(0u) {}
-  AssociatedInterfacePtrInfo(std::nullptr_t) : version_(0u) {}
-
-  AssociatedInterfacePtrInfo(AssociatedInterfacePtrInfo&& other)
-      : handle_(std::move(other.handle_)), version_(other.version_) {
-    other.version_ = 0u;
-  }
-
-  AssociatedInterfacePtrInfo(ScopedInterfaceEndpointHandle handle,
-                             uint32_t version)
-      : handle_(std::move(handle)), version_(version) {}
-
-  ~AssociatedInterfacePtrInfo() {}
-
-  AssociatedInterfacePtrInfo& operator=(AssociatedInterfacePtrInfo&& other) {
-    if (this != &other) {
-      handle_ = std::move(other.handle_);
-      version_ = other.version_;
-      other.version_ = 0u;
-    }
-
-    return *this;
-  }
-
-  bool is_valid() const { return handle_.is_valid(); }
-
-  ScopedInterfaceEndpointHandle PassHandle() {
-    return std::move(handle_);
-  }
-  const ScopedInterfaceEndpointHandle& handle() const { return handle_; }
-  void set_handle(ScopedInterfaceEndpointHandle handle) {
-    handle_ = std::move(handle);
-  }
-
-  uint32_t version() const { return version_; }
-  void set_version(uint32_t version) { version_ = version; }
-
-  bool Equals(const AssociatedInterfacePtrInfo& other) const {
-    if (this == &other)
-      return true;
-
-    // Now that the two refer to different objects, they are equivalent if
-    // and only if they are both invalid.
-    return !is_valid() && !other.is_valid();
-  }
-
- private:
-  ScopedInterfaceEndpointHandle handle_;
-  uint32_t version_;
-
-  DISALLOW_COPY_AND_ASSIGN(AssociatedInterfacePtrInfo);
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_ASSOCIATED_INTERFACE_PTR_INFO_H_
diff --git a/mojo/public/cpp/bindings/associated_interface_request.h b/mojo/public/cpp/bindings/associated_interface_request.h
deleted file mode 100644
index c37636c..0000000
--- a/mojo/public/cpp/bindings/associated_interface_request.h
+++ /dev/null
@@ -1,90 +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 MOJO_PUBLIC_CPP_BINDINGS_ASSOCIATED_INTERFACE_REQUEST_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_ASSOCIATED_INTERFACE_REQUEST_H_
-
-#include <string>
-#include <utility>
-
-#include "base/macros.h"
-#include "mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h"
-
-namespace mojo {
-
-// AssociatedInterfaceRequest represents an associated interface request. It is
-// similar to InterfaceRequest except that it doesn't own a message pipe handle.
-template <typename Interface>
-class AssociatedInterfaceRequest {
- public:
-  // Constructs an empty AssociatedInterfaceRequest, representing that the
-  // client is not requesting an implementation of Interface.
-  AssociatedInterfaceRequest() {}
-  AssociatedInterfaceRequest(decltype(nullptr)) {}
-
-  // Takes the interface endpoint handle from another
-  // AssociatedInterfaceRequest.
-  AssociatedInterfaceRequest(AssociatedInterfaceRequest&& other) {
-    handle_ = std::move(other.handle_);
-  }
-  AssociatedInterfaceRequest& operator=(AssociatedInterfaceRequest&& other) {
-    if (this != &other)
-      handle_ = std::move(other.handle_);
-    return *this;
-  }
-
-  // Assigning to nullptr resets the AssociatedInterfaceRequest to an empty
-  // state, closing the interface endpoint handle currently bound to it (if
-  // any).
-  AssociatedInterfaceRequest& operator=(decltype(nullptr)) {
-    handle_.reset();
-    return *this;
-  }
-
-  // Indicates whether the request currently contains a valid interface endpoint
-  // handle.
-  bool is_pending() const { return handle_.is_valid(); }
-
-  void Bind(ScopedInterfaceEndpointHandle handle) {
-    handle_ = std::move(handle);
-  }
-
-  ScopedInterfaceEndpointHandle PassHandle() {
-    return std::move(handle_);
-  }
-
-  const ScopedInterfaceEndpointHandle& handle() const { return handle_; }
-
-  bool Equals(const AssociatedInterfaceRequest& other) const {
-    if (this == &other)
-      return true;
-
-    // Now that the two refer to different objects, they are equivalent if
-    // and only if they are both invalid.
-    return !is_pending() && !other.is_pending();
-  }
-
-  void ResetWithReason(uint32_t custom_reason, const std::string& description) {
-    handle_.ResetWithReason(custom_reason, description);
-  }
-
- private:
-  ScopedInterfaceEndpointHandle handle_;
-
-  DISALLOW_COPY_AND_ASSIGN(AssociatedInterfaceRequest);
-};
-
-// Makes an AssociatedInterfaceRequest bound to the specified associated
-// endpoint.
-template <typename Interface>
-AssociatedInterfaceRequest<Interface> MakeAssociatedRequest(
-    ScopedInterfaceEndpointHandle handle) {
-  AssociatedInterfaceRequest<Interface> request;
-  request.Bind(std::move(handle));
-  return request;
-}
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_ASSOCIATED_INTERFACE_REQUEST_H_
diff --git a/mojo/public/cpp/bindings/binding.h b/mojo/public/cpp/bindings/binding.h
deleted file mode 100644
index 88d2f4b..0000000
--- a/mojo/public/cpp/bindings/binding.h
+++ /dev/null
@@ -1,276 +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 MOJO_PUBLIC_CPP_BINDINGS_BINDING_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_BINDING_H_
-
-#include <string>
-#include <utility>
-
-#include "base/callback_forward.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/single_thread_task_runner.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "mojo/public/cpp/bindings/connection_error_callback.h"
-#include "mojo/public/cpp/bindings/interface_ptr.h"
-#include "mojo/public/cpp/bindings/interface_ptr_info.h"
-#include "mojo/public/cpp/bindings/interface_request.h"
-#include "mojo/public/cpp/bindings/lib/binding_state.h"
-#include "mojo/public/cpp/bindings/raw_ptr_impl_ref_traits.h"
-#include "mojo/public/cpp/system/core.h"
-
-namespace mojo {
-
-class MessageReceiver;
-
-// Represents the binding of an interface implementation to a message pipe.
-// When the |Binding| object is destroyed, the binding between the message pipe
-// and the interface is torn down and the message pipe is closed, leaving the
-// interface implementation in an unbound state.
-//
-// Example:
-//
-//   #include "foo.mojom.h"
-//
-//   class FooImpl : public Foo {
-//    public:
-//     explicit FooImpl(InterfaceRequest<Foo> request)
-//         : binding_(this, std::move(request)) {}
-//
-//     // Foo implementation here.
-//
-//    private:
-//     Binding<Foo> binding_;
-//   };
-//
-//   class MyFooFactory : public InterfaceFactory<Foo> {
-//    public:
-//     void Create(..., InterfaceRequest<Foo> request) override {
-//       auto f = new FooImpl(std::move(request));
-//       // Do something to manage the lifetime of |f|. Use StrongBinding<> to
-//       // delete FooImpl on connection errors.
-//     }
-//   };
-//
-// This class is thread hostile while bound to a message pipe. All calls to this
-// class must be from the thread that bound it. The interface implementation's
-// methods will be called from the thread that bound this. If a Binding is not
-// bound to a message pipe, it may be bound or destroyed on any thread.
-//
-// When you bind this class to a message pipe, optionally you can specify a
-// base::SingleThreadTaskRunner. This task runner must belong to the same
-// thread. It will be used to dispatch incoming method calls and connection
-// error notification. It is useful when you attach multiple task runners to a
-// single thread for the purposes of task scheduling. Please note that incoming
-// synchrounous method calls may not be run from this task runner, when they
-// reenter outgoing synchrounous calls on the same thread.
-template <typename Interface,
-          typename ImplRefTraits = RawPtrImplRefTraits<Interface>>
-class Binding {
- public:
-  using ImplPointerType = typename ImplRefTraits::PointerType;
-
-  // Constructs an incomplete binding that will use the implementation |impl|.
-  // The binding may be completed with a subsequent call to the |Bind| method.
-  // Does not take ownership of |impl|, which must outlive the binding.
-  explicit Binding(ImplPointerType impl) : internal_state_(std::move(impl)) {}
-
-  // Constructs a completed binding of message pipe |handle| to implementation
-  // |impl|. Does not take ownership of |impl|, which must outlive the binding.
-  Binding(ImplPointerType impl,
-          ScopedMessagePipeHandle handle,
-          scoped_refptr<base::SingleThreadTaskRunner> runner =
-              base::ThreadTaskRunnerHandle::Get())
-      : Binding(std::move(impl)) {
-    Bind(std::move(handle), std::move(runner));
-  }
-
-  // Constructs a completed binding of |impl| to a new message pipe, passing the
-  // client end to |ptr|, which takes ownership of it. The caller is expected to
-  // pass |ptr| on to the client of the service. Does not take ownership of any
-  // of the parameters. |impl| must outlive the binding. |ptr| only needs to
-  // last until the constructor returns.
-  Binding(ImplPointerType impl,
-          InterfacePtr<Interface>* ptr,
-          scoped_refptr<base::SingleThreadTaskRunner> runner =
-              base::ThreadTaskRunnerHandle::Get())
-      : Binding(std::move(impl)) {
-    Bind(ptr, std::move(runner));
-  }
-
-  // Constructs a completed binding of |impl| to the message pipe endpoint in
-  // |request|, taking ownership of the endpoint. Does not take ownership of
-  // |impl|, which must outlive the binding.
-  Binding(ImplPointerType impl,
-          InterfaceRequest<Interface> request,
-          scoped_refptr<base::SingleThreadTaskRunner> runner =
-              base::ThreadTaskRunnerHandle::Get())
-      : Binding(std::move(impl)) {
-    Bind(request.PassMessagePipe(), std::move(runner));
-  }
-
-  // Tears down the binding, closing the message pipe and leaving the interface
-  // implementation unbound.
-  ~Binding() {}
-
-  // Returns an InterfacePtr bound to one end of a pipe whose other end is
-  // bound to |this|.
-  InterfacePtr<Interface> CreateInterfacePtrAndBind(
-      scoped_refptr<base::SingleThreadTaskRunner> runner =
-          base::ThreadTaskRunnerHandle::Get()) {
-    InterfacePtr<Interface> interface_ptr;
-    Bind(&interface_ptr, std::move(runner));
-    return interface_ptr;
-  }
-
-  // Completes a binding that was constructed with only an interface
-  // implementation. Takes ownership of |handle| and binds it to the previously
-  // specified implementation.
-  void Bind(ScopedMessagePipeHandle handle,
-            scoped_refptr<base::SingleThreadTaskRunner> runner =
-                base::ThreadTaskRunnerHandle::Get()) {
-    internal_state_.Bind(std::move(handle), std::move(runner));
-  }
-
-  // Completes a binding that was constructed with only an interface
-  // implementation by creating a new message pipe, binding one end of it to the
-  // previously specified implementation, and passing the other to |ptr|, which
-  // takes ownership of it. The caller is expected to pass |ptr| on to the
-  // eventual client of the service. Does not take ownership of |ptr|.
-  void Bind(InterfacePtr<Interface>* ptr,
-            scoped_refptr<base::SingleThreadTaskRunner> runner =
-                base::ThreadTaskRunnerHandle::Get()) {
-    MessagePipe pipe;
-    ptr->Bind(InterfacePtrInfo<Interface>(std::move(pipe.handle0),
-                                          Interface::Version_),
-              runner);
-    Bind(std::move(pipe.handle1), std::move(runner));
-  }
-
-  // Completes a binding that was constructed with only an interface
-  // implementation by removing the message pipe endpoint from |request| and
-  // binding it to the previously specified implementation.
-  void Bind(InterfaceRequest<Interface> request,
-            scoped_refptr<base::SingleThreadTaskRunner> runner =
-                base::ThreadTaskRunnerHandle::Get()) {
-    Bind(request.PassMessagePipe(), std::move(runner));
-  }
-
-  // Adds a message filter to be notified of each incoming message before
-  // dispatch. If a filter returns |false| from Accept(), the message is not
-  // dispatched and the pipe is closed. Filters cannot be removed.
-  void AddFilter(std::unique_ptr<MessageReceiver> filter) {
-    DCHECK(is_bound());
-    internal_state_.AddFilter(std::move(filter));
-  }
-
-  // Whether there are any associated interfaces running on the pipe currently.
-  bool HasAssociatedInterfaces() const {
-    return internal_state_.HasAssociatedInterfaces();
-  }
-
-  // Stops processing incoming messages until
-  // ResumeIncomingMethodCallProcessing(), or WaitForIncomingMethodCall().
-  // Outgoing messages are still sent.
-  //
-  // No errors are detected on the message pipe while paused.
-  //
-  // This method may only be called if the object has been bound to a message
-  // pipe and there are no associated interfaces running.
-  void PauseIncomingMethodCallProcessing() {
-    CHECK(!HasAssociatedInterfaces());
-    internal_state_.PauseIncomingMethodCallProcessing();
-  }
-  void ResumeIncomingMethodCallProcessing() {
-    internal_state_.ResumeIncomingMethodCallProcessing();
-  }
-
-  // Blocks the calling thread until either a call arrives on the previously
-  // bound message pipe, the deadline is exceeded, or an error occurs. Returns
-  // true if a method was successfully read and dispatched.
-  //
-  // This method may only be called if the object has been bound to a message
-  // pipe. This returns once a message is received either on the master
-  // interface or any associated interfaces.
-  bool WaitForIncomingMethodCall(
-      MojoDeadline deadline = MOJO_DEADLINE_INDEFINITE) {
-    return internal_state_.WaitForIncomingMethodCall(deadline);
-  }
-
-  // Closes the message pipe that was previously bound. Put this object into a
-  // state where it can be rebound to a new pipe.
-  void Close() { internal_state_.Close(); }
-
-  // Similar to the method above, but also specifies a disconnect reason.
-  void CloseWithReason(uint32_t custom_reason, const std::string& description) {
-    internal_state_.CloseWithReason(custom_reason, description);
-  }
-
-  // Unbinds the underlying pipe from this binding and returns it so it can be
-  // used in another context, such as on another thread or with a different
-  // implementation. Put this object into a state where it can be rebound to a
-  // new pipe.
-  //
-  // This method may only be called if the object has been bound to a message
-  // pipe and there are no associated interfaces running.
-  //
-  // TODO(yzshen): For now, users need to make sure there is no one holding
-  // on to associated interface endpoint handles at both sides of the
-  // message pipe in order to call this method. We need a way to forcefully
-  // invalidate associated interface endpoint handles.
-  InterfaceRequest<Interface> Unbind() {
-    CHECK(!HasAssociatedInterfaces());
-    return internal_state_.Unbind();
-  }
-
-  // Sets an error handler that will be called if a connection error occurs on
-  // the bound message pipe.
-  //
-  // This method may only be called after this Binding has been bound to a
-  // message pipe. The error handler will be reset when this Binding is unbound
-  // or closed.
-  void set_connection_error_handler(const base::Closure& error_handler) {
-    DCHECK(is_bound());
-    internal_state_.set_connection_error_handler(error_handler);
-  }
-
-  void set_connection_error_with_reason_handler(
-      const ConnectionErrorWithReasonCallback& error_handler) {
-    DCHECK(is_bound());
-    internal_state_.set_connection_error_with_reason_handler(error_handler);
-  }
-
-  // Returns the interface implementation that was previously specified. Caller
-  // does not take ownership.
-  Interface* impl() { return internal_state_.impl(); }
-
-  // Indicates whether the binding has been completed (i.e., whether a message
-  // pipe has been bound to the implementation).
-  bool is_bound() const { return internal_state_.is_bound(); }
-
-  // Returns the value of the handle currently bound to this Binding which can
-  // be used to make explicit Wait/WaitMany calls. Requires that the Binding be
-  // bound. Ownership of the handle is retained by the Binding, it is not
-  // transferred to the caller.
-  MessagePipeHandle handle() const { return internal_state_.handle(); }
-
-  // Sends a no-op message on the underlying message pipe and runs the current
-  // message loop until its response is received. This can be used in tests to
-  // verify that no message was sent on a message pipe in response to some
-  // stimulus.
-  void FlushForTesting() { internal_state_.FlushForTesting(); }
-
-  // Exposed for testing, should not generally be used.
-  void EnableTestingMode() { internal_state_.EnableTestingMode(); }
-
- private:
-  internal::BindingState<Interface, ImplRefTraits> internal_state_;
-
-  DISALLOW_COPY_AND_ASSIGN(Binding);
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_BINDING_H_
diff --git a/mojo/public/cpp/bindings/binding_set.h b/mojo/public/cpp/bindings/binding_set.h
deleted file mode 100644
index 919f9c0..0000000
--- a/mojo/public/cpp/bindings/binding_set.h
+++ /dev/null
@@ -1,267 +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 MOJO_PUBLIC_CPP_BINDINGS_BINDING_SET_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_BINDING_SET_H_
-
-#include <string>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "mojo/public/cpp/bindings/binding.h"
-#include "mojo/public/cpp/bindings/connection_error_callback.h"
-#include "mojo/public/cpp/bindings/interface_ptr.h"
-#include "mojo/public/cpp/bindings/interface_request.h"
-#include "mojo/public/cpp/bindings/message.h"
-
-namespace mojo {
-
-template <typename BindingType>
-struct BindingSetTraits;
-
-template <typename Interface, typename ImplRefTraits>
-struct BindingSetTraits<Binding<Interface, ImplRefTraits>> {
-  using ProxyType = InterfacePtr<Interface>;
-  using RequestType = InterfaceRequest<Interface>;
-  using BindingType = Binding<Interface, ImplRefTraits>;
-  using ImplPointerType = typename BindingType::ImplPointerType;
-
-  static RequestType MakeRequest(ProxyType* proxy) {
-    return mojo::MakeRequest(proxy);
-  }
-};
-
-using BindingId = size_t;
-
-template <typename ContextType>
-struct BindingSetContextTraits {
-  using Type = ContextType;
-
-  static constexpr bool SupportsContext() { return true; }
-};
-
-template <>
-struct BindingSetContextTraits<void> {
-  // NOTE: This choice of Type only matters insofar as it affects the size of
-  // the |context_| field of a BindingSetBase::Entry with void context. The
-  // context value is never used in this case.
-  using Type = bool;
-
-  static constexpr bool SupportsContext() { return false; }
-};
-
-// Generic definition used for BindingSet and AssociatedBindingSet to own a
-// collection of bindings which point to the same implementation.
-//
-// If |ContextType| is non-void, then every added binding must include a context
-// value of that type, and |dispatch_context()| will return that value during
-// the extent of any message dispatch targeting that specific binding.
-template <typename Interface, typename BindingType, typename ContextType>
-class BindingSetBase {
- public:
-  using ContextTraits = BindingSetContextTraits<ContextType>;
-  using Context = typename ContextTraits::Type;
-  using PreDispatchCallback = base::Callback<void(const Context&)>;
-  using Traits = BindingSetTraits<BindingType>;
-  using ProxyType = typename Traits::ProxyType;
-  using RequestType = typename Traits::RequestType;
-  using ImplPointerType = typename Traits::ImplPointerType;
-
-  BindingSetBase() {}
-
-  void set_connection_error_handler(const base::Closure& error_handler) {
-    error_handler_ = error_handler;
-    error_with_reason_handler_.Reset();
-  }
-
-  void set_connection_error_with_reason_handler(
-      const ConnectionErrorWithReasonCallback& error_handler) {
-    error_with_reason_handler_ = error_handler;
-    error_handler_.Reset();
-  }
-
-  // Sets a callback to be invoked immediately before dispatching any message or
-  // error received by any of the bindings in the set. This may only be used
-  // with a non-void |ContextType|.
-  void set_pre_dispatch_handler(const PreDispatchCallback& handler) {
-    static_assert(ContextTraits::SupportsContext(),
-                  "Pre-dispatch handler usage requires non-void context type.");
-    pre_dispatch_handler_ = handler;
-  }
-
-  // Adds a new binding to the set which binds |request| to |impl| with no
-  // additional context.
-  BindingId AddBinding(ImplPointerType impl, RequestType request) {
-    static_assert(!ContextTraits::SupportsContext(),
-                  "Context value required for non-void context type.");
-    return AddBindingImpl(std::move(impl), std::move(request), false);
-  }
-
-  // Adds a new binding associated with |context|.
-  BindingId AddBinding(ImplPointerType impl,
-                       RequestType request,
-                       Context context) {
-    static_assert(ContextTraits::SupportsContext(),
-                  "Context value unsupported for void context type.");
-    return AddBindingImpl(std::move(impl), std::move(request),
-                          std::move(context));
-  }
-
-  // Removes a binding from the set. Note that this is safe to call even if the
-  // binding corresponding to |id| has already been removed.
-  //
-  // Returns |true| if the binding was removed and |false| if it didn't exist.
-  bool RemoveBinding(BindingId id) {
-    auto it = bindings_.find(id);
-    if (it == bindings_.end())
-      return false;
-    bindings_.erase(it);
-    return true;
-  }
-
-  // Returns a proxy bound to one end of a pipe whose other end is bound to
-  // |this|. If |id_storage| is not null, |*id_storage| will be set to the ID
-  // of the added binding.
-  ProxyType CreateInterfacePtrAndBind(ImplPointerType impl,
-                                      BindingId* id_storage = nullptr) {
-    ProxyType proxy;
-    BindingId id = AddBinding(std::move(impl), Traits::MakeRequest(&proxy));
-    if (id_storage)
-      *id_storage = id;
-    return proxy;
-  }
-
-  void CloseAllBindings() { bindings_.clear(); }
-
-  bool empty() const { return bindings_.empty(); }
-
-  // Implementations may call this when processing a dispatched message or
-  // error. During the extent of message or error dispatch, this will return the
-  // context associated with the specific binding which received the message or
-  // error. Use AddBinding() to associated a context with a specific binding.
-  const Context& dispatch_context() const {
-    static_assert(ContextTraits::SupportsContext(),
-                  "dispatch_context() requires non-void context type.");
-    DCHECK(dispatch_context_);
-    return *dispatch_context_;
-  }
-
-  void FlushForTesting() {
-    for (auto& binding : bindings_)
-      binding.second->FlushForTesting();
-  }
-
- private:
-  friend class Entry;
-
-  class Entry {
-   public:
-    Entry(ImplPointerType impl,
-          RequestType request,
-          BindingSetBase* binding_set,
-          BindingId binding_id,
-          Context context)
-        : binding_(std::move(impl), std::move(request)),
-          binding_set_(binding_set),
-          binding_id_(binding_id),
-          context_(std::move(context)) {
-      if (ContextTraits::SupportsContext())
-        binding_.AddFilter(base::MakeUnique<DispatchFilter>(this));
-      binding_.set_connection_error_with_reason_handler(
-          base::Bind(&Entry::OnConnectionError, base::Unretained(this)));
-    }
-
-    void FlushForTesting() { binding_.FlushForTesting(); }
-
-   private:
-    class DispatchFilter : public MessageReceiver {
-     public:
-      explicit DispatchFilter(Entry* entry) : entry_(entry) {}
-      ~DispatchFilter() override {}
-
-     private:
-      // MessageReceiver:
-      bool Accept(Message* message) override {
-        entry_->WillDispatch();
-        return true;
-      }
-
-      Entry* entry_;
-
-      DISALLOW_COPY_AND_ASSIGN(DispatchFilter);
-    };
-
-    void WillDispatch() {
-      DCHECK(ContextTraits::SupportsContext());
-      binding_set_->SetDispatchContext(&context_);
-    }
-
-    void OnConnectionError(uint32_t custom_reason,
-                           const std::string& description) {
-      if (ContextTraits::SupportsContext())
-        WillDispatch();
-      binding_set_->OnConnectionError(binding_id_, custom_reason, description);
-    }
-
-    BindingType binding_;
-    BindingSetBase* const binding_set_;
-    const BindingId binding_id_;
-    Context const context_;
-
-    DISALLOW_COPY_AND_ASSIGN(Entry);
-  };
-
-  void SetDispatchContext(const Context* context) {
-    DCHECK(ContextTraits::SupportsContext());
-    dispatch_context_ = context;
-    if (!pre_dispatch_handler_.is_null())
-      pre_dispatch_handler_.Run(*context);
-  }
-
-  BindingId AddBindingImpl(ImplPointerType impl,
-                           RequestType request,
-                           Context context) {
-    BindingId id = next_binding_id_++;
-    DCHECK_GE(next_binding_id_, 0u);
-    auto entry = base::MakeUnique<Entry>(std::move(impl), std::move(request),
-                                         this, id, std::move(context));
-    bindings_.insert(std::make_pair(id, std::move(entry)));
-    return id;
-  }
-
-  void OnConnectionError(BindingId id,
-                         uint32_t custom_reason,
-                         const std::string& description) {
-    auto it = bindings_.find(id);
-    DCHECK(it != bindings_.end());
-
-    // We keep the Entry alive throughout error dispatch.
-    std::unique_ptr<Entry> entry = std::move(it->second);
-    bindings_.erase(it);
-
-    if (!error_handler_.is_null())
-      error_handler_.Run();
-    else if (!error_with_reason_handler_.is_null())
-      error_with_reason_handler_.Run(custom_reason, description);
-  }
-
-  base::Closure error_handler_;
-  ConnectionErrorWithReasonCallback error_with_reason_handler_;
-  PreDispatchCallback pre_dispatch_handler_;
-  BindingId next_binding_id_ = 0;
-  std::map<BindingId, std::unique_ptr<Entry>> bindings_;
-  const Context* dispatch_context_ = nullptr;
-
-  DISALLOW_COPY_AND_ASSIGN(BindingSetBase);
-};
-
-template <typename Interface, typename ContextType = void>
-using BindingSet = BindingSetBase<Interface, Binding<Interface>, ContextType>;
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_BINDING_SET_H_
diff --git a/mojo/public/cpp/bindings/bindings_export.h b/mojo/public/cpp/bindings/bindings_export.h
deleted file mode 100644
index 9fd7a27..0000000
--- a/mojo/public/cpp/bindings/bindings_export.h
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_BINDINGS_EXPORT_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_BINDINGS_EXPORT_H_
-
-#if defined(COMPONENT_BUILD)
-
-#if defined(WIN32)
-
-#if defined(MOJO_CPP_BINDINGS_IMPLEMENTATION)
-#define MOJO_CPP_BINDINGS_EXPORT __declspec(dllexport)
-#else
-#define MOJO_CPP_BINDINGS_EXPORT __declspec(dllimport)
-#endif
-
-#else  // !defined(WIN32)
-
-#if defined(MOJO_CPP_BINDINGS_IMPLEMENTATION)
-#define MOJO_CPP_BINDINGS_EXPORT __attribute((visibility("default")))
-#else
-#define MOJO_CPP_BINDINGS_EXPORT
-#endif
-
-#endif  // defined(WIN32)
-
-#else  // !defined(COMPONENT_BUILD)
-
-#define MOJO_CPP_BINDINGS_EXPORT
-
-#endif  // defined(COMPONENT_BUILD)
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_BINDINGS_EXPORT_H_
diff --git a/mojo/public/cpp/bindings/clone_traits.h b/mojo/public/cpp/bindings/clone_traits.h
deleted file mode 100644
index 203ab34..0000000
--- a/mojo/public/cpp/bindings/clone_traits.h
+++ /dev/null
@@ -1,86 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_CLONE_TRAITS_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_CLONE_TRAITS_H_
-
-#include <type_traits>
-#include <unordered_map>
-#include <vector>
-
-#include "base/optional.h"
-#include "mojo/public/cpp/bindings/lib/template_util.h"
-
-namespace mojo {
-
-template <typename T>
-struct HasCloneMethod {
-  template <typename U>
-  static char Test(decltype(&U::Clone));
-  template <typename U>
-  static int Test(...);
-  static const bool value = sizeof(Test<T>(0)) == sizeof(char);
-
- private:
-  internal::EnsureTypeIsComplete<T> check_t_;
-};
-
-template <typename T, bool has_clone_method = HasCloneMethod<T>::value>
-struct CloneTraits;
-
-template <typename T>
-T Clone(const T& input);
-
-template <typename T>
-struct CloneTraits<T, true> {
-  static T Clone(const T& input) { return input.Clone(); }
-};
-
-template <typename T>
-struct CloneTraits<T, false> {
-  static T Clone(const T& input) { return input; }
-};
-
-template <typename T>
-struct CloneTraits<base::Optional<T>, false> {
-  static base::Optional<T> Clone(const base::Optional<T>& input) {
-    if (!input)
-      return base::nullopt;
-
-    return base::Optional<T>(mojo::Clone(*input));
-  }
-};
-
-template <typename T>
-struct CloneTraits<std::vector<T>, false> {
-  static std::vector<T> Clone(const std::vector<T>& input) {
-    std::vector<T> result;
-    result.reserve(input.size());
-    for (const auto& element : input)
-      result.push_back(mojo::Clone(element));
-
-    return result;
-  }
-};
-
-template <typename K, typename V>
-struct CloneTraits<std::unordered_map<K, V>, false> {
-  static std::unordered_map<K, V> Clone(const std::unordered_map<K, V>& input) {
-    std::unordered_map<K, V> result;
-    for (const auto& element : input) {
-      result.insert(std::make_pair(mojo::Clone(element.first),
-                                   mojo::Clone(element.second)));
-    }
-    return result;
-  }
-};
-
-template <typename T>
-T Clone(const T& input) {
-  return CloneTraits<T>::Clone(input);
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_CLONE_TRAITS_H_
diff --git a/mojo/public/cpp/bindings/connection_error_callback.h b/mojo/public/cpp/bindings/connection_error_callback.h
deleted file mode 100644
index 306e99e..0000000
--- a/mojo/public/cpp/bindings/connection_error_callback.h
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_CONNECTION_ERROR_CALLBACK_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_CONNECTION_ERROR_CALLBACK_H_
-
-#include "base/callback.h"
-
-namespace mojo {
-
-// This callback type accepts user-defined disconnect reason and description. If
-// the other side specifies a reason on closing the connection, it will be
-// passed to the error handler.
-using ConnectionErrorWithReasonCallback =
-    base::Callback<void(uint32_t /* custom_reason */,
-                        const std::string& /* description */)>;
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_CONNECTION_ERROR_CALLBACK_H_
diff --git a/mojo/public/cpp/bindings/connector.h b/mojo/public/cpp/bindings/connector.h
deleted file mode 100644
index cb065c1..0000000
--- a/mojo/public/cpp/bindings/connector.h
+++ /dev/null
@@ -1,241 +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 MOJO_PUBLIC_CPP_BINDINGS_CONNECTOR_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_CONNECTOR_H_
-
-#include <memory>
-
-#include "base/callback.h"
-#include "base/compiler_specific.h"
-#include "base/memory/ref_counted.h"
-#include "base/memory/weak_ptr.h"
-#include "base/optional.h"
-#include "base/single_thread_task_runner.h"
-#include "base/threading/thread_checker.h"
-#include "mojo/public/cpp/bindings/bindings_export.h"
-#include "mojo/public/cpp/bindings/message.h"
-#include "mojo/public/cpp/bindings/sync_handle_watcher.h"
-#include "mojo/public/cpp/system/core.h"
-#include "mojo/public/cpp/system/simple_watcher.h"
-
-namespace base {
-class Lock;
-}
-
-namespace mojo {
-
-// The Connector class is responsible for performing read/write operations on a
-// MessagePipe. It writes messages it receives through the MessageReceiver
-// interface that it subclasses, and it forwards messages it reads through the
-// MessageReceiver interface assigned as its incoming receiver.
-//
-// NOTE:
-//   - MessagePipe I/O is non-blocking.
-//   - Sending messages can be configured to be thread safe (please see comments
-//     of the constructor). Other than that, the object should only be accessed
-//     on the creating thread.
-class MOJO_CPP_BINDINGS_EXPORT Connector
-    : NON_EXPORTED_BASE(public MessageReceiver) {
- public:
-  enum ConnectorConfig {
-    // Connector::Accept() is only called from a single thread.
-    SINGLE_THREADED_SEND,
-    // Connector::Accept() is allowed to be called from multiple threads.
-    MULTI_THREADED_SEND
-  };
-
-  // The Connector takes ownership of |message_pipe|.
-  Connector(ScopedMessagePipeHandle message_pipe,
-            ConnectorConfig config,
-            scoped_refptr<base::SingleThreadTaskRunner> runner);
-  ~Connector() override;
-
-  // Sets the receiver to handle messages read from the message pipe.  The
-  // Connector will read messages from the pipe regardless of whether or not an
-  // incoming receiver has been set.
-  void set_incoming_receiver(MessageReceiver* receiver) {
-    DCHECK(thread_checker_.CalledOnValidThread());
-    incoming_receiver_ = receiver;
-  }
-
-  // Errors from incoming receivers will force the connector into an error
-  // state, where no more messages will be processed. This method is used
-  // during testing to prevent that from happening.
-  void set_enforce_errors_from_incoming_receiver(bool enforce) {
-    DCHECK(thread_checker_.CalledOnValidThread());
-    enforce_errors_from_incoming_receiver_ = enforce;
-  }
-
-  // Sets the error handler to receive notifications when an error is
-  // encountered while reading from the pipe or waiting to read from the pipe.
-  void set_connection_error_handler(const base::Closure& error_handler) {
-    DCHECK(thread_checker_.CalledOnValidThread());
-    connection_error_handler_ = error_handler;
-  }
-
-  // Returns true if an error was encountered while reading from the pipe or
-  // waiting to read from the pipe.
-  bool encountered_error() const {
-    DCHECK(thread_checker_.CalledOnValidThread());
-    return error_;
-  }
-
-  // Closes the pipe. The connector is put into a quiescent state.
-  //
-  // Please note that this method shouldn't be called unless it results from an
-  // explicit request of the user of bindings (e.g., the user sets an
-  // InterfacePtr to null or closes a Binding).
-  void CloseMessagePipe();
-
-  // Releases the pipe. Connector is put into a quiescent state.
-  ScopedMessagePipeHandle PassMessagePipe();
-
-  // Enters the error state. The upper layer may do this for unrecoverable
-  // issues such as invalid messages are received. If a connection error handler
-  // has been set, it will be called asynchronously.
-  //
-  // It is a no-op if the connector is already in the error state or there isn't
-  // a bound message pipe. Otherwise, it closes the message pipe, which notifies
-  // the other end and also prevents potential danger (say, the caller raises
-  // an error because it believes the other end is malicious). In order to
-  // appear to the user that the connector still binds to a message pipe, it
-  // creates a new message pipe, closes one end and binds to the other.
-  void RaiseError();
-
-  // Is the connector bound to a MessagePipe handle?
-  bool is_valid() const {
-    DCHECK(thread_checker_.CalledOnValidThread());
-    return message_pipe_.is_valid();
-  }
-
-  // Waits for the next message on the pipe, blocking until one arrives,
-  // |deadline| elapses, or an error happens. Returns |true| if a message has
-  // been delivered, |false| otherwise.
-  bool WaitForIncomingMessage(MojoDeadline deadline);
-
-  // See Binding for details of pause/resume.
-  void PauseIncomingMethodCallProcessing();
-  void ResumeIncomingMethodCallProcessing();
-
-  // MessageReceiver implementation:
-  bool Accept(Message* message) override;
-
-  MessagePipeHandle handle() const {
-    DCHECK(thread_checker_.CalledOnValidThread());
-    return message_pipe_.get();
-  }
-
-  // Allows |message_pipe_| to be watched while others perform sync handle
-  // watching on the same thread. Please see comments of
-  // SyncHandleWatcher::AllowWokenUpBySyncWatchOnSameThread().
-  void AllowWokenUpBySyncWatchOnSameThread();
-
-  // Watches |message_pipe_| (as well as other handles registered to be watched
-  // together) synchronously.
-  // This method:
-  //   - returns true when |should_stop| is set to true;
-  //   - return false when any error occurs, including |message_pipe_| being
-  //     closed.
-  bool SyncWatch(const bool* should_stop);
-
-  // Whether currently the control flow is inside the sync handle watcher
-  // callback.
-  // It always returns false after CloseMessagePipe()/PassMessagePipe().
-  bool during_sync_handle_watcher_callback() const {
-    return sync_handle_watcher_callback_count_ > 0;
-  }
-
-  base::SingleThreadTaskRunner* task_runner() const {
-    return task_runner_.get();
-  }
-
-  // Sets the tag used by the heap profiler.
-  // |tag| must be a const string literal.
-  void SetWatcherHeapProfilerTag(const char* tag);
-
- private:
-  class ActiveDispatchTracker;
-  class MessageLoopNestingObserver;
-
-  // Callback of mojo::SimpleWatcher.
-  void OnWatcherHandleReady(MojoResult result);
-  // Callback of SyncHandleWatcher.
-  void OnSyncHandleWatcherHandleReady(MojoResult result);
-  void OnHandleReadyInternal(MojoResult result);
-
-  void WaitToReadMore();
-
-  // Returns false if it is impossible to receive more messages in the future.
-  // |this| may have been destroyed in that case.
-  WARN_UNUSED_RESULT bool ReadSingleMessage(MojoResult* read_result);
-
-  // |this| can be destroyed during message dispatch.
-  void ReadAllAvailableMessages();
-
-  // If |force_pipe_reset| is true, this method replaces the existing
-  // |message_pipe_| with a dummy message pipe handle (whose peer is closed).
-  // If |force_async_handler| is true, |connection_error_handler_| is called
-  // asynchronously.
-  void HandleError(bool force_pipe_reset, bool force_async_handler);
-
-  // Cancels any calls made to |waiter_|.
-  void CancelWait();
-
-  void EnsureSyncWatcherExists();
-
-  base::Closure connection_error_handler_;
-
-  ScopedMessagePipeHandle message_pipe_;
-  MessageReceiver* incoming_receiver_ = nullptr;
-
-  scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
-  std::unique_ptr<SimpleWatcher> handle_watcher_;
-
-  bool error_ = false;
-  bool drop_writes_ = false;
-  bool enforce_errors_from_incoming_receiver_ = true;
-
-  bool paused_ = false;
-
-  // If sending messages is allowed from multiple threads, |lock_| is used to
-  // protect modifications to |message_pipe_| and |drop_writes_|.
-  base::Optional<base::Lock> lock_;
-
-  std::unique_ptr<SyncHandleWatcher> sync_watcher_;
-  bool allow_woken_up_by_others_ = false;
-  // If non-zero, currently the control flow is inside the sync handle watcher
-  // callback.
-  size_t sync_handle_watcher_callback_count_ = 0;
-
-  base::ThreadChecker thread_checker_;
-
-  base::Lock connected_lock_;
-  bool connected_ = true;
-
-  // The tag used to track heap allocations that originated from a Watcher
-  // notification.
-  const char* heap_profiler_tag_ = nullptr;
-
-  // A cached pointer to the MessageLoopNestingObserver for the MessageLoop on
-  // which this Connector was created.
-  MessageLoopNestingObserver* const nesting_observer_;
-
-  // |true| iff the Connector is currently dispatching a message. Used to detect
-  // nested dispatch operations.
-  bool is_dispatching_ = false;
-
-  // Create a single weak ptr and use it everywhere, to avoid the malloc/free
-  // cost of creating a new weak ptr whenever it is needed.
-  // NOTE: This weak pointer is invalidated when the message pipe is closed or
-  // transferred (i.e., when |connected_| is set to false).
-  base::WeakPtr<Connector> weak_self_;
-  base::WeakPtrFactory<Connector> weak_factory_;
-
-  DISALLOW_COPY_AND_ASSIGN(Connector);
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_CONNECTOR_H_
diff --git a/mojo/public/cpp/bindings/disconnect_reason.h b/mojo/public/cpp/bindings/disconnect_reason.h
deleted file mode 100644
index c04e8ad..0000000
--- a/mojo/public/cpp/bindings/disconnect_reason.h
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_DISCONNECT_REASON_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_DISCONNECT_REASON_H_
-
-#include <stdint.h>
-
-#include <string>
-
-namespace mojo {
-
-struct DisconnectReason {
- public:
-  DisconnectReason(uint32_t in_custom_reason, const std::string& in_description)
-      : custom_reason(in_custom_reason), description(in_description) {}
-
-  uint32_t custom_reason;
-  std::string description;
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_DISCONNECT_REASON_H_
diff --git a/mojo/public/cpp/bindings/enum_traits.h b/mojo/public/cpp/bindings/enum_traits.h
deleted file mode 100644
index 2c528f3..0000000
--- a/mojo/public/cpp/bindings/enum_traits.h
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_ENUM_TRAITS_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_ENUM_TRAITS_H_
-
-namespace mojo {
-
-// This must be specialized for any type |T| to be serialized/deserialized as a
-// mojom enum |MojomType|. Each specialization needs to implement:
-//
-//   template <>
-//   struct EnumTraits<MojomType, T> {
-//     static MojomType ToMojom(T input);
-//
-//     // Returning false results in deserialization failure and causes the
-//     // message pipe receiving it to be disconnected.
-//     static bool FromMojom(MojomType input, T* output);
-//   };
-//
-template <typename MojomType, typename T>
-struct EnumTraits;
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_ENUM_TRAITS_H_
diff --git a/mojo/public/cpp/bindings/filter_chain.h b/mojo/public/cpp/bindings/filter_chain.h
deleted file mode 100644
index 1262f39..0000000
--- a/mojo/public/cpp/bindings/filter_chain.h
+++ /dev/null
@@ -1,61 +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 MOJO_PUBLIC_CPP_BINDINGS_FILTER_CHAIN_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_FILTER_CHAIN_H_
-
-#include <utility>
-#include <vector>
-
-#include "base/compiler_specific.h"
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "mojo/public/cpp/bindings/bindings_export.h"
-#include "mojo/public/cpp/bindings/message.h"
-
-namespace mojo {
-
-class MOJO_CPP_BINDINGS_EXPORT FilterChain
-    : NON_EXPORTED_BASE(public MessageReceiver) {
- public:
-  // Doesn't take ownership of |sink|. Therefore |sink| has to stay alive while
-  // this object is alive.
-  explicit FilterChain(MessageReceiver* sink = nullptr);
-
-  FilterChain(FilterChain&& other);
-  FilterChain& operator=(FilterChain&& other);
-  ~FilterChain() override;
-
-  template <typename FilterType, typename... Args>
-  inline void Append(Args&&... args);
-
-  void Append(std::unique_ptr<MessageReceiver> filter);
-
-  // Doesn't take ownership of |sink|. Therefore |sink| has to stay alive while
-  // this object is alive.
-  void SetSink(MessageReceiver* sink);
-
-  // MessageReceiver:
-  bool Accept(Message* message) override;
-
- private:
-  std::vector<std::unique_ptr<MessageReceiver>> filters_;
-
-  MessageReceiver* sink_;
-
-  DISALLOW_COPY_AND_ASSIGN(FilterChain);
-};
-
-template <typename FilterType, typename... Args>
-inline void FilterChain::Append(Args&&... args) {
-  Append(base::MakeUnique<FilterType>(std::forward<Args>(args)...));
-}
-
-template <>
-inline void FilterChain::Append<PassThroughFilter>() {
-}
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_FILTER_CHAIN_H_
diff --git a/mojo/public/cpp/bindings/interface_data_view.h b/mojo/public/cpp/bindings/interface_data_view.h
deleted file mode 100644
index ef12254..0000000
--- a/mojo/public/cpp/bindings/interface_data_view.h
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_DATA_VIEW_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_DATA_VIEW_H_
-
-namespace mojo {
-
-// They are used for type identification purpose only.
-template <typename Interface>
-class AssociatedInterfacePtrInfoDataView {};
-
-template <typename Interface>
-class AssociatedInterfaceRequestDataView {};
-
-template <typename Interface>
-class InterfacePtrDataView {};
-
-template <typename Interface>
-class InterfaceRequestDataView {};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_DATA_VIEW_H_
diff --git a/mojo/public/cpp/bindings/interface_endpoint_client.h b/mojo/public/cpp/bindings/interface_endpoint_client.h
deleted file mode 100644
index b519fe9..0000000
--- a/mojo/public/cpp/bindings/interface_endpoint_client.h
+++ /dev/null
@@ -1,193 +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 MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_ENDPOINT_CLIENT_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_ENDPOINT_CLIENT_H_
-
-#include <stdint.h>
-
-#include <map>
-#include <memory>
-
-#include "base/callback.h"
-#include "base/compiler_specific.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/memory/weak_ptr.h"
-#include "base/optional.h"
-#include "base/single_thread_task_runner.h"
-#include "base/threading/thread_checker.h"
-#include "mojo/public/cpp/bindings/bindings_export.h"
-#include "mojo/public/cpp/bindings/connection_error_callback.h"
-#include "mojo/public/cpp/bindings/disconnect_reason.h"
-#include "mojo/public/cpp/bindings/filter_chain.h"
-#include "mojo/public/cpp/bindings/lib/control_message_handler.h"
-#include "mojo/public/cpp/bindings/lib/control_message_proxy.h"
-#include "mojo/public/cpp/bindings/message.h"
-#include "mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h"
-
-namespace mojo {
-
-class AssociatedGroup;
-class InterfaceEndpointController;
-
-// InterfaceEndpointClient handles message sending and receiving of an interface
-// endpoint, either the implementation side or the client side.
-// It should only be accessed and destructed on the creating thread.
-class MOJO_CPP_BINDINGS_EXPORT InterfaceEndpointClient
-    : NON_EXPORTED_BASE(public MessageReceiverWithResponder) {
- public:
-  // |receiver| is okay to be null. If it is not null, it must outlive this
-  // object.
-  InterfaceEndpointClient(ScopedInterfaceEndpointHandle handle,
-                          MessageReceiverWithResponderStatus* receiver,
-                          std::unique_ptr<MessageReceiver> payload_validator,
-                          bool expect_sync_requests,
-                          scoped_refptr<base::SingleThreadTaskRunner> runner,
-                          uint32_t interface_version);
-  ~InterfaceEndpointClient() override;
-
-  // Sets the error handler to receive notifications when an error is
-  // encountered.
-  void set_connection_error_handler(const base::Closure& error_handler) {
-    DCHECK(thread_checker_.CalledOnValidThread());
-    error_handler_ = error_handler;
-    error_with_reason_handler_.Reset();
-  }
-
-  void set_connection_error_with_reason_handler(
-      const ConnectionErrorWithReasonCallback& error_handler) {
-    DCHECK(thread_checker_.CalledOnValidThread());
-    error_with_reason_handler_ = error_handler;
-    error_handler_.Reset();
-  }
-
-  // Returns true if an error was encountered.
-  bool encountered_error() const {
-    DCHECK(thread_checker_.CalledOnValidThread());
-    return encountered_error_;
-  }
-
-  // Returns true if this endpoint has any pending callbacks.
-  bool has_pending_responders() const {
-    DCHECK(thread_checker_.CalledOnValidThread());
-    return !async_responders_.empty() || !sync_responses_.empty();
-  }
-
-  AssociatedGroup* associated_group();
-
-  // Adds a MessageReceiver which can filter a message after validation but
-  // before dispatch.
-  void AddFilter(std::unique_ptr<MessageReceiver> filter);
-
-  // After this call the object is in an invalid state and shouldn't be reused.
-  ScopedInterfaceEndpointHandle PassHandle();
-
-  // Raises an error on the underlying message pipe. It disconnects the pipe
-  // and notifies all interfaces running on this pipe.
-  void RaiseError();
-
-  void CloseWithReason(uint32_t custom_reason, const std::string& description);
-
-  // MessageReceiverWithResponder implementation:
-  // They must only be called when the handle is not in pending association
-  // state.
-  bool Accept(Message* message) override;
-  bool AcceptWithResponder(Message* message,
-                           std::unique_ptr<MessageReceiver> responder) override;
-
-  // The following methods are called by the router. They must be called
-  // outside of the router's lock.
-
-  // NOTE: |message| must have passed message header validation.
-  bool HandleIncomingMessage(Message* message);
-  void NotifyError(const base::Optional<DisconnectReason>& reason);
-
-  // The following methods send interface control messages.
-  // They must only be called when the handle is not in pending association
-  // state.
-  void QueryVersion(const base::Callback<void(uint32_t)>& callback);
-  void RequireVersion(uint32_t version);
-  void FlushForTesting();
-
- private:
-  // Maps from the id of a response to the MessageReceiver that handles the
-  // response.
-  using AsyncResponderMap =
-      std::map<uint64_t, std::unique_ptr<MessageReceiver>>;
-
-  struct SyncResponseInfo {
-   public:
-    explicit SyncResponseInfo(bool* in_response_received);
-    ~SyncResponseInfo();
-
-    Message response;
-
-    // Points to a stack-allocated variable.
-    bool* response_received;
-
-   private:
-    DISALLOW_COPY_AND_ASSIGN(SyncResponseInfo);
-  };
-
-  using SyncResponseMap = std::map<uint64_t, std::unique_ptr<SyncResponseInfo>>;
-
-  // Used as the sink for |payload_validator_| and forwards messages to
-  // HandleValidatedMessage().
-  class HandleIncomingMessageThunk : public MessageReceiver {
-   public:
-    explicit HandleIncomingMessageThunk(InterfaceEndpointClient* owner);
-    ~HandleIncomingMessageThunk() override;
-
-    // MessageReceiver implementation:
-    bool Accept(Message* message) override;
-
-   private:
-    InterfaceEndpointClient* const owner_;
-
-    DISALLOW_COPY_AND_ASSIGN(HandleIncomingMessageThunk);
-  };
-
-  void InitControllerIfNecessary();
-
-  void OnAssociationEvent(
-      ScopedInterfaceEndpointHandle::AssociationEvent event);
-
-  bool HandleValidatedMessage(Message* message);
-
-  const bool expect_sync_requests_ = false;
-
-  ScopedInterfaceEndpointHandle handle_;
-  std::unique_ptr<AssociatedGroup> associated_group_;
-  InterfaceEndpointController* controller_ = nullptr;
-
-  MessageReceiverWithResponderStatus* const incoming_receiver_ = nullptr;
-  HandleIncomingMessageThunk thunk_;
-  FilterChain filters_;
-
-  AsyncResponderMap async_responders_;
-  SyncResponseMap sync_responses_;
-
-  uint64_t next_request_id_ = 1;
-
-  base::Closure error_handler_;
-  ConnectionErrorWithReasonCallback error_with_reason_handler_;
-  bool encountered_error_ = false;
-
-  scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
-
-  internal::ControlMessageProxy control_message_proxy_;
-  internal::ControlMessageHandler control_message_handler_;
-
-  base::ThreadChecker thread_checker_;
-
-  base::WeakPtrFactory<InterfaceEndpointClient> weak_ptr_factory_;
-
-  DISALLOW_COPY_AND_ASSIGN(InterfaceEndpointClient);
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_ENDPOINT_CLIENT_H_
diff --git a/mojo/public/cpp/bindings/interface_endpoint_controller.h b/mojo/public/cpp/bindings/interface_endpoint_controller.h
deleted file mode 100644
index 8d99d4a..0000000
--- a/mojo/public/cpp/bindings/interface_endpoint_controller.h
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_ENDPOINT_CONTROLLER_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_ENDPOINT_CONTROLLER_H_
-
-namespace mojo {
-
-class Message;
-
-// A control interface exposed by AssociatedGroupController for interface
-// endpoints.
-class InterfaceEndpointController {
- public:
-  virtual ~InterfaceEndpointController() {}
-
-  virtual bool SendMessage(Message* message) = 0;
-
-  // Allows the interface endpoint to watch for incoming sync messages while
-  // others perform sync handle watching on the same thread. Please see comments
-  // of SyncHandleWatcher::AllowWokenUpBySyncWatchOnSameThread().
-  virtual void AllowWokenUpBySyncWatchOnSameThread() = 0;
-
-  // Watches the interface endpoint for incoming sync messages. (It also watches
-  // other other handles registered to be watched together.)
-  // This method:
-  //   - returns true when |should_stop| is set to true;
-  //   - return false otherwise, including
-  //     MultiplexRouter::DetachEndpointClient() being called for the same
-  //     interface endpoint.
-  virtual bool SyncWatch(const bool* should_stop) = 0;
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_ENDPOINT_CONTROLLER_H_
diff --git a/mojo/public/cpp/bindings/interface_id.h b/mojo/public/cpp/bindings/interface_id.h
deleted file mode 100644
index 53475d6..0000000
--- a/mojo/public/cpp/bindings/interface_id.h
+++ /dev/null
@@ -1,35 +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 MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_ID_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_ID_H_
-
-#include <stdint.h>
-
-namespace mojo {
-
-// The size of the type matters because it is directly used in messages.
-using InterfaceId = uint32_t;
-
-// IDs of associated interface can be generated at both sides of the message
-// pipe. In order to avoid collision, the highest bit is used as namespace bit:
-// at the side where the client-side of the master interface lives, IDs are
-// generated with the namespace bit set to 1; at the opposite side IDs are
-// generated with the namespace bit set to 0.
-const uint32_t kInterfaceIdNamespaceMask = 0x80000000;
-
-const InterfaceId kMasterInterfaceId = 0x00000000;
-const InterfaceId kInvalidInterfaceId = 0xFFFFFFFF;
-
-inline bool IsMasterInterfaceId(InterfaceId id) {
-  return id == kMasterInterfaceId;
-}
-
-inline bool IsValidInterfaceId(InterfaceId id) {
-  return id != kInvalidInterfaceId;
-}
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_ID_H_
diff --git a/mojo/public/cpp/bindings/interface_ptr.h b/mojo/public/cpp/bindings/interface_ptr.h
deleted file mode 100644
index e88be74..0000000
--- a/mojo/public/cpp/bindings/interface_ptr.h
+++ /dev/null
@@ -1,242 +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 MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_PTR_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_PTR_H_
-
-#include <stdint.h>
-
-#include <string>
-#include <utility>
-
-#include "base/callback_forward.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/single_thread_task_runner.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "mojo/public/cpp/bindings/connection_error_callback.h"
-#include "mojo/public/cpp/bindings/interface_ptr_info.h"
-#include "mojo/public/cpp/bindings/lib/interface_ptr_state.h"
-
-namespace mojo {
-
-// A pointer to a local proxy of a remote Interface implementation. Uses a
-// message pipe to communicate with the remote implementation, and automatically
-// closes the pipe and deletes the proxy on destruction. The pointer must be
-// bound to a message pipe before the interface methods can be called.
-//
-// This class is thread hostile, as is the local proxy it manages, while bound
-// to a message pipe. All calls to this class or the proxy should be from the
-// same thread that bound it. If you need to move the proxy to a different
-// thread, extract the InterfacePtrInfo (containing just the message pipe and
-// any version information) using PassInterface(), pass it to a different
-// thread, and create and bind a new InterfacePtr from that thread. If an
-// InterfacePtr is not bound to a message pipe, it may be bound or destroyed on
-// any thread.
-template <typename Interface>
-class InterfacePtr {
- public:
-  using InterfaceType = Interface;
-  using PtrInfoType = InterfacePtrInfo<Interface>;
-
-  // Constructs an unbound InterfacePtr.
-  InterfacePtr() {}
-  InterfacePtr(decltype(nullptr)) {}
-
-  // Takes over the binding of another InterfacePtr.
-  InterfacePtr(InterfacePtr&& other) {
-    internal_state_.Swap(&other.internal_state_);
-  }
-
-  // Takes over the binding of another InterfacePtr, and closes any message pipe
-  // already bound to this pointer.
-  InterfacePtr& operator=(InterfacePtr&& other) {
-    reset();
-    internal_state_.Swap(&other.internal_state_);
-    return *this;
-  }
-
-  // Assigning nullptr to this class causes it to close the currently bound
-  // message pipe (if any) and returns the pointer to the unbound state.
-  InterfacePtr& operator=(decltype(nullptr)) {
-    reset();
-    return *this;
-  }
-
-  // Closes the bound message pipe (if any) on destruction.
-  ~InterfacePtr() {}
-
-  // Binds the InterfacePtr to a remote implementation of Interface.
-  //
-  // Calling with an invalid |info| (containing an invalid message pipe handle)
-  // has the same effect as reset(). In this case, the InterfacePtr is not
-  // considered as bound.
-  //
-  // |runner| must belong to the same thread. It will be used to dispatch all
-  // callbacks and connection error notification. It is useful when you attach
-  // multiple task runners to a single thread for the purposes of task
-  // scheduling.
-  void Bind(InterfacePtrInfo<Interface> info,
-            scoped_refptr<base::SingleThreadTaskRunner> runner =
-                base::ThreadTaskRunnerHandle::Get()) {
-    reset();
-    if (info.is_valid())
-      internal_state_.Bind(std::move(info), std::move(runner));
-  }
-
-  // Returns whether or not this InterfacePtr is bound to a message pipe.
-  bool is_bound() const { return internal_state_.is_bound(); }
-
-  // Returns a raw pointer to the local proxy. Caller does not take ownership.
-  // Note that the local proxy is thread hostile, as stated above.
-  Interface* get() const { return internal_state_.instance(); }
-
-  // Functions like a pointer to Interface. Must already be bound.
-  Interface* operator->() const { return get(); }
-  Interface& operator*() const { return *get(); }
-
-  // Returns the version number of the interface that the remote side supports.
-  uint32_t version() const { return internal_state_.version(); }
-
-  // Queries the max version that the remote side supports. On completion, the
-  // result will be returned as the input of |callback|. The version number of
-  // this interface pointer will also be updated.
-  void QueryVersion(const base::Callback<void(uint32_t)>& callback) {
-    internal_state_.QueryVersion(callback);
-  }
-
-  // If the remote side doesn't support the specified version, it will close its
-  // end of the message pipe asynchronously. This does nothing if it's already
-  // known that the remote side supports the specified version, i.e., if
-  // |version <= this->version()|.
-  //
-  // After calling RequireVersion() with a version not supported by the remote
-  // side, all subsequent calls to interface methods will be ignored.
-  void RequireVersion(uint32_t version) {
-    internal_state_.RequireVersion(version);
-  }
-
-  // Sends a no-op message on the underlying message pipe and runs the current
-  // message loop until its response is received. This can be used in tests to
-  // verify that no message was sent on a message pipe in response to some
-  // stimulus.
-  void FlushForTesting() { internal_state_.FlushForTesting(); }
-
-  // Closes the bound message pipe (if any) and returns the pointer to the
-  // unbound state.
-  void reset() {
-    State doomed;
-    internal_state_.Swap(&doomed);
-  }
-
-  // Similar to the method above, but also specifies a disconnect reason.
-  void ResetWithReason(uint32_t custom_reason, const std::string& description) {
-    if (internal_state_.is_bound())
-      internal_state_.CloseWithReason(custom_reason, description);
-    reset();
-  }
-
-  // Whether there are any associated interfaces running on the pipe currently.
-  bool HasAssociatedInterfaces() const {
-    return internal_state_.HasAssociatedInterfaces();
-  }
-
-  // Indicates whether the message pipe has encountered an error. If true,
-  // method calls made on this interface will be dropped (and may already have
-  // been dropped).
-  bool encountered_error() const { return internal_state_.encountered_error(); }
-
-  // Registers a handler to receive error notifications. The handler will be
-  // called from the thread that owns this InterfacePtr.
-  //
-  // This method may only be called after the InterfacePtr has been bound to a
-  // message pipe.
-  void set_connection_error_handler(const base::Closure& error_handler) {
-    internal_state_.set_connection_error_handler(error_handler);
-  }
-
-  void set_connection_error_with_reason_handler(
-      const ConnectionErrorWithReasonCallback& error_handler) {
-    internal_state_.set_connection_error_with_reason_handler(error_handler);
-  }
-
-  // Unbinds the InterfacePtr and returns the information which could be used
-  // to setup an InterfacePtr again. This method may be used to move the proxy
-  // to a different thread (see class comments for details).
-  //
-  // It is an error to call PassInterface() while:
-  //   - there are pending responses; or
-  //     TODO: fix this restriction, it's not always obvious when there is a
-  //     pending response.
-  //   - there are associated interfaces running.
-  //     TODO(yzshen): For now, users need to make sure there is no one holding
-  //     on to associated interface endpoint handles at both sides of the
-  //     message pipe in order to call this method. We need a way to forcefully
-  //     invalidate associated interface endpoint handles.
-  InterfacePtrInfo<Interface> PassInterface() {
-    CHECK(!HasAssociatedInterfaces());
-    CHECK(!internal_state_.has_pending_callbacks());
-    State state;
-    internal_state_.Swap(&state);
-
-    return state.PassInterface();
-  }
-
-  bool Equals(const InterfacePtr& other) const {
-    if (this == &other)
-      return true;
-
-    // Now that the two refer to different objects, they are equivalent if
-    // and only if they are both null.
-    return !(*this) && !other;
-  }
-
-  // DO NOT USE. Exposed only for internal use and for testing.
-  internal::InterfacePtrState<Interface>* internal_state() {
-    return &internal_state_;
-  }
-
-  // Allow InterfacePtr<> to be used in boolean expressions, but not
-  // implicitly convertible to a real bool (which is dangerous).
- private:
-  // TODO(dcheng): Use an explicit conversion operator.
-  typedef internal::InterfacePtrState<Interface> InterfacePtr::*Testable;
-
- public:
-  operator Testable() const {
-    return internal_state_.is_bound() ? &InterfacePtr::internal_state_
-                                      : nullptr;
-  }
-
- private:
-  // Forbid the == and != operators explicitly, otherwise InterfacePtr will be
-  // converted to Testable to do == or != comparison.
-  template <typename T>
-  bool operator==(const InterfacePtr<T>& other) const = delete;
-  template <typename T>
-  bool operator!=(const InterfacePtr<T>& other) const = delete;
-
-  typedef internal::InterfacePtrState<Interface> State;
-  mutable State internal_state_;
-
-  DISALLOW_COPY_AND_ASSIGN(InterfacePtr);
-};
-
-// If |info| is valid (containing a valid message pipe handle), returns an
-// InterfacePtr bound to it. Otherwise, returns an unbound InterfacePtr.
-template <typename Interface>
-InterfacePtr<Interface> MakeProxy(
-    InterfacePtrInfo<Interface> info,
-    scoped_refptr<base::SingleThreadTaskRunner> runner =
-        base::ThreadTaskRunnerHandle::Get()) {
-  InterfacePtr<Interface> ptr;
-  if (info.is_valid())
-    ptr.Bind(std::move(info), std::move(runner));
-  return std::move(ptr);
-}
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_PTR_H_
diff --git a/mojo/public/cpp/bindings/interface_ptr_info.h b/mojo/public/cpp/bindings/interface_ptr_info.h
deleted file mode 100644
index 0b2d808..0000000
--- a/mojo/public/cpp/bindings/interface_ptr_info.h
+++ /dev/null
@@ -1,63 +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 MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_PTR_INFO_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_PTR_INFO_H_
-
-#include <stdint.h>
-#include <utility>
-
-#include "base/macros.h"
-#include "mojo/public/cpp/system/message_pipe.h"
-
-namespace mojo {
-
-// InterfacePtrInfo stores necessary information to communicate with a remote
-// interface implementation, which could be used to construct an InterfacePtr.
-template <typename Interface>
-class InterfacePtrInfo {
- public:
-  InterfacePtrInfo() : version_(0u) {}
-
-  InterfacePtrInfo(ScopedMessagePipeHandle handle, uint32_t version)
-      : handle_(std::move(handle)), version_(version) {}
-
-  InterfacePtrInfo(InterfacePtrInfo&& other)
-      : handle_(std::move(other.handle_)), version_(other.version_) {
-    other.version_ = 0u;
-  }
-
-  ~InterfacePtrInfo() {}
-
-  InterfacePtrInfo& operator=(InterfacePtrInfo&& other) {
-    if (this != &other) {
-      handle_ = std::move(other.handle_);
-      version_ = other.version_;
-      other.version_ = 0u;
-    }
-
-    return *this;
-  }
-
-  bool is_valid() const { return handle_.is_valid(); }
-
-  ScopedMessagePipeHandle PassHandle() { return std::move(handle_); }
-  const ScopedMessagePipeHandle& handle() const { return handle_; }
-  void set_handle(ScopedMessagePipeHandle handle) {
-    handle_ = std::move(handle);
-  }
-
-  uint32_t version() const { return version_; }
-  void set_version(uint32_t version) { version_ = version; }
-
- private:
-  ScopedMessagePipeHandle handle_;
-  uint32_t version_;
-
-  DISALLOW_COPY_AND_ASSIGN(InterfacePtrInfo);
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_PTR_INFO_H_
diff --git a/mojo/public/cpp/bindings/interface_ptr_set.h b/mojo/public/cpp/bindings/interface_ptr_set.h
deleted file mode 100644
index 09a2682..0000000
--- a/mojo/public/cpp/bindings/interface_ptr_set.h
+++ /dev/null
@@ -1,107 +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 MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_PTR_SET_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_PTR_SET_H_
-
-#include <utility>
-#include <vector>
-
-#include "base/macros.h"
-#include "base/memory/weak_ptr.h"
-#include "mojo/public/cpp/bindings/associated_interface_ptr.h"
-#include "mojo/public/cpp/bindings/interface_ptr.h"
-
-namespace mojo {
-namespace internal {
-
-// TODO(blundell): This class should be rewritten to be structured
-// similarly to BindingSet if possible, with PtrSet owning its
-// Elements and those Elements calling back into PtrSet on connection
-// error.
-template <typename Interface, template <typename> class Ptr>
-class PtrSet {
- public:
-  PtrSet() {}
-  ~PtrSet() { CloseAll(); }
-
-  void AddPtr(Ptr<Interface> ptr) {
-    auto weak_interface_ptr = new Element(std::move(ptr));
-    ptrs_.push_back(weak_interface_ptr->GetWeakPtr());
-    ClearNullPtrs();
-  }
-
-  template <typename FunctionType>
-  void ForAllPtrs(FunctionType function) {
-    for (const auto& it : ptrs_) {
-      if (it)
-        function(it->get());
-    }
-    ClearNullPtrs();
-  }
-
-  void CloseAll() {
-    for (const auto& it : ptrs_) {
-      if (it)
-        it->Close();
-    }
-    ptrs_.clear();
-  }
-
- private:
-  class Element {
-   public:
-    explicit Element(Ptr<Interface> ptr)
-        : ptr_(std::move(ptr)), weak_ptr_factory_(this) {
-      ptr_.set_connection_error_handler(base::Bind(&DeleteElement, this));
-    }
-
-    ~Element() {}
-
-    void Close() {
-      ptr_.reset();
-
-      // Resetting the interface ptr means that it won't call this object back
-      // on connection error anymore, so this object must delete itself now.
-      DeleteElement(this);
-    }
-
-    Interface* get() { return ptr_.get(); }
-
-    base::WeakPtr<Element> GetWeakPtr() {
-      return weak_ptr_factory_.GetWeakPtr();
-    }
-
-   private:
-    static void DeleteElement(Element* element) { delete element; }
-
-    Ptr<Interface> ptr_;
-    base::WeakPtrFactory<Element> weak_ptr_factory_;
-
-    DISALLOW_COPY_AND_ASSIGN(Element);
-  };
-
-  void ClearNullPtrs() {
-    ptrs_.erase(std::remove_if(ptrs_.begin(), ptrs_.end(),
-                               [](const base::WeakPtr<Element>& p) {
-                                 return p.get() == nullptr;
-                               }),
-                ptrs_.end());
-  }
-
-  std::vector<base::WeakPtr<Element>> ptrs_;
-};
-
-}  // namespace internal
-
-template <typename Interface>
-using InterfacePtrSet = internal::PtrSet<Interface, InterfacePtr>;
-
-template <typename Interface>
-using AssociatedInterfacePtrSet =
-    internal::PtrSet<Interface, AssociatedInterfacePtr>;
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_PTR_SET_H_
diff --git a/mojo/public/cpp/bindings/interface_request.h b/mojo/public/cpp/bindings/interface_request.h
deleted file mode 100644
index 29d8836..0000000
--- a/mojo/public/cpp/bindings/interface_request.h
+++ /dev/null
@@ -1,178 +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 MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_REQUEST_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_REQUEST_H_
-
-#include <string>
-#include <utility>
-
-#include "base/macros.h"
-#include "base/optional.h"
-#include "base/single_thread_task_runner.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "mojo/public/cpp/bindings/disconnect_reason.h"
-#include "mojo/public/cpp/bindings/interface_ptr.h"
-#include "mojo/public/cpp/bindings/pipe_control_message_proxy.h"
-#include "mojo/public/cpp/system/message_pipe.h"
-
-namespace mojo {
-
-// Represents a request from a remote client for an implementation of Interface
-// over a specified message pipe. The implementor of the interface should
-// remove the message pipe by calling PassMessagePipe() and bind it to the
-// implementation. If this is not done, the InterfaceRequest will automatically
-// close the pipe on destruction. Can also represent the absence of a request
-// if the client did not provide a message pipe.
-template <typename Interface>
-class InterfaceRequest {
- public:
-  // Constructs an empty InterfaceRequest, representing that the client is not
-  // requesting an implementation of Interface.
-  InterfaceRequest() {}
-  InterfaceRequest(decltype(nullptr)) {}
-
-  // Creates a new message pipe over which Interface is to be served, binding
-  // the specified InterfacePtr to one end of the message pipe and this
-  // InterfaceRequest to the other. For example usage, see comments on
-  // MakeRequest(InterfacePtr*) below.
-  explicit InterfaceRequest(InterfacePtr<Interface>* ptr,
-                            scoped_refptr<base::SingleThreadTaskRunner> runner =
-                                base::ThreadTaskRunnerHandle::Get()) {
-    MessagePipe pipe;
-    ptr->Bind(InterfacePtrInfo<Interface>(std::move(pipe.handle0), 0u),
-              std::move(runner));
-    Bind(std::move(pipe.handle1));
-  }
-
-  // Takes the message pipe from another InterfaceRequest.
-  InterfaceRequest(InterfaceRequest&& other) {
-    handle_ = std::move(other.handle_);
-  }
-  InterfaceRequest& operator=(InterfaceRequest&& other) {
-    handle_ = std::move(other.handle_);
-    return *this;
-  }
-
-  // Assigning to nullptr resets the InterfaceRequest to an empty state,
-  // closing the message pipe currently bound to it (if any).
-  InterfaceRequest& operator=(decltype(nullptr)) {
-    handle_.reset();
-    return *this;
-  }
-
-  // Binds the request to a message pipe over which Interface is to be
-  // requested.  If the request is already bound to a message pipe, the current
-  // message pipe will be closed.
-  void Bind(ScopedMessagePipeHandle handle) { handle_ = std::move(handle); }
-
-  // Indicates whether the request currently contains a valid message pipe.
-  bool is_pending() const { return handle_.is_valid(); }
-
-  // Removes the message pipe from the request and returns it.
-  ScopedMessagePipeHandle PassMessagePipe() { return std::move(handle_); }
-
-  bool Equals(const InterfaceRequest& other) const {
-    if (this == &other)
-      return true;
-
-    // Now that the two refer to different objects, they are equivalent if
-    // and only if they are both invalid.
-    return !is_pending() && !other.is_pending();
-  }
-
-  void ResetWithReason(uint32_t custom_reason, const std::string& description) {
-    if (!handle_.is_valid())
-      return;
-
-    Message message =
-        PipeControlMessageProxy::ConstructPeerEndpointClosedMessage(
-            kMasterInterfaceId, DisconnectReason(custom_reason, description));
-    MojoResult result = WriteMessageNew(
-        handle_.get(), message.TakeMojoMessage(), MOJO_WRITE_MESSAGE_FLAG_NONE);
-    DCHECK_EQ(MOJO_RESULT_OK, result);
-
-    handle_.reset();
-  }
-
- private:
-  ScopedMessagePipeHandle handle_;
-
-  DISALLOW_COPY_AND_ASSIGN(InterfaceRequest);
-};
-
-// Makes an InterfaceRequest bound to the specified message pipe. If |handle|
-// is empty or invalid, the resulting InterfaceRequest will represent the
-// absence of a request.
-template <typename Interface>
-InterfaceRequest<Interface> MakeRequest(ScopedMessagePipeHandle handle) {
-  InterfaceRequest<Interface> request;
-  request.Bind(std::move(handle));
-  return std::move(request);
-}
-
-// Creates a new message pipe over which Interface is to be served. Binds the
-// specified InterfacePtr to one end of the message pipe, and returns an
-// InterfaceRequest bound to the other. The InterfacePtr should be passed to
-// the client, and the InterfaceRequest should be passed to whatever will
-// provide the implementation. The implementation should typically be bound to
-// the InterfaceRequest using the Binding or StrongBinding classes. The client
-// may begin to issue calls even before an implementation has been bound, since
-// messages sent over the pipe will just queue up until they are consumed by
-// the implementation.
-//
-// Example #1: Requesting a remote implementation of an interface.
-// ===============================================================
-//
-// Given the following interface:
-//
-//   interface Database {
-//     OpenTable(Table& table);
-//   }
-//
-// The client would have code similar to the following:
-//
-//   DatabasePtr database = ...;  // Connect to database.
-//   TablePtr table;
-//   database->OpenTable(MakeRequest(&table));
-//
-// Upon return from MakeRequest, |table| is ready to have methods called on it.
-//
-// Example #2: Registering a local implementation with a remote service.
-// =====================================================================
-//
-// Given the following interface
-//   interface Collector {
-//     RegisterSource(Source source);
-//   }
-//
-// The client would have code similar to the following:
-//
-//   CollectorPtr collector = ...;  // Connect to Collector.
-//   SourcePtr source;
-//   InterfaceRequest<Source> source_request(&source);
-//   collector->RegisterSource(std::move(source));
-//   CreateSource(std::move(source_request));  // Create implementation locally.
-//
-template <typename Interface>
-InterfaceRequest<Interface> MakeRequest(
-    InterfacePtr<Interface>* ptr,
-    scoped_refptr<base::SingleThreadTaskRunner> runner =
-        base::ThreadTaskRunnerHandle::Get()) {
-  return InterfaceRequest<Interface>(ptr, runner);
-}
-
-// Fuses an InterfaceRequest<T> endpoint with an InterfacePtrInfo<T> endpoint.
-// Returns |true| on success or |false| on failure.
-template <typename Interface>
-bool FuseInterface(InterfaceRequest<Interface> request,
-                   InterfacePtrInfo<Interface> proxy_info) {
-  MojoResult result = FuseMessagePipes(request.PassMessagePipe(),
-                                       proxy_info.PassHandle());
-  return result == MOJO_RESULT_OK;
-}
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_REQUEST_H_
diff --git a/mojo/public/cpp/bindings/lib/array_internal.cc b/mojo/public/cpp/bindings/lib/array_internal.cc
deleted file mode 100644
index dd24eac..0000000
--- a/mojo/public/cpp/bindings/lib/array_internal.cc
+++ /dev/null
@@ -1,59 +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 "mojo/public/cpp/bindings/lib/array_internal.h"
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <sstream>
-
-namespace mojo {
-namespace internal {
-
-std::string MakeMessageWithArrayIndex(const char* message,
-                                      size_t size,
-                                      size_t index) {
-  std::ostringstream stream;
-  stream << message << ": array size - " << size << "; index - " << index;
-  return stream.str();
-}
-
-std::string MakeMessageWithExpectedArraySize(const char* message,
-                                             size_t size,
-                                             size_t expected_size) {
-  std::ostringstream stream;
-  stream << message << ": array size - " << size << "; expected size - "
-         << expected_size;
-  return stream.str();
-}
-
-ArrayDataTraits<bool>::BitRef::~BitRef() {
-}
-
-ArrayDataTraits<bool>::BitRef::BitRef(uint8_t* storage, uint8_t mask)
-    : storage_(storage), mask_(mask) {
-}
-
-ArrayDataTraits<bool>::BitRef& ArrayDataTraits<bool>::BitRef::operator=(
-    bool value) {
-  if (value) {
-    *storage_ |= mask_;
-  } else {
-    *storage_ &= ~mask_;
-  }
-  return *this;
-}
-
-ArrayDataTraits<bool>::BitRef& ArrayDataTraits<bool>::BitRef::operator=(
-    const BitRef& value) {
-  return (*this) = static_cast<bool>(value);
-}
-
-ArrayDataTraits<bool>::BitRef::operator bool() const {
-  return (*storage_ & mask_) != 0;
-}
-
-}  // namespace internal
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/array_internal.h b/mojo/public/cpp/bindings/lib/array_internal.h
deleted file mode 100644
index eecfcfb..0000000
--- a/mojo/public/cpp/bindings/lib/array_internal.h
+++ /dev/null
@@ -1,368 +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 MOJO_PUBLIC_CPP_BINDINGS_LIB_ARRAY_INTERNAL_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_ARRAY_INTERNAL_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <limits>
-#include <new>
-
-#include "base/logging.h"
-#include "mojo/public/c/system/macros.h"
-#include "mojo/public/cpp/bindings/bindings_export.h"
-#include "mojo/public/cpp/bindings/lib/bindings_internal.h"
-#include "mojo/public/cpp/bindings/lib/buffer.h"
-#include "mojo/public/cpp/bindings/lib/serialization_util.h"
-#include "mojo/public/cpp/bindings/lib/template_util.h"
-#include "mojo/public/cpp/bindings/lib/validate_params.h"
-#include "mojo/public/cpp/bindings/lib/validation_context.h"
-#include "mojo/public/cpp/bindings/lib/validation_errors.h"
-#include "mojo/public/cpp/bindings/lib/validation_util.h"
-
-namespace mojo {
-namespace internal {
-
-template <typename K, typename V>
-class Map_Data;
-
-MOJO_CPP_BINDINGS_EXPORT std::string
-MakeMessageWithArrayIndex(const char* message, size_t size, size_t index);
-
-MOJO_CPP_BINDINGS_EXPORT std::string MakeMessageWithExpectedArraySize(
-    const char* message,
-    size_t size,
-    size_t expected_size);
-
-template <typename T>
-struct ArrayDataTraits {
-  using StorageType = T;
-  using Ref = T&;
-  using ConstRef = const T&;
-
-  static const uint32_t kMaxNumElements =
-      (std::numeric_limits<uint32_t>::max() - sizeof(ArrayHeader)) /
-      sizeof(StorageType);
-
-  static uint32_t GetStorageSize(uint32_t num_elements) {
-    DCHECK(num_elements <= kMaxNumElements);
-    return sizeof(ArrayHeader) + sizeof(StorageType) * num_elements;
-  }
-  static Ref ToRef(StorageType* storage, size_t offset) {
-    return storage[offset];
-  }
-  static ConstRef ToConstRef(const StorageType* storage, size_t offset) {
-    return storage[offset];
-  }
-};
-
-// Specialization of Arrays for bools, optimized for space. It has the
-// following differences from a generalized Array:
-// * Each element takes up a single bit of memory.
-// * Accessing a non-const single element uses a helper class |BitRef|, which
-// emulates a reference to a bool.
-template <>
-struct ArrayDataTraits<bool> {
-  // Helper class to emulate a reference to a bool, used for direct element
-  // access.
-  class MOJO_CPP_BINDINGS_EXPORT BitRef {
-   public:
-    ~BitRef();
-    BitRef& operator=(bool value);
-    BitRef& operator=(const BitRef& value);
-    operator bool() const;
-
-   private:
-    friend struct ArrayDataTraits<bool>;
-    BitRef(uint8_t* storage, uint8_t mask);
-    BitRef();
-    uint8_t* storage_;
-    uint8_t mask_;
-  };
-
-  // Because each element consumes only 1/8 byte.
-  static const uint32_t kMaxNumElements = std::numeric_limits<uint32_t>::max();
-
-  using StorageType = uint8_t;
-  using Ref = BitRef;
-  using ConstRef = bool;
-
-  static uint32_t GetStorageSize(uint32_t num_elements) {
-    return sizeof(ArrayHeader) + ((num_elements + 7) / 8);
-  }
-  static BitRef ToRef(StorageType* storage, size_t offset) {
-    return BitRef(&storage[offset / 8], 1 << (offset % 8));
-  }
-  static bool ToConstRef(const StorageType* storage, size_t offset) {
-    return (storage[offset / 8] & (1 << (offset % 8))) != 0;
-  }
-};
-
-// What follows is code to support the serialization/validation of
-// Array_Data<T>. There are four interesting cases: arrays of primitives,
-// arrays of handles/interfaces, arrays of objects and arrays of unions.
-// Arrays of objects are represented as arrays of pointers to objects. Arrays
-// of unions are inlined so they are not pointers, but comparing with primitives
-// they require more work for serialization/validation.
-//
-// TODO(yzshen): Validation code should be organzied in a way similar to
-// Serializer<>, or merged into it. It should be templatized with the mojo
-// data view type instead of the data type, that way we can use MojomTypeTraits
-// to determine the categories.
-
-template <typename T, bool is_union, bool is_handle_or_interface>
-struct ArraySerializationHelper;
-
-template <typename T>
-struct ArraySerializationHelper<T, false, false> {
-  using ElementType = typename ArrayDataTraits<T>::StorageType;
-
-  static bool ValidateElements(const ArrayHeader* header,
-                               const ElementType* elements,
-                               ValidationContext* validation_context,
-                               const ContainerValidateParams* validate_params) {
-    DCHECK(!validate_params->element_is_nullable)
-        << "Primitive type should be non-nullable";
-    DCHECK(!validate_params->element_validate_params)
-        << "Primitive type should not have array validate params";
-
-    if (!validate_params->validate_enum_func)
-      return true;
-
-    // Enum validation.
-    for (uint32_t i = 0; i < header->num_elements; ++i) {
-      if (!validate_params->validate_enum_func(elements[i], validation_context))
-        return false;
-    }
-    return true;
-  }
-};
-
-template <typename T>
-struct ArraySerializationHelper<T, false, true> {
-  using ElementType = typename ArrayDataTraits<T>::StorageType;
-
-  static bool ValidateElements(const ArrayHeader* header,
-                               const ElementType* elements,
-                               ValidationContext* validation_context,
-                               const ContainerValidateParams* validate_params) {
-    DCHECK(!validate_params->element_validate_params)
-        << "Handle or interface type should not have array validate params";
-
-    for (uint32_t i = 0; i < header->num_elements; ++i) {
-      if (!validate_params->element_is_nullable &&
-          !IsHandleOrInterfaceValid(elements[i])) {
-        static const ValidationError kError =
-            std::is_same<T, Interface_Data>::value ||
-                    std::is_same<T, Handle_Data>::value
-                ? VALIDATION_ERROR_UNEXPECTED_INVALID_HANDLE
-                : VALIDATION_ERROR_UNEXPECTED_INVALID_INTERFACE_ID;
-        ReportValidationError(
-            validation_context, kError,
-            MakeMessageWithArrayIndex(
-                "invalid handle or interface ID in array expecting valid "
-                "handles or interface IDs",
-                header->num_elements, i)
-                .c_str());
-        return false;
-      }
-      if (!ValidateHandleOrInterface(elements[i], validation_context))
-        return false;
-    }
-    return true;
-  }
-};
-
-template <typename T>
-struct ArraySerializationHelper<Pointer<T>, false, false> {
-  using ElementType = typename ArrayDataTraits<Pointer<T>>::StorageType;
-
-  static bool ValidateElements(const ArrayHeader* header,
-                               const ElementType* elements,
-                               ValidationContext* validation_context,
-                               const ContainerValidateParams* validate_params) {
-    for (uint32_t i = 0; i < header->num_elements; ++i) {
-      if (!validate_params->element_is_nullable && !elements[i].offset) {
-        ReportValidationError(
-            validation_context,
-            VALIDATION_ERROR_UNEXPECTED_NULL_POINTER,
-            MakeMessageWithArrayIndex("null in array expecting valid pointers",
-                                      header->num_elements,
-                                      i).c_str());
-        return false;
-      }
-      if (!ValidateCaller<T>::Run(elements[i], validation_context,
-                                  validate_params->element_validate_params)) {
-        return false;
-      }
-    }
-    return true;
-  }
-
- private:
-  template <typename U,
-            bool is_array_or_map = IsSpecializationOf<Array_Data, U>::value ||
-                                   IsSpecializationOf<Map_Data, U>::value>
-  struct ValidateCaller {
-    static bool Run(const Pointer<U>& data,
-                    ValidationContext* validation_context,
-                    const ContainerValidateParams* validate_params) {
-      DCHECK(!validate_params)
-          << "Struct type should not have array validate params";
-
-      return ValidateStruct(data, validation_context);
-    }
-  };
-
-  template <typename U>
-  struct ValidateCaller<U, true> {
-    static bool Run(const Pointer<U>& data,
-                    ValidationContext* validation_context,
-                    const ContainerValidateParams* validate_params) {
-      return ValidateContainer(data, validation_context, validate_params);
-    }
-  };
-};
-
-template <typename U>
-struct ArraySerializationHelper<U, true, false> {
-  using ElementType = typename ArrayDataTraits<U>::StorageType;
-
-  static bool ValidateElements(const ArrayHeader* header,
-                               const ElementType* elements,
-                               ValidationContext* validation_context,
-                               const ContainerValidateParams* validate_params) {
-    for (uint32_t i = 0; i < header->num_elements; ++i) {
-      if (!validate_params->element_is_nullable && elements[i].is_null()) {
-        ReportValidationError(
-            validation_context,
-            VALIDATION_ERROR_UNEXPECTED_NULL_POINTER,
-            MakeMessageWithArrayIndex("null in array expecting valid unions",
-                                      header->num_elements, i)
-                .c_str());
-        return false;
-      }
-      if (!ValidateInlinedUnion(elements[i], validation_context))
-        return false;
-    }
-    return true;
-  }
-};
-
-template <typename T>
-class Array_Data {
- public:
-  using Traits = ArrayDataTraits<T>;
-  using StorageType = typename Traits::StorageType;
-  using Ref = typename Traits::Ref;
-  using ConstRef = typename Traits::ConstRef;
-  using Helper = ArraySerializationHelper<
-      T,
-      IsUnionDataType<T>::value,
-      std::is_same<T, AssociatedInterface_Data>::value ||
-          std::is_same<T, AssociatedEndpointHandle_Data>::value ||
-          std::is_same<T, Interface_Data>::value ||
-          std::is_same<T, Handle_Data>::value>;
-  using Element = T;
-
-  // Returns null if |num_elements| or the corresponding storage size cannot be
-  // stored in uint32_t.
-  static Array_Data<T>* New(size_t num_elements, Buffer* buf) {
-    if (num_elements > Traits::kMaxNumElements)
-      return nullptr;
-
-    uint32_t num_bytes =
-        Traits::GetStorageSize(static_cast<uint32_t>(num_elements));
-    return new (buf->Allocate(num_bytes))
-        Array_Data<T>(num_bytes, static_cast<uint32_t>(num_elements));
-  }
-
-  static bool Validate(const void* data,
-                       ValidationContext* validation_context,
-                       const ContainerValidateParams* validate_params) {
-    if (!data)
-      return true;
-    if (!IsAligned(data)) {
-      ReportValidationError(validation_context,
-                            VALIDATION_ERROR_MISALIGNED_OBJECT);
-      return false;
-    }
-    if (!validation_context->IsValidRange(data, sizeof(ArrayHeader))) {
-      ReportValidationError(validation_context,
-                            VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE);
-      return false;
-    }
-    const ArrayHeader* header = static_cast<const ArrayHeader*>(data);
-    if (header->num_elements > Traits::kMaxNumElements ||
-        header->num_bytes < Traits::GetStorageSize(header->num_elements)) {
-      ReportValidationError(validation_context,
-                            VALIDATION_ERROR_UNEXPECTED_ARRAY_HEADER);
-      return false;
-    }
-    if (validate_params->expected_num_elements != 0 &&
-        header->num_elements != validate_params->expected_num_elements) {
-      ReportValidationError(
-          validation_context,
-          VALIDATION_ERROR_UNEXPECTED_ARRAY_HEADER,
-          MakeMessageWithExpectedArraySize(
-              "fixed-size array has wrong number of elements",
-              header->num_elements,
-              validate_params->expected_num_elements).c_str());
-      return false;
-    }
-    if (!validation_context->ClaimMemory(data, header->num_bytes)) {
-      ReportValidationError(validation_context,
-                            VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE);
-      return false;
-    }
-
-    const Array_Data<T>* object = static_cast<const Array_Data<T>*>(data);
-    return Helper::ValidateElements(&object->header_, object->storage(),
-                                    validation_context, validate_params);
-  }
-
-  size_t size() const { return header_.num_elements; }
-
-  Ref at(size_t offset) {
-    DCHECK(offset < static_cast<size_t>(header_.num_elements));
-    return Traits::ToRef(storage(), offset);
-  }
-
-  ConstRef at(size_t offset) const {
-    DCHECK(offset < static_cast<size_t>(header_.num_elements));
-    return Traits::ToConstRef(storage(), offset);
-  }
-
-  StorageType* storage() {
-    return reinterpret_cast<StorageType*>(reinterpret_cast<char*>(this) +
-                                          sizeof(*this));
-  }
-
-  const StorageType* storage() const {
-    return reinterpret_cast<const StorageType*>(
-        reinterpret_cast<const char*>(this) + sizeof(*this));
-  }
-
- private:
-  Array_Data(uint32_t num_bytes, uint32_t num_elements) {
-    header_.num_bytes = num_bytes;
-    header_.num_elements = num_elements;
-  }
-  ~Array_Data() = delete;
-
-  internal::ArrayHeader header_;
-
-  // Elements of type internal::ArrayDataTraits<T>::StorageType follow.
-};
-static_assert(sizeof(Array_Data<char>) == 8, "Bad sizeof(Array_Data)");
-
-// UTF-8 encoded
-using String_Data = Array_Data<char>;
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_ARRAY_INTERNAL_H_
diff --git a/mojo/public/cpp/bindings/lib/array_serialization.h b/mojo/public/cpp/bindings/lib/array_serialization.h
deleted file mode 100644
index d2f8ecf..0000000
--- a/mojo/public/cpp/bindings/lib/array_serialization.h
+++ /dev/null
@@ -1,555 +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 MOJO_PUBLIC_CPP_BINDINGS_LIB_ARRAY_SERIALIZATION_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_ARRAY_SERIALIZATION_H_
-
-#include <stddef.h>
-#include <string.h>  // For |memcpy()|.
-
-#include <limits>
-#include <type_traits>
-#include <utility>
-#include <vector>
-
-#include "base/logging.h"
-#include "mojo/public/cpp/bindings/array_data_view.h"
-#include "mojo/public/cpp/bindings/lib/array_internal.h"
-#include "mojo/public/cpp/bindings/lib/serialization_forward.h"
-#include "mojo/public/cpp/bindings/lib/template_util.h"
-#include "mojo/public/cpp/bindings/lib/validation_errors.h"
-
-namespace mojo {
-namespace internal {
-
-template <typename Traits,
-          typename MaybeConstUserType,
-          bool HasGetBegin =
-              HasGetBeginMethod<Traits, MaybeConstUserType>::value>
-class ArrayIterator {};
-
-// Used as the UserTypeIterator template parameter of ArraySerializer.
-template <typename Traits, typename MaybeConstUserType>
-class ArrayIterator<Traits, MaybeConstUserType, true> {
- public:
-  using IteratorType = decltype(
-      CallGetBeginIfExists<Traits>(std::declval<MaybeConstUserType&>()));
-
-  explicit ArrayIterator(MaybeConstUserType& input)
-      : input_(input), iter_(CallGetBeginIfExists<Traits>(input)) {}
-  ~ArrayIterator() {}
-
-  size_t GetSize() const { return Traits::GetSize(input_); }
-
-  using GetNextResult =
-      decltype(Traits::GetValue(std::declval<IteratorType&>()));
-  GetNextResult GetNext() {
-    GetNextResult value = Traits::GetValue(iter_);
-    Traits::AdvanceIterator(iter_);
-    return value;
-  }
-
-  using GetDataIfExistsResult = decltype(
-      CallGetDataIfExists<Traits>(std::declval<MaybeConstUserType&>()));
-  GetDataIfExistsResult GetDataIfExists() {
-    return CallGetDataIfExists<Traits>(input_);
-  }
-
- private:
-  MaybeConstUserType& input_;
-  IteratorType iter_;
-};
-
-// Used as the UserTypeIterator template parameter of ArraySerializer.
-template <typename Traits, typename MaybeConstUserType>
-class ArrayIterator<Traits, MaybeConstUserType, false> {
- public:
-  explicit ArrayIterator(MaybeConstUserType& input) : input_(input), iter_(0) {}
-  ~ArrayIterator() {}
-
-  size_t GetSize() const { return Traits::GetSize(input_); }
-
-  using GetNextResult =
-      decltype(Traits::GetAt(std::declval<MaybeConstUserType&>(), 0));
-  GetNextResult GetNext() {
-    DCHECK_LT(iter_, Traits::GetSize(input_));
-    return Traits::GetAt(input_, iter_++);
-  }
-
-  using GetDataIfExistsResult = decltype(
-      CallGetDataIfExists<Traits>(std::declval<MaybeConstUserType&>()));
-  GetDataIfExistsResult GetDataIfExists() {
-    return CallGetDataIfExists<Traits>(input_);
-  }
-
- private:
-  MaybeConstUserType& input_;
-  size_t iter_;
-};
-
-// ArraySerializer is also used to serialize map keys and values. Therefore, it
-// has a UserTypeIterator parameter which is an adaptor for reading to hide the
-// difference between ArrayTraits and MapTraits.
-template <typename MojomType,
-          typename MaybeConstUserType,
-          typename UserTypeIterator,
-          typename EnableType = void>
-struct ArraySerializer;
-
-// Handles serialization and deserialization of arrays of pod types.
-template <typename MojomType,
-          typename MaybeConstUserType,
-          typename UserTypeIterator>
-struct ArraySerializer<
-    MojomType,
-    MaybeConstUserType,
-    UserTypeIterator,
-    typename std::enable_if<BelongsTo<typename MojomType::Element,
-                                      MojomTypeCategory::POD>::value>::type> {
-  using UserType = typename std::remove_const<MaybeConstUserType>::type;
-  using Data = typename MojomTypeTraits<MojomType>::Data;
-  using DataElement = typename Data::Element;
-  using Element = typename MojomType::Element;
-  using Traits = ArrayTraits<UserType>;
-
-  static_assert(std::is_same<Element, DataElement>::value,
-                "Incorrect array serializer");
-  static_assert(std::is_same<Element, typename Traits::Element>::value,
-                "Incorrect array serializer");
-
-  static size_t GetSerializedSize(UserTypeIterator* input,
-                                  SerializationContext* context) {
-    return sizeof(Data) + Align(input->GetSize() * sizeof(DataElement));
-  }
-
-  static void SerializeElements(UserTypeIterator* input,
-                                Buffer* buf,
-                                Data* output,
-                                const ContainerValidateParams* validate_params,
-                                SerializationContext* context) {
-    DCHECK(!validate_params->element_is_nullable)
-        << "Primitive type should be non-nullable";
-    DCHECK(!validate_params->element_validate_params)
-        << "Primitive type should not have array validate params";
-
-    size_t size = input->GetSize();
-    if (size == 0)
-      return;
-
-    auto data = input->GetDataIfExists();
-    if (data) {
-      memcpy(output->storage(), data, size * sizeof(DataElement));
-    } else {
-      for (size_t i = 0; i < size; ++i)
-        output->at(i) = input->GetNext();
-    }
-  }
-
-  static bool DeserializeElements(Data* input,
-                                  UserType* output,
-                                  SerializationContext* context) {
-    if (!Traits::Resize(*output, input->size()))
-      return false;
-    ArrayIterator<Traits, UserType> iterator(*output);
-    if (input->size()) {
-      auto data = iterator.GetDataIfExists();
-      if (data) {
-        memcpy(data, input->storage(), input->size() * sizeof(DataElement));
-      } else {
-        for (size_t i = 0; i < input->size(); ++i)
-          iterator.GetNext() = input->at(i);
-      }
-    }
-    return true;
-  }
-};
-
-// Handles serialization and deserialization of arrays of enum types.
-template <typename MojomType,
-          typename MaybeConstUserType,
-          typename UserTypeIterator>
-struct ArraySerializer<
-    MojomType,
-    MaybeConstUserType,
-    UserTypeIterator,
-    typename std::enable_if<BelongsTo<typename MojomType::Element,
-                                      MojomTypeCategory::ENUM>::value>::type> {
-  using UserType = typename std::remove_const<MaybeConstUserType>::type;
-  using Data = typename MojomTypeTraits<MojomType>::Data;
-  using DataElement = typename Data::Element;
-  using Element = typename MojomType::Element;
-  using Traits = ArrayTraits<UserType>;
-
-  static_assert(sizeof(Element) == sizeof(DataElement),
-                "Incorrect array serializer");
-
-  static size_t GetSerializedSize(UserTypeIterator* input,
-                                  SerializationContext* context) {
-    return sizeof(Data) + Align(input->GetSize() * sizeof(DataElement));
-  }
-
-  static void SerializeElements(UserTypeIterator* input,
-                                Buffer* buf,
-                                Data* output,
-                                const ContainerValidateParams* validate_params,
-                                SerializationContext* context) {
-    DCHECK(!validate_params->element_is_nullable)
-        << "Primitive type should be non-nullable";
-    DCHECK(!validate_params->element_validate_params)
-        << "Primitive type should not have array validate params";
-
-    size_t size = input->GetSize();
-    for (size_t i = 0; i < size; ++i)
-      Serialize<Element>(input->GetNext(), output->storage() + i);
-  }
-
-  static bool DeserializeElements(Data* input,
-                                  UserType* output,
-                                  SerializationContext* context) {
-    if (!Traits::Resize(*output, input->size()))
-      return false;
-    ArrayIterator<Traits, UserType> iterator(*output);
-    for (size_t i = 0; i < input->size(); ++i) {
-      if (!Deserialize<Element>(input->at(i), &iterator.GetNext()))
-        return false;
-    }
-    return true;
-  }
-};
-
-// Serializes and deserializes arrays of bools.
-template <typename MojomType,
-          typename MaybeConstUserType,
-          typename UserTypeIterator>
-struct ArraySerializer<MojomType,
-                       MaybeConstUserType,
-                       UserTypeIterator,
-                       typename std::enable_if<BelongsTo<
-                           typename MojomType::Element,
-                           MojomTypeCategory::BOOLEAN>::value>::type> {
-  using UserType = typename std::remove_const<MaybeConstUserType>::type;
-  using Traits = ArrayTraits<UserType>;
-  using Data = typename MojomTypeTraits<MojomType>::Data;
-
-  static_assert(std::is_same<bool, typename Traits::Element>::value,
-                "Incorrect array serializer");
-
-  static size_t GetSerializedSize(UserTypeIterator* input,
-                                  SerializationContext* context) {
-    return sizeof(Data) + Align((input->GetSize() + 7) / 8);
-  }
-
-  static void SerializeElements(UserTypeIterator* input,
-                                Buffer* buf,
-                                Data* output,
-                                const ContainerValidateParams* validate_params,
-                                SerializationContext* context) {
-    DCHECK(!validate_params->element_is_nullable)
-        << "Primitive type should be non-nullable";
-    DCHECK(!validate_params->element_validate_params)
-        << "Primitive type should not have array validate params";
-
-    size_t size = input->GetSize();
-    for (size_t i = 0; i < size; ++i)
-      output->at(i) = input->GetNext();
-  }
-  static bool DeserializeElements(Data* input,
-                                  UserType* output,
-                                  SerializationContext* context) {
-    if (!Traits::Resize(*output, input->size()))
-      return false;
-    ArrayIterator<Traits, UserType> iterator(*output);
-    for (size_t i = 0; i < input->size(); ++i)
-      iterator.GetNext() = input->at(i);
-    return true;
-  }
-};
-
-// Serializes and deserializes arrays of handles or interfaces.
-template <typename MojomType,
-          typename MaybeConstUserType,
-          typename UserTypeIterator>
-struct ArraySerializer<
-    MojomType,
-    MaybeConstUserType,
-    UserTypeIterator,
-    typename std::enable_if<
-        BelongsTo<typename MojomType::Element,
-                  MojomTypeCategory::ASSOCIATED_INTERFACE |
-                      MojomTypeCategory::ASSOCIATED_INTERFACE_REQUEST |
-                      MojomTypeCategory::HANDLE |
-                      MojomTypeCategory::INTERFACE |
-                      MojomTypeCategory::INTERFACE_REQUEST>::value>::type> {
-  using UserType = typename std::remove_const<MaybeConstUserType>::type;
-  using Data = typename MojomTypeTraits<MojomType>::Data;
-  using Element = typename MojomType::Element;
-  using Traits = ArrayTraits<UserType>;
-
-  static size_t GetSerializedSize(UserTypeIterator* input,
-                                  SerializationContext* context) {
-    size_t element_count = input->GetSize();
-    if (BelongsTo<Element,
-                  MojomTypeCategory::ASSOCIATED_INTERFACE |
-                      MojomTypeCategory::ASSOCIATED_INTERFACE_REQUEST>::value) {
-      for (size_t i = 0; i < element_count; ++i) {
-        typename UserTypeIterator::GetNextResult next = input->GetNext();
-        size_t size = PrepareToSerialize<Element>(next, context);
-        DCHECK_EQ(size, 0u);
-      }
-    }
-    return sizeof(Data) + Align(element_count * sizeof(typename Data::Element));
-  }
-
-  static void SerializeElements(UserTypeIterator* input,
-                                Buffer* buf,
-                                Data* output,
-                                const ContainerValidateParams* validate_params,
-                                SerializationContext* context) {
-    DCHECK(!validate_params->element_validate_params)
-        << "Handle or interface type should not have array validate params";
-
-    size_t size = input->GetSize();
-    for (size_t i = 0; i < size; ++i) {
-      typename UserTypeIterator::GetNextResult next = input->GetNext();
-      Serialize<Element>(next, &output->at(i), context);
-
-      static const ValidationError kError =
-          BelongsTo<Element,
-                    MojomTypeCategory::ASSOCIATED_INTERFACE |
-                        MojomTypeCategory::ASSOCIATED_INTERFACE_REQUEST>::value
-              ? VALIDATION_ERROR_UNEXPECTED_INVALID_INTERFACE_ID
-              : VALIDATION_ERROR_UNEXPECTED_INVALID_HANDLE;
-      MOJO_INTERNAL_DLOG_SERIALIZATION_WARNING(
-          !validate_params->element_is_nullable &&
-              !IsHandleOrInterfaceValid(output->at(i)),
-          kError,
-          MakeMessageWithArrayIndex("invalid handle or interface ID in array "
-                                    "expecting valid handles or interface IDs",
-                                    size, i));
-    }
-  }
-  static bool DeserializeElements(Data* input,
-                                  UserType* output,
-                                  SerializationContext* context) {
-    if (!Traits::Resize(*output, input->size()))
-      return false;
-    ArrayIterator<Traits, UserType> iterator(*output);
-    for (size_t i = 0; i < input->size(); ++i) {
-      bool result =
-          Deserialize<Element>(&input->at(i), &iterator.GetNext(), context);
-      DCHECK(result);
-    }
-    return true;
-  }
-};
-
-// This template must only apply to pointer mojo entity (strings, structs,
-// arrays and maps).
-template <typename MojomType,
-          typename MaybeConstUserType,
-          typename UserTypeIterator>
-struct ArraySerializer<MojomType,
-                       MaybeConstUserType,
-                       UserTypeIterator,
-                       typename std::enable_if<BelongsTo<
-                           typename MojomType::Element,
-                           MojomTypeCategory::ARRAY | MojomTypeCategory::MAP |
-                               MojomTypeCategory::STRING |
-                               MojomTypeCategory::STRUCT>::value>::type> {
-  using UserType = typename std::remove_const<MaybeConstUserType>::type;
-  using Data = typename MojomTypeTraits<MojomType>::Data;
-  using Element = typename MojomType::Element;
-  using DataElementPtr = typename MojomTypeTraits<Element>::Data*;
-  using Traits = ArrayTraits<UserType>;
-
-  static size_t GetSerializedSize(UserTypeIterator* input,
-                                  SerializationContext* context) {
-    size_t element_count = input->GetSize();
-    size_t size = sizeof(Data) + element_count * sizeof(typename Data::Element);
-    for (size_t i = 0; i < element_count; ++i) {
-      typename UserTypeIterator::GetNextResult next = input->GetNext();
-      size += PrepareToSerialize<Element>(next, context);
-    }
-    return size;
-  }
-
-  static void SerializeElements(UserTypeIterator* input,
-                                Buffer* buf,
-                                Data* output,
-                                const ContainerValidateParams* validate_params,
-                                SerializationContext* context) {
-    size_t size = input->GetSize();
-    for (size_t i = 0; i < size; ++i) {
-      DataElementPtr data_ptr;
-      typename UserTypeIterator::GetNextResult next = input->GetNext();
-      SerializeCaller<Element>::Run(next, buf, &data_ptr,
-                                    validate_params->element_validate_params,
-                                    context);
-      output->at(i).Set(data_ptr);
-      MOJO_INTERNAL_DLOG_SERIALIZATION_WARNING(
-          !validate_params->element_is_nullable && !data_ptr,
-          VALIDATION_ERROR_UNEXPECTED_NULL_POINTER,
-          MakeMessageWithArrayIndex("null in array expecting valid pointers",
-                                    size, i));
-    }
-  }
-  static bool DeserializeElements(Data* input,
-                                  UserType* output,
-                                  SerializationContext* context) {
-    if (!Traits::Resize(*output, input->size()))
-      return false;
-    ArrayIterator<Traits, UserType> iterator(*output);
-    for (size_t i = 0; i < input->size(); ++i) {
-      if (!Deserialize<Element>(input->at(i).Get(), &iterator.GetNext(),
-                                context))
-        return false;
-    }
-    return true;
-  }
-
- private:
-  template <typename T,
-            bool is_array_or_map = BelongsTo<T,
-                                             MojomTypeCategory::ARRAY |
-                                                 MojomTypeCategory::MAP>::value>
-  struct SerializeCaller {
-    template <typename InputElementType>
-    static void Run(InputElementType&& input,
-                    Buffer* buf,
-                    DataElementPtr* output,
-                    const ContainerValidateParams* validate_params,
-                    SerializationContext* context) {
-      Serialize<T>(std::forward<InputElementType>(input), buf, output, context);
-    }
-  };
-
-  template <typename T>
-  struct SerializeCaller<T, true> {
-    template <typename InputElementType>
-    static void Run(InputElementType&& input,
-                    Buffer* buf,
-                    DataElementPtr* output,
-                    const ContainerValidateParams* validate_params,
-                    SerializationContext* context) {
-      Serialize<T>(std::forward<InputElementType>(input), buf, output,
-                   validate_params, context);
-    }
-  };
-};
-
-// Handles serialization and deserialization of arrays of unions.
-template <typename MojomType,
-          typename MaybeConstUserType,
-          typename UserTypeIterator>
-struct ArraySerializer<
-    MojomType,
-    MaybeConstUserType,
-    UserTypeIterator,
-    typename std::enable_if<BelongsTo<typename MojomType::Element,
-                                      MojomTypeCategory::UNION>::value>::type> {
-  using UserType = typename std::remove_const<MaybeConstUserType>::type;
-  using Data = typename MojomTypeTraits<MojomType>::Data;
-  using Element = typename MojomType::Element;
-  using Traits = ArrayTraits<UserType>;
-
-  static size_t GetSerializedSize(UserTypeIterator* input,
-                                  SerializationContext* context) {
-    size_t element_count = input->GetSize();
-    size_t size = sizeof(Data);
-    for (size_t i = 0; i < element_count; ++i) {
-      // Call with |inlined| set to false, so that it will account for both the
-      // data in the union and the space in the array used to hold the union.
-      typename UserTypeIterator::GetNextResult next = input->GetNext();
-      size += PrepareToSerialize<Element>(next, false, context);
-    }
-    return size;
-  }
-
-  static void SerializeElements(UserTypeIterator* input,
-                                Buffer* buf,
-                                Data* output,
-                                const ContainerValidateParams* validate_params,
-                                SerializationContext* context) {
-    size_t size = input->GetSize();
-    for (size_t i = 0; i < size; ++i) {
-      typename Data::Element* result = output->storage() + i;
-      typename UserTypeIterator::GetNextResult next = input->GetNext();
-      Serialize<Element>(next, buf, &result, true, context);
-      MOJO_INTERNAL_DLOG_SERIALIZATION_WARNING(
-          !validate_params->element_is_nullable && output->at(i).is_null(),
-          VALIDATION_ERROR_UNEXPECTED_NULL_POINTER,
-          MakeMessageWithArrayIndex("null in array expecting valid unions",
-                                    size, i));
-    }
-  }
-
-  static bool DeserializeElements(Data* input,
-                                  UserType* output,
-                                  SerializationContext* context) {
-    if (!Traits::Resize(*output, input->size()))
-      return false;
-    ArrayIterator<Traits, UserType> iterator(*output);
-    for (size_t i = 0; i < input->size(); ++i) {
-      if (!Deserialize<Element>(&input->at(i), &iterator.GetNext(), context))
-        return false;
-    }
-    return true;
-  }
-};
-
-template <typename Element, typename MaybeConstUserType>
-struct Serializer<ArrayDataView<Element>, MaybeConstUserType> {
-  using UserType = typename std::remove_const<MaybeConstUserType>::type;
-  using Traits = ArrayTraits<UserType>;
-  using Impl = ArraySerializer<ArrayDataView<Element>,
-                               MaybeConstUserType,
-                               ArrayIterator<Traits, MaybeConstUserType>>;
-  using Data = typename MojomTypeTraits<ArrayDataView<Element>>::Data;
-
-  static size_t PrepareToSerialize(MaybeConstUserType& input,
-                                   SerializationContext* context) {
-    if (CallIsNullIfExists<Traits>(input))
-      return 0;
-    ArrayIterator<Traits, MaybeConstUserType> iterator(input);
-    return Impl::GetSerializedSize(&iterator, context);
-  }
-
-  static void Serialize(MaybeConstUserType& input,
-                        Buffer* buf,
-                        Data** output,
-                        const ContainerValidateParams* validate_params,
-                        SerializationContext* context) {
-    if (!CallIsNullIfExists<Traits>(input)) {
-      MOJO_INTERNAL_DLOG_SERIALIZATION_WARNING(
-          validate_params->expected_num_elements != 0 &&
-              Traits::GetSize(input) != validate_params->expected_num_elements,
-          internal::VALIDATION_ERROR_UNEXPECTED_ARRAY_HEADER,
-          internal::MakeMessageWithExpectedArraySize(
-              "fixed-size array has wrong number of elements",
-              Traits::GetSize(input), validate_params->expected_num_elements));
-      Data* result = Data::New(Traits::GetSize(input), buf);
-      if (result) {
-        ArrayIterator<Traits, MaybeConstUserType> iterator(input);
-        Impl::SerializeElements(&iterator, buf, result, validate_params,
-                                context);
-      }
-      *output = result;
-    } else {
-      *output = nullptr;
-    }
-  }
-
-  static bool Deserialize(Data* input,
-                          UserType* output,
-                          SerializationContext* context) {
-    if (!input)
-      return CallSetToNullIfExists<Traits>(output);
-    return Impl::DeserializeElements(input, output, context);
-  }
-};
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_ARRAY_SERIALIZATION_H_
diff --git a/mojo/public/cpp/bindings/lib/associated_binding.cc b/mojo/public/cpp/bindings/lib/associated_binding.cc
deleted file mode 100644
index 6788e68..0000000
--- a/mojo/public/cpp/bindings/lib/associated_binding.cc
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/bindings/associated_binding.h"
-
-namespace mojo {
-
-AssociatedBindingBase::AssociatedBindingBase() {}
-
-AssociatedBindingBase::~AssociatedBindingBase() {}
-
-void AssociatedBindingBase::AddFilter(std::unique_ptr<MessageReceiver> filter) {
-  DCHECK(endpoint_client_);
-  endpoint_client_->AddFilter(std::move(filter));
-}
-
-void AssociatedBindingBase::Close() {
-  endpoint_client_.reset();
-}
-
-void AssociatedBindingBase::CloseWithReason(uint32_t custom_reason,
-                                            const std::string& description) {
-  if (endpoint_client_)
-    endpoint_client_->CloseWithReason(custom_reason, description);
-  Close();
-}
-
-void AssociatedBindingBase::set_connection_error_handler(
-    const base::Closure& error_handler) {
-  DCHECK(is_bound());
-  endpoint_client_->set_connection_error_handler(error_handler);
-}
-
-void AssociatedBindingBase::set_connection_error_with_reason_handler(
-    const ConnectionErrorWithReasonCallback& error_handler) {
-  DCHECK(is_bound());
-  endpoint_client_->set_connection_error_with_reason_handler(error_handler);
-}
-
-void AssociatedBindingBase::FlushForTesting() {
-  endpoint_client_->FlushForTesting();
-}
-
-void AssociatedBindingBase::BindImpl(
-    ScopedInterfaceEndpointHandle handle,
-    MessageReceiverWithResponderStatus* receiver,
-    std::unique_ptr<MessageReceiver> payload_validator,
-    bool expect_sync_requests,
-    scoped_refptr<base::SingleThreadTaskRunner> runner,
-    uint32_t interface_version) {
-  if (!handle.is_valid()) {
-    endpoint_client_.reset();
-    return;
-  }
-
-  endpoint_client_.reset(new InterfaceEndpointClient(
-      std::move(handle), receiver, std::move(payload_validator),
-      expect_sync_requests, std::move(runner), interface_version));
-}
-
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/associated_group.cc b/mojo/public/cpp/bindings/lib/associated_group.cc
deleted file mode 100644
index 3e95eeb..0000000
--- a/mojo/public/cpp/bindings/lib/associated_group.cc
+++ /dev/null
@@ -1,34 +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 "mojo/public/cpp/bindings/associated_group.h"
-
-#include "mojo/public/cpp/bindings/associated_group_controller.h"
-
-namespace mojo {
-
-AssociatedGroup::AssociatedGroup() = default;
-
-AssociatedGroup::AssociatedGroup(
-    scoped_refptr<AssociatedGroupController> controller)
-    : controller_(std::move(controller)) {}
-
-AssociatedGroup::AssociatedGroup(const ScopedInterfaceEndpointHandle& handle)
-    : controller_getter_(handle.CreateGroupControllerGetter()) {}
-
-AssociatedGroup::AssociatedGroup(const AssociatedGroup& other) = default;
-
-AssociatedGroup::~AssociatedGroup() = default;
-
-AssociatedGroup& AssociatedGroup::operator=(const AssociatedGroup& other) =
-    default;
-
-AssociatedGroupController* AssociatedGroup::GetController() {
-  if (controller_)
-    return controller_.get();
-
-  return controller_getter_.Run();
-}
-
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/associated_group_controller.cc b/mojo/public/cpp/bindings/lib/associated_group_controller.cc
deleted file mode 100644
index f4a9aa2..0000000
--- a/mojo/public/cpp/bindings/lib/associated_group_controller.cc
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/bindings/associated_group_controller.h"
-
-#include "mojo/public/cpp/bindings/associated_group.h"
-
-namespace mojo {
-
-AssociatedGroupController::~AssociatedGroupController() {}
-
-ScopedInterfaceEndpointHandle
-AssociatedGroupController::CreateScopedInterfaceEndpointHandle(InterfaceId id) {
-  return ScopedInterfaceEndpointHandle(id, this);
-}
-
-bool AssociatedGroupController::NotifyAssociation(
-    ScopedInterfaceEndpointHandle* handle_to_send,
-    InterfaceId id) {
-  return handle_to_send->NotifyAssociation(id, this);
-}
-
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/associated_interface_ptr.cc b/mojo/public/cpp/bindings/lib/associated_interface_ptr.cc
deleted file mode 100644
index 78281ed..0000000
--- a/mojo/public/cpp/bindings/lib/associated_interface_ptr.cc
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/bindings/associated_interface_ptr.h"
-
-namespace mojo {
-
-void GetIsolatedInterface(ScopedInterfaceEndpointHandle handle) {
-  MessagePipe pipe;
-  scoped_refptr<internal::MultiplexRouter> router =
-      new internal::MultiplexRouter(std::move(pipe.handle0),
-                                    internal::MultiplexRouter::MULTI_INTERFACE,
-                                    false, base::ThreadTaskRunnerHandle::Get());
-  router->AssociateInterface(std::move(handle));
-}
-
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/associated_interface_ptr_state.h b/mojo/public/cpp/bindings/lib/associated_interface_ptr_state.h
deleted file mode 100644
index a4b5188..0000000
--- a/mojo/public/cpp/bindings/lib/associated_interface_ptr_state.h
+++ /dev/null
@@ -1,157 +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 MOJO_PUBLIC_CPP_BINDINGS_LIB_ASSOCIATED_INTERFACE_PTR_STATE_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_ASSOCIATED_INTERFACE_PTR_STATE_H_
-
-#include <stdint.h>
-
-#include <algorithm>  // For |std::swap()|.
-#include <memory>
-#include <string>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/callback_forward.h"
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "base/memory/ref_counted.h"
-#include "base/single_thread_task_runner.h"
-#include "mojo/public/cpp/bindings/associated_group.h"
-#include "mojo/public/cpp/bindings/associated_interface_ptr_info.h"
-#include "mojo/public/cpp/bindings/connection_error_callback.h"
-#include "mojo/public/cpp/bindings/interface_endpoint_client.h"
-#include "mojo/public/cpp/bindings/interface_id.h"
-#include "mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h"
-#include "mojo/public/cpp/system/message_pipe.h"
-
-namespace mojo {
-namespace internal {
-
-template <typename Interface>
-class AssociatedInterfacePtrState {
- public:
-  AssociatedInterfacePtrState() : version_(0u) {}
-
-  ~AssociatedInterfacePtrState() {
-    endpoint_client_.reset();
-    proxy_.reset();
-  }
-
-  Interface* instance() {
-    // This will be null if the object is not bound.
-    return proxy_.get();
-  }
-
-  uint32_t version() const { return version_; }
-
-  void QueryVersion(const base::Callback<void(uint32_t)>& callback) {
-    // It is safe to capture |this| because the callback won't be run after this
-    // object goes away.
-    endpoint_client_->QueryVersion(
-        base::Bind(&AssociatedInterfacePtrState::OnQueryVersion,
-                   base::Unretained(this), callback));
-  }
-
-  void RequireVersion(uint32_t version) {
-    if (version <= version_)
-      return;
-
-    version_ = version;
-    endpoint_client_->RequireVersion(version);
-  }
-
-  void FlushForTesting() { endpoint_client_->FlushForTesting(); }
-
-  void CloseWithReason(uint32_t custom_reason, const std::string& description) {
-    endpoint_client_->CloseWithReason(custom_reason, description);
-  }
-
-  void Swap(AssociatedInterfacePtrState* other) {
-    using std::swap;
-    swap(other->endpoint_client_, endpoint_client_);
-    swap(other->proxy_, proxy_);
-    swap(other->version_, version_);
-  }
-
-  void Bind(AssociatedInterfacePtrInfo<Interface> info,
-            scoped_refptr<base::SingleThreadTaskRunner> runner) {
-    DCHECK(!endpoint_client_);
-    DCHECK(!proxy_);
-    DCHECK_EQ(0u, version_);
-    DCHECK(info.is_valid());
-
-    version_ = info.version();
-    // The version is only queried from the client so the value passed here
-    // will not be used.
-    endpoint_client_.reset(new InterfaceEndpointClient(
-        info.PassHandle(), nullptr,
-        base::WrapUnique(new typename Interface::ResponseValidator_()), false,
-        std::move(runner), 0u));
-    proxy_.reset(new Proxy(endpoint_client_.get()));
-  }
-
-  // After this method is called, the object is in an invalid state and
-  // shouldn't be reused.
-  AssociatedInterfacePtrInfo<Interface> PassInterface() {
-    ScopedInterfaceEndpointHandle handle = endpoint_client_->PassHandle();
-    endpoint_client_.reset();
-    proxy_.reset();
-    return AssociatedInterfacePtrInfo<Interface>(std::move(handle), version_);
-  }
-
-  bool is_bound() const { return !!endpoint_client_; }
-
-  bool encountered_error() const {
-    return endpoint_client_ ? endpoint_client_->encountered_error() : false;
-  }
-
-  void set_connection_error_handler(const base::Closure& error_handler) {
-    DCHECK(endpoint_client_);
-    endpoint_client_->set_connection_error_handler(error_handler);
-  }
-
-  void set_connection_error_with_reason_handler(
-      const ConnectionErrorWithReasonCallback& error_handler) {
-    DCHECK(endpoint_client_);
-    endpoint_client_->set_connection_error_with_reason_handler(error_handler);
-  }
-
-  // Returns true if bound and awaiting a response to a message.
-  bool has_pending_callbacks() const {
-    return endpoint_client_ && endpoint_client_->has_pending_responders();
-  }
-
-  AssociatedGroup* associated_group() {
-    return endpoint_client_ ? endpoint_client_->associated_group() : nullptr;
-  }
-
-  void ForwardMessage(Message message) { endpoint_client_->Accept(&message); }
-
-  void ForwardMessageWithResponder(Message message,
-                                   std::unique_ptr<MessageReceiver> responder) {
-    endpoint_client_->AcceptWithResponder(&message, std::move(responder));
-  }
-
- private:
-  using Proxy = typename Interface::Proxy_;
-
-  void OnQueryVersion(const base::Callback<void(uint32_t)>& callback,
-                      uint32_t version) {
-    version_ = version;
-    callback.Run(version);
-  }
-
-  std::unique_ptr<InterfaceEndpointClient> endpoint_client_;
-  std::unique_ptr<Proxy> proxy_;
-
-  uint32_t version_;
-
-  DISALLOW_COPY_AND_ASSIGN(AssociatedInterfacePtrState);
-};
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_ASSOCIATED_INTERFACE_PTR_STATE_H_
diff --git a/mojo/public/cpp/bindings/lib/binding_state.cc b/mojo/public/cpp/bindings/lib/binding_state.cc
deleted file mode 100644
index b34cb47..0000000
--- a/mojo/public/cpp/bindings/lib/binding_state.cc
+++ /dev/null
@@ -1,90 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/bindings/lib/binding_state.h"
-
-namespace mojo {
-namespace internal {
-
-BindingStateBase::BindingStateBase() = default;
-
-BindingStateBase::~BindingStateBase() = default;
-
-void BindingStateBase::AddFilter(std::unique_ptr<MessageReceiver> filter) {
-  DCHECK(endpoint_client_);
-  endpoint_client_->AddFilter(std::move(filter));
-}
-
-bool BindingStateBase::HasAssociatedInterfaces() const {
-  return router_ ? router_->HasAssociatedEndpoints() : false;
-}
-
-void BindingStateBase::PauseIncomingMethodCallProcessing() {
-  DCHECK(router_);
-  router_->PauseIncomingMethodCallProcessing();
-}
-void BindingStateBase::ResumeIncomingMethodCallProcessing() {
-  DCHECK(router_);
-  router_->ResumeIncomingMethodCallProcessing();
-}
-
-bool BindingStateBase::WaitForIncomingMethodCall(MojoDeadline deadline) {
-  DCHECK(router_);
-  return router_->WaitForIncomingMessage(deadline);
-}
-
-void BindingStateBase::Close() {
-  if (!router_)
-    return;
-
-  endpoint_client_.reset();
-  router_->CloseMessagePipe();
-  router_ = nullptr;
-}
-
-void BindingStateBase::CloseWithReason(uint32_t custom_reason,
-                                       const std::string& description) {
-  if (endpoint_client_)
-    endpoint_client_->CloseWithReason(custom_reason, description);
-
-  Close();
-}
-
-void BindingStateBase::FlushForTesting() {
-  endpoint_client_->FlushForTesting();
-}
-
-void BindingStateBase::EnableTestingMode() {
-  DCHECK(is_bound());
-  router_->EnableTestingMode();
-}
-
-void BindingStateBase::BindInternal(
-    ScopedMessagePipeHandle handle,
-    scoped_refptr<base::SingleThreadTaskRunner> runner,
-    const char* interface_name,
-    std::unique_ptr<MessageReceiver> request_validator,
-    bool passes_associated_kinds,
-    bool has_sync_methods,
-    MessageReceiverWithResponderStatus* stub,
-    uint32_t interface_version) {
-  DCHECK(!router_);
-
-  MultiplexRouter::Config config =
-      passes_associated_kinds
-          ? MultiplexRouter::MULTI_INTERFACE
-          : (has_sync_methods
-                 ? MultiplexRouter::SINGLE_INTERFACE_WITH_SYNC_METHODS
-                 : MultiplexRouter::SINGLE_INTERFACE);
-  router_ = new MultiplexRouter(std::move(handle), config, false, runner);
-  router_->SetMasterInterfaceName(interface_name);
-
-  endpoint_client_.reset(new InterfaceEndpointClient(
-      router_->CreateLocalEndpointHandle(kMasterInterfaceId), stub,
-      std::move(request_validator), has_sync_methods, std::move(runner),
-      interface_version));
-}
-
-}  // namesapce internal
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/binding_state.h b/mojo/public/cpp/bindings/lib/binding_state.h
deleted file mode 100644
index 0b0dbee..0000000
--- a/mojo/public/cpp/bindings/lib/binding_state.h
+++ /dev/null
@@ -1,128 +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 MOJO_PUBLIC_CPP_BINDINGS_LIB_BINDING_STATE_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_BINDING_STATE_H_
-
-#include <memory>
-#include <string>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "base/memory/ref_counted.h"
-#include "base/single_thread_task_runner.h"
-#include "mojo/public/cpp/bindings/bindings_export.h"
-#include "mojo/public/cpp/bindings/connection_error_callback.h"
-#include "mojo/public/cpp/bindings/filter_chain.h"
-#include "mojo/public/cpp/bindings/interface_endpoint_client.h"
-#include "mojo/public/cpp/bindings/interface_id.h"
-#include "mojo/public/cpp/bindings/interface_ptr.h"
-#include "mojo/public/cpp/bindings/interface_ptr_info.h"
-#include "mojo/public/cpp/bindings/interface_request.h"
-#include "mojo/public/cpp/bindings/lib/multiplex_router.h"
-#include "mojo/public/cpp/bindings/message_header_validator.h"
-#include "mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h"
-#include "mojo/public/cpp/system/core.h"
-
-namespace mojo {
-namespace internal {
-
-class MOJO_CPP_BINDINGS_EXPORT BindingStateBase {
- public:
-  BindingStateBase();
-  ~BindingStateBase();
-
-  void AddFilter(std::unique_ptr<MessageReceiver> filter);
-
-  bool HasAssociatedInterfaces() const;
-
-  void PauseIncomingMethodCallProcessing();
-  void ResumeIncomingMethodCallProcessing();
-
-  bool WaitForIncomingMethodCall(
-      MojoDeadline deadline = MOJO_DEADLINE_INDEFINITE);
-
-  void Close();
-  void CloseWithReason(uint32_t custom_reason, const std::string& description);
-
-  void set_connection_error_handler(const base::Closure& error_handler) {
-    DCHECK(is_bound());
-    endpoint_client_->set_connection_error_handler(error_handler);
-  }
-
-  void set_connection_error_with_reason_handler(
-      const ConnectionErrorWithReasonCallback& error_handler) {
-    DCHECK(is_bound());
-    endpoint_client_->set_connection_error_with_reason_handler(error_handler);
-  }
-
-  bool is_bound() const { return !!router_; }
-
-  MessagePipeHandle handle() const {
-    DCHECK(is_bound());
-    return router_->handle();
-  }
-
-  void FlushForTesting();
-
-  void EnableTestingMode();
-
- protected:
-  void BindInternal(ScopedMessagePipeHandle handle,
-                    scoped_refptr<base::SingleThreadTaskRunner> runner,
-                    const char* interface_name,
-                    std::unique_ptr<MessageReceiver> request_validator,
-                    bool passes_associated_kinds,
-                    bool has_sync_methods,
-                    MessageReceiverWithResponderStatus* stub,
-                    uint32_t interface_version);
-
-  scoped_refptr<internal::MultiplexRouter> router_;
-  std::unique_ptr<InterfaceEndpointClient> endpoint_client_;
-};
-
-template <typename Interface, typename ImplRefTraits>
-class BindingState : public BindingStateBase {
- public:
-  using ImplPointerType = typename ImplRefTraits::PointerType;
-
-  explicit BindingState(ImplPointerType impl) {
-    stub_.set_sink(std::move(impl));
-  }
-
-  ~BindingState() { Close(); }
-
-  void Bind(ScopedMessagePipeHandle handle,
-            scoped_refptr<base::SingleThreadTaskRunner> runner) {
-    BindingStateBase::BindInternal(
-        std::move(handle), runner, Interface::Name_,
-        base::MakeUnique<typename Interface::RequestValidator_>(),
-        Interface::PassesAssociatedKinds_, Interface::HasSyncMethods_, &stub_,
-        Interface::Version_);
-  }
-
-  InterfaceRequest<Interface> Unbind() {
-    endpoint_client_.reset();
-    InterfaceRequest<Interface> request =
-        MakeRequest<Interface>(router_->PassMessagePipe());
-    router_ = nullptr;
-    return request;
-  }
-
-  Interface* impl() { return ImplRefTraits::GetRawPointer(&stub_.sink()); }
-
- private:
-  typename Interface::template Stub_<ImplRefTraits> stub_;
-
-  DISALLOW_COPY_AND_ASSIGN(BindingState);
-};
-
-}  // namesapce internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_BINDING_STATE_H_
diff --git a/mojo/public/cpp/bindings/lib/bindings_internal.h b/mojo/public/cpp/bindings/lib/bindings_internal.h
deleted file mode 100644
index 631daec..0000000
--- a/mojo/public/cpp/bindings/lib/bindings_internal.h
+++ /dev/null
@@ -1,336 +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 MOJO_PUBLIC_CPP_BINDINGS_LIB_BINDINGS_INTERNAL_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_BINDINGS_INTERNAL_H_
-
-#include <stdint.h>
-
-#include <functional>
-
-#include "base/template_util.h"
-#include "mojo/public/cpp/bindings/interface_id.h"
-#include "mojo/public/cpp/bindings/lib/template_util.h"
-#include "mojo/public/cpp/system/core.h"
-
-namespace mojo {
-
-template <typename T>
-class ArrayDataView;
-
-template <typename T>
-class AssociatedInterfacePtrInfoDataView;
-
-template <typename T>
-class AssociatedInterfaceRequestDataView;
-
-template <typename T>
-class InterfacePtrDataView;
-
-template <typename T>
-class InterfaceRequestDataView;
-
-template <typename K, typename V>
-class MapDataView;
-
-class NativeStructDataView;
-
-class StringDataView;
-
-namespace internal {
-
-// Please note that this is a different value than |mojo::kInvalidHandleValue|,
-// which is the "decoded" invalid handle.
-const uint32_t kEncodedInvalidHandleValue = static_cast<uint32_t>(-1);
-
-// A serialized union always takes 16 bytes:
-//   4-byte size + 4-byte tag + 8-byte payload.
-const uint32_t kUnionDataSize = 16;
-
-template <typename T>
-class Array_Data;
-
-template <typename K, typename V>
-class Map_Data;
-
-class NativeStruct_Data;
-
-using String_Data = Array_Data<char>;
-
-inline size_t Align(size_t size) {
-  return (size + 7) & ~0x7;
-}
-
-inline bool IsAligned(const void* ptr) {
-  return !(reinterpret_cast<uintptr_t>(ptr) & 0x7);
-}
-
-// Pointers are encoded as relative offsets. The offsets are relative to the
-// address of where the offset value is stored, such that the pointer may be
-// recovered with the expression:
-//
-//   ptr = reinterpret_cast<char*>(offset) + *offset
-//
-// A null pointer is encoded as an offset value of 0.
-//
-inline void EncodePointer(const void* ptr, uint64_t* offset) {
-  if (!ptr) {
-    *offset = 0;
-    return;
-  }
-
-  const char* p_obj = reinterpret_cast<const char*>(ptr);
-  const char* p_slot = reinterpret_cast<const char*>(offset);
-  DCHECK(p_obj > p_slot);
-
-  *offset = static_cast<uint64_t>(p_obj - p_slot);
-}
-
-// Note: This function doesn't validate the encoded pointer value.
-inline const void* DecodePointer(const uint64_t* offset) {
-  if (!*offset)
-    return nullptr;
-  return reinterpret_cast<const char*>(offset) + *offset;
-}
-
-#pragma pack(push, 1)
-
-struct StructHeader {
-  uint32_t num_bytes;
-  uint32_t version;
-};
-static_assert(sizeof(StructHeader) == 8, "Bad sizeof(StructHeader)");
-
-struct ArrayHeader {
-  uint32_t num_bytes;
-  uint32_t num_elements;
-};
-static_assert(sizeof(ArrayHeader) == 8, "Bad_sizeof(ArrayHeader)");
-
-template <typename T>
-struct Pointer {
-  using BaseType = T;
-
-  void Set(T* ptr) { EncodePointer(ptr, &offset); }
-  const T* Get() const { return static_cast<const T*>(DecodePointer(&offset)); }
-  T* Get() {
-    return static_cast<T*>(const_cast<void*>(DecodePointer(&offset)));
-  }
-
-  bool is_null() const { return offset == 0; }
-
-  uint64_t offset;
-};
-static_assert(sizeof(Pointer<char>) == 8, "Bad_sizeof(Pointer)");
-
-using GenericPointer = Pointer<void>;
-
-struct Handle_Data {
-  Handle_Data() = default;
-  explicit Handle_Data(uint32_t value) : value(value) {}
-
-  bool is_valid() const { return value != kEncodedInvalidHandleValue; }
-
-  uint32_t value;
-};
-static_assert(sizeof(Handle_Data) == 4, "Bad_sizeof(Handle_Data)");
-
-struct Interface_Data {
-  Handle_Data handle;
-  uint32_t version;
-};
-static_assert(sizeof(Interface_Data) == 8, "Bad_sizeof(Interface_Data)");
-
-struct AssociatedEndpointHandle_Data {
-  AssociatedEndpointHandle_Data() = default;
-  explicit AssociatedEndpointHandle_Data(uint32_t value) : value(value) {}
-
-  bool is_valid() const { return value != kEncodedInvalidHandleValue; }
-
-  uint32_t value;
-};
-static_assert(sizeof(AssociatedEndpointHandle_Data) == 4,
-              "Bad_sizeof(AssociatedEndpointHandle_Data)");
-
-struct AssociatedInterface_Data {
-  AssociatedEndpointHandle_Data handle;
-  uint32_t version;
-};
-static_assert(sizeof(AssociatedInterface_Data) == 8,
-              "Bad_sizeof(AssociatedInterface_Data)");
-
-#pragma pack(pop)
-
-template <typename T>
-T FetchAndReset(T* ptr) {
-  T temp = *ptr;
-  *ptr = T();
-  return temp;
-}
-
-template <typename T>
-struct IsUnionDataType {
- private:
-  template <typename U>
-  static YesType Test(const typename U::MojomUnionDataType*);
-
-  template <typename U>
-  static NoType Test(...);
-
-  EnsureTypeIsComplete<T> check_t_;
-
- public:
-  static const bool value =
-      sizeof(Test<T>(0)) == sizeof(YesType) && !IsConst<T>::value;
-};
-
-enum class MojomTypeCategory : uint32_t {
-  ARRAY = 1 << 0,
-  ASSOCIATED_INTERFACE = 1 << 1,
-  ASSOCIATED_INTERFACE_REQUEST = 1 << 2,
-  BOOLEAN = 1 << 3,
-  ENUM = 1 << 4,
-  HANDLE = 1 << 5,
-  INTERFACE = 1 << 6,
-  INTERFACE_REQUEST = 1 << 7,
-  MAP = 1 << 8,
-  // POD except boolean and enum.
-  POD = 1 << 9,
-  STRING = 1 << 10,
-  STRUCT = 1 << 11,
-  UNION = 1 << 12
-};
-
-inline constexpr MojomTypeCategory operator&(MojomTypeCategory x,
-                                             MojomTypeCategory y) {
-  return static_cast<MojomTypeCategory>(static_cast<uint32_t>(x) &
-                                        static_cast<uint32_t>(y));
-}
-
-inline constexpr MojomTypeCategory operator|(MojomTypeCategory x,
-                                             MojomTypeCategory y) {
-  return static_cast<MojomTypeCategory>(static_cast<uint32_t>(x) |
-                                        static_cast<uint32_t>(y));
-}
-
-template <typename T, bool is_enum = std::is_enum<T>::value>
-struct MojomTypeTraits {
-  using Data = T;
-  using DataAsArrayElement = Data;
-
-  static const MojomTypeCategory category = MojomTypeCategory::POD;
-};
-
-template <typename T>
-struct MojomTypeTraits<ArrayDataView<T>, false> {
-  using Data = Array_Data<typename MojomTypeTraits<T>::DataAsArrayElement>;
-  using DataAsArrayElement = Pointer<Data>;
-
-  static const MojomTypeCategory category = MojomTypeCategory::ARRAY;
-};
-
-template <typename T>
-struct MojomTypeTraits<AssociatedInterfacePtrInfoDataView<T>, false> {
-  using Data = AssociatedInterface_Data;
-  using DataAsArrayElement = Data;
-
-  static const MojomTypeCategory category =
-      MojomTypeCategory::ASSOCIATED_INTERFACE;
-};
-
-template <typename T>
-struct MojomTypeTraits<AssociatedInterfaceRequestDataView<T>, false> {
-  using Data = AssociatedEndpointHandle_Data;
-  using DataAsArrayElement = Data;
-
-  static const MojomTypeCategory category =
-      MojomTypeCategory::ASSOCIATED_INTERFACE_REQUEST;
-};
-
-template <>
-struct MojomTypeTraits<bool, false> {
-  using Data = bool;
-  using DataAsArrayElement = Data;
-
-  static const MojomTypeCategory category = MojomTypeCategory::BOOLEAN;
-};
-
-template <typename T>
-struct MojomTypeTraits<T, true> {
-  using Data = int32_t;
-  using DataAsArrayElement = Data;
-
-  static const MojomTypeCategory category = MojomTypeCategory::ENUM;
-};
-
-template <typename T>
-struct MojomTypeTraits<ScopedHandleBase<T>, false> {
-  using Data = Handle_Data;
-  using DataAsArrayElement = Data;
-
-  static const MojomTypeCategory category = MojomTypeCategory::HANDLE;
-};
-
-template <typename T>
-struct MojomTypeTraits<InterfacePtrDataView<T>, false> {
-  using Data = Interface_Data;
-  using DataAsArrayElement = Data;
-
-  static const MojomTypeCategory category = MojomTypeCategory::INTERFACE;
-};
-
-template <typename T>
-struct MojomTypeTraits<InterfaceRequestDataView<T>, false> {
-  using Data = Handle_Data;
-  using DataAsArrayElement = Data;
-
-  static const MojomTypeCategory category =
-      MojomTypeCategory::INTERFACE_REQUEST;
-};
-
-template <typename K, typename V>
-struct MojomTypeTraits<MapDataView<K, V>, false> {
-  using Data = Map_Data<typename MojomTypeTraits<K>::DataAsArrayElement,
-                        typename MojomTypeTraits<V>::DataAsArrayElement>;
-  using DataAsArrayElement = Pointer<Data>;
-
-  static const MojomTypeCategory category = MojomTypeCategory::MAP;
-};
-
-template <>
-struct MojomTypeTraits<NativeStructDataView, false> {
-  using Data = internal::NativeStruct_Data;
-  using DataAsArrayElement = Pointer<Data>;
-
-  static const MojomTypeCategory category = MojomTypeCategory::STRUCT;
-};
-
-template <>
-struct MojomTypeTraits<StringDataView, false> {
-  using Data = String_Data;
-  using DataAsArrayElement = Pointer<Data>;
-
-  static const MojomTypeCategory category = MojomTypeCategory::STRING;
-};
-
-template <typename T, MojomTypeCategory categories>
-struct BelongsTo {
-  static const bool value =
-      static_cast<uint32_t>(MojomTypeTraits<T>::category & categories) != 0;
-};
-
-template <typename T>
-struct EnumHashImpl {
-  static_assert(std::is_enum<T>::value, "Incorrect hash function.");
-
-  size_t operator()(T input) const {
-    using UnderlyingType = typename base::underlying_type<T>::type;
-    return std::hash<UnderlyingType>()(static_cast<UnderlyingType>(input));
-  }
-};
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_BINDINGS_INTERNAL_H_
diff --git a/mojo/public/cpp/bindings/lib/buffer.h b/mojo/public/cpp/bindings/lib/buffer.h
deleted file mode 100644
index 213a445..0000000
--- a/mojo/public/cpp/bindings/lib/buffer.h
+++ /dev/null
@@ -1,70 +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 MOJO_PUBLIC_CPP_BINDINGS_LIB_BUFFER_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_BUFFER_H_
-
-#include <stddef.h>
-
-#include "base/logging.h"
-#include "base/macros.h"
-#include "mojo/public/cpp/bindings/lib/bindings_internal.h"
-
-namespace mojo {
-namespace internal {
-
-// Buffer provides an interface to allocate memory blocks which are 8-byte
-// aligned and zero-initialized. It doesn't own the underlying memory. Users
-// must ensure that the memory stays valid while using the allocated blocks from
-// Buffer.
-class Buffer {
- public:
-  Buffer() {}
-
-  // The memory must have been zero-initialized. |data| must be 8-byte
-  // aligned.
-  void Initialize(void* data, size_t size) {
-    DCHECK(IsAligned(data));
-
-    data_ = data;
-    size_ = size;
-    cursor_ = reinterpret_cast<uintptr_t>(data);
-    data_end_ = cursor_ + size;
-  }
-
-  size_t size() const { return size_; }
-
-  void* data() const { return data_; }
-
-  // Allocates |num_bytes| from the buffer and returns a pointer to the start of
-  // the allocated block.
-  // The resulting address is 8-byte aligned, and the content of the memory is
-  // zero-filled.
-  void* Allocate(size_t num_bytes) {
-    num_bytes = Align(num_bytes);
-    uintptr_t result = cursor_;
-    cursor_ += num_bytes;
-    if (cursor_ > data_end_ || cursor_ < result) {
-      NOTREACHED();
-      cursor_ -= num_bytes;
-      return nullptr;
-    }
-
-    return reinterpret_cast<void*>(result);
-  }
-
- private:
-  void* data_ = nullptr;
-  size_t size_ = 0;
-
-  uintptr_t cursor_ = 0;
-  uintptr_t data_end_ = 0;
-
-  DISALLOW_COPY_AND_ASSIGN(Buffer);
-};
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_BUFFER_H_
diff --git a/mojo/public/cpp/bindings/lib/connector.cc b/mojo/public/cpp/bindings/lib/connector.cc
deleted file mode 100644
index d93e45e..0000000
--- a/mojo/public/cpp/bindings/lib/connector.cc
+++ /dev/null
@@ -1,493 +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 "mojo/public/cpp/bindings/connector.h"
-
-#include <stdint.h>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/lazy_instance.h"
-#include "base/location.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "base/message_loop/message_loop.h"
-#include "base/synchronization/lock.h"
-#include "base/threading/thread_local.h"
-#include "mojo/public/cpp/bindings/lib/may_auto_lock.h"
-#include "mojo/public/cpp/bindings/sync_handle_watcher.h"
-#include "mojo/public/cpp/system/wait.h"
-
-namespace mojo {
-
-namespace {
-
-// The NestingObserver for each thread. Note that this is always a
-// Connector::MessageLoopNestingObserver; we use the base type here because that
-// subclass is private to Connector.
-base::LazyInstance<
-    base::ThreadLocalPointer<base::MessageLoop::NestingObserver>>::Leaky
-    g_tls_nesting_observer = LAZY_INSTANCE_INITIALIZER;
-
-}  // namespace
-
-// Used to efficiently maintain a doubly-linked list of all Connectors
-// currently dispatching on any given thread.
-class Connector::ActiveDispatchTracker {
- public:
-  explicit ActiveDispatchTracker(const base::WeakPtr<Connector>& connector);
-  ~ActiveDispatchTracker();
-
-  void NotifyBeginNesting();
-
- private:
-  const base::WeakPtr<Connector> connector_;
-  MessageLoopNestingObserver* const nesting_observer_;
-  ActiveDispatchTracker* outer_tracker_ = nullptr;
-  ActiveDispatchTracker* inner_tracker_ = nullptr;
-
-  DISALLOW_COPY_AND_ASSIGN(ActiveDispatchTracker);
-};
-
-// Watches the MessageLoop on the current thread. Notifies the current chain of
-// ActiveDispatchTrackers when a nested message loop is started.
-class Connector::MessageLoopNestingObserver
-    : public base::MessageLoop::NestingObserver,
-      public base::MessageLoop::DestructionObserver {
- public:
-  MessageLoopNestingObserver() {
-    base::MessageLoop::current()->AddNestingObserver(this);
-    base::MessageLoop::current()->AddDestructionObserver(this);
-  }
-
-  ~MessageLoopNestingObserver() override {}
-
-  // base::MessageLoop::NestingObserver:
-  void OnBeginNestedMessageLoop() override {
-    if (top_tracker_)
-      top_tracker_->NotifyBeginNesting();
-  }
-
-  // base::MessageLoop::DestructionObserver:
-  void WillDestroyCurrentMessageLoop() override {
-    base::MessageLoop::current()->RemoveNestingObserver(this);
-    base::MessageLoop::current()->RemoveDestructionObserver(this);
-    DCHECK_EQ(this, g_tls_nesting_observer.Get().Get());
-    g_tls_nesting_observer.Get().Set(nullptr);
-    delete this;
-  }
-
-  static MessageLoopNestingObserver* GetForThread() {
-    if (!base::MessageLoop::current() ||
-        !base::MessageLoop::current()->nesting_allowed())
-      return nullptr;
-    auto* observer = static_cast<MessageLoopNestingObserver*>(
-        g_tls_nesting_observer.Get().Get());
-    if (!observer) {
-      observer = new MessageLoopNestingObserver;
-      g_tls_nesting_observer.Get().Set(observer);
-    }
-    return observer;
-  }
-
- private:
-  friend class ActiveDispatchTracker;
-
-  ActiveDispatchTracker* top_tracker_ = nullptr;
-
-  DISALLOW_COPY_AND_ASSIGN(MessageLoopNestingObserver);
-};
-
-Connector::ActiveDispatchTracker::ActiveDispatchTracker(
-    const base::WeakPtr<Connector>& connector)
-    : connector_(connector), nesting_observer_(connector_->nesting_observer_) {
-  DCHECK(nesting_observer_);
-  if (nesting_observer_->top_tracker_) {
-    outer_tracker_ = nesting_observer_->top_tracker_;
-    outer_tracker_->inner_tracker_ = this;
-  }
-  nesting_observer_->top_tracker_ = this;
-}
-
-Connector::ActiveDispatchTracker::~ActiveDispatchTracker() {
-  if (nesting_observer_->top_tracker_ == this)
-    nesting_observer_->top_tracker_ = outer_tracker_;
-  else if (inner_tracker_)
-    inner_tracker_->outer_tracker_ = outer_tracker_;
-  if (outer_tracker_)
-    outer_tracker_->inner_tracker_ = inner_tracker_;
-}
-
-void Connector::ActiveDispatchTracker::NotifyBeginNesting() {
-  if (connector_ && connector_->handle_watcher_)
-    connector_->handle_watcher_->ArmOrNotify();
-  if (outer_tracker_)
-    outer_tracker_->NotifyBeginNesting();
-}
-
-Connector::Connector(ScopedMessagePipeHandle message_pipe,
-                     ConnectorConfig config,
-                     scoped_refptr<base::SingleThreadTaskRunner> runner)
-    : message_pipe_(std::move(message_pipe)),
-      task_runner_(std::move(runner)),
-      nesting_observer_(MessageLoopNestingObserver::GetForThread()),
-      weak_factory_(this) {
-  if (config == MULTI_THREADED_SEND)
-    lock_.emplace();
-
-  weak_self_ = weak_factory_.GetWeakPtr();
-  // Even though we don't have an incoming receiver, we still want to monitor
-  // the message pipe to know if is closed or encounters an error.
-  WaitToReadMore();
-}
-
-Connector::~Connector() {
-  {
-    // Allow for quick destruction on any thread if the pipe is already closed.
-    base::AutoLock lock(connected_lock_);
-    if (!connected_)
-      return;
-  }
-
-  DCHECK(thread_checker_.CalledOnValidThread());
-  CancelWait();
-}
-
-void Connector::CloseMessagePipe() {
-  // Throw away the returned message pipe.
-  PassMessagePipe();
-}
-
-ScopedMessagePipeHandle Connector::PassMessagePipe() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-
-  CancelWait();
-  internal::MayAutoLock locker(&lock_);
-  ScopedMessagePipeHandle message_pipe = std::move(message_pipe_);
-  weak_factory_.InvalidateWeakPtrs();
-  sync_handle_watcher_callback_count_ = 0;
-
-  base::AutoLock lock(connected_lock_);
-  connected_ = false;
-  return message_pipe;
-}
-
-void Connector::RaiseError() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-
-  HandleError(true, true);
-}
-
-bool Connector::WaitForIncomingMessage(MojoDeadline deadline) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-
-  if (error_)
-    return false;
-
-  ResumeIncomingMethodCallProcessing();
-
-  // TODO(rockot): Use a timed Wait here. Nobody uses anything but 0 or
-  // INDEFINITE deadlines at present, so we only support those.
-  DCHECK(deadline == 0 || deadline == MOJO_DEADLINE_INDEFINITE);
-
-  MojoResult rv = MOJO_RESULT_UNKNOWN;
-  if (deadline == 0 && !message_pipe_->QuerySignalsState().readable())
-    return false;
-
-  if (deadline == MOJO_DEADLINE_INDEFINITE) {
-    rv = Wait(message_pipe_.get(), MOJO_HANDLE_SIGNAL_READABLE);
-    if (rv != MOJO_RESULT_OK) {
-      // Users that call WaitForIncomingMessage() should expect their code to be
-      // re-entered, so we call the error handler synchronously.
-      HandleError(rv != MOJO_RESULT_FAILED_PRECONDITION, false);
-      return false;
-    }
-  }
-
-  ignore_result(ReadSingleMessage(&rv));
-  return (rv == MOJO_RESULT_OK);
-}
-
-void Connector::PauseIncomingMethodCallProcessing() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-
-  if (paused_)
-    return;
-
-  paused_ = true;
-  CancelWait();
-}
-
-void Connector::ResumeIncomingMethodCallProcessing() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-
-  if (!paused_)
-    return;
-
-  paused_ = false;
-  WaitToReadMore();
-}
-
-bool Connector::Accept(Message* message) {
-  DCHECK(lock_ || thread_checker_.CalledOnValidThread());
-
-  // It shouldn't hurt even if |error_| may be changed by a different thread at
-  // the same time. The outcome is that we may write into |message_pipe_| after
-  // encountering an error, which should be fine.
-  if (error_)
-    return false;
-
-  internal::MayAutoLock locker(&lock_);
-
-  if (!message_pipe_.is_valid() || drop_writes_)
-    return true;
-
-  MojoResult rv =
-      WriteMessageNew(message_pipe_.get(), message->TakeMojoMessage(),
-                      MOJO_WRITE_MESSAGE_FLAG_NONE);
-
-  switch (rv) {
-    case MOJO_RESULT_OK:
-      break;
-    case MOJO_RESULT_FAILED_PRECONDITION:
-      // There's no point in continuing to write to this pipe since the other
-      // end is gone. Avoid writing any future messages. Hide write failures
-      // from the caller since we'd like them to continue consuming any backlog
-      // of incoming messages before regarding the message pipe as closed.
-      drop_writes_ = true;
-      break;
-    case MOJO_RESULT_BUSY:
-      // We'd get a "busy" result if one of the message's handles is:
-      //   - |message_pipe_|'s own handle;
-      //   - simultaneously being used on another thread; or
-      //   - in a "busy" state that prohibits it from being transferred (e.g.,
-      //     a data pipe handle in the middle of a two-phase read/write,
-      //     regardless of which thread that two-phase read/write is happening
-      //     on).
-      // TODO(vtl): I wonder if this should be a |DCHECK()|. (But, until
-      // crbug.com/389666, etc. are resolved, this will make tests fail quickly
-      // rather than hanging.)
-      CHECK(false) << "Race condition or other bug detected";
-      return false;
-    default:
-      // This particular write was rejected, presumably because of bad input.
-      // The pipe is not necessarily in a bad state.
-      return false;
-  }
-  return true;
-}
-
-void Connector::AllowWokenUpBySyncWatchOnSameThread() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-
-  allow_woken_up_by_others_ = true;
-
-  EnsureSyncWatcherExists();
-  sync_watcher_->AllowWokenUpBySyncWatchOnSameThread();
-}
-
-bool Connector::SyncWatch(const bool* should_stop) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-
-  if (error_)
-    return false;
-
-  ResumeIncomingMethodCallProcessing();
-
-  EnsureSyncWatcherExists();
-  return sync_watcher_->SyncWatch(should_stop);
-}
-
-void Connector::SetWatcherHeapProfilerTag(const char* tag) {
-  heap_profiler_tag_ = tag;
-  if (handle_watcher_) {
-    handle_watcher_->set_heap_profiler_tag(tag);
-  }
-}
-
-void Connector::OnWatcherHandleReady(MojoResult result) {
-  OnHandleReadyInternal(result);
-}
-
-void Connector::OnSyncHandleWatcherHandleReady(MojoResult result) {
-  base::WeakPtr<Connector> weak_self(weak_self_);
-
-  sync_handle_watcher_callback_count_++;
-  OnHandleReadyInternal(result);
-  // At this point, this object might have been deleted.
-  if (weak_self) {
-    DCHECK_LT(0u, sync_handle_watcher_callback_count_);
-    sync_handle_watcher_callback_count_--;
-  }
-}
-
-void Connector::OnHandleReadyInternal(MojoResult result) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-
-  if (result != MOJO_RESULT_OK) {
-    HandleError(result != MOJO_RESULT_FAILED_PRECONDITION, false);
-    return;
-  }
-
-  ReadAllAvailableMessages();
-  // At this point, this object might have been deleted. Return.
-}
-
-void Connector::WaitToReadMore() {
-  CHECK(!paused_);
-  DCHECK(!handle_watcher_);
-
-  handle_watcher_.reset(new SimpleWatcher(
-      FROM_HERE, SimpleWatcher::ArmingPolicy::MANUAL, task_runner_));
-  if (heap_profiler_tag_)
-    handle_watcher_->set_heap_profiler_tag(heap_profiler_tag_);
-  MojoResult rv = handle_watcher_->Watch(
-      message_pipe_.get(), MOJO_HANDLE_SIGNAL_READABLE,
-      base::Bind(&Connector::OnWatcherHandleReady, base::Unretained(this)));
-
-  if (rv != MOJO_RESULT_OK) {
-    // If the watch failed because the handle is invalid or its conditions can
-    // no longer be met, we signal the error asynchronously to avoid reentry.
-    task_runner_->PostTask(
-        FROM_HERE,
-        base::Bind(&Connector::OnWatcherHandleReady, weak_self_, rv));
-  } else {
-    handle_watcher_->ArmOrNotify();
-  }
-
-  if (allow_woken_up_by_others_) {
-    EnsureSyncWatcherExists();
-    sync_watcher_->AllowWokenUpBySyncWatchOnSameThread();
-  }
-}
-
-bool Connector::ReadSingleMessage(MojoResult* read_result) {
-  CHECK(!paused_);
-
-  bool receiver_result = false;
-
-  // Detect if |this| was destroyed or the message pipe was closed/transferred
-  // during message dispatch.
-  base::WeakPtr<Connector> weak_self = weak_self_;
-
-  Message message;
-  const MojoResult rv = ReadMessage(message_pipe_.get(), &message);
-  *read_result = rv;
-
-  if (rv == MOJO_RESULT_OK) {
-    base::Optional<ActiveDispatchTracker> dispatch_tracker;
-    if (!is_dispatching_ && nesting_observer_) {
-      is_dispatching_ = true;
-      dispatch_tracker.emplace(weak_self);
-    }
-
-    receiver_result =
-        incoming_receiver_ && incoming_receiver_->Accept(&message);
-
-    if (!weak_self)
-      return false;
-
-    if (dispatch_tracker) {
-      is_dispatching_ = false;
-      dispatch_tracker.reset();
-    }
-  } else if (rv == MOJO_RESULT_SHOULD_WAIT) {
-    return true;
-  } else {
-    HandleError(rv != MOJO_RESULT_FAILED_PRECONDITION, false);
-    return false;
-  }
-
-  if (enforce_errors_from_incoming_receiver_ && !receiver_result) {
-    HandleError(true, false);
-    return false;
-  }
-  return true;
-}
-
-void Connector::ReadAllAvailableMessages() {
-  while (!error_) {
-    base::WeakPtr<Connector> weak_self = weak_self_;
-    MojoResult rv;
-
-    // May delete |this.|
-    if (!ReadSingleMessage(&rv))
-      return;
-
-    if (!weak_self || paused_)
-      return;
-
-    DCHECK(rv == MOJO_RESULT_OK || rv == MOJO_RESULT_SHOULD_WAIT);
-
-    if (rv == MOJO_RESULT_SHOULD_WAIT) {
-      // Attempt to re-arm the Watcher.
-      MojoResult ready_result;
-      MojoResult arm_result = handle_watcher_->Arm(&ready_result);
-      if (arm_result == MOJO_RESULT_OK)
-        return;
-
-      // The watcher is already ready to notify again.
-      DCHECK_EQ(MOJO_RESULT_FAILED_PRECONDITION, arm_result);
-
-      if (ready_result == MOJO_RESULT_FAILED_PRECONDITION) {
-        HandleError(false, false);
-        return;
-      }
-
-      // There's more to read now, so we'll just keep looping.
-      DCHECK_EQ(MOJO_RESULT_OK, ready_result);
-    }
-  }
-}
-
-void Connector::CancelWait() {
-  handle_watcher_.reset();
-  sync_watcher_.reset();
-}
-
-void Connector::HandleError(bool force_pipe_reset, bool force_async_handler) {
-  if (error_ || !message_pipe_.is_valid())
-    return;
-
-  if (paused_) {
-    // Enforce calling the error handler asynchronously if the user has paused
-    // receiving messages. We need to wait until the user starts receiving
-    // messages again.
-    force_async_handler = true;
-  }
-
-  if (!force_pipe_reset && force_async_handler)
-    force_pipe_reset = true;
-
-  if (force_pipe_reset) {
-    CancelWait();
-    internal::MayAutoLock locker(&lock_);
-    message_pipe_.reset();
-    MessagePipe dummy_pipe;
-    message_pipe_ = std::move(dummy_pipe.handle0);
-  } else {
-    CancelWait();
-  }
-
-  if (force_async_handler) {
-    if (!paused_)
-      WaitToReadMore();
-  } else {
-    error_ = true;
-    if (!connection_error_handler_.is_null())
-      connection_error_handler_.Run();
-  }
-}
-
-void Connector::EnsureSyncWatcherExists() {
-  if (sync_watcher_)
-    return;
-  sync_watcher_.reset(new SyncHandleWatcher(
-      message_pipe_.get(), MOJO_HANDLE_SIGNAL_READABLE,
-      base::Bind(&Connector::OnSyncHandleWatcherHandleReady,
-                 base::Unretained(this))));
-}
-
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/control_message_handler.cc b/mojo/public/cpp/bindings/lib/control_message_handler.cc
deleted file mode 100644
index 1b7bb78..0000000
--- a/mojo/public/cpp/bindings/lib/control_message_handler.cc
+++ /dev/null
@@ -1,150 +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 "mojo/public/cpp/bindings/lib/control_message_handler.h"
-
-#include <stddef.h>
-#include <stdint.h>
-#include <utility>
-
-#include "base/logging.h"
-#include "base/macros.h"
-#include "mojo/public/cpp/bindings/lib/message_builder.h"
-#include "mojo/public/cpp/bindings/lib/serialization.h"
-#include "mojo/public/cpp/bindings/lib/validation_util.h"
-#include "mojo/public/interfaces/bindings/interface_control_messages.mojom.h"
-
-namespace mojo {
-namespace internal {
-namespace {
-
-bool ValidateControlRequestWithResponse(Message* message) {
-  ValidationContext validation_context(message->payload(),
-                                       message->payload_num_bytes(), 0, 0,
-                                       message, "ControlRequestValidator");
-  if (!ValidateMessageIsRequestExpectingResponse(message, &validation_context))
-    return false;
-
-  switch (message->header()->name) {
-    case interface_control::kRunMessageId:
-      return ValidateMessagePayload<
-          interface_control::internal::RunMessageParams_Data>(
-          message, &validation_context);
-  }
-  return false;
-}
-
-bool ValidateControlRequestWithoutResponse(Message* message) {
-  ValidationContext validation_context(message->payload(),
-                                       message->payload_num_bytes(), 0, 0,
-                                       message, "ControlRequestValidator");
-  if (!ValidateMessageIsRequestWithoutResponse(message, &validation_context))
-    return false;
-
-  switch (message->header()->name) {
-    case interface_control::kRunOrClosePipeMessageId:
-      return ValidateMessageIsRequestWithoutResponse(message,
-                                                     &validation_context) &&
-             ValidateMessagePayload<
-                 interface_control::internal::RunOrClosePipeMessageParams_Data>(
-                 message, &validation_context);
-  }
-  return false;
-}
-
-}  // namespace
-
-// static
-bool ControlMessageHandler::IsControlMessage(const Message* message) {
-  return message->header()->name == interface_control::kRunMessageId ||
-         message->header()->name == interface_control::kRunOrClosePipeMessageId;
-}
-
-ControlMessageHandler::ControlMessageHandler(uint32_t interface_version)
-    : interface_version_(interface_version) {
-}
-
-ControlMessageHandler::~ControlMessageHandler() {
-}
-
-bool ControlMessageHandler::Accept(Message* message) {
-  if (!ValidateControlRequestWithoutResponse(message))
-    return false;
-
-  if (message->header()->name == interface_control::kRunOrClosePipeMessageId)
-    return RunOrClosePipe(message);
-
-  NOTREACHED();
-  return false;
-}
-
-bool ControlMessageHandler::AcceptWithResponder(
-    Message* message,
-    std::unique_ptr<MessageReceiverWithStatus> responder) {
-  if (!ValidateControlRequestWithResponse(message))
-    return false;
-
-  if (message->header()->name == interface_control::kRunMessageId)
-    return Run(message, std::move(responder));
-
-  NOTREACHED();
-  return false;
-}
-
-bool ControlMessageHandler::Run(
-    Message* message,
-    std::unique_ptr<MessageReceiverWithStatus> responder) {
-  interface_control::internal::RunMessageParams_Data* params =
-      reinterpret_cast<interface_control::internal::RunMessageParams_Data*>(
-          message->mutable_payload());
-  interface_control::RunMessageParamsPtr params_ptr;
-  Deserialize<interface_control::RunMessageParamsDataView>(params, &params_ptr,
-                                                           &context_);
-  auto& input = *params_ptr->input;
-  interface_control::RunOutputPtr output = interface_control::RunOutput::New();
-  if (input.is_query_version()) {
-    output->set_query_version_result(
-        interface_control::QueryVersionResult::New());
-    output->get_query_version_result()->version = interface_version_;
-  } else if (input.is_flush_for_testing()) {
-    output.reset();
-  } else {
-    output.reset();
-  }
-
-  auto response_params_ptr = interface_control::RunResponseMessageParams::New();
-  response_params_ptr->output = std::move(output);
-  size_t size =
-      PrepareToSerialize<interface_control::RunResponseMessageParamsDataView>(
-          response_params_ptr, &context_);
-  MessageBuilder builder(interface_control::kRunMessageId,
-                         Message::kFlagIsResponse, size, 0);
-  builder.message()->set_request_id(message->request_id());
-
-  interface_control::internal::RunResponseMessageParams_Data* response_params =
-      nullptr;
-  Serialize<interface_control::RunResponseMessageParamsDataView>(
-      response_params_ptr, builder.buffer(), &response_params, &context_);
-  ignore_result(responder->Accept(builder.message()));
-
-  return true;
-}
-
-bool ControlMessageHandler::RunOrClosePipe(Message* message) {
-  interface_control::internal::RunOrClosePipeMessageParams_Data* params =
-      reinterpret_cast<
-          interface_control::internal::RunOrClosePipeMessageParams_Data*>(
-          message->mutable_payload());
-  interface_control::RunOrClosePipeMessageParamsPtr params_ptr;
-  Deserialize<interface_control::RunOrClosePipeMessageParamsDataView>(
-      params, &params_ptr, &context_);
-  auto& input = *params_ptr->input;
-  if (input.is_require_version())
-    return interface_version_ >= input.get_require_version()->version;
-
-  return false;
-}
-
-}  // namespace internal
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/control_message_handler.h b/mojo/public/cpp/bindings/lib/control_message_handler.h
deleted file mode 100644
index 5d1f716..0000000
--- a/mojo/public/cpp/bindings/lib/control_message_handler.h
+++ /dev/null
@@ -1,48 +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 MOJO_PUBLIC_CPP_BINDINGS_LIB_CONTROL_MESSAGE_HANDLER_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_CONTROL_MESSAGE_HANDLER_H_
-
-#include <stdint.h>
-
-#include "base/compiler_specific.h"
-#include "base/macros.h"
-#include "mojo/public/cpp/bindings/bindings_export.h"
-#include "mojo/public/cpp/bindings/lib/serialization_context.h"
-#include "mojo/public/cpp/bindings/message.h"
-
-namespace mojo {
-namespace internal {
-
-// Handlers for request messages defined in interface_control_messages.mojom.
-class MOJO_CPP_BINDINGS_EXPORT ControlMessageHandler
-    : NON_EXPORTED_BASE(public MessageReceiverWithResponderStatus) {
- public:
-  static bool IsControlMessage(const Message* message);
-
-  explicit ControlMessageHandler(uint32_t interface_version);
-  ~ControlMessageHandler() override;
-
-  // Call the following methods only if IsControlMessage() returned true.
-  bool Accept(Message* message) override;
-  bool AcceptWithResponder(
-      Message* message,
-      std::unique_ptr<MessageReceiverWithStatus> responder) override;
-
- private:
-  bool Run(Message* message,
-           std::unique_ptr<MessageReceiverWithStatus> responder);
-  bool RunOrClosePipe(Message* message);
-
-  uint32_t interface_version_;
-  SerializationContext context_;
-
-  DISALLOW_COPY_AND_ASSIGN(ControlMessageHandler);
-};
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_CONTROL_MESSAGE_HANDLER_H_
diff --git a/mojo/public/cpp/bindings/lib/control_message_proxy.cc b/mojo/public/cpp/bindings/lib/control_message_proxy.cc
deleted file mode 100644
index d082b49..0000000
--- a/mojo/public/cpp/bindings/lib/control_message_proxy.cc
+++ /dev/null
@@ -1,188 +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 "mojo/public/cpp/bindings/lib/control_message_proxy.h"
-
-#include <stddef.h>
-#include <stdint.h>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/callback_helpers.h"
-#include "base/macros.h"
-#include "base/run_loop.h"
-#include "mojo/public/cpp/bindings/lib/message_builder.h"
-#include "mojo/public/cpp/bindings/lib/serialization.h"
-#include "mojo/public/cpp/bindings/lib/validation_util.h"
-#include "mojo/public/cpp/bindings/message.h"
-#include "mojo/public/interfaces/bindings/interface_control_messages.mojom.h"
-
-namespace mojo {
-namespace internal {
-
-namespace {
-
-bool ValidateControlResponse(Message* message) {
-  ValidationContext validation_context(message->payload(),
-                                       message->payload_num_bytes(), 0, 0,
-                                       message, "ControlResponseValidator");
-  if (!ValidateMessageIsResponse(message, &validation_context))
-    return false;
-
-  switch (message->header()->name) {
-    case interface_control::kRunMessageId:
-      return ValidateMessagePayload<
-          interface_control::internal::RunResponseMessageParams_Data>(
-          message, &validation_context);
-  }
-  return false;
-}
-
-using RunCallback =
-    base::Callback<void(interface_control::RunResponseMessageParamsPtr)>;
-
-class RunResponseForwardToCallback : public MessageReceiver {
- public:
-  explicit RunResponseForwardToCallback(const RunCallback& callback)
-      : callback_(callback) {}
-  bool Accept(Message* message) override;
-
- private:
-  RunCallback callback_;
-  DISALLOW_COPY_AND_ASSIGN(RunResponseForwardToCallback);
-};
-
-bool RunResponseForwardToCallback::Accept(Message* message) {
-  if (!ValidateControlResponse(message))
-    return false;
-
-  interface_control::internal::RunResponseMessageParams_Data* params =
-      reinterpret_cast<
-          interface_control::internal::RunResponseMessageParams_Data*>(
-          message->mutable_payload());
-  interface_control::RunResponseMessageParamsPtr params_ptr;
-  SerializationContext context;
-  Deserialize<interface_control::RunResponseMessageParamsDataView>(
-      params, &params_ptr, &context);
-
-  callback_.Run(std::move(params_ptr));
-  return true;
-}
-
-void SendRunMessage(MessageReceiverWithResponder* receiver,
-                    interface_control::RunInputPtr input_ptr,
-                    const RunCallback& callback) {
-  SerializationContext context;
-
-  auto params_ptr = interface_control::RunMessageParams::New();
-  params_ptr->input = std::move(input_ptr);
-  size_t size = PrepareToSerialize<interface_control::RunMessageParamsDataView>(
-      params_ptr, &context);
-  MessageBuilder builder(interface_control::kRunMessageId,
-                         Message::kFlagExpectsResponse, size, 0);
-
-  interface_control::internal::RunMessageParams_Data* params = nullptr;
-  Serialize<interface_control::RunMessageParamsDataView>(
-      params_ptr, builder.buffer(), &params, &context);
-  std::unique_ptr<MessageReceiver> responder =
-      base::MakeUnique<RunResponseForwardToCallback>(callback);
-  ignore_result(
-      receiver->AcceptWithResponder(builder.message(), std::move(responder)));
-}
-
-Message ConstructRunOrClosePipeMessage(
-    interface_control::RunOrClosePipeInputPtr input_ptr) {
-  SerializationContext context;
-
-  auto params_ptr = interface_control::RunOrClosePipeMessageParams::New();
-  params_ptr->input = std::move(input_ptr);
-
-  size_t size = PrepareToSerialize<
-      interface_control::RunOrClosePipeMessageParamsDataView>(params_ptr,
-                                                              &context);
-  MessageBuilder builder(interface_control::kRunOrClosePipeMessageId, 0, size,
-                         0);
-
-  interface_control::internal::RunOrClosePipeMessageParams_Data* params =
-      nullptr;
-  Serialize<interface_control::RunOrClosePipeMessageParamsDataView>(
-      params_ptr, builder.buffer(), &params, &context);
-  return std::move(*builder.message());
-}
-
-void SendRunOrClosePipeMessage(
-    MessageReceiverWithResponder* receiver,
-    interface_control::RunOrClosePipeInputPtr input_ptr) {
-  Message message(ConstructRunOrClosePipeMessage(std::move(input_ptr)));
-
-  ignore_result(receiver->Accept(&message));
-}
-
-void RunVersionCallback(
-    const base::Callback<void(uint32_t)>& callback,
-    interface_control::RunResponseMessageParamsPtr run_response) {
-  uint32_t version = 0u;
-  if (run_response->output && run_response->output->is_query_version_result())
-    version = run_response->output->get_query_version_result()->version;
-  callback.Run(version);
-}
-
-void RunClosure(const base::Closure& callback,
-                interface_control::RunResponseMessageParamsPtr run_response) {
-  callback.Run();
-}
-
-}  // namespace
-
-ControlMessageProxy::ControlMessageProxy(MessageReceiverWithResponder* receiver)
-    : receiver_(receiver) {
-}
-
-ControlMessageProxy::~ControlMessageProxy() = default;
-
-void ControlMessageProxy::QueryVersion(
-    const base::Callback<void(uint32_t)>& callback) {
-  auto input_ptr = interface_control::RunInput::New();
-  input_ptr->set_query_version(interface_control::QueryVersion::New());
-  SendRunMessage(receiver_, std::move(input_ptr),
-                 base::Bind(&RunVersionCallback, callback));
-}
-
-void ControlMessageProxy::RequireVersion(uint32_t version) {
-  auto require_version = interface_control::RequireVersion::New();
-  require_version->version = version;
-  auto input_ptr = interface_control::RunOrClosePipeInput::New();
-  input_ptr->set_require_version(std::move(require_version));
-  SendRunOrClosePipeMessage(receiver_, std::move(input_ptr));
-}
-
-void ControlMessageProxy::FlushForTesting() {
-  if (encountered_error_)
-    return;
-
-  auto input_ptr = interface_control::RunInput::New();
-  input_ptr->set_flush_for_testing(interface_control::FlushForTesting::New());
-  base::RunLoop run_loop;
-  run_loop_quit_closure_ = run_loop.QuitClosure();
-  SendRunMessage(
-      receiver_, std::move(input_ptr),
-      base::Bind(&RunClosure,
-                 base::Bind(&ControlMessageProxy::RunFlushForTestingClosure,
-                            base::Unretained(this))));
-  run_loop.Run();
-}
-
-void ControlMessageProxy::RunFlushForTestingClosure() {
-  DCHECK(!run_loop_quit_closure_.is_null());
-  base::ResetAndReturn(&run_loop_quit_closure_).Run();
-}
-
-void ControlMessageProxy::OnConnectionError() {
-  encountered_error_ = true;
-  if (!run_loop_quit_closure_.is_null())
-    RunFlushForTestingClosure();
-}
-
-}  // namespace internal
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/control_message_proxy.h b/mojo/public/cpp/bindings/lib/control_message_proxy.h
deleted file mode 100644
index 2f9314e..0000000
--- a/mojo/public/cpp/bindings/lib/control_message_proxy.h
+++ /dev/null
@@ -1,49 +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 MOJO_PUBLIC_CPP_BINDINGS_LIB_CONTROL_MESSAGE_PROXY_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_CONTROL_MESSAGE_PROXY_H_
-
-#include <stdint.h>
-
-#include "base/callback.h"
-#include "base/macros.h"
-#include "mojo/public/cpp/bindings/bindings_export.h"
-#include "mojo/public/cpp/bindings/lib/serialization_context.h"
-
-namespace mojo {
-
-class MessageReceiverWithResponder;
-
-namespace internal {
-
-// Proxy for request messages defined in interface_control_messages.mojom.
-class MOJO_CPP_BINDINGS_EXPORT ControlMessageProxy {
- public:
-  // Doesn't take ownership of |receiver|. It must outlive this object.
-  explicit ControlMessageProxy(MessageReceiverWithResponder* receiver);
-  ~ControlMessageProxy();
-
-  void QueryVersion(const base::Callback<void(uint32_t)>& callback);
-  void RequireVersion(uint32_t version);
-
-  void FlushForTesting();
-  void OnConnectionError();
-
- private:
-  void RunFlushForTestingClosure();
-
-  // Not owned.
-  MessageReceiverWithResponder* receiver_;
-  bool encountered_error_ = false;
-
-  base::Closure run_loop_quit_closure_;
-
-  DISALLOW_COPY_AND_ASSIGN(ControlMessageProxy);
-};
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_CONTROL_MESSAGE_PROXY_H_
diff --git a/mojo/public/cpp/bindings/lib/equals_traits.h b/mojo/public/cpp/bindings/lib/equals_traits.h
deleted file mode 100644
index 53c7dce..0000000
--- a/mojo/public/cpp/bindings/lib/equals_traits.h
+++ /dev/null
@@ -1,94 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_EQUALS_TRAITS_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_EQUALS_TRAITS_H_
-
-#include <type_traits>
-#include <unordered_map>
-#include <vector>
-
-#include "base/optional.h"
-#include "mojo/public/cpp/bindings/lib/template_util.h"
-
-namespace mojo {
-namespace internal {
-
-template <typename T>
-struct HasEqualsMethod {
-  template <typename U>
-  static char Test(decltype(&U::Equals));
-  template <typename U>
-  static int Test(...);
-  static const bool value = sizeof(Test<T>(0)) == sizeof(char);
-
- private:
-  EnsureTypeIsComplete<T> check_t_;
-};
-
-template <typename T, bool has_equals_method = HasEqualsMethod<T>::value>
-struct EqualsTraits;
-
-template <typename T>
-bool Equals(const T& a, const T& b);
-
-template <typename T>
-struct EqualsTraits<T, true> {
-  static bool Equals(const T& a, const T& b) { return a.Equals(b); }
-};
-
-template <typename T>
-struct EqualsTraits<T, false> {
-  static bool Equals(const T& a, const T& b) { return a == b; }
-};
-
-template <typename T>
-struct EqualsTraits<base::Optional<T>, false> {
-  static bool Equals(const base::Optional<T>& a, const base::Optional<T>& b) {
-    if (!a && !b)
-      return true;
-    if (!a || !b)
-      return false;
-
-    return internal::Equals(*a, *b);
-  }
-};
-
-template <typename T>
-struct EqualsTraits<std::vector<T>, false> {
-  static bool Equals(const std::vector<T>& a, const std::vector<T>& b) {
-    if (a.size() != b.size())
-      return false;
-    for (size_t i = 0; i < a.size(); ++i) {
-      if (!internal::Equals(a[i], b[i]))
-        return false;
-    }
-    return true;
-  }
-};
-
-template <typename K, typename V>
-struct EqualsTraits<std::unordered_map<K, V>, false> {
-  static bool Equals(const std::unordered_map<K, V>& a,
-                     const std::unordered_map<K, V>& b) {
-    if (a.size() != b.size())
-      return false;
-    for (const auto& element : a) {
-      auto iter = b.find(element.first);
-      if (iter == b.end() || !internal::Equals(element.second, iter->second))
-        return false;
-    }
-    return true;
-  }
-};
-
-template <typename T>
-bool Equals(const T& a, const T& b) {
-  return EqualsTraits<T>::Equals(a, b);
-}
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_EQUALS_TRAITS_H_
diff --git a/mojo/public/cpp/bindings/lib/filter_chain.cc b/mojo/public/cpp/bindings/lib/filter_chain.cc
deleted file mode 100644
index 5d919fe..0000000
--- a/mojo/public/cpp/bindings/lib/filter_chain.cc
+++ /dev/null
@@ -1,47 +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 "mojo/public/cpp/bindings/filter_chain.h"
-
-#include <algorithm>
-
-#include "base/logging.h"
-
-namespace mojo {
-
-FilterChain::FilterChain(MessageReceiver* sink) : sink_(sink) {
-}
-
-FilterChain::FilterChain(FilterChain&& other) : sink_(other.sink_) {
-  other.sink_ = nullptr;
-  filters_.swap(other.filters_);
-}
-
-FilterChain& FilterChain::operator=(FilterChain&& other) {
-  std::swap(sink_, other.sink_);
-  filters_.swap(other.filters_);
-  return *this;
-}
-
-FilterChain::~FilterChain() {
-}
-
-void FilterChain::SetSink(MessageReceiver* sink) {
-  DCHECK(!sink_);
-  sink_ = sink;
-}
-
-bool FilterChain::Accept(Message* message) {
-  DCHECK(sink_);
-  for (auto& filter : filters_)
-    if (!filter->Accept(message))
-      return false;
-  return sink_->Accept(message);
-}
-
-void FilterChain::Append(std::unique_ptr<MessageReceiver> filter) {
-  filters_.emplace_back(std::move(filter));
-}
-
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/fixed_buffer.cc b/mojo/public/cpp/bindings/lib/fixed_buffer.cc
deleted file mode 100644
index 725a193..0000000
--- a/mojo/public/cpp/bindings/lib/fixed_buffer.cc
+++ /dev/null
@@ -1,30 +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 "mojo/public/cpp/bindings/lib/fixed_buffer.h"
-
-#include <stdlib.h>
-
-namespace mojo {
-namespace internal {
-
-FixedBufferForTesting::FixedBufferForTesting(size_t size) {
-  size = internal::Align(size);
-  // Use calloc here to ensure all message memory is zero'd out.
-  void* ptr = calloc(size, 1);
-  Initialize(ptr, size);
-}
-
-FixedBufferForTesting::~FixedBufferForTesting() {
-  free(data());
-}
-
-void* FixedBufferForTesting::Leak() {
-  void* ptr = data();
-  Initialize(nullptr, 0);
-  return ptr;
-}
-
-}  // namespace internal
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/fixed_buffer.h b/mojo/public/cpp/bindings/lib/fixed_buffer.h
deleted file mode 100644
index 070b0c8..0000000
--- a/mojo/public/cpp/bindings/lib/fixed_buffer.h
+++ /dev/null
@@ -1,39 +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 MOJO_PUBLIC_CPP_BINDINGS_LIB_FIXED_BUFFER_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_FIXED_BUFFER_H_
-
-#include <stddef.h>
-
-#include "base/compiler_specific.h"
-#include "base/macros.h"
-#include "mojo/public/cpp/bindings/bindings_export.h"
-#include "mojo/public/cpp/bindings/lib/buffer.h"
-
-namespace mojo {
-namespace internal {
-
-// FixedBufferForTesting owns its buffer. The Leak method may be used to steal
-// the underlying memory.
-class MOJO_CPP_BINDINGS_EXPORT FixedBufferForTesting
-    : NON_EXPORTED_BASE(public Buffer) {
- public:
-  explicit FixedBufferForTesting(size_t size);
-  ~FixedBufferForTesting();
-
-  // Returns the internal memory owned by the Buffer to the caller. The Buffer
-  // relinquishes its pointer, effectively resetting the state of the Buffer
-  // and leaving the caller responsible for freeing the returned memory address
-  // when no longer needed.
-  void* Leak();
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(FixedBufferForTesting);
-};
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_FIXED_BUFFER_H_
diff --git a/mojo/public/cpp/bindings/lib/handle_interface_serialization.h b/mojo/public/cpp/bindings/lib/handle_interface_serialization.h
deleted file mode 100644
index 14ed21f..0000000
--- a/mojo/public/cpp/bindings/lib/handle_interface_serialization.h
+++ /dev/null
@@ -1,181 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_HANDLE_INTERFACE_SERIALIZATION_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_HANDLE_INTERFACE_SERIALIZATION_H_
-
-#include <type_traits>
-
-#include "mojo/public/cpp/bindings/associated_group_controller.h"
-#include "mojo/public/cpp/bindings/associated_interface_ptr_info.h"
-#include "mojo/public/cpp/bindings/associated_interface_request.h"
-#include "mojo/public/cpp/bindings/interface_data_view.h"
-#include "mojo/public/cpp/bindings/interface_ptr.h"
-#include "mojo/public/cpp/bindings/interface_request.h"
-#include "mojo/public/cpp/bindings/lib/bindings_internal.h"
-#include "mojo/public/cpp/bindings/lib/serialization_context.h"
-#include "mojo/public/cpp/bindings/lib/serialization_forward.h"
-#include "mojo/public/cpp/system/handle.h"
-
-namespace mojo {
-namespace internal {
-
-template <typename Base, typename T>
-struct Serializer<AssociatedInterfacePtrInfoDataView<Base>,
-                  AssociatedInterfacePtrInfo<T>> {
-  static_assert(std::is_base_of<Base, T>::value, "Interface type mismatch.");
-
-  static size_t PrepareToSerialize(const AssociatedInterfacePtrInfo<T>& input,
-                                   SerializationContext* context) {
-    if (input.handle().is_valid())
-      context->associated_endpoint_count++;
-    return 0;
-  }
-
-  static void Serialize(AssociatedInterfacePtrInfo<T>& input,
-                        AssociatedInterface_Data* output,
-                        SerializationContext* context) {
-    DCHECK(!input.handle().is_valid() || input.handle().pending_association());
-    if (input.handle().is_valid()) {
-      // Set to the index of the element pushed to the back of the vector.
-      output->handle.value =
-          static_cast<uint32_t>(context->associated_endpoint_handles.size());
-      context->associated_endpoint_handles.push_back(input.PassHandle());
-    } else {
-      output->handle.value = kEncodedInvalidHandleValue;
-    }
-    output->version = input.version();
-  }
-
-  static bool Deserialize(AssociatedInterface_Data* input,
-                          AssociatedInterfacePtrInfo<T>* output,
-                          SerializationContext* context) {
-    if (input->handle.is_valid()) {
-      DCHECK_LT(input->handle.value,
-                context->associated_endpoint_handles.size());
-      output->set_handle(
-          std::move(context->associated_endpoint_handles[input->handle.value]));
-    } else {
-      output->set_handle(ScopedInterfaceEndpointHandle());
-    }
-    output->set_version(input->version);
-    return true;
-  }
-};
-
-template <typename Base, typename T>
-struct Serializer<AssociatedInterfaceRequestDataView<Base>,
-                  AssociatedInterfaceRequest<T>> {
-  static_assert(std::is_base_of<Base, T>::value, "Interface type mismatch.");
-
-  static size_t PrepareToSerialize(const AssociatedInterfaceRequest<T>& input,
-                                   SerializationContext* context) {
-    if (input.handle().is_valid())
-      context->associated_endpoint_count++;
-    return 0;
-  }
-
-  static void Serialize(AssociatedInterfaceRequest<T>& input,
-                        AssociatedEndpointHandle_Data* output,
-                        SerializationContext* context) {
-    DCHECK(!input.handle().is_valid() || input.handle().pending_association());
-    if (input.handle().is_valid()) {
-      // Set to the index of the element pushed to the back of the vector.
-      output->value =
-          static_cast<uint32_t>(context->associated_endpoint_handles.size());
-      context->associated_endpoint_handles.push_back(input.PassHandle());
-    } else {
-      output->value = kEncodedInvalidHandleValue;
-    }
-  }
-
-  static bool Deserialize(AssociatedEndpointHandle_Data* input,
-                          AssociatedInterfaceRequest<T>* output,
-                          SerializationContext* context) {
-    if (input->is_valid()) {
-      DCHECK_LT(input->value, context->associated_endpoint_handles.size());
-      output->Bind(
-          std::move(context->associated_endpoint_handles[input->value]));
-    } else {
-      output->Bind(ScopedInterfaceEndpointHandle());
-    }
-    return true;
-  }
-};
-
-template <typename Base, typename T>
-struct Serializer<InterfacePtrDataView<Base>, InterfacePtr<T>> {
-  static_assert(std::is_base_of<Base, T>::value, "Interface type mismatch.");
-
-  static size_t PrepareToSerialize(const InterfacePtr<T>& input,
-                                   SerializationContext* context) {
-    return 0;
-  }
-
-  static void Serialize(InterfacePtr<T>& input,
-                        Interface_Data* output,
-                        SerializationContext* context) {
-    InterfacePtrInfo<T> info = input.PassInterface();
-    output->handle = context->handles.AddHandle(info.PassHandle().release());
-    output->version = info.version();
-  }
-
-  static bool Deserialize(Interface_Data* input,
-                          InterfacePtr<T>* output,
-                          SerializationContext* context) {
-    output->Bind(InterfacePtrInfo<T>(
-        context->handles.TakeHandleAs<mojo::MessagePipeHandle>(input->handle),
-        input->version));
-    return true;
-  }
-};
-
-template <typename Base, typename T>
-struct Serializer<InterfaceRequestDataView<Base>, InterfaceRequest<T>> {
-  static_assert(std::is_base_of<Base, T>::value, "Interface type mismatch.");
-
-  static size_t PrepareToSerialize(const InterfaceRequest<T>& input,
-                                   SerializationContext* context) {
-    return 0;
-  }
-
-  static void Serialize(InterfaceRequest<T>& input,
-                        Handle_Data* output,
-                        SerializationContext* context) {
-    *output = context->handles.AddHandle(input.PassMessagePipe().release());
-  }
-
-  static bool Deserialize(Handle_Data* input,
-                          InterfaceRequest<T>* output,
-                          SerializationContext* context) {
-    output->Bind(context->handles.TakeHandleAs<MessagePipeHandle>(*input));
-    return true;
-  }
-};
-
-template <typename T>
-struct Serializer<ScopedHandleBase<T>, ScopedHandleBase<T>> {
-  static size_t PrepareToSerialize(const ScopedHandleBase<T>& input,
-                                   SerializationContext* context) {
-    return 0;
-  }
-
-  static void Serialize(ScopedHandleBase<T>& input,
-                        Handle_Data* output,
-                        SerializationContext* context) {
-    *output = context->handles.AddHandle(input.release());
-  }
-
-  static bool Deserialize(Handle_Data* input,
-                          ScopedHandleBase<T>* output,
-                          SerializationContext* context) {
-    *output = context->handles.TakeHandleAs<T>(*input);
-    return true;
-  }
-};
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_HANDLE_INTERFACE_SERIALIZATION_H_
diff --git a/mojo/public/cpp/bindings/lib/hash_util.h b/mojo/public/cpp/bindings/lib/hash_util.h
deleted file mode 100644
index 93280d6..0000000
--- a/mojo/public/cpp/bindings/lib/hash_util.h
+++ /dev/null
@@ -1,84 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_HASH_UTIL_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_HASH_UTIL_H_
-
-#include <cstring>
-#include <functional>
-#include <type_traits>
-#include <vector>
-
-#include "base/optional.h"
-#include "mojo/public/cpp/bindings/lib/template_util.h"
-
-namespace mojo {
-namespace internal {
-
-template <typename T>
-size_t HashCombine(size_t seed, const T& value) {
-  // Based on proposal in:
-  // http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2005/n1756.pdf
-  return seed ^ (std::hash<T>()(value) + (seed << 6) + (seed >> 2));
-}
-
-template <typename T>
-struct HasHashMethod {
-  template <typename U>
-  static char Test(decltype(&U::Hash));
-  template <typename U>
-  static int Test(...);
-  static const bool value = sizeof(Test<T>(0)) == sizeof(char);
-
- private:
-  EnsureTypeIsComplete<T> check_t_;
-};
-
-template <typename T, bool has_hash_method = HasHashMethod<T>::value>
-struct HashTraits;
-
-template <typename T>
-size_t Hash(size_t seed, const T& value);
-
-template <typename T>
-struct HashTraits<T, true> {
-  static size_t Hash(size_t seed, const T& value) { return value.Hash(seed); }
-};
-
-template <typename T>
-struct HashTraits<T, false> {
-  static size_t Hash(size_t seed, const T& value) {
-    return HashCombine(seed, value);
-  }
-};
-
-template <typename T>
-struct HashTraits<std::vector<T>, false> {
-  static size_t Hash(size_t seed, const std::vector<T>& value) {
-    for (const auto& element : value) {
-      seed = HashCombine(seed, element);
-    }
-    return seed;
-  }
-};
-
-template <typename T>
-struct HashTraits<base::Optional<std::vector<T>>, false> {
-  static size_t Hash(size_t seed, const base::Optional<std::vector<T>>& value) {
-    if (!value)
-      return HashCombine(seed, 0);
-
-    return Hash(seed, *value);
-  }
-};
-
-template <typename T>
-size_t Hash(size_t seed, const T& value) {
-  return HashTraits<T>::Hash(seed, value);
-}
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_HASH_UTIL_H_
diff --git a/mojo/public/cpp/bindings/lib/interface_endpoint_client.cc b/mojo/public/cpp/bindings/lib/interface_endpoint_client.cc
deleted file mode 100644
index 4682e72..0000000
--- a/mojo/public/cpp/bindings/lib/interface_endpoint_client.cc
+++ /dev/null
@@ -1,412 +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 "mojo/public/cpp/bindings/interface_endpoint_client.h"
-
-#include <stdint.h>
-
-#include <utility>
-
-#include "base/bind.h"
-#include "base/location.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "base/single_thread_task_runner.h"
-#include "base/stl_util.h"
-#include "mojo/public/cpp/bindings/associated_group.h"
-#include "mojo/public/cpp/bindings/associated_group_controller.h"
-#include "mojo/public/cpp/bindings/interface_endpoint_controller.h"
-#include "mojo/public/cpp/bindings/lib/validation_util.h"
-#include "mojo/public/cpp/bindings/sync_call_restrictions.h"
-
-namespace mojo {
-
-// ----------------------------------------------------------------------------
-
-namespace {
-
-void DCheckIfInvalid(const base::WeakPtr<InterfaceEndpointClient>& client,
-                   const std::string& message) {
-  bool is_valid = client && !client->encountered_error();
-  DCHECK(!is_valid) << message;
-}
-
-// When receiving an incoming message which expects a repsonse,
-// InterfaceEndpointClient creates a ResponderThunk object and passes it to the
-// incoming message receiver. When the receiver finishes processing the message,
-// it can provide a response using this object.
-class ResponderThunk : public MessageReceiverWithStatus {
- public:
-  explicit ResponderThunk(
-      const base::WeakPtr<InterfaceEndpointClient>& endpoint_client,
-      scoped_refptr<base::SingleThreadTaskRunner> runner)
-      : endpoint_client_(endpoint_client),
-        accept_was_invoked_(false),
-        task_runner_(std::move(runner)) {}
-  ~ResponderThunk() override {
-    if (!accept_was_invoked_) {
-      // The Service handled a message that was expecting a response
-      // but did not send a response.
-      // We raise an error to signal the calling application that an error
-      // condition occurred. Without this the calling application would have no
-      // way of knowing it should stop waiting for a response.
-      if (task_runner_->RunsTasksOnCurrentThread()) {
-        // Please note that even if this code is run from a different task
-        // runner on the same thread as |task_runner_|, it is okay to directly
-        // call InterfaceEndpointClient::RaiseError(), because it will raise
-        // error from the correct task runner asynchronously.
-        if (endpoint_client_) {
-          endpoint_client_->RaiseError();
-        }
-      } else {
-        task_runner_->PostTask(
-            FROM_HERE,
-            base::Bind(&InterfaceEndpointClient::RaiseError, endpoint_client_));
-      }
-    }
-  }
-
-  // MessageReceiver implementation:
-  bool Accept(Message* message) override {
-    DCHECK(task_runner_->RunsTasksOnCurrentThread());
-    accept_was_invoked_ = true;
-    DCHECK(message->has_flag(Message::kFlagIsResponse));
-
-    bool result = false;
-
-    if (endpoint_client_)
-      result = endpoint_client_->Accept(message);
-
-    return result;
-  }
-
-  // MessageReceiverWithStatus implementation:
-  bool IsValid() override {
-    DCHECK(task_runner_->RunsTasksOnCurrentThread());
-    return endpoint_client_ && !endpoint_client_->encountered_error();
-  }
-
-  void DCheckInvalid(const std::string& message) override {
-    if (task_runner_->RunsTasksOnCurrentThread()) {
-      DCheckIfInvalid(endpoint_client_, message);
-    } else {
-      task_runner_->PostTask(
-          FROM_HERE, base::Bind(&DCheckIfInvalid, endpoint_client_, message));
-    }
- }
-
- private:
-  base::WeakPtr<InterfaceEndpointClient> endpoint_client_;
-  bool accept_was_invoked_;
-  scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
-
-  DISALLOW_COPY_AND_ASSIGN(ResponderThunk);
-};
-
-}  // namespace
-
-// ----------------------------------------------------------------------------
-
-InterfaceEndpointClient::SyncResponseInfo::SyncResponseInfo(
-    bool* in_response_received)
-    : response_received(in_response_received) {}
-
-InterfaceEndpointClient::SyncResponseInfo::~SyncResponseInfo() {}
-
-// ----------------------------------------------------------------------------
-
-InterfaceEndpointClient::HandleIncomingMessageThunk::HandleIncomingMessageThunk(
-    InterfaceEndpointClient* owner)
-    : owner_(owner) {}
-
-InterfaceEndpointClient::HandleIncomingMessageThunk::
-    ~HandleIncomingMessageThunk() {}
-
-bool InterfaceEndpointClient::HandleIncomingMessageThunk::Accept(
-    Message* message) {
-  return owner_->HandleValidatedMessage(message);
-}
-
-// ----------------------------------------------------------------------------
-
-InterfaceEndpointClient::InterfaceEndpointClient(
-    ScopedInterfaceEndpointHandle handle,
-    MessageReceiverWithResponderStatus* receiver,
-    std::unique_ptr<MessageReceiver> payload_validator,
-    bool expect_sync_requests,
-    scoped_refptr<base::SingleThreadTaskRunner> runner,
-    uint32_t interface_version)
-    : expect_sync_requests_(expect_sync_requests),
-      handle_(std::move(handle)),
-      incoming_receiver_(receiver),
-      thunk_(this),
-      filters_(&thunk_),
-      task_runner_(std::move(runner)),
-      control_message_proxy_(this),
-      control_message_handler_(interface_version),
-      weak_ptr_factory_(this) {
-  DCHECK(handle_.is_valid());
-
-  // TODO(yzshen): the way to use validator (or message filter in general)
-  // directly is a little awkward.
-  if (payload_validator)
-    filters_.Append(std::move(payload_validator));
-
-  if (handle_.pending_association()) {
-    handle_.SetAssociationEventHandler(base::Bind(
-        &InterfaceEndpointClient::OnAssociationEvent, base::Unretained(this)));
-  } else {
-    InitControllerIfNecessary();
-  }
-}
-
-InterfaceEndpointClient::~InterfaceEndpointClient() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-
-  if (controller_)
-    handle_.group_controller()->DetachEndpointClient(handle_);
-}
-
-AssociatedGroup* InterfaceEndpointClient::associated_group() {
-  if (!associated_group_)
-    associated_group_ = base::MakeUnique<AssociatedGroup>(handle_);
-  return associated_group_.get();
-}
-
-ScopedInterfaceEndpointHandle InterfaceEndpointClient::PassHandle() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  DCHECK(!has_pending_responders());
-
-  if (!handle_.is_valid())
-    return ScopedInterfaceEndpointHandle();
-
-  handle_.SetAssociationEventHandler(
-      ScopedInterfaceEndpointHandle::AssociationEventCallback());
-
-  if (controller_) {
-    controller_ = nullptr;
-    handle_.group_controller()->DetachEndpointClient(handle_);
-  }
-
-  return std::move(handle_);
-}
-
-void InterfaceEndpointClient::AddFilter(
-    std::unique_ptr<MessageReceiver> filter) {
-  filters_.Append(std::move(filter));
-}
-
-void InterfaceEndpointClient::RaiseError() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-
-  if (!handle_.pending_association())
-    handle_.group_controller()->RaiseError();
-}
-
-void InterfaceEndpointClient::CloseWithReason(uint32_t custom_reason,
-                                              const std::string& description) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-
-  auto handle = PassHandle();
-  handle.ResetWithReason(custom_reason, description);
-}
-
-bool InterfaceEndpointClient::Accept(Message* message) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  DCHECK(!message->has_flag(Message::kFlagExpectsResponse));
-  DCHECK(!handle_.pending_association());
-
-  // This has to been done even if connection error has occurred. For example,
-  // the message contains a pending associated request. The user may try to use
-  // the corresponding associated interface pointer after sending this message.
-  // That associated interface pointer has to join an associated group in order
-  // to work properly.
-  if (!message->associated_endpoint_handles()->empty())
-    message->SerializeAssociatedEndpointHandles(handle_.group_controller());
-
-  if (encountered_error_)
-    return false;
-
-  InitControllerIfNecessary();
-
-  return controller_->SendMessage(message);
-}
-
-bool InterfaceEndpointClient::AcceptWithResponder(
-    Message* message,
-    std::unique_ptr<MessageReceiver> responder) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  DCHECK(message->has_flag(Message::kFlagExpectsResponse));
-  DCHECK(!handle_.pending_association());
-
-  // Please see comments in Accept().
-  if (!message->associated_endpoint_handles()->empty())
-    message->SerializeAssociatedEndpointHandles(handle_.group_controller());
-
-  if (encountered_error_)
-    return false;
-
-  InitControllerIfNecessary();
-
-  // Reserve 0 in case we want it to convey special meaning in the future.
-  uint64_t request_id = next_request_id_++;
-  if (request_id == 0)
-    request_id = next_request_id_++;
-
-  message->set_request_id(request_id);
-
-  bool is_sync = message->has_flag(Message::kFlagIsSync);
-  if (!controller_->SendMessage(message))
-    return false;
-
-  if (!is_sync) {
-    async_responders_[request_id] = std::move(responder);
-    return true;
-  }
-
-  SyncCallRestrictions::AssertSyncCallAllowed();
-
-  bool response_received = false;
-  sync_responses_.insert(std::make_pair(
-      request_id, base::MakeUnique<SyncResponseInfo>(&response_received)));
-
-  base::WeakPtr<InterfaceEndpointClient> weak_self =
-      weak_ptr_factory_.GetWeakPtr();
-  controller_->SyncWatch(&response_received);
-  // Make sure that this instance hasn't been destroyed.
-  if (weak_self) {
-    DCHECK(base::ContainsKey(sync_responses_, request_id));
-    auto iter = sync_responses_.find(request_id);
-    DCHECK_EQ(&response_received, iter->second->response_received);
-    if (response_received)
-      ignore_result(responder->Accept(&iter->second->response));
-    sync_responses_.erase(iter);
-  }
-
-  return true;
-}
-
-bool InterfaceEndpointClient::HandleIncomingMessage(Message* message) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  return filters_.Accept(message);
-}
-
-void InterfaceEndpointClient::NotifyError(
-    const base::Optional<DisconnectReason>& reason) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-
-  if (encountered_error_)
-    return;
-  encountered_error_ = true;
-
-  // Response callbacks may hold on to resource, and there's no need to keep
-  // them alive any longer. Note that it's allowed that a pending response
-  // callback may own this endpoint, so we simply move the responders onto the
-  // stack here and let them be destroyed when the stack unwinds.
-  AsyncResponderMap responders = std::move(async_responders_);
-
-  control_message_proxy_.OnConnectionError();
-
-  if (!error_handler_.is_null()) {
-    base::Closure error_handler = std::move(error_handler_);
-    error_handler.Run();
-  } else if (!error_with_reason_handler_.is_null()) {
-    ConnectionErrorWithReasonCallback error_with_reason_handler =
-        std::move(error_with_reason_handler_);
-    if (reason) {
-      error_with_reason_handler.Run(reason->custom_reason, reason->description);
-    } else {
-      error_with_reason_handler.Run(0, std::string());
-    }
-  }
-}
-
-void InterfaceEndpointClient::QueryVersion(
-    const base::Callback<void(uint32_t)>& callback) {
-  control_message_proxy_.QueryVersion(callback);
-}
-
-void InterfaceEndpointClient::RequireVersion(uint32_t version) {
-  control_message_proxy_.RequireVersion(version);
-}
-
-void InterfaceEndpointClient::FlushForTesting() {
-  control_message_proxy_.FlushForTesting();
-}
-
-void InterfaceEndpointClient::InitControllerIfNecessary() {
-  if (controller_ || handle_.pending_association())
-    return;
-
-  controller_ = handle_.group_controller()->AttachEndpointClient(handle_, this,
-                                                                 task_runner_);
-  if (expect_sync_requests_)
-    controller_->AllowWokenUpBySyncWatchOnSameThread();
-}
-
-void InterfaceEndpointClient::OnAssociationEvent(
-    ScopedInterfaceEndpointHandle::AssociationEvent event) {
-  if (event == ScopedInterfaceEndpointHandle::ASSOCIATED) {
-    InitControllerIfNecessary();
-  } else if (event ==
-             ScopedInterfaceEndpointHandle::PEER_CLOSED_BEFORE_ASSOCIATION) {
-    task_runner_->PostTask(FROM_HERE,
-                           base::Bind(&InterfaceEndpointClient::NotifyError,
-                                      weak_ptr_factory_.GetWeakPtr(),
-                                      handle_.disconnect_reason()));
-  }
-}
-
-bool InterfaceEndpointClient::HandleValidatedMessage(Message* message) {
-  DCHECK_EQ(handle_.id(), message->interface_id());
-
-  if (encountered_error_) {
-    // This message is received after error has been encountered. For associated
-    // interfaces, this means the remote side sends a
-    // PeerAssociatedEndpointClosed event but continues to send more messages
-    // for the same interface. Close the pipe because this shouldn't happen.
-    DVLOG(1) << "A message is received for an interface after it has been "
-             << "disconnected. Closing the pipe.";
-    return false;
-  }
-
-  if (message->has_flag(Message::kFlagExpectsResponse)) {
-    std::unique_ptr<MessageReceiverWithStatus> responder =
-        base::MakeUnique<ResponderThunk>(weak_ptr_factory_.GetWeakPtr(),
-                                         task_runner_);
-    if (mojo::internal::ControlMessageHandler::IsControlMessage(message)) {
-      return control_message_handler_.AcceptWithResponder(message,
-                                                          std::move(responder));
-    } else {
-      return incoming_receiver_->AcceptWithResponder(message,
-                                                     std::move(responder));
-    }
-  } else if (message->has_flag(Message::kFlagIsResponse)) {
-    uint64_t request_id = message->request_id();
-
-    if (message->has_flag(Message::kFlagIsSync)) {
-      auto it = sync_responses_.find(request_id);
-      if (it == sync_responses_.end())
-        return false;
-      it->second->response = std::move(*message);
-      *it->second->response_received = true;
-      return true;
-    }
-
-    auto it = async_responders_.find(request_id);
-    if (it == async_responders_.end())
-      return false;
-    std::unique_ptr<MessageReceiver> responder = std::move(it->second);
-    async_responders_.erase(it);
-    return responder->Accept(message);
-  } else {
-    if (mojo::internal::ControlMessageHandler::IsControlMessage(message))
-      return control_message_handler_.Accept(message);
-
-    return incoming_receiver_->Accept(message);
-  }
-}
-
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/interface_ptr_state.h b/mojo/public/cpp/bindings/lib/interface_ptr_state.h
deleted file mode 100644
index fa54979..0000000
--- a/mojo/public/cpp/bindings/lib/interface_ptr_state.h
+++ /dev/null
@@ -1,226 +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 MOJO_PUBLIC_CPP_BINDINGS_LIB_INTERFACE_PTR_STATE_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_INTERFACE_PTR_STATE_H_
-
-#include <stdint.h>
-
-#include <algorithm>  // For |std::swap()|.
-#include <memory>
-#include <string>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/callback_forward.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "base/memory/ref_counted.h"
-#include "base/single_thread_task_runner.h"
-#include "mojo/public/cpp/bindings/associated_group.h"
-#include "mojo/public/cpp/bindings/connection_error_callback.h"
-#include "mojo/public/cpp/bindings/filter_chain.h"
-#include "mojo/public/cpp/bindings/interface_endpoint_client.h"
-#include "mojo/public/cpp/bindings/interface_id.h"
-#include "mojo/public/cpp/bindings/interface_ptr_info.h"
-#include "mojo/public/cpp/bindings/lib/multiplex_router.h"
-#include "mojo/public/cpp/bindings/message_header_validator.h"
-#include "mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h"
-
-namespace mojo {
-namespace internal {
-
-template <typename Interface>
-class InterfacePtrState {
- public:
-  InterfacePtrState() : version_(0u) {}
-
-  ~InterfacePtrState() {
-    endpoint_client_.reset();
-    proxy_.reset();
-    if (router_)
-      router_->CloseMessagePipe();
-  }
-
-  Interface* instance() {
-    ConfigureProxyIfNecessary();
-
-    // This will be null if the object is not bound.
-    return proxy_.get();
-  }
-
-  uint32_t version() const { return version_; }
-
-  void QueryVersion(const base::Callback<void(uint32_t)>& callback) {
-    ConfigureProxyIfNecessary();
-
-    // It is safe to capture |this| because the callback won't be run after this
-    // object goes away.
-    endpoint_client_->QueryVersion(base::Bind(
-        &InterfacePtrState::OnQueryVersion, base::Unretained(this), callback));
-  }
-
-  void RequireVersion(uint32_t version) {
-    ConfigureProxyIfNecessary();
-
-    if (version <= version_)
-      return;
-
-    version_ = version;
-    endpoint_client_->RequireVersion(version);
-  }
-
-  void FlushForTesting() {
-    ConfigureProxyIfNecessary();
-    endpoint_client_->FlushForTesting();
-  }
-
-  void CloseWithReason(uint32_t custom_reason, const std::string& description) {
-    ConfigureProxyIfNecessary();
-    endpoint_client_->CloseWithReason(custom_reason, description);
-  }
-
-  void Swap(InterfacePtrState* other) {
-    using std::swap;
-    swap(other->router_, router_);
-    swap(other->endpoint_client_, endpoint_client_);
-    swap(other->proxy_, proxy_);
-    handle_.swap(other->handle_);
-    runner_.swap(other->runner_);
-    swap(other->version_, version_);
-  }
-
-  void Bind(InterfacePtrInfo<Interface> info,
-            scoped_refptr<base::SingleThreadTaskRunner> runner) {
-    DCHECK(!router_);
-    DCHECK(!endpoint_client_);
-    DCHECK(!proxy_);
-    DCHECK(!handle_.is_valid());
-    DCHECK_EQ(0u, version_);
-    DCHECK(info.is_valid());
-
-    handle_ = info.PassHandle();
-    version_ = info.version();
-    runner_ = std::move(runner);
-  }
-
-  bool HasAssociatedInterfaces() const {
-    return router_ ? router_->HasAssociatedEndpoints() : false;
-  }
-
-  // After this method is called, the object is in an invalid state and
-  // shouldn't be reused.
-  InterfacePtrInfo<Interface> PassInterface() {
-    endpoint_client_.reset();
-    proxy_.reset();
-    return InterfacePtrInfo<Interface>(
-        router_ ? router_->PassMessagePipe() : std::move(handle_), version_);
-  }
-
-  bool is_bound() const { return handle_.is_valid() || endpoint_client_; }
-
-  bool encountered_error() const {
-    return endpoint_client_ ? endpoint_client_->encountered_error() : false;
-  }
-
-  void set_connection_error_handler(const base::Closure& error_handler) {
-    ConfigureProxyIfNecessary();
-
-    DCHECK(endpoint_client_);
-    endpoint_client_->set_connection_error_handler(error_handler);
-  }
-
-  void set_connection_error_with_reason_handler(
-      const ConnectionErrorWithReasonCallback& error_handler) {
-    ConfigureProxyIfNecessary();
-
-    DCHECK(endpoint_client_);
-    endpoint_client_->set_connection_error_with_reason_handler(error_handler);
-  }
-
-  // Returns true if bound and awaiting a response to a message.
-  bool has_pending_callbacks() const {
-    return endpoint_client_ && endpoint_client_->has_pending_responders();
-  }
-
-  AssociatedGroup* associated_group() {
-    ConfigureProxyIfNecessary();
-    return endpoint_client_->associated_group();
-  }
-
-  void EnableTestingMode() {
-    ConfigureProxyIfNecessary();
-    router_->EnableTestingMode();
-  }
-
-  void ForwardMessage(Message message) {
-    ConfigureProxyIfNecessary();
-    endpoint_client_->Accept(&message);
-  }
-
-  void ForwardMessageWithResponder(Message message,
-                                   std::unique_ptr<MessageReceiver> responder) {
-    ConfigureProxyIfNecessary();
-    endpoint_client_->AcceptWithResponder(&message, std::move(responder));
-  }
-
- private:
-  using Proxy = typename Interface::Proxy_;
-
-  void ConfigureProxyIfNecessary() {
-    // The proxy has been configured.
-    if (proxy_) {
-      DCHECK(router_);
-      DCHECK(endpoint_client_);
-      return;
-    }
-    // The object hasn't been bound.
-    if (!handle_.is_valid())
-      return;
-
-    MultiplexRouter::Config config =
-        Interface::PassesAssociatedKinds_
-            ? MultiplexRouter::MULTI_INTERFACE
-            : (Interface::HasSyncMethods_
-                   ? MultiplexRouter::SINGLE_INTERFACE_WITH_SYNC_METHODS
-                   : MultiplexRouter::SINGLE_INTERFACE);
-    router_ = new MultiplexRouter(std::move(handle_), config, true, runner_);
-    router_->SetMasterInterfaceName(Interface::Name_);
-    endpoint_client_.reset(new InterfaceEndpointClient(
-        router_->CreateLocalEndpointHandle(kMasterInterfaceId), nullptr,
-        base::WrapUnique(new typename Interface::ResponseValidator_()), false,
-        std::move(runner_),
-        // The version is only queried from the client so the value passed here
-        // will not be used.
-        0u));
-    proxy_.reset(new Proxy(endpoint_client_.get()));
-  }
-
-  void OnQueryVersion(const base::Callback<void(uint32_t)>& callback,
-                      uint32_t version) {
-    version_ = version;
-    callback.Run(version);
-  }
-
-  scoped_refptr<MultiplexRouter> router_;
-
-  std::unique_ptr<InterfaceEndpointClient> endpoint_client_;
-  std::unique_ptr<Proxy> proxy_;
-
-  // |router_| (as well as other members above) is not initialized until
-  // read/write with the message pipe handle is needed. |handle_| is valid
-  // between the Bind() call and the initialization of |router_|.
-  ScopedMessagePipeHandle handle_;
-  scoped_refptr<base::SingleThreadTaskRunner> runner_;
-
-  uint32_t version_;
-
-  DISALLOW_COPY_AND_ASSIGN(InterfacePtrState);
-};
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_INTERFACE_PTR_STATE_H_
diff --git a/mojo/public/cpp/bindings/lib/map_data_internal.h b/mojo/public/cpp/bindings/lib/map_data_internal.h
deleted file mode 100644
index f8e3d29..0000000
--- a/mojo/public/cpp/bindings/lib/map_data_internal.h
+++ /dev/null
@@ -1,85 +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 MOJO_PUBLIC_CPP_BINDINGS_LIB_MAP_DATA_INTERNAL_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_MAP_DATA_INTERNAL_H_
-
-#include "mojo/public/cpp/bindings/lib/array_internal.h"
-#include "mojo/public/cpp/bindings/lib/validate_params.h"
-#include "mojo/public/cpp/bindings/lib/validation_errors.h"
-#include "mojo/public/cpp/bindings/lib/validation_util.h"
-
-namespace mojo {
-namespace internal {
-
-// Map serializes into a struct which has two arrays as struct fields, the keys
-// and the values.
-template <typename Key, typename Value>
-class Map_Data {
- public:
-  static Map_Data* New(Buffer* buf) {
-    return new (buf->Allocate(sizeof(Map_Data))) Map_Data();
-  }
-
-  // |validate_params| must have non-null |key_validate_params| and
-  // |element_validate_params| members.
-  static bool Validate(const void* data,
-                       ValidationContext* validation_context,
-                       const ContainerValidateParams* validate_params) {
-    if (!data)
-      return true;
-
-    if (!ValidateStructHeaderAndClaimMemory(data, validation_context))
-      return false;
-
-    const Map_Data* object = static_cast<const Map_Data*>(data);
-    if (object->header_.num_bytes != sizeof(Map_Data) ||
-        object->header_.version != 0) {
-      ReportValidationError(validation_context,
-                            VALIDATION_ERROR_UNEXPECTED_STRUCT_HEADER);
-      return false;
-    }
-
-    if (!ValidatePointerNonNullable(
-            object->keys, "null key array in map struct", validation_context) ||
-        !ValidateContainer(object->keys, validation_context,
-                           validate_params->key_validate_params)) {
-      return false;
-    }
-
-    if (!ValidatePointerNonNullable(object->values,
-                                    "null value array in map struct",
-                                    validation_context) ||
-        !ValidateContainer(object->values, validation_context,
-                           validate_params->element_validate_params)) {
-      return false;
-    }
-
-    if (object->keys.Get()->size() != object->values.Get()->size()) {
-      ReportValidationError(validation_context,
-                            VALIDATION_ERROR_DIFFERENT_SIZED_ARRAYS_IN_MAP);
-      return false;
-    }
-
-    return true;
-  }
-
-  StructHeader header_;
-
-  Pointer<Array_Data<Key>> keys;
-  Pointer<Array_Data<Value>> values;
-
- private:
-  Map_Data() {
-    header_.num_bytes = sizeof(*this);
-    header_.version = 0;
-  }
-  ~Map_Data() = delete;
-};
-static_assert(sizeof(Map_Data<char, char>) == 24, "Bad sizeof(Map_Data)");
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_MAP_DATA_INTERNAL_H_
diff --git a/mojo/public/cpp/bindings/lib/map_serialization.h b/mojo/public/cpp/bindings/lib/map_serialization.h
deleted file mode 100644
index 718a763..0000000
--- a/mojo/public/cpp/bindings/lib/map_serialization.h
+++ /dev/null
@@ -1,182 +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 MOJO_PUBLIC_CPP_BINDINGS_LIB_MAP_SERIALIZATION_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_MAP_SERIALIZATION_H_
-
-#include <type_traits>
-#include <vector>
-
-#include "mojo/public/cpp/bindings/array_data_view.h"
-#include "mojo/public/cpp/bindings/lib/array_serialization.h"
-#include "mojo/public/cpp/bindings/lib/map_data_internal.h"
-#include "mojo/public/cpp/bindings/lib/serialization_forward.h"
-#include "mojo/public/cpp/bindings/map_data_view.h"
-
-namespace mojo {
-namespace internal {
-
-template <typename MaybeConstUserType>
-class MapReaderBase {
- public:
-  using UserType = typename std::remove_const<MaybeConstUserType>::type;
-  using Traits = MapTraits<UserType>;
-  using MaybeConstIterator =
-      decltype(Traits::GetBegin(std::declval<MaybeConstUserType&>()));
-
-  explicit MapReaderBase(MaybeConstUserType& input)
-      : input_(input), iter_(Traits::GetBegin(input_)) {}
-  ~MapReaderBase() {}
-
-  size_t GetSize() const { return Traits::GetSize(input_); }
-
-  // Return null because key or value elements are not stored continuously in
-  // memory.
-  void* GetDataIfExists() { return nullptr; }
-
- protected:
-  MaybeConstUserType& input_;
-  MaybeConstIterator iter_;
-};
-
-// Used as the UserTypeReader template parameter of ArraySerializer.
-template <typename MaybeConstUserType>
-class MapKeyReader : public MapReaderBase<MaybeConstUserType> {
- public:
-  using Base = MapReaderBase<MaybeConstUserType>;
-  using Traits = typename Base::Traits;
-  using MaybeConstIterator = typename Base::MaybeConstIterator;
-
-  explicit MapKeyReader(MaybeConstUserType& input) : Base(input) {}
-  ~MapKeyReader() {}
-
-  using GetNextResult =
-      decltype(Traits::GetKey(std::declval<MaybeConstIterator&>()));
-  GetNextResult GetNext() {
-    GetNextResult key = Traits::GetKey(this->iter_);
-    Traits::AdvanceIterator(this->iter_);
-    return key;
-  }
-};
-
-// Used as the UserTypeReader template parameter of ArraySerializer.
-template <typename MaybeConstUserType>
-class MapValueReader : public MapReaderBase<MaybeConstUserType> {
- public:
-  using Base = MapReaderBase<MaybeConstUserType>;
-  using Traits = typename Base::Traits;
-  using MaybeConstIterator = typename Base::MaybeConstIterator;
-
-  explicit MapValueReader(MaybeConstUserType& input) : Base(input) {}
-  ~MapValueReader() {}
-
-  using GetNextResult =
-      decltype(Traits::GetValue(std::declval<MaybeConstIterator&>()));
-  GetNextResult GetNext() {
-    GetNextResult value = Traits::GetValue(this->iter_);
-    Traits::AdvanceIterator(this->iter_);
-    return value;
-  }
-};
-
-template <typename Key, typename Value, typename MaybeConstUserType>
-struct Serializer<MapDataView<Key, Value>, MaybeConstUserType> {
-  using UserType = typename std::remove_const<MaybeConstUserType>::type;
-  using Traits = MapTraits<UserType>;
-  using UserKey = typename Traits::Key;
-  using UserValue = typename Traits::Value;
-  using Data = typename MojomTypeTraits<MapDataView<Key, Value>>::Data;
-  using KeyArraySerializer = ArraySerializer<ArrayDataView<Key>,
-                                             std::vector<UserKey>,
-                                             MapKeyReader<MaybeConstUserType>>;
-  using ValueArraySerializer =
-      ArraySerializer<ArrayDataView<Value>,
-                      std::vector<UserValue>,
-                      MapValueReader<MaybeConstUserType>>;
-
-  static size_t PrepareToSerialize(MaybeConstUserType& input,
-                                   SerializationContext* context) {
-    if (CallIsNullIfExists<Traits>(input))
-      return 0;
-
-    size_t struct_overhead = sizeof(Data);
-    MapKeyReader<MaybeConstUserType> key_reader(input);
-    size_t keys_size =
-        KeyArraySerializer::GetSerializedSize(&key_reader, context);
-    MapValueReader<MaybeConstUserType> value_reader(input);
-    size_t values_size =
-        ValueArraySerializer::GetSerializedSize(&value_reader, context);
-
-    return struct_overhead + keys_size + values_size;
-  }
-
-  static void Serialize(MaybeConstUserType& input,
-                        Buffer* buf,
-                        Data** output,
-                        const ContainerValidateParams* validate_params,
-                        SerializationContext* context) {
-    DCHECK(validate_params->key_validate_params);
-    DCHECK(validate_params->element_validate_params);
-    if (CallIsNullIfExists<Traits>(input)) {
-      *output = nullptr;
-      return;
-    }
-
-    auto result = Data::New(buf);
-    if (result) {
-      auto keys_ptr = MojomTypeTraits<ArrayDataView<Key>>::Data::New(
-          Traits::GetSize(input), buf);
-      if (keys_ptr) {
-        MapKeyReader<MaybeConstUserType> key_reader(input);
-        KeyArraySerializer::SerializeElements(
-            &key_reader, buf, keys_ptr, validate_params->key_validate_params,
-            context);
-        result->keys.Set(keys_ptr);
-      }
-
-      auto values_ptr = MojomTypeTraits<ArrayDataView<Value>>::Data::New(
-          Traits::GetSize(input), buf);
-      if (values_ptr) {
-        MapValueReader<MaybeConstUserType> value_reader(input);
-        ValueArraySerializer::SerializeElements(
-            &value_reader, buf, values_ptr,
-            validate_params->element_validate_params, context);
-        result->values.Set(values_ptr);
-      }
-    }
-    *output = result;
-  }
-
-  static bool Deserialize(Data* input,
-                          UserType* output,
-                          SerializationContext* context) {
-    if (!input)
-      return CallSetToNullIfExists<Traits>(output);
-
-    std::vector<UserKey> keys;
-    std::vector<UserValue> values;
-
-    if (!KeyArraySerializer::DeserializeElements(input->keys.Get(), &keys,
-                                                 context) ||
-        !ValueArraySerializer::DeserializeElements(input->values.Get(), &values,
-                                                   context)) {
-      return false;
-    }
-
-    DCHECK_EQ(keys.size(), values.size());
-    size_t size = keys.size();
-    Traits::SetToEmpty(output);
-
-    for (size_t i = 0; i < size; ++i) {
-      if (!Traits::Insert(*output, std::move(keys[i]), std::move(values[i])))
-        return false;
-    }
-    return true;
-  }
-};
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_MAP_SERIALIZATION_H_
diff --git a/mojo/public/cpp/bindings/lib/may_auto_lock.h b/mojo/public/cpp/bindings/lib/may_auto_lock.h
deleted file mode 100644
index 06091fe..0000000
--- a/mojo/public/cpp/bindings/lib/may_auto_lock.h
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_MAY_AUTO_LOCK_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_MAY_AUTO_LOCK_H_
-
-#include "base/macros.h"
-#include "base/optional.h"
-#include "base/synchronization/lock.h"
-
-namespace mojo {
-namespace internal {
-
-// Similar to base::AutoLock, except that it does nothing if |lock| passed into
-// the constructor is null.
-class MayAutoLock {
- public:
-  explicit MayAutoLock(base::Optional<base::Lock>* lock)
-      : lock_(lock->has_value() ? &lock->value() : nullptr) {
-    if (lock_)
-      lock_->Acquire();
-  }
-
-  ~MayAutoLock() {
-    if (lock_) {
-      lock_->AssertAcquired();
-      lock_->Release();
-    }
-  }
-
- private:
-  base::Lock* lock_;
-  DISALLOW_COPY_AND_ASSIGN(MayAutoLock);
-};
-
-// Similar to base::AutoUnlock, except that it does nothing if |lock| passed
-// into the constructor is null.
-class MayAutoUnlock {
- public:
-  explicit MayAutoUnlock(base::Optional<base::Lock>* lock)
-      : lock_(lock->has_value() ? &lock->value() : nullptr) {
-    if (lock_) {
-      lock_->AssertAcquired();
-      lock_->Release();
-    }
-  }
-
-  ~MayAutoUnlock() {
-    if (lock_)
-      lock_->Acquire();
-  }
-
- private:
-  base::Lock* lock_;
-  DISALLOW_COPY_AND_ASSIGN(MayAutoUnlock);
-};
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_MAY_AUTO_LOCK_H_
diff --git a/mojo/public/cpp/bindings/lib/message.cc b/mojo/public/cpp/bindings/lib/message.cc
deleted file mode 100644
index e5f3808..0000000
--- a/mojo/public/cpp/bindings/lib/message.cc
+++ /dev/null
@@ -1,332 +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 "mojo/public/cpp/bindings/message.h"
-
-#include <stddef.h>
-#include <stdint.h>
-#include <stdlib.h>
-
-#include <algorithm>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/lazy_instance.h"
-#include "base/logging.h"
-#include "base/strings/stringprintf.h"
-#include "base/threading/thread_local.h"
-#include "mojo/public/cpp/bindings/associated_group_controller.h"
-#include "mojo/public/cpp/bindings/lib/array_internal.h"
-
-namespace mojo {
-
-namespace {
-
-base::LazyInstance<base::ThreadLocalPointer<internal::MessageDispatchContext>>::
-    DestructorAtExit g_tls_message_dispatch_context = LAZY_INSTANCE_INITIALIZER;
-
-base::LazyInstance<base::ThreadLocalPointer<SyncMessageResponseContext>>::
-    DestructorAtExit g_tls_sync_response_context = LAZY_INSTANCE_INITIALIZER;
-
-void DoNotifyBadMessage(Message message, const std::string& error) {
-  message.NotifyBadMessage(error);
-}
-
-}  // namespace
-
-Message::Message() {
-}
-
-Message::Message(Message&& other)
-    : buffer_(std::move(other.buffer_)),
-      handles_(std::move(other.handles_)),
-      associated_endpoint_handles_(
-          std::move(other.associated_endpoint_handles_)) {}
-
-Message::~Message() {
-  CloseHandles();
-}
-
-Message& Message::operator=(Message&& other) {
-  Reset();
-  std::swap(other.buffer_, buffer_);
-  std::swap(other.handles_, handles_);
-  std::swap(other.associated_endpoint_handles_, associated_endpoint_handles_);
-  return *this;
-}
-
-void Message::Reset() {
-  CloseHandles();
-  handles_.clear();
-  associated_endpoint_handles_.clear();
-  buffer_.reset();
-}
-
-void Message::Initialize(size_t capacity, bool zero_initialized) {
-  DCHECK(!buffer_);
-  buffer_.reset(new internal::MessageBuffer(capacity, zero_initialized));
-}
-
-void Message::InitializeFromMojoMessage(ScopedMessageHandle message,
-                                        uint32_t num_bytes,
-                                        std::vector<Handle>* handles) {
-  DCHECK(!buffer_);
-  buffer_.reset(new internal::MessageBuffer(std::move(message), num_bytes));
-  handles_.swap(*handles);
-}
-
-const uint8_t* Message::payload() const {
-  if (version() < 2)
-    return data() + header()->num_bytes;
-
-  return static_cast<const uint8_t*>(header_v2()->payload.Get());
-}
-
-uint32_t Message::payload_num_bytes() const {
-  DCHECK_GE(data_num_bytes(), header()->num_bytes);
-  size_t num_bytes;
-  if (version() < 2) {
-    num_bytes = data_num_bytes() - header()->num_bytes;
-  } else {
-    auto payload = reinterpret_cast<uintptr_t>(header_v2()->payload.Get());
-    if (!payload) {
-      num_bytes = 0;
-    } else {
-      auto payload_end =
-          reinterpret_cast<uintptr_t>(header_v2()->payload_interface_ids.Get());
-      if (!payload_end)
-        payload_end = reinterpret_cast<uintptr_t>(data() + data_num_bytes());
-      DCHECK_GE(payload_end, payload);
-      num_bytes = payload_end - payload;
-    }
-  }
-  DCHECK_LE(num_bytes, std::numeric_limits<uint32_t>::max());
-  return static_cast<uint32_t>(num_bytes);
-}
-
-uint32_t Message::payload_num_interface_ids() const {
-  auto* array_pointer =
-      version() < 2 ? nullptr : header_v2()->payload_interface_ids.Get();
-  return array_pointer ? static_cast<uint32_t>(array_pointer->size()) : 0;
-}
-
-const uint32_t* Message::payload_interface_ids() const {
-  auto* array_pointer =
-      version() < 2 ? nullptr : header_v2()->payload_interface_ids.Get();
-  return array_pointer ? array_pointer->storage() : nullptr;
-}
-
-ScopedMessageHandle Message::TakeMojoMessage() {
-  // If there are associated endpoints transferred,
-  // SerializeAssociatedEndpointHandles() must be called before this method.
-  DCHECK(associated_endpoint_handles_.empty());
-
-  if (handles_.empty())  // Fast path for the common case: No handles.
-    return buffer_->TakeMessage();
-
-  // Allocate a new message with space for the handles, then copy the buffer
-  // contents into it.
-  //
-  // TODO(rockot): We could avoid this copy by extending GetSerializedSize()
-  // behavior to collect handles. It's unoptimized for now because it's much
-  // more common to have messages with no handles.
-  ScopedMessageHandle new_message;
-  MojoResult rv = AllocMessage(
-      data_num_bytes(),
-      handles_.empty() ? nullptr
-                       : reinterpret_cast<const MojoHandle*>(handles_.data()),
-      handles_.size(),
-      MOJO_ALLOC_MESSAGE_FLAG_NONE,
-      &new_message);
-  CHECK_EQ(rv, MOJO_RESULT_OK);
-  handles_.clear();
-
-  void* new_buffer = nullptr;
-  rv = GetMessageBuffer(new_message.get(), &new_buffer);
-  CHECK_EQ(rv, MOJO_RESULT_OK);
-
-  memcpy(new_buffer, data(), data_num_bytes());
-  buffer_.reset();
-
-  return new_message;
-}
-
-void Message::NotifyBadMessage(const std::string& error) {
-  DCHECK(buffer_);
-  buffer_->NotifyBadMessage(error);
-}
-
-void Message::CloseHandles() {
-  for (std::vector<Handle>::iterator it = handles_.begin();
-       it != handles_.end(); ++it) {
-    if (it->is_valid())
-      CloseRaw(*it);
-  }
-}
-
-void Message::SerializeAssociatedEndpointHandles(
-    AssociatedGroupController* group_controller) {
-  if (associated_endpoint_handles_.empty())
-    return;
-
-  DCHECK_GE(version(), 2u);
-  DCHECK(header_v2()->payload_interface_ids.is_null());
-
-  size_t size = associated_endpoint_handles_.size();
-  auto* data = internal::Array_Data<uint32_t>::New(size, buffer());
-  header_v2()->payload_interface_ids.Set(data);
-
-  for (size_t i = 0; i < size; ++i) {
-    ScopedInterfaceEndpointHandle& handle = associated_endpoint_handles_[i];
-
-    DCHECK(handle.pending_association());
-    data->storage()[i] =
-        group_controller->AssociateInterface(std::move(handle));
-  }
-  associated_endpoint_handles_.clear();
-}
-
-bool Message::DeserializeAssociatedEndpointHandles(
-    AssociatedGroupController* group_controller) {
-  associated_endpoint_handles_.clear();
-
-  uint32_t num_ids = payload_num_interface_ids();
-  if (num_ids == 0)
-    return true;
-
-  associated_endpoint_handles_.reserve(num_ids);
-  uint32_t* ids = header_v2()->payload_interface_ids.Get()->storage();
-  bool result = true;
-  for (uint32_t i = 0; i < num_ids; ++i) {
-    auto handle = group_controller->CreateLocalEndpointHandle(ids[i]);
-    if (IsValidInterfaceId(ids[i]) && !handle.is_valid()) {
-      // |ids[i]| itself is valid but handle creation failed. In that case, mark
-      // deserialization as failed but continue to deserialize the rest of
-      // handles.
-      result = false;
-    }
-
-    associated_endpoint_handles_.push_back(std::move(handle));
-    ids[i] = kInvalidInterfaceId;
-  }
-  return result;
-}
-
-PassThroughFilter::PassThroughFilter() {}
-
-PassThroughFilter::~PassThroughFilter() {}
-
-bool PassThroughFilter::Accept(Message* message) { return true; }
-
-SyncMessageResponseContext::SyncMessageResponseContext()
-    : outer_context_(current()) {
-  g_tls_sync_response_context.Get().Set(this);
-}
-
-SyncMessageResponseContext::~SyncMessageResponseContext() {
-  DCHECK_EQ(current(), this);
-  g_tls_sync_response_context.Get().Set(outer_context_);
-}
-
-// static
-SyncMessageResponseContext* SyncMessageResponseContext::current() {
-  return g_tls_sync_response_context.Get().Get();
-}
-
-void SyncMessageResponseContext::ReportBadMessage(const std::string& error) {
-  GetBadMessageCallback().Run(error);
-}
-
-const ReportBadMessageCallback&
-SyncMessageResponseContext::GetBadMessageCallback() {
-  if (bad_message_callback_.is_null()) {
-    bad_message_callback_ =
-        base::Bind(&DoNotifyBadMessage, base::Passed(&response_));
-  }
-  return bad_message_callback_;
-}
-
-MojoResult ReadMessage(MessagePipeHandle handle, Message* message) {
-  MojoResult rv;
-
-  std::vector<Handle> handles;
-  ScopedMessageHandle mojo_message;
-  uint32_t num_bytes = 0, num_handles = 0;
-  rv = ReadMessageNew(handle,
-                      &mojo_message,
-                      &num_bytes,
-                      nullptr,
-                      &num_handles,
-                      MOJO_READ_MESSAGE_FLAG_NONE);
-  if (rv == MOJO_RESULT_RESOURCE_EXHAUSTED) {
-    DCHECK_GT(num_handles, 0u);
-    handles.resize(num_handles);
-    rv = ReadMessageNew(handle,
-                        &mojo_message,
-                        &num_bytes,
-                        reinterpret_cast<MojoHandle*>(handles.data()),
-                        &num_handles,
-                        MOJO_READ_MESSAGE_FLAG_NONE);
-  }
-
-  if (rv != MOJO_RESULT_OK)
-    return rv;
-
-  message->InitializeFromMojoMessage(
-      std::move(mojo_message), num_bytes, &handles);
-  return MOJO_RESULT_OK;
-}
-
-void ReportBadMessage(const std::string& error) {
-  internal::MessageDispatchContext* context =
-      internal::MessageDispatchContext::current();
-  DCHECK(context);
-  context->GetBadMessageCallback().Run(error);
-}
-
-ReportBadMessageCallback GetBadMessageCallback() {
-  internal::MessageDispatchContext* context =
-      internal::MessageDispatchContext::current();
-  DCHECK(context);
-  return context->GetBadMessageCallback();
-}
-
-namespace internal {
-
-MessageHeaderV2::MessageHeaderV2() = default;
-
-MessageDispatchContext::MessageDispatchContext(Message* message)
-    : outer_context_(current()), message_(message) {
-  g_tls_message_dispatch_context.Get().Set(this);
-}
-
-MessageDispatchContext::~MessageDispatchContext() {
-  DCHECK_EQ(current(), this);
-  g_tls_message_dispatch_context.Get().Set(outer_context_);
-}
-
-// static
-MessageDispatchContext* MessageDispatchContext::current() {
-  return g_tls_message_dispatch_context.Get().Get();
-}
-
-const ReportBadMessageCallback&
-MessageDispatchContext::GetBadMessageCallback() {
-  if (bad_message_callback_.is_null()) {
-    bad_message_callback_ =
-        base::Bind(&DoNotifyBadMessage, base::Passed(message_));
-  }
-  return bad_message_callback_;
-}
-
-// static
-void SyncMessageResponseSetup::SetCurrentSyncResponseMessage(Message* message) {
-  SyncMessageResponseContext* context = SyncMessageResponseContext::current();
-  if (context)
-    context->response_ = std::move(*message);
-}
-
-}  // namespace internal
-
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/message_buffer.cc b/mojo/public/cpp/bindings/lib/message_buffer.cc
deleted file mode 100644
index cc12ef6..0000000
--- a/mojo/public/cpp/bindings/lib/message_buffer.cc
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/bindings/lib/message_buffer.h"
-
-#include <limits>
-
-#include "mojo/public/cpp/bindings/lib/serialization_util.h"
-
-namespace mojo {
-namespace internal {
-
-MessageBuffer::MessageBuffer(size_t capacity, bool zero_initialized) {
-  DCHECK_LE(capacity, std::numeric_limits<uint32_t>::max());
-
-  MojoResult rv = AllocMessage(capacity, nullptr, 0,
-                               MOJO_ALLOC_MESSAGE_FLAG_NONE, &message_);
-  CHECK_EQ(rv, MOJO_RESULT_OK);
-
-  void* buffer = nullptr;
-  if (capacity != 0) {
-    rv = GetMessageBuffer(message_.get(), &buffer);
-    CHECK_EQ(rv, MOJO_RESULT_OK);
-
-    if (zero_initialized)
-      memset(buffer, 0, capacity);
-  }
-  Initialize(buffer, capacity);
-}
-
-MessageBuffer::MessageBuffer(ScopedMessageHandle message, uint32_t num_bytes) {
-  message_ = std::move(message);
-
-  void* buffer = nullptr;
-  if (num_bytes != 0) {
-    MojoResult rv = GetMessageBuffer(message_.get(), &buffer);
-    CHECK_EQ(rv, MOJO_RESULT_OK);
-  }
-  Initialize(buffer, num_bytes);
-}
-
-MessageBuffer::~MessageBuffer() {}
-
-void MessageBuffer::NotifyBadMessage(const std::string& error) {
-  DCHECK(message_.is_valid());
-  MojoResult result = mojo::NotifyBadMessage(message_.get(), error);
-  DCHECK_EQ(result, MOJO_RESULT_OK);
-}
-
-}  // namespace internal
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/message_buffer.h b/mojo/public/cpp/bindings/lib/message_buffer.h
deleted file mode 100644
index 96d5140..0000000
--- a/mojo/public/cpp/bindings/lib/message_buffer.h
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_MESSAGE_LIB_MESSAGE_BUFFER_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_MESSAGE_LIB_MESSAGE_BUFFER_H_
-
-#include <stdint.h>
-
-#include <utility>
-
-#include "base/macros.h"
-#include "mojo/public/cpp/bindings/lib/buffer.h"
-#include "mojo/public/cpp/system/message.h"
-
-namespace mojo {
-namespace internal {
-
-// A fixed-size Buffer using a Mojo message object for storage.
-class MessageBuffer : public Buffer {
- public:
-  // Initializes this buffer to carry a fixed byte capacity and no handles.
-  MessageBuffer(size_t capacity, bool zero_initialized);
-
-  // Initializes this buffer from an existing Mojo MessageHandle.
-  MessageBuffer(ScopedMessageHandle message, uint32_t num_bytes);
-
-  ~MessageBuffer();
-
-  ScopedMessageHandle TakeMessage() { return std::move(message_); }
-
-  void NotifyBadMessage(const std::string& error);
-
- private:
-  ScopedMessageHandle message_;
-
-  DISALLOW_COPY_AND_ASSIGN(MessageBuffer);
-};
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_MESSAGE_LIB_MESSAGE_BUFFER_H_
diff --git a/mojo/public/cpp/bindings/lib/message_builder.cc b/mojo/public/cpp/bindings/lib/message_builder.cc
deleted file mode 100644
index 6806a73..0000000
--- a/mojo/public/cpp/bindings/lib/message_builder.cc
+++ /dev/null
@@ -1,69 +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 "mojo/public/cpp/bindings/lib/message_builder.h"
-
-#include "mojo/public/cpp/bindings/lib/array_internal.h"
-#include "mojo/public/cpp/bindings/lib/bindings_internal.h"
-#include "mojo/public/cpp/bindings/lib/buffer.h"
-#include "mojo/public/cpp/bindings/lib/message_internal.h"
-
-namespace mojo {
-namespace internal {
-
-template <typename Header>
-void Allocate(Buffer* buf, Header** header) {
-  *header = static_cast<Header*>(buf->Allocate(sizeof(Header)));
-  (*header)->num_bytes = sizeof(Header);
-}
-
-MessageBuilder::MessageBuilder(uint32_t name,
-                               uint32_t flags,
-                               size_t payload_size,
-                               size_t payload_interface_id_count) {
-  if (payload_interface_id_count > 0) {
-    // Version 2
-    InitializeMessage(
-        sizeof(MessageHeaderV2) + Align(payload_size) +
-        ArrayDataTraits<uint32_t>::GetStorageSize(
-            static_cast<uint32_t>(payload_interface_id_count)));
-
-    MessageHeaderV2* header;
-    Allocate(message_.buffer(), &header);
-    header->version = 2;
-    header->name = name;
-    header->flags = flags;
-    // The payload immediately follows the header.
-    header->payload.Set(header + 1);
-  } else if (flags &
-             (Message::kFlagExpectsResponse | Message::kFlagIsResponse)) {
-    // Version 1
-    InitializeMessage(sizeof(MessageHeaderV1) + payload_size);
-
-    MessageHeaderV1* header;
-    Allocate(message_.buffer(), &header);
-    header->version = 1;
-    header->name = name;
-    header->flags = flags;
-  } else {
-    InitializeMessage(sizeof(MessageHeader) + payload_size);
-
-    MessageHeader* header;
-    Allocate(message_.buffer(), &header);
-    header->version = 0;
-    header->name = name;
-    header->flags = flags;
-  }
-}
-
-MessageBuilder::~MessageBuilder() {
-}
-
-void MessageBuilder::InitializeMessage(size_t size) {
-  message_.Initialize(static_cast<uint32_t>(Align(size)),
-                      true /* zero_initialized */);
-}
-
-}  // namespace internal
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/message_builder.h b/mojo/public/cpp/bindings/lib/message_builder.h
deleted file mode 100644
index 8a4d5c4..0000000
--- a/mojo/public/cpp/bindings/lib/message_builder.h
+++ /dev/null
@@ -1,45 +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 MOJO_PUBLIC_CPP_BINDINGS_LIB_MESSAGE_BUILDER_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_MESSAGE_BUILDER_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include "base/macros.h"
-#include "mojo/public/cpp/bindings/bindings_export.h"
-#include "mojo/public/cpp/bindings/message.h"
-
-namespace mojo {
-
-class Message;
-
-namespace internal {
-
-class Buffer;
-
-class MOJO_CPP_BINDINGS_EXPORT MessageBuilder {
- public:
-  MessageBuilder(uint32_t name,
-                 uint32_t flags,
-                 size_t payload_size,
-                 size_t payload_interface_id_count);
-  ~MessageBuilder();
-
-  Buffer* buffer() { return message_.buffer(); }
-  Message* message() { return &message_; }
-
- private:
-  void InitializeMessage(size_t size);
-
-  Message message_;
-
-  DISALLOW_COPY_AND_ASSIGN(MessageBuilder);
-};
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_MESSAGE_BUILDER_H_
diff --git a/mojo/public/cpp/bindings/lib/message_header_validator.cc b/mojo/public/cpp/bindings/lib/message_header_validator.cc
deleted file mode 100644
index 9f8c627..0000000
--- a/mojo/public/cpp/bindings/lib/message_header_validator.cc
+++ /dev/null
@@ -1,133 +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 "mojo/public/cpp/bindings/message_header_validator.h"
-
-#include "mojo/public/cpp/bindings/lib/array_internal.h"
-#include "mojo/public/cpp/bindings/lib/validate_params.h"
-#include "mojo/public/cpp/bindings/lib/validation_context.h"
-#include "mojo/public/cpp/bindings/lib/validation_errors.h"
-#include "mojo/public/cpp/bindings/lib/validation_util.h"
-
-namespace mojo {
-namespace {
-
-// TODO(yzshen): Define a mojom struct for message header and use the generated
-// validation and data view code.
-bool IsValidMessageHeader(const internal::MessageHeader* header,
-                          internal::ValidationContext* validation_context) {
-  // NOTE: Our goal is to preserve support for future extension of the message
-  // header. If we encounter fields we do not understand, we must ignore them.
-
-  // Extra validation of the struct header:
-  do {
-    if (header->version == 0) {
-      if (header->num_bytes == sizeof(internal::MessageHeader))
-        break;
-    } else if (header->version == 1) {
-      if (header->num_bytes == sizeof(internal::MessageHeaderV1))
-        break;
-    } else if (header->version == 2) {
-      if (header->num_bytes == sizeof(internal::MessageHeaderV2))
-        break;
-    } else if (header->version > 2) {
-      if (header->num_bytes >= sizeof(internal::MessageHeaderV2))
-        break;
-    }
-    internal::ReportValidationError(
-        validation_context,
-        internal::VALIDATION_ERROR_UNEXPECTED_STRUCT_HEADER);
-    return false;
-  } while (false);
-
-  // Validate flags (allow unknown bits):
-
-  // These flags require a RequestID.
-  constexpr uint32_t kRequestIdFlags =
-      Message::kFlagExpectsResponse | Message::kFlagIsResponse;
-  if (header->version == 0 && (header->flags & kRequestIdFlags)) {
-    internal::ReportValidationError(
-        validation_context,
-        internal::VALIDATION_ERROR_MESSAGE_HEADER_MISSING_REQUEST_ID);
-    return false;
-  }
-
-  // These flags are mutually exclusive.
-  if ((header->flags & kRequestIdFlags) == kRequestIdFlags) {
-    internal::ReportValidationError(
-        validation_context,
-        internal::VALIDATION_ERROR_MESSAGE_HEADER_INVALID_FLAGS);
-    return false;
-  }
-
-  if (header->version < 2)
-    return true;
-
-  auto* header_v2 = static_cast<const internal::MessageHeaderV2*>(header);
-  // For the payload pointer:
-  // - Check that the pointer can be safely decoded.
-  // - Claim one byte that the pointer points to. It makes sure not only the
-  //   address is within the message, but also the address precedes the array
-  //   storing interface IDs (which is important for safely calculating the
-  //   payload size).
-  // - Validation of the payload contents will be done separately based on the
-  //   payload type.
-  if (!header_v2->payload.is_null() &&
-      (!internal::ValidatePointer(header_v2->payload, validation_context) ||
-       !validation_context->ClaimMemory(header_v2->payload.Get(), 1))) {
-    return false;
-  }
-
-  const internal::ContainerValidateParams validate_params(0, false, nullptr);
-  if (!internal::ValidateContainer(header_v2->payload_interface_ids,
-                                   validation_context, &validate_params)) {
-    return false;
-  }
-
-  if (!header_v2->payload_interface_ids.is_null()) {
-    size_t num_ids = header_v2->payload_interface_ids.Get()->size();
-    const uint32_t* ids = header_v2->payload_interface_ids.Get()->storage();
-    for (size_t i = 0; i < num_ids; ++i) {
-      if (!IsValidInterfaceId(ids[i]) || IsMasterInterfaceId(ids[i])) {
-        internal::ReportValidationError(
-            validation_context,
-            internal::VALIDATION_ERROR_ILLEGAL_INTERFACE_ID);
-        return false;
-      }
-    }
-  }
-
-  return true;
-}
-
-}  // namespace
-
-MessageHeaderValidator::MessageHeaderValidator()
-    : MessageHeaderValidator("MessageHeaderValidator") {}
-
-MessageHeaderValidator::MessageHeaderValidator(const std::string& description)
-    : description_(description) {
-}
-
-void MessageHeaderValidator::SetDescription(const std::string& description) {
-  description_ = description;
-}
-
-bool MessageHeaderValidator::Accept(Message* message) {
-  // Pass 0 as number of handles and associated endpoint handles because we
-  // don't expect any in the header, even if |message| contains handles.
-  internal::ValidationContext validation_context(
-      message->data(), message->data_num_bytes(), 0, 0, message, description_);
-
-  if (!internal::ValidateStructHeaderAndClaimMemory(message->data(),
-                                                    &validation_context))
-    return false;
-
-  if (!IsValidMessageHeader(message->header(), &validation_context))
-    return false;
-
-  return true;
-}
-
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/message_internal.h b/mojo/public/cpp/bindings/lib/message_internal.h
deleted file mode 100644
index 6693198..0000000
--- a/mojo/public/cpp/bindings/lib/message_internal.h
+++ /dev/null
@@ -1,82 +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 MOJO_PUBLIC_CPP_BINDINGS_LIB_MESSAGE_INTERNAL_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_MESSAGE_INTERNAL_H_
-
-#include <stdint.h>
-
-#include <string>
-
-#include "base/callback.h"
-#include "base/macros.h"
-#include "mojo/public/cpp/bindings/bindings_export.h"
-#include "mojo/public/cpp/bindings/lib/bindings_internal.h"
-
-namespace mojo {
-
-class Message;
-
-namespace internal {
-
-template <typename T>
-class Array_Data;
-
-#pragma pack(push, 1)
-
-struct MessageHeader : internal::StructHeader {
-  // Interface ID for identifying multiple interfaces running on the same
-  // message pipe.
-  uint32_t interface_id;
-  // Message name, which is scoped to the interface that the message belongs to.
-  uint32_t name;
-  // 0 or either of the enum values defined above.
-  uint32_t flags;
-  // Unused padding to make the struct size a multiple of 8 bytes.
-  uint32_t padding;
-};
-static_assert(sizeof(MessageHeader) == 24, "Bad sizeof(MessageHeader)");
-
-struct MessageHeaderV1 : MessageHeader {
-  // Only used if either kFlagExpectsResponse or kFlagIsResponse is set in
-  // order to match responses with corresponding requests.
-  uint64_t request_id;
-};
-static_assert(sizeof(MessageHeaderV1) == 32, "Bad sizeof(MessageHeaderV1)");
-
-struct MessageHeaderV2 : MessageHeaderV1 {
-  MessageHeaderV2();
-  GenericPointer payload;
-  Pointer<Array_Data<uint32_t>> payload_interface_ids;
-};
-static_assert(sizeof(MessageHeaderV2) == 48, "Bad sizeof(MessageHeaderV2)");
-
-#pragma pack(pop)
-
-class MOJO_CPP_BINDINGS_EXPORT MessageDispatchContext {
- public:
-  explicit MessageDispatchContext(Message* message);
-  ~MessageDispatchContext();
-
-  static MessageDispatchContext* current();
-
-  const base::Callback<void(const std::string&)>& GetBadMessageCallback();
-
- private:
-  MessageDispatchContext* outer_context_;
-  Message* message_;
-  base::Callback<void(const std::string&)> bad_message_callback_;
-
-  DISALLOW_COPY_AND_ASSIGN(MessageDispatchContext);
-};
-
-class MOJO_CPP_BINDINGS_EXPORT SyncMessageResponseSetup {
- public:
-  static void SetCurrentSyncResponseMessage(Message* message);
-};
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_MESSAGE_INTERNAL_H_
diff --git a/mojo/public/cpp/bindings/lib/multiplex_router.cc b/mojo/public/cpp/bindings/lib/multiplex_router.cc
deleted file mode 100644
index ff7c678..0000000
--- a/mojo/public/cpp/bindings/lib/multiplex_router.cc
+++ /dev/null
@@ -1,960 +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 "mojo/public/cpp/bindings/lib/multiplex_router.h"
-
-#include <stdint.h>
-
-#include <utility>
-
-#include "base/bind.h"
-#include "base/location.h"
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "base/single_thread_task_runner.h"
-#include "base/stl_util.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "mojo/public/cpp/bindings/interface_endpoint_client.h"
-#include "mojo/public/cpp/bindings/interface_endpoint_controller.h"
-#include "mojo/public/cpp/bindings/lib/may_auto_lock.h"
-#include "mojo/public/cpp/bindings/sync_event_watcher.h"
-
-namespace mojo {
-namespace internal {
-
-// InterfaceEndpoint stores the information of an interface endpoint registered
-// with the router.
-// No one other than the router's |endpoints_| and |tasks_| should hold refs to
-// this object.
-class MultiplexRouter::InterfaceEndpoint
-    : public base::RefCountedThreadSafe<InterfaceEndpoint>,
-      public InterfaceEndpointController {
- public:
-  InterfaceEndpoint(MultiplexRouter* router, InterfaceId id)
-      : router_(router),
-        id_(id),
-        closed_(false),
-        peer_closed_(false),
-        handle_created_(false),
-        client_(nullptr) {}
-
-  // ---------------------------------------------------------------------------
-  // The following public methods are safe to call from any threads without
-  // locking.
-
-  InterfaceId id() const { return id_; }
-
-  // ---------------------------------------------------------------------------
-  // The following public methods are called under the router's lock.
-
-  bool closed() const { return closed_; }
-  void set_closed() {
-    router_->AssertLockAcquired();
-    closed_ = true;
-  }
-
-  bool peer_closed() const { return peer_closed_; }
-  void set_peer_closed() {
-    router_->AssertLockAcquired();
-    peer_closed_ = true;
-  }
-
-  bool handle_created() const { return handle_created_; }
-  void set_handle_created() {
-    router_->AssertLockAcquired();
-    handle_created_ = true;
-  }
-
-  const base::Optional<DisconnectReason>& disconnect_reason() const {
-    return disconnect_reason_;
-  }
-  void set_disconnect_reason(
-      const base::Optional<DisconnectReason>& disconnect_reason) {
-    router_->AssertLockAcquired();
-    disconnect_reason_ = disconnect_reason;
-  }
-
-  base::SingleThreadTaskRunner* task_runner() const {
-    return task_runner_.get();
-  }
-
-  InterfaceEndpointClient* client() const { return client_; }
-
-  void AttachClient(InterfaceEndpointClient* client,
-                    scoped_refptr<base::SingleThreadTaskRunner> runner) {
-    router_->AssertLockAcquired();
-    DCHECK(!client_);
-    DCHECK(!closed_);
-    DCHECK(runner->BelongsToCurrentThread());
-
-    task_runner_ = std::move(runner);
-    client_ = client;
-  }
-
-  // This method must be called on the same thread as the corresponding
-  // AttachClient() call.
-  void DetachClient() {
-    router_->AssertLockAcquired();
-    DCHECK(client_);
-    DCHECK(task_runner_->BelongsToCurrentThread());
-    DCHECK(!closed_);
-
-    task_runner_ = nullptr;
-    client_ = nullptr;
-    sync_watcher_.reset();
-  }
-
-  void SignalSyncMessageEvent() {
-    router_->AssertLockAcquired();
-    if (sync_message_event_signaled_)
-      return;
-    sync_message_event_signaled_ = true;
-    if (sync_message_event_)
-      sync_message_event_->Signal();
-  }
-
-  void ResetSyncMessageSignal() {
-    router_->AssertLockAcquired();
-    if (!sync_message_event_signaled_)
-      return;
-    sync_message_event_signaled_ = false;
-    if (sync_message_event_)
-      sync_message_event_->Reset();
-  }
-
-  // ---------------------------------------------------------------------------
-  // The following public methods (i.e., InterfaceEndpointController
-  // implementation) are called by the client on the same thread as the
-  // AttachClient() call. They are called outside of the router's lock.
-
-  bool SendMessage(Message* message) override {
-    DCHECK(task_runner_->BelongsToCurrentThread());
-    message->set_interface_id(id_);
-    return router_->connector_.Accept(message);
-  }
-
-  void AllowWokenUpBySyncWatchOnSameThread() override {
-    DCHECK(task_runner_->BelongsToCurrentThread());
-
-    EnsureSyncWatcherExists();
-    sync_watcher_->AllowWokenUpBySyncWatchOnSameThread();
-  }
-
-  bool SyncWatch(const bool* should_stop) override {
-    DCHECK(task_runner_->BelongsToCurrentThread());
-
-    EnsureSyncWatcherExists();
-    return sync_watcher_->SyncWatch(should_stop);
-  }
-
- private:
-  friend class base::RefCountedThreadSafe<InterfaceEndpoint>;
-
-  ~InterfaceEndpoint() override {
-    router_->AssertLockAcquired();
-
-    DCHECK(!client_);
-    DCHECK(closed_);
-    DCHECK(peer_closed_);
-    DCHECK(!sync_watcher_);
-  }
-
-  void OnSyncEventSignaled() {
-    DCHECK(task_runner_->BelongsToCurrentThread());
-    scoped_refptr<MultiplexRouter> router_protector(router_);
-
-    MayAutoLock locker(&router_->lock_);
-    scoped_refptr<InterfaceEndpoint> self_protector(this);
-
-    bool more_to_process = router_->ProcessFirstSyncMessageForEndpoint(id_);
-
-    if (!more_to_process)
-      ResetSyncMessageSignal();
-
-    // Currently there are no queued sync messages and the peer has closed so
-    // there won't be incoming sync messages in the future.
-    if (!more_to_process && peer_closed_) {
-      // If a SyncWatch() call (or multiple ones) of this interface endpoint is
-      // on the call stack, resetting the sync watcher will allow it to exit
-      // when the call stack unwinds to that frame.
-      sync_watcher_.reset();
-    }
-  }
-
-  void EnsureSyncWatcherExists() {
-    DCHECK(task_runner_->BelongsToCurrentThread());
-    if (sync_watcher_)
-      return;
-
-    {
-      MayAutoLock locker(&router_->lock_);
-      if (!sync_message_event_) {
-        sync_message_event_.emplace(
-            base::WaitableEvent::ResetPolicy::MANUAL,
-            base::WaitableEvent::InitialState::NOT_SIGNALED);
-        if (sync_message_event_signaled_)
-          sync_message_event_->Signal();
-      }
-    }
-    sync_watcher_.reset(
-        new SyncEventWatcher(&sync_message_event_.value(),
-                             base::Bind(&InterfaceEndpoint::OnSyncEventSignaled,
-                                        base::Unretained(this))));
-  }
-
-  // ---------------------------------------------------------------------------
-  // The following members are safe to access from any threads.
-
-  MultiplexRouter* const router_;
-  const InterfaceId id_;
-
-  // ---------------------------------------------------------------------------
-  // The following members are accessed under the router's lock.
-
-  // Whether the endpoint has been closed.
-  bool closed_;
-  // Whether the peer endpoint has been closed.
-  bool peer_closed_;
-
-  // Whether there is already a ScopedInterfaceEndpointHandle created for this
-  // endpoint.
-  bool handle_created_;
-
-  base::Optional<DisconnectReason> disconnect_reason_;
-
-  // The task runner on which |client_|'s methods can be called.
-  scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
-  // Not owned. It is null if no client is attached to this endpoint.
-  InterfaceEndpointClient* client_;
-
-  // An event used to signal that sync messages are available. The event is
-  // initialized under the router's lock and remains unchanged afterwards. It
-  // may be accessed outside of the router's lock later.
-  base::Optional<base::WaitableEvent> sync_message_event_;
-  bool sync_message_event_signaled_ = false;
-
-  // ---------------------------------------------------------------------------
-  // The following members are only valid while a client is attached. They are
-  // used exclusively on the client's thread. They may be accessed outside of
-  // the router's lock.
-
-  std::unique_ptr<SyncEventWatcher> sync_watcher_;
-
-  DISALLOW_COPY_AND_ASSIGN(InterfaceEndpoint);
-};
-
-// MessageWrapper objects are always destroyed under the router's lock. On
-// destruction, if the message it wrappers contains
-// ScopedInterfaceEndpointHandles (which cannot be destructed under the
-// router's lock), the wrapper unlocks to clean them up.
-class MultiplexRouter::MessageWrapper {
- public:
-  MessageWrapper() = default;
-
-  MessageWrapper(MultiplexRouter* router, Message message)
-      : router_(router), value_(std::move(message)) {}
-
-  MessageWrapper(MessageWrapper&& other)
-      : router_(other.router_), value_(std::move(other.value_)) {}
-
-  ~MessageWrapper() {
-    if (value_.associated_endpoint_handles()->empty())
-      return;
-
-    router_->AssertLockAcquired();
-    {
-      MayAutoUnlock unlocker(&router_->lock_);
-      value_.mutable_associated_endpoint_handles()->clear();
-    }
-  }
-
-  MessageWrapper& operator=(MessageWrapper&& other) {
-    router_ = other.router_;
-    value_ = std::move(other.value_);
-    return *this;
-  }
-
-  Message& value() { return value_; }
-
- private:
-  MultiplexRouter* router_ = nullptr;
-  Message value_;
-
-  DISALLOW_COPY_AND_ASSIGN(MessageWrapper);
-};
-
-struct MultiplexRouter::Task {
- public:
-  // Doesn't take ownership of |message| but takes its contents.
-  static std::unique_ptr<Task> CreateMessageTask(
-      MessageWrapper message_wrapper) {
-    Task* task = new Task(MESSAGE);
-    task->message_wrapper = std::move(message_wrapper);
-    return base::WrapUnique(task);
-  }
-  static std::unique_ptr<Task> CreateNotifyErrorTask(
-      InterfaceEndpoint* endpoint) {
-    Task* task = new Task(NOTIFY_ERROR);
-    task->endpoint_to_notify = endpoint;
-    return base::WrapUnique(task);
-  }
-
-  ~Task() {}
-
-  bool IsMessageTask() const { return type == MESSAGE; }
-  bool IsNotifyErrorTask() const { return type == NOTIFY_ERROR; }
-
-  MessageWrapper message_wrapper;
-  scoped_refptr<InterfaceEndpoint> endpoint_to_notify;
-
-  enum Type { MESSAGE, NOTIFY_ERROR };
-  Type type;
-
- private:
-  explicit Task(Type in_type) : type(in_type) {}
-
-  DISALLOW_COPY_AND_ASSIGN(Task);
-};
-
-MultiplexRouter::MultiplexRouter(
-    ScopedMessagePipeHandle message_pipe,
-    Config config,
-    bool set_interface_id_namesapce_bit,
-    scoped_refptr<base::SingleThreadTaskRunner> runner)
-    : set_interface_id_namespace_bit_(set_interface_id_namesapce_bit),
-      task_runner_(runner),
-      header_validator_(nullptr),
-      filters_(this),
-      connector_(std::move(message_pipe),
-                 config == MULTI_INTERFACE ? Connector::MULTI_THREADED_SEND
-                                           : Connector::SINGLE_THREADED_SEND,
-                 std::move(runner)),
-      control_message_handler_(this),
-      control_message_proxy_(&connector_),
-      next_interface_id_value_(1),
-      posted_to_process_tasks_(false),
-      encountered_error_(false),
-      paused_(false),
-      testing_mode_(false) {
-  DCHECK(task_runner_->BelongsToCurrentThread());
-
-  if (config == MULTI_INTERFACE)
-    lock_.emplace();
-
-  if (config == SINGLE_INTERFACE_WITH_SYNC_METHODS ||
-      config == MULTI_INTERFACE) {
-    // Always participate in sync handle watching in multi-interface mode,
-    // because even if it doesn't expect sync requests during sync handle
-    // watching, it may still need to dispatch messages to associated endpoints
-    // on a different thread.
-    connector_.AllowWokenUpBySyncWatchOnSameThread();
-  }
-  connector_.set_incoming_receiver(&filters_);
-  connector_.set_connection_error_handler(
-      base::Bind(&MultiplexRouter::OnPipeConnectionError,
-                 base::Unretained(this)));
-
-  std::unique_ptr<MessageHeaderValidator> header_validator =
-      base::MakeUnique<MessageHeaderValidator>();
-  header_validator_ = header_validator.get();
-  filters_.Append(std::move(header_validator));
-}
-
-MultiplexRouter::~MultiplexRouter() {
-  MayAutoLock locker(&lock_);
-
-  sync_message_tasks_.clear();
-  tasks_.clear();
-
-  for (auto iter = endpoints_.begin(); iter != endpoints_.end();) {
-    InterfaceEndpoint* endpoint = iter->second.get();
-    // Increment the iterator before calling UpdateEndpointStateMayRemove()
-    // because it may remove the corresponding value from the map.
-    ++iter;
-
-    if (!endpoint->closed()) {
-      // This happens when a NotifyPeerEndpointClosed message been received, but
-      // the interface ID hasn't been used to create local endpoint handle.
-      DCHECK(!endpoint->client());
-      DCHECK(endpoint->peer_closed());
-      UpdateEndpointStateMayRemove(endpoint, ENDPOINT_CLOSED);
-    } else {
-      UpdateEndpointStateMayRemove(endpoint, PEER_ENDPOINT_CLOSED);
-    }
-  }
-
-  DCHECK(endpoints_.empty());
-}
-
-void MultiplexRouter::SetMasterInterfaceName(const char* name) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  header_validator_->SetDescription(
-      std::string(name) + " [master] MessageHeaderValidator");
-  control_message_handler_.SetDescription(
-      std::string(name) + " [master] PipeControlMessageHandler");
-  connector_.SetWatcherHeapProfilerTag(name);
-}
-
-InterfaceId MultiplexRouter::AssociateInterface(
-    ScopedInterfaceEndpointHandle handle_to_send) {
-  if (!handle_to_send.pending_association())
-    return kInvalidInterfaceId;
-
-  uint32_t id = 0;
-  {
-    MayAutoLock locker(&lock_);
-    do {
-      if (next_interface_id_value_ >= kInterfaceIdNamespaceMask)
-        next_interface_id_value_ = 1;
-      id = next_interface_id_value_++;
-      if (set_interface_id_namespace_bit_)
-        id |= kInterfaceIdNamespaceMask;
-    } while (base::ContainsKey(endpoints_, id));
-
-    InterfaceEndpoint* endpoint = new InterfaceEndpoint(this, id);
-    endpoints_[id] = endpoint;
-    if (encountered_error_)
-      UpdateEndpointStateMayRemove(endpoint, PEER_ENDPOINT_CLOSED);
-    endpoint->set_handle_created();
-  }
-
-  if (!NotifyAssociation(&handle_to_send, id)) {
-    // The peer handle of |handle_to_send|, which is supposed to join this
-    // associated group, has been closed.
-    {
-      MayAutoLock locker(&lock_);
-      InterfaceEndpoint* endpoint = FindEndpoint(id);
-      if (endpoint)
-        UpdateEndpointStateMayRemove(endpoint, ENDPOINT_CLOSED);
-    }
-
-    control_message_proxy_.NotifyPeerEndpointClosed(
-        id, handle_to_send.disconnect_reason());
-  }
-  return id;
-}
-
-ScopedInterfaceEndpointHandle MultiplexRouter::CreateLocalEndpointHandle(
-    InterfaceId id) {
-  if (!IsValidInterfaceId(id))
-    return ScopedInterfaceEndpointHandle();
-
-  MayAutoLock locker(&lock_);
-  bool inserted = false;
-  InterfaceEndpoint* endpoint = FindOrInsertEndpoint(id, &inserted);
-  if (inserted) {
-    DCHECK(!endpoint->handle_created());
-
-    if (encountered_error_)
-      UpdateEndpointStateMayRemove(endpoint, PEER_ENDPOINT_CLOSED);
-  } else {
-    // If the endpoint already exist, it is because we have received a
-    // notification that the peer endpoint has closed.
-    CHECK(!endpoint->closed());
-    CHECK(endpoint->peer_closed());
-
-    if (endpoint->handle_created())
-      return ScopedInterfaceEndpointHandle();
-  }
-
-  endpoint->set_handle_created();
-  return CreateScopedInterfaceEndpointHandle(id);
-}
-
-void MultiplexRouter::CloseEndpointHandle(
-    InterfaceId id,
-    const base::Optional<DisconnectReason>& reason) {
-  if (!IsValidInterfaceId(id))
-    return;
-
-  MayAutoLock locker(&lock_);
-  DCHECK(base::ContainsKey(endpoints_, id));
-  InterfaceEndpoint* endpoint = endpoints_[id].get();
-  DCHECK(!endpoint->client());
-  DCHECK(!endpoint->closed());
-  UpdateEndpointStateMayRemove(endpoint, ENDPOINT_CLOSED);
-
-  if (!IsMasterInterfaceId(id) || reason) {
-    MayAutoUnlock unlocker(&lock_);
-    control_message_proxy_.NotifyPeerEndpointClosed(id, reason);
-  }
-
-  ProcessTasks(NO_DIRECT_CLIENT_CALLS, nullptr);
-}
-
-InterfaceEndpointController* MultiplexRouter::AttachEndpointClient(
-    const ScopedInterfaceEndpointHandle& handle,
-    InterfaceEndpointClient* client,
-    scoped_refptr<base::SingleThreadTaskRunner> runner) {
-  const InterfaceId id = handle.id();
-
-  DCHECK(IsValidInterfaceId(id));
-  DCHECK(client);
-
-  MayAutoLock locker(&lock_);
-  DCHECK(base::ContainsKey(endpoints_, id));
-
-  InterfaceEndpoint* endpoint = endpoints_[id].get();
-  endpoint->AttachClient(client, std::move(runner));
-
-  if (endpoint->peer_closed())
-    tasks_.push_back(Task::CreateNotifyErrorTask(endpoint));
-  ProcessTasks(NO_DIRECT_CLIENT_CALLS, nullptr);
-
-  return endpoint;
-}
-
-void MultiplexRouter::DetachEndpointClient(
-    const ScopedInterfaceEndpointHandle& handle) {
-  const InterfaceId id = handle.id();
-
-  DCHECK(IsValidInterfaceId(id));
-
-  MayAutoLock locker(&lock_);
-  DCHECK(base::ContainsKey(endpoints_, id));
-
-  InterfaceEndpoint* endpoint = endpoints_[id].get();
-  endpoint->DetachClient();
-}
-
-void MultiplexRouter::RaiseError() {
-  if (task_runner_->BelongsToCurrentThread()) {
-    connector_.RaiseError();
-  } else {
-    task_runner_->PostTask(FROM_HERE,
-                           base::Bind(&MultiplexRouter::RaiseError, this));
-  }
-}
-
-void MultiplexRouter::CloseMessagePipe() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  connector_.CloseMessagePipe();
-  // CloseMessagePipe() above won't trigger connection error handler.
-  // Explicitly call OnPipeConnectionError() so that associated endpoints will
-  // get notified.
-  OnPipeConnectionError();
-}
-
-void MultiplexRouter::PauseIncomingMethodCallProcessing() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  connector_.PauseIncomingMethodCallProcessing();
-
-  MayAutoLock locker(&lock_);
-  paused_ = true;
-
-  for (auto iter = endpoints_.begin(); iter != endpoints_.end(); ++iter)
-    iter->second->ResetSyncMessageSignal();
-}
-
-void MultiplexRouter::ResumeIncomingMethodCallProcessing() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  connector_.ResumeIncomingMethodCallProcessing();
-
-  MayAutoLock locker(&lock_);
-  paused_ = false;
-
-  for (auto iter = endpoints_.begin(); iter != endpoints_.end(); ++iter) {
-    auto sync_iter = sync_message_tasks_.find(iter->first);
-    if (iter->second->peer_closed() ||
-        (sync_iter != sync_message_tasks_.end() &&
-         !sync_iter->second.empty())) {
-      iter->second->SignalSyncMessageEvent();
-    }
-  }
-
-  ProcessTasks(NO_DIRECT_CLIENT_CALLS, nullptr);
-}
-
-bool MultiplexRouter::HasAssociatedEndpoints() const {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  MayAutoLock locker(&lock_);
-
-  if (endpoints_.size() > 1)
-    return true;
-  if (endpoints_.size() == 0)
-    return false;
-
-  return !base::ContainsKey(endpoints_, kMasterInterfaceId);
-}
-
-void MultiplexRouter::EnableTestingMode() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  MayAutoLock locker(&lock_);
-
-  testing_mode_ = true;
-  connector_.set_enforce_errors_from_incoming_receiver(false);
-}
-
-bool MultiplexRouter::Accept(Message* message) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-
-  if (!message->DeserializeAssociatedEndpointHandles(this))
-    return false;
-
-  scoped_refptr<MultiplexRouter> protector(this);
-  MayAutoLock locker(&lock_);
-
-  DCHECK(!paused_);
-
-  ClientCallBehavior client_call_behavior =
-      connector_.during_sync_handle_watcher_callback()
-          ? ALLOW_DIRECT_CLIENT_CALLS_FOR_SYNC_MESSAGES
-          : ALLOW_DIRECT_CLIENT_CALLS;
-
-  bool processed =
-      tasks_.empty() && ProcessIncomingMessage(message, client_call_behavior,
-                                               connector_.task_runner());
-
-  if (!processed) {
-    // Either the task queue is not empty or we cannot process the message
-    // directly. In both cases, there is no need to call ProcessTasks().
-    tasks_.push_back(
-        Task::CreateMessageTask(MessageWrapper(this, std::move(*message))));
-    Task* task = tasks_.back().get();
-
-    if (task->message_wrapper.value().has_flag(Message::kFlagIsSync)) {
-      InterfaceId id = task->message_wrapper.value().interface_id();
-      sync_message_tasks_[id].push_back(task);
-      InterfaceEndpoint* endpoint = FindEndpoint(id);
-      if (endpoint)
-        endpoint->SignalSyncMessageEvent();
-    }
-  } else if (!tasks_.empty()) {
-    // Processing the message may result in new tasks (for error notification)
-    // being added to the queue. In this case, we have to attempt to process the
-    // tasks.
-    ProcessTasks(client_call_behavior, connector_.task_runner());
-  }
-
-  // Always return true. If we see errors during message processing, we will
-  // explicitly call Connector::RaiseError() to disconnect the message pipe.
-  return true;
-}
-
-bool MultiplexRouter::OnPeerAssociatedEndpointClosed(
-    InterfaceId id,
-    const base::Optional<DisconnectReason>& reason) {
-  DCHECK(!IsMasterInterfaceId(id) || reason);
-
-  MayAutoLock locker(&lock_);
-  InterfaceEndpoint* endpoint = FindOrInsertEndpoint(id, nullptr);
-
-  if (reason)
-    endpoint->set_disconnect_reason(reason);
-
-  // It is possible that this endpoint has been set as peer closed. That is
-  // because when the message pipe is closed, all the endpoints are updated with
-  // PEER_ENDPOINT_CLOSED. We continue to process remaining tasks in the queue,
-  // as long as there are refs keeping the router alive. If there is a
-  // PeerAssociatedEndpointClosedEvent control message in the queue, we will get
-  // here and see that the endpoint has been marked as peer closed.
-  if (!endpoint->peer_closed()) {
-    if (endpoint->client())
-      tasks_.push_back(Task::CreateNotifyErrorTask(endpoint));
-    UpdateEndpointStateMayRemove(endpoint, PEER_ENDPOINT_CLOSED);
-  }
-
-  // No need to trigger a ProcessTasks() because it is already on the stack.
-
-  return true;
-}
-
-void MultiplexRouter::OnPipeConnectionError() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-
-  scoped_refptr<MultiplexRouter> protector(this);
-  MayAutoLock locker(&lock_);
-
-  encountered_error_ = true;
-
-  for (auto iter = endpoints_.begin(); iter != endpoints_.end();) {
-    InterfaceEndpoint* endpoint = iter->second.get();
-    // Increment the iterator before calling UpdateEndpointStateMayRemove()
-    // because it may remove the corresponding value from the map.
-    ++iter;
-
-    if (endpoint->client())
-      tasks_.push_back(Task::CreateNotifyErrorTask(endpoint));
-
-    UpdateEndpointStateMayRemove(endpoint, PEER_ENDPOINT_CLOSED);
-  }
-
-  ProcessTasks(connector_.during_sync_handle_watcher_callback()
-                   ? ALLOW_DIRECT_CLIENT_CALLS_FOR_SYNC_MESSAGES
-                   : ALLOW_DIRECT_CLIENT_CALLS,
-               connector_.task_runner());
-}
-
-void MultiplexRouter::ProcessTasks(
-    ClientCallBehavior client_call_behavior,
-    base::SingleThreadTaskRunner* current_task_runner) {
-  AssertLockAcquired();
-
-  if (posted_to_process_tasks_)
-    return;
-
-  while (!tasks_.empty() && !paused_) {
-    std::unique_ptr<Task> task(std::move(tasks_.front()));
-    tasks_.pop_front();
-
-    InterfaceId id = kInvalidInterfaceId;
-    bool sync_message =
-        task->IsMessageTask() && !task->message_wrapper.value().IsNull() &&
-        task->message_wrapper.value().has_flag(Message::kFlagIsSync);
-    if (sync_message) {
-      id = task->message_wrapper.value().interface_id();
-      auto& sync_message_queue = sync_message_tasks_[id];
-      DCHECK_EQ(task.get(), sync_message_queue.front());
-      sync_message_queue.pop_front();
-    }
-
-    bool processed =
-        task->IsNotifyErrorTask()
-            ? ProcessNotifyErrorTask(task.get(), client_call_behavior,
-                                     current_task_runner)
-            : ProcessIncomingMessage(&task->message_wrapper.value(),
-                                     client_call_behavior, current_task_runner);
-
-    if (!processed) {
-      if (sync_message) {
-        auto& sync_message_queue = sync_message_tasks_[id];
-        sync_message_queue.push_front(task.get());
-      }
-      tasks_.push_front(std::move(task));
-      break;
-    } else {
-      if (sync_message) {
-        auto iter = sync_message_tasks_.find(id);
-        if (iter != sync_message_tasks_.end() && iter->second.empty())
-          sync_message_tasks_.erase(iter);
-      }
-    }
-  }
-}
-
-bool MultiplexRouter::ProcessFirstSyncMessageForEndpoint(InterfaceId id) {
-  AssertLockAcquired();
-
-  auto iter = sync_message_tasks_.find(id);
-  if (iter == sync_message_tasks_.end())
-    return false;
-
-  if (paused_)
-    return true;
-
-  MultiplexRouter::Task* task = iter->second.front();
-  iter->second.pop_front();
-
-  DCHECK(task->IsMessageTask());
-  MessageWrapper message_wrapper = std::move(task->message_wrapper);
-
-  // Note: after this call, |task| and |iter| may be invalidated.
-  bool processed = ProcessIncomingMessage(
-      &message_wrapper.value(), ALLOW_DIRECT_CLIENT_CALLS_FOR_SYNC_MESSAGES,
-      nullptr);
-  DCHECK(processed);
-
-  iter = sync_message_tasks_.find(id);
-  if (iter == sync_message_tasks_.end())
-    return false;
-
-  if (iter->second.empty()) {
-    sync_message_tasks_.erase(iter);
-    return false;
-  }
-
-  return true;
-}
-
-bool MultiplexRouter::ProcessNotifyErrorTask(
-    Task* task,
-    ClientCallBehavior client_call_behavior,
-    base::SingleThreadTaskRunner* current_task_runner) {
-  DCHECK(!current_task_runner || current_task_runner->BelongsToCurrentThread());
-  DCHECK(!paused_);
-
-  AssertLockAcquired();
-  InterfaceEndpoint* endpoint = task->endpoint_to_notify.get();
-  if (!endpoint->client())
-    return true;
-
-  if (client_call_behavior != ALLOW_DIRECT_CLIENT_CALLS ||
-      endpoint->task_runner() != current_task_runner) {
-    MaybePostToProcessTasks(endpoint->task_runner());
-    return false;
-  }
-
-  DCHECK(endpoint->task_runner()->BelongsToCurrentThread());
-
-  InterfaceEndpointClient* client = endpoint->client();
-  base::Optional<DisconnectReason> disconnect_reason(
-      endpoint->disconnect_reason());
-
-  {
-    // We must unlock before calling into |client| because it may call this
-    // object within NotifyError(). Holding the lock will lead to deadlock.
-    //
-    // It is safe to call into |client| without the lock. Because |client| is
-    // always accessed on the same thread, including DetachEndpointClient().
-    MayAutoUnlock unlocker(&lock_);
-    client->NotifyError(disconnect_reason);
-  }
-  return true;
-}
-
-bool MultiplexRouter::ProcessIncomingMessage(
-    Message* message,
-    ClientCallBehavior client_call_behavior,
-    base::SingleThreadTaskRunner* current_task_runner) {
-  DCHECK(!current_task_runner || current_task_runner->BelongsToCurrentThread());
-  DCHECK(!paused_);
-  DCHECK(message);
-  AssertLockAcquired();
-
-  if (message->IsNull()) {
-    // This is a sync message and has been processed during sync handle
-    // watching.
-    return true;
-  }
-
-  if (PipeControlMessageHandler::IsPipeControlMessage(message)) {
-    bool result = false;
-
-    {
-      MayAutoUnlock unlocker(&lock_);
-      result = control_message_handler_.Accept(message);
-    }
-
-    if (!result)
-      RaiseErrorInNonTestingMode();
-
-    return true;
-  }
-
-  InterfaceId id = message->interface_id();
-  DCHECK(IsValidInterfaceId(id));
-
-  InterfaceEndpoint* endpoint = FindEndpoint(id);
-  if (!endpoint || endpoint->closed())
-    return true;
-
-  if (!endpoint->client()) {
-    // We need to wait until a client is attached in order to dispatch further
-    // messages.
-    return false;
-  }
-
-  bool can_direct_call;
-  if (message->has_flag(Message::kFlagIsSync)) {
-    can_direct_call = client_call_behavior != NO_DIRECT_CLIENT_CALLS &&
-                      endpoint->task_runner()->BelongsToCurrentThread();
-  } else {
-    can_direct_call = client_call_behavior == ALLOW_DIRECT_CLIENT_CALLS &&
-                      endpoint->task_runner() == current_task_runner;
-  }
-
-  if (!can_direct_call) {
-    MaybePostToProcessTasks(endpoint->task_runner());
-    return false;
-  }
-
-  DCHECK(endpoint->task_runner()->BelongsToCurrentThread());
-
-  InterfaceEndpointClient* client = endpoint->client();
-  bool result = false;
-  {
-    // We must unlock before calling into |client| because it may call this
-    // object within HandleIncomingMessage(). Holding the lock will lead to
-    // deadlock.
-    //
-    // It is safe to call into |client| without the lock. Because |client| is
-    // always accessed on the same thread, including DetachEndpointClient().
-    MayAutoUnlock unlocker(&lock_);
-    result = client->HandleIncomingMessage(message);
-  }
-  if (!result)
-    RaiseErrorInNonTestingMode();
-
-  return true;
-}
-
-void MultiplexRouter::MaybePostToProcessTasks(
-    base::SingleThreadTaskRunner* task_runner) {
-  AssertLockAcquired();
-  if (posted_to_process_tasks_)
-    return;
-
-  posted_to_process_tasks_ = true;
-  posted_to_task_runner_ = task_runner;
-  task_runner->PostTask(
-      FROM_HERE, base::Bind(&MultiplexRouter::LockAndCallProcessTasks, this));
-}
-
-void MultiplexRouter::LockAndCallProcessTasks() {
-  // There is no need to hold a ref to this class in this case because this is
-  // always called using base::Bind(), which holds a ref.
-  MayAutoLock locker(&lock_);
-  posted_to_process_tasks_ = false;
-  scoped_refptr<base::SingleThreadTaskRunner> runner(
-      std::move(posted_to_task_runner_));
-  ProcessTasks(ALLOW_DIRECT_CLIENT_CALLS, runner.get());
-}
-
-void MultiplexRouter::UpdateEndpointStateMayRemove(
-    InterfaceEndpoint* endpoint,
-    EndpointStateUpdateType type) {
-  if (type == ENDPOINT_CLOSED) {
-    endpoint->set_closed();
-  } else {
-    endpoint->set_peer_closed();
-    // If the interface endpoint is performing a sync watch, this makes sure
-    // it is notified and eventually exits the sync watch.
-    endpoint->SignalSyncMessageEvent();
-  }
-  if (endpoint->closed() && endpoint->peer_closed())
-    endpoints_.erase(endpoint->id());
-}
-
-void MultiplexRouter::RaiseErrorInNonTestingMode() {
-  AssertLockAcquired();
-  if (!testing_mode_)
-    RaiseError();
-}
-
-MultiplexRouter::InterfaceEndpoint* MultiplexRouter::FindOrInsertEndpoint(
-    InterfaceId id,
-    bool* inserted) {
-  AssertLockAcquired();
-  // Either |inserted| is nullptr or it points to a boolean initialized as
-  // false.
-  DCHECK(!inserted || !*inserted);
-
-  InterfaceEndpoint* endpoint = FindEndpoint(id);
-  if (!endpoint) {
-    endpoint = new InterfaceEndpoint(this, id);
-    endpoints_[id] = endpoint;
-    if (inserted)
-      *inserted = true;
-  }
-
-  return endpoint;
-}
-
-MultiplexRouter::InterfaceEndpoint* MultiplexRouter::FindEndpoint(
-    InterfaceId id) {
-  AssertLockAcquired();
-  auto iter = endpoints_.find(id);
-  return iter != endpoints_.end() ? iter->second.get() : nullptr;
-}
-
-void MultiplexRouter::AssertLockAcquired() {
-#if DCHECK_IS_ON()
-  if (lock_)
-    lock_->AssertAcquired();
-#endif
-}
-
-}  // namespace internal
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/multiplex_router.h b/mojo/public/cpp/bindings/lib/multiplex_router.h
deleted file mode 100644
index cac138b..0000000
--- a/mojo/public/cpp/bindings/lib/multiplex_router.h
+++ /dev/null
@@ -1,275 +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 MOJO_PUBLIC_CPP_BINDINGS_LIB_MULTIPLEX_ROUTER_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_MULTIPLEX_ROUTER_H_
-
-#include <stdint.h>
-
-#include <deque>
-#include <map>
-#include <memory>
-#include <string>
-
-#include "base/compiler_specific.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/memory/weak_ptr.h"
-#include "base/optional.h"
-#include "base/single_thread_task_runner.h"
-#include "base/synchronization/lock.h"
-#include "base/threading/thread_checker.h"
-#include "mojo/public/cpp/bindings/associated_group_controller.h"
-#include "mojo/public/cpp/bindings/bindings_export.h"
-#include "mojo/public/cpp/bindings/connector.h"
-#include "mojo/public/cpp/bindings/filter_chain.h"
-#include "mojo/public/cpp/bindings/interface_id.h"
-#include "mojo/public/cpp/bindings/message_header_validator.h"
-#include "mojo/public/cpp/bindings/pipe_control_message_handler.h"
-#include "mojo/public/cpp/bindings/pipe_control_message_handler_delegate.h"
-#include "mojo/public/cpp/bindings/pipe_control_message_proxy.h"
-#include "mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h"
-
-namespace base {
-class SingleThreadTaskRunner;
-}
-
-namespace mojo {
-
-namespace internal {
-
-// MultiplexRouter supports routing messages for multiple interfaces over a
-// single message pipe.
-//
-// It is created on the thread where the master interface of the message pipe
-// lives. Although it is ref-counted, it is guarateed to be destructed on the
-// same thread.
-// Some public methods are only allowed to be called on the creating thread;
-// while the others are safe to call from any threads. Please see the method
-// comments for more details.
-//
-// NOTE: CloseMessagePipe() or PassMessagePipe() MUST be called on |runner|'s
-// thread before this object is destroyed.
-class MOJO_CPP_BINDINGS_EXPORT MultiplexRouter
-    : NON_EXPORTED_BASE(public MessageReceiver),
-      public AssociatedGroupController,
-      NON_EXPORTED_BASE(public PipeControlMessageHandlerDelegate) {
- public:
-  enum Config {
-    // There is only the master interface running on this router. Please note
-    // that because of interface versioning, the other side of the message pipe
-    // may use a newer master interface definition which passes associated
-    // interfaces. In that case, this router may still receive pipe control
-    // messages or messages targetting associated interfaces.
-    SINGLE_INTERFACE,
-    // Similar to the mode above, there is only the master interface running on
-    // this router. Besides, the master interface has sync methods.
-    SINGLE_INTERFACE_WITH_SYNC_METHODS,
-    // There may be associated interfaces running on this router.
-    MULTI_INTERFACE
-  };
-
-  // If |set_interface_id_namespace_bit| is true, the interface IDs generated by
-  // this router will have the highest bit set.
-  MultiplexRouter(ScopedMessagePipeHandle message_pipe,
-                  Config config,
-                  bool set_interface_id_namespace_bit,
-                  scoped_refptr<base::SingleThreadTaskRunner> runner);
-
-  // Sets the master interface name for this router. Only used when reporting
-  // message header or control message validation errors.
-  // |name| must be a string literal.
-  void SetMasterInterfaceName(const char* name);
-
-  // ---------------------------------------------------------------------------
-  // The following public methods are safe to call from any threads.
-
-  // AssociatedGroupController implementation:
-  InterfaceId AssociateInterface(
-      ScopedInterfaceEndpointHandle handle_to_send) override;
-  ScopedInterfaceEndpointHandle CreateLocalEndpointHandle(
-      InterfaceId id) override;
-  void CloseEndpointHandle(
-      InterfaceId id,
-      const base::Optional<DisconnectReason>& reason) override;
-  InterfaceEndpointController* AttachEndpointClient(
-      const ScopedInterfaceEndpointHandle& handle,
-      InterfaceEndpointClient* endpoint_client,
-      scoped_refptr<base::SingleThreadTaskRunner> runner) override;
-  void DetachEndpointClient(
-      const ScopedInterfaceEndpointHandle& handle) override;
-  void RaiseError() override;
-
-  // ---------------------------------------------------------------------------
-  // The following public methods are called on the creating thread.
-
-  // Please note that this method shouldn't be called unless it results from an
-  // explicit request of the user of bindings (e.g., the user sets an
-  // InterfacePtr to null or closes a Binding).
-  void CloseMessagePipe();
-
-  // Extracts the underlying message pipe.
-  ScopedMessagePipeHandle PassMessagePipe() {
-    DCHECK(thread_checker_.CalledOnValidThread());
-    DCHECK(!HasAssociatedEndpoints());
-    return connector_.PassMessagePipe();
-  }
-
-  // Blocks the current thread until the first incoming message, or |deadline|.
-  bool WaitForIncomingMessage(MojoDeadline deadline) {
-    DCHECK(thread_checker_.CalledOnValidThread());
-    return connector_.WaitForIncomingMessage(deadline);
-  }
-
-  // See Binding for details of pause/resume.
-  void PauseIncomingMethodCallProcessing();
-  void ResumeIncomingMethodCallProcessing();
-
-  // Whether there are any associated interfaces running currently.
-  bool HasAssociatedEndpoints() const;
-
-  // Sets this object to testing mode.
-  // In testing mode, the object doesn't disconnect the underlying message pipe
-  // when it receives unexpected or invalid messages.
-  void EnableTestingMode();
-
-  // Is the router bound to a message pipe handle?
-  bool is_valid() const {
-    DCHECK(thread_checker_.CalledOnValidThread());
-    return connector_.is_valid();
-  }
-
-  // TODO(yzshen): consider removing this getter.
-  MessagePipeHandle handle() const {
-    DCHECK(thread_checker_.CalledOnValidThread());
-    return connector_.handle();
-  }
-
-  bool SimulateReceivingMessageForTesting(Message* message) {
-    return filters_.Accept(message);
-  }
-
- private:
-  class InterfaceEndpoint;
-  class MessageWrapper;
-  struct Task;
-
-  ~MultiplexRouter() override;
-
-  // MessageReceiver implementation:
-  bool Accept(Message* message) override;
-
-  // PipeControlMessageHandlerDelegate implementation:
-  bool OnPeerAssociatedEndpointClosed(
-      InterfaceId id,
-      const base::Optional<DisconnectReason>& reason) override;
-
-  void OnPipeConnectionError();
-
-  // Specifies whether we are allowed to directly call into
-  // InterfaceEndpointClient (given that we are already on the same thread as
-  // the client).
-  enum ClientCallBehavior {
-    // Don't call any InterfaceEndpointClient methods directly.
-    NO_DIRECT_CLIENT_CALLS,
-    // Only call InterfaceEndpointClient::HandleIncomingMessage directly to
-    // handle sync messages.
-    ALLOW_DIRECT_CLIENT_CALLS_FOR_SYNC_MESSAGES,
-    // Allow to call any InterfaceEndpointClient methods directly.
-    ALLOW_DIRECT_CLIENT_CALLS
-  };
-
-  // Processes enqueued tasks (incoming messages and error notifications).
-  // |current_task_runner| is only used when |client_call_behavior| is
-  // ALLOW_DIRECT_CLIENT_CALLS to determine whether we are on the right task
-  // runner to make client calls for async messages or connection error
-  // notifications.
-  //
-  // Note: Because calling into InterfaceEndpointClient may lead to destruction
-  // of this object, if direct calls are allowed, the caller needs to hold on to
-  // a ref outside of |lock_| before calling this method.
-  void ProcessTasks(ClientCallBehavior client_call_behavior,
-                    base::SingleThreadTaskRunner* current_task_runner);
-
-  // Processes the first queued sync message for the endpoint corresponding to
-  // |id|; returns whether there are more sync messages for that endpoint in the
-  // queue.
-  //
-  // This method is only used by enpoints during sync watching. Therefore, not
-  // all sync messages are handled by it.
-  bool ProcessFirstSyncMessageForEndpoint(InterfaceId id);
-
-  // Returns true to indicate that |task|/|message| has been processed.
-  bool ProcessNotifyErrorTask(
-      Task* task,
-      ClientCallBehavior client_call_behavior,
-      base::SingleThreadTaskRunner* current_task_runner);
-  bool ProcessIncomingMessage(
-      Message* message,
-      ClientCallBehavior client_call_behavior,
-      base::SingleThreadTaskRunner* current_task_runner);
-
-  void MaybePostToProcessTasks(base::SingleThreadTaskRunner* task_runner);
-  void LockAndCallProcessTasks();
-
-  // Updates the state of |endpoint|. If both the endpoint and its peer have
-  // been closed, removes it from |endpoints_|.
-  // NOTE: The method may invalidate |endpoint|.
-  enum EndpointStateUpdateType { ENDPOINT_CLOSED, PEER_ENDPOINT_CLOSED };
-  void UpdateEndpointStateMayRemove(InterfaceEndpoint* endpoint,
-                                    EndpointStateUpdateType type);
-
-  void RaiseErrorInNonTestingMode();
-
-  InterfaceEndpoint* FindOrInsertEndpoint(InterfaceId id, bool* inserted);
-  InterfaceEndpoint* FindEndpoint(InterfaceId id);
-
-  void AssertLockAcquired();
-
-  // Whether to set the namespace bit when generating interface IDs. Please see
-  // comments of kInterfaceIdNamespaceMask.
-  const bool set_interface_id_namespace_bit_;
-
-  scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
-
-  // Owned by |filters_| below.
-  MessageHeaderValidator* header_validator_;
-
-  FilterChain filters_;
-  Connector connector_;
-
-  base::ThreadChecker thread_checker_;
-
-  // Protects the following members.
-  // Not set in Config::SINGLE_INTERFACE* mode.
-  mutable base::Optional<base::Lock> lock_;
-  PipeControlMessageHandler control_message_handler_;
-
-  // NOTE: It is unsafe to call into this object while holding |lock_|.
-  PipeControlMessageProxy control_message_proxy_;
-
-  std::map<InterfaceId, scoped_refptr<InterfaceEndpoint>> endpoints_;
-  uint32_t next_interface_id_value_;
-
-  std::deque<std::unique_ptr<Task>> tasks_;
-  // It refers to tasks in |tasks_| and doesn't own any of them.
-  std::map<InterfaceId, std::deque<Task*>> sync_message_tasks_;
-
-  bool posted_to_process_tasks_;
-  scoped_refptr<base::SingleThreadTaskRunner> posted_to_task_runner_;
-
-  bool encountered_error_;
-
-  bool paused_;
-
-  bool testing_mode_;
-
-  DISALLOW_COPY_AND_ASSIGN(MultiplexRouter);
-};
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_MULTIPLEX_ROUTER_H_
diff --git a/mojo/public/cpp/bindings/lib/native_enum_data.h b/mojo/public/cpp/bindings/lib/native_enum_data.h
deleted file mode 100644
index dcafce2..0000000
--- a/mojo/public/cpp/bindings/lib/native_enum_data.h
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_NATIVE_ENUM_DATA_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_NATIVE_ENUM_DATA_H_
-
-namespace mojo {
-namespace internal {
-
-class ValidationContext;
-
-class NativeEnum_Data {
- public:
-  static bool const kIsExtensible = true;
-
-  static bool IsKnownValue(int32_t value) { return false; }
-
-  static bool Validate(int32_t value,
-                       ValidationContext* validation_context) { return true; }
-};
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_NATIVE_ENUM_DATA_H_
diff --git a/mojo/public/cpp/bindings/lib/native_enum_serialization.h b/mojo/public/cpp/bindings/lib/native_enum_serialization.h
deleted file mode 100644
index 4faf957..0000000
--- a/mojo/public/cpp/bindings/lib/native_enum_serialization.h
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_NATIVE_ENUM_SERIALIZATION_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_NATIVE_ENUM_SERIALIZATION_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <type_traits>
-
-#include "base/logging.h"
-#include "base/pickle.h"
-#include "ipc/ipc_param_traits.h"
-#include "mojo/public/cpp/bindings/lib/serialization_forward.h"
-#include "mojo/public/cpp/bindings/native_enum.h"
-
-namespace mojo {
-namespace internal {
-
-template <typename MaybeConstUserType>
-struct NativeEnumSerializerImpl {
-  using UserType = typename std::remove_const<MaybeConstUserType>::type;
-  using Traits = IPC::ParamTraits<UserType>;
-
-  // IPC_ENUM_TRAITS* macros serialize enum as int, make sure that fits into
-  // mojo native-only enum.
-  static_assert(sizeof(NativeEnum) >= sizeof(int),
-                "Cannot store the serialization result in NativeEnum.");
-
-  static void Serialize(UserType input, int32_t* output) {
-    base::Pickle pickle;
-    Traits::Write(&pickle, input);
-
-    CHECK_GE(sizeof(int32_t), pickle.payload_size());
-    *output = 0;
-    memcpy(reinterpret_cast<char*>(output), pickle.payload(),
-           pickle.payload_size());
-  }
-
-  struct PickleData {
-    uint32_t payload_size;
-    int32_t value;
-  };
-  static_assert(sizeof(PickleData) == 8, "PickleData size mismatch.");
-
-  static bool Deserialize(int32_t input, UserType* output) {
-    PickleData data = {sizeof(int32_t), input};
-    base::Pickle pickle_view(reinterpret_cast<const char*>(&data),
-                             sizeof(PickleData));
-    base::PickleIterator iter(pickle_view);
-    return Traits::Read(&pickle_view, &iter, output);
-  }
-};
-
-struct UnmappedNativeEnumSerializerImpl {
-  static void Serialize(NativeEnum input, int32_t* output) {
-    *output = static_cast<int32_t>(input);
-  }
-  static bool Deserialize(int32_t input, NativeEnum* output) {
-    *output = static_cast<NativeEnum>(input);
-    return true;
-  }
-};
-
-template <>
-struct NativeEnumSerializerImpl<NativeEnum>
-    : public UnmappedNativeEnumSerializerImpl {};
-
-template <>
-struct NativeEnumSerializerImpl<const NativeEnum>
-    : public UnmappedNativeEnumSerializerImpl {};
-
-template <typename MaybeConstUserType>
-struct Serializer<NativeEnum, MaybeConstUserType>
-    : public NativeEnumSerializerImpl<MaybeConstUserType> {};
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_NATIVE_ENUM_SERIALIZATION_H_
diff --git a/mojo/public/cpp/bindings/lib/native_struct.cc b/mojo/public/cpp/bindings/lib/native_struct.cc
deleted file mode 100644
index 7b1a1a6..0000000
--- a/mojo/public/cpp/bindings/lib/native_struct.cc
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/bindings/native_struct.h"
-
-#include "mojo/public/cpp/bindings/lib/hash_util.h"
-
-namespace mojo {
-
-// static
-NativeStructPtr NativeStruct::New() {
-  return NativeStructPtr(base::in_place);
-}
-
-NativeStruct::NativeStruct() {}
-
-NativeStruct::~NativeStruct() {}
-
-NativeStructPtr NativeStruct::Clone() const {
-  NativeStructPtr rv(New());
-  rv->data = data;
-  return rv;
-}
-
-bool NativeStruct::Equals(const NativeStruct& other) const {
-  return data == other.data;
-}
-
-size_t NativeStruct::Hash(size_t seed) const {
-  return internal::Hash(seed, data);
-}
-
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/native_struct_data.cc b/mojo/public/cpp/bindings/lib/native_struct_data.cc
deleted file mode 100644
index 0e5d245..0000000
--- a/mojo/public/cpp/bindings/lib/native_struct_data.cc
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/bindings/lib/native_struct_data.h"
-
-#include "mojo/public/cpp/bindings/lib/buffer.h"
-#include "mojo/public/cpp/bindings/lib/validation_context.h"
-
-namespace mojo {
-namespace internal {
-
-// static
-bool NativeStruct_Data::Validate(const void* data,
-                                 ValidationContext* validation_context) {
-  const ContainerValidateParams data_validate_params(0, false, nullptr);
-  return Array_Data<uint8_t>::Validate(data, validation_context,
-                                       &data_validate_params);
-}
-
-}  // namespace internal
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/native_struct_data.h b/mojo/public/cpp/bindings/lib/native_struct_data.h
deleted file mode 100644
index 1c7cd81..0000000
--- a/mojo/public/cpp/bindings/lib/native_struct_data.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_NATIVE_STRUCT_DATA_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_NATIVE_STRUCT_DATA_H_
-
-#include <vector>
-
-#include "mojo/public/cpp/bindings/bindings_export.h"
-#include "mojo/public/cpp/bindings/lib/array_internal.h"
-#include "mojo/public/cpp/system/handle.h"
-
-namespace mojo {
-namespace internal {
-
-class ValidationContext;
-
-class MOJO_CPP_BINDINGS_EXPORT NativeStruct_Data {
- public:
-  static bool Validate(const void* data, ValidationContext* validation_context);
-
-  // Unlike normal structs, the memory layout is exactly the same as an array
-  // of uint8_t.
-  Array_Data<uint8_t> data;
-
- private:
-  NativeStruct_Data() = delete;
-  ~NativeStruct_Data() = delete;
-};
-
-static_assert(sizeof(Array_Data<uint8_t>) == sizeof(NativeStruct_Data),
-              "Mismatched NativeStruct_Data and Array_Data<uint8_t> size");
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_NATIVE_STRUCT_DATA_H_
diff --git a/mojo/public/cpp/bindings/lib/native_struct_serialization.cc b/mojo/public/cpp/bindings/lib/native_struct_serialization.cc
deleted file mode 100644
index fa0dbf3..0000000
--- a/mojo/public/cpp/bindings/lib/native_struct_serialization.cc
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/bindings/lib/native_struct_serialization.h"
-
-#include "mojo/public/cpp/bindings/lib/serialization.h"
-
-namespace mojo {
-namespace internal {
-
-// static
-size_t UnmappedNativeStructSerializerImpl::PrepareToSerialize(
-    const NativeStructPtr& input,
-    SerializationContext* context) {
-  if (!input)
-    return 0;
-  return internal::PrepareToSerialize<ArrayDataView<uint8_t>>(input->data,
-                                                              context);
-}
-
-// static
-void UnmappedNativeStructSerializerImpl::Serialize(
-    const NativeStructPtr& input,
-    Buffer* buffer,
-    NativeStruct_Data** output,
-    SerializationContext* context) {
-  if (!input) {
-    *output = nullptr;
-    return;
-  }
-
-  Array_Data<uint8_t>* data = nullptr;
-  const ContainerValidateParams params(0, false, nullptr);
-  internal::Serialize<ArrayDataView<uint8_t>>(input->data, buffer, &data,
-                                              &params, context);
-  *output = reinterpret_cast<NativeStruct_Data*>(data);
-}
-
-// static
-bool UnmappedNativeStructSerializerImpl::Deserialize(
-    NativeStruct_Data* input,
-    NativeStructPtr* output,
-    SerializationContext* context) {
-  Array_Data<uint8_t>* data = reinterpret_cast<Array_Data<uint8_t>*>(input);
-
-  NativeStructPtr result(NativeStruct::New());
-  if (!internal::Deserialize<ArrayDataView<uint8_t>>(data, &result->data,
-                                                     context)) {
-    output = nullptr;
-    return false;
-  }
-  if (!result->data)
-    *output = nullptr;
-  else
-    result.Swap(output);
-  return true;
-}
-
-}  // namespace internal
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/native_struct_serialization.h b/mojo/public/cpp/bindings/lib/native_struct_serialization.h
deleted file mode 100644
index 457435b..0000000
--- a/mojo/public/cpp/bindings/lib/native_struct_serialization.h
+++ /dev/null
@@ -1,134 +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 MOJO_PUBLIC_CPP_BINDINGS_LIB_NATIVE_STRUCT_SERIALIZATION_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_NATIVE_STRUCT_SERIALIZATION_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <limits>
-
-#include "base/logging.h"
-#include "base/pickle.h"
-#include "ipc/ipc_param_traits.h"
-#include "mojo/public/cpp/bindings/bindings_export.h"
-#include "mojo/public/cpp/bindings/lib/array_internal.h"
-#include "mojo/public/cpp/bindings/lib/bindings_internal.h"
-#include "mojo/public/cpp/bindings/lib/native_struct_data.h"
-#include "mojo/public/cpp/bindings/lib/serialization_forward.h"
-#include "mojo/public/cpp/bindings/lib/serialization_util.h"
-#include "mojo/public/cpp/bindings/native_struct.h"
-#include "mojo/public/cpp/bindings/native_struct_data_view.h"
-
-namespace mojo {
-namespace internal {
-
-template <typename MaybeConstUserType>
-struct NativeStructSerializerImpl {
-  using UserType = typename std::remove_const<MaybeConstUserType>::type;
-  using Traits = IPC::ParamTraits<UserType>;
-
-  static size_t PrepareToSerialize(MaybeConstUserType& value,
-                                   SerializationContext* context) {
-    base::PickleSizer sizer;
-    Traits::GetSize(&sizer, value);
-    return Align(sizer.payload_size() + sizeof(ArrayHeader));
-  }
-
-  static void Serialize(MaybeConstUserType& value,
-                        Buffer* buffer,
-                        NativeStruct_Data** out,
-                        SerializationContext* context) {
-    base::Pickle pickle;
-    Traits::Write(&pickle, value);
-
-#if DCHECK_IS_ON()
-    base::PickleSizer sizer;
-    Traits::GetSize(&sizer, value);
-    DCHECK_EQ(sizer.payload_size(), pickle.payload_size());
-#endif
-
-    size_t total_size = pickle.payload_size() + sizeof(ArrayHeader);
-    DCHECK_LT(total_size, std::numeric_limits<uint32_t>::max());
-
-    // Allocate a uint8 array, initialize its header, and copy the Pickle in.
-    ArrayHeader* header =
-        reinterpret_cast<ArrayHeader*>(buffer->Allocate(total_size));
-    header->num_bytes = static_cast<uint32_t>(total_size);
-    header->num_elements = static_cast<uint32_t>(pickle.payload_size());
-    memcpy(reinterpret_cast<char*>(header) + sizeof(ArrayHeader),
-           pickle.payload(), pickle.payload_size());
-
-    *out = reinterpret_cast<NativeStruct_Data*>(header);
-  }
-
-  static bool Deserialize(NativeStruct_Data* data,
-                          UserType* out,
-                          SerializationContext* context) {
-    if (!data)
-      return false;
-
-    // Construct a temporary base::Pickle view over the array data. Note that
-    // the Array_Data is laid out like this:
-    //
-    //   [num_bytes (4 bytes)] [num_elements (4 bytes)] [elements...]
-    //
-    // and base::Pickle expects to view data like this:
-    //
-    //   [payload_size (4 bytes)] [header bytes ...] [payload...]
-    //
-    // Because ArrayHeader's num_bytes includes the length of the header and
-    // Pickle's payload_size does not, we need to adjust the stored value
-    // momentarily so Pickle can view the data.
-    ArrayHeader* header = reinterpret_cast<ArrayHeader*>(data);
-    DCHECK_GE(header->num_bytes, sizeof(ArrayHeader));
-    header->num_bytes -= sizeof(ArrayHeader);
-
-    {
-      // Construct a view over the full Array_Data, including our hacked up
-      // header. Pickle will infer from this that the header is 8 bytes long,
-      // and the payload will contain all of the pickled bytes.
-      base::Pickle pickle_view(reinterpret_cast<const char*>(header),
-                               header->num_bytes + sizeof(ArrayHeader));
-      base::PickleIterator iter(pickle_view);
-      if (!Traits::Read(&pickle_view, &iter, out))
-        return false;
-    }
-
-    // Return the header to its original state.
-    header->num_bytes += sizeof(ArrayHeader);
-
-    return true;
-  }
-};
-
-struct MOJO_CPP_BINDINGS_EXPORT UnmappedNativeStructSerializerImpl {
-  static size_t PrepareToSerialize(const NativeStructPtr& input,
-                                   SerializationContext* context);
-  static void Serialize(const NativeStructPtr& input,
-                        Buffer* buffer,
-                        NativeStruct_Data** output,
-                        SerializationContext* context);
-  static bool Deserialize(NativeStruct_Data* input,
-                          NativeStructPtr* output,
-                          SerializationContext* context);
-};
-
-template <>
-struct NativeStructSerializerImpl<NativeStructPtr>
-    : public UnmappedNativeStructSerializerImpl {};
-
-template <>
-struct NativeStructSerializerImpl<const NativeStructPtr>
-    : public UnmappedNativeStructSerializerImpl {};
-
-template <typename MaybeConstUserType>
-struct Serializer<NativeStructDataView, MaybeConstUserType>
-    : public NativeStructSerializerImpl<MaybeConstUserType> {};
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_NATIVE_STRUCT_SERIALIZATION_H_
diff --git a/mojo/public/cpp/bindings/lib/pipe_control_message_handler.cc b/mojo/public/cpp/bindings/lib/pipe_control_message_handler.cc
deleted file mode 100644
index d451c05..0000000
--- a/mojo/public/cpp/bindings/lib/pipe_control_message_handler.cc
+++ /dev/null
@@ -1,90 +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 "mojo/public/cpp/bindings/pipe_control_message_handler.h"
-
-#include "base/logging.h"
-#include "mojo/public/cpp/bindings/interface_id.h"
-#include "mojo/public/cpp/bindings/lib/message_builder.h"
-#include "mojo/public/cpp/bindings/lib/serialization.h"
-#include "mojo/public/cpp/bindings/lib/serialization_context.h"
-#include "mojo/public/cpp/bindings/lib/validation_context.h"
-#include "mojo/public/cpp/bindings/lib/validation_util.h"
-#include "mojo/public/cpp/bindings/pipe_control_message_handler_delegate.h"
-#include "mojo/public/interfaces/bindings/pipe_control_messages.mojom.h"
-
-namespace mojo {
-
-PipeControlMessageHandler::PipeControlMessageHandler(
-    PipeControlMessageHandlerDelegate* delegate)
-    : delegate_(delegate) {}
-
-PipeControlMessageHandler::~PipeControlMessageHandler() {}
-
-void PipeControlMessageHandler::SetDescription(const std::string& description) {
-  description_ = description;
-}
-
-// static
-bool PipeControlMessageHandler::IsPipeControlMessage(const Message* message) {
-  return !IsValidInterfaceId(message->interface_id());
-}
-
-bool PipeControlMessageHandler::Accept(Message* message) {
-  if (!Validate(message))
-    return false;
-
-  if (message->name() == pipe_control::kRunOrClosePipeMessageId)
-    return RunOrClosePipe(message);
-
-  NOTREACHED();
-  return false;
-}
-
-bool PipeControlMessageHandler::Validate(Message* message) {
-  internal::ValidationContext validation_context(message->payload(),
-                                                 message->payload_num_bytes(),
-                                                 0, 0, message, description_);
-
-  if (message->name() == pipe_control::kRunOrClosePipeMessageId) {
-    if (!internal::ValidateMessageIsRequestWithoutResponse(
-            message, &validation_context)) {
-      return false;
-    }
-    return internal::ValidateMessagePayload<
-        pipe_control::internal::RunOrClosePipeMessageParams_Data>(
-            message, &validation_context);
-  }
-
-  return false;
-}
-
-bool PipeControlMessageHandler::RunOrClosePipe(Message* message) {
-  internal::SerializationContext context;
-  pipe_control::internal::RunOrClosePipeMessageParams_Data* params =
-      reinterpret_cast<
-          pipe_control::internal::RunOrClosePipeMessageParams_Data*>(
-          message->mutable_payload());
-  pipe_control::RunOrClosePipeMessageParamsPtr params_ptr;
-  internal::Deserialize<pipe_control::RunOrClosePipeMessageParamsDataView>(
-      params, &params_ptr, &context);
-
-  if (params_ptr->input->is_peer_associated_endpoint_closed_event()) {
-    const auto& event =
-        params_ptr->input->get_peer_associated_endpoint_closed_event();
-
-    base::Optional<DisconnectReason> reason;
-    if (event->disconnect_reason) {
-      reason.emplace(event->disconnect_reason->custom_reason,
-                     event->disconnect_reason->description);
-    }
-    return delegate_->OnPeerAssociatedEndpointClosed(event->id, reason);
-  }
-
-  DVLOG(1) << "Unsupported command in a RunOrClosePipe message pipe control "
-           << "message. Closing the pipe.";
-  return false;
-}
-
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/pipe_control_message_proxy.cc b/mojo/public/cpp/bindings/lib/pipe_control_message_proxy.cc
deleted file mode 100644
index 1029c2c..0000000
--- a/mojo/public/cpp/bindings/lib/pipe_control_message_proxy.cc
+++ /dev/null
@@ -1,68 +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 "mojo/public/cpp/bindings/pipe_control_message_proxy.h"
-
-#include <stddef.h>
-#include <utility>
-
-#include "base/logging.h"
-#include "base/macros.h"
-#include "mojo/public/cpp/bindings/lib/message_builder.h"
-#include "mojo/public/cpp/bindings/lib/serialization.h"
-#include "mojo/public/interfaces/bindings/pipe_control_messages.mojom.h"
-
-namespace mojo {
-namespace {
-
-Message ConstructRunOrClosePipeMessage(
-    pipe_control::RunOrClosePipeInputPtr input_ptr) {
-  internal::SerializationContext context;
-
-  auto params_ptr = pipe_control::RunOrClosePipeMessageParams::New();
-  params_ptr->input = std::move(input_ptr);
-
-  size_t size = internal::PrepareToSerialize<
-      pipe_control::RunOrClosePipeMessageParamsDataView>(params_ptr, &context);
-  internal::MessageBuilder builder(pipe_control::kRunOrClosePipeMessageId, 0,
-                                   size, 0);
-
-  pipe_control::internal::RunOrClosePipeMessageParams_Data* params = nullptr;
-  internal::Serialize<pipe_control::RunOrClosePipeMessageParamsDataView>(
-      params_ptr, builder.buffer(), &params, &context);
-  builder.message()->set_interface_id(kInvalidInterfaceId);
-  return std::move(*builder.message());
-}
-
-}  // namespace
-
-PipeControlMessageProxy::PipeControlMessageProxy(MessageReceiver* receiver)
-    : receiver_(receiver) {}
-
-void PipeControlMessageProxy::NotifyPeerEndpointClosed(
-    InterfaceId id,
-    const base::Optional<DisconnectReason>& reason) {
-  Message message(ConstructPeerEndpointClosedMessage(id, reason));
-  ignore_result(receiver_->Accept(&message));
-}
-
-// static
-Message PipeControlMessageProxy::ConstructPeerEndpointClosedMessage(
-    InterfaceId id,
-    const base::Optional<DisconnectReason>& reason) {
-  auto event = pipe_control::PeerAssociatedEndpointClosedEvent::New();
-  event->id = id;
-  if (reason) {
-    event->disconnect_reason = pipe_control::DisconnectReason::New();
-    event->disconnect_reason->custom_reason = reason->custom_reason;
-    event->disconnect_reason->description = reason->description;
-  }
-
-  auto input = pipe_control::RunOrClosePipeInput::New();
-  input->set_peer_associated_endpoint_closed_event(std::move(event));
-
-  return ConstructRunOrClosePipeMessage(std::move(input));
-}
-
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/scoped_interface_endpoint_handle.cc b/mojo/public/cpp/bindings/lib/scoped_interface_endpoint_handle.cc
deleted file mode 100644
index c134507..0000000
--- a/mojo/public/cpp/bindings/lib/scoped_interface_endpoint_handle.cc
+++ /dev/null
@@ -1,382 +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 "mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h"
-
-#include "base/bind.h"
-#include "base/logging.h"
-#include "base/synchronization/lock.h"
-#include "mojo/public/cpp/bindings/associated_group_controller.h"
-#include "mojo/public/cpp/bindings/lib/may_auto_lock.h"
-
-namespace mojo {
-
-// ScopedInterfaceEndpointHandle::State ----------------------------------------
-
-// State could be called from multiple threads.
-class ScopedInterfaceEndpointHandle::State
-    : public base::RefCountedThreadSafe<State> {
- public:
-  State() = default;
-
-  State(InterfaceId id,
-        scoped_refptr<AssociatedGroupController> group_controller)
-      : id_(id), group_controller_(group_controller) {}
-
-  void InitPendingState(scoped_refptr<State> peer) {
-    DCHECK(!lock_);
-    DCHECK(!pending_association_);
-
-    lock_.emplace();
-    pending_association_ = true;
-    peer_state_ = std::move(peer);
-  }
-
-  void Close(const base::Optional<DisconnectReason>& reason) {
-    scoped_refptr<AssociatedGroupController> cached_group_controller;
-    InterfaceId cached_id = kInvalidInterfaceId;
-    scoped_refptr<State> cached_peer_state;
-
-    {
-      internal::MayAutoLock locker(&lock_);
-
-      if (!association_event_handler_.is_null()) {
-        association_event_handler_.Reset();
-        runner_ = nullptr;
-      }
-
-      if (!pending_association_) {
-        if (IsValidInterfaceId(id_)) {
-          // Intentionally keep |group_controller_| unchanged.
-          // That is because the callback created by
-          // CreateGroupControllerGetter() could still be used after this point,
-          // potentially from another thread. We would like it to continue
-          // returning the same group controller.
-          //
-          // Imagine there is a ThreadSafeForwarder A:
-          // (1) On the IO thread, A's underlying associated interface pointer
-          //     is closed.
-          // (2) On the proxy thread, the user makes a call on A to pass an
-          //     associated request B_asso_req. The callback returned by
-          //     CreateGroupControllerGetter() is used to associate B_asso_req.
-          // (3) On the proxy thread, the user immediately binds B_asso_ptr_info
-          //     to B_asso_ptr and makes calls on it.
-          //
-          // If we reset |group_controller_| in step (1), step (2) won't be able
-          // to associate B_asso_req. Therefore, in step (3) B_asso_ptr won't be
-          // able to serialize associated endpoints or send message because it
-          // is still in "pending_association" state and doesn't have a group
-          // controller.
-          //
-          // We could "address" this issue by ignoring messages if there isn't a
-          // group controller. But the side effect is that we cannot detect
-          // programming errors of "using associated interface pointer before
-          // sending associated request".
-
-          cached_group_controller = group_controller_;
-          cached_id = id_;
-          id_ = kInvalidInterfaceId;
-        }
-      } else {
-        pending_association_ = false;
-        cached_peer_state = std::move(peer_state_);
-      }
-    }
-
-    if (cached_group_controller) {
-      cached_group_controller->CloseEndpointHandle(cached_id, reason);
-    } else if (cached_peer_state) {
-      cached_peer_state->OnPeerClosedBeforeAssociation(reason);
-    }
-  }
-
-  void SetAssociationEventHandler(AssociationEventCallback handler) {
-    internal::MayAutoLock locker(&lock_);
-
-    if (!pending_association_ && !IsValidInterfaceId(id_))
-      return;
-
-    association_event_handler_ = std::move(handler);
-    if (association_event_handler_.is_null()) {
-      runner_ = nullptr;
-      return;
-    }
-
-    runner_ = base::ThreadTaskRunnerHandle::Get();
-    if (!pending_association_) {
-      runner_->PostTask(
-          FROM_HERE,
-          base::Bind(
-              &ScopedInterfaceEndpointHandle::State::RunAssociationEventHandler,
-              this, runner_, ASSOCIATED));
-    } else if (!peer_state_) {
-      runner_->PostTask(
-          FROM_HERE,
-          base::Bind(
-              &ScopedInterfaceEndpointHandle::State::RunAssociationEventHandler,
-              this, runner_, PEER_CLOSED_BEFORE_ASSOCIATION));
-    }
-  }
-
-  bool NotifyAssociation(
-      InterfaceId id,
-      scoped_refptr<AssociatedGroupController> peer_group_controller) {
-    scoped_refptr<State> cached_peer_state;
-    {
-      internal::MayAutoLock locker(&lock_);
-
-      DCHECK(pending_association_);
-      pending_association_ = false;
-      cached_peer_state = std::move(peer_state_);
-    }
-
-    if (cached_peer_state) {
-      cached_peer_state->OnAssociated(id, std::move(peer_group_controller));
-      return true;
-    }
-    return false;
-  }
-
-  bool is_valid() const {
-    internal::MayAutoLock locker(&lock_);
-    return pending_association_ || IsValidInterfaceId(id_);
-  }
-
-  bool pending_association() const {
-    internal::MayAutoLock locker(&lock_);
-    return pending_association_;
-  }
-
-  InterfaceId id() const {
-    internal::MayAutoLock locker(&lock_);
-    return id_;
-  }
-
-  AssociatedGroupController* group_controller() const {
-    internal::MayAutoLock locker(&lock_);
-    return group_controller_.get();
-  }
-
-  const base::Optional<DisconnectReason>& disconnect_reason() const {
-    internal::MayAutoLock locker(&lock_);
-    return disconnect_reason_;
-  }
-
- private:
-  friend class base::RefCountedThreadSafe<State>;
-
-  ~State() {
-    DCHECK(!pending_association_);
-    DCHECK(!IsValidInterfaceId(id_));
-  }
-
-  // Called by the peer, maybe from a different thread.
-  void OnAssociated(InterfaceId id,
-                    scoped_refptr<AssociatedGroupController> group_controller) {
-    AssociationEventCallback handler;
-    {
-      internal::MayAutoLock locker(&lock_);
-
-      // There may be race between Close() of endpoint A and
-      // NotifyPeerAssociation() of endpoint A_peer on different threads.
-      // Therefore, it is possible that endpoint A has been closed but it
-      // still gets OnAssociated() call from its peer.
-      if (!pending_association_)
-        return;
-
-      pending_association_ = false;
-      peer_state_ = nullptr;
-      id_ = id;
-      group_controller_ = std::move(group_controller);
-
-      if (!association_event_handler_.is_null()) {
-        if (runner_->BelongsToCurrentThread()) {
-          handler = std::move(association_event_handler_);
-          runner_ = nullptr;
-        } else {
-          runner_->PostTask(FROM_HERE,
-                            base::Bind(&ScopedInterfaceEndpointHandle::State::
-                                           RunAssociationEventHandler,
-                                       this, runner_, ASSOCIATED));
-        }
-      }
-    }
-
-    if (!handler.is_null())
-      std::move(handler).Run(ASSOCIATED);
-  }
-
-  // Called by the peer, maybe from a different thread.
-  void OnPeerClosedBeforeAssociation(
-      const base::Optional<DisconnectReason>& reason) {
-    AssociationEventCallback handler;
-    {
-      internal::MayAutoLock locker(&lock_);
-
-      // There may be race between Close()/NotifyPeerAssociation() of endpoint
-      // A and Close() of endpoint A_peer on different threads.
-      // Therefore, it is possible that endpoint A is not in pending association
-      // state but still gets OnPeerClosedBeforeAssociation() call from its
-      // peer.
-      if (!pending_association_)
-        return;
-
-      disconnect_reason_ = reason;
-      // NOTE: This handle itself is still pending.
-      peer_state_ = nullptr;
-
-      if (!association_event_handler_.is_null()) {
-        if (runner_->BelongsToCurrentThread()) {
-          handler = std::move(association_event_handler_);
-          runner_ = nullptr;
-        } else {
-          runner_->PostTask(
-              FROM_HERE,
-              base::Bind(&ScopedInterfaceEndpointHandle::State::
-                             RunAssociationEventHandler,
-                         this, runner_, PEER_CLOSED_BEFORE_ASSOCIATION));
-        }
-      }
-    }
-
-    if (!handler.is_null())
-      std::move(handler).Run(PEER_CLOSED_BEFORE_ASSOCIATION);
-  }
-
-  void RunAssociationEventHandler(
-      scoped_refptr<base::SingleThreadTaskRunner> posted_to_runner,
-      AssociationEvent event) {
-    AssociationEventCallback handler;
-
-    {
-      internal::MayAutoLock locker(&lock_);
-      if (posted_to_runner == runner_) {
-        runner_ = nullptr;
-        handler = std::move(association_event_handler_);
-      }
-    }
-
-    if (!handler.is_null())
-      std::move(handler).Run(event);
-  }
-
-  // Protects the following members if the handle is initially set to pending
-  // association.
-  mutable base::Optional<base::Lock> lock_;
-
-  bool pending_association_ = false;
-  base::Optional<DisconnectReason> disconnect_reason_;
-
-  scoped_refptr<State> peer_state_;
-
-  AssociationEventCallback association_event_handler_;
-  scoped_refptr<base::SingleThreadTaskRunner> runner_;
-
-  InterfaceId id_ = kInvalidInterfaceId;
-  scoped_refptr<AssociatedGroupController> group_controller_;
-
-  DISALLOW_COPY_AND_ASSIGN(State);
-};
-
-// ScopedInterfaceEndpointHandle -----------------------------------------------
-
-// static
-void ScopedInterfaceEndpointHandle::CreatePairPendingAssociation(
-    ScopedInterfaceEndpointHandle* handle0,
-    ScopedInterfaceEndpointHandle* handle1) {
-  ScopedInterfaceEndpointHandle result0;
-  ScopedInterfaceEndpointHandle result1;
-  result0.state_->InitPendingState(result1.state_);
-  result1.state_->InitPendingState(result0.state_);
-
-  *handle0 = std::move(result0);
-  *handle1 = std::move(result1);
-}
-
-ScopedInterfaceEndpointHandle::ScopedInterfaceEndpointHandle()
-    : state_(new State) {}
-
-ScopedInterfaceEndpointHandle::ScopedInterfaceEndpointHandle(
-    ScopedInterfaceEndpointHandle&& other)
-    : state_(new State) {
-  state_.swap(other.state_);
-}
-
-ScopedInterfaceEndpointHandle::~ScopedInterfaceEndpointHandle() {
-  state_->Close(base::nullopt);
-}
-
-ScopedInterfaceEndpointHandle& ScopedInterfaceEndpointHandle::operator=(
-    ScopedInterfaceEndpointHandle&& other) {
-  reset();
-  state_.swap(other.state_);
-  return *this;
-}
-
-bool ScopedInterfaceEndpointHandle::is_valid() const {
-  return state_->is_valid();
-}
-
-bool ScopedInterfaceEndpointHandle::pending_association() const {
-  return state_->pending_association();
-}
-
-InterfaceId ScopedInterfaceEndpointHandle::id() const {
-  return state_->id();
-}
-
-AssociatedGroupController* ScopedInterfaceEndpointHandle::group_controller()
-    const {
-  return state_->group_controller();
-}
-
-const base::Optional<DisconnectReason>&
-ScopedInterfaceEndpointHandle::disconnect_reason() const {
-  return state_->disconnect_reason();
-}
-
-void ScopedInterfaceEndpointHandle::SetAssociationEventHandler(
-    AssociationEventCallback handler) {
-  state_->SetAssociationEventHandler(std::move(handler));
-}
-
-void ScopedInterfaceEndpointHandle::reset() {
-  ResetInternal(base::nullopt);
-}
-
-void ScopedInterfaceEndpointHandle::ResetWithReason(
-    uint32_t custom_reason,
-    const std::string& description) {
-  ResetInternal(DisconnectReason(custom_reason, description));
-}
-
-ScopedInterfaceEndpointHandle::ScopedInterfaceEndpointHandle(
-    InterfaceId id,
-    scoped_refptr<AssociatedGroupController> group_controller)
-    : state_(new State(id, std::move(group_controller))) {
-  DCHECK(!IsValidInterfaceId(state_->id()) || state_->group_controller());
-}
-
-bool ScopedInterfaceEndpointHandle::NotifyAssociation(
-    InterfaceId id,
-    scoped_refptr<AssociatedGroupController> peer_group_controller) {
-  return state_->NotifyAssociation(id, peer_group_controller);
-}
-
-void ScopedInterfaceEndpointHandle::ResetInternal(
-    const base::Optional<DisconnectReason>& reason) {
-  scoped_refptr<State> new_state(new State);
-  state_->Close(reason);
-  state_.swap(new_state);
-}
-
-base::Callback<AssociatedGroupController*()>
-ScopedInterfaceEndpointHandle::CreateGroupControllerGetter() const {
-  // We allow this callback to be run on any thread. If this handle is created
-  // in non-pending state, we don't have a lock but it should still be safe
-  // because the group controller never changes.
-  return base::Bind(&State::group_controller, state_);
-}
-
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/serialization.h b/mojo/public/cpp/bindings/lib/serialization.h
deleted file mode 100644
index 2a7d288..0000000
--- a/mojo/public/cpp/bindings/lib/serialization.h
+++ /dev/null
@@ -1,107 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_SERIALIZATION_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_SERIALIZATION_H_
-
-#include <string.h>
-
-#include "mojo/public/cpp/bindings/array_traits_carray.h"
-#include "mojo/public/cpp/bindings/array_traits_stl.h"
-#include "mojo/public/cpp/bindings/lib/array_serialization.h"
-#include "mojo/public/cpp/bindings/lib/buffer.h"
-#include "mojo/public/cpp/bindings/lib/handle_interface_serialization.h"
-#include "mojo/public/cpp/bindings/lib/map_serialization.h"
-#include "mojo/public/cpp/bindings/lib/native_enum_serialization.h"
-#include "mojo/public/cpp/bindings/lib/native_struct_serialization.h"
-#include "mojo/public/cpp/bindings/lib/string_serialization.h"
-#include "mojo/public/cpp/bindings/lib/template_util.h"
-#include "mojo/public/cpp/bindings/map_traits_stl.h"
-#include "mojo/public/cpp/bindings/string_traits_stl.h"
-#include "mojo/public/cpp/bindings/string_traits_string16.h"
-#include "mojo/public/cpp/bindings/string_traits_string_piece.h"
-
-namespace mojo {
-namespace internal {
-
-template <typename MojomType, typename DataArrayType, typename UserType>
-DataArrayType StructSerializeImpl(UserType* input) {
-  static_assert(BelongsTo<MojomType, MojomTypeCategory::STRUCT>::value,
-                "Unexpected type.");
-
-  SerializationContext context;
-  size_t size = PrepareToSerialize<MojomType>(*input, &context);
-  DCHECK_EQ(size, Align(size));
-
-  DataArrayType result(size);
-  if (size == 0)
-    return result;
-
-  void* result_buffer = &result.front();
-  // The serialization logic requires that the buffer is 8-byte aligned. If the
-  // result buffer is not properly aligned, we have to do an extra copy. In
-  // practice, this should never happen for std::vector.
-  bool need_copy = !IsAligned(result_buffer);
-
-  if (need_copy) {
-    // calloc sets the memory to all zero.
-    result_buffer = calloc(size, 1);
-    DCHECK(IsAligned(result_buffer));
-  }
-
-  Buffer buffer;
-  buffer.Initialize(result_buffer, size);
-  typename MojomTypeTraits<MojomType>::Data* data = nullptr;
-  Serialize<MojomType>(*input, &buffer, &data, &context);
-
-  if (need_copy) {
-    memcpy(&result.front(), result_buffer, size);
-    free(result_buffer);
-  }
-
-  return result;
-}
-
-template <typename MojomType, typename DataArrayType, typename UserType>
-bool StructDeserializeImpl(const DataArrayType& input,
-                           UserType* output,
-                           bool (*validate_func)(const void*,
-                                                 ValidationContext*)) {
-  static_assert(BelongsTo<MojomType, MojomTypeCategory::STRUCT>::value,
-                "Unexpected type.");
-  using DataType = typename MojomTypeTraits<MojomType>::Data;
-
-  // TODO(sammc): Use DataArrayType::empty() once WTF::Vector::empty() exists.
-  void* input_buffer =
-      input.size() == 0
-          ? nullptr
-          : const_cast<void*>(reinterpret_cast<const void*>(&input.front()));
-
-  // Please see comments in StructSerializeImpl.
-  bool need_copy = !IsAligned(input_buffer);
-
-  if (need_copy) {
-    input_buffer = malloc(input.size());
-    DCHECK(IsAligned(input_buffer));
-    memcpy(input_buffer, &input.front(), input.size());
-  }
-
-  ValidationContext validation_context(input_buffer, input.size(), 0, 0);
-  bool result = false;
-  if (validate_func(input_buffer, &validation_context)) {
-    auto data = reinterpret_cast<DataType*>(input_buffer);
-    SerializationContext context;
-    result = Deserialize<MojomType>(data, output, &context);
-  }
-
-  if (need_copy)
-    free(input_buffer);
-
-  return result;
-}
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_SERIALIZATION_H_
diff --git a/mojo/public/cpp/bindings/lib/serialization_context.cc b/mojo/public/cpp/bindings/lib/serialization_context.cc
deleted file mode 100644
index e2fd5c6..0000000
--- a/mojo/public/cpp/bindings/lib/serialization_context.cc
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/bindings/lib/serialization_context.h"
-
-#include <limits>
-
-#include "base/logging.h"
-#include "mojo/public/cpp/system/core.h"
-
-namespace mojo {
-namespace internal {
-
-SerializedHandleVector::SerializedHandleVector() {}
-
-SerializedHandleVector::~SerializedHandleVector() {
-  for (auto handle : handles_) {
-    if (handle.is_valid()) {
-      MojoResult rv = MojoClose(handle.value());
-      DCHECK_EQ(rv, MOJO_RESULT_OK);
-    }
-  }
-}
-
-Handle_Data SerializedHandleVector::AddHandle(mojo::Handle handle) {
-  Handle_Data data;
-  if (!handle.is_valid()) {
-    data.value = kEncodedInvalidHandleValue;
-  } else {
-    DCHECK_LT(handles_.size(), std::numeric_limits<uint32_t>::max());
-    data.value = static_cast<uint32_t>(handles_.size());
-    handles_.push_back(handle);
-  }
-  return data;
-}
-
-mojo::Handle SerializedHandleVector::TakeHandle(
-    const Handle_Data& encoded_handle) {
-  if (!encoded_handle.is_valid())
-    return mojo::Handle();
-  DCHECK_LT(encoded_handle.value, handles_.size());
-  return FetchAndReset(&handles_[encoded_handle.value]);
-}
-
-void SerializedHandleVector::Swap(std::vector<mojo::Handle>* other) {
-  handles_.swap(*other);
-}
-
-SerializationContext::SerializationContext() {}
-
-SerializationContext::~SerializationContext() {
-  DCHECK(!custom_contexts || custom_contexts->empty());
-}
-
-}  // namespace internal
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/serialization_context.h b/mojo/public/cpp/bindings/lib/serialization_context.h
deleted file mode 100644
index a34fe3d..0000000
--- a/mojo/public/cpp/bindings/lib/serialization_context.h
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_BINDINGS_SERIALIZATION_CONTEXT_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_BINDINGS_SERIALIZATION_CONTEXT_H_
-
-#include <stddef.h>
-
-#include <memory>
-#include <queue>
-#include <vector>
-
-#include "base/macros.h"
-#include "mojo/public/cpp/bindings/bindings_export.h"
-#include "mojo/public/cpp/bindings/lib/bindings_internal.h"
-#include "mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h"
-#include "mojo/public/cpp/system/handle.h"
-
-namespace mojo {
-namespace internal {
-
-// A container for handles during serialization/deserialization.
-class MOJO_CPP_BINDINGS_EXPORT SerializedHandleVector {
- public:
-  SerializedHandleVector();
-  ~SerializedHandleVector();
-
-  size_t size() const { return handles_.size(); }
-
-  // Adds a handle to the handle list and returns its index for encoding.
-  Handle_Data AddHandle(mojo::Handle handle);
-
-  // Takes a handle from the list of serialized handle data.
-  mojo::Handle TakeHandle(const Handle_Data& encoded_handle);
-
-  // Takes a handle from the list of serialized handle data and returns it in
-  // |*out_handle| as a specific scoped handle type.
-  template <typename T>
-  ScopedHandleBase<T> TakeHandleAs(const Handle_Data& encoded_handle) {
-    return MakeScopedHandle(T(TakeHandle(encoded_handle).value()));
-  }
-
-  // Swaps all owned handles out with another Handle vector.
-  void Swap(std::vector<mojo::Handle>* other);
-
- private:
-  // Handles are owned by this object.
-  std::vector<mojo::Handle> handles_;
-
-  DISALLOW_COPY_AND_ASSIGN(SerializedHandleVector);
-};
-
-// Context information for serialization/deserialization routines.
-struct MOJO_CPP_BINDINGS_EXPORT SerializationContext {
-  SerializationContext();
-
-  ~SerializationContext();
-
-  // Opaque context pointers returned by StringTraits::SetUpContext().
-  std::unique_ptr<std::queue<void*>> custom_contexts;
-
-  // Stashes handles encoded in a message by index.
-  SerializedHandleVector handles;
-
-  // The number of ScopedInterfaceEndpointHandles that need to be serialized.
-  // It is calculated by PrepareToSerialize().
-  uint32_t associated_endpoint_count = 0;
-
-  // Stashes ScopedInterfaceEndpointHandles encoded in a message by index.
-  std::vector<ScopedInterfaceEndpointHandle> associated_endpoint_handles;
-};
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_BINDINGS_SERIALIZATION_CONTEXT_H_
diff --git a/mojo/public/cpp/bindings/lib/serialization_forward.h b/mojo/public/cpp/bindings/lib/serialization_forward.h
deleted file mode 100644
index 55c9982..0000000
--- a/mojo/public/cpp/bindings/lib/serialization_forward.h
+++ /dev/null
@@ -1,123 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_SERIALIZATION_FORWARD_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_SERIALIZATION_FORWARD_H_
-
-#include "base/optional.h"
-#include "mojo/public/cpp/bindings/array_traits.h"
-#include "mojo/public/cpp/bindings/enum_traits.h"
-#include "mojo/public/cpp/bindings/lib/template_util.h"
-#include "mojo/public/cpp/bindings/map_traits.h"
-#include "mojo/public/cpp/bindings/string_traits.h"
-#include "mojo/public/cpp/bindings/struct_traits.h"
-#include "mojo/public/cpp/bindings/union_traits.h"
-
-// This file is included by serialization implementation files to avoid circular
-// includes.
-// Users of the serialization funtions should include serialization.h (and also
-// wtf_serialization.h if necessary).
-
-namespace mojo {
-namespace internal {
-
-template <typename MojomType, typename MaybeConstUserType>
-struct Serializer;
-
-template <typename T>
-struct IsOptionalWrapper {
-  static const bool value = IsSpecializationOf<
-      base::Optional,
-      typename std::remove_const<
-          typename std::remove_reference<T>::type>::type>::value;
-};
-
-// PrepareToSerialize() must be matched by a Serialize() for the same input
-// later. Moreover, within the same SerializationContext if PrepareToSerialize()
-// is called for |input_1|, ..., |input_n|, Serialize() must be called for
-// those objects in the exact same order.
-template <typename MojomType,
-          typename InputUserType,
-          typename... Args,
-          typename std::enable_if<
-              !IsOptionalWrapper<InputUserType>::value>::type* = nullptr>
-size_t PrepareToSerialize(InputUserType&& input, Args&&... args) {
-  return Serializer<MojomType,
-                    typename std::remove_reference<InputUserType>::type>::
-      PrepareToSerialize(std::forward<InputUserType>(input),
-                         std::forward<Args>(args)...);
-}
-
-template <typename MojomType,
-          typename InputUserType,
-          typename... Args,
-          typename std::enable_if<
-              !IsOptionalWrapper<InputUserType>::value>::type* = nullptr>
-void Serialize(InputUserType&& input, Args&&... args) {
-  Serializer<MojomType, typename std::remove_reference<InputUserType>::type>::
-      Serialize(std::forward<InputUserType>(input),
-                std::forward<Args>(args)...);
-}
-
-template <typename MojomType,
-          typename DataType,
-          typename InputUserType,
-          typename... Args,
-          typename std::enable_if<
-              !IsOptionalWrapper<InputUserType>::value>::type* = nullptr>
-bool Deserialize(DataType&& input, InputUserType* output, Args&&... args) {
-  return Serializer<MojomType, InputUserType>::Deserialize(
-      std::forward<DataType>(input), output, std::forward<Args>(args)...);
-}
-
-// Specialization that unwraps base::Optional<>.
-template <typename MojomType,
-          typename InputUserType,
-          typename... Args,
-          typename std::enable_if<
-              IsOptionalWrapper<InputUserType>::value>::type* = nullptr>
-size_t PrepareToSerialize(InputUserType&& input, Args&&... args) {
-  if (!input)
-    return 0;
-  return PrepareToSerialize<MojomType>(*input, std::forward<Args>(args)...);
-}
-
-template <typename MojomType,
-          typename InputUserType,
-          typename DataType,
-          typename... Args,
-          typename std::enable_if<
-              IsOptionalWrapper<InputUserType>::value>::type* = nullptr>
-void Serialize(InputUserType&& input,
-               Buffer* buffer,
-               DataType** output,
-               Args&&... args) {
-  if (!input) {
-    *output = nullptr;
-    return;
-  }
-  Serialize<MojomType>(*input, buffer, output, std::forward<Args>(args)...);
-}
-
-template <typename MojomType,
-          typename DataType,
-          typename InputUserType,
-          typename... Args,
-          typename std::enable_if<
-              IsOptionalWrapper<InputUserType>::value>::type* = nullptr>
-bool Deserialize(DataType&& input, InputUserType* output, Args&&... args) {
-  if (!input) {
-    *output = base::nullopt;
-    return true;
-  }
-  if (!*output)
-    output->emplace();
-  return Deserialize<MojomType>(std::forward<DataType>(input), &output->value(),
-                                std::forward<Args>(args)...);
-}
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_SERIALIZATION_FORWARD_H_
diff --git a/mojo/public/cpp/bindings/lib/serialization_util.h b/mojo/public/cpp/bindings/lib/serialization_util.h
deleted file mode 100644
index 4820a01..0000000
--- a/mojo/public/cpp/bindings/lib/serialization_util.h
+++ /dev/null
@@ -1,213 +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 MOJO_PUBLIC_CPP_BINDINGS_LIB_SERIALIZATION_UTIL_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_SERIALIZATION_UTIL_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <queue>
-
-#include "base/logging.h"
-#include "base/macros.h"
-#include "mojo/public/cpp/bindings/lib/bindings_internal.h"
-#include "mojo/public/cpp/bindings/lib/serialization_context.h"
-
-namespace mojo {
-namespace internal {
-
-template <typename T>
-struct HasIsNullMethod {
-  template <typename U>
-  static char Test(decltype(U::IsNull)*);
-  template <typename U>
-  static int Test(...);
-  static const bool value = sizeof(Test<T>(0)) == sizeof(char);
-
- private:
-  EnsureTypeIsComplete<T> check_t_;
-};
-
-template <
-    typename Traits,
-    typename UserType,
-    typename std::enable_if<HasIsNullMethod<Traits>::value>::type* = nullptr>
-bool CallIsNullIfExists(const UserType& input) {
-  return Traits::IsNull(input);
-}
-
-template <
-    typename Traits,
-    typename UserType,
-    typename std::enable_if<!HasIsNullMethod<Traits>::value>::type* = nullptr>
-bool CallIsNullIfExists(const UserType& input) {
-  return false;
-}
-template <typename T>
-struct HasSetToNullMethod {
-  template <typename U>
-  static char Test(decltype(U::SetToNull)*);
-  template <typename U>
-  static int Test(...);
-  static const bool value = sizeof(Test<T>(0)) == sizeof(char);
-
- private:
-  EnsureTypeIsComplete<T> check_t_;
-};
-
-template <
-    typename Traits,
-    typename UserType,
-    typename std::enable_if<HasSetToNullMethod<Traits>::value>::type* = nullptr>
-bool CallSetToNullIfExists(UserType* output) {
-  Traits::SetToNull(output);
-  return true;
-}
-
-template <typename Traits,
-          typename UserType,
-          typename std::enable_if<!HasSetToNullMethod<Traits>::value>::type* =
-              nullptr>
-bool CallSetToNullIfExists(UserType* output) {
-  LOG(ERROR) << "A null value is received. But the Struct/Array/StringTraits "
-             << "class doesn't define a SetToNull() function and therefore is "
-             << "unable to deserialize the value.";
-  return false;
-}
-
-template <typename T>
-struct HasSetUpContextMethod {
-  template <typename U>
-  static char Test(decltype(U::SetUpContext)*);
-  template <typename U>
-  static int Test(...);
-  static const bool value = sizeof(Test<T>(0)) == sizeof(char);
-
- private:
-  EnsureTypeIsComplete<T> check_t_;
-};
-
-template <typename Traits,
-          bool has_context = HasSetUpContextMethod<Traits>::value>
-struct CustomContextHelper;
-
-template <typename Traits>
-struct CustomContextHelper<Traits, true> {
-  template <typename MaybeConstUserType>
-  static void* SetUp(MaybeConstUserType& input, SerializationContext* context) {
-    void* custom_context = Traits::SetUpContext(input);
-    if (!context->custom_contexts)
-      context->custom_contexts.reset(new std::queue<void*>());
-    context->custom_contexts->push(custom_context);
-    return custom_context;
-  }
-
-  static void* GetNext(SerializationContext* context) {
-    void* custom_context = context->custom_contexts->front();
-    context->custom_contexts->pop();
-    return custom_context;
-  }
-
-  template <typename MaybeConstUserType>
-  static void TearDown(MaybeConstUserType& input, void* custom_context) {
-    Traits::TearDownContext(input, custom_context);
-  }
-};
-
-template <typename Traits>
-struct CustomContextHelper<Traits, false> {
-  template <typename MaybeConstUserType>
-  static void* SetUp(MaybeConstUserType& input, SerializationContext* context) {
-    return nullptr;
-  }
-
-  static void* GetNext(SerializationContext* context) { return nullptr; }
-
-  template <typename MaybeConstUserType>
-  static void TearDown(MaybeConstUserType& input, void* custom_context) {
-    DCHECK(!custom_context);
-  }
-};
-
-template <typename ReturnType, typename ParamType, typename InputUserType>
-ReturnType CallWithContext(ReturnType (*f)(ParamType, void*),
-                           InputUserType&& input,
-                           void* context) {
-  return f(std::forward<InputUserType>(input), context);
-}
-
-template <typename ReturnType, typename ParamType, typename InputUserType>
-ReturnType CallWithContext(ReturnType (*f)(ParamType),
-                           InputUserType&& input,
-                           void* context) {
-  return f(std::forward<InputUserType>(input));
-}
-
-template <typename T, typename MaybeConstUserType>
-struct HasGetBeginMethod {
-  template <typename U>
-  static char Test(decltype(U::GetBegin(std::declval<MaybeConstUserType&>()))*);
-  template <typename U>
-  static int Test(...);
-  static const bool value = sizeof(Test<T>(0)) == sizeof(char);
-
- private:
-  EnsureTypeIsComplete<T> check_t_;
-};
-
-template <
-    typename Traits,
-    typename MaybeConstUserType,
-    typename std::enable_if<
-        HasGetBeginMethod<Traits, MaybeConstUserType>::value>::type* = nullptr>
-decltype(Traits::GetBegin(std::declval<MaybeConstUserType&>()))
-CallGetBeginIfExists(MaybeConstUserType& input) {
-  return Traits::GetBegin(input);
-}
-
-template <
-    typename Traits,
-    typename MaybeConstUserType,
-    typename std::enable_if<
-        !HasGetBeginMethod<Traits, MaybeConstUserType>::value>::type* = nullptr>
-size_t CallGetBeginIfExists(MaybeConstUserType& input) {
-  return 0;
-}
-
-template <typename T, typename MaybeConstUserType>
-struct HasGetDataMethod {
-  template <typename U>
-  static char Test(decltype(U::GetData(std::declval<MaybeConstUserType&>()))*);
-  template <typename U>
-  static int Test(...);
-  static const bool value = sizeof(Test<T>(0)) == sizeof(char);
-
- private:
-  EnsureTypeIsComplete<T> check_t_;
-};
-
-template <
-    typename Traits,
-    typename MaybeConstUserType,
-    typename std::enable_if<
-        HasGetDataMethod<Traits, MaybeConstUserType>::value>::type* = nullptr>
-decltype(Traits::GetData(std::declval<MaybeConstUserType&>()))
-CallGetDataIfExists(MaybeConstUserType& input) {
-  return Traits::GetData(input);
-}
-
-template <
-    typename Traits,
-    typename MaybeConstUserType,
-    typename std::enable_if<
-        !HasGetDataMethod<Traits, MaybeConstUserType>::value>::type* = nullptr>
-void* CallGetDataIfExists(MaybeConstUserType& input) {
-  return nullptr;
-}
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_SERIALIZATION_UTIL_H_
diff --git a/mojo/public/cpp/bindings/lib/string_serialization.h b/mojo/public/cpp/bindings/lib/string_serialization.h
deleted file mode 100644
index 6e0c758..0000000
--- a/mojo/public/cpp/bindings/lib/string_serialization.h
+++ /dev/null
@@ -1,70 +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 MOJO_PUBLIC_CPP_BINDINGS_LIB_STRING_SERIALIZATION_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_STRING_SERIALIZATION_H_
-
-#include <stddef.h>
-#include <string.h>
-
-#include "mojo/public/cpp/bindings/lib/array_internal.h"
-#include "mojo/public/cpp/bindings/lib/serialization_forward.h"
-#include "mojo/public/cpp/bindings/lib/serialization_util.h"
-#include "mojo/public/cpp/bindings/string_data_view.h"
-#include "mojo/public/cpp/bindings/string_traits.h"
-
-namespace mojo {
-namespace internal {
-
-template <typename MaybeConstUserType>
-struct Serializer<StringDataView, MaybeConstUserType> {
-  using UserType = typename std::remove_const<MaybeConstUserType>::type;
-  using Traits = StringTraits<UserType>;
-
-  static size_t PrepareToSerialize(MaybeConstUserType& input,
-                                   SerializationContext* context) {
-    if (CallIsNullIfExists<Traits>(input))
-      return 0;
-
-    void* custom_context = CustomContextHelper<Traits>::SetUp(input, context);
-    return Align(sizeof(String_Data) +
-                 CallWithContext(Traits::GetSize, input, custom_context));
-  }
-
-  static void Serialize(MaybeConstUserType& input,
-                        Buffer* buffer,
-                        String_Data** output,
-                        SerializationContext* context) {
-    if (CallIsNullIfExists<Traits>(input)) {
-      *output = nullptr;
-      return;
-    }
-
-    void* custom_context = CustomContextHelper<Traits>::GetNext(context);
-
-    String_Data* result = String_Data::New(
-        CallWithContext(Traits::GetSize, input, custom_context), buffer);
-    if (result) {
-      memcpy(result->storage(),
-             CallWithContext(Traits::GetData, input, custom_context),
-             CallWithContext(Traits::GetSize, input, custom_context));
-    }
-    *output = result;
-
-    CustomContextHelper<Traits>::TearDown(input, custom_context);
-  }
-
-  static bool Deserialize(String_Data* input,
-                          UserType* output,
-                          SerializationContext* context) {
-    if (!input)
-      return CallSetToNullIfExists<Traits>(output);
-    return Traits::Read(StringDataView(input, context), output);
-  }
-};
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_STRING_SERIALIZATION_H_
diff --git a/mojo/public/cpp/bindings/lib/string_traits_string16.cc b/mojo/public/cpp/bindings/lib/string_traits_string16.cc
deleted file mode 100644
index 95ff6cc..0000000
--- a/mojo/public/cpp/bindings/lib/string_traits_string16.cc
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/bindings/string_traits_string16.h"
-
-#include <string>
-
-#include "base/strings/utf_string_conversions.h"
-
-namespace mojo {
-
-// static
-void* StringTraits<base::string16>::SetUpContext(const base::string16& input) {
-  return new std::string(base::UTF16ToUTF8(input));
-}
-
-// static
-void StringTraits<base::string16>::TearDownContext(const base::string16& input,
-                                                   void* context) {
-  delete static_cast<std::string*>(context);
-}
-
-// static
-size_t StringTraits<base::string16>::GetSize(const base::string16& input,
-                                             void* context) {
-  return static_cast<std::string*>(context)->size();
-}
-
-// static
-const char* StringTraits<base::string16>::GetData(const base::string16& input,
-                                                  void* context) {
-  return static_cast<std::string*>(context)->data();
-}
-
-// static
-bool StringTraits<base::string16>::Read(StringDataView input,
-                                        base::string16* output) {
-  return base::UTF8ToUTF16(input.storage(), input.size(), output);
-}
-
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/string_traits_wtf.cc b/mojo/public/cpp/bindings/lib/string_traits_wtf.cc
deleted file mode 100644
index 203f6f5..0000000
--- a/mojo/public/cpp/bindings/lib/string_traits_wtf.cc
+++ /dev/null
@@ -1,84 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/bindings/string_traits_wtf.h"
-
-#include <string.h>
-
-#include "base/logging.h"
-#include "mojo/public/cpp/bindings/lib/array_internal.h"
-#include "third_party/WebKit/Source/wtf/text/StringUTF8Adaptor.h"
-
-namespace mojo {
-namespace {
-
-struct UTF8AdaptorInfo {
-  explicit UTF8AdaptorInfo(const WTF::String& input) : utf8_adaptor(input) {
-#if DCHECK_IS_ON()
-    original_size_in_bytes = input.charactersSizeInBytes();
-#endif
-  }
-
-  ~UTF8AdaptorInfo() {}
-
-  WTF::StringUTF8Adaptor utf8_adaptor;
-
-#if DCHECK_IS_ON()
-  // For sanity check only.
-  size_t original_size_in_bytes;
-#endif
-};
-
-UTF8AdaptorInfo* ToAdaptor(const WTF::String& input, void* context) {
-  UTF8AdaptorInfo* adaptor = static_cast<UTF8AdaptorInfo*>(context);
-
-#if DCHECK_IS_ON()
-  DCHECK_EQ(adaptor->original_size_in_bytes, input.charactersSizeInBytes());
-#endif
-  return adaptor;
-}
-
-}  // namespace
-
-// static
-void StringTraits<WTF::String>::SetToNull(WTF::String* output) {
-  if (output->isNull())
-    return;
-
-  WTF::String result;
-  output->swap(result);
-}
-
-// static
-void* StringTraits<WTF::String>::SetUpContext(const WTF::String& input) {
-  return new UTF8AdaptorInfo(input);
-}
-
-// static
-void StringTraits<WTF::String>::TearDownContext(const WTF::String& input,
-                                                void* context) {
-  delete ToAdaptor(input, context);
-}
-
-// static
-size_t StringTraits<WTF::String>::GetSize(const WTF::String& input,
-                                          void* context) {
-  return ToAdaptor(input, context)->utf8_adaptor.length();
-}
-
-// static
-const char* StringTraits<WTF::String>::GetData(const WTF::String& input,
-                                               void* context) {
-  return ToAdaptor(input, context)->utf8_adaptor.data();
-}
-
-// static
-bool StringTraits<WTF::String>::Read(StringDataView input,
-                                     WTF::String* output) {
-  WTF::String result = WTF::String::fromUTF8(input.storage(), input.size());
-  output->swap(result);
-  return true;
-}
-
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/sync_call_restrictions.cc b/mojo/public/cpp/bindings/lib/sync_call_restrictions.cc
deleted file mode 100644
index 585a8f0..0000000
--- a/mojo/public/cpp/bindings/lib/sync_call_restrictions.cc
+++ /dev/null
@@ -1,93 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/bindings/sync_call_restrictions.h"
-
-#if ENABLE_SYNC_CALL_RESTRICTIONS
-
-#include "base/debug/leak_annotations.h"
-#include "base/lazy_instance.h"
-#include "base/logging.h"
-#include "base/threading/thread_local.h"
-#include "mojo/public/c/system/core.h"
-
-namespace mojo {
-
-namespace {
-
-class SyncCallSettings {
- public:
-  static SyncCallSettings* current();
-
-  bool allowed() const {
-    return scoped_allow_count_ > 0 || system_defined_value_;
-  }
-
-  void IncreaseScopedAllowCount() { scoped_allow_count_++; }
-  void DecreaseScopedAllowCount() {
-    DCHECK_LT(0u, scoped_allow_count_);
-    scoped_allow_count_--;
-  }
-
- private:
-  SyncCallSettings();
-  ~SyncCallSettings();
-
-  bool system_defined_value_ = true;
-  size_t scoped_allow_count_ = 0;
-};
-
-base::LazyInstance<base::ThreadLocalPointer<SyncCallSettings>>::DestructorAtExit
-    g_sync_call_settings = LAZY_INSTANCE_INITIALIZER;
-
-// static
-SyncCallSettings* SyncCallSettings::current() {
-  SyncCallSettings* result = g_sync_call_settings.Pointer()->Get();
-  if (!result) {
-    result = new SyncCallSettings();
-    ANNOTATE_LEAKING_OBJECT_PTR(result);
-    DCHECK_EQ(result, g_sync_call_settings.Pointer()->Get());
-  }
-  return result;
-}
-
-SyncCallSettings::SyncCallSettings() {
-  MojoResult result = MojoGetProperty(MOJO_PROPERTY_TYPE_SYNC_CALL_ALLOWED,
-                                      &system_defined_value_);
-  DCHECK_EQ(MOJO_RESULT_OK, result);
-
-  DCHECK(!g_sync_call_settings.Pointer()->Get());
-  g_sync_call_settings.Pointer()->Set(this);
-}
-
-SyncCallSettings::~SyncCallSettings() {
-  g_sync_call_settings.Pointer()->Set(nullptr);
-}
-
-}  // namespace
-
-// static
-void SyncCallRestrictions::AssertSyncCallAllowed() {
-  if (!SyncCallSettings::current()->allowed()) {
-      LOG(FATAL) << "Mojo sync calls are not allowed in this process because "
-                 << "they can lead to jank and deadlock. If you must make an "
-                 << "exception, please see "
-                 << "SyncCallRestrictions::ScopedAllowSyncCall and consult "
-                 << "mojo/OWNERS.";
-  }
-}
-
-// static
-void SyncCallRestrictions::IncreaseScopedAllowCount() {
-  SyncCallSettings::current()->IncreaseScopedAllowCount();
-}
-
-// static
-void SyncCallRestrictions::DecreaseScopedAllowCount() {
-  SyncCallSettings::current()->DecreaseScopedAllowCount();
-}
-
-}  // namespace mojo
-
-#endif  // ENABLE_SYNC_CALL_RESTRICTIONS
diff --git a/mojo/public/cpp/bindings/lib/sync_event_watcher.cc b/mojo/public/cpp/bindings/lib/sync_event_watcher.cc
deleted file mode 100644
index b1c97e3..0000000
--- a/mojo/public/cpp/bindings/lib/sync_event_watcher.cc
+++ /dev/null
@@ -1,67 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/bindings/sync_event_watcher.h"
-
-#include "base/logging.h"
-
-namespace mojo {
-
-SyncEventWatcher::SyncEventWatcher(base::WaitableEvent* event,
-                                   const base::Closure& callback)
-    : event_(event),
-      callback_(callback),
-      registry_(SyncHandleRegistry::current()),
-      destroyed_(new base::RefCountedData<bool>(false)) {}
-
-SyncEventWatcher::~SyncEventWatcher() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  if (registered_)
-    registry_->UnregisterEvent(event_);
-  destroyed_->data = true;
-}
-
-void SyncEventWatcher::AllowWokenUpBySyncWatchOnSameThread() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  IncrementRegisterCount();
-}
-
-bool SyncEventWatcher::SyncWatch(const bool* should_stop) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  IncrementRegisterCount();
-  if (!registered_) {
-    DecrementRegisterCount();
-    return false;
-  }
-
-  // This object may be destroyed during the Wait() call. So we have to preserve
-  // the boolean that Wait uses.
-  auto destroyed = destroyed_;
-  const bool* should_stop_array[] = {should_stop, &destroyed->data};
-  bool result = registry_->Wait(should_stop_array, 2);
-
-  // This object has been destroyed.
-  if (destroyed->data)
-    return false;
-
-  DecrementRegisterCount();
-  return result;
-}
-
-void SyncEventWatcher::IncrementRegisterCount() {
-  register_request_count_++;
-  if (!registered_)
-    registered_ = registry_->RegisterEvent(event_, callback_);
-}
-
-void SyncEventWatcher::DecrementRegisterCount() {
-  DCHECK_GT(register_request_count_, 0u);
-  register_request_count_--;
-  if (register_request_count_ == 0 && registered_) {
-    registry_->UnregisterEvent(event_);
-    registered_ = false;
-  }
-}
-
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/sync_handle_registry.cc b/mojo/public/cpp/bindings/lib/sync_handle_registry.cc
deleted file mode 100644
index fd3df39..0000000
--- a/mojo/public/cpp/bindings/lib/sync_handle_registry.cc
+++ /dev/null
@@ -1,135 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/bindings/sync_handle_registry.h"
-
-#include "base/lazy_instance.h"
-#include "base/logging.h"
-#include "base/stl_util.h"
-#include "base/threading/thread_local.h"
-#include "mojo/public/c/system/core.h"
-
-namespace mojo {
-namespace {
-
-base::LazyInstance<base::ThreadLocalPointer<SyncHandleRegistry>>::Leaky
-    g_current_sync_handle_watcher = LAZY_INSTANCE_INITIALIZER;
-
-}  // namespace
-
-// static
-scoped_refptr<SyncHandleRegistry> SyncHandleRegistry::current() {
-  scoped_refptr<SyncHandleRegistry> result(
-      g_current_sync_handle_watcher.Pointer()->Get());
-  if (!result) {
-    result = new SyncHandleRegistry();
-    DCHECK_EQ(result.get(), g_current_sync_handle_watcher.Pointer()->Get());
-  }
-  return result;
-}
-
-bool SyncHandleRegistry::RegisterHandle(const Handle& handle,
-                                        MojoHandleSignals handle_signals,
-                                        const HandleCallback& callback) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-
-  if (base::ContainsKey(handles_, handle))
-    return false;
-
-  MojoResult result = wait_set_.AddHandle(handle, handle_signals);
-  if (result != MOJO_RESULT_OK)
-    return false;
-
-  handles_[handle] = callback;
-  return true;
-}
-
-void SyncHandleRegistry::UnregisterHandle(const Handle& handle) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  if (!base::ContainsKey(handles_, handle))
-    return;
-
-  MojoResult result = wait_set_.RemoveHandle(handle);
-  DCHECK_EQ(MOJO_RESULT_OK, result);
-  handles_.erase(handle);
-}
-
-bool SyncHandleRegistry::RegisterEvent(base::WaitableEvent* event,
-                                       const base::Closure& callback) {
-  auto result = events_.insert({event, callback});
-  DCHECK(result.second);
-  MojoResult rv = wait_set_.AddEvent(event);
-  if (rv == MOJO_RESULT_OK)
-    return true;
-  DCHECK_EQ(MOJO_RESULT_ALREADY_EXISTS, rv);
-  return false;
-}
-
-void SyncHandleRegistry::UnregisterEvent(base::WaitableEvent* event) {
-  auto it = events_.find(event);
-  DCHECK(it != events_.end());
-  events_.erase(it);
-  MojoResult rv = wait_set_.RemoveEvent(event);
-  DCHECK_EQ(MOJO_RESULT_OK, rv);
-}
-
-bool SyncHandleRegistry::Wait(const bool* should_stop[], size_t count) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-
-  size_t num_ready_handles;
-  Handle ready_handle;
-  MojoResult ready_handle_result;
-
-  scoped_refptr<SyncHandleRegistry> preserver(this);
-  while (true) {
-    for (size_t i = 0; i < count; ++i)
-      if (*should_stop[i])
-        return true;
-
-    // TODO(yzshen): Theoretically it can reduce sync call re-entrancy if we
-    // give priority to the handle that is waiting for sync response.
-    base::WaitableEvent* ready_event = nullptr;
-    num_ready_handles = 1;
-    wait_set_.Wait(&ready_event, &num_ready_handles, &ready_handle,
-                   &ready_handle_result);
-    if (num_ready_handles) {
-      DCHECK_EQ(1u, num_ready_handles);
-      const auto iter = handles_.find(ready_handle);
-      iter->second.Run(ready_handle_result);
-    }
-
-    if (ready_event) {
-      const auto iter = events_.find(ready_event);
-      DCHECK(iter != events_.end());
-      iter->second.Run();
-    }
-  };
-
-  return false;
-}
-
-SyncHandleRegistry::SyncHandleRegistry() {
-  DCHECK(!g_current_sync_handle_watcher.Pointer()->Get());
-  g_current_sync_handle_watcher.Pointer()->Set(this);
-}
-
-SyncHandleRegistry::~SyncHandleRegistry() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-
-  // This object may be destructed after the thread local storage slot used by
-  // |g_current_sync_handle_watcher| is reset during thread shutdown.
-  // For example, another slot in the thread local storage holds a referrence to
-  // this object, and that slot is cleaned up after
-  // |g_current_sync_handle_watcher|.
-  if (!g_current_sync_handle_watcher.Pointer()->Get())
-    return;
-
-  // If this breaks, it is likely that the global variable is bulit into and
-  // accessed from multiple modules.
-  DCHECK_EQ(this, g_current_sync_handle_watcher.Pointer()->Get());
-
-  g_current_sync_handle_watcher.Pointer()->Set(nullptr);
-}
-
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/sync_handle_watcher.cc b/mojo/public/cpp/bindings/lib/sync_handle_watcher.cc
deleted file mode 100644
index f20af56..0000000
--- a/mojo/public/cpp/bindings/lib/sync_handle_watcher.cc
+++ /dev/null
@@ -1,76 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/bindings/sync_handle_watcher.h"
-
-#include "base/logging.h"
-
-namespace mojo {
-
-SyncHandleWatcher::SyncHandleWatcher(
-    const Handle& handle,
-    MojoHandleSignals handle_signals,
-    const SyncHandleRegistry::HandleCallback& callback)
-    : handle_(handle),
-      handle_signals_(handle_signals),
-      callback_(callback),
-      registered_(false),
-      register_request_count_(0),
-      registry_(SyncHandleRegistry::current()),
-      destroyed_(new base::RefCountedData<bool>(false)) {}
-
-SyncHandleWatcher::~SyncHandleWatcher() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  if (registered_)
-    registry_->UnregisterHandle(handle_);
-
-  destroyed_->data = true;
-}
-
-void SyncHandleWatcher::AllowWokenUpBySyncWatchOnSameThread() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  IncrementRegisterCount();
-}
-
-bool SyncHandleWatcher::SyncWatch(const bool* should_stop) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  IncrementRegisterCount();
-  if (!registered_) {
-    DecrementRegisterCount();
-    return false;
-  }
-
-  // This object may be destroyed during the Wait() call. So we have to preserve
-  // the boolean that Wait uses.
-  auto destroyed = destroyed_;
-  const bool* should_stop_array[] = {should_stop, &destroyed->data};
-  bool result = registry_->Wait(should_stop_array, 2);
-
-  // This object has been destroyed.
-  if (destroyed->data)
-    return false;
-
-  DecrementRegisterCount();
-  return result;
-}
-
-void SyncHandleWatcher::IncrementRegisterCount() {
-  register_request_count_++;
-  if (!registered_) {
-    registered_ =
-        registry_->RegisterHandle(handle_, handle_signals_, callback_);
-  }
-}
-
-void SyncHandleWatcher::DecrementRegisterCount() {
-  DCHECK_GT(register_request_count_, 0u);
-
-  register_request_count_--;
-  if (register_request_count_ == 0 && registered_) {
-    registry_->UnregisterHandle(handle_);
-    registered_ = false;
-  }
-}
-
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/template_util.h b/mojo/public/cpp/bindings/lib/template_util.h
deleted file mode 100644
index 5151123..0000000
--- a/mojo/public/cpp/bindings/lib/template_util.h
+++ /dev/null
@@ -1,120 +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 MOJO_PUBLIC_CPP_BINDINGS_LIB_TEMPLATE_UTIL_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_TEMPLATE_UTIL_H_
-
-#include <type_traits>
-
-namespace mojo {
-namespace internal {
-
-template <class T, T v>
-struct IntegralConstant {
-  static const T value = v;
-};
-
-template <class T, T v>
-const T IntegralConstant<T, v>::value;
-
-typedef IntegralConstant<bool, true> TrueType;
-typedef IntegralConstant<bool, false> FalseType;
-
-template <class T>
-struct IsConst : FalseType {};
-template <class T>
-struct IsConst<const T> : TrueType {};
-
-template <class T>
-struct IsPointer : FalseType {};
-template <class T>
-struct IsPointer<T*> : TrueType {};
-
-template <bool B, typename T = void>
-struct EnableIf {};
-
-template <typename T>
-struct EnableIf<true, T> {
-  typedef T type;
-};
-
-// Types YesType and NoType are guaranteed such that sizeof(YesType) <
-// sizeof(NoType).
-typedef char YesType;
-
-struct NoType {
-  YesType dummy[2];
-};
-
-// A helper template to determine if given type is non-const move-only-type,
-// i.e. if a value of the given type should be passed via std::move() in a
-// destructive way.
-template <typename T>
-struct IsMoveOnlyType {
-  static const bool value = std::is_constructible<T, T&&>::value &&
-                            !std::is_constructible<T, const T&>::value;
-};
-
-// This goop is a trick used to implement a template that can be used to
-// determine if a given class is the base class of another given class.
-template <typename, typename>
-struct IsSame {
-  static bool const value = false;
-};
-template <typename A>
-struct IsSame<A, A> {
-  static bool const value = true;
-};
-
-template <typename T>
-struct EnsureTypeIsComplete {
-  // sizeof() cannot be applied to incomplete types, this line will fail
-  // compilation if T is forward declaration.
-  using CheckSize = char (*)[sizeof(T)];
-};
-
-template <typename Base, typename Derived>
-struct IsBaseOf {
- private:
-  static Derived* CreateDerived();
-  static char(&Check(Base*))[1];
-  static char(&Check(...))[2];
-
-  EnsureTypeIsComplete<Base> check_base_;
-  EnsureTypeIsComplete<Derived> check_derived_;
-
- public:
-  static bool const value = sizeof Check(CreateDerived()) == 1 &&
-                            !IsSame<Base const, void const>::value;
-};
-
-template <class T>
-struct RemovePointer {
-  typedef T type;
-};
-template <class T>
-struct RemovePointer<T*> {
-  typedef T type;
-};
-
-template <template <typename...> class Template, typename T>
-struct IsSpecializationOf : FalseType {};
-
-template <template <typename...> class Template, typename... Args>
-struct IsSpecializationOf<Template, Template<Args...>> : TrueType {};
-
-template <bool B, typename T, typename F>
-struct Conditional {
-  typedef T type;
-};
-
-template <typename T, typename F>
-struct Conditional<false, T, F> {
-  typedef F type;
-};
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_TEMPLATE_UTIL_H_
diff --git a/mojo/public/cpp/bindings/lib/union_accessor.h b/mojo/public/cpp/bindings/lib/union_accessor.h
deleted file mode 100644
index 821aede..0000000
--- a/mojo/public/cpp/bindings/lib/union_accessor.h
+++ /dev/null
@@ -1,33 +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 MOJO_PUBLIC_CPP_BINDINGS_LIB_UNION_ACCESSOR_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_UNION_ACCESSOR_H_
-
-namespace mojo {
-namespace internal {
-
-// When serializing and deserializing Unions, it is necessary to access
-// the private fields and methods of the Union. This allows us to do that
-// without leaking those same fields and methods in the Union interface.
-// All Union wrappers are friends of this class allowing such access.
-template <typename U>
-class UnionAccessor {
- public:
-  explicit UnionAccessor(U* u) : u_(u) {}
-
-  typename U::Union_* data() { return &(u_->data_); }
-
-  typename U::Tag* tag() { return &(u_->tag_); }
-
-  void SwitchActive(typename U::Tag new_tag) { u_->SwitchActive(new_tag); }
-
- private:
-  U* u_;
-};
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_UNION_ACCESSOR_H_
diff --git a/mojo/public/cpp/bindings/lib/validate_params.h b/mojo/public/cpp/bindings/lib/validate_params.h
deleted file mode 100644
index c0ee8e0..0000000
--- a/mojo/public/cpp/bindings/lib/validate_params.h
+++ /dev/null
@@ -1,88 +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 MOJO_PUBLIC_CPP_BINDINGS_LIB_VALIDATE_PARAMS_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_VALIDATE_PARAMS_H_
-
-#include <stdint.h>
-
-#include "base/macros.h"
-
-namespace mojo {
-namespace internal {
-
-class ValidationContext;
-
-using ValidateEnumFunc = bool (*)(int32_t, ValidationContext*);
-
-class ContainerValidateParams {
- public:
-  // Validates a map. A map is validated as a pair of arrays, one for the keys
-  // and one for the values. Both arguments must be non-null.
-  //
-  // ContainerValidateParams takes ownership of |in_key_validate params| and
-  // |in_element_validate params|.
-  ContainerValidateParams(ContainerValidateParams* in_key_validate_params,
-                          ContainerValidateParams* in_element_validate_params)
-      : key_validate_params(in_key_validate_params),
-        element_validate_params(in_element_validate_params) {
-    DCHECK(in_key_validate_params)
-        << "Map validate params require key validate params";
-    DCHECK(in_element_validate_params)
-        << "Map validate params require element validate params";
-  }
-
-  // Validates an array.
-  //
-  // ContainerValidateParams takes ownership of |in_element_validate params|.
-  ContainerValidateParams(uint32_t in_expected_num_elements,
-                          bool in_element_is_nullable,
-                          ContainerValidateParams* in_element_validate_params)
-      : expected_num_elements(in_expected_num_elements),
-        element_is_nullable(in_element_is_nullable),
-        element_validate_params(in_element_validate_params) {}
-
-  // Validates an array of enums.
-  ContainerValidateParams(uint32_t in_expected_num_elements,
-                          ValidateEnumFunc in_validate_enum_func)
-      : expected_num_elements(in_expected_num_elements),
-        validate_enum_func(in_validate_enum_func) {}
-
-  ~ContainerValidateParams() {
-    if (element_validate_params)
-      delete element_validate_params;
-    if (key_validate_params)
-      delete key_validate_params;
-  }
-
-  // If |expected_num_elements| is not 0, the array is expected to have exactly
-  // that number of elements.
-  uint32_t expected_num_elements = 0;
-
-  // Whether the elements are nullable.
-  bool element_is_nullable = false;
-
-  // Validation information for the map key array. May contain other
-  // ArrayValidateParams e.g. if the keys are strings.
-  ContainerValidateParams* key_validate_params = nullptr;
-
-  // For arrays: validation information for elements. It is either a pointer to
-  // another instance of ArrayValidateParams (if elements are arrays or maps),
-  // or nullptr.
-  //
-  // For maps: validation information for the whole value array. May contain
-  // other ArrayValidateParams e.g. if the values are arrays or maps.
-  ContainerValidateParams* element_validate_params = nullptr;
-
-  // Validation function for enum elements.
-  ValidateEnumFunc validate_enum_func = nullptr;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(ContainerValidateParams);
-};
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_VALIDATE_PARAMS_H_
diff --git a/mojo/public/cpp/bindings/lib/validation_context.cc b/mojo/public/cpp/bindings/lib/validation_context.cc
deleted file mode 100644
index ad0a364..0000000
--- a/mojo/public/cpp/bindings/lib/validation_context.cc
+++ /dev/null
@@ -1,50 +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 "mojo/public/cpp/bindings/lib/validation_context.h"
-
-#include "base/logging.h"
-
-namespace mojo {
-namespace internal {
-
-ValidationContext::ValidationContext(const void* data,
-                                     size_t data_num_bytes,
-                                     size_t num_handles,
-                                     size_t num_associated_endpoint_handles,
-                                     Message* message,
-                                     const base::StringPiece& description,
-                                     int stack_depth)
-    : message_(message),
-      description_(description),
-      data_begin_(reinterpret_cast<uintptr_t>(data)),
-      data_end_(data_begin_ + data_num_bytes),
-      handle_begin_(0),
-      handle_end_(static_cast<uint32_t>(num_handles)),
-      associated_endpoint_handle_begin_(0),
-      associated_endpoint_handle_end_(
-          static_cast<uint32_t>(num_associated_endpoint_handles)),
-      stack_depth_(stack_depth) {
-  // Check whether the calculation of |data_end_| or static_cast from size_t to
-  // uint32_t causes overflow.
-  // They shouldn't happen but they do, set the corresponding range to empty.
-  if (data_end_ < data_begin_) {
-    NOTREACHED();
-    data_end_ = data_begin_;
-  }
-  if (handle_end_ < num_handles) {
-    NOTREACHED();
-    handle_end_ = 0;
-  }
-  if (associated_endpoint_handle_end_ < num_associated_endpoint_handles) {
-    NOTREACHED();
-    associated_endpoint_handle_end_ = 0;
-  }
-}
-
-ValidationContext::~ValidationContext() {
-}
-
-}  // namespace internal
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/validation_context.h b/mojo/public/cpp/bindings/lib/validation_context.h
deleted file mode 100644
index ed6c654..0000000
--- a/mojo/public/cpp/bindings/lib/validation_context.h
+++ /dev/null
@@ -1,169 +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 MOJO_PUBLIC_CPP_BINDINGS_LIB_VALIDATION_CONTEXT_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_VALIDATION_CONTEXT_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include "base/compiler_specific.h"
-#include "base/macros.h"
-#include "base/strings/string_piece.h"
-#include "mojo/public/cpp/bindings/bindings_export.h"
-#include "mojo/public/cpp/bindings/lib/bindings_internal.h"
-
-static const int kMaxRecursionDepth = 100;
-
-namespace mojo {
-
-class Message;
-
-namespace internal {
-
-// ValidationContext is used when validating object sizes, pointers and handle
-// indices in the payload of incoming messages.
-class MOJO_CPP_BINDINGS_EXPORT ValidationContext {
- public:
-  // [data, data + data_num_bytes) specifies the initial valid memory range.
-  // [0, num_handles) specifies the initial valid range of handle indices.
-  // [0, num_associated_endpoint_handles) specifies the initial valid range of
-  // associated endpoint handle indices.
-  //
-  // If provided, |message| and |description| provide additional information
-  // to use when reporting validation errors. In addition if |message| is
-  // provided, the MojoNotifyBadMessage API will be used to notify the system of
-  // such errors.
-  ValidationContext(const void* data,
-                    size_t data_num_bytes,
-                    size_t num_handles,
-                    size_t num_associated_endpoint_handles,
-                    Message* message = nullptr,
-                    const base::StringPiece& description = "",
-                    int stack_depth = 0);
-
-  ~ValidationContext();
-
-  // Claims the specified memory range.
-  // The method succeeds if the range is valid to claim. (Please see
-  // the comments for IsValidRange().)
-  // On success, the valid memory range is shrinked to begin right after the end
-  // of the claimed range.
-  bool ClaimMemory(const void* position, uint32_t num_bytes) {
-    uintptr_t begin = reinterpret_cast<uintptr_t>(position);
-    uintptr_t end = begin + num_bytes;
-
-    if (!InternalIsValidRange(begin, end))
-      return false;
-
-    data_begin_ = end;
-    return true;
-  }
-
-  // Claims the specified encoded handle (which is basically a handle index).
-  // The method succeeds if:
-  // - |encoded_handle|'s value is |kEncodedInvalidHandleValue|.
-  // - the handle is contained inside the valid range of handle indices. In this
-  // case, the valid range is shinked to begin right after the claimed handle.
-  bool ClaimHandle(const Handle_Data& encoded_handle) {
-    uint32_t index = encoded_handle.value;
-    if (index == kEncodedInvalidHandleValue)
-      return true;
-
-    if (index < handle_begin_ || index >= handle_end_)
-      return false;
-
-    // |index| + 1 shouldn't overflow, because |index| is not the max value of
-    // uint32_t (it is less than |handle_end_|).
-    handle_begin_ = index + 1;
-    return true;
-  }
-
-  // Claims the specified encoded associated endpoint handle.
-  // The method succeeds if:
-  // - |encoded_handle|'s value is |kEncodedInvalidHandleValue|.
-  // - the handle is contained inside the valid range of associated endpoint
-  //   handle indices. In this case, the valid range is shinked to begin right
-  //   after the claimed handle.
-  bool ClaimAssociatedEndpointHandle(
-      const AssociatedEndpointHandle_Data& encoded_handle) {
-    uint32_t index = encoded_handle.value;
-    if (index == kEncodedInvalidHandleValue)
-      return true;
-
-    if (index < associated_endpoint_handle_begin_ ||
-        index >= associated_endpoint_handle_end_)
-      return false;
-
-    // |index| + 1 shouldn't overflow, because |index| is not the max value of
-    // uint32_t (it is less than |associated_endpoint_handle_end_|).
-    associated_endpoint_handle_begin_ = index + 1;
-    return true;
-  }
-
-  // Returns true if the specified range is not empty, and the range is
-  // contained inside the valid memory range.
-  bool IsValidRange(const void* position, uint32_t num_bytes) const {
-    uintptr_t begin = reinterpret_cast<uintptr_t>(position);
-    uintptr_t end = begin + num_bytes;
-
-    return InternalIsValidRange(begin, end);
-  }
-
-  // This object should be created on the stack once every time we recurse down
-  // into a subfield during validation to make sure we don't recurse too deep
-  // and blow the stack.
-  class ScopedDepthTracker {
-   public:
-    // |ctx| must outlive this object.
-    explicit ScopedDepthTracker(ValidationContext* ctx) : ctx_(ctx) {
-      ++ctx_->stack_depth_;
-    }
-
-    ~ScopedDepthTracker() { --ctx_->stack_depth_; }
-
-   private:
-    ValidationContext* ctx_;
-
-    DISALLOW_COPY_AND_ASSIGN(ScopedDepthTracker);
-  };
-
-  // Returns true if the recursion depth limit has been reached.
-  bool ExceedsMaxDepth() WARN_UNUSED_RESULT {
-    return stack_depth_ > kMaxRecursionDepth;
-  }
-
-  Message* message() const { return message_; }
-  const base::StringPiece& description() const { return description_; }
-
- private:
-  bool InternalIsValidRange(uintptr_t begin, uintptr_t end) const {
-    return end > begin && begin >= data_begin_ && end <= data_end_;
-  }
-
-  Message* const message_;
-  const base::StringPiece description_;
-
-  // [data_begin_, data_end_) is the valid memory range.
-  uintptr_t data_begin_;
-  uintptr_t data_end_;
-
-  // [handle_begin_, handle_end_) is the valid handle index range.
-  uint32_t handle_begin_;
-  uint32_t handle_end_;
-
-  // [associated_endpoint_handle_begin_, associated_endpoint_handle_end_) is the
-  // valid associated endpoint handle index range.
-  uint32_t associated_endpoint_handle_begin_;
-  uint32_t associated_endpoint_handle_end_;
-
-  int stack_depth_;
-
-  DISALLOW_COPY_AND_ASSIGN(ValidationContext);
-};
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_VALIDATION_CONTEXT_H_
diff --git a/mojo/public/cpp/bindings/lib/validation_errors.cc b/mojo/public/cpp/bindings/lib/validation_errors.cc
deleted file mode 100644
index 904f5e4..0000000
--- a/mojo/public/cpp/bindings/lib/validation_errors.cc
+++ /dev/null
@@ -1,150 +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 "mojo/public/cpp/bindings/lib/validation_errors.h"
-
-#include "base/strings/stringprintf.h"
-#include "mojo/public/cpp/bindings/message.h"
-
-namespace mojo {
-namespace internal {
-namespace {
-
-ValidationErrorObserverForTesting* g_validation_error_observer = nullptr;
-SerializationWarningObserverForTesting* g_serialization_warning_observer =
-    nullptr;
-bool g_suppress_logging = false;
-
-}  // namespace
-
-const char* ValidationErrorToString(ValidationError error) {
-  switch (error) {
-    case VALIDATION_ERROR_NONE:
-      return "VALIDATION_ERROR_NONE";
-    case VALIDATION_ERROR_MISALIGNED_OBJECT:
-      return "VALIDATION_ERROR_MISALIGNED_OBJECT";
-    case VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE:
-      return "VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE";
-    case VALIDATION_ERROR_UNEXPECTED_STRUCT_HEADER:
-      return "VALIDATION_ERROR_UNEXPECTED_STRUCT_HEADER";
-    case VALIDATION_ERROR_UNEXPECTED_ARRAY_HEADER:
-      return "VALIDATION_ERROR_UNEXPECTED_ARRAY_HEADER";
-    case VALIDATION_ERROR_ILLEGAL_HANDLE:
-      return "VALIDATION_ERROR_ILLEGAL_HANDLE";
-    case VALIDATION_ERROR_UNEXPECTED_INVALID_HANDLE:
-      return "VALIDATION_ERROR_UNEXPECTED_INVALID_HANDLE";
-    case VALIDATION_ERROR_ILLEGAL_POINTER:
-      return "VALIDATION_ERROR_ILLEGAL_POINTER";
-    case VALIDATION_ERROR_UNEXPECTED_NULL_POINTER:
-      return "VALIDATION_ERROR_UNEXPECTED_NULL_POINTER";
-    case VALIDATION_ERROR_ILLEGAL_INTERFACE_ID:
-      return "VALIDATION_ERROR_ILLEGAL_INTERFACE_ID";
-    case VALIDATION_ERROR_UNEXPECTED_INVALID_INTERFACE_ID:
-      return "VALIDATION_ERROR_UNEXPECTED_INVALID_INTERFACE_ID";
-    case VALIDATION_ERROR_MESSAGE_HEADER_INVALID_FLAGS:
-      return "VALIDATION_ERROR_MESSAGE_HEADER_INVALID_FLAGS";
-    case VALIDATION_ERROR_MESSAGE_HEADER_MISSING_REQUEST_ID:
-      return "VALIDATION_ERROR_MESSAGE_HEADER_MISSING_REQUEST_ID";
-    case VALIDATION_ERROR_MESSAGE_HEADER_UNKNOWN_METHOD:
-      return "VALIDATION_ERROR_MESSAGE_HEADER_UNKNOWN_METHOD";
-    case VALIDATION_ERROR_DIFFERENT_SIZED_ARRAYS_IN_MAP:
-      return "VALIDATION_ERROR_DIFFERENT_SIZED_ARRAYS_IN_MAP";
-    case VALIDATION_ERROR_UNKNOWN_UNION_TAG:
-      return "VALIDATION_ERROR_UNKNOWN_UNION_TAG";
-    case VALIDATION_ERROR_UNKNOWN_ENUM_VALUE:
-      return "VALIDATION_ERROR_UNKNOWN_ENUM_VALUE";
-    case VALIDATION_ERROR_DESERIALIZATION_FAILED:
-      return "VALIDATION_ERROR_DESERIALIZATION_FAILED";
-    case VALIDATION_ERROR_MAX_RECURSION_DEPTH:
-      return "VALIDATION_ERROR_MAX_RECURSION_DEPTH";
-  }
-
-  return "Unknown error";
-}
-
-void ReportValidationError(ValidationContext* context,
-                           ValidationError error,
-                           const char* description) {
-  if (g_validation_error_observer) {
-    g_validation_error_observer->set_last_error(error);
-    return;
-  }
-
-  if (description) {
-    if (!g_suppress_logging) {
-      LOG(ERROR) << "Invalid message: " << ValidationErrorToString(error)
-                 << " (" << description << ")";
-    }
-    if (context->message()) {
-      context->message()->NotifyBadMessage(
-          base::StringPrintf("Validation failed for %s [%s (%s)]",
-                             context->description().data(),
-                             ValidationErrorToString(error), description));
-    }
-  } else {
-    if (!g_suppress_logging)
-      LOG(ERROR) << "Invalid message: " << ValidationErrorToString(error);
-    if (context->message()) {
-      context->message()->NotifyBadMessage(
-          base::StringPrintf("Validation failed for %s [%s]",
-                             context->description().data(),
-                             ValidationErrorToString(error)));
-    }
-  }
-}
-
-void ReportValidationErrorForMessage(
-    mojo::Message* message,
-    ValidationError error,
-    const char* description) {
-  ValidationContext validation_context(nullptr, 0, 0, 0, message, description);
-  ReportValidationError(&validation_context, error);
-}
-
-ScopedSuppressValidationErrorLoggingForTests
-    ::ScopedSuppressValidationErrorLoggingForTests()
-    : was_suppressed_(g_suppress_logging) {
-  g_suppress_logging = true;
-}
-
-ScopedSuppressValidationErrorLoggingForTests
-    ::~ScopedSuppressValidationErrorLoggingForTests() {
-  g_suppress_logging = was_suppressed_;
-}
-
-ValidationErrorObserverForTesting::ValidationErrorObserverForTesting(
-    const base::Closure& callback)
-    : last_error_(VALIDATION_ERROR_NONE), callback_(callback) {
-  DCHECK(!g_validation_error_observer);
-  g_validation_error_observer = this;
-}
-
-ValidationErrorObserverForTesting::~ValidationErrorObserverForTesting() {
-  DCHECK(g_validation_error_observer == this);
-  g_validation_error_observer = nullptr;
-}
-
-bool ReportSerializationWarning(ValidationError error) {
-  if (g_serialization_warning_observer) {
-    g_serialization_warning_observer->set_last_warning(error);
-    return true;
-  }
-
-  return false;
-}
-
-SerializationWarningObserverForTesting::SerializationWarningObserverForTesting()
-    : last_warning_(VALIDATION_ERROR_NONE) {
-  DCHECK(!g_serialization_warning_observer);
-  g_serialization_warning_observer = this;
-}
-
-SerializationWarningObserverForTesting::
-    ~SerializationWarningObserverForTesting() {
-  DCHECK(g_serialization_warning_observer == this);
-  g_serialization_warning_observer = nullptr;
-}
-
-}  // namespace internal
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/validation_errors.h b/mojo/public/cpp/bindings/lib/validation_errors.h
deleted file mode 100644
index 122418d..0000000
--- a/mojo/public/cpp/bindings/lib/validation_errors.h
+++ /dev/null
@@ -1,167 +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 MOJO_PUBLIC_CPP_BINDINGS_LIB_VALIDATION_ERRORS_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_VALIDATION_ERRORS_H_
-
-#include "base/callback.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "mojo/public/cpp/bindings/bindings_export.h"
-#include "mojo/public/cpp/bindings/lib/validation_context.h"
-
-namespace mojo {
-
-class Message;
-
-namespace internal {
-
-enum ValidationError {
-  // There is no validation error.
-  VALIDATION_ERROR_NONE,
-  // An object (struct or array) is not 8-byte aligned.
-  VALIDATION_ERROR_MISALIGNED_OBJECT,
-  // An object is not contained inside the message data, or it overlaps other
-  // objects.
-  VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE,
-  // A struct header doesn't make sense, for example:
-  // - |num_bytes| is smaller than the size of the struct header.
-  // - |num_bytes| and |version| don't match.
-  // TODO(yzshen): Consider splitting it into two different error codes. Because
-  // the former indicates someone is misbehaving badly whereas the latter could
-  // be due to an inappropriately-modified .mojom file.
-  VALIDATION_ERROR_UNEXPECTED_STRUCT_HEADER,
-  // An array header doesn't make sense, for example:
-  // - |num_bytes| is smaller than the size of the header plus the size required
-  // to store |num_elements| elements.
-  // - For fixed-size arrays, |num_elements| is different than the specified
-  // size.
-  VALIDATION_ERROR_UNEXPECTED_ARRAY_HEADER,
-  // An encoded handle is illegal.
-  VALIDATION_ERROR_ILLEGAL_HANDLE,
-  // A non-nullable handle field is set to invalid handle.
-  VALIDATION_ERROR_UNEXPECTED_INVALID_HANDLE,
-  // An encoded pointer is illegal.
-  VALIDATION_ERROR_ILLEGAL_POINTER,
-  // A non-nullable pointer field is set to null.
-  VALIDATION_ERROR_UNEXPECTED_NULL_POINTER,
-  // An interface ID is illegal.
-  VALIDATION_ERROR_ILLEGAL_INTERFACE_ID,
-  // A non-nullable interface ID field is set to invalid.
-  VALIDATION_ERROR_UNEXPECTED_INVALID_INTERFACE_ID,
-  // |flags| in the message header is invalid. The flags are either
-  // inconsistent with one another, inconsistent with other parts of the
-  // message, or unexpected for the message receiver.  For example the
-  // receiver is expecting a request message but the flags indicate that
-  // the message is a response message.
-  VALIDATION_ERROR_MESSAGE_HEADER_INVALID_FLAGS,
-  // |flags| in the message header indicates that a request ID is required but
-  // there isn't one.
-  VALIDATION_ERROR_MESSAGE_HEADER_MISSING_REQUEST_ID,
-  // The |name| field in a message header contains an unexpected value.
-  VALIDATION_ERROR_MESSAGE_HEADER_UNKNOWN_METHOD,
-  // Two parallel arrays which are supposed to represent a map have different
-  // lengths.
-  VALIDATION_ERROR_DIFFERENT_SIZED_ARRAYS_IN_MAP,
-  // Attempted to deserialize a tagged union with an unknown tag.
-  VALIDATION_ERROR_UNKNOWN_UNION_TAG,
-  // A value of a non-extensible enum type is unknown.
-  VALIDATION_ERROR_UNKNOWN_ENUM_VALUE,
-  // Message deserialization failure, for example due to rejection by custom
-  // validation logic.
-  VALIDATION_ERROR_DESERIALIZATION_FAILED,
-  // The message contains a too deeply nested value, for example a recursively
-  // defined field which runtime value is too large.
-  VALIDATION_ERROR_MAX_RECURSION_DEPTH,
-};
-
-MOJO_CPP_BINDINGS_EXPORT const char* ValidationErrorToString(
-    ValidationError error);
-
-MOJO_CPP_BINDINGS_EXPORT void ReportValidationError(
-    ValidationContext* context,
-    ValidationError error,
-    const char* description = nullptr);
-
-MOJO_CPP_BINDINGS_EXPORT void ReportValidationErrorForMessage(
-    mojo::Message* message,
-    ValidationError error,
-    const char* description = nullptr);
-
-// This class may be used by tests to suppress validation error logging. This is
-// not thread-safe and must only be instantiated on the main thread with no
-// other threads using Mojo bindings at the time of construction or destruction.
-class MOJO_CPP_BINDINGS_EXPORT ScopedSuppressValidationErrorLoggingForTests {
- public:
-  ScopedSuppressValidationErrorLoggingForTests();
-  ~ScopedSuppressValidationErrorLoggingForTests();
-
- private:
-  const bool was_suppressed_;
-
-  DISALLOW_COPY_AND_ASSIGN(ScopedSuppressValidationErrorLoggingForTests);
-};
-
-// Only used by validation tests and when there is only one thread doing message
-// validation.
-class MOJO_CPP_BINDINGS_EXPORT ValidationErrorObserverForTesting {
- public:
-  explicit ValidationErrorObserverForTesting(const base::Closure& callback);
-  ~ValidationErrorObserverForTesting();
-
-  ValidationError last_error() const { return last_error_; }
-  void set_last_error(ValidationError error) {
-    last_error_ = error;
-    callback_.Run();
-  }
-
- private:
-  ValidationError last_error_;
-  base::Closure callback_;
-
-  DISALLOW_COPY_AND_ASSIGN(ValidationErrorObserverForTesting);
-};
-
-// Used only by MOJO_INTERNAL_DLOG_SERIALIZATION_WARNING. Don't use it directly.
-//
-// The function returns true if the error is recorded (by a
-// SerializationWarningObserverForTesting object), false otherwise.
-MOJO_CPP_BINDINGS_EXPORT bool ReportSerializationWarning(ValidationError error);
-
-// Only used by serialization tests and when there is only one thread doing
-// message serialization.
-class MOJO_CPP_BINDINGS_EXPORT SerializationWarningObserverForTesting {
- public:
-  SerializationWarningObserverForTesting();
-  ~SerializationWarningObserverForTesting();
-
-  ValidationError last_warning() const { return last_warning_; }
-  void set_last_warning(ValidationError error) { last_warning_ = error; }
-
- private:
-  ValidationError last_warning_;
-
-  DISALLOW_COPY_AND_ASSIGN(SerializationWarningObserverForTesting);
-};
-
-}  // namespace internal
-}  // namespace mojo
-
-// In debug build, logs a serialization warning if |condition| evaluates to
-// true:
-//   - if there is a SerializationWarningObserverForTesting object alive,
-//     records |error| in it;
-//   - otherwise, logs a fatal-level message.
-// |error| is the validation error that will be triggered by the receiver
-// of the serialzation result.
-//
-// In non-debug build, does nothing (not even compiling |condition|).
-#define MOJO_INTERNAL_DLOG_SERIALIZATION_WARNING(condition, error,    \
-                                                 description)         \
-  DLOG_IF(FATAL, (condition) && !ReportSerializationWarning(error))   \
-      << "The outgoing message will trigger "                         \
-      << ValidationErrorToString(error) << " at the receiving side (" \
-      << description << ").";
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_VALIDATION_ERRORS_H_
diff --git a/mojo/public/cpp/bindings/lib/validation_util.cc b/mojo/public/cpp/bindings/lib/validation_util.cc
deleted file mode 100644
index 7614df5..0000000
--- a/mojo/public/cpp/bindings/lib/validation_util.cc
+++ /dev/null
@@ -1,210 +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 "mojo/public/cpp/bindings/lib/validation_util.h"
-
-#include <stdint.h>
-
-#include <limits>
-
-#include "mojo/public/cpp/bindings/lib/message_internal.h"
-#include "mojo/public/cpp/bindings/lib/serialization_util.h"
-#include "mojo/public/cpp/bindings/lib/validation_errors.h"
-#include "mojo/public/interfaces/bindings/interface_control_messages.mojom.h"
-
-namespace mojo {
-namespace internal {
-
-bool ValidateStructHeaderAndClaimMemory(const void* data,
-                                        ValidationContext* validation_context) {
-  if (!IsAligned(data)) {
-    ReportValidationError(validation_context,
-                          VALIDATION_ERROR_MISALIGNED_OBJECT);
-    return false;
-  }
-  if (!validation_context->IsValidRange(data, sizeof(StructHeader))) {
-    ReportValidationError(validation_context,
-                          VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE);
-    return false;
-  }
-
-  const StructHeader* header = static_cast<const StructHeader*>(data);
-
-  if (header->num_bytes < sizeof(StructHeader)) {
-    ReportValidationError(validation_context,
-                          VALIDATION_ERROR_UNEXPECTED_STRUCT_HEADER);
-    return false;
-  }
-
-  if (!validation_context->ClaimMemory(data, header->num_bytes)) {
-    ReportValidationError(validation_context,
-                          VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE);
-    return false;
-  }
-
-  return true;
-}
-
-bool ValidateNonInlinedUnionHeaderAndClaimMemory(
-    const void* data,
-    ValidationContext* validation_context) {
-  if (!IsAligned(data)) {
-    ReportValidationError(validation_context,
-                          VALIDATION_ERROR_MISALIGNED_OBJECT);
-    return false;
-  }
-
-  if (!validation_context->ClaimMemory(data, kUnionDataSize) ||
-      *static_cast<const uint32_t*>(data) != kUnionDataSize) {
-    ReportValidationError(validation_context,
-                          VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE);
-    return false;
-  }
-
-  return true;
-}
-
-bool ValidateMessageIsRequestWithoutResponse(
-    const Message* message,
-    ValidationContext* validation_context) {
-  if (message->has_flag(Message::kFlagIsResponse) ||
-      message->has_flag(Message::kFlagExpectsResponse)) {
-    ReportValidationError(validation_context,
-                          VALIDATION_ERROR_MESSAGE_HEADER_INVALID_FLAGS);
-    return false;
-  }
-  return true;
-}
-
-bool ValidateMessageIsRequestExpectingResponse(
-    const Message* message,
-    ValidationContext* validation_context) {
-  if (message->has_flag(Message::kFlagIsResponse) ||
-      !message->has_flag(Message::kFlagExpectsResponse)) {
-    ReportValidationError(validation_context,
-                          VALIDATION_ERROR_MESSAGE_HEADER_INVALID_FLAGS);
-    return false;
-  }
-  return true;
-}
-
-bool ValidateMessageIsResponse(const Message* message,
-                               ValidationContext* validation_context) {
-  if (message->has_flag(Message::kFlagExpectsResponse) ||
-      !message->has_flag(Message::kFlagIsResponse)) {
-    ReportValidationError(validation_context,
-                          VALIDATION_ERROR_MESSAGE_HEADER_INVALID_FLAGS);
-    return false;
-  }
-  return true;
-}
-
-bool IsHandleOrInterfaceValid(const AssociatedInterface_Data& input) {
-  return input.handle.is_valid();
-}
-
-bool IsHandleOrInterfaceValid(const AssociatedEndpointHandle_Data& input) {
-  return input.is_valid();
-}
-
-bool IsHandleOrInterfaceValid(const Interface_Data& input) {
-  return input.handle.is_valid();
-}
-
-bool IsHandleOrInterfaceValid(const Handle_Data& input) {
-  return input.is_valid();
-}
-
-bool ValidateHandleOrInterfaceNonNullable(
-    const AssociatedInterface_Data& input,
-    const char* error_message,
-    ValidationContext* validation_context) {
-  if (IsHandleOrInterfaceValid(input))
-    return true;
-
-  ReportValidationError(validation_context,
-                        VALIDATION_ERROR_UNEXPECTED_INVALID_INTERFACE_ID,
-                        error_message);
-  return false;
-}
-
-bool ValidateHandleOrInterfaceNonNullable(
-    const AssociatedEndpointHandle_Data& input,
-    const char* error_message,
-    ValidationContext* validation_context) {
-  if (IsHandleOrInterfaceValid(input))
-    return true;
-
-  ReportValidationError(validation_context,
-                        VALIDATION_ERROR_UNEXPECTED_INVALID_INTERFACE_ID,
-                        error_message);
-  return false;
-}
-
-bool ValidateHandleOrInterfaceNonNullable(
-    const Interface_Data& input,
-    const char* error_message,
-    ValidationContext* validation_context) {
-  if (IsHandleOrInterfaceValid(input))
-    return true;
-
-  ReportValidationError(validation_context,
-                        VALIDATION_ERROR_UNEXPECTED_INVALID_HANDLE,
-                        error_message);
-  return false;
-}
-
-bool ValidateHandleOrInterfaceNonNullable(
-    const Handle_Data& input,
-    const char* error_message,
-    ValidationContext* validation_context) {
-  if (IsHandleOrInterfaceValid(input))
-    return true;
-
-  ReportValidationError(validation_context,
-                        VALIDATION_ERROR_UNEXPECTED_INVALID_HANDLE,
-                        error_message);
-  return false;
-}
-
-bool ValidateHandleOrInterface(const AssociatedInterface_Data& input,
-                               ValidationContext* validation_context) {
-  if (validation_context->ClaimAssociatedEndpointHandle(input.handle))
-    return true;
-
-  ReportValidationError(validation_context,
-                        VALIDATION_ERROR_ILLEGAL_INTERFACE_ID);
-  return false;
-}
-
-bool ValidateHandleOrInterface(const AssociatedEndpointHandle_Data& input,
-                               ValidationContext* validation_context) {
-  if (validation_context->ClaimAssociatedEndpointHandle(input))
-    return true;
-
-  ReportValidationError(validation_context,
-                        VALIDATION_ERROR_ILLEGAL_INTERFACE_ID);
-  return false;
-}
-
-bool ValidateHandleOrInterface(const Interface_Data& input,
-                               ValidationContext* validation_context) {
-  if (validation_context->ClaimHandle(input.handle))
-    return true;
-
-  ReportValidationError(validation_context, VALIDATION_ERROR_ILLEGAL_HANDLE);
-  return false;
-}
-
-bool ValidateHandleOrInterface(const Handle_Data& input,
-                               ValidationContext* validation_context) {
-  if (validation_context->ClaimHandle(input))
-    return true;
-
-  ReportValidationError(validation_context, VALIDATION_ERROR_ILLEGAL_HANDLE);
-  return false;
-}
-
-}  // namespace internal
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/validation_util.h b/mojo/public/cpp/bindings/lib/validation_util.h
deleted file mode 100644
index ea5a991..0000000
--- a/mojo/public/cpp/bindings/lib/validation_util.h
+++ /dev/null
@@ -1,206 +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 MOJO_PUBLIC_CPP_BINDINGS_LIB_VALIDATION_UTIL_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_VALIDATION_UTIL_H_
-
-#include <stdint.h>
-
-#include "mojo/public/cpp/bindings/bindings_export.h"
-#include "mojo/public/cpp/bindings/lib/bindings_internal.h"
-#include "mojo/public/cpp/bindings/lib/serialization_util.h"
-#include "mojo/public/cpp/bindings/lib/validate_params.h"
-#include "mojo/public/cpp/bindings/lib/validation_context.h"
-#include "mojo/public/cpp/bindings/lib/validation_errors.h"
-#include "mojo/public/cpp/bindings/message.h"
-
-namespace mojo {
-namespace internal {
-
-// Checks whether decoding the pointer will overflow and produce a pointer
-// smaller than |offset|.
-inline bool ValidateEncodedPointer(const uint64_t* offset) {
-  // - Make sure |*offset| is no more than 32-bits.
-  // - Cast |offset| to uintptr_t so overflow behavior is well defined across
-  //   32-bit and 64-bit systems.
-  return *offset <= std::numeric_limits<uint32_t>::max() &&
-         (reinterpret_cast<uintptr_t>(offset) +
-              static_cast<uint32_t>(*offset) >=
-          reinterpret_cast<uintptr_t>(offset));
-}
-
-template <typename T>
-bool ValidatePointer(const Pointer<T>& input,
-                     ValidationContext* validation_context) {
-  bool result = ValidateEncodedPointer(&input.offset);
-  if (!result)
-    ReportValidationError(validation_context, VALIDATION_ERROR_ILLEGAL_POINTER);
-
-  return result;
-}
-
-// Validates that |data| contains a valid struct header, in terms of alignment
-// and size (i.e., the |num_bytes| field of the header is sufficient for storing
-// the header itself). Besides, it checks that the memory range
-// [data, data + num_bytes) is not marked as occupied by other objects in
-// |validation_context|. On success, the memory range is marked as occupied.
-// Note: Does not verify |version| or that |num_bytes| is correct for the
-// claimed version.
-MOJO_CPP_BINDINGS_EXPORT bool ValidateStructHeaderAndClaimMemory(
-    const void* data,
-    ValidationContext* validation_context);
-
-// Validates that |data| contains a valid union header, in terms of alignment
-// and size. It checks that the memory range [data, data + kUnionDataSize) is
-// not marked as occupied by other objects in |validation_context|. On success,
-// the memory range is marked as occupied.
-MOJO_CPP_BINDINGS_EXPORT bool ValidateNonInlinedUnionHeaderAndClaimMemory(
-    const void* data,
-    ValidationContext* validation_context);
-
-// Validates that the message is a request which doesn't expect a response.
-MOJO_CPP_BINDINGS_EXPORT bool ValidateMessageIsRequestWithoutResponse(
-    const Message* message,
-    ValidationContext* validation_context);
-
-// Validates that the message is a request expecting a response.
-MOJO_CPP_BINDINGS_EXPORT bool ValidateMessageIsRequestExpectingResponse(
-    const Message* message,
-    ValidationContext* validation_context);
-
-// Validates that the message is a response.
-MOJO_CPP_BINDINGS_EXPORT bool ValidateMessageIsResponse(
-    const Message* message,
-    ValidationContext* validation_context);
-
-// Validates that the message payload is a valid struct of type ParamsType.
-template <typename ParamsType>
-bool ValidateMessagePayload(const Message* message,
-                            ValidationContext* validation_context) {
-  return ParamsType::Validate(message->payload(), validation_context);
-}
-
-// The following Validate.*NonNullable() functions validate that the given
-// |input| is not null/invalid.
-template <typename T>
-bool ValidatePointerNonNullable(const T& input,
-                                const char* error_message,
-                                ValidationContext* validation_context) {
-  if (input.offset)
-    return true;
-
-  ReportValidationError(validation_context,
-                        VALIDATION_ERROR_UNEXPECTED_NULL_POINTER,
-                        error_message);
-  return false;
-}
-
-template <typename T>
-bool ValidateInlinedUnionNonNullable(const T& input,
-                                     const char* error_message,
-                                     ValidationContext* validation_context) {
-  if (!input.is_null())
-    return true;
-
-  ReportValidationError(validation_context,
-                        VALIDATION_ERROR_UNEXPECTED_NULL_POINTER,
-                        error_message);
-  return false;
-}
-
-MOJO_CPP_BINDINGS_EXPORT bool IsHandleOrInterfaceValid(
-    const AssociatedInterface_Data& input);
-MOJO_CPP_BINDINGS_EXPORT bool IsHandleOrInterfaceValid(
-    const AssociatedEndpointHandle_Data& input);
-MOJO_CPP_BINDINGS_EXPORT bool IsHandleOrInterfaceValid(
-    const Interface_Data& input);
-MOJO_CPP_BINDINGS_EXPORT bool IsHandleOrInterfaceValid(
-    const Handle_Data& input);
-
-MOJO_CPP_BINDINGS_EXPORT bool ValidateHandleOrInterfaceNonNullable(
-    const AssociatedInterface_Data& input,
-    const char* error_message,
-    ValidationContext* validation_context);
-MOJO_CPP_BINDINGS_EXPORT bool ValidateHandleOrInterfaceNonNullable(
-    const AssociatedEndpointHandle_Data& input,
-    const char* error_message,
-    ValidationContext* validation_context);
-MOJO_CPP_BINDINGS_EXPORT bool ValidateHandleOrInterfaceNonNullable(
-    const Interface_Data& input,
-    const char* error_message,
-    ValidationContext* validation_context);
-MOJO_CPP_BINDINGS_EXPORT bool ValidateHandleOrInterfaceNonNullable(
-    const Handle_Data& input,
-    const char* error_message,
-    ValidationContext* validation_context);
-
-template <typename T>
-bool ValidateContainer(const Pointer<T>& input,
-                       ValidationContext* validation_context,
-                       const ContainerValidateParams* validate_params) {
-  ValidationContext::ScopedDepthTracker depth_tracker(validation_context);
-  if (validation_context->ExceedsMaxDepth()) {
-    ReportValidationError(validation_context,
-                          VALIDATION_ERROR_MAX_RECURSION_DEPTH);
-    return false;
-  }
-  return ValidatePointer(input, validation_context) &&
-         T::Validate(input.Get(), validation_context, validate_params);
-}
-
-template <typename T>
-bool ValidateStruct(const Pointer<T>& input,
-                    ValidationContext* validation_context) {
-  ValidationContext::ScopedDepthTracker depth_tracker(validation_context);
-  if (validation_context->ExceedsMaxDepth()) {
-    ReportValidationError(validation_context,
-                          VALIDATION_ERROR_MAX_RECURSION_DEPTH);
-    return false;
-  }
-  return ValidatePointer(input, validation_context) &&
-         T::Validate(input.Get(), validation_context);
-}
-
-template <typename T>
-bool ValidateInlinedUnion(const T& input,
-                          ValidationContext* validation_context) {
-  ValidationContext::ScopedDepthTracker depth_tracker(validation_context);
-  if (validation_context->ExceedsMaxDepth()) {
-    ReportValidationError(validation_context,
-                          VALIDATION_ERROR_MAX_RECURSION_DEPTH);
-    return false;
-  }
-  return T::Validate(&input, validation_context, true);
-}
-
-template <typename T>
-bool ValidateNonInlinedUnion(const Pointer<T>& input,
-                             ValidationContext* validation_context) {
-  ValidationContext::ScopedDepthTracker depth_tracker(validation_context);
-  if (validation_context->ExceedsMaxDepth()) {
-    ReportValidationError(validation_context,
-                          VALIDATION_ERROR_MAX_RECURSION_DEPTH);
-    return false;
-  }
-  return ValidatePointer(input, validation_context) &&
-         T::Validate(input.Get(), validation_context, false);
-}
-
-MOJO_CPP_BINDINGS_EXPORT bool ValidateHandleOrInterface(
-    const AssociatedInterface_Data& input,
-    ValidationContext* validation_context);
-MOJO_CPP_BINDINGS_EXPORT bool ValidateHandleOrInterface(
-    const AssociatedEndpointHandle_Data& input,
-    ValidationContext* validation_context);
-MOJO_CPP_BINDINGS_EXPORT bool ValidateHandleOrInterface(
-    const Interface_Data& input,
-    ValidationContext* validation_context);
-MOJO_CPP_BINDINGS_EXPORT bool ValidateHandleOrInterface(
-    const Handle_Data& input,
-    ValidationContext* validation_context);
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_VALIDATION_UTIL_H_
diff --git a/mojo/public/cpp/bindings/lib/wtf_clone_equals_util.h b/mojo/public/cpp/bindings/lib/wtf_clone_equals_util.h
deleted file mode 100644
index cb24bc4..0000000
--- a/mojo/public/cpp/bindings/lib/wtf_clone_equals_util.h
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_WTF_CLONE_EQUALS_UTIL_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_WTF_CLONE_EQUALS_UTIL_H_
-
-#include <type_traits>
-
-#include "mojo/public/cpp/bindings/clone_traits.h"
-#include "mojo/public/cpp/bindings/lib/equals_traits.h"
-#include "third_party/WebKit/Source/wtf/HashMap.h"
-#include "third_party/WebKit/Source/wtf/Optional.h"
-#include "third_party/WebKit/Source/wtf/Vector.h"
-#include "third_party/WebKit/Source/wtf/text/WTFString.h"
-
-namespace mojo {
-
-template <typename T>
-struct CloneTraits<WTF::Vector<T>, false> {
-  static WTF::Vector<T> Clone(const WTF::Vector<T>& input) {
-    WTF::Vector<T> result;
-    result.reserveCapacity(input.size());
-    for (const auto& element : input)
-      result.push_back(mojo::Clone(element));
-
-    return result;
-  }
-};
-
-template <typename K, typename V>
-struct CloneTraits<WTF::HashMap<K, V>, false> {
-  static WTF::HashMap<K, V> Clone(const WTF::HashMap<K, V>& input) {
-    WTF::HashMap<K, V> result;
-    auto input_end = input.end();
-    for (auto it = input.begin(); it != input_end; ++it)
-      result.add(mojo::Clone(it->key), mojo::Clone(it->value));
-    return result;
-  }
-};
-
-namespace internal {
-
-template <typename T>
-struct EqualsTraits<WTF::Vector<T>, false> {
-  static bool Equals(const WTF::Vector<T>& a, const WTF::Vector<T>& b) {
-    if (a.size() != b.size())
-      return false;
-    for (size_t i = 0; i < a.size(); ++i) {
-      if (!internal::Equals(a[i], b[i]))
-        return false;
-    }
-    return true;
-  }
-};
-
-template <typename K, typename V>
-struct EqualsTraits<WTF::HashMap<K, V>, false> {
-  static bool Equals(const WTF::HashMap<K, V>& a, const WTF::HashMap<K, V>& b) {
-    if (a.size() != b.size())
-      return false;
-
-    auto a_end = a.end();
-    auto b_end = b.end();
-
-    for (auto iter = a.begin(); iter != a_end; ++iter) {
-      auto b_iter = b.find(iter->key);
-      if (b_iter == b_end || !internal::Equals(iter->value, b_iter->value))
-        return false;
-    }
-    return true;
-  }
-};
-
-}  // namespace internal
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_WTF_CLONE_EQUALS_UTIL_H_
diff --git a/mojo/public/cpp/bindings/lib/wtf_hash_util.h b/mojo/public/cpp/bindings/lib/wtf_hash_util.h
deleted file mode 100644
index cc590da..0000000
--- a/mojo/public/cpp/bindings/lib/wtf_hash_util.h
+++ /dev/null
@@ -1,132 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_WTF_HASH_UTIL_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_WTF_HASH_UTIL_H_
-
-#include <type_traits>
-
-#include "mojo/public/cpp/bindings/lib/hash_util.h"
-#include "mojo/public/cpp/bindings/struct_ptr.h"
-#include "third_party/WebKit/Source/wtf/HashFunctions.h"
-#include "third_party/WebKit/Source/wtf/text/StringHash.h"
-#include "third_party/WebKit/Source/wtf/text/WTFString.h"
-
-namespace mojo {
-namespace internal {
-
-template <typename T>
-size_t WTFHashCombine(size_t seed, const T& value) {
-  // Based on proposal in:
-  // http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2005/n1756.pdf
-  //
-  // TODO(tibell): We'd like to use WTF::DefaultHash instead of std::hash, but
-  //     there is no general template specialization of DefaultHash for enums
-  //     and there can't be an instance for bool.
-  return seed ^ (std::hash<T>()(value) + (seed << 6) + (seed >> 2));
-}
-
-template <typename T, bool has_hash_method = HasHashMethod<T>::value>
-struct WTFHashTraits;
-
-template <typename T>
-size_t WTFHash(size_t seed, const T& value);
-
-template <typename T>
-struct WTFHashTraits<T, true> {
-  static size_t Hash(size_t seed, const T& value) { return value.Hash(seed); }
-};
-
-template <typename T>
-struct WTFHashTraits<T, false> {
-  static size_t Hash(size_t seed, const T& value) {
-    return WTFHashCombine(seed, value);
-  }
-};
-
-template <>
-struct WTFHashTraits<WTF::String, false> {
-  static size_t Hash(size_t seed, const WTF::String& value) {
-    return HashCombine(seed, WTF::StringHash::hash(value));
-  }
-};
-
-template <typename T>
-size_t WTFHash(size_t seed, const T& value) {
-  return WTFHashTraits<T>::Hash(seed, value);
-}
-
-template <typename T>
-struct StructPtrHashFn {
-  static unsigned hash(const StructPtr<T>& value) {
-    return value.Hash(kHashSeed);
-  }
-  static bool equal(const StructPtr<T>& left, const StructPtr<T>& right) {
-    return left.Equals(right);
-  }
-  static const bool safeToCompareToEmptyOrDeleted = false;
-};
-
-template <typename T>
-struct InlinedStructPtrHashFn {
-  static unsigned hash(const InlinedStructPtr<T>& value) {
-    return value.Hash(kHashSeed);
-  }
-  static bool equal(const InlinedStructPtr<T>& left,
-                    const InlinedStructPtr<T>& right) {
-    return left.Equals(right);
-  }
-  static const bool safeToCompareToEmptyOrDeleted = false;
-};
-
-}  // namespace internal
-}  // namespace mojo
-
-namespace WTF {
-
-template <typename T>
-struct DefaultHash<mojo::StructPtr<T>> {
-  using Hash = mojo::internal::StructPtrHashFn<T>;
-};
-
-template <typename T>
-struct HashTraits<mojo::StructPtr<T>>
-    : public GenericHashTraits<mojo::StructPtr<T>> {
-  static const bool hasIsEmptyValueFunction = true;
-  static bool isEmptyValue(const mojo::StructPtr<T>& value) {
-    return value.is_null();
-  }
-  static void constructDeletedValue(mojo::StructPtr<T>& slot, bool) {
-    mojo::internal::StructPtrWTFHelper<T>::ConstructDeletedValue(slot);
-  }
-  static bool isDeletedValue(const mojo::StructPtr<T>& value) {
-    return mojo::internal::StructPtrWTFHelper<T>::IsHashTableDeletedValue(
-        value);
-  }
-};
-
-template <typename T>
-struct DefaultHash<mojo::InlinedStructPtr<T>> {
-  using Hash = mojo::internal::InlinedStructPtrHashFn<T>;
-};
-
-template <typename T>
-struct HashTraits<mojo::InlinedStructPtr<T>>
-    : public GenericHashTraits<mojo::InlinedStructPtr<T>> {
-  static const bool hasIsEmptyValueFunction = true;
-  static bool isEmptyValue(const mojo::InlinedStructPtr<T>& value) {
-    return value.is_null();
-  }
-  static void constructDeletedValue(mojo::InlinedStructPtr<T>& slot, bool) {
-    mojo::internal::InlinedStructPtrWTFHelper<T>::ConstructDeletedValue(slot);
-  }
-  static bool isDeletedValue(const mojo::InlinedStructPtr<T>& value) {
-    return mojo::internal::InlinedStructPtrWTFHelper<
-        T>::IsHashTableDeletedValue(value);
-  }
-};
-
-}  // namespace WTF
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_WTF_HASH_UTIL_H_
diff --git a/mojo/public/cpp/bindings/lib/wtf_serialization.h b/mojo/public/cpp/bindings/lib/wtf_serialization.h
deleted file mode 100644
index 0f112b9..0000000
--- a/mojo/public/cpp/bindings/lib/wtf_serialization.h
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_WTF_SERIALIZATION_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_LIB_WTF_SERIALIZATION_H_
-
-#include "mojo/public/cpp/bindings/array_traits_wtf_vector.h"
-#include "mojo/public/cpp/bindings/map_traits_wtf_hash_map.h"
-#include "mojo/public/cpp/bindings/string_traits_wtf.h"
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_WTF_SERIALIZATION_H_
diff --git a/mojo/public/cpp/bindings/map.h b/mojo/public/cpp/bindings/map.h
deleted file mode 100644
index c1ba075..0000000
--- a/mojo/public/cpp/bindings/map.h
+++ /dev/null
@@ -1,42 +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 MOJO_PUBLIC_CPP_BINDINGS_MAP_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_MAP_H_
-
-#include <map>
-#include <unordered_map>
-#include <utility>
-
-namespace mojo {
-
-// TODO(yzshen): These conversion functions should be removed and callsites
-// should be revisited and changed to use the same map type.
-template <typename Key, typename Value>
-std::unordered_map<Key, Value> MapToUnorderedMap(
-    const std::map<Key, Value>& input) {
-  return std::unordered_map<Key, Value>(input.begin(), input.end());
-}
-
-template <typename Key, typename Value>
-std::unordered_map<Key, Value> MapToUnorderedMap(std::map<Key, Value>&& input) {
-  return std::unordered_map<Key, Value>(std::make_move_iterator(input.begin()),
-                                        std::make_move_iterator(input.end()));
-}
-
-template <typename Key, typename Value>
-std::map<Key, Value> UnorderedMapToMap(
-    const std::unordered_map<Key, Value>& input) {
-  return std::map<Key, Value>(input.begin(), input.end());
-}
-
-template <typename Key, typename Value>
-std::map<Key, Value> UnorderedMapToMap(std::unordered_map<Key, Value>&& input) {
-  return std::map<Key, Value>(std::make_move_iterator(input.begin()),
-                              std::make_move_iterator(input.end()));
-}
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_MAP_H_
diff --git a/mojo/public/cpp/bindings/map_data_view.h b/mojo/public/cpp/bindings/map_data_view.h
deleted file mode 100644
index a65bb9e..0000000
--- a/mojo/public/cpp/bindings/map_data_view.h
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_MAP_DATA_VIEW_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_MAP_DATA_VIEW_H_
-
-#include "base/logging.h"
-#include "mojo/public/cpp/bindings/array_data_view.h"
-#include "mojo/public/cpp/bindings/lib/bindings_internal.h"
-#include "mojo/public/cpp/bindings/lib/map_data_internal.h"
-#include "mojo/public/cpp/bindings/lib/serialization_context.h"
-#include "mojo/public/cpp/bindings/lib/serialization_forward.h"
-
-namespace mojo {
-
-template <typename K, typename V>
-class MapDataView {
- public:
-  using Data_ = typename internal::MojomTypeTraits<MapDataView<K, V>>::Data;
-
-  MapDataView() {}
-
-  MapDataView(Data_* data, internal::SerializationContext* context)
-      : keys_(data ? data->keys.Get() : nullptr, context),
-        values_(data ? data->values.Get() : nullptr, context) {}
-
-  bool is_null() const {
-    DCHECK_EQ(keys_.is_null(), values_.is_null());
-    return keys_.is_null();
-  }
-
-  size_t size() const {
-    DCHECK_EQ(keys_.size(), values_.size());
-    return keys_.size();
-  }
-
-  ArrayDataView<K>& keys() { return keys_; }
-  const ArrayDataView<K>& keys() const { return keys_; }
-
-  template <typename U>
-  bool ReadKeys(U* output) {
-    return internal::Deserialize<ArrayDataView<K>>(keys_.data_, output,
-                                                   keys_.context_);
-  }
-
-  ArrayDataView<V>& values() { return values_; }
-  const ArrayDataView<V>& values() const { return values_; }
-
-  template <typename U>
-  bool ReadValues(U* output) {
-    return internal::Deserialize<ArrayDataView<V>>(values_.data_, output,
-                                                   values_.context_);
-  }
-
- private:
-  ArrayDataView<K> keys_;
-  ArrayDataView<V> values_;
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_MAP_DATA_VIEW_H_
diff --git a/mojo/public/cpp/bindings/map_traits.h b/mojo/public/cpp/bindings/map_traits.h
deleted file mode 100644
index 5c0d8b2..0000000
--- a/mojo/public/cpp/bindings/map_traits.h
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_MAP_TRAITS_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_MAP_TRAITS_H_
-
-namespace mojo {
-
-// This must be specialized for any type |T| to be serialized/deserialized as
-// a mojom map.
-//
-// Usually you would like to do a partial specialization for a map template.
-// Imagine you want to specialize it for CustomMap<>, you need to implement:
-//
-//   template <typename K, typename V>
-//   struct MapTraits<CustomMap<K, V>> {
-//     using Key = K;
-//     using Value = V;
-//
-//     // These two methods are optional. Please see comments in struct_traits.h
-//     static bool IsNull(const CustomMap<K, V>& input);
-//     static void SetToNull(CustomMap<K, V>* output);
-//
-//     static size_t GetSize(const CustomMap<K, V>& input);
-//
-//     static CustomConstIterator GetBegin(const CustomMap<K, V>& input);
-//     static CustomIterator GetBegin(CustomMap<K, V>& input);
-//
-//     static void AdvanceIterator(CustomConstIterator& iterator);
-//     static void AdvanceIterator(CustomIterator& iterator);
-//
-//     static const K& GetKey(CustomIterator& iterator);
-//     static const K& GetKey(CustomConstIterator& iterator);
-//
-//     static V& GetValue(CustomIterator& iterator);
-//     static const V& GetValue(CustomConstIterator& iterator);
-//
-//     // Returning false results in deserialization failure and causes the
-//     // message pipe receiving it to be disconnected. |IK| and |IV| are
-//     // separate input key/value template parameters that allows for the
-//     // the key/value types to be forwarded.
-//     template <typename IK, typename IV>
-//     static bool Insert(CustomMap<K, V>& input,
-//                        IK&& key,
-//                        IV&& value);
-//
-//     static void SetToEmpty(CustomMap<K, V>* output);
-//   };
-//
-template <typename T>
-struct MapTraits;
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_MAP_TRAITS_H_
diff --git a/mojo/public/cpp/bindings/map_traits_stl.h b/mojo/public/cpp/bindings/map_traits_stl.h
deleted file mode 100644
index 83a4399..0000000
--- a/mojo/public/cpp/bindings/map_traits_stl.h
+++ /dev/null
@@ -1,109 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_MAP_TRAITS_STL_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_MAP_TRAITS_STL_H_
-
-#include <map>
-#include <unordered_map>
-
-#include "mojo/public/cpp/bindings/map_traits.h"
-
-namespace mojo {
-
-template <typename K, typename V>
-struct MapTraits<std::map<K, V>> {
-  using Key = K;
-  using Value = V;
-  using Iterator = typename std::map<K, V>::iterator;
-  using ConstIterator = typename std::map<K, V>::const_iterator;
-
-  static bool IsNull(const std::map<K, V>& input) {
-    // std::map<> is always converted to non-null mojom map.
-    return false;
-  }
-
-  static void SetToNull(std::map<K, V>* output) {
-    // std::map<> doesn't support null state. Set it to empty instead.
-    output->clear();
-  }
-
-  static size_t GetSize(const std::map<K, V>& input) { return input.size(); }
-
-  static ConstIterator GetBegin(const std::map<K, V>& input) {
-    return input.begin();
-  }
-  static Iterator GetBegin(std::map<K, V>& input) { return input.begin(); }
-
-  static void AdvanceIterator(ConstIterator& iterator) { iterator++; }
-  static void AdvanceIterator(Iterator& iterator) { iterator++; }
-
-  static const K& GetKey(Iterator& iterator) { return iterator->first; }
-  static const K& GetKey(ConstIterator& iterator) { return iterator->first; }
-
-  static V& GetValue(Iterator& iterator) { return iterator->second; }
-  static const V& GetValue(ConstIterator& iterator) { return iterator->second; }
-
-  static bool Insert(std::map<K, V>& input, const K& key, V&& value) {
-    input.insert(std::make_pair(key, std::forward<V>(value)));
-    return true;
-  }
-  static bool Insert(std::map<K, V>& input, const K& key, const V& value) {
-    input.insert(std::make_pair(key, value));
-    return true;
-  }
-
-  static void SetToEmpty(std::map<K, V>* output) { output->clear(); }
-};
-
-template <typename K, typename V>
-struct MapTraits<std::unordered_map<K, V>> {
-  using Key = K;
-  using Value = V;
-  using Iterator = typename std::unordered_map<K, V>::iterator;
-  using ConstIterator = typename std::unordered_map<K, V>::const_iterator;
-
-  static bool IsNull(const std::unordered_map<K, V>& input) {
-    // std::unordered_map<> is always converted to non-null mojom map.
-    return false;
-  }
-
-  static void SetToNull(std::unordered_map<K, V>* output) {
-    // std::unordered_map<> doesn't support null state. Set it to empty instead.
-    output->clear();
-  }
-
-  static size_t GetSize(const std::unordered_map<K, V>& input) {
-    return input.size();
-  }
-
-  static ConstIterator GetBegin(const std::unordered_map<K, V>& input) {
-    return input.begin();
-  }
-  static Iterator GetBegin(std::unordered_map<K, V>& input) {
-    return input.begin();
-  }
-
-  static void AdvanceIterator(ConstIterator& iterator) { iterator++; }
-  static void AdvanceIterator(Iterator& iterator) { iterator++; }
-
-  static const K& GetKey(Iterator& iterator) { return iterator->first; }
-  static const K& GetKey(ConstIterator& iterator) { return iterator->first; }
-
-  static V& GetValue(Iterator& iterator) { return iterator->second; }
-  static const V& GetValue(ConstIterator& iterator) { return iterator->second; }
-
-  template <typename IK, typename IV>
-  static bool Insert(std::unordered_map<K, V>& input, IK&& key, IV&& value) {
-    input.insert(
-        std::make_pair(std::forward<IK>(key), std::forward<IV>(value)));
-    return true;
-  }
-
-  static void SetToEmpty(std::unordered_map<K, V>* output) { output->clear(); }
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_MAP_TRAITS_STL_H_
diff --git a/mojo/public/cpp/bindings/map_traits_wtf_hash_map.h b/mojo/public/cpp/bindings/map_traits_wtf_hash_map.h
deleted file mode 100644
index dd68b36..0000000
--- a/mojo/public/cpp/bindings/map_traits_wtf_hash_map.h
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_MAP_TRAITS_WTF_HASH_MAP_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_MAP_TRAITS_WTF_HASH_MAP_H_
-
-#include "base/logging.h"
-#include "mojo/public/cpp/bindings/map_traits.h"
-#include "third_party/WebKit/Source/wtf/HashMap.h"
-
-namespace mojo {
-
-template <typename K, typename V>
-struct MapTraits<WTF::HashMap<K, V>> {
-  using Key = K;
-  using Value = V;
-  using Iterator = typename WTF::HashMap<K, V>::iterator;
-  using ConstIterator = typename WTF::HashMap<K, V>::const_iterator;
-
-  static bool IsNull(const WTF::HashMap<K, V>& input) {
-    // WTF::HashMap<> is always converted to non-null mojom map.
-    return false;
-  }
-
-  static void SetToNull(WTF::HashMap<K, V>* output) {
-    // WTF::HashMap<> doesn't support null state. Set it to empty instead.
-    output->clear();
-  }
-
-  static size_t GetSize(const WTF::HashMap<K, V>& input) {
-    return input.size();
-  }
-
-  static ConstIterator GetBegin(const WTF::HashMap<K, V>& input) {
-    return input.begin();
-  }
-  static Iterator GetBegin(WTF::HashMap<K, V>& input) { return input.begin(); }
-
-  static void AdvanceIterator(ConstIterator& iterator) { ++iterator; }
-  static void AdvanceIterator(Iterator& iterator) { ++iterator; }
-
-  static const K& GetKey(Iterator& iterator) { return iterator->key; }
-  static const K& GetKey(ConstIterator& iterator) { return iterator->key; }
-
-  static V& GetValue(Iterator& iterator) { return iterator->value; }
-  static const V& GetValue(ConstIterator& iterator) { return iterator->value; }
-
-  template <typename IK, typename IV>
-  static bool Insert(WTF::HashMap<K, V>& input, IK&& key, IV&& value) {
-    if (!WTF::HashMap<K, V>::isValidKey(key)) {
-      LOG(ERROR) << "The key value is disallowed by WTF::HashMap";
-      return false;
-    }
-    input.insert(std::forward<IK>(key), std::forward<IV>(value));
-    return true;
-  }
-
-  static void SetToEmpty(WTF::HashMap<K, V>* output) { output->clear(); }
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_MAP_TRAITS_WTF_HASH_MAP_H_
diff --git a/mojo/public/cpp/bindings/message.h b/mojo/public/cpp/bindings/message.h
deleted file mode 100644
index 48e6900..0000000
--- a/mojo/public/cpp/bindings/message.h
+++ /dev/null
@@ -1,302 +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 MOJO_PUBLIC_CPP_BINDINGS_MESSAGE_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_MESSAGE_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <limits>
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "base/callback.h"
-#include "base/compiler_specific.h"
-#include "base/logging.h"
-#include "mojo/public/cpp/bindings/bindings_export.h"
-#include "mojo/public/cpp/bindings/lib/message_buffer.h"
-#include "mojo/public/cpp/bindings/lib/message_internal.h"
-#include "mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h"
-#include "mojo/public/cpp/system/message.h"
-
-namespace mojo {
-
-class AssociatedGroupController;
-
-using ReportBadMessageCallback = base::Callback<void(const std::string& error)>;
-
-// Message is a holder for the data and handles to be sent over a MessagePipe.
-// Message owns its data and handles, but a consumer of Message is free to
-// mutate the data and handles. The message's data is comprised of a header
-// followed by payload.
-class MOJO_CPP_BINDINGS_EXPORT Message {
- public:
-  static const uint32_t kFlagExpectsResponse = 1 << 0;
-  static const uint32_t kFlagIsResponse = 1 << 1;
-  static const uint32_t kFlagIsSync = 1 << 2;
-
-  Message();
-  Message(Message&& other);
-
-  ~Message();
-
-  Message& operator=(Message&& other);
-
-  // Resets the Message to an uninitialized state. Upon reset, the Message
-  // exists as if it were default-constructed: it has no data buffer and owns no
-  // handles.
-  void Reset();
-
-  // Indicates whether this Message is uninitialized.
-  bool IsNull() const { return !buffer_; }
-
-  // Initializes a Message with enough space for |capacity| bytes.
-  void Initialize(size_t capacity, bool zero_initialized);
-
-  // Initializes a Message from an existing Mojo MessageHandle.
-  void InitializeFromMojoMessage(ScopedMessageHandle message,
-                                 uint32_t num_bytes,
-                                 std::vector<Handle>* handles);
-
-  uint32_t data_num_bytes() const {
-    return static_cast<uint32_t>(buffer_->size());
-  }
-
-  // Access the raw bytes of the message.
-  const uint8_t* data() const {
-    return static_cast<const uint8_t*>(buffer_->data());
-  }
-
-  uint8_t* mutable_data() { return static_cast<uint8_t*>(buffer_->data()); }
-
-  // Access the header.
-  const internal::MessageHeader* header() const {
-    return static_cast<const internal::MessageHeader*>(buffer_->data());
-  }
-  internal::MessageHeader* header() {
-    return static_cast<internal::MessageHeader*>(buffer_->data());
-  }
-
-  const internal::MessageHeaderV1* header_v1() const {
-    DCHECK_GE(version(), 1u);
-    return static_cast<const internal::MessageHeaderV1*>(buffer_->data());
-  }
-  internal::MessageHeaderV1* header_v1() {
-    DCHECK_GE(version(), 1u);
-    return static_cast<internal::MessageHeaderV1*>(buffer_->data());
-  }
-
-  const internal::MessageHeaderV2* header_v2() const {
-    DCHECK_GE(version(), 2u);
-    return static_cast<const internal::MessageHeaderV2*>(buffer_->data());
-  }
-  internal::MessageHeaderV2* header_v2() {
-    DCHECK_GE(version(), 2u);
-    return static_cast<internal::MessageHeaderV2*>(buffer_->data());
-  }
-
-  uint32_t version() const { return header()->version; }
-
-  uint32_t interface_id() const { return header()->interface_id; }
-  void set_interface_id(uint32_t id) { header()->interface_id = id; }
-
-  uint32_t name() const { return header()->name; }
-  bool has_flag(uint32_t flag) const { return !!(header()->flags & flag); }
-
-  // Access the request_id field (if present).
-  uint64_t request_id() const { return header_v1()->request_id; }
-  void set_request_id(uint64_t request_id) {
-    header_v1()->request_id = request_id;
-  }
-
-  // Access the payload.
-  const uint8_t* payload() const;
-  uint8_t* mutable_payload() { return const_cast<uint8_t*>(payload()); }
-  uint32_t payload_num_bytes() const;
-
-  uint32_t payload_num_interface_ids() const;
-  const uint32_t* payload_interface_ids() const;
-
-  // Access the handles.
-  const std::vector<Handle>* handles() const { return &handles_; }
-  std::vector<Handle>* mutable_handles() { return &handles_; }
-
-  const std::vector<ScopedInterfaceEndpointHandle>*
-  associated_endpoint_handles() const {
-    return &associated_endpoint_handles_;
-  }
-  std::vector<ScopedInterfaceEndpointHandle>*
-  mutable_associated_endpoint_handles() {
-    return &associated_endpoint_handles_;
-  }
-
-  // Access the underlying Buffer interface.
-  internal::Buffer* buffer() { return buffer_.get(); }
-
-  // Takes a scoped MessageHandle which may be passed to |WriteMessageNew()| for
-  // transmission. Note that this invalidates this Message object, taking
-  // ownership of its internal storage and any attached handles.
-  ScopedMessageHandle TakeMojoMessage();
-
-  // Notifies the system that this message is "bad," in this case meaning it was
-  // rejected by bindings validation code.
-  void NotifyBadMessage(const std::string& error);
-
-  // Serializes |associated_endpoint_handles_| into the payload_interface_ids
-  // field.
-  void SerializeAssociatedEndpointHandles(
-      AssociatedGroupController* group_controller);
-
-  // Deserializes |associated_endpoint_handles_| from the payload_interface_ids
-  // field.
-  bool DeserializeAssociatedEndpointHandles(
-      AssociatedGroupController* group_controller);
-
- private:
-  void CloseHandles();
-
-  std::unique_ptr<internal::MessageBuffer> buffer_;
-  std::vector<Handle> handles_;
-  std::vector<ScopedInterfaceEndpointHandle> associated_endpoint_handles_;
-
-  DISALLOW_COPY_AND_ASSIGN(Message);
-};
-
-class MessageReceiver {
- public:
-  virtual ~MessageReceiver() {}
-
-  // The receiver may mutate the given message.  Returns true if the message
-  // was accepted and false otherwise, indicating that the message was invalid
-  // or malformed.
-  virtual bool Accept(Message* message) WARN_UNUSED_RESULT = 0;
-};
-
-class MessageReceiverWithResponder : public MessageReceiver {
- public:
-  ~MessageReceiverWithResponder() override {}
-
-  // A variant on Accept that registers a MessageReceiver (known as the
-  // responder) to handle the response message generated from the given
-  // message. The responder's Accept method may be called during
-  // AcceptWithResponder or some time after its return.
-  virtual bool AcceptWithResponder(Message* message,
-                                   std::unique_ptr<MessageReceiver> responder)
-      WARN_UNUSED_RESULT = 0;
-};
-
-// A MessageReceiver that is also able to provide status about the state
-// of the underlying MessagePipe to which it will be forwarding messages
-// received via the |Accept()| call.
-class MessageReceiverWithStatus : public MessageReceiver {
- public:
-  ~MessageReceiverWithStatus() override {}
-
-  // Returns |true| if this MessageReceiver is currently bound to a MessagePipe,
-  // the pipe has not been closed, and the pipe has not encountered an error.
-  virtual bool IsValid() = 0;
-
-  // DCHECKs if this MessageReceiver is currently bound to a MessagePipe, the
-  // pipe has not been closed, and the pipe has not encountered an error.
-  // This function may be called on any thread.
-  virtual void DCheckInvalid(const std::string& message) = 0;
-};
-
-// An alternative to MessageReceiverWithResponder for cases in which it
-// is necessary for the implementor of this interface to know about the status
-// of the MessagePipe which will carry the responses.
-class MessageReceiverWithResponderStatus : public MessageReceiver {
- public:
-  ~MessageReceiverWithResponderStatus() override {}
-
-  // A variant on Accept that registers a MessageReceiverWithStatus (known as
-  // the responder) to handle the response message generated from the given
-  // message. Any of the responder's methods (Accept or IsValid) may be called
-  // during  AcceptWithResponder or some time after its return.
-  virtual bool AcceptWithResponder(Message* message,
-                                   std::unique_ptr<MessageReceiverWithStatus>
-                                       responder) WARN_UNUSED_RESULT = 0;
-};
-
-class MOJO_CPP_BINDINGS_EXPORT PassThroughFilter
-    : NON_EXPORTED_BASE(public MessageReceiver) {
- public:
-  PassThroughFilter();
-  ~PassThroughFilter() override;
-
-  // MessageReceiver:
-  bool Accept(Message* message) override;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(PassThroughFilter);
-};
-
-namespace internal {
-class SyncMessageResponseSetup;
-}
-
-// An object which should be constructed on the stack immediately before making
-// a sync request for which the caller wishes to perform custom validation of
-// the response value(s). It is illegal to make more than one sync call during
-// the lifetime of the topmost SyncMessageResponseContext, but it is legal to
-// nest contexts to support reentrancy.
-//
-// Usage should look something like:
-//
-//     SyncMessageResponseContext response_context;
-//     foo_interface->SomeSyncCall(&response_value);
-//     if (response_value.IsBad())
-//       response_context.ReportBadMessage("Bad response_value!");
-//
-class MOJO_CPP_BINDINGS_EXPORT SyncMessageResponseContext {
- public:
-  SyncMessageResponseContext();
-  ~SyncMessageResponseContext();
-
-  static SyncMessageResponseContext* current();
-
-  void ReportBadMessage(const std::string& error);
-
-  const ReportBadMessageCallback& GetBadMessageCallback();
-
- private:
-  friend class internal::SyncMessageResponseSetup;
-
-  SyncMessageResponseContext* outer_context_;
-  Message response_;
-  ReportBadMessageCallback bad_message_callback_;
-
-  DISALLOW_COPY_AND_ASSIGN(SyncMessageResponseContext);
-};
-
-// Read a single message from the pipe. The caller should have created the
-// Message, but not called Initialize(). Returns MOJO_RESULT_SHOULD_WAIT if
-// the caller should wait on the handle to become readable. Returns
-// MOJO_RESULT_OK if the message was read successfully and should be
-// dispatched, otherwise returns an error code if something went wrong.
-//
-// NOTE: The message hasn't been validated and may be malformed!
-MojoResult ReadMessage(MessagePipeHandle handle, Message* message);
-
-// Reports the currently dispatching Message as bad. Note that this is only
-// legal to call from directly within the stack frame of a message dispatch. If
-// you need to do asynchronous work before you can determine the legitimacy of
-// a message, use TakeBadMessageCallback() and retain its result until you're
-// ready to invoke or discard it.
-MOJO_CPP_BINDINGS_EXPORT
-void ReportBadMessage(const std::string& error);
-
-// Acquires a callback which may be run to report the currently dispatching
-// Message as bad. Note that this is only legal to call from directly within the
-// stack frame of a message dispatch, but the returned callback may be called
-// exactly once any time thereafter to report the message as bad. This may only
-// be called once per message.
-MOJO_CPP_BINDINGS_EXPORT
-ReportBadMessageCallback GetBadMessageCallback();
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_MESSAGE_H_
diff --git a/mojo/public/cpp/bindings/message_header_validator.h b/mojo/public/cpp/bindings/message_header_validator.h
deleted file mode 100644
index 50c19db..0000000
--- a/mojo/public/cpp/bindings/message_header_validator.h
+++ /dev/null
@@ -1,32 +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 MOJO_PUBLIC_CPP_BINDINGS_MESSAGE_HEADER_VALIDATOR_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_MESSAGE_HEADER_VALIDATOR_H_
-
-#include "base/compiler_specific.h"
-#include "mojo/public/cpp/bindings/bindings_export.h"
-#include "mojo/public/cpp/bindings/message.h"
-
-namespace mojo {
-
-class MOJO_CPP_BINDINGS_EXPORT MessageHeaderValidator
-    : NON_EXPORTED_BASE(public MessageReceiver) {
- public:
-  MessageHeaderValidator();
-  explicit MessageHeaderValidator(const std::string& description);
-
-  // Sets the description associated with this validator. Used for reporting
-  // more detailed validation errors.
-  void SetDescription(const std::string& description);
-
-  bool Accept(Message* message) override;
-
- private:
-  std::string description_;
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_MESSAGE_HEADER_VALIDATOR_H_
diff --git a/mojo/public/cpp/bindings/native_enum.h b/mojo/public/cpp/bindings/native_enum.h
deleted file mode 100644
index 08b43b7..0000000
--- a/mojo/public/cpp/bindings/native_enum.h
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_NATIVE_ENUM_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_NATIVE_ENUM_H_
-
-#include <functional>
-
-#include "mojo/public/cpp/bindings/lib/bindings_internal.h"
-#include "mojo/public/cpp/bindings/lib/native_enum_data.h"
-
-namespace mojo {
-
-// Native-only enums correspond to "[Native] enum Foo;" definitions in mojom.
-enum class NativeEnum : int32_t {};
-
-}  // namespace mojo
-
-namespace std {
-
-template <>
-struct hash<mojo::NativeEnum>
-    : public mojo::internal::EnumHashImpl<mojo::NativeEnum> {};
-
-}  // namespace std
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_NATIVE_ENUM_H_
diff --git a/mojo/public/cpp/bindings/native_struct.h b/mojo/public/cpp/bindings/native_struct.h
deleted file mode 100644
index ac27250..0000000
--- a/mojo/public/cpp/bindings/native_struct.h
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_NATIVE_STRUCT_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_NATIVE_STRUCT_H_
-
-#include <vector>
-
-#include "base/optional.h"
-#include "mojo/public/cpp/bindings/bindings_export.h"
-#include "mojo/public/cpp/bindings/lib/native_struct_data.h"
-#include "mojo/public/cpp/bindings/struct_ptr.h"
-#include "mojo/public/cpp/bindings/type_converter.h"
-
-namespace mojo {
-
-class NativeStruct;
-using NativeStructPtr = StructPtr<NativeStruct>;
-
-// Native-only structs correspond to "[Native] struct Foo;" definitions in
-// mojom.
-class MOJO_CPP_BINDINGS_EXPORT NativeStruct {
- public:
-  using Data_ = internal::NativeStruct_Data;
-
-  static NativeStructPtr New();
-
-  template <typename U>
-  static NativeStructPtr From(const U& u) {
-    return TypeConverter<NativeStructPtr, U>::Convert(u);
-  }
-
-  template <typename U>
-  U To() const {
-    return TypeConverter<U, NativeStruct>::Convert(*this);
-  }
-
-  NativeStruct();
-  ~NativeStruct();
-
-  NativeStructPtr Clone() const;
-  bool Equals(const NativeStruct& other) const;
-  size_t Hash(size_t seed) const;
-
-  base::Optional<std::vector<uint8_t>> data;
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_NATIVE_STRUCT_H_
diff --git a/mojo/public/cpp/bindings/native_struct_data_view.h b/mojo/public/cpp/bindings/native_struct_data_view.h
deleted file mode 100644
index 613bd7a..0000000
--- a/mojo/public/cpp/bindings/native_struct_data_view.h
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_NATIVE_STRUCT_DATA_VIEW_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_NATIVE_STRUCT_DATA_VIEW_H_
-
-#include "mojo/public/cpp/bindings/lib/native_struct_data.h"
-#include "mojo/public/cpp/bindings/lib/serialization_context.h"
-
-namespace mojo {
-
-class NativeStructDataView {
- public:
-  using Data_ = internal::NativeStruct_Data;
-
-  NativeStructDataView() {}
-
-  NativeStructDataView(Data_* data, internal::SerializationContext* context)
-      : data_(data) {}
-
-  bool is_null() const { return !data_; }
-
-  size_t size() const { return data_->data.size(); }
-
-  uint8_t operator[](size_t index) const { return data_->data.at(index); }
-
-  const uint8_t* data() const { return data_->data.storage(); }
-
- private:
-  Data_* data_ = nullptr;
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_NATIVE_STRUCT_DATA_VIEW_H_
diff --git a/mojo/public/cpp/bindings/pipe_control_message_handler.h b/mojo/public/cpp/bindings/pipe_control_message_handler.h
deleted file mode 100644
index a5c04da..0000000
--- a/mojo/public/cpp/bindings/pipe_control_message_handler.h
+++ /dev/null
@@ -1,55 +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 MOJO_PUBLIC_CPP_BINDINGS_PIPE_CONTROL_MESSAGE_HANDLER_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_PIPE_CONTROL_MESSAGE_HANDLER_H_
-
-#include <string>
-
-#include "base/compiler_specific.h"
-#include "base/macros.h"
-#include "mojo/public/cpp/bindings/bindings_export.h"
-#include "mojo/public/cpp/bindings/message.h"
-
-namespace mojo {
-
-class PipeControlMessageHandlerDelegate;
-
-// Handler for messages defined in pipe_control_messages.mojom.
-class MOJO_CPP_BINDINGS_EXPORT PipeControlMessageHandler
-    : NON_EXPORTED_BASE(public MessageReceiver) {
- public:
-  explicit PipeControlMessageHandler(
-      PipeControlMessageHandlerDelegate* delegate);
-  ~PipeControlMessageHandler() override;
-
-  // Sets the description for this handler. Used only when reporting validation
-  // errors.
-  void SetDescription(const std::string& description);
-
-  // NOTE: |message| must have passed message header validation.
-  static bool IsPipeControlMessage(const Message* message);
-
-  // MessageReceiver implementation:
-
-  // NOTE: |message| must:
-  //   - have passed message header validation; and
-  //   - be a pipe control message (i.e., IsPipeControlMessage() returns true).
-  // If the method returns false, the message pipe should be closed.
-  bool Accept(Message* message) override;
-
- private:
-  // |message| must have passed message header validation.
-  bool Validate(Message* message);
-  bool RunOrClosePipe(Message* message);
-
-  std::string description_;
-  PipeControlMessageHandlerDelegate* const delegate_;
-
-  DISALLOW_COPY_AND_ASSIGN(PipeControlMessageHandler);
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_PIPE_CONTROL_MESSAGE_HANDLER_H_
diff --git a/mojo/public/cpp/bindings/pipe_control_message_handler_delegate.h b/mojo/public/cpp/bindings/pipe_control_message_handler_delegate.h
deleted file mode 100644
index 16fd918..0000000
--- a/mojo/public/cpp/bindings/pipe_control_message_handler_delegate.h
+++ /dev/null
@@ -1,29 +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 MOJO_PUBLIC_CPP_BINDINGS_PIPE_CONTROL_MESSAGE_HANDLER_DELEGATE_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_PIPE_CONTROL_MESSAGE_HANDLER_DELEGATE_H_
-
-#include "base/optional.h"
-#include "mojo/public/cpp/bindings/disconnect_reason.h"
-#include "mojo/public/cpp/bindings/interface_id.h"
-
-namespace mojo {
-
-class PipeControlMessageHandlerDelegate {
- public:
-  // The implementation of the following methods should return false if the
-  // notification is unexpected. In that case, the user of this delegate is
-  // expected to close the message pipe.
-  virtual bool OnPeerAssociatedEndpointClosed(
-      InterfaceId id,
-      const base::Optional<DisconnectReason>& reason) = 0;
-
- protected:
-  virtual ~PipeControlMessageHandlerDelegate() {}
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_PIPE_CONTROL_MESSAGE_HANDLER_DELEGATE_H_
diff --git a/mojo/public/cpp/bindings/pipe_control_message_proxy.h b/mojo/public/cpp/bindings/pipe_control_message_proxy.h
deleted file mode 100644
index 52c408f..0000000
--- a/mojo/public/cpp/bindings/pipe_control_message_proxy.h
+++ /dev/null
@@ -1,45 +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 MOJO_PUBLIC_CPP_BINDINGS_PIPE_CONTROL_MESSAGE_PROXY_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_PIPE_CONTROL_MESSAGE_PROXY_H_
-
-#include "base/macros.h"
-#include "base/optional.h"
-#include "mojo/public/cpp/bindings/bindings_export.h"
-#include "mojo/public/cpp/bindings/disconnect_reason.h"
-#include "mojo/public/cpp/bindings/interface_id.h"
-#include "mojo/public/cpp/bindings/lib/serialization_context.h"
-#include "mojo/public/cpp/bindings/message.h"
-
-namespace mojo {
-
-class MessageReceiver;
-
-// Proxy for request messages defined in pipe_control_messages.mojom.
-//
-// NOTE: This object may be used from multiple threads.
-class MOJO_CPP_BINDINGS_EXPORT PipeControlMessageProxy {
- public:
-  // Doesn't take ownership of |receiver|. If This PipeControlMessageProxy will
-  // be used from multiple threads, |receiver| must be thread-safe.
-  explicit PipeControlMessageProxy(MessageReceiver* receiver);
-
-  void NotifyPeerEndpointClosed(InterfaceId id,
-                                const base::Optional<DisconnectReason>& reason);
-
-  static Message ConstructPeerEndpointClosedMessage(
-      InterfaceId id,
-      const base::Optional<DisconnectReason>& reason);
-
- private:
-  // Not owned.
-  MessageReceiver* receiver_;
-
-  DISALLOW_COPY_AND_ASSIGN(PipeControlMessageProxy);
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_PIPE_CONTROL_MESSAGE_PROXY_H_
diff --git a/mojo/public/cpp/bindings/raw_ptr_impl_ref_traits.h b/mojo/public/cpp/bindings/raw_ptr_impl_ref_traits.h
deleted file mode 100644
index 4d40cdf..0000000
--- a/mojo/public/cpp/bindings/raw_ptr_impl_ref_traits.h
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_RAW_PTR_IMPL_REF_TRAITS_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_RAW_PTR_IMPL_REF_TRAITS_H_
-
-namespace mojo {
-
-// Default traits for a binding's implementation reference type. This
-// corresponds to a raw pointer.
-template <typename Interface>
-struct RawPtrImplRefTraits {
-  using PointerType = Interface*;
-
-  static bool IsNull(PointerType ptr) { return !ptr; }
-  static Interface* GetRawPointer(PointerType* ptr) { return *ptr; }
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_RAW_PTR_IMPL_REF_TRAITS_H_
diff --git a/mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h b/mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h
deleted file mode 100644
index 16527cf..0000000
--- a/mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h
+++ /dev/null
@@ -1,123 +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 MOJO_PUBLIC_CPP_BINDINGS_SCOPED_INTERFACE_ENDPOINT_HANDLE_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_SCOPED_INTERFACE_ENDPOINT_HANDLE_H_
-
-#include <string>
-
-#include "base/callback.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/optional.h"
-#include "base/single_thread_task_runner.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "mojo/public/cpp/bindings/bindings_export.h"
-#include "mojo/public/cpp/bindings/disconnect_reason.h"
-#include "mojo/public/cpp/bindings/interface_id.h"
-
-namespace mojo {
-
-class AssociatedGroupController;
-
-// ScopedInterfaceEndpointHandle refers to one end of an interface, either the
-// implementation side or the client side.
-// Threading: At any given time, a ScopedInterfaceEndpointHandle should only
-// be accessed from a single thread.
-class MOJO_CPP_BINDINGS_EXPORT ScopedInterfaceEndpointHandle {
- public:
-  // Creates a pair of handles representing the two endpoints of an interface,
-  // which are not yet associated with a message pipe.
-  static void CreatePairPendingAssociation(
-      ScopedInterfaceEndpointHandle* handle0,
-      ScopedInterfaceEndpointHandle* handle1);
-
-  // Creates an invalid endpoint handle.
-  ScopedInterfaceEndpointHandle();
-
-  ScopedInterfaceEndpointHandle(ScopedInterfaceEndpointHandle&& other);
-
-  ~ScopedInterfaceEndpointHandle();
-
-  ScopedInterfaceEndpointHandle& operator=(
-      ScopedInterfaceEndpointHandle&& other);
-
-  bool is_valid() const;
-
-  // Returns true if the interface hasn't associated with a message pipe.
-  bool pending_association() const;
-
-  // Returns kInvalidInterfaceId when in pending association state or the handle
-  // is invalid.
-  InterfaceId id() const;
-
-  // Returns null when in pending association state or the handle is invalid.
-  AssociatedGroupController* group_controller() const;
-
-  // Returns the disconnect reason if the peer handle is closed before
-  // association and specifies a custom disconnect reason.
-  const base::Optional<DisconnectReason>& disconnect_reason() const;
-
-  enum AssociationEvent {
-    // The interface has been associated with a message pipe.
-    ASSOCIATED,
-    // The peer of this object has been closed before association.
-    PEER_CLOSED_BEFORE_ASSOCIATION
-  };
-
-  using AssociationEventCallback = base::OnceCallback<void(AssociationEvent)>;
-  // Note:
-  // - |handler| won't run if the handle is invalid. Otherwise, |handler| is run
-  //   on the calling thread asynchronously, even if the interface has already
-  //   been associated or the peer has been closed before association.
-  // - |handler| won't be called after this object is destroyed or reset.
-  // - A null |handler| can be used to cancel the previous callback.
-  void SetAssociationEventHandler(AssociationEventCallback handler);
-
-  void reset();
-  void ResetWithReason(uint32_t custom_reason, const std::string& description);
-
- private:
-  friend class AssociatedGroupController;
-  friend class AssociatedGroup;
-
-  class State;
-
-  // Used by AssociatedGroupController.
-  ScopedInterfaceEndpointHandle(
-      InterfaceId id,
-      scoped_refptr<AssociatedGroupController> group_controller);
-
-  // Used by AssociatedGroupController.
-  // The peer of this handle will join |peer_group_controller|.
-  bool NotifyAssociation(
-      InterfaceId id,
-      scoped_refptr<AssociatedGroupController> peer_group_controller);
-
-  void ResetInternal(const base::Optional<DisconnectReason>& reason);
-
-  // Used by AssociatedGroup.
-  // It is safe to run the returned callback on any thread, or after this handle
-  // is destroyed.
-  // The return value of the getter:
-  //   - If the getter is retrieved when the handle is invalid, the return value
-  //     of the getter will always be null.
-  //   - If the getter is retrieved when the handle is valid and non-pending,
-  //     the return value of the getter will be non-null and remain unchanged
-  //     even if the handle is later reset.
-  //   - If the getter is retrieved when the handle is valid but pending
-  //     asssociation, the return value of the getter will initially be null,
-  //     change to non-null when the handle is associated, and remain unchanged
-  //     ever since.
-  base::Callback<AssociatedGroupController*()> CreateGroupControllerGetter()
-      const;
-
-  scoped_refptr<State> state_;
-
-  DISALLOW_COPY_AND_ASSIGN(ScopedInterfaceEndpointHandle);
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_SCOPED_INTERFACE_ENDPOINT_HANDLE_H_
diff --git a/mojo/public/cpp/bindings/string_data_view.h b/mojo/public/cpp/bindings/string_data_view.h
deleted file mode 100644
index 2b091b4..0000000
--- a/mojo/public/cpp/bindings/string_data_view.h
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_STRING_DATA_VIEW_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_STRING_DATA_VIEW_H_
-
-#include "mojo/public/cpp/bindings/lib/array_internal.h"
-#include "mojo/public/cpp/bindings/lib/serialization_context.h"
-
-namespace mojo {
-
-// Access to the contents of a serialized string.
-class StringDataView {
- public:
-  StringDataView() {}
-
-  StringDataView(internal::String_Data* data,
-                 internal::SerializationContext* context)
-      : data_(data) {}
-
-  bool is_null() const { return !data_; }
-
-  const char* storage() const { return data_->storage(); }
-
-  size_t size() const { return data_->size(); }
-
- private:
-  internal::String_Data* data_ = nullptr;
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_STRING_DATA_VIEW_H_
diff --git a/mojo/public/cpp/bindings/string_traits.h b/mojo/public/cpp/bindings/string_traits.h
deleted file mode 100644
index 7d3075a..0000000
--- a/mojo/public/cpp/bindings/string_traits.h
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_STRING_TRAITS_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_STRING_TRAITS_H_
-
-#include "mojo/public/cpp/bindings/string_data_view.h"
-
-namespace mojo {
-
-// This must be specialized for any type |T| to be serialized/deserialized as
-// a mojom string.
-//
-// Imagine you want to specialize it for CustomString, usually you need to
-// implement:
-//
-//   template <T>
-//   struct StringTraits<CustomString> {
-//     // These two methods are optional. Please see comments in struct_traits.h
-//     static bool IsNull(const CustomString& input);
-//     static void SetToNull(CustomString* output);
-//
-//     static size_t GetSize(const CustomString& input);
-//     static const char* GetData(const CustomString& input);
-//
-//     // The caller guarantees that |!input.is_null()|.
-//     static bool Read(StringDataView input, CustomString* output);
-//   };
-//
-// In some cases, you may need to do conversion before you can return the size
-// and data as 8-bit characters for serialization. (For example, CustomString is
-// UTF-16 string). In that case, you can add two optional methods:
-//
-//   static void* SetUpContext(const CustomString& input);
-//   static void TearDownContext(const CustomString& input, void* context);
-//
-// And then you append a second parameter, void* context, to GetSize() and
-// GetData():
-//
-//   static size_t GetSize(const CustomString& input, void* context);
-//   static const char* GetData(const CustomString& input, void* context);
-//
-// If a CustomString instance is not null, the serialization code will call
-// SetUpContext() at the beginning, and pass the resulting context pointer to
-// GetSize()/GetData(). After serialization is done, it calls TearDownContext()
-// so that you can do any necessary cleanup.
-//
-template <typename T>
-struct StringTraits;
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_STRING_TRAITS_H_
diff --git a/mojo/public/cpp/bindings/string_traits_stl.h b/mojo/public/cpp/bindings/string_traits_stl.h
deleted file mode 100644
index f6cc8ad..0000000
--- a/mojo/public/cpp/bindings/string_traits_stl.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_STRING_TRAITS_STL_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_STRING_TRAITS_STL_H_
-
-#include <string>
-
-#include "mojo/public/cpp/bindings/string_traits.h"
-
-namespace mojo {
-
-template <>
-struct StringTraits<std::string> {
-  static bool IsNull(const std::string& input) {
-    // std::string is always converted to non-null mojom string.
-    return false;
-  }
-
-  static void SetToNull(std::string* output) {
-    // std::string doesn't support null state. Set it to empty instead.
-    output->clear();
-  }
-
-  static size_t GetSize(const std::string& input) { return input.size(); }
-
-  static const char* GetData(const std::string& input) { return input.data(); }
-
-  static bool Read(StringDataView input, std::string* output) {
-    output->assign(input.storage(), input.size());
-    return true;
-  }
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_STRING_TRAITS_STL_H_
diff --git a/mojo/public/cpp/bindings/string_traits_string16.h b/mojo/public/cpp/bindings/string_traits_string16.h
deleted file mode 100644
index f96973a..0000000
--- a/mojo/public/cpp/bindings/string_traits_string16.h
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_STRING_TRAITS_STRING16_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_STRING_TRAITS_STRING16_H_
-
-#include "base/strings/string16.h"
-#include "mojo/public/cpp/bindings/bindings_export.h"
-#include "mojo/public/cpp/bindings/string_traits.h"
-
-namespace mojo {
-
-template <>
-struct MOJO_CPP_BINDINGS_EXPORT StringTraits<base::string16> {
-  static bool IsNull(const base::string16& input) {
-    // base::string16 is always converted to non-null mojom string.
-    return false;
-  }
-
-  static void SetToNull(base::string16* output) {
-    // Convert null to an "empty" base::string16.
-    output->clear();
-  }
-
-  static void* SetUpContext(const base::string16& input);
-  static void TearDownContext(const base::string16& input, void* context);
-
-  static size_t GetSize(const base::string16& input, void* context);
-  static const char* GetData(const base::string16& input, void* context);
-
-  static bool Read(StringDataView input, base::string16* output);
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_STRING_TRAITS_STRING16_H_
diff --git a/mojo/public/cpp/bindings/string_traits_string_piece.h b/mojo/public/cpp/bindings/string_traits_string_piece.h
deleted file mode 100644
index af6be89..0000000
--- a/mojo/public/cpp/bindings/string_traits_string_piece.h
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_STRING_TRAITS_STRING_PIECE_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_STRING_TRAITS_STRING_PIECE_H_
-
-#include "base/strings/string_piece.h"
-#include "mojo/public/cpp/bindings/string_traits.h"
-
-namespace mojo {
-
-template <>
-struct StringTraits<base::StringPiece> {
-  static bool IsNull(const base::StringPiece& input) {
-    // base::StringPiece is always converted to non-null mojom string. We could
-    // have let StringPiece containing a null data pointer map to null mojom
-    // string, but StringPiece::empty() returns true in this case. It seems
-    // confusing to mix the concept of empty and null strings, especially
-    // because they mean different things in mojom.
-    return false;
-  }
-
-  static void SetToNull(base::StringPiece* output) {
-    // Convert null to an "empty" base::StringPiece.
-    output->set(nullptr, 0);
-  }
-
-  static size_t GetSize(const base::StringPiece& input) { return input.size(); }
-
-  static const char* GetData(const base::StringPiece& input) {
-    return input.data();
-  }
-
-  static bool Read(StringDataView input, base::StringPiece* output) {
-    output->set(input.storage(), input.size());
-    return true;
-  }
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_STRING_TRAITS_STRING_PIECE_H_
diff --git a/mojo/public/cpp/bindings/string_traits_wtf.h b/mojo/public/cpp/bindings/string_traits_wtf.h
deleted file mode 100644
index 238c2eb..0000000
--- a/mojo/public/cpp/bindings/string_traits_wtf.h
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_STRING_TRAITS_WTF_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_STRING_TRAITS_WTF_H_
-
-#include "mojo/public/cpp/bindings/lib/bindings_internal.h"
-#include "mojo/public/cpp/bindings/string_traits.h"
-#include "third_party/WebKit/Source/wtf/text/WTFString.h"
-
-namespace mojo {
-
-template <>
-struct StringTraits<WTF::String> {
-  static bool IsNull(const WTF::String& input) { return input.isNull(); }
-  static void SetToNull(WTF::String* output);
-
-  static void* SetUpContext(const WTF::String& input);
-  static void TearDownContext(const WTF::String& input, void* context);
-
-  static size_t GetSize(const WTF::String& input, void* context);
-
-  static const char* GetData(const WTF::String& input, void* context);
-
-  static bool Read(StringDataView input, WTF::String* output);
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_STRING_TRAITS_WTF_H_
diff --git a/mojo/public/cpp/bindings/strong_associated_binding.h b/mojo/public/cpp/bindings/strong_associated_binding.h
deleted file mode 100644
index a1e299b..0000000
--- a/mojo/public/cpp/bindings/strong_associated_binding.h
+++ /dev/null
@@ -1,125 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_STRONG_ASSOCIATED_BINDING_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_STRONG_ASSOCIATED_BINDING_H_
-
-#include <memory>
-#include <string>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/memory/weak_ptr.h"
-#include "mojo/public/cpp/bindings/associated_binding.h"
-#include "mojo/public/cpp/bindings/associated_interface_request.h"
-#include "mojo/public/cpp/bindings/connection_error_callback.h"
-#include "mojo/public/cpp/system/core.h"
-
-namespace mojo {
-
-template <typename Interface>
-class StrongAssociatedBinding;
-
-template <typename Interface>
-using StrongAssociatedBindingPtr =
-    base::WeakPtr<StrongAssociatedBinding<Interface>>;
-
-// This connects an interface implementation strongly to an associated pipe.
-// When a connection error is detected the implementation is deleted. If the
-// task runner that a StrongAssociatedBinding is bound on is stopped, the
-// connection error handler will not be invoked and the implementation will not
-// be deleted.
-//
-// To use, call StrongAssociatedBinding<T>::Create() (see below) or the helper
-// MakeStrongAssociatedBinding function:
-//
-//   mojo::MakeStrongAssociatedBinding(base::MakeUnique<FooImpl>(),
-//                                     std::move(foo_request));
-//
-template <typename Interface>
-class StrongAssociatedBinding {
- public:
-  // Create a new StrongAssociatedBinding instance. The instance owns itself,
-  // cleaning up only in the event of a pipe connection error. Returns a WeakPtr
-  // to the new StrongAssociatedBinding instance.
-  static StrongAssociatedBindingPtr<Interface> Create(
-      std::unique_ptr<Interface> impl,
-      AssociatedInterfaceRequest<Interface> request) {
-    StrongAssociatedBinding* binding =
-        new StrongAssociatedBinding(std::move(impl), std::move(request));
-    return binding->weak_factory_.GetWeakPtr();
-  }
-
-  // Note: The error handler must not delete the interface implementation.
-  //
-  // This method may only be called after this StrongAssociatedBinding has been
-  // bound to a message pipe.
-  void set_connection_error_handler(const base::Closure& error_handler) {
-    DCHECK(binding_.is_bound());
-    connection_error_handler_ = error_handler;
-    connection_error_with_reason_handler_.Reset();
-  }
-
-  void set_connection_error_with_reason_handler(
-      const ConnectionErrorWithReasonCallback& error_handler) {
-    DCHECK(binding_.is_bound());
-    connection_error_with_reason_handler_ = error_handler;
-    connection_error_handler_.Reset();
-  }
-
-  // Forces the binding to close. This destroys the StrongBinding instance.
-  void Close() { delete this; }
-
-  Interface* impl() { return impl_.get(); }
-
-  // Sends a message on the underlying message pipe and runs the current
-  // message loop until its response is received. This can be used in tests to
-  // verify that no message was sent on a message pipe in response to some
-  // stimulus.
-  void FlushForTesting() { binding_.FlushForTesting(); }
-
- private:
-  StrongAssociatedBinding(std::unique_ptr<Interface> impl,
-                          AssociatedInterfaceRequest<Interface> request)
-      : impl_(std::move(impl)),
-        binding_(impl_.get(), std::move(request)),
-        weak_factory_(this) {
-    binding_.set_connection_error_with_reason_handler(base::Bind(
-        &StrongAssociatedBinding::OnConnectionError, base::Unretained(this)));
-  }
-
-  ~StrongAssociatedBinding() {}
-
-  void OnConnectionError(uint32_t custom_reason,
-                         const std::string& description) {
-    if (!connection_error_handler_.is_null())
-      connection_error_handler_.Run();
-    else if (!connection_error_with_reason_handler_.is_null())
-      connection_error_with_reason_handler_.Run(custom_reason, description);
-    Close();
-  }
-
-  std::unique_ptr<Interface> impl_;
-  base::Closure connection_error_handler_;
-  ConnectionErrorWithReasonCallback connection_error_with_reason_handler_;
-  AssociatedBinding<Interface> binding_;
-  base::WeakPtrFactory<StrongAssociatedBinding> weak_factory_;
-
-  DISALLOW_COPY_AND_ASSIGN(StrongAssociatedBinding);
-};
-
-template <typename Interface, typename Impl>
-StrongAssociatedBindingPtr<Interface> MakeStrongAssociatedBinding(
-    std::unique_ptr<Impl> impl,
-    AssociatedInterfaceRequest<Interface> request) {
-  return StrongAssociatedBinding<Interface>::Create(std::move(impl),
-                                                    std::move(request));
-}
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_STRONG_ASSOCIATED_BINDING_H_
diff --git a/mojo/public/cpp/bindings/strong_binding.h b/mojo/public/cpp/bindings/strong_binding.h
deleted file mode 100644
index f4b4a06..0000000
--- a/mojo/public/cpp/bindings/strong_binding.h
+++ /dev/null
@@ -1,125 +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 MOJO_PUBLIC_CPP_BINDINGS_STRONG_BINDING_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_STRONG_BINDING_H_
-
-#include <memory>
-#include <string>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/memory/weak_ptr.h"
-#include "mojo/public/cpp/bindings/binding.h"
-#include "mojo/public/cpp/bindings/connection_error_callback.h"
-#include "mojo/public/cpp/bindings/filter_chain.h"
-#include "mojo/public/cpp/bindings/interface_ptr.h"
-#include "mojo/public/cpp/bindings/interface_request.h"
-#include "mojo/public/cpp/bindings/message_header_validator.h"
-#include "mojo/public/cpp/system/core.h"
-
-namespace mojo {
-
-template <typename Interface>
-class StrongBinding;
-
-template <typename Interface>
-using StrongBindingPtr = base::WeakPtr<StrongBinding<Interface>>;
-
-// This connects an interface implementation strongly to a pipe. When a
-// connection error is detected the implementation is deleted. If the task
-// runner that a StrongBinding is bound on is stopped, the connection error
-// handler will not be invoked and the implementation will not be deleted.
-//
-// To use, call StrongBinding<T>::Create() (see below) or the helper
-// MakeStrongBinding function:
-//
-//   mojo::MakeStrongBinding(base::MakeUnique<FooImpl>(),
-//                           std::move(foo_request));
-//
-template <typename Interface>
-class StrongBinding {
- public:
-  // Create a new StrongBinding instance. The instance owns itself, cleaning up
-  // only in the event of a pipe connection error. Returns a WeakPtr to the new
-  // StrongBinding instance.
-  static StrongBindingPtr<Interface> Create(
-      std::unique_ptr<Interface> impl,
-      InterfaceRequest<Interface> request) {
-    StrongBinding* binding =
-        new StrongBinding(std::move(impl), std::move(request));
-    return binding->weak_factory_.GetWeakPtr();
-  }
-
-  // Note: The error handler must not delete the interface implementation.
-  //
-  // This method may only be called after this StrongBinding has been bound to a
-  // message pipe.
-  void set_connection_error_handler(const base::Closure& error_handler) {
-    DCHECK(binding_.is_bound());
-    connection_error_handler_ = error_handler;
-    connection_error_with_reason_handler_.Reset();
-  }
-
-  void set_connection_error_with_reason_handler(
-      const ConnectionErrorWithReasonCallback& error_handler) {
-    DCHECK(binding_.is_bound());
-    connection_error_with_reason_handler_ = error_handler;
-    connection_error_handler_.Reset();
-  }
-
-  // Forces the binding to close. This destroys the StrongBinding instance.
-  void Close() { delete this; }
-
-  Interface* impl() { return impl_.get(); }
-
-  // Sends a message on the underlying message pipe and runs the current
-  // message loop until its response is received. This can be used in tests to
-  // verify that no message was sent on a message pipe in response to some
-  // stimulus.
-  void FlushForTesting() { binding_.FlushForTesting(); }
-
- private:
-  StrongBinding(std::unique_ptr<Interface> impl,
-                InterfaceRequest<Interface> request)
-      : impl_(std::move(impl)),
-        binding_(impl_.get(), std::move(request)),
-        weak_factory_(this) {
-    binding_.set_connection_error_with_reason_handler(
-        base::Bind(&StrongBinding::OnConnectionError, base::Unretained(this)));
-  }
-
-  ~StrongBinding() {}
-
-  void OnConnectionError(uint32_t custom_reason,
-                         const std::string& description) {
-    if (!connection_error_handler_.is_null())
-      connection_error_handler_.Run();
-    else if (!connection_error_with_reason_handler_.is_null())
-      connection_error_with_reason_handler_.Run(custom_reason, description);
-    Close();
-  }
-
-  std::unique_ptr<Interface> impl_;
-  base::Closure connection_error_handler_;
-  ConnectionErrorWithReasonCallback connection_error_with_reason_handler_;
-  Binding<Interface> binding_;
-  base::WeakPtrFactory<StrongBinding> weak_factory_;
-
-  DISALLOW_COPY_AND_ASSIGN(StrongBinding);
-};
-
-template <typename Interface, typename Impl>
-StrongBindingPtr<Interface> MakeStrongBinding(
-    std::unique_ptr<Impl> impl,
-    InterfaceRequest<Interface> request) {
-  return StrongBinding<Interface>::Create(std::move(impl), std::move(request));
-}
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_STRONG_BINDING_H_
diff --git a/mojo/public/cpp/bindings/strong_binding_set.h b/mojo/public/cpp/bindings/strong_binding_set.h
deleted file mode 100644
index f6bcd52..0000000
--- a/mojo/public/cpp/bindings/strong_binding_set.h
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_STRONG_BINDING_SET_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_STRONG_BINDING_SET_H_
-
-#include "mojo/public/cpp/bindings/binding_set.h"
-#include "mojo/public/cpp/bindings/unique_ptr_impl_ref_traits.h"
-
-namespace mojo {
-
-// This class manages a set of bindings. When the pipe a binding is bound to is
-// disconnected, the binding is automatically destroyed and removed from the
-// set, and the interface implementation is deleted. When the StrongBindingSet
-// is destructed, all outstanding bindings in the set are destroyed and all the
-// bound interface implementations are automatically deleted.
-template <typename Interface, typename ContextType = void>
-using StrongBindingSet =
-    BindingSetBase<Interface,
-                   Binding<Interface, UniquePtrImplRefTraits<Interface>>,
-                   ContextType>;
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_STRONG_BINDING_SET_H_
diff --git a/mojo/public/cpp/bindings/struct_ptr.h b/mojo/public/cpp/bindings/struct_ptr.h
deleted file mode 100644
index b135312..0000000
--- a/mojo/public/cpp/bindings/struct_ptr.h
+++ /dev/null
@@ -1,283 +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 MOJO_PUBLIC_CPP_BINDINGS_STRUCT_PTR_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_STRUCT_PTR_H_
-
-#include <functional>
-#include <memory>
-#include <new>
-
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/optional.h"
-#include "mojo/public/cpp/bindings/lib/hash_util.h"
-#include "mojo/public/cpp/bindings/type_converter.h"
-
-namespace mojo {
-namespace internal {
-
-constexpr size_t kHashSeed = 31;
-
-template <typename Struct>
-class StructPtrWTFHelper;
-
-template <typename Struct>
-class InlinedStructPtrWTFHelper;
-
-}  // namespace internal
-
-// Smart pointer wrapping a mojom structure with move-only semantics.
-template <typename S>
-class StructPtr {
- public:
-  using Struct = S;
-
-  StructPtr() = default;
-  StructPtr(decltype(nullptr)) {}
-
-  ~StructPtr() = default;
-
-  StructPtr& operator=(decltype(nullptr)) {
-    reset();
-    return *this;
-  }
-
-  StructPtr(StructPtr&& other) { Take(&other); }
-  StructPtr& operator=(StructPtr&& other) {
-    Take(&other);
-    return *this;
-  }
-
-  template <typename... Args>
-  StructPtr(base::in_place_t, Args&&... args)
-      : ptr_(new Struct(std::forward<Args>(args)...)) {}
-
-  template <typename U>
-  U To() const {
-    return TypeConverter<U, StructPtr>::Convert(*this);
-  }
-
-  void reset() { ptr_.reset(); }
-
-  bool is_null() const { return !ptr_; }
-
-  Struct& operator*() const {
-    DCHECK(ptr_);
-    return *ptr_;
-  }
-  Struct* operator->() const {
-    DCHECK(ptr_);
-    return ptr_.get();
-  }
-  Struct* get() const { return ptr_.get(); }
-
-  void Swap(StructPtr* other) { std::swap(ptr_, other->ptr_); }
-
-  // Please note that calling this method will fail compilation if the value
-  // type |Struct| doesn't have a Clone() method defined (which usually means
-  // that it contains Mojo handles).
-  StructPtr Clone() const { return is_null() ? StructPtr() : ptr_->Clone(); }
-
-  // Compares the pointees (which might both be null).
-  // TODO(tibell): Get rid of Equals in favor of the operator. Same for Hash.
-  bool Equals(const StructPtr& other) const {
-    if (is_null() || other.is_null())
-      return is_null() && other.is_null();
-    return ptr_->Equals(*other.ptr_);
-  }
-
-  // Hashes based on the pointee (which might be null).
-  size_t Hash(size_t seed) const {
-    if (is_null())
-      return internal::HashCombine(seed, 0);
-    return ptr_->Hash(seed);
-  }
-
-  explicit operator bool() const { return !is_null(); }
-
- private:
-  friend class internal::StructPtrWTFHelper<Struct>;
-  void Take(StructPtr* other) {
-    reset();
-    Swap(other);
-  }
-
-  std::unique_ptr<Struct> ptr_;
-
-  DISALLOW_COPY_AND_ASSIGN(StructPtr);
-};
-
-template <typename T>
-bool operator==(const StructPtr<T>& lhs, const StructPtr<T>& rhs) {
-  return lhs.Equals(rhs);
-}
-template <typename T>
-bool operator!=(const StructPtr<T>& lhs, const StructPtr<T>& rhs) {
-  return !(lhs == rhs);
-}
-
-// Designed to be used when Struct is small and copyable.
-template <typename S>
-class InlinedStructPtr {
- public:
-  using Struct = S;
-
-  InlinedStructPtr() : state_(NIL) {}
-  InlinedStructPtr(decltype(nullptr)) : state_(NIL) {}
-
-  ~InlinedStructPtr() {}
-
-  InlinedStructPtr& operator=(decltype(nullptr)) {
-    reset();
-    return *this;
-  }
-
-  InlinedStructPtr(InlinedStructPtr&& other) : state_(NIL) { Take(&other); }
-  InlinedStructPtr& operator=(InlinedStructPtr&& other) {
-    Take(&other);
-    return *this;
-  }
-
-  template <typename... Args>
-  InlinedStructPtr(base::in_place_t, Args&&... args)
-      : value_(std::forward<Args>(args)...), state_(VALID) {}
-
-  template <typename U>
-  U To() const {
-    return TypeConverter<U, InlinedStructPtr>::Convert(*this);
-  }
-
-  void reset() {
-    state_ = NIL;
-    value_. ~Struct();
-    new (&value_) Struct();
-  }
-
-  bool is_null() const { return state_ == NIL; }
-
-  Struct& operator*() const {
-    DCHECK(state_ == VALID);
-    return value_;
-  }
-  Struct* operator->() const {
-    DCHECK(state_ == VALID);
-    return &value_;
-  }
-  Struct* get() const { return &value_; }
-
-  void Swap(InlinedStructPtr* other) {
-    std::swap(value_, other->value_);
-    std::swap(state_, other->state_);
-  }
-
-  InlinedStructPtr Clone() const {
-    return is_null() ? InlinedStructPtr() : value_.Clone();
-  }
-
-  // Compares the pointees (which might both be null).
-  bool Equals(const InlinedStructPtr& other) const {
-    if (is_null() || other.is_null())
-      return is_null() && other.is_null();
-    return value_.Equals(other.value_);
-  }
-
-  // Hashes based on the pointee (which might be null).
-  size_t Hash(size_t seed) const {
-    if (is_null())
-      return internal::HashCombine(seed, 0);
-    return value_.Hash(seed);
-  }
-
-  explicit operator bool() const { return !is_null(); }
-
- private:
-  friend class internal::InlinedStructPtrWTFHelper<Struct>;
-  void Take(InlinedStructPtr* other) {
-    reset();
-    Swap(other);
-  }
-
-  enum State {
-    VALID,
-    NIL,
-    DELETED,  // For use in WTF::HashMap only
-  };
-
-  mutable Struct value_;
-  State state_;
-
-  DISALLOW_COPY_AND_ASSIGN(InlinedStructPtr);
-};
-
-template <typename T>
-bool operator==(const InlinedStructPtr<T>& lhs,
-                const InlinedStructPtr<T>& rhs) {
-  return lhs.Equals(rhs);
-}
-template <typename T>
-bool operator!=(const InlinedStructPtr<T>& lhs,
-                const InlinedStructPtr<T>& rhs) {
-  return !(lhs == rhs);
-}
-
-namespace internal {
-
-template <typename Struct>
-class StructPtrWTFHelper {
- public:
-  static bool IsHashTableDeletedValue(const StructPtr<Struct>& value) {
-    return value.ptr_.get() == reinterpret_cast<Struct*>(1u);
-  }
-
-  static void ConstructDeletedValue(mojo::StructPtr<Struct>& slot) {
-    // |slot| refers to a previous, real value that got deleted and had its
-    // destructor run, so this is the first time the "deleted value" has its
-    // constructor called.
-    //
-    // Dirty trick: implant an invalid pointer in |ptr_|. Destructor isn't
-    // called for deleted buckets, so this is okay.
-    new (&slot) StructPtr<Struct>();
-    slot.ptr_.reset(reinterpret_cast<Struct*>(1u));
-  }
-};
-
-template <typename Struct>
-class InlinedStructPtrWTFHelper {
- public:
-  static bool IsHashTableDeletedValue(const InlinedStructPtr<Struct>& value) {
-    return value.state_ == InlinedStructPtr<Struct>::DELETED;
-  }
-
-  static void ConstructDeletedValue(mojo::InlinedStructPtr<Struct>& slot) {
-    // |slot| refers to a previous, real value that got deleted and had its
-    // destructor run, so this is the first time the "deleted value" has its
-    // constructor called.
-    new (&slot) InlinedStructPtr<Struct>();
-    slot.state_ = InlinedStructPtr<Struct>::DELETED;
-  }
-};
-
-}  // namespace internal
-}  // namespace mojo
-
-namespace std {
-
-template <typename T>
-struct hash<mojo::StructPtr<T>> {
-  size_t operator()(const mojo::StructPtr<T>& value) const {
-    return value.Hash(mojo::internal::kHashSeed);
-  }
-};
-
-template <typename T>
-struct hash<mojo::InlinedStructPtr<T>> {
-  size_t operator()(const mojo::InlinedStructPtr<T>& value) const {
-    return value.Hash(mojo::internal::kHashSeed);
-  }
-};
-
-}  // namespace std
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_STRUCT_PTR_H_
diff --git a/mojo/public/cpp/bindings/struct_traits.h b/mojo/public/cpp/bindings/struct_traits.h
deleted file mode 100644
index 6cc070f..0000000
--- a/mojo/public/cpp/bindings/struct_traits.h
+++ /dev/null
@@ -1,165 +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 MOJO_PUBLIC_CPP_BINDINGS_STRUCT_TRAITS_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_STRUCT_TRAITS_H_
-
-namespace mojo {
-
-// This must be specialized for any type |T| to be serialized/deserialized as
-// a mojom struct. |DataViewType| is the corresponding data view type of the
-// mojom struct. For example, if the mojom struct is example.Foo,
-// |DataViewType| will be example::FooDataView, which can also be referred to by
-// example::Foo::DataView (in chromium) and example::blink::Foo::DataView (in
-// blink).
-//
-// Each specialization needs to implement a few things:
-//   1. Static getters for each field in the Mojom type. These should be
-//      of the form:
-//
-//        static <return type> <field name>(const T& input);
-//
-//      and should return a serializable form of the named field as extracted
-//      from |input|.
-//
-//      Serializable form of a field:
-//        Value or reference of the same type used in the generated stuct
-//        wrapper type, or the following alternatives:
-//        - string:
-//          Value or reference of any type that has a StringTraits defined.
-//          Supported by default: base::StringPiece, std::string,
-//          WTF::String (in blink).
-//
-//        - array:
-//          Value or reference of any type that has an ArrayTraits defined.
-//          Supported by default: std::vector, CArray, WTF::Vector (in blink)
-//
-//        - map:
-//          Value or reference of any type that has a MapTraits defined.
-//          Supported by default: std::map, std::unordered_map,
-//          WTF::HashMap (in blink).
-//
-//        - struct:
-//          Value or reference of any type that has a StructTraits defined.
-//
-//        - enum:
-//          Value of any type that has an EnumTraits defined.
-//
-//      For any nullable string/struct/array/map/union field you could also
-//      return value or reference of base::Optional<T>/WTF::Optional<T>, if T
-//      has the right *Traits defined.
-//
-//      During serialization, getters for string/struct/array/map/union fields
-//      are called twice (one for size calculation and one for actual
-//      serialization). If you want to return a value (as opposed to a
-//      reference) from these getters, you have to be sure that constructing and
-//      copying the returned object is really cheap.
-//
-//      Getters for fields of other types are called once.
-//
-//   2. A static Read() method to set the contents of a |T| instance from a
-//      DataViewType.
-//
-//        static bool Read(DataViewType data, T* output);
-//
-//      The generated DataViewType provides a convenient, inexpensive view of a
-//      serialized struct's field data. The caller guarantees that
-//      |!data.is_null()|.
-//
-//      Returning false indicates invalid incoming data and causes the message
-//      pipe receiving it to be disconnected. Therefore, you can do custom
-//      validation for |T| in this method.
-//
-//   3. [Optional] A static IsNull() method indicating whether a given |T|
-//      instance is null:
-//
-//        static bool IsNull(const T& input);
-//
-//      If this method returns true, it is guaranteed that none of the getters
-//      (described in section 1) will be called for the same |input|. So you
-//      don't have to check whether |input| is null in those getters.
-//
-//      If it is not defined, |T| instances are always considered non-null.
-//
-//      [Optional] A static SetToNull() method to set the contents of a given
-//      |T| instance to null.
-//
-//        static void SetToNull(T* output);
-//
-//      When a null serialized struct is received, the deserialization code
-//      calls this method instead of Read().
-//
-//      NOTE: It is to set |*output|'s contents to a null state, not to set the
-//      |output| pointer itself to null. "Null state" means whatever state you
-//      think it makes sense to map a null serialized struct to.
-//
-//      If it is not defined, null is not allowed to be converted to |T|. In
-//      that case, an incoming null value is considered invalid and causes the
-//      message pipe to be disconnected.
-//
-//   4. [Optional] As mentioned above, getters for string/struct/array/map/union
-//      fields are called multiple times (twice to be exact). If you need to do
-//      some expensive calculation/conversion, you probably want to cache the
-//      result across multiple calls. You can introduce an arbitrary context
-//      object by adding two optional methods:
-//        static void* SetUpContext(const T& input);
-//        static void TearDownContext(const T& input, void* context);
-//
-//      And then you append a second parameter, void* context, to getters:
-//        static <return type> <field name>(const T& input, void* context);
-//
-//      If a T instance is not null, the serialization code will call
-//      SetUpContext() at the beginning, and pass the resulting context pointer
-//      to getters. After serialization is done, it calls TearDownContext() so
-//      that you can do any necessary cleanup.
-//
-// In the description above, methods having an |input| parameter define it as
-// const reference of T. Actually, it can be a non-const reference of T too.
-// E.g., if T contains Mojo handles or interfaces whose ownership needs to be
-// transferred. Correspondingly, it requies you to always give non-const T
-// reference/value to the Mojo bindings for serialization:
-//    - if T is used in the "type_mappings" section of a typemap config file,
-//      you need to declare it as pass-by-value:
-//        type_mappings = [ "MojomType=T[move_only]" ]
-//      or
-//        type_mappings = [ "MojomType=T[copyable_pass_by_value]" ]
-//
-//    - if another type U's StructTraits/UnionTraits has a getter for T, it
-//      needs to return non-const reference/value.
-//
-// EXAMPLE:
-//
-// Mojom definition:
-//   struct Bar {};
-//   struct Foo {
-//     int32 f_integer;
-//     string f_string;
-//     array<string> f_string_array;
-//     Bar f_bar;
-//   };
-//
-// StructTraits for Foo:
-//   template <>
-//   struct StructTraits<FooDataView, CustomFoo> {
-//     // Optional methods dealing with null:
-//     static bool IsNull(const CustomFoo& input);
-//     static void SetToNull(CustomFoo* output);
-//
-//     // Field getters:
-//     static int32_t f_integer(const CustomFoo& input);
-//     static const std::string& f_string(const CustomFoo& input);
-//     static const std::vector<std::string>& f_string_array(
-//         const CustomFoo& input);
-//     // Assuming there is a StructTraits<Bar, CustomBar> defined.
-//     static const CustomBar& f_bar(const CustomFoo& input);
-//
-//     static bool Read(FooDataView data, CustomFoo* output);
-//   };
-//
-template <typename DataViewType, typename T>
-struct StructTraits;
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_STRUCT_TRAITS_H_
diff --git a/mojo/public/cpp/bindings/sync_call_restrictions.h b/mojo/public/cpp/bindings/sync_call_restrictions.h
deleted file mode 100644
index 5529042..0000000
--- a/mojo/public/cpp/bindings/sync_call_restrictions.h
+++ /dev/null
@@ -1,108 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_SYNC_CALL_RESTRICTIONS_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_SYNC_CALL_RESTRICTIONS_H_
-
-#include "base/macros.h"
-#include "base/threading/thread_restrictions.h"
-#include "mojo/public/cpp/bindings/bindings_export.h"
-
-#if (!defined(NDEBUG) || defined(DCHECK_ALWAYS_ON))
-#define ENABLE_SYNC_CALL_RESTRICTIONS 1
-#else
-#define ENABLE_SYNC_CALL_RESTRICTIONS 0
-#endif
-
-namespace leveldb {
-class LevelDBMojoProxy;
-}
-
-namespace prefs {
-class PersistentPrefStoreClient;
-}
-
-namespace ui {
-class Gpu;
-}
-
-namespace views {
-class ClipboardMus;
-}
-
-namespace mojo {
-
-// In some processes, sync calls are disallowed. For example, in the browser
-// process we don't want any sync calls to child processes for performance,
-// security and stability reasons. SyncCallRestrictions helps to enforce such
-// rules.
-//
-// Before processing a sync call, the bindings call
-// SyncCallRestrictions::AssertSyncCallAllowed() to check whether sync calls are
-// allowed. By default, it is determined by the mojo system property
-// MOJO_PROPERTY_SYNC_CALL_ALLOWED. If the default setting says no but you have
-// a very compelling reason to disregard that (which should be very very rare),
-// you can override it by constructing a ScopedAllowSyncCall object, which
-// allows making sync calls on the current thread during its lifetime.
-class MOJO_CPP_BINDINGS_EXPORT SyncCallRestrictions {
- public:
-#if ENABLE_SYNC_CALL_RESTRICTIONS
-  // Checks whether the current thread is allowed to make sync calls, and causes
-  // a DCHECK if not.
-  static void AssertSyncCallAllowed();
-#else
-  // Inline the empty definitions of functions so that they can be compiled out.
-  static void AssertSyncCallAllowed() {}
-#endif
-
- private:
-  // DO NOT ADD ANY OTHER FRIEND STATEMENTS, talk to mojo/OWNERS first.
-  // BEGIN ALLOWED USAGE.
-  friend class ui::Gpu;  // http://crbug.com/620058
-  // LevelDBMojoProxy makes same-process sync calls from the DB thread.
-  friend class leveldb::LevelDBMojoProxy;
-  // Pref service connection is sync at startup.
-  friend class prefs::PersistentPrefStoreClient;
-
-  // END ALLOWED USAGE.
-
-  // BEGIN USAGE THAT NEEDS TO BE FIXED.
-  // In the non-mus case, we called blocking OS functions in the ui::Clipboard
-  // implementation which weren't caught by sync call restrictions. Our blocking
-  // calls to mus, however, are.
-  friend class views::ClipboardMus;
-  // END USAGE THAT NEEDS TO BE FIXED.
-
-#if ENABLE_SYNC_CALL_RESTRICTIONS
-  static void IncreaseScopedAllowCount();
-  static void DecreaseScopedAllowCount();
-#else
-  static void IncreaseScopedAllowCount() {}
-  static void DecreaseScopedAllowCount() {}
-#endif
-
-  // If a process is configured to disallow sync calls in general, constructing
-  // a ScopedAllowSyncCall object temporarily allows making sync calls on the
-  // current thread. Doing this is almost always incorrect, which is why we
-  // limit who can use this through friend. If you find yourself needing to use
-  // this, talk to mojo/OWNERS.
-  class ScopedAllowSyncCall {
-   public:
-    ScopedAllowSyncCall() { IncreaseScopedAllowCount(); }
-    ~ScopedAllowSyncCall() { DecreaseScopedAllowCount(); }
-
-   private:
-#if ENABLE_SYNC_CALL_RESTRICTIONS
-    base::ThreadRestrictions::ScopedAllowWait allow_wait_;
-#endif
-
-    DISALLOW_COPY_AND_ASSIGN(ScopedAllowSyncCall);
-  };
-
-  DISALLOW_IMPLICIT_CONSTRUCTORS(SyncCallRestrictions);
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_SYNC_CALL_RESTRICTIONS_H_
diff --git a/mojo/public/cpp/bindings/sync_event_watcher.h b/mojo/public/cpp/bindings/sync_event_watcher.h
deleted file mode 100644
index 6e25484..0000000
--- a/mojo/public/cpp/bindings/sync_event_watcher.h
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_SYNC_EVENT_WATCHER_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_SYNC_EVENT_WATCHER_H_
-
-#include <stddef.h>
-
-#include "base/callback.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/threading/thread_checker.h"
-#include "mojo/public/cpp/bindings/bindings_export.h"
-#include "mojo/public/cpp/bindings/sync_handle_registry.h"
-
-namespace mojo {
-
-// SyncEventWatcher supports waiting on a base::WaitableEvent to signal while
-// also allowing other SyncEventWatchers and SyncHandleWatchers on the same
-// thread to wake up as needed.
-//
-// This class is not thread safe.
-class MOJO_CPP_BINDINGS_EXPORT SyncEventWatcher {
- public:
-  SyncEventWatcher(base::WaitableEvent* event, const base::Closure& callback);
-
-  ~SyncEventWatcher();
-
-  // Registers |event_| with SyncHandleRegistry, so that when others perform
-  // sync watching on the same thread, |event_| will be watched along with them.
-  void AllowWokenUpBySyncWatchOnSameThread();
-
-  // Waits on |event_| plus all other events and handles registered with this
-  // thread's SyncHandleRegistry, running callbacks synchronously for any ready
-  // events and handles.
-  // This method:
-  //   - returns true when |should_stop| is set to true;
-  //   - return false when any error occurs, including this object being
-  //     destroyed during a callback.
-  bool SyncWatch(const bool* should_stop);
-
- private:
-  void IncrementRegisterCount();
-  void DecrementRegisterCount();
-
-  base::WaitableEvent* const event_;
-  const base::Closure callback_;
-
-  // Whether |event_| has been registered with SyncHandleRegistry.
-  bool registered_ = false;
-
-  // If non-zero, |event_| should be registered with SyncHandleRegistry.
-  size_t register_request_count_ = 0;
-
-  scoped_refptr<SyncHandleRegistry> registry_;
-
-  scoped_refptr<base::RefCountedData<bool>> destroyed_;
-
-  base::ThreadChecker thread_checker_;
-
-  DISALLOW_COPY_AND_ASSIGN(SyncEventWatcher);
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_SYNC_EVENT_WATCHER_H_
diff --git a/mojo/public/cpp/bindings/sync_handle_registry.h b/mojo/public/cpp/bindings/sync_handle_registry.h
deleted file mode 100644
index afb3b56..0000000
--- a/mojo/public/cpp/bindings/sync_handle_registry.h
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_SYNC_HANDLE_REGISTRY_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_SYNC_HANDLE_REGISTRY_H_
-
-#include <map>
-#include <unordered_map>
-
-#include "base/callback.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/threading/thread_checker.h"
-#include "mojo/public/cpp/bindings/bindings_export.h"
-#include "mojo/public/cpp/system/core.h"
-#include "mojo/public/cpp/system/wait_set.h"
-
-namespace mojo {
-
-// SyncHandleRegistry is a thread-local storage to register handles that want to
-// be watched together.
-//
-// This class is not thread safe.
-class MOJO_CPP_BINDINGS_EXPORT SyncHandleRegistry
-    : public base::RefCounted<SyncHandleRegistry> {
- public:
-  // Returns a thread-local object.
-  static scoped_refptr<SyncHandleRegistry> current();
-
-  using HandleCallback = base::Callback<void(MojoResult)>;
-  bool RegisterHandle(const Handle& handle,
-                      MojoHandleSignals handle_signals,
-                      const HandleCallback& callback);
-
-  void UnregisterHandle(const Handle& handle);
-
-  // Registers a |base::WaitableEvent| which can be used to wake up
-  // Wait() before any handle signals. |event| is not owned, and if it signals
-  // during Wait(), |callback| is invoked. Returns |true| if registered
-  // successfully or |false| if |event| was already registered.
-  bool RegisterEvent(base::WaitableEvent* event, const base::Closure& callback);
-
-  void UnregisterEvent(base::WaitableEvent* event);
-
-  // Waits on all the registered handles and events and runs callbacks
-  // synchronously for any that become ready.
-  // The method:
-  //   - returns true when any element of |should_stop| is set to true;
-  //   - returns false when any error occurs.
-  bool Wait(const bool* should_stop[], size_t count);
-
- private:
-  friend class base::RefCounted<SyncHandleRegistry>;
-
-  SyncHandleRegistry();
-  ~SyncHandleRegistry();
-
-  WaitSet wait_set_;
-  std::map<Handle, HandleCallback> handles_;
-  std::map<base::WaitableEvent*, base::Closure> events_;
-
-  base::ThreadChecker thread_checker_;
-
-  DISALLOW_COPY_AND_ASSIGN(SyncHandleRegistry);
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_SYNC_HANDLE_REGISTRY_H_
diff --git a/mojo/public/cpp/bindings/sync_handle_watcher.h b/mojo/public/cpp/bindings/sync_handle_watcher.h
deleted file mode 100644
index eff73dd..0000000
--- a/mojo/public/cpp/bindings/sync_handle_watcher.h
+++ /dev/null
@@ -1,75 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_SYNC_HANDLE_WATCHER_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_SYNC_HANDLE_WATCHER_H_
-
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/threading/thread_checker.h"
-#include "mojo/public/cpp/bindings/bindings_export.h"
-#include "mojo/public/cpp/bindings/sync_handle_registry.h"
-#include "mojo/public/cpp/system/core.h"
-
-namespace mojo {
-
-// SyncHandleWatcher supports watching a handle synchronously. It also supports
-// registering the handle with a thread-local storage (SyncHandleRegistry), so
-// that when other SyncHandleWatcher instances on the same thread perform sync
-// handle watching, this handle will be watched together.
-//
-// SyncHandleWatcher is used for sync methods. While a sync call is waiting for
-// response, we would like to block the thread. On the other hand, we need
-// incoming sync method requests on the same thread to be able to reenter. We
-// also need master interface endpoints to continue dispatching messages for
-// associated endpoints on different threads.
-//
-// This class is not thread safe.
-class MOJO_CPP_BINDINGS_EXPORT SyncHandleWatcher {
- public:
-  // Note: |handle| must outlive this object.
-  SyncHandleWatcher(const Handle& handle,
-                    MojoHandleSignals handle_signals,
-                    const SyncHandleRegistry::HandleCallback& callback);
-
-  ~SyncHandleWatcher();
-
-  // Registers |handle_| with SyncHandleRegistry, so that when others perform
-  // sync handle watching on the same thread, |handle_| will be watched
-  // together.
-  void AllowWokenUpBySyncWatchOnSameThread();
-
-  // Waits on |handle_| plus all handles registered with SyncHandleRegistry and
-  // runs callbacks synchronously for those ready handles.
-  // This method:
-  //   - returns true when |should_stop| is set to true;
-  //   - return false when any error occurs, including this object being
-  //     destroyed during a callback.
-  bool SyncWatch(const bool* should_stop);
-
- private:
-  void IncrementRegisterCount();
-  void DecrementRegisterCount();
-
-  const Handle handle_;
-  const MojoHandleSignals handle_signals_;
-  SyncHandleRegistry::HandleCallback callback_;
-
-  // Whether |handle_| has been registered with SyncHandleRegistry.
-  bool registered_;
-  // If non-zero, |handle_| should be registered with SyncHandleRegistry.
-  size_t register_request_count_;
-
-  scoped_refptr<SyncHandleRegistry> registry_;
-
-  scoped_refptr<base::RefCountedData<bool>> destroyed_;
-
-  base::ThreadChecker thread_checker_;
-
-  DISALLOW_COPY_AND_ASSIGN(SyncHandleWatcher);
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_SYNC_HANDLE_WATCHER_H_
diff --git a/mojo/public/cpp/bindings/tests/BUILD.gn b/mojo/public/cpp/bindings/tests/BUILD.gn
deleted file mode 100644
index 668ca6d..0000000
--- a/mojo/public/cpp/bindings/tests/BUILD.gn
+++ /dev/null
@@ -1,146 +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.
-
-source_set("tests") {
-  testonly = true
-
-  sources = [
-    "associated_interface_unittest.cc",
-    "bind_task_runner_unittest.cc",
-    "binding_callback_unittest.cc",
-    "binding_set_unittest.cc",
-    "binding_unittest.cc",
-    "buffer_unittest.cc",
-    "connector_unittest.cc",
-    "constant_unittest.cc",
-    "container_test_util.cc",
-    "container_test_util.h",
-    "data_view_unittest.cc",
-    "equals_unittest.cc",
-    "handle_passing_unittest.cc",
-    "hash_unittest.cc",
-    "interface_ptr_unittest.cc",
-    "map_unittest.cc",
-    "message_queue.cc",
-    "message_queue.h",
-    "multiplex_router_unittest.cc",
-    "report_bad_message_unittest.cc",
-    "request_response_unittest.cc",
-    "router_test_util.cc",
-    "router_test_util.h",
-    "sample_service_unittest.cc",
-    "serialization_warning_unittest.cc",
-    "struct_unittest.cc",
-    "sync_method_unittest.cc",
-    "type_conversion_unittest.cc",
-    "union_unittest.cc",
-    "validation_context_unittest.cc",
-    "validation_unittest.cc",
-    "variant_test_util.h",
-  ]
-
-  deps = [
-    ":mojo_public_bindings_test_utils",
-    "//base/test:test_support",
-    "//mojo/edk/system",
-    "//mojo/public/cpp/bindings",
-    "//mojo/public/cpp/system",
-    "//mojo/public/cpp/test_support:test_utils",
-    "//mojo/public/interfaces/bindings/tests:test_associated_interfaces",
-    "//mojo/public/interfaces/bindings/tests:test_export_component",
-    "//mojo/public/interfaces/bindings/tests:test_export_component2",
-    "//mojo/public/interfaces/bindings/tests:test_exported_import",
-    "//mojo/public/interfaces/bindings/tests:test_interfaces",
-    "//mojo/public/interfaces/bindings/tests:test_struct_traits_interfaces",
-    "//testing/gtest",
-  ]
-
-  data = [
-    "//mojo/public/interfaces/bindings/tests/data/validation/",
-  ]
-
-  if (is_ios) {
-    assert_no_deps = [ "//third_party/WebKit/*" ]
-  } else {
-    sources += [
-      "pickle_unittest.cc",
-      "struct_traits_unittest.cc",
-    ]
-
-    deps += [ "//mojo/public/interfaces/bindings/tests:test_interfaces_blink" ]
-  }
-}
-
-if (!is_ios) {
-  source_set("for_blink_tests") {
-    testonly = true
-
-    sources = [
-      "container_test_util.cc",
-      "container_test_util.h",
-      "variant_test_util.h",
-      "wtf_hash_unittest.cc",
-      "wtf_map_unittest.cc",
-      "wtf_types_unittest.cc",
-    ]
-
-    deps = [
-      "//mojo/public/cpp/bindings",
-      "//mojo/public/cpp/system",
-      "//mojo/public/interfaces/bindings/tests:test_export_blink_component",
-      "//mojo/public/interfaces/bindings/tests:test_exported_import_blink",
-      "//mojo/public/interfaces/bindings/tests:test_interfaces",
-      "//mojo/public/interfaces/bindings/tests:test_interfaces_blink",
-      "//mojo/public/interfaces/bindings/tests:test_wtf_types",
-      "//mojo/public/interfaces/bindings/tests:test_wtf_types_blink",
-      "//testing/gtest",
-    ]
-  }
-}
-
-source_set("struct_with_traits_impl") {
-  sources = [
-    "struct_with_traits_impl.cc",
-    "struct_with_traits_impl.h",
-  ]
-
-  deps = [
-    "//base",
-    "//mojo/public/cpp/system:system",
-  ]
-}
-
-source_set("perftests") {
-  testonly = true
-
-  sources = [
-    "bindings_perftest.cc",
-  ]
-
-  if (!is_ios) {
-    sources += [ "e2e_perftest.cc" ]
-  }
-
-  deps = [
-    "//base/test:test_support",
-    "//mojo/edk/system",
-    "//mojo/edk/test:test_support",
-    "//mojo/public/cpp/bindings",
-    "//mojo/public/cpp/system",
-    "//mojo/public/cpp/test_support:test_utils",
-    "//mojo/public/interfaces/bindings/tests:test_interfaces",
-    "//testing/gtest",
-  ]
-}
-
-source_set("mojo_public_bindings_test_utils") {
-  sources = [
-    "validation_test_input_parser.cc",
-    "validation_test_input_parser.h",
-  ]
-
-  deps = [
-    "//mojo/public/c/system",
-  ]
-}
diff --git a/mojo/public/cpp/bindings/tests/associated_interface_unittest.cc b/mojo/public/cpp/bindings/tests/associated_interface_unittest.cc
deleted file mode 100644
index be225e4..0000000
--- a/mojo/public/cpp/bindings/tests/associated_interface_unittest.cc
+++ /dev/null
@@ -1,1189 +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 <stddef.h>
-#include <stdint.h>
-#include <algorithm>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/callback_helpers.h"
-#include "base/memory/ptr_util.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "base/single_thread_task_runner.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/threading/sequenced_task_runner_handle.h"
-#include "base/threading/thread.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "mojo/public/cpp/bindings/associated_binding.h"
-#include "mojo/public/cpp/bindings/associated_interface_ptr.h"
-#include "mojo/public/cpp/bindings/associated_interface_ptr_info.h"
-#include "mojo/public/cpp/bindings/associated_interface_request.h"
-#include "mojo/public/cpp/bindings/binding.h"
-#include "mojo/public/cpp/bindings/lib/multiplex_router.h"
-#include "mojo/public/cpp/bindings/strong_binding.h"
-#include "mojo/public/cpp/bindings/thread_safe_interface_ptr.h"
-#include "mojo/public/interfaces/bindings/tests/ping_service.mojom.h"
-#include "mojo/public/interfaces/bindings/tests/test_associated_interfaces.mojom.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace test {
-namespace {
-
-using mojo::internal::MultiplexRouter;
-
-class IntegerSenderImpl : public IntegerSender {
- public:
-  explicit IntegerSenderImpl(AssociatedInterfaceRequest<IntegerSender> request)
-      : binding_(this, std::move(request)) {}
-
-  ~IntegerSenderImpl() override {}
-
-  void set_notify_send_method_called(
-      const base::Callback<void(int32_t)>& callback) {
-    notify_send_method_called_ = callback;
-  }
-
-  void Echo(int32_t value, const EchoCallback& callback) override {
-    callback.Run(value);
-  }
-  void Send(int32_t value) override { notify_send_method_called_.Run(value); }
-
-  AssociatedBinding<IntegerSender>* binding() { return &binding_; }
-
-  void set_connection_error_handler(const base::Closure& handler) {
-    binding_.set_connection_error_handler(handler);
-  }
-
- private:
-  AssociatedBinding<IntegerSender> binding_;
-  base::Callback<void(int32_t)> notify_send_method_called_;
-};
-
-class IntegerSenderConnectionImpl : public IntegerSenderConnection {
- public:
-  explicit IntegerSenderConnectionImpl(
-      InterfaceRequest<IntegerSenderConnection> request)
-      : binding_(this, std::move(request)) {}
-
-  ~IntegerSenderConnectionImpl() override {}
-
-  void GetSender(AssociatedInterfaceRequest<IntegerSender> sender) override {
-    IntegerSenderImpl* sender_impl = new IntegerSenderImpl(std::move(sender));
-    sender_impl->set_connection_error_handler(
-        base::Bind(&DeleteSender, sender_impl));
-  }
-
-  void AsyncGetSender(const AsyncGetSenderCallback& callback) override {
-    IntegerSenderAssociatedPtrInfo ptr_info;
-    auto request = MakeRequest(&ptr_info);
-    GetSender(std::move(request));
-    callback.Run(std::move(ptr_info));
-  }
-
-  Binding<IntegerSenderConnection>* binding() { return &binding_; }
-
- private:
-  static void DeleteSender(IntegerSenderImpl* sender) { delete sender; }
-
-  Binding<IntegerSenderConnection> binding_;
-};
-
-class AssociatedInterfaceTest : public testing::Test {
- public:
-  AssociatedInterfaceTest() {}
-  ~AssociatedInterfaceTest() override { base::RunLoop().RunUntilIdle(); }
-
-  void PumpMessages() { base::RunLoop().RunUntilIdle(); }
-
-  template <typename T>
-  AssociatedInterfacePtrInfo<T> EmulatePassingAssociatedPtrInfo(
-      AssociatedInterfacePtrInfo<T> ptr_info,
-      scoped_refptr<MultiplexRouter> source,
-      scoped_refptr<MultiplexRouter> target) {
-    ScopedInterfaceEndpointHandle handle = ptr_info.PassHandle();
-    CHECK(handle.pending_association());
-    auto id = source->AssociateInterface(std::move(handle));
-    return AssociatedInterfacePtrInfo<T>(target->CreateLocalEndpointHandle(id),
-                                         ptr_info.version());
-  }
-
-  void CreateRouterPair(scoped_refptr<MultiplexRouter>* router0,
-                        scoped_refptr<MultiplexRouter>* router1) {
-    MessagePipe pipe;
-    *router0 = new MultiplexRouter(std::move(pipe.handle0),
-                                   MultiplexRouter::MULTI_INTERFACE, true,
-                                   base::ThreadTaskRunnerHandle::Get());
-    *router1 = new MultiplexRouter(std::move(pipe.handle1),
-                                   MultiplexRouter::MULTI_INTERFACE, false,
-                                   base::ThreadTaskRunnerHandle::Get());
-  }
-
-  void CreateIntegerSenderWithExistingRouters(
-      scoped_refptr<MultiplexRouter> router0,
-      IntegerSenderAssociatedPtrInfo* ptr_info0,
-      scoped_refptr<MultiplexRouter> router1,
-      IntegerSenderAssociatedRequest* request1) {
-    *request1 = MakeRequest(ptr_info0);
-    *ptr_info0 = EmulatePassingAssociatedPtrInfo(std::move(*ptr_info0), router1,
-                                                 router0);
-  }
-
-  void CreateIntegerSender(IntegerSenderAssociatedPtrInfo* ptr_info,
-                           IntegerSenderAssociatedRequest* request) {
-    scoped_refptr<MultiplexRouter> router0;
-    scoped_refptr<MultiplexRouter> router1;
-    CreateRouterPair(&router0, &router1);
-    CreateIntegerSenderWithExistingRouters(router1, ptr_info, router0, request);
-  }
-
-  // Okay to call from any thread.
-  void QuitRunLoop(base::RunLoop* run_loop) {
-    if (loop_.task_runner()->BelongsToCurrentThread()) {
-      run_loop->Quit();
-    } else {
-      loop_.task_runner()->PostTask(
-          FROM_HERE,
-          base::Bind(&AssociatedInterfaceTest::QuitRunLoop,
-                     base::Unretained(this), base::Unretained(run_loop)));
-    }
-  }
-
- private:
-  base::MessageLoop loop_;
-};
-
-void DoSetFlagAndRunClosure(bool* flag, const base::Closure& closure) {
-  *flag = true;
-  closure.Run();
-}
-
-void DoExpectValueSetFlagAndRunClosure(int32_t expected_value,
-                                       bool* flag,
-                                       const base::Closure& closure,
-                                       int32_t value) {
-  EXPECT_EQ(expected_value, value);
-  DoSetFlagAndRunClosure(flag, closure);
-}
-
-base::Closure SetFlagAndRunClosure(bool* flag, const base::Closure& closure) {
-  return base::Bind(&DoSetFlagAndRunClosure, flag, closure);
-}
-
-base::Callback<void(int32_t)> ExpectValueSetFlagAndRunClosure(
-    int32_t expected_value,
-    bool* flag,
-    const base::Closure& closure) {
-  return base::Bind(
-      &DoExpectValueSetFlagAndRunClosure, expected_value, flag, closure);
-}
-
-void Fail() {
-  FAIL() << "Unexpected connection error";
-}
-
-TEST_F(AssociatedInterfaceTest, InterfacesAtBothEnds) {
-  // Bind to the same pipe two associated interfaces, whose implementation lives
-  // at different ends. Test that the two don't interfere with each other.
-
-  scoped_refptr<MultiplexRouter> router0;
-  scoped_refptr<MultiplexRouter> router1;
-  CreateRouterPair(&router0, &router1);
-
-  AssociatedInterfaceRequest<IntegerSender> request;
-  IntegerSenderAssociatedPtrInfo ptr_info;
-  CreateIntegerSenderWithExistingRouters(router1, &ptr_info, router0, &request);
-
-  IntegerSenderImpl impl0(std::move(request));
-  AssociatedInterfacePtr<IntegerSender> ptr0;
-  ptr0.Bind(std::move(ptr_info));
-
-  CreateIntegerSenderWithExistingRouters(router0, &ptr_info, router1, &request);
-
-  IntegerSenderImpl impl1(std::move(request));
-  AssociatedInterfacePtr<IntegerSender> ptr1;
-  ptr1.Bind(std::move(ptr_info));
-
-  base::RunLoop run_loop, run_loop2;
-  bool ptr0_callback_run = false;
-  ptr0->Echo(123, ExpectValueSetFlagAndRunClosure(123, &ptr0_callback_run,
-                                                  run_loop.QuitClosure()));
-
-  bool ptr1_callback_run = false;
-  ptr1->Echo(456, ExpectValueSetFlagAndRunClosure(456, &ptr1_callback_run,
-                                                  run_loop2.QuitClosure()));
-
-  run_loop.Run();
-  run_loop2.Run();
-  EXPECT_TRUE(ptr0_callback_run);
-  EXPECT_TRUE(ptr1_callback_run);
-
-  bool ptr0_error_callback_run = false;
-  base::RunLoop run_loop3;
-  ptr0.set_connection_error_handler(
-      SetFlagAndRunClosure(&ptr0_error_callback_run, run_loop3.QuitClosure()));
-
-  impl0.binding()->Close();
-  run_loop3.Run();
-  EXPECT_TRUE(ptr0_error_callback_run);
-
-  bool impl1_error_callback_run = false;
-  base::RunLoop run_loop4;
-  impl1.binding()->set_connection_error_handler(
-      SetFlagAndRunClosure(&impl1_error_callback_run, run_loop4.QuitClosure()));
-
-  ptr1.reset();
-  run_loop4.Run();
-  EXPECT_TRUE(impl1_error_callback_run);
-}
-
-class TestSender {
- public:
-  TestSender()
-      : sender_thread_("TestSender"),
-        next_sender_(nullptr),
-        max_value_to_send_(-1) {
-    sender_thread_.Start();
-  }
-
-  // The following three methods are called on the corresponding sender thread.
-  void SetUp(IntegerSenderAssociatedPtrInfo ptr_info,
-             TestSender* next_sender,
-             int32_t max_value_to_send) {
-    CHECK(sender_thread_.task_runner()->BelongsToCurrentThread());
-
-    ptr_.Bind(std::move(ptr_info));
-    next_sender_ = next_sender ? next_sender : this;
-    max_value_to_send_ = max_value_to_send;
-  }
-
-  void Send(int32_t value) {
-    CHECK(sender_thread_.task_runner()->BelongsToCurrentThread());
-
-    if (value > max_value_to_send_)
-      return;
-
-    ptr_->Send(value);
-
-    next_sender_->sender_thread()->task_runner()->PostTask(
-        FROM_HERE,
-        base::Bind(&TestSender::Send, base::Unretained(next_sender_), ++value));
-  }
-
-  void TearDown() {
-    CHECK(sender_thread_.task_runner()->BelongsToCurrentThread());
-
-    ptr_.reset();
-  }
-
-  base::Thread* sender_thread() { return &sender_thread_; }
-
- private:
-  base::Thread sender_thread_;
-  TestSender* next_sender_;
-  int32_t max_value_to_send_;
-
-  AssociatedInterfacePtr<IntegerSender> ptr_;
-};
-
-class TestReceiver {
- public:
-  TestReceiver() : receiver_thread_("TestReceiver"), expected_calls_(0) {
-    receiver_thread_.Start();
-  }
-
-  void SetUp(AssociatedInterfaceRequest<IntegerSender> request0,
-             AssociatedInterfaceRequest<IntegerSender> request1,
-             size_t expected_calls,
-             const base::Closure& notify_finish) {
-    CHECK(receiver_thread_.task_runner()->BelongsToCurrentThread());
-
-    impl0_.reset(new IntegerSenderImpl(std::move(request0)));
-    impl0_->set_notify_send_method_called(
-        base::Bind(&TestReceiver::SendMethodCalled, base::Unretained(this)));
-    impl1_.reset(new IntegerSenderImpl(std::move(request1)));
-    impl1_->set_notify_send_method_called(
-        base::Bind(&TestReceiver::SendMethodCalled, base::Unretained(this)));
-
-    expected_calls_ = expected_calls;
-    notify_finish_ = notify_finish;
-  }
-
-  void TearDown() {
-    CHECK(receiver_thread_.task_runner()->BelongsToCurrentThread());
-
-    impl0_.reset();
-    impl1_.reset();
-  }
-
-  base::Thread* receiver_thread() { return &receiver_thread_; }
-  const std::vector<int32_t>& values() const { return values_; }
-
- private:
-  void SendMethodCalled(int32_t value) {
-    values_.push_back(value);
-
-    if (values_.size() >= expected_calls_)
-      notify_finish_.Run();
-  }
-
-  base::Thread receiver_thread_;
-  size_t expected_calls_;
-
-  std::unique_ptr<IntegerSenderImpl> impl0_;
-  std::unique_ptr<IntegerSenderImpl> impl1_;
-
-  std::vector<int32_t> values_;
-
-  base::Closure notify_finish_;
-};
-
-class NotificationCounter {
- public:
-  NotificationCounter(size_t total_count, const base::Closure& notify_finish)
-      : total_count_(total_count),
-        current_count_(0),
-        notify_finish_(notify_finish) {}
-
-  ~NotificationCounter() {}
-
-  // Okay to call from any thread.
-  void OnGotNotification() {
-    bool finshed = false;
-    {
-      base::AutoLock locker(lock_);
-      CHECK_LT(current_count_, total_count_);
-      current_count_++;
-      finshed = current_count_ == total_count_;
-    }
-
-    if (finshed)
-      notify_finish_.Run();
-  }
-
- private:
-  base::Lock lock_;
-  const size_t total_count_;
-  size_t current_count_;
-  base::Closure notify_finish_;
-};
-
-TEST_F(AssociatedInterfaceTest, MultiThreadAccess) {
-  // Set up four associated interfaces on a message pipe. Use the inteface
-  // pointers on four threads in parallel; run the interface implementations on
-  // two threads. Test that multi-threaded access works.
-
-  const int32_t kMaxValue = 1000;
-  MessagePipe pipe;
-  scoped_refptr<MultiplexRouter> router0;
-  scoped_refptr<MultiplexRouter> router1;
-  CreateRouterPair(&router0, &router1);
-
-  AssociatedInterfaceRequest<IntegerSender> requests[4];
-  IntegerSenderAssociatedPtrInfo ptr_infos[4];
-  for (size_t i = 0; i < 4; ++i) {
-    CreateIntegerSenderWithExistingRouters(router1, &ptr_infos[i], router0,
-                                           &requests[i]);
-  }
-
-  TestSender senders[4];
-  for (size_t i = 0; i < 4; ++i) {
-    senders[i].sender_thread()->task_runner()->PostTask(
-        FROM_HERE, base::Bind(&TestSender::SetUp, base::Unretained(&senders[i]),
-                              base::Passed(&ptr_infos[i]), nullptr,
-                              kMaxValue * (i + 1) / 4));
-  }
-
-  base::RunLoop run_loop;
-  TestReceiver receivers[2];
-  NotificationCounter counter(
-      2, base::Bind(&AssociatedInterfaceTest::QuitRunLoop,
-                    base::Unretained(this), base::Unretained(&run_loop)));
-  for (size_t i = 0; i < 2; ++i) {
-    receivers[i].receiver_thread()->task_runner()->PostTask(
-        FROM_HERE,
-        base::Bind(&TestReceiver::SetUp, base::Unretained(&receivers[i]),
-                   base::Passed(&requests[2 * i]),
-                   base::Passed(&requests[2 * i + 1]),
-                   static_cast<size_t>(kMaxValue / 2),
-                   base::Bind(&NotificationCounter::OnGotNotification,
-                              base::Unretained(&counter))));
-  }
-
-  for (size_t i = 0; i < 4; ++i) {
-    senders[i].sender_thread()->task_runner()->PostTask(
-        FROM_HERE, base::Bind(&TestSender::Send, base::Unretained(&senders[i]),
-                              kMaxValue * i / 4 + 1));
-  }
-
-  run_loop.Run();
-
-  for (size_t i = 0; i < 4; ++i) {
-    base::RunLoop run_loop;
-    senders[i].sender_thread()->task_runner()->PostTaskAndReply(
-        FROM_HERE,
-        base::Bind(&TestSender::TearDown, base::Unretained(&senders[i])),
-        base::Bind(&AssociatedInterfaceTest::QuitRunLoop,
-                   base::Unretained(this), base::Unretained(&run_loop)));
-    run_loop.Run();
-  }
-
-  for (size_t i = 0; i < 2; ++i) {
-    base::RunLoop run_loop;
-    receivers[i].receiver_thread()->task_runner()->PostTaskAndReply(
-        FROM_HERE,
-        base::Bind(&TestReceiver::TearDown, base::Unretained(&receivers[i])),
-        base::Bind(&AssociatedInterfaceTest::QuitRunLoop,
-                   base::Unretained(this), base::Unretained(&run_loop)));
-    run_loop.Run();
-  }
-
-  EXPECT_EQ(static_cast<size_t>(kMaxValue / 2), receivers[0].values().size());
-  EXPECT_EQ(static_cast<size_t>(kMaxValue / 2), receivers[1].values().size());
-
-  std::vector<int32_t> all_values;
-  all_values.insert(all_values.end(), receivers[0].values().begin(),
-                    receivers[0].values().end());
-  all_values.insert(all_values.end(), receivers[1].values().begin(),
-                    receivers[1].values().end());
-
-  std::sort(all_values.begin(), all_values.end());
-  for (size_t i = 0; i < all_values.size(); ++i)
-    ASSERT_EQ(static_cast<int32_t>(i + 1), all_values[i]);
-}
-
-TEST_F(AssociatedInterfaceTest, FIFO) {
-  // Set up four associated interfaces on a message pipe. Use the inteface
-  // pointers on four threads; run the interface implementations on two threads.
-  // Take turns to make calls using the four pointers. Test that FIFO-ness is
-  // preserved.
-
-  const int32_t kMaxValue = 100;
-  MessagePipe pipe;
-  scoped_refptr<MultiplexRouter> router0;
-  scoped_refptr<MultiplexRouter> router1;
-  CreateRouterPair(&router0, &router1);
-
-  AssociatedInterfaceRequest<IntegerSender> requests[4];
-  IntegerSenderAssociatedPtrInfo ptr_infos[4];
-  for (size_t i = 0; i < 4; ++i) {
-    CreateIntegerSenderWithExistingRouters(router1, &ptr_infos[i], router0,
-                                           &requests[i]);
-  }
-
-  TestSender senders[4];
-  for (size_t i = 0; i < 4; ++i) {
-    senders[i].sender_thread()->task_runner()->PostTask(
-        FROM_HERE,
-        base::Bind(&TestSender::SetUp, base::Unretained(&senders[i]),
-                   base::Passed(&ptr_infos[i]),
-                   base::Unretained(&senders[(i + 1) % 4]), kMaxValue));
-  }
-
-  base::RunLoop run_loop;
-  TestReceiver receivers[2];
-  NotificationCounter counter(
-      2, base::Bind(&AssociatedInterfaceTest::QuitRunLoop,
-                    base::Unretained(this), base::Unretained(&run_loop)));
-  for (size_t i = 0; i < 2; ++i) {
-    receivers[i].receiver_thread()->task_runner()->PostTask(
-        FROM_HERE,
-        base::Bind(&TestReceiver::SetUp, base::Unretained(&receivers[i]),
-                   base::Passed(&requests[2 * i]),
-                   base::Passed(&requests[2 * i + 1]),
-                   static_cast<size_t>(kMaxValue / 2),
-                   base::Bind(&NotificationCounter::OnGotNotification,
-                              base::Unretained(&counter))));
-  }
-
-  senders[0].sender_thread()->task_runner()->PostTask(
-      FROM_HERE,
-      base::Bind(&TestSender::Send, base::Unretained(&senders[0]), 1));
-
-  run_loop.Run();
-
-  for (size_t i = 0; i < 4; ++i) {
-    base::RunLoop run_loop;
-    senders[i].sender_thread()->task_runner()->PostTaskAndReply(
-        FROM_HERE,
-        base::Bind(&TestSender::TearDown, base::Unretained(&senders[i])),
-        base::Bind(&AssociatedInterfaceTest::QuitRunLoop,
-                   base::Unretained(this), base::Unretained(&run_loop)));
-    run_loop.Run();
-  }
-
-  for (size_t i = 0; i < 2; ++i) {
-    base::RunLoop run_loop;
-    receivers[i].receiver_thread()->task_runner()->PostTaskAndReply(
-        FROM_HERE,
-        base::Bind(&TestReceiver::TearDown, base::Unretained(&receivers[i])),
-        base::Bind(&AssociatedInterfaceTest::QuitRunLoop,
-                   base::Unretained(this), base::Unretained(&run_loop)));
-    run_loop.Run();
-  }
-
-  EXPECT_EQ(static_cast<size_t>(kMaxValue / 2), receivers[0].values().size());
-  EXPECT_EQ(static_cast<size_t>(kMaxValue / 2), receivers[1].values().size());
-
-  for (size_t i = 0; i < 2; ++i) {
-    for (size_t j = 1; j < receivers[i].values().size(); ++j)
-      EXPECT_LT(receivers[i].values()[j - 1], receivers[i].values()[j]);
-  }
-}
-
-void CaptureInt32(int32_t* storage,
-                  const base::Closure& closure,
-                  int32_t value) {
-  *storage = value;
-  closure.Run();
-}
-
-void CaptureSenderPtrInfo(IntegerSenderAssociatedPtr* storage,
-                          const base::Closure& closure,
-                          IntegerSenderAssociatedPtrInfo info) {
-  storage->Bind(std::move(info));
-  closure.Run();
-}
-
-TEST_F(AssociatedInterfaceTest, PassAssociatedInterfaces) {
-  IntegerSenderConnectionPtr connection_ptr;
-  IntegerSenderConnectionImpl connection(MakeRequest(&connection_ptr));
-
-  IntegerSenderAssociatedPtr sender0;
-  connection_ptr->GetSender(MakeRequest(&sender0));
-
-  int32_t echoed_value = 0;
-  base::RunLoop run_loop;
-  sender0->Echo(123, base::Bind(&CaptureInt32, &echoed_value,
-                                run_loop.QuitClosure()));
-  run_loop.Run();
-  EXPECT_EQ(123, echoed_value);
-
-  IntegerSenderAssociatedPtr sender1;
-  base::RunLoop run_loop2;
-  connection_ptr->AsyncGetSender(
-      base::Bind(&CaptureSenderPtrInfo, &sender1, run_loop2.QuitClosure()));
-  run_loop2.Run();
-  EXPECT_TRUE(sender1);
-
-  base::RunLoop run_loop3;
-  sender1->Echo(456, base::Bind(&CaptureInt32, &echoed_value,
-                                run_loop3.QuitClosure()));
-  run_loop3.Run();
-  EXPECT_EQ(456, echoed_value);
-}
-
-TEST_F(AssociatedInterfaceTest, BindingWaitAndPauseWhenNoAssociatedInterfaces) {
-  IntegerSenderConnectionPtr connection_ptr;
-  IntegerSenderConnectionImpl connection(MakeRequest(&connection_ptr));
-
-  IntegerSenderAssociatedPtr sender0;
-  connection_ptr->GetSender(MakeRequest(&sender0));
-
-  EXPECT_FALSE(connection.binding()->HasAssociatedInterfaces());
-  // There are no associated interfaces running on the pipe yet. It is okay to
-  // pause.
-  connection.binding()->PauseIncomingMethodCallProcessing();
-  connection.binding()->ResumeIncomingMethodCallProcessing();
-
-  // There are no associated interfaces running on the pipe yet. It is okay to
-  // wait.
-  EXPECT_TRUE(connection.binding()->WaitForIncomingMethodCall());
-
-  // The previous wait has dispatched the GetSender request message, therefore
-  // an associated interface has been set up on the pipe. It is not allowed to
-  // wait or pause.
-  EXPECT_TRUE(connection.binding()->HasAssociatedInterfaces());
-}
-
-class PingServiceImpl : public PingService {
- public:
-  explicit PingServiceImpl(PingServiceAssociatedRequest request)
-      : binding_(this, std::move(request)) {}
-  ~PingServiceImpl() override {}
-
-  AssociatedBinding<PingService>& binding() { return binding_; }
-
-  void set_ping_handler(const base::Closure& handler) {
-    ping_handler_ = handler;
-  }
-
-  // PingService:
-  void Ping(const PingCallback& callback) override {
-    if (!ping_handler_.is_null())
-      ping_handler_.Run();
-    callback.Run();
-  }
-
- private:
-  AssociatedBinding<PingService> binding_;
-  base::Closure ping_handler_;
-};
-
-class PingProviderImpl : public AssociatedPingProvider {
- public:
-  explicit PingProviderImpl(AssociatedPingProviderRequest request)
-      : binding_(this, std::move(request)) {}
-  ~PingProviderImpl() override {}
-
-  // AssociatedPingProvider:
-  void GetPing(PingServiceAssociatedRequest request) override {
-    ping_services_.emplace_back(new PingServiceImpl(std::move(request)));
-
-    if (expected_bindings_count_ > 0 &&
-        ping_services_.size() == expected_bindings_count_ &&
-        !quit_waiting_.is_null()) {
-      expected_bindings_count_ = 0;
-      base::ResetAndReturn(&quit_waiting_).Run();
-    }
-  }
-
-  std::vector<std::unique_ptr<PingServiceImpl>>& ping_services() {
-    return ping_services_;
-  }
-
-  void WaitForBindings(size_t count) {
-    DCHECK(quit_waiting_.is_null());
-
-    expected_bindings_count_ = count;
-    base::RunLoop loop;
-    quit_waiting_ = loop.QuitClosure();
-    loop.Run();
-  }
-
- private:
-  Binding<AssociatedPingProvider> binding_;
-  std::vector<std::unique_ptr<PingServiceImpl>> ping_services_;
-  size_t expected_bindings_count_ = 0;
-  base::Closure quit_waiting_;
-};
-
-class CallbackFilter : public MessageReceiver {
- public:
-  explicit CallbackFilter(const base::Closure& callback)
-      : callback_(callback) {}
-  ~CallbackFilter() override {}
-
-  static std::unique_ptr<CallbackFilter> Wrap(const base::Closure& callback) {
-    return base::MakeUnique<CallbackFilter>(callback);
-  }
-
-  // MessageReceiver:
-  bool Accept(Message* message) override {
-    callback_.Run();
-    return true;
-  }
-
- private:
-  const base::Closure callback_;
-};
-
-// Verifies that filters work as expected on associated bindings, i.e. that
-// they're notified in order, before dispatch; and that each associated
-// binding in a group operates with its own set of filters.
-TEST_F(AssociatedInterfaceTest, BindingWithFilters) {
-  AssociatedPingProviderPtr provider;
-  PingProviderImpl provider_impl(MakeRequest(&provider));
-
-  PingServiceAssociatedPtr ping_a, ping_b;
-  provider->GetPing(MakeRequest(&ping_a));
-  provider->GetPing(MakeRequest(&ping_b));
-  provider_impl.WaitForBindings(2);
-
-  ASSERT_EQ(2u, provider_impl.ping_services().size());
-  PingServiceImpl& ping_a_impl = *provider_impl.ping_services()[0];
-  PingServiceImpl& ping_b_impl = *provider_impl.ping_services()[1];
-
-  int a_status, b_status;
-  auto handler_helper = [] (int* a_status, int* b_status, int expected_a_status,
-                            int new_a_status, int expected_b_status,
-                            int new_b_status) {
-    EXPECT_EQ(expected_a_status, *a_status);
-    EXPECT_EQ(expected_b_status, *b_status);
-    *a_status = new_a_status;
-    *b_status = new_b_status;
-  };
-  auto create_handler = [&] (int expected_a_status, int new_a_status,
-                             int expected_b_status, int new_b_status) {
-    return base::Bind(handler_helper, &a_status, &b_status, expected_a_status,
-                      new_a_status, expected_b_status, new_b_status);
-  };
-
-  ping_a_impl.binding().AddFilter(
-      CallbackFilter::Wrap(create_handler(0, 1, 0, 0)));
-  ping_a_impl.binding().AddFilter(
-      CallbackFilter::Wrap(create_handler(1, 2, 0, 0)));
-  ping_a_impl.set_ping_handler(create_handler(2, 3, 0, 0));
-
-  ping_b_impl.binding().AddFilter(
-      CallbackFilter::Wrap(create_handler(3, 3, 0, 1)));
-  ping_b_impl.binding().AddFilter(
-      CallbackFilter::Wrap(create_handler(3, 3, 1, 2)));
-  ping_b_impl.set_ping_handler(create_handler(3, 3, 2, 3));
-
-  for (int i = 0; i < 10; ++i) {
-    a_status = 0;
-    b_status = 0;
-
-    {
-      base::RunLoop loop;
-      ping_a->Ping(loop.QuitClosure());
-      loop.Run();
-    }
-
-    EXPECT_EQ(3, a_status);
-    EXPECT_EQ(0, b_status);
-
-    {
-      base::RunLoop loop;
-      ping_b->Ping(loop.QuitClosure());
-      loop.Run();
-    }
-
-    EXPECT_EQ(3, a_status);
-    EXPECT_EQ(3, b_status);
-  }
-}
-
-TEST_F(AssociatedInterfaceTest, AssociatedPtrFlushForTesting) {
-  AssociatedInterfaceRequest<IntegerSender> request;
-  IntegerSenderAssociatedPtrInfo ptr_info;
-  CreateIntegerSender(&ptr_info, &request);
-
-  IntegerSenderImpl impl0(std::move(request));
-  AssociatedInterfacePtr<IntegerSender> ptr0;
-  ptr0.Bind(std::move(ptr_info));
-  ptr0.set_connection_error_handler(base::Bind(&Fail));
-
-  bool ptr0_callback_run = false;
-  ptr0->Echo(123, ExpectValueSetFlagAndRunClosure(
-                      123, &ptr0_callback_run, base::Bind(&base::DoNothing)));
-  ptr0.FlushForTesting();
-  EXPECT_TRUE(ptr0_callback_run);
-}
-
-void SetBool(bool* value) {
-  *value = true;
-}
-
-template <typename T>
-void SetBoolWithUnusedParameter(bool* value, T unused) {
-  *value = true;
-}
-
-TEST_F(AssociatedInterfaceTest, AssociatedPtrFlushForTestingWithClosedPeer) {
-  AssociatedInterfaceRequest<IntegerSender> request;
-  IntegerSenderAssociatedPtrInfo ptr_info;
-  CreateIntegerSender(&ptr_info, &request);
-
-  AssociatedInterfacePtr<IntegerSender> ptr0;
-  ptr0.Bind(std::move(ptr_info));
-  bool called = false;
-  ptr0.set_connection_error_handler(base::Bind(&SetBool, &called));
-  request = nullptr;
-
-  ptr0.FlushForTesting();
-  EXPECT_TRUE(called);
-  ptr0.FlushForTesting();
-}
-
-TEST_F(AssociatedInterfaceTest, AssociatedBindingFlushForTesting) {
-  AssociatedInterfaceRequest<IntegerSender> request;
-  IntegerSenderAssociatedPtrInfo ptr_info;
-  CreateIntegerSender(&ptr_info, &request);
-
-  IntegerSenderImpl impl0(std::move(request));
-  impl0.set_connection_error_handler(base::Bind(&Fail));
-  AssociatedInterfacePtr<IntegerSender> ptr0;
-  ptr0.Bind(std::move(ptr_info));
-
-  bool ptr0_callback_run = false;
-  ptr0->Echo(123, ExpectValueSetFlagAndRunClosure(
-                      123, &ptr0_callback_run, base::Bind(&base::DoNothing)));
-  // Because the flush is sent from the binding, it only guarantees that the
-  // request has been received, not the response. The second flush waits for the
-  // response to be received.
-  impl0.binding()->FlushForTesting();
-  impl0.binding()->FlushForTesting();
-  EXPECT_TRUE(ptr0_callback_run);
-}
-
-TEST_F(AssociatedInterfaceTest,
-       AssociatedBindingFlushForTestingWithClosedPeer) {
-  scoped_refptr<MultiplexRouter> router0;
-  scoped_refptr<MultiplexRouter> router1;
-  CreateRouterPair(&router0, &router1);
-
-  AssociatedInterfaceRequest<IntegerSender> request;
-  {
-    IntegerSenderAssociatedPtrInfo ptr_info;
-    CreateIntegerSenderWithExistingRouters(router1, &ptr_info, router0,
-                                           &request);
-  }
-
-  IntegerSenderImpl impl(std::move(request));
-  bool called = false;
-  impl.set_connection_error_handler(base::Bind(&SetBool, &called));
-  impl.binding()->FlushForTesting();
-  EXPECT_TRUE(called);
-  impl.binding()->FlushForTesting();
-}
-
-TEST_F(AssociatedInterfaceTest, BindingFlushForTesting) {
-  IntegerSenderConnectionPtr ptr;
-  IntegerSenderConnectionImpl impl(MakeRequest(&ptr));
-  bool called = false;
-  ptr->AsyncGetSender(base::Bind(
-      &SetBoolWithUnusedParameter<IntegerSenderAssociatedPtrInfo>, &called));
-  EXPECT_FALSE(called);
-  impl.binding()->set_connection_error_handler(base::Bind(&Fail));
-  // Because the flush is sent from the binding, it only guarantees that the
-  // request has been received, not the response. The second flush waits for the
-  // response to be received.
-  impl.binding()->FlushForTesting();
-  impl.binding()->FlushForTesting();
-  EXPECT_TRUE(called);
-}
-
-TEST_F(AssociatedInterfaceTest, BindingFlushForTestingWithClosedPeer) {
-  IntegerSenderConnectionPtr ptr;
-  IntegerSenderConnectionImpl impl(MakeRequest(&ptr));
-  bool called = false;
-  impl.binding()->set_connection_error_handler(base::Bind(&SetBool, &called));
-  ptr.reset();
-  EXPECT_FALSE(called);
-  impl.binding()->FlushForTesting();
-  EXPECT_TRUE(called);
-  impl.binding()->FlushForTesting();
-}
-
-TEST_F(AssociatedInterfaceTest, StrongBindingFlushForTesting) {
-  IntegerSenderConnectionPtr ptr;
-  auto binding =
-      MakeStrongBinding(base::MakeUnique<IntegerSenderConnectionImpl>(
-                            IntegerSenderConnectionRequest{}),
-                        MakeRequest(&ptr));
-  bool called = false;
-  IntegerSenderAssociatedPtr sender_ptr;
-  ptr->GetSender(MakeRequest(&sender_ptr));
-  sender_ptr->Echo(1, base::Bind(&SetBoolWithUnusedParameter<int>, &called));
-  EXPECT_FALSE(called);
-  // Because the flush is sent from the binding, it only guarantees that the
-  // request has been received, not the response. The second flush waits for the
-  // response to be received.
-  ASSERT_TRUE(binding);
-  binding->FlushForTesting();
-  ASSERT_TRUE(binding);
-  binding->FlushForTesting();
-  EXPECT_TRUE(called);
-}
-
-TEST_F(AssociatedInterfaceTest, StrongBindingFlushForTestingWithClosedPeer) {
-  IntegerSenderConnectionPtr ptr;
-  bool called = false;
-  auto binding =
-      MakeStrongBinding(base::MakeUnique<IntegerSenderConnectionImpl>(
-                            IntegerSenderConnectionRequest{}),
-                        MakeRequest(&ptr));
-  binding->set_connection_error_handler(base::Bind(&SetBool, &called));
-  ptr.reset();
-  EXPECT_FALSE(called);
-  ASSERT_TRUE(binding);
-  binding->FlushForTesting();
-  EXPECT_TRUE(called);
-  ASSERT_FALSE(binding);
-}
-
-TEST_F(AssociatedInterfaceTest, PtrFlushForTesting) {
-  IntegerSenderConnectionPtr ptr;
-  IntegerSenderConnectionImpl impl(MakeRequest(&ptr));
-  bool called = false;
-  ptr.set_connection_error_handler(base::Bind(&Fail));
-  ptr->AsyncGetSender(base::Bind(
-      &SetBoolWithUnusedParameter<IntegerSenderAssociatedPtrInfo>, &called));
-  EXPECT_FALSE(called);
-  ptr.FlushForTesting();
-  EXPECT_TRUE(called);
-}
-
-TEST_F(AssociatedInterfaceTest, PtrFlushForTestingWithClosedPeer) {
-  IntegerSenderConnectionPtr ptr;
-  MakeRequest(&ptr);
-  bool called = false;
-  ptr.set_connection_error_handler(base::Bind(&SetBool, &called));
-  EXPECT_FALSE(called);
-  ptr.FlushForTesting();
-  EXPECT_TRUE(called);
-  ptr.FlushForTesting();
-}
-
-TEST_F(AssociatedInterfaceTest, AssociatedBindingConnectionErrorWithReason) {
-  AssociatedInterfaceRequest<IntegerSender> request;
-  IntegerSenderAssociatedPtrInfo ptr_info;
-  CreateIntegerSender(&ptr_info, &request);
-
-  IntegerSenderImpl impl(std::move(request));
-  AssociatedInterfacePtr<IntegerSender> ptr;
-  ptr.Bind(std::move(ptr_info));
-
-  base::RunLoop run_loop;
-  impl.binding()->set_connection_error_with_reason_handler(base::Bind(
-      [](const base::Closure& quit_closure, uint32_t custom_reason,
-         const std::string& description) {
-        EXPECT_EQ(123u, custom_reason);
-        EXPECT_EQ("farewell", description);
-        quit_closure.Run();
-      },
-      run_loop.QuitClosure()));
-
-  ptr.ResetWithReason(123u, "farewell");
-
-  run_loop.Run();
-}
-
-TEST_F(AssociatedInterfaceTest,
-       PendingAssociatedBindingConnectionErrorWithReason) {
-  // Test that AssociatedBinding is notified with connection error when the
-  // interface hasn't associated with a message pipe and the peer is closed.
-
-  IntegerSenderAssociatedPtr ptr;
-  IntegerSenderImpl impl(MakeRequest(&ptr));
-
-  base::RunLoop run_loop;
-  impl.binding()->set_connection_error_with_reason_handler(base::Bind(
-      [](const base::Closure& quit_closure, uint32_t custom_reason,
-         const std::string& description) {
-        EXPECT_EQ(123u, custom_reason);
-        EXPECT_EQ("farewell", description);
-        quit_closure.Run();
-      },
-      run_loop.QuitClosure()));
-
-  ptr.ResetWithReason(123u, "farewell");
-
-  run_loop.Run();
-}
-
-TEST_F(AssociatedInterfaceTest, AssociatedPtrConnectionErrorWithReason) {
-  AssociatedInterfaceRequest<IntegerSender> request;
-  IntegerSenderAssociatedPtrInfo ptr_info;
-  CreateIntegerSender(&ptr_info, &request);
-
-  IntegerSenderImpl impl(std::move(request));
-  AssociatedInterfacePtr<IntegerSender> ptr;
-  ptr.Bind(std::move(ptr_info));
-
-  base::RunLoop run_loop;
-  ptr.set_connection_error_with_reason_handler(base::Bind(
-      [](const base::Closure& quit_closure, uint32_t custom_reason,
-         const std::string& description) {
-        EXPECT_EQ(456u, custom_reason);
-        EXPECT_EQ("farewell", description);
-        quit_closure.Run();
-      },
-      run_loop.QuitClosure()));
-
-  impl.binding()->CloseWithReason(456u, "farewell");
-
-  run_loop.Run();
-}
-
-TEST_F(AssociatedInterfaceTest, PendingAssociatedPtrConnectionErrorWithReason) {
-  // Test that AssociatedInterfacePtr is notified with connection error when the
-  // interface hasn't associated with a message pipe and the peer is closed.
-
-  IntegerSenderAssociatedPtr ptr;
-  auto request = MakeRequest(&ptr);
-
-  base::RunLoop run_loop;
-  ptr.set_connection_error_with_reason_handler(base::Bind(
-      [](const base::Closure& quit_closure, uint32_t custom_reason,
-         const std::string& description) {
-        EXPECT_EQ(456u, custom_reason);
-        EXPECT_EQ("farewell", description);
-        quit_closure.Run();
-      },
-      run_loop.QuitClosure()));
-
-  request.ResetWithReason(456u, "farewell");
-
-  run_loop.Run();
-}
-
-TEST_F(AssociatedInterfaceTest, AssociatedRequestResetWithReason) {
-  AssociatedInterfaceRequest<IntegerSender> request;
-  IntegerSenderAssociatedPtrInfo ptr_info;
-  CreateIntegerSender(&ptr_info, &request);
-
-  AssociatedInterfacePtr<IntegerSender> ptr;
-  ptr.Bind(std::move(ptr_info));
-
-  base::RunLoop run_loop;
-  ptr.set_connection_error_with_reason_handler(base::Bind(
-      [](const base::Closure& quit_closure, uint32_t custom_reason,
-         const std::string& description) {
-        EXPECT_EQ(789u, custom_reason);
-        EXPECT_EQ("long time no see", description);
-        quit_closure.Run();
-      },
-      run_loop.QuitClosure()));
-
-  request.ResetWithReason(789u, "long time no see");
-
-  run_loop.Run();
-}
-
-TEST_F(AssociatedInterfaceTest, ThreadSafeAssociatedInterfacePtr) {
-  IntegerSenderConnectionPtr connection_ptr;
-  IntegerSenderConnectionImpl connection(MakeRequest(&connection_ptr));
-
-  IntegerSenderAssociatedPtr sender;
-  connection_ptr->GetSender(MakeRequest(&sender));
-
-  scoped_refptr<ThreadSafeIntegerSenderAssociatedPtr> thread_safe_sender =
-      ThreadSafeIntegerSenderAssociatedPtr::Create(std::move(sender));
-
-  {
-    // Test the thread safe pointer can be used from the interface ptr thread.
-    int32_t echoed_value = 0;
-    base::RunLoop run_loop;
-    (*thread_safe_sender)
-        ->Echo(123, base::Bind(&CaptureInt32, &echoed_value,
-                               run_loop.QuitClosure()));
-    run_loop.Run();
-    EXPECT_EQ(123, echoed_value);
-  }
-
-  // Test the thread safe pointer can be used from another thread.
-  base::RunLoop run_loop;
-  base::Thread other_thread("service test thread");
-  other_thread.Start();
-
-  auto run_method = base::Bind(
-      [](const scoped_refptr<base::TaskRunner>& main_task_runner,
-         const base::Closure& quit_closure,
-         const scoped_refptr<ThreadSafeIntegerSenderAssociatedPtr>&
-             thread_safe_sender) {
-        auto done_callback = base::Bind(
-            [](const scoped_refptr<base::TaskRunner>& main_task_runner,
-               const base::Closure& quit_closure,
-               base::PlatformThreadId thread_id, int32_t result) {
-              EXPECT_EQ(123, result);
-              // Validate the callback is invoked on the calling thread.
-              EXPECT_EQ(thread_id, base::PlatformThread::CurrentId());
-              // Notify the run_loop to quit.
-              main_task_runner->PostTask(FROM_HERE, quit_closure);
-            });
-        (*thread_safe_sender)
-            ->Echo(123,
-                   base::Bind(done_callback, main_task_runner, quit_closure,
-                              base::PlatformThread::CurrentId()));
-      },
-      base::SequencedTaskRunnerHandle::Get(), run_loop.QuitClosure(),
-      thread_safe_sender);
-  other_thread.message_loop()->task_runner()->PostTask(FROM_HERE, run_method);
-
-  // Block until the method callback is called on the background thread.
-  run_loop.Run();
-}
-
-struct ForwarderTestContext {
-  IntegerSenderConnectionPtr connection_ptr;
-  std::unique_ptr<IntegerSenderConnectionImpl> interface_impl;
-  IntegerSenderAssociatedRequest sender_request;
-};
-
-TEST_F(AssociatedInterfaceTest,
-       ThreadSafeAssociatedInterfacePtrWithTaskRunner) {
-  // Start the thread from where we'll bind the interface pointer.
-  base::Thread other_thread("service test thread");
-  other_thread.Start();
-  const scoped_refptr<base::SingleThreadTaskRunner>& other_thread_task_runner =
-      other_thread.message_loop()->task_runner();
-
-  ForwarderTestContext* context = new ForwarderTestContext();
-  IntegerSenderAssociatedPtrInfo sender_info;
-  base::WaitableEvent sender_info_bound_event(
-      base::WaitableEvent::ResetPolicy::MANUAL,
-      base::WaitableEvent::InitialState::NOT_SIGNALED);
-  auto setup = [](base::WaitableEvent* sender_info_bound_event,
-                  IntegerSenderAssociatedPtrInfo* sender_info,
-                  ForwarderTestContext* context) {
-    context->interface_impl = base::MakeUnique<IntegerSenderConnectionImpl>(
-        MakeRequest(&context->connection_ptr));
-
-    auto sender_request = MakeRequest(sender_info);
-    context->connection_ptr->GetSender(std::move(sender_request));
-
-    // Unblock the main thread as soon as |sender_info| is set.
-    sender_info_bound_event->Signal();
-  };
-  other_thread_task_runner->PostTask(
-      FROM_HERE,
-      base::Bind(setup, &sender_info_bound_event, &sender_info, context));
-  sender_info_bound_event.Wait();
-
-  // Create a ThreadSafeAssociatedPtr that binds on the background thread and is
-  // associated with |connection_ptr| there.
-  scoped_refptr<ThreadSafeIntegerSenderAssociatedPtr> thread_safe_ptr =
-      ThreadSafeIntegerSenderAssociatedPtr::Create(std::move(sender_info),
-                                                   other_thread_task_runner);
-
-  // Issue a call on the thread-safe ptr immediately. Note that this may happen
-  // before the interface is bound on the background thread, and that must be
-  // OK.
-  {
-    auto echo_callback =
-        base::Bind([](const base::Closure& quit_closure, int32_t result) {
-          EXPECT_EQ(123, result);
-          quit_closure.Run();
-        });
-    base::RunLoop run_loop;
-    (*thread_safe_ptr)
-        ->Echo(123, base::Bind(echo_callback, run_loop.QuitClosure()));
-
-    // Block until the method callback is called.
-    run_loop.Run();
-  }
-
-  other_thread_task_runner->DeleteSoon(FROM_HERE, context);
-
-  // Reset the pointer now so the InterfacePtr associated resources can be
-  // deleted before the background thread's message loop is invalidated.
-  thread_safe_ptr = nullptr;
-}
-
-class DiscardingAssociatedPingProviderProvider
-    : public AssociatedPingProviderProvider {
- public:
-  void GetPingProvider(
-      AssociatedPingProviderAssociatedRequest request) override {}
-};
-
-TEST_F(AssociatedInterfaceTest, CloseWithoutBindingAssociatedRequest) {
-  DiscardingAssociatedPingProviderProvider ping_provider_provider;
-  mojo::Binding<AssociatedPingProviderProvider> binding(
-      &ping_provider_provider);
-  auto provider_provider = binding.CreateInterfacePtrAndBind();
-  AssociatedPingProviderAssociatedPtr provider;
-  provider_provider->GetPingProvider(mojo::MakeRequest(&provider));
-  PingServiceAssociatedPtr ping;
-  provider->GetPing(mojo::MakeRequest(&ping));
-  base::RunLoop run_loop;
-  ping.set_connection_error_handler(run_loop.QuitClosure());
-  run_loop.Run();
-}
-
-TEST_F(AssociatedInterfaceTest, GetIsolatedInterface) {
-  IntegerSenderAssociatedPtr sender;
-  GetIsolatedInterface(MakeRequest(&sender).PassHandle());
-  sender->Send(42);
-}
-
-}  // namespace
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/bind_task_runner_unittest.cc b/mojo/public/cpp/bindings/tests/bind_task_runner_unittest.cc
deleted file mode 100644
index 569eb51..0000000
--- a/mojo/public/cpp/bindings/tests/bind_task_runner_unittest.cc
+++ /dev/null
@@ -1,395 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <utility>
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/message_loop/message_loop.h"
-#include "base/single_thread_task_runner.h"
-#include "base/synchronization/lock.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/threading/platform_thread.h"
-#include "mojo/public/cpp/bindings/associated_binding.h"
-#include "mojo/public/cpp/bindings/associated_interface_ptr.h"
-#include "mojo/public/cpp/bindings/associated_interface_ptr_info.h"
-#include "mojo/public/cpp/bindings/associated_interface_request.h"
-#include "mojo/public/cpp/bindings/binding.h"
-#include "mojo/public/interfaces/bindings/tests/test_associated_interfaces.mojom.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace test {
-namespace {
-
-class TestTaskRunner : public base::SingleThreadTaskRunner {
- public:
-  TestTaskRunner()
-      : thread_id_(base::PlatformThread::CurrentRef()),
-        quit_called_(false),
-        task_ready_(base::WaitableEvent::ResetPolicy::AUTOMATIC,
-                    base::WaitableEvent::InitialState::NOT_SIGNALED) {}
-
-  bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here,
-                                  base::OnceClosure task,
-                                  base::TimeDelta delay) override {
-    NOTREACHED();
-    return false;
-  }
-
-  bool PostDelayedTask(const tracked_objects::Location& from_here,
-                       base::OnceClosure task,
-                       base::TimeDelta delay) override {
-    {
-      base::AutoLock locker(lock_);
-      tasks_.push(std::move(task));
-    }
-    task_ready_.Signal();
-    return true;
-  }
-  bool RunsTasksOnCurrentThread() const override {
-    return base::PlatformThread::CurrentRef() == thread_id_;
-  }
-
-  // Only quits when Quit() is called.
-  void Run() {
-    DCHECK(RunsTasksOnCurrentThread());
-    quit_called_ = false;
-
-    while (true) {
-      {
-        base::AutoLock locker(lock_);
-        while (!tasks_.empty()) {
-          auto task = std::move(tasks_.front());
-          tasks_.pop();
-
-          {
-            base::AutoUnlock unlocker(lock_);
-            std::move(task).Run();
-            if (quit_called_)
-              return;
-          }
-        }
-      }
-      task_ready_.Wait();
-    }
-  }
-
-  void Quit() {
-    DCHECK(RunsTasksOnCurrentThread());
-    quit_called_ = true;
-  }
-
-  // Waits until one task is ready and runs it.
-  void RunOneTask() {
-    DCHECK(RunsTasksOnCurrentThread());
-
-    while (true) {
-      {
-        base::AutoLock locker(lock_);
-        if (!tasks_.empty()) {
-          auto task = std::move(tasks_.front());
-          tasks_.pop();
-
-          {
-            base::AutoUnlock unlocker(lock_);
-            std::move(task).Run();
-            return;
-          }
-        }
-      }
-      task_ready_.Wait();
-    }
-  }
-
- private:
-  ~TestTaskRunner() override {}
-
-  const base::PlatformThreadRef thread_id_;
-  bool quit_called_;
-  base::WaitableEvent task_ready_;
-
-  // Protect |tasks_|.
-  base::Lock lock_;
-  std::queue<base::OnceClosure> tasks_;
-
-  DISALLOW_COPY_AND_ASSIGN(TestTaskRunner);
-};
-
-template <typename BindingType, typename RequestType>
-class IntegerSenderImpl : public IntegerSender {
- public:
-  IntegerSenderImpl(RequestType request,
-                    scoped_refptr<base::SingleThreadTaskRunner> runner)
-      : binding_(this, std::move(request), std::move(runner)) {}
-
-  ~IntegerSenderImpl() override {}
-
-  using EchoHandler = base::Callback<void(int32_t, const EchoCallback&)>;
-
-  void set_echo_handler(const EchoHandler& handler) { echo_handler_ = handler; }
-
-  void Echo(int32_t value, const EchoCallback& callback) override {
-    if (echo_handler_.is_null())
-      callback.Run(value);
-    else
-      echo_handler_.Run(value, callback);
-  }
-  void Send(int32_t value) override { NOTREACHED(); }
-
-  BindingType* binding() { return &binding_; }
-
- private:
-  BindingType binding_;
-  EchoHandler echo_handler_;
-};
-
-class IntegerSenderConnectionImpl : public IntegerSenderConnection {
- public:
-  using SenderType = IntegerSenderImpl<AssociatedBinding<IntegerSender>,
-                                       IntegerSenderAssociatedRequest>;
-
-  explicit IntegerSenderConnectionImpl(
-      IntegerSenderConnectionRequest request,
-      scoped_refptr<base::SingleThreadTaskRunner> runner,
-      scoped_refptr<base::SingleThreadTaskRunner> sender_runner)
-      : binding_(this, std::move(request), std::move(runner)),
-        sender_runner_(std::move(sender_runner)) {}
-
-  ~IntegerSenderConnectionImpl() override {}
-
-  void set_get_sender_notification(const base::Closure& notification) {
-    get_sender_notification_ = notification;
-  }
-  void GetSender(IntegerSenderAssociatedRequest sender) override {
-    sender_impl_.reset(new SenderType(std::move(sender), sender_runner_));
-    get_sender_notification_.Run();
-  }
-
-  void AsyncGetSender(const AsyncGetSenderCallback& callback) override {
-    NOTREACHED();
-  }
-
-  Binding<IntegerSenderConnection>* binding() { return &binding_; }
-
-  SenderType* sender_impl() { return sender_impl_.get(); }
-
- private:
-  Binding<IntegerSenderConnection> binding_;
-  std::unique_ptr<SenderType> sender_impl_;
-  scoped_refptr<base::SingleThreadTaskRunner> sender_runner_;
-  base::Closure get_sender_notification_;
-};
-
-class BindTaskRunnerTest : public testing::Test {
- protected:
-  void SetUp() override {
-    binding_task_runner_ = scoped_refptr<TestTaskRunner>(new TestTaskRunner);
-    ptr_task_runner_ = scoped_refptr<TestTaskRunner>(new TestTaskRunner);
-
-    auto request = MakeRequest(&ptr_, ptr_task_runner_);
-    impl_.reset(new ImplType(std::move(request), binding_task_runner_));
-  }
-
-  base::MessageLoop loop_;
-  scoped_refptr<TestTaskRunner> binding_task_runner_;
-  scoped_refptr<TestTaskRunner> ptr_task_runner_;
-
-  IntegerSenderPtr ptr_;
-  using ImplType =
-      IntegerSenderImpl<Binding<IntegerSender>, IntegerSenderRequest>;
-  std::unique_ptr<ImplType> impl_;
-};
-
-class AssociatedBindTaskRunnerTest : public testing::Test {
- protected:
-  void SetUp() override {
-    connection_binding_task_runner_ =
-        scoped_refptr<TestTaskRunner>(new TestTaskRunner);
-    connection_ptr_task_runner_ =
-        scoped_refptr<TestTaskRunner>(new TestTaskRunner);
-    sender_binding_task_runner_ =
-        scoped_refptr<TestTaskRunner>(new TestTaskRunner);
-    sender_ptr_task_runner_ = scoped_refptr<TestTaskRunner>(new TestTaskRunner);
-
-    auto connection_request =
-        MakeRequest(&connection_ptr_, connection_ptr_task_runner_);
-    connection_impl_.reset(new IntegerSenderConnectionImpl(
-        std::move(connection_request), connection_binding_task_runner_,
-        sender_binding_task_runner_));
-
-    connection_impl_->set_get_sender_notification(
-        base::Bind(&AssociatedBindTaskRunnerTest::QuitTaskRunner,
-                   base::Unretained(this)));
-
-    connection_ptr_->GetSender(
-        MakeRequest(&sender_ptr_, sender_ptr_task_runner_));
-    connection_binding_task_runner_->Run();
-  }
-
-  void QuitTaskRunner() {
-    connection_binding_task_runner_->Quit();
-  }
-
-  base::MessageLoop loop_;
-  scoped_refptr<TestTaskRunner> connection_binding_task_runner_;
-  scoped_refptr<TestTaskRunner> connection_ptr_task_runner_;
-  scoped_refptr<TestTaskRunner> sender_binding_task_runner_;
-  scoped_refptr<TestTaskRunner> sender_ptr_task_runner_;
-
-  IntegerSenderConnectionPtr connection_ptr_;
-  std::unique_ptr<IntegerSenderConnectionImpl> connection_impl_;
-  IntegerSenderAssociatedPtr sender_ptr_;
-};
-
-void DoSetFlagAndQuitTaskRunner(bool* flag,
-                                scoped_refptr<TestTaskRunner> task_runner) {
-  *flag = true;
-  if (task_runner)
-    task_runner->Quit();
-}
-
-void DoExpectValueSetFlagAndQuitTaskRunner(
-    int32_t expected_value,
-    bool* flag,
-    scoped_refptr<TestTaskRunner> task_runner,
-    int32_t value) {
-  EXPECT_EQ(expected_value, value);
-  DoSetFlagAndQuitTaskRunner(flag, task_runner);
-}
-
-void DoExpectValueSetFlagForwardValueAndQuitTaskRunner(
-    int32_t expected_value,
-    bool* flag,
-    scoped_refptr<TestTaskRunner> task_runner,
-    int32_t value,
-    const IntegerSender::EchoCallback& callback) {
-  EXPECT_EQ(expected_value, value);
-  *flag = true;
-  callback.Run(value);
-  task_runner->Quit();
-}
-
-base::Closure SetFlagAndQuitTaskRunner(
-    bool* flag,
-    scoped_refptr<TestTaskRunner> task_runner) {
-  return base::Bind(&DoSetFlagAndQuitTaskRunner, flag, task_runner);
-}
-
-base::Callback<void(int32_t)> ExpectValueSetFlagAndQuitTaskRunner(
-    int32_t expected_value,
-    bool* flag,
-    scoped_refptr<TestTaskRunner> task_runner) {
-  return base::Bind(&DoExpectValueSetFlagAndQuitTaskRunner, expected_value,
-                    flag, task_runner);
-}
-
-TEST_F(BindTaskRunnerTest, MethodCall) {
-  bool echo_called = false;
-  impl_->set_echo_handler(
-      base::Bind(&DoExpectValueSetFlagForwardValueAndQuitTaskRunner,
-                 1024, &echo_called, binding_task_runner_));
-  bool echo_replied = false;
-  ptr_->Echo(1024, ExpectValueSetFlagAndQuitTaskRunner(1024, &echo_replied,
-                                                       ptr_task_runner_));
-  binding_task_runner_->Run();
-  EXPECT_TRUE(echo_called);
-  ptr_task_runner_->Run();
-  EXPECT_TRUE(echo_replied);
-}
-
-TEST_F(BindTaskRunnerTest, BindingConnectionError) {
-  bool connection_error_called = false;
-  impl_->binding()->set_connection_error_handler(
-      SetFlagAndQuitTaskRunner(&connection_error_called, binding_task_runner_));
-  ptr_.reset();
-  binding_task_runner_->Run();
-  EXPECT_TRUE(connection_error_called);
-}
-
-TEST_F(BindTaskRunnerTest, PtrConnectionError) {
-  bool connection_error_called = false;
-  ptr_.set_connection_error_handler(
-      SetFlagAndQuitTaskRunner(&connection_error_called, ptr_task_runner_));
-  impl_->binding()->Close();
-  ptr_task_runner_->Run();
-  EXPECT_TRUE(connection_error_called);
-}
-
-void ExpectValueSetFlagAndForward(int32_t expected_value,
-                                  bool* flag,
-                                  int32_t value,
-                                  const IntegerSender::EchoCallback& callback) {
-  EXPECT_EQ(expected_value, value);
-  *flag = true;
-  callback.Run(value);
-}
-
-TEST_F(AssociatedBindTaskRunnerTest, MethodCall) {
-  bool echo_called = false;
-  connection_impl_->sender_impl()->set_echo_handler(
-      base::Bind(&ExpectValueSetFlagAndForward, 1024, &echo_called));
-
-  bool echo_replied = false;
-  sender_ptr_->Echo(
-      1024, ExpectValueSetFlagAndQuitTaskRunner(1024, &echo_replied, nullptr));
-
-  // The Echo request first arrives at the master endpoint's task runner, and
-  // then is forwarded to the associated endpoint's task runner.
-  connection_binding_task_runner_->RunOneTask();
-  sender_binding_task_runner_->RunOneTask();
-  EXPECT_TRUE(echo_called);
-
-  // Similarly, the Echo response arrives at the master endpoint's task runner
-  // and then is forwarded to the associated endpoint's task runner.
-  connection_ptr_task_runner_->RunOneTask();
-  sender_ptr_task_runner_->RunOneTask();
-  EXPECT_TRUE(echo_replied);
-}
-
-TEST_F(AssociatedBindTaskRunnerTest, BindingConnectionError) {
-  bool sender_impl_error = false;
-  connection_impl_->sender_impl()->binding()->set_connection_error_handler(
-      SetFlagAndQuitTaskRunner(&sender_impl_error,
-                               sender_binding_task_runner_));
-  bool connection_impl_error = false;
-  connection_impl_->binding()->set_connection_error_handler(
-      SetFlagAndQuitTaskRunner(&connection_impl_error,
-                               connection_binding_task_runner_));
-  bool sender_ptr_error = false;
-  sender_ptr_.set_connection_error_handler(
-      SetFlagAndQuitTaskRunner(&sender_ptr_error, sender_ptr_task_runner_));
-  connection_ptr_.reset();
-  sender_ptr_task_runner_->Run();
-  EXPECT_TRUE(sender_ptr_error);
-  connection_binding_task_runner_->Run();
-  EXPECT_TRUE(connection_impl_error);
-  sender_binding_task_runner_->Run();
-  EXPECT_TRUE(sender_impl_error);
-}
-
-TEST_F(AssociatedBindTaskRunnerTest, PtrConnectionError) {
-  bool sender_impl_error = false;
-  connection_impl_->sender_impl()->binding()->set_connection_error_handler(
-      SetFlagAndQuitTaskRunner(&sender_impl_error,
-                               sender_binding_task_runner_));
-  bool connection_ptr_error = false;
-  connection_ptr_.set_connection_error_handler(
-      SetFlagAndQuitTaskRunner(&connection_ptr_error,
-                               connection_ptr_task_runner_));
-  bool sender_ptr_error = false;
-  sender_ptr_.set_connection_error_handler(
-      SetFlagAndQuitTaskRunner(&sender_ptr_error, sender_ptr_task_runner_));
-  connection_impl_->binding()->Close();
-  sender_binding_task_runner_->Run();
-  EXPECT_TRUE(sender_impl_error);
-  connection_ptr_task_runner_->Run();
-  EXPECT_TRUE(connection_ptr_error);
-  sender_ptr_task_runner_->Run();
-  EXPECT_TRUE(sender_ptr_error);
-}
-
-}  // namespace
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/binding_callback_unittest.cc b/mojo/public/cpp/bindings/tests/binding_callback_unittest.cc
deleted file mode 100644
index 43122ce..0000000
--- a/mojo/public/cpp/bindings/tests/binding_callback_unittest.cc
+++ /dev/null
@@ -1,338 +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 <stdint.h>
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/logging.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "base/test/gtest_util.h"
-#include "build/build_config.h"
-#include "mojo/public/cpp/bindings/binding.h"
-#include "mojo/public/cpp/bindings/interface_ptr.h"
-#include "mojo/public/cpp/system/message_pipe.h"
-#include "mojo/public/cpp/test_support/test_support.h"
-#include "mojo/public/interfaces/bindings/tests/sample_interfaces.mojom.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-///////////////////////////////////////////////////////////////////////////////
-//
-// The tests in this file are designed to test the interaction between a
-// Callback and its associated Binding. If a Callback is deleted before
-// being used we DCHECK fail--unless the associated Binding has already
-// been closed or deleted. This contract must be explained to the Mojo
-// application developer. For example it is the developer's responsibility to
-// ensure that the Binding is destroyed before an unused Callback is destroyed.
-//
-///////////////////////////////////////////////////////////////////////////////
-
-namespace mojo {
-namespace test {
-namespace {
-
-void SaveValue(int32_t* storage, const base::Closure& closure, int32_t value) {
-  *storage = value;
-  if (!closure.is_null())
-    closure.Run();
-}
-
-base::Callback<void(int32_t)> BindValueSaver(int32_t* last_value_seen,
-                                             const base::Closure& closure) {
-  return base::Bind(&SaveValue, last_value_seen, closure);
-}
-
-// An implementation of sample::Provider used on the server side.
-// It only implements one of the methods: EchoInt().
-// All it does is save the values and Callbacks it sees.
-class InterfaceImpl : public sample::Provider {
- public:
-  InterfaceImpl()
-      : last_server_value_seen_(0),
-        callback_saved_(new EchoIntCallback) {}
-
-  ~InterfaceImpl() override {
-    if (callback_saved_) {
-      delete callback_saved_;
-    }
-  }
-
-  // Run's the callback previously saved from the last invocation
-  // of |EchoInt()|.
-  bool RunCallback() {
-    if (callback_saved_) {
-      callback_saved_->Run(last_server_value_seen_);
-      return true;
-    }
-    return false;
-  }
-
-  // Delete's the previously saved callback.
-  void DeleteCallback() {
-    delete callback_saved_;
-    callback_saved_ = nullptr;
-  }
-
-  // sample::Provider implementation
-
-  // Saves its two input values in member variables and does nothing else.
-  void EchoInt(int32_t x, const EchoIntCallback& callback) override {
-    last_server_value_seen_ = x;
-    *callback_saved_ = callback;
-    if (!closure_.is_null()) {
-      closure_.Run();
-      closure_.Reset();
-    }
-  }
-
-  void EchoString(const std::string& a,
-                  const EchoStringCallback& callback) override {
-    CHECK(false) << "Not implemented.";
-  }
-
-  void EchoStrings(const std::string& a,
-                   const std::string& b,
-                   const EchoStringsCallback& callback) override {
-    CHECK(false) << "Not implemented.";
-  }
-
-  void EchoMessagePipeHandle(
-      ScopedMessagePipeHandle a,
-      const EchoMessagePipeHandleCallback& callback) override {
-    CHECK(false) << "Not implemented.";
-  }
-
-  void EchoEnum(sample::Enum a, const EchoEnumCallback& callback) override {
-    CHECK(false) << "Not implemented.";
-  }
-
-  void resetLastServerValueSeen() { last_server_value_seen_ = 0; }
-
-  int32_t last_server_value_seen() const { return last_server_value_seen_; }
-
-  void set_closure(const base::Closure& closure) { closure_ = closure; }
-
- private:
-  int32_t last_server_value_seen_;
-  EchoIntCallback* callback_saved_;
-  base::Closure closure_;
-};
-
-class BindingCallbackTest : public testing::Test {
- public:
-  BindingCallbackTest() {}
-  ~BindingCallbackTest() override {}
-
- protected:
-  int32_t last_client_callback_value_seen_;
-  sample::ProviderPtr interface_ptr_;
-
-  void PumpMessages() { base::RunLoop().RunUntilIdle(); }
-
- private:
-  base::MessageLoop loop_;
-};
-
-// Tests that the InterfacePtr and the Binding can communicate with each
-// other normally.
-TEST_F(BindingCallbackTest, Basic) {
-  // Create the ServerImpl and the Binding.
-  InterfaceImpl server_impl;
-  Binding<sample::Provider> binding(&server_impl, MakeRequest(&interface_ptr_));
-
-  // Initialize the test values.
-  server_impl.resetLastServerValueSeen();
-  last_client_callback_value_seen_ = 0;
-
-  // Invoke the Echo method.
-  base::RunLoop run_loop, run_loop2;
-  server_impl.set_closure(run_loop.QuitClosure());
-  interface_ptr_->EchoInt(
-      7,
-      BindValueSaver(&last_client_callback_value_seen_,
-                     run_loop2.QuitClosure()));
-  run_loop.Run();
-
-  // Check that server saw the correct value, but the client has not yet.
-  EXPECT_EQ(7, server_impl.last_server_value_seen());
-  EXPECT_EQ(0, last_client_callback_value_seen_);
-
-  // Now run the Callback.
-  server_impl.RunCallback();
-  run_loop2.Run();
-
-  // Check that the client has now seen the correct value.
-  EXPECT_EQ(7, last_client_callback_value_seen_);
-
-  // Initialize the test values again.
-  server_impl.resetLastServerValueSeen();
-  last_client_callback_value_seen_ = 0;
-
-  // Invoke the Echo method again.
-  base::RunLoop run_loop3, run_loop4;
-  server_impl.set_closure(run_loop3.QuitClosure());
-  interface_ptr_->EchoInt(
-      13,
-      BindValueSaver(&last_client_callback_value_seen_,
-                     run_loop4.QuitClosure()));
-  run_loop3.Run();
-
-  // Check that server saw the correct value, but the client has not yet.
-  EXPECT_EQ(13, server_impl.last_server_value_seen());
-  EXPECT_EQ(0, last_client_callback_value_seen_);
-
-  // Now run the Callback again.
-  server_impl.RunCallback();
-  run_loop4.Run();
-
-  // Check that the client has now seen the correct value again.
-  EXPECT_EQ(13, last_client_callback_value_seen_);
-}
-
-// Tests that running the Callback after the Binding has been deleted
-// results in a clean failure.
-TEST_F(BindingCallbackTest, DeleteBindingThenRunCallback) {
-  // Create the ServerImpl.
-  InterfaceImpl server_impl;
-  base::RunLoop run_loop;
-  {
-    // Create the binding in an inner scope so it can be deleted first.
-    Binding<sample::Provider> binding(&server_impl,
-                                      MakeRequest(&interface_ptr_));
-    interface_ptr_.set_connection_error_handler(run_loop.QuitClosure());
-
-    // Initialize the test values.
-    server_impl.resetLastServerValueSeen();
-    last_client_callback_value_seen_ = 0;
-
-    // Invoke the Echo method.
-    base::RunLoop run_loop2;
-    server_impl.set_closure(run_loop2.QuitClosure());
-    interface_ptr_->EchoInt(
-        7,
-        BindValueSaver(&last_client_callback_value_seen_, base::Closure()));
-    run_loop2.Run();
-  }
-  // The binding has now been destroyed and the pipe is closed.
-
-  // Check that server saw the correct value, but the client has not yet.
-  EXPECT_EQ(7, server_impl.last_server_value_seen());
-  EXPECT_EQ(0, last_client_callback_value_seen_);
-
-  // Now try to run the Callback. This should do nothing since the pipe
-  // is closed.
-  EXPECT_TRUE(server_impl.RunCallback());
-  PumpMessages();
-
-  // Check that the client has still not seen the correct value.
-  EXPECT_EQ(0, last_client_callback_value_seen_);
-
-  // Attempt to invoke the method again and confirm that an error was
-  // encountered.
-  interface_ptr_->EchoInt(
-      13,
-      BindValueSaver(&last_client_callback_value_seen_, base::Closure()));
-  run_loop.Run();
-  EXPECT_TRUE(interface_ptr_.encountered_error());
-}
-
-// Tests that deleting a Callback without running it after the corresponding
-// binding has already been deleted does not result in a crash.
-TEST_F(BindingCallbackTest, DeleteBindingThenDeleteCallback) {
-  // Create the ServerImpl.
-  InterfaceImpl server_impl;
-  {
-    // Create the binding in an inner scope so it can be deleted first.
-    Binding<sample::Provider> binding(&server_impl,
-                                      MakeRequest(&interface_ptr_));
-
-    // Initialize the test values.
-    server_impl.resetLastServerValueSeen();
-    last_client_callback_value_seen_ = 0;
-
-    // Invoke the Echo method.
-    base::RunLoop run_loop;
-    server_impl.set_closure(run_loop.QuitClosure());
-    interface_ptr_->EchoInt(
-        7,
-        BindValueSaver(&last_client_callback_value_seen_, base::Closure()));
-    run_loop.Run();
-  }
-  // The binding has now been destroyed and the pipe is closed.
-
-  // Check that server saw the correct value, but the client has not yet.
-  EXPECT_EQ(7, server_impl.last_server_value_seen());
-  EXPECT_EQ(0, last_client_callback_value_seen_);
-
-  // Delete the callback without running it. This should not
-  // cause a problem because the insfrastructure can detect that the
-  // binding has already been destroyed and the pipe is closed.
-  server_impl.DeleteCallback();
-}
-
-// Tests that closing a Binding allows us to delete a callback
-// without running it without encountering a crash.
-TEST_F(BindingCallbackTest, CloseBindingBeforeDeletingCallback) {
-  // Create the ServerImpl and the Binding.
-  InterfaceImpl server_impl;
-  Binding<sample::Provider> binding(&server_impl, MakeRequest(&interface_ptr_));
-
-  // Initialize the test values.
-  server_impl.resetLastServerValueSeen();
-  last_client_callback_value_seen_ = 0;
-
-  // Invoke the Echo method.
-  base::RunLoop run_loop;
-  server_impl.set_closure(run_loop.QuitClosure());
-  interface_ptr_->EchoInt(
-      7,
-      BindValueSaver(&last_client_callback_value_seen_, base::Closure()));
-  run_loop.Run();
-
-  // Check that server saw the correct value, but the client has not yet.
-  EXPECT_EQ(7, server_impl.last_server_value_seen());
-  EXPECT_EQ(0, last_client_callback_value_seen_);
-
-  // Now close the Binding.
-  binding.Close();
-
-  // Delete the callback without running it. This should not
-  // cause a crash because the insfrastructure can detect that the
-  // binding has already been closed.
-  server_impl.DeleteCallback();
-
-  // Check that the client has still not seen the correct value.
-  EXPECT_EQ(0, last_client_callback_value_seen_);
-}
-
-// Tests that deleting a Callback without using it before the
-// Binding has been destroyed or closed results in a DCHECK.
-TEST_F(BindingCallbackTest, DeleteCallbackBeforeBindingDeathTest) {
-  // Create the ServerImpl and the Binding.
-  InterfaceImpl server_impl;
-  Binding<sample::Provider> binding(&server_impl, MakeRequest(&interface_ptr_));
-
-  // Initialize the test values.
-  server_impl.resetLastServerValueSeen();
-  last_client_callback_value_seen_ = 0;
-
-  // Invoke the Echo method.
-  base::RunLoop run_loop;
-  server_impl.set_closure(run_loop.QuitClosure());
-  interface_ptr_->EchoInt(
-      7,
-      BindValueSaver(&last_client_callback_value_seen_, base::Closure()));
-  run_loop.Run();
-
-  // Check that server saw the correct value, but the client has not yet.
-  EXPECT_EQ(7, server_impl.last_server_value_seen());
-  EXPECT_EQ(0, last_client_callback_value_seen_);
-
-  EXPECT_DCHECK_DEATH(server_impl.DeleteCallback());
-}
-
-}  // namespace
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/binding_set_unittest.cc b/mojo/public/cpp/bindings/tests/binding_set_unittest.cc
deleted file mode 100644
index 07acfbe..0000000
--- a/mojo/public/cpp/bindings/tests/binding_set_unittest.cc
+++ /dev/null
@@ -1,416 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <memory>
-#include <utility>
-
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "mojo/public/cpp/bindings/associated_binding_set.h"
-#include "mojo/public/cpp/bindings/binding_set.h"
-#include "mojo/public/cpp/bindings/strong_binding_set.h"
-#include "mojo/public/interfaces/bindings/tests/ping_service.mojom.h"
-#include "mojo/public/interfaces/bindings/tests/test_associated_interfaces.mojom.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace test {
-namespace {
-
-class BindingSetTest : public testing::Test {
- public:
-  BindingSetTest() {}
-  ~BindingSetTest() override {}
-
-  base::MessageLoop& loop() { return loop_; }
-
- private:
-  base::MessageLoop loop_;
-
-  DISALLOW_COPY_AND_ASSIGN(BindingSetTest);
-};
-
-template <typename BindingSetType, typename ContextType>
-void ExpectContextHelper(BindingSetType* binding_set,
-                         ContextType expected_context) {
-  EXPECT_EQ(expected_context, binding_set->dispatch_context());
-}
-
-template <typename BindingSetType, typename ContextType>
-base::Closure ExpectContext(BindingSetType* binding_set,
-                            ContextType expected_context) {
-  return base::Bind(
-      &ExpectContextHelper<BindingSetType, ContextType>, binding_set,
-      expected_context);
-}
-
-base::Closure Sequence(const base::Closure& first,
-                       const base::Closure& second) {
-  return base::Bind(
-      [] (const base::Closure& first, const base::Closure& second) {
-        first.Run();
-        second.Run();
-      }, first, second);
-}
-
-class PingImpl : public PingService {
- public:
-  PingImpl() {}
-  ~PingImpl() override {}
-
-  void set_ping_handler(const base::Closure& handler) {
-    ping_handler_ = handler;
-  }
-
- private:
-  // PingService:
-  void Ping(const PingCallback& callback) override {
-    if (!ping_handler_.is_null())
-      ping_handler_.Run();
-    callback.Run();
-  }
-
-  base::Closure ping_handler_;
-};
-
-TEST_F(BindingSetTest, BindingSetContext) {
-  PingImpl impl;
-
-  BindingSet<PingService, int> bindings;
-  PingServicePtr ping_a, ping_b;
-  bindings.AddBinding(&impl, MakeRequest(&ping_a), 1);
-  bindings.AddBinding(&impl, MakeRequest(&ping_b), 2);
-
-  {
-    impl.set_ping_handler(ExpectContext(&bindings, 1));
-    base::RunLoop loop;
-    ping_a->Ping(loop.QuitClosure());
-    loop.Run();
-  }
-
-  {
-    impl.set_ping_handler(ExpectContext(&bindings, 2));
-    base::RunLoop loop;
-    ping_b->Ping(loop.QuitClosure());
-    loop.Run();
-  }
-
-  {
-    base::RunLoop loop;
-    bindings.set_connection_error_handler(
-        Sequence(ExpectContext(&bindings, 1), loop.QuitClosure()));
-    ping_a.reset();
-    loop.Run();
-  }
-
-  {
-    base::RunLoop loop;
-    bindings.set_connection_error_handler(
-        Sequence(ExpectContext(&bindings, 2), loop.QuitClosure()));
-    ping_b.reset();
-    loop.Run();
-  }
-
-  EXPECT_TRUE(bindings.empty());
-}
-
-TEST_F(BindingSetTest, BindingSetConnectionErrorWithReason) {
-  PingImpl impl;
-  PingServicePtr ptr;
-  BindingSet<PingService> bindings;
-  bindings.AddBinding(&impl, MakeRequest(&ptr));
-
-  base::RunLoop run_loop;
-  bindings.set_connection_error_with_reason_handler(base::Bind(
-      [](const base::Closure& quit_closure, uint32_t custom_reason,
-         const std::string& description) {
-        EXPECT_EQ(1024u, custom_reason);
-        EXPECT_EQ("bye", description);
-        quit_closure.Run();
-      },
-      run_loop.QuitClosure()));
-
-  ptr.ResetWithReason(1024u, "bye");
-}
-
-class PingProviderImpl : public AssociatedPingProvider, public PingService {
- public:
-  PingProviderImpl() {}
-  ~PingProviderImpl() override {}
-
-  void set_new_ping_context(int context) { new_ping_context_ = context; }
-
-  void set_new_ping_handler(const base::Closure& handler) {
-    new_ping_handler_ = handler;
-  }
-
-  void set_ping_handler(const base::Closure& handler) {
-    ping_handler_ = handler;
-  }
-
-  AssociatedBindingSet<PingService, int>& ping_bindings() {
-    return ping_bindings_;
-  }
-
- private:
-  // AssociatedPingProvider:
-  void GetPing(PingServiceAssociatedRequest request) override {
-    ping_bindings_.AddBinding(this, std::move(request), new_ping_context_);
-    if (!new_ping_handler_.is_null())
-      new_ping_handler_.Run();
-  }
-
-  // PingService:
-  void Ping(const PingCallback& callback) override {
-    if (!ping_handler_.is_null())
-      ping_handler_.Run();
-    callback.Run();
-  }
-
-  AssociatedBindingSet<PingService, int> ping_bindings_;
-  int new_ping_context_ = -1;
-  base::Closure ping_handler_;
-  base::Closure new_ping_handler_;
-};
-
-TEST_F(BindingSetTest, AssociatedBindingSetContext) {
-  AssociatedPingProviderPtr provider;
-  PingProviderImpl impl;
-  Binding<AssociatedPingProvider> binding(&impl, MakeRequest(&provider));
-
-  PingServiceAssociatedPtr ping_a;
-  {
-    base::RunLoop loop;
-    impl.set_new_ping_context(1);
-    impl.set_new_ping_handler(loop.QuitClosure());
-    provider->GetPing(MakeRequest(&ping_a));
-    loop.Run();
-  }
-
-  PingServiceAssociatedPtr ping_b;
-  {
-    base::RunLoop loop;
-    impl.set_new_ping_context(2);
-    impl.set_new_ping_handler(loop.QuitClosure());
-    provider->GetPing(MakeRequest(&ping_b));
-    loop.Run();
-  }
-
-  {
-    impl.set_ping_handler(ExpectContext(&impl.ping_bindings(), 1));
-    base::RunLoop loop;
-    ping_a->Ping(loop.QuitClosure());
-    loop.Run();
-  }
-
-  {
-    impl.set_ping_handler(ExpectContext(&impl.ping_bindings(), 2));
-    base::RunLoop loop;
-    ping_b->Ping(loop.QuitClosure());
-    loop.Run();
-  }
-
-  {
-    base::RunLoop loop;
-    impl.ping_bindings().set_connection_error_handler(
-        Sequence(ExpectContext(&impl.ping_bindings(), 1), loop.QuitClosure()));
-    ping_a.reset();
-    loop.Run();
-  }
-
-  {
-    base::RunLoop loop;
-    impl.ping_bindings().set_connection_error_handler(
-        Sequence(ExpectContext(&impl.ping_bindings(), 2), loop.QuitClosure()));
-    ping_b.reset();
-    loop.Run();
-  }
-
-  EXPECT_TRUE(impl.ping_bindings().empty());
-}
-
-TEST_F(BindingSetTest, MasterInterfaceBindingSetContext) {
-  AssociatedPingProviderPtr provider_a, provider_b;
-  PingProviderImpl impl;
-  BindingSet<AssociatedPingProvider, int> bindings;
-
-  bindings.AddBinding(&impl, MakeRequest(&provider_a), 1);
-  bindings.AddBinding(&impl, MakeRequest(&provider_b), 2);
-
-  {
-    PingServiceAssociatedPtr ping;
-    base::RunLoop loop;
-    impl.set_new_ping_handler(
-        Sequence(ExpectContext(&bindings, 1), loop.QuitClosure()));
-    provider_a->GetPing(MakeRequest(&ping));
-    loop.Run();
-  }
-
-  {
-    PingServiceAssociatedPtr ping;
-    base::RunLoop loop;
-    impl.set_new_ping_handler(
-        Sequence(ExpectContext(&bindings, 2), loop.QuitClosure()));
-    provider_b->GetPing(MakeRequest(&ping));
-    loop.Run();
-  }
-
-  {
-    base::RunLoop loop;
-    bindings.set_connection_error_handler(
-        Sequence(ExpectContext(&bindings, 1), loop.QuitClosure()));
-    provider_a.reset();
-    loop.Run();
-  }
-
-  {
-    base::RunLoop loop;
-    bindings.set_connection_error_handler(
-        Sequence(ExpectContext(&bindings, 2), loop.QuitClosure()));
-    provider_b.reset();
-    loop.Run();
-  }
-
-  EXPECT_TRUE(bindings.empty());
-}
-
-TEST_F(BindingSetTest, PreDispatchHandler) {
-  PingImpl impl;
-
-  BindingSet<PingService, int> bindings;
-  PingServicePtr ping_a, ping_b;
-  bindings.AddBinding(&impl, MakeRequest(&ping_a), 1);
-  bindings.AddBinding(&impl, MakeRequest(&ping_b), 2);
-
-  {
-    bindings.set_pre_dispatch_handler(base::Bind([] (const int& context) {
-      EXPECT_EQ(1, context);
-    }));
-    base::RunLoop loop;
-    ping_a->Ping(loop.QuitClosure());
-    loop.Run();
-  }
-
-  {
-    bindings.set_pre_dispatch_handler(base::Bind([] (const int& context) {
-      EXPECT_EQ(2, context);
-    }));
-    base::RunLoop loop;
-    ping_b->Ping(loop.QuitClosure());
-    loop.Run();
-  }
-
-  {
-    base::RunLoop loop;
-    bindings.set_pre_dispatch_handler(
-        base::Bind([](base::RunLoop* loop, const int& context) {
-          EXPECT_EQ(1, context);
-          loop->Quit();
-        }, &loop));
-    ping_a.reset();
-    loop.Run();
-  }
-
-  {
-    base::RunLoop loop;
-    bindings.set_pre_dispatch_handler(
-        base::Bind([](base::RunLoop* loop, const int& context) {
-          EXPECT_EQ(2, context);
-          loop->Quit();
-        }, &loop));
-    ping_b.reset();
-    loop.Run();
-  }
-
-  EXPECT_TRUE(bindings.empty());
-}
-
-TEST_F(BindingSetTest, AssociatedBindingSetConnectionErrorWithReason) {
-  AssociatedPingProviderPtr master_ptr;
-  PingProviderImpl master_impl;
-  Binding<AssociatedPingProvider> master_binding(&master_impl, &master_ptr);
-
-  base::RunLoop run_loop;
-  master_impl.ping_bindings().set_connection_error_with_reason_handler(
-      base::Bind(
-          [](const base::Closure& quit_closure, uint32_t custom_reason,
-             const std::string& description) {
-            EXPECT_EQ(2048u, custom_reason);
-            EXPECT_EQ("bye", description);
-            quit_closure.Run();
-          },
-          run_loop.QuitClosure()));
-
-  PingServiceAssociatedPtr ptr;
-  master_ptr->GetPing(MakeRequest(&ptr));
-
-  ptr.ResetWithReason(2048u, "bye");
-
-  run_loop.Run();
-}
-
-class PingInstanceCounter : public PingService {
- public:
-  PingInstanceCounter() { ++instance_count; }
-  ~PingInstanceCounter() override { --instance_count; }
-
-  void Ping(const PingCallback& callback) override {}
-
-  static int instance_count;
-};
-int PingInstanceCounter::instance_count = 0;
-
-TEST_F(BindingSetTest, StrongBinding_Destructor) {
-  PingServicePtr ping_a, ping_b;
-  auto bindings = base::MakeUnique<StrongBindingSet<PingService>>();
-
-  bindings->AddBinding(base::MakeUnique<PingInstanceCounter>(),
-                       mojo::MakeRequest(&ping_a));
-  EXPECT_EQ(1, PingInstanceCounter::instance_count);
-
-  bindings->AddBinding(base::MakeUnique<PingInstanceCounter>(),
-                       mojo::MakeRequest(&ping_b));
-  EXPECT_EQ(2, PingInstanceCounter::instance_count);
-
-  bindings.reset();
-  EXPECT_EQ(0, PingInstanceCounter::instance_count);
-}
-
-TEST_F(BindingSetTest, StrongBinding_ConnectionError) {
-  PingServicePtr ping_a, ping_b;
-  StrongBindingSet<PingService> bindings;
-  bindings.AddBinding(base::MakeUnique<PingInstanceCounter>(),
-                      mojo::MakeRequest(&ping_a));
-  bindings.AddBinding(base::MakeUnique<PingInstanceCounter>(),
-                      mojo::MakeRequest(&ping_b));
-  EXPECT_EQ(2, PingInstanceCounter::instance_count);
-
-  ping_a.reset();
-  base::RunLoop().RunUntilIdle();
-  EXPECT_EQ(1, PingInstanceCounter::instance_count);
-
-  ping_b.reset();
-  base::RunLoop().RunUntilIdle();
-  EXPECT_EQ(0, PingInstanceCounter::instance_count);
-}
-
-TEST_F(BindingSetTest, StrongBinding_RemoveBinding) {
-  PingServicePtr ping_a, ping_b;
-  StrongBindingSet<PingService> bindings;
-  BindingId binding_id_a = bindings.AddBinding(
-      base::MakeUnique<PingInstanceCounter>(), mojo::MakeRequest(&ping_a));
-  BindingId binding_id_b = bindings.AddBinding(
-      base::MakeUnique<PingInstanceCounter>(), mojo::MakeRequest(&ping_b));
-  EXPECT_EQ(2, PingInstanceCounter::instance_count);
-
-  EXPECT_TRUE(bindings.RemoveBinding(binding_id_a));
-  EXPECT_EQ(1, PingInstanceCounter::instance_count);
-
-  EXPECT_TRUE(bindings.RemoveBinding(binding_id_b));
-  EXPECT_EQ(0, PingInstanceCounter::instance_count);
-}
-
-}  // namespace
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/binding_unittest.cc b/mojo/public/cpp/bindings/tests/binding_unittest.cc
deleted file mode 100644
index e76993b..0000000
--- a/mojo/public/cpp/bindings/tests/binding_unittest.cc
+++ /dev/null
@@ -1,611 +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.
-
-// Note: This file tests both binding.h (mojo::Binding) and strong_binding.h
-// (mojo::StrongBinding).
-
-#include "mojo/public/cpp/bindings/binding.h"
-
-#include <stdint.h>
-#include <utility>
-
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "base/memory/weak_ptr.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "mojo/public/cpp/bindings/strong_binding.h"
-#include "mojo/public/interfaces/bindings/tests/ping_service.mojom.h"
-#include "mojo/public/interfaces/bindings/tests/sample_interfaces.mojom.h"
-#include "mojo/public/interfaces/bindings/tests/sample_service.mojom.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace {
-
-class BindingTestBase : public testing::Test {
- public:
-  BindingTestBase() {}
-  ~BindingTestBase() override {}
-
-  base::MessageLoop& loop() { return loop_; }
-
- private:
-  base::MessageLoop loop_;
-
-  DISALLOW_COPY_AND_ASSIGN(BindingTestBase);
-};
-
-class ServiceImpl : public sample::Service {
- public:
-  explicit ServiceImpl(bool* was_deleted = nullptr)
-      : was_deleted_(was_deleted) {}
-  ~ServiceImpl() override {
-    if (was_deleted_)
-      *was_deleted_ = true;
-  }
-
- private:
-  // sample::Service implementation
-  void Frobinate(sample::FooPtr foo,
-                 BazOptions options,
-                 sample::PortPtr port,
-                 const FrobinateCallback& callback) override {
-    callback.Run(1);
-  }
-  void GetPort(InterfaceRequest<sample::Port> port) override {}
-
-  bool* const was_deleted_;
-
-  DISALLOW_COPY_AND_ASSIGN(ServiceImpl);
-};
-
-template <typename... Args>
-void DoSetFlagAndRunClosure(bool* flag,
-                            const base::Closure& closure,
-                            Args... args) {
-  *flag = true;
-  if (!closure.is_null())
-    closure.Run();
-}
-
-template <typename... Args>
-base::Callback<void(Args...)> SetFlagAndRunClosure(
-    bool* flag,
-    const base::Closure& callback = base::Closure()) {
-  return base::Bind(&DoSetFlagAndRunClosure<Args...>, flag, callback);
-}
-
-// BindingTest -----------------------------------------------------------------
-
-using BindingTest = BindingTestBase;
-
-TEST_F(BindingTest, Close) {
-  bool called = false;
-  sample::ServicePtr ptr;
-  auto request = MakeRequest(&ptr);
-  base::RunLoop run_loop;
-  ptr.set_connection_error_handler(
-      SetFlagAndRunClosure(&called, run_loop.QuitClosure()));
-  ServiceImpl impl;
-  Binding<sample::Service> binding(&impl, std::move(request));
-
-  binding.Close();
-  EXPECT_FALSE(called);
-  run_loop.Run();
-  EXPECT_TRUE(called);
-}
-
-// Tests that destroying a mojo::Binding closes the bound message pipe handle.
-TEST_F(BindingTest, DestroyClosesMessagePipe) {
-  bool encountered_error = false;
-  ServiceImpl impl;
-  sample::ServicePtr ptr;
-  auto request = MakeRequest(&ptr);
-  base::RunLoop run_loop;
-  ptr.set_connection_error_handler(
-      SetFlagAndRunClosure(&encountered_error, run_loop.QuitClosure()));
-  bool called = false;
-  base::RunLoop run_loop2;
-  {
-    Binding<sample::Service> binding(&impl, std::move(request));
-    ptr->Frobinate(nullptr, sample::Service::BazOptions::REGULAR, nullptr,
-                   SetFlagAndRunClosure<int32_t>(&called,
-                                                 run_loop2.QuitClosure()));
-    run_loop2.Run();
-    EXPECT_TRUE(called);
-    EXPECT_FALSE(encountered_error);
-  }
-  // Now that the Binding is out of scope we should detect an error on the other
-  // end of the pipe.
-  run_loop.Run();
-  EXPECT_TRUE(encountered_error);
-
-  // And calls should fail.
-  called = false;
-  ptr->Frobinate(nullptr, sample::Service::BazOptions::REGULAR, nullptr,
-                 SetFlagAndRunClosure<int32_t>(&called,
-                                               run_loop2.QuitClosure()));
-  base::RunLoop().RunUntilIdle();
-  EXPECT_FALSE(called);
-}
-
-// Tests that the binding's connection error handler gets called when the other
-// end is closed.
-TEST_F(BindingTest, ConnectionError) {
-  bool called = false;
-  {
-    ServiceImpl impl;
-    sample::ServicePtr ptr;
-    Binding<sample::Service> binding(&impl, MakeRequest(&ptr));
-    base::RunLoop run_loop;
-    binding.set_connection_error_handler(
-        SetFlagAndRunClosure(&called, run_loop.QuitClosure()));
-    ptr.reset();
-    EXPECT_FALSE(called);
-    run_loop.Run();
-    EXPECT_TRUE(called);
-    // We want to make sure that it isn't called again during destruction.
-    called = false;
-  }
-  EXPECT_FALSE(called);
-}
-
-// Tests that calling Close doesn't result in the connection error handler being
-// called.
-TEST_F(BindingTest, CloseDoesntCallConnectionErrorHandler) {
-  ServiceImpl impl;
-  sample::ServicePtr ptr;
-  Binding<sample::Service> binding(&impl, MakeRequest(&ptr));
-  bool called = false;
-  binding.set_connection_error_handler(SetFlagAndRunClosure(&called));
-  binding.Close();
-  base::RunLoop().RunUntilIdle();
-  EXPECT_FALSE(called);
-
-  // We can also close the other end, and the error handler still won't be
-  // called.
-  ptr.reset();
-  base::RunLoop().RunUntilIdle();
-  EXPECT_FALSE(called);
-}
-
-class ServiceImplWithBinding : public ServiceImpl {
- public:
-  ServiceImplWithBinding(bool* was_deleted,
-                         const base::Closure& closure,
-                         InterfaceRequest<sample::Service> request)
-      : ServiceImpl(was_deleted),
-        binding_(this, std::move(request)),
-        closure_(closure) {
-    binding_.set_connection_error_handler(
-        base::Bind(&ServiceImplWithBinding::OnConnectionError,
-                   base::Unretained(this)));
-  }
-
- private:
-  ~ServiceImplWithBinding() override{
-    closure_.Run();
-  }
-
-  void OnConnectionError() { delete this; }
-
-  Binding<sample::Service> binding_;
-  base::Closure closure_;
-
-  DISALLOW_COPY_AND_ASSIGN(ServiceImplWithBinding);
-};
-
-// Tests that the binding may be deleted in the connection error handler.
-TEST_F(BindingTest, SelfDeleteOnConnectionError) {
-  bool was_deleted = false;
-  sample::ServicePtr ptr;
-  // This should delete itself on connection error.
-  base::RunLoop run_loop;
-  new ServiceImplWithBinding(&was_deleted, run_loop.QuitClosure(),
-                             MakeRequest(&ptr));
-  ptr.reset();
-  EXPECT_FALSE(was_deleted);
-  run_loop.Run();
-  EXPECT_TRUE(was_deleted);
-}
-
-// Tests that explicitly calling Unbind followed by rebinding works.
-TEST_F(BindingTest, Unbind) {
-  ServiceImpl impl;
-  sample::ServicePtr ptr;
-  Binding<sample::Service> binding(&impl, MakeRequest(&ptr));
-
-  bool called = false;
-  base::RunLoop run_loop;
-  ptr->Frobinate(nullptr, sample::Service::BazOptions::REGULAR, nullptr,
-                 SetFlagAndRunClosure<int32_t>(&called,
-                                               run_loop.QuitClosure()));
-  run_loop.Run();
-  EXPECT_TRUE(called);
-
-  called = false;
-  auto request = binding.Unbind();
-  EXPECT_FALSE(binding.is_bound());
-  // All calls should fail when not bound...
-  ptr->Frobinate(nullptr, sample::Service::BazOptions::REGULAR, nullptr,
-                 SetFlagAndRunClosure<int32_t>(&called,
-                                               run_loop.QuitClosure()));
-  base::RunLoop().RunUntilIdle();
-  EXPECT_FALSE(called);
-
-  called = false;
-  binding.Bind(std::move(request));
-  EXPECT_TRUE(binding.is_bound());
-  // ...and should succeed again when the rebound.
-  base::RunLoop run_loop2;
-  ptr->Frobinate(nullptr, sample::Service::BazOptions::REGULAR, nullptr,
-                 SetFlagAndRunClosure<int32_t>(&called,
-                                               run_loop2.QuitClosure()));
-  run_loop2.Run();
-  EXPECT_TRUE(called);
-}
-
-class IntegerAccessorImpl : public sample::IntegerAccessor {
- public:
-  IntegerAccessorImpl() {}
-  ~IntegerAccessorImpl() override {}
-
- private:
-  // sample::IntegerAccessor implementation.
-  void GetInteger(const GetIntegerCallback& callback) override {
-    callback.Run(1, sample::Enum::VALUE);
-  }
-  void SetInteger(int64_t data, sample::Enum type) override {}
-
-  DISALLOW_COPY_AND_ASSIGN(IntegerAccessorImpl);
-};
-
-TEST_F(BindingTest, SetInterfacePtrVersion) {
-  IntegerAccessorImpl impl;
-  sample::IntegerAccessorPtr ptr;
-  Binding<sample::IntegerAccessor> binding(&impl, &ptr);
-  EXPECT_EQ(3u, ptr.version());
-}
-
-TEST_F(BindingTest, PauseResume) {
-  bool called = false;
-  base::RunLoop run_loop;
-  sample::ServicePtr ptr;
-  auto request = MakeRequest(&ptr);
-  ServiceImpl impl;
-  Binding<sample::Service> binding(&impl, std::move(request));
-  binding.PauseIncomingMethodCallProcessing();
-  ptr->Frobinate(nullptr, sample::Service::BazOptions::REGULAR, nullptr,
-                 SetFlagAndRunClosure<int32_t>(&called,
-                                               run_loop.QuitClosure()));
-  EXPECT_FALSE(called);
-  base::RunLoop().RunUntilIdle();
-  // Frobinate() should not be called as the binding is paused.
-  EXPECT_FALSE(called);
-
-  // Resume the binding, which should trigger processing.
-  binding.ResumeIncomingMethodCallProcessing();
-  run_loop.Run();
-  EXPECT_TRUE(called);
-}
-
-// Verifies the connection error handler is not run while a binding is paused.
-TEST_F(BindingTest, ErrorHandleNotRunWhilePaused) {
-  bool called = false;
-  base::RunLoop run_loop;
-  sample::ServicePtr ptr;
-  auto request = MakeRequest(&ptr);
-  ServiceImpl impl;
-  Binding<sample::Service> binding(&impl, std::move(request));
-  binding.set_connection_error_handler(
-      SetFlagAndRunClosure(&called, run_loop.QuitClosure()));
-  binding.PauseIncomingMethodCallProcessing();
-
-  ptr.reset();
-  base::RunLoop().RunUntilIdle();
-  // The connection error handle should not be called as the binding is paused.
-  EXPECT_FALSE(called);
-
-  // Resume the binding, which should trigger the error handler.
-  binding.ResumeIncomingMethodCallProcessing();
-  run_loop.Run();
-  EXPECT_TRUE(called);
-}
-
-class PingServiceImpl : public test::PingService {
- public:
-  PingServiceImpl() {}
-  ~PingServiceImpl() override {}
-
-  // test::PingService:
-  void Ping(const PingCallback& callback) override {
-    if (!ping_handler_.is_null())
-      ping_handler_.Run();
-    callback.Run();
-  }
-
-  void set_ping_handler(const base::Closure& handler) {
-    ping_handler_ = handler;
-  }
-
- private:
-  base::Closure ping_handler_;
-
-  DISALLOW_COPY_AND_ASSIGN(PingServiceImpl);
-};
-
-class CallbackFilter : public MessageReceiver {
- public:
-  explicit CallbackFilter(const base::Closure& callback)
-      : callback_(callback) {}
-  ~CallbackFilter() override {}
-
-  static std::unique_ptr<CallbackFilter> Wrap(const base::Closure& callback) {
-    return base::MakeUnique<CallbackFilter>(callback);
-  }
-
-  // MessageReceiver:
-  bool Accept(Message* message) override {
-    callback_.Run();
-    return true;
-  }
-
- private:
-  const base::Closure callback_;
-};
-
-// Verifies that message filters are notified in the order they were added and
-// are always notified before a message is dispatched.
-TEST_F(BindingTest, MessageFilter) {
-  test::PingServicePtr ptr;
-  PingServiceImpl impl;
-  mojo::Binding<test::PingService> binding(&impl, MakeRequest(&ptr));
-
-  int status = 0;
-  auto handler_helper = [] (int* status, int expected_status, int new_status) {
-    EXPECT_EQ(expected_status, *status);
-    *status = new_status;
-  };
-  auto create_handler = [&] (int expected_status, int new_status) {
-    return base::Bind(handler_helper, &status, expected_status, new_status);
-  };
-
-  binding.AddFilter(CallbackFilter::Wrap(create_handler(0, 1)));
-  binding.AddFilter(CallbackFilter::Wrap(create_handler(1, 2)));
-  impl.set_ping_handler(create_handler(2, 3));
-
-  for (int i = 0; i < 10; ++i) {
-    status = 0;
-    base::RunLoop loop;
-    ptr->Ping(loop.QuitClosure());
-    loop.Run();
-    EXPECT_EQ(3, status);
-  }
-}
-
-void Fail() {
-  FAIL() << "Unexpected connection error";
-}
-
-TEST_F(BindingTest, FlushForTesting) {
-  bool called = false;
-  sample::ServicePtr ptr;
-  auto request = MakeRequest(&ptr);
-  ServiceImpl impl;
-  Binding<sample::Service> binding(&impl, std::move(request));
-  binding.set_connection_error_handler(base::Bind(&Fail));
-
-  ptr->Frobinate(nullptr, sample::Service::BazOptions::REGULAR, nullptr,
-                 SetFlagAndRunClosure<int32_t>(&called));
-  EXPECT_FALSE(called);
-  // Because the flush is sent from the binding, it only guarantees that the
-  // request has been received, not the response. The second flush waits for the
-  // response to be received.
-  binding.FlushForTesting();
-  binding.FlushForTesting();
-  EXPECT_TRUE(called);
-}
-
-TEST_F(BindingTest, FlushForTestingWithClosedPeer) {
-  bool called = false;
-  sample::ServicePtr ptr;
-  auto request = MakeRequest(&ptr);
-  ServiceImpl impl;
-  Binding<sample::Service> binding(&impl, std::move(request));
-  binding.set_connection_error_handler(SetFlagAndRunClosure(&called));
-  ptr.reset();
-
-  EXPECT_FALSE(called);
-  binding.FlushForTesting();
-  EXPECT_TRUE(called);
-  binding.FlushForTesting();
-}
-
-TEST_F(BindingTest, ConnectionErrorWithReason) {
-  sample::ServicePtr ptr;
-  auto request = MakeRequest(&ptr);
-  ServiceImpl impl;
-  Binding<sample::Service> binding(&impl, std::move(request));
-
-  base::RunLoop run_loop;
-  binding.set_connection_error_with_reason_handler(base::Bind(
-      [](const base::Closure& quit_closure, uint32_t custom_reason,
-         const std::string& description) {
-        EXPECT_EQ(1234u, custom_reason);
-        EXPECT_EQ("hello", description);
-        quit_closure.Run();
-      },
-      run_loop.QuitClosure()));
-
-  ptr.ResetWithReason(1234u, "hello");
-
-  run_loop.Run();
-}
-
-template <typename T>
-struct WeakPtrImplRefTraits {
-  using PointerType = base::WeakPtr<T>;
-
-  static bool IsNull(const base::WeakPtr<T>& ptr) { return !ptr; }
-  static T* GetRawPointer(base::WeakPtr<T>* ptr) { return ptr->get(); }
-};
-
-template <typename T>
-using WeakBinding = Binding<T, WeakPtrImplRefTraits<T>>;
-
-TEST_F(BindingTest, CustomImplPointerType) {
-  PingServiceImpl impl;
-  base::WeakPtrFactory<test::PingService> weak_factory(&impl);
-
-  test::PingServicePtr proxy;
-  WeakBinding<test::PingService> binding(weak_factory.GetWeakPtr(),
-                                         MakeRequest(&proxy));
-
-  {
-    // Ensure the binding is functioning.
-    base::RunLoop run_loop;
-    proxy->Ping(run_loop.QuitClosure());
-    run_loop.Run();
-  }
-
-  {
-    // Attempt to dispatch another message after the WeakPtr is invalidated.
-    base::Closure assert_not_reached = base::Bind([] { NOTREACHED(); });
-    impl.set_ping_handler(assert_not_reached);
-    proxy->Ping(assert_not_reached);
-
-    // The binding will close its end of the pipe which will trigger a
-    // connection error on |proxy|.
-    base::RunLoop run_loop;
-    proxy.set_connection_error_handler(run_loop.QuitClosure());
-    weak_factory.InvalidateWeakPtrs();
-    run_loop.Run();
-  }
-}
-
-// StrongBindingTest -----------------------------------------------------------
-
-using StrongBindingTest = BindingTestBase;
-
-// Tests that destroying a mojo::StrongBinding closes the bound message pipe
-// handle but does *not* destroy the implementation object.
-TEST_F(StrongBindingTest, DestroyClosesMessagePipe) {
-  base::RunLoop run_loop;
-  bool encountered_error = false;
-  bool was_deleted = false;
-  sample::ServicePtr ptr;
-  auto request = MakeRequest(&ptr);
-  ptr.set_connection_error_handler(
-      SetFlagAndRunClosure(&encountered_error, run_loop.QuitClosure()));
-  bool called = false;
-  base::RunLoop run_loop2;
-
-  auto binding = MakeStrongBinding(base::MakeUnique<ServiceImpl>(&was_deleted),
-                                   std::move(request));
-  ptr->Frobinate(
-      nullptr, sample::Service::BazOptions::REGULAR, nullptr,
-      SetFlagAndRunClosure<int32_t>(&called, run_loop2.QuitClosure()));
-  run_loop2.Run();
-  EXPECT_TRUE(called);
-  EXPECT_FALSE(encountered_error);
-  binding->Close();
-
-  // Now that the StrongBinding is closed we should detect an error on the other
-  // end of the pipe.
-  run_loop.Run();
-  EXPECT_TRUE(encountered_error);
-
-  // Destroying the StrongBinding also destroys the impl.
-  ASSERT_TRUE(was_deleted);
-}
-
-// Tests the typical case, where the implementation object owns the
-// StrongBinding (and should be destroyed on connection error).
-TEST_F(StrongBindingTest, ConnectionErrorDestroysImpl) {
-  sample::ServicePtr ptr;
-  bool was_deleted = false;
-  // Will delete itself.
-  base::RunLoop run_loop;
-  new ServiceImplWithBinding(&was_deleted, run_loop.QuitClosure(),
-                             MakeRequest(&ptr));
-
-  base::RunLoop().RunUntilIdle();
-  EXPECT_FALSE(was_deleted);
-
-  ptr.reset();
-  EXPECT_FALSE(was_deleted);
-  run_loop.Run();
-  EXPECT_TRUE(was_deleted);
-}
-
-TEST_F(StrongBindingTest, FlushForTesting) {
-  bool called = false;
-  bool was_deleted = false;
-  sample::ServicePtr ptr;
-  auto request = MakeRequest(&ptr);
-  auto binding = MakeStrongBinding(base::MakeUnique<ServiceImpl>(&was_deleted),
-                                   std::move(request));
-  binding->set_connection_error_handler(base::Bind(&Fail));
-
-  ptr->Frobinate(nullptr, sample::Service::BazOptions::REGULAR, nullptr,
-                 SetFlagAndRunClosure<int32_t>(&called));
-  EXPECT_FALSE(called);
-  // Because the flush is sent from the binding, it only guarantees that the
-  // request has been received, not the response. The second flush waits for the
-  // response to be received.
-  ASSERT_TRUE(binding);
-  binding->FlushForTesting();
-  ASSERT_TRUE(binding);
-  binding->FlushForTesting();
-  EXPECT_TRUE(called);
-  EXPECT_FALSE(was_deleted);
-  ptr.reset();
-  ASSERT_TRUE(binding);
-  binding->set_connection_error_handler(base::Closure());
-  binding->FlushForTesting();
-  EXPECT_TRUE(was_deleted);
-}
-
-TEST_F(StrongBindingTest, FlushForTestingWithClosedPeer) {
-  bool called = false;
-  bool was_deleted = false;
-  sample::ServicePtr ptr;
-  auto request = MakeRequest(&ptr);
-  auto binding = MakeStrongBinding(base::MakeUnique<ServiceImpl>(&was_deleted),
-                                   std::move(request));
-  binding->set_connection_error_handler(SetFlagAndRunClosure(&called));
-  ptr.reset();
-
-  EXPECT_FALSE(called);
-  EXPECT_FALSE(was_deleted);
-  ASSERT_TRUE(binding);
-  binding->FlushForTesting();
-  EXPECT_TRUE(called);
-  EXPECT_TRUE(was_deleted);
-  ASSERT_FALSE(binding);
-}
-
-TEST_F(StrongBindingTest, ConnectionErrorWithReason) {
-  sample::ServicePtr ptr;
-  auto request = MakeRequest(&ptr);
-  auto binding =
-      MakeStrongBinding(base::MakeUnique<ServiceImpl>(), std::move(request));
-  base::RunLoop run_loop;
-  binding->set_connection_error_with_reason_handler(base::Bind(
-      [](const base::Closure& quit_closure, uint32_t custom_reason,
-         const std::string& description) {
-        EXPECT_EQ(5678u, custom_reason);
-        EXPECT_EQ("hello", description);
-        quit_closure.Run();
-      },
-      run_loop.QuitClosure()));
-
-  ptr.ResetWithReason(5678u, "hello");
-
-  run_loop.Run();
-}
-
-}  // namespace
-}  // mojo
diff --git a/mojo/public/cpp/bindings/tests/bindings_perftest.cc b/mojo/public/cpp/bindings/tests/bindings_perftest.cc
deleted file mode 100644
index 65b3c8c..0000000
--- a/mojo/public/cpp/bindings/tests/bindings_perftest.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 <stddef.h>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "base/time/time.h"
-#include "mojo/public/cpp/bindings/binding.h"
-#include "mojo/public/cpp/bindings/interface_endpoint_client.h"
-#include "mojo/public/cpp/bindings/lib/message_builder.h"
-#include "mojo/public/cpp/bindings/lib/multiplex_router.h"
-#include "mojo/public/cpp/bindings/message.h"
-#include "mojo/public/cpp/test_support/test_support.h"
-#include "mojo/public/cpp/test_support/test_utils.h"
-#include "mojo/public/interfaces/bindings/tests/ping_service.mojom.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace {
-
-const double kMojoTicksPerSecond = 1000000.0;
-
-double MojoTicksToSeconds(MojoTimeTicks ticks) {
-  return ticks / kMojoTicksPerSecond;
-}
-
-class PingServiceImpl : public test::PingService {
- public:
-  PingServiceImpl() {}
-  ~PingServiceImpl() override {}
-
-  // |PingService| methods:
-  void Ping(const PingCallback& callback) override;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(PingServiceImpl);
-};
-
-void PingServiceImpl::Ping(const PingCallback& callback) {
-  callback.Run();
-}
-
-class PingPongTest {
- public:
-  explicit PingPongTest(test::PingServicePtr service);
-
-  void Run(unsigned int iterations);
-
- private:
-  void OnPingDone();
-
-  test::PingServicePtr service_;
-  unsigned int iterations_to_run_;
-  unsigned int current_iterations_;
-
-  base::Closure quit_closure_;
-
-  DISALLOW_COPY_AND_ASSIGN(PingPongTest);
-};
-
-PingPongTest::PingPongTest(test::PingServicePtr service)
-    : service_(std::move(service)) {}
-
-void PingPongTest::Run(unsigned int iterations) {
-  iterations_to_run_ = iterations;
-  current_iterations_ = 0;
-
-  base::RunLoop run_loop;
-  quit_closure_ = run_loop.QuitClosure();
-  service_->Ping(base::Bind(&PingPongTest::OnPingDone, base::Unretained(this)));
-  run_loop.Run();
-}
-
-void PingPongTest::OnPingDone() {
-  current_iterations_++;
-  if (current_iterations_ >= iterations_to_run_) {
-    quit_closure_.Run();
-    return;
-  }
-
-  service_->Ping(base::Bind(&PingPongTest::OnPingDone, base::Unretained(this)));
-}
-
-struct BoundPingService {
-  BoundPingService() : binding(&impl) { binding.Bind(MakeRequest(&service)); }
-
-  PingServiceImpl impl;
-  test::PingServicePtr service;
-  Binding<test::PingService> binding;
-};
-
-class MojoBindingsPerftest : public testing::Test {
- public:
-  MojoBindingsPerftest() {}
-
- protected:
-  base::MessageLoop loop_;
-};
-
-TEST_F(MojoBindingsPerftest, InProcessPingPong) {
-  test::PingServicePtr service;
-  PingServiceImpl impl;
-  Binding<test::PingService> binding(&impl, MakeRequest(&service));
-  PingPongTest test(std::move(service));
-
-  {
-    const unsigned int kIterations = 100000;
-    const MojoTimeTicks start_time = MojoGetTimeTicksNow();
-    test.Run(kIterations);
-    const MojoTimeTicks end_time = MojoGetTimeTicksNow();
-    test::LogPerfResult(
-        "InProcessPingPong", "0_Inactive",
-        kIterations / MojoTicksToSeconds(end_time - start_time),
-        "pings/second");
-  }
-
-  {
-    const size_t kNumInactiveServices = 1000;
-    BoundPingService* inactive_services =
-        new BoundPingService[kNumInactiveServices];
-
-    const unsigned int kIterations = 10000;
-    const MojoTimeTicks start_time = MojoGetTimeTicksNow();
-    test.Run(kIterations);
-    const MojoTimeTicks end_time = MojoGetTimeTicksNow();
-    test::LogPerfResult(
-        "InProcessPingPong", "1000_Inactive",
-        kIterations / MojoTicksToSeconds(end_time - start_time),
-        "pings/second");
-
-    delete[] inactive_services;
-  }
-}
-
-class PingPongPaddle : public MessageReceiverWithResponderStatus {
- public:
-  PingPongPaddle(MessageReceiver* sender) : sender_(sender) {}
-
-  void set_sender(MessageReceiver* sender) { sender_ = sender; }
-
-  bool Accept(Message* message) override {
-    uint32_t count = message->header()->name;
-    if (!quit_closure_.is_null()) {
-      count++;
-      if (count >= expected_count_) {
-        end_time_ = base::TimeTicks::Now();
-        quit_closure_.Run();
-        return true;
-      }
-    }
-
-    internal::MessageBuilder builder(count, 0, 8, 0);
-    bool result = sender_->Accept(builder.message());
-    DCHECK(result);
-    return true;
-  }
-
-  bool AcceptWithResponder(
-      Message* message,
-      std::unique_ptr<MessageReceiverWithStatus> responder) override {
-    NOTREACHED();
-    return true;
-  }
-
-  base::TimeDelta Serve(uint32_t expected_count) {
-    base::RunLoop run_loop;
-
-    expected_count_ = expected_count;
-    quit_closure_ = run_loop.QuitClosure();
-
-    start_time_ = base::TimeTicks::Now();
-    internal::MessageBuilder builder(0, 0, 8, 0);
-    bool result = sender_->Accept(builder.message());
-    DCHECK(result);
-
-    run_loop.Run();
-
-    return end_time_ - start_time_;
-  }
-
- private:
-  base::TimeTicks start_time_;
-  base::TimeTicks end_time_;
-  uint32_t expected_count_ = 0;
-  MessageReceiver* sender_;
-  base::Closure quit_closure_;
-};
-
-TEST_F(MojoBindingsPerftest, MultiplexRouterPingPong) {
-  MessagePipe pipe;
-  scoped_refptr<internal::MultiplexRouter> router0(
-      new internal::MultiplexRouter(std::move(pipe.handle0),
-                                    internal::MultiplexRouter::SINGLE_INTERFACE,
-                                    true, base::ThreadTaskRunnerHandle::Get()));
-  scoped_refptr<internal::MultiplexRouter> router1(
-      new internal::MultiplexRouter(
-          std::move(pipe.handle1), internal::MultiplexRouter::SINGLE_INTERFACE,
-          false, base::ThreadTaskRunnerHandle::Get()));
-
-  PingPongPaddle paddle0(nullptr);
-  PingPongPaddle paddle1(nullptr);
-
-  InterfaceEndpointClient client0(
-      router0->CreateLocalEndpointHandle(kMasterInterfaceId), &paddle0, nullptr,
-      false, base::ThreadTaskRunnerHandle::Get(), 0u);
-  InterfaceEndpointClient client1(
-      router1->CreateLocalEndpointHandle(kMasterInterfaceId), &paddle1, nullptr,
-      false, base::ThreadTaskRunnerHandle::Get(), 0u);
-
-  paddle0.set_sender(&client0);
-  paddle1.set_sender(&client1);
-
-  static const uint32_t kWarmUpIterations = 1000;
-  static const uint32_t kTestIterations = 1000000;
-
-  paddle0.Serve(kWarmUpIterations);
-
-  base::TimeDelta duration = paddle0.Serve(kTestIterations);
-
-  test::LogPerfResult("MultiplexRouterPingPong", nullptr,
-                      kTestIterations / duration.InSecondsF(), "pings/second");
-}
-
-class CounterReceiver : public MessageReceiverWithResponderStatus {
- public:
-  bool Accept(Message* message) override {
-    counter_++;
-    return true;
-  }
-
-  bool AcceptWithResponder(
-      Message* message,
-      std::unique_ptr<MessageReceiverWithStatus> responder) override {
-    NOTREACHED();
-    return true;
-  }
-
-  uint32_t counter() const { return counter_; }
-
-  void Reset() { counter_ = 0; }
-
- private:
-  uint32_t counter_ = 0;
-};
-
-TEST_F(MojoBindingsPerftest, MultiplexRouterDispatchCost) {
-  MessagePipe pipe;
-  scoped_refptr<internal::MultiplexRouter> router(new internal::MultiplexRouter(
-      std::move(pipe.handle0), internal::MultiplexRouter::SINGLE_INTERFACE,
-      true, base::ThreadTaskRunnerHandle::Get()));
-  CounterReceiver receiver;
-  InterfaceEndpointClient client(
-      router->CreateLocalEndpointHandle(kMasterInterfaceId), &receiver, nullptr,
-      false, base::ThreadTaskRunnerHandle::Get(), 0u);
-
-  static const uint32_t kIterations[] = {1000, 3000000};
-
-  for (size_t i = 0; i < 2; ++i) {
-    receiver.Reset();
-    base::TimeTicks start_time = base::TimeTicks::Now();
-    for (size_t j = 0; j < kIterations[i]; ++j) {
-      internal::MessageBuilder builder(0, 0, 8, 0);
-      bool result =
-          router->SimulateReceivingMessageForTesting(builder.message());
-      DCHECK(result);
-    }
-
-    base::TimeTicks end_time = base::TimeTicks::Now();
-    base::TimeDelta duration = end_time - start_time;
-    CHECK_EQ(kIterations[i], receiver.counter());
-
-    if (i == 1) {
-      test::LogPerfResult("MultiplexRouterDispatchCost", nullptr,
-                          kIterations[i] / duration.InSecondsF(),
-                          "times/second");
-    }
-  }
-}
-
-}  // namespace
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/blink_typemaps.gni b/mojo/public/cpp/bindings/tests/blink_typemaps.gni
deleted file mode 100644
index b71dcf8..0000000
--- a/mojo/public/cpp/bindings/tests/blink_typemaps.gni
+++ /dev/null
@@ -1,8 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-typemaps = [
-  "//mojo/public/cpp/bindings/tests/rect_blink.typemap",
-  "//mojo/public/cpp/bindings/tests/test_native_types_blink.typemap",
-]
diff --git a/mojo/public/cpp/bindings/tests/buffer_unittest.cc b/mojo/public/cpp/bindings/tests/buffer_unittest.cc
deleted file mode 100644
index d75bdd0..0000000
--- a/mojo/public/cpp/bindings/tests/buffer_unittest.cc
+++ /dev/null
@@ -1,93 +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 <stddef.h>
-
-#include <limits>
-
-#include "mojo/public/cpp/bindings/lib/fixed_buffer.h"
-#include "mojo/public/cpp/bindings/lib/serialization_util.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace test {
-namespace {
-
-bool IsZero(void* p_buf, size_t size) {
-  char* buf = reinterpret_cast<char*>(p_buf);
-  for (size_t i = 0; i < size; ++i) {
-    if (buf[i] != 0)
-      return false;
-  }
-  return true;
-}
-
-// Tests that FixedBuffer allocates memory aligned to 8 byte boundaries.
-TEST(FixedBufferTest, Alignment) {
-  internal::FixedBufferForTesting buf(internal::Align(10) * 2);
-  ASSERT_EQ(buf.size(), 16u * 2);
-
-  void* a = buf.Allocate(10);
-  ASSERT_TRUE(a);
-  EXPECT_TRUE(IsZero(a, 10));
-  EXPECT_EQ(0, reinterpret_cast<ptrdiff_t>(a) % 8);
-
-  void* b = buf.Allocate(10);
-  ASSERT_TRUE(b);
-  EXPECT_TRUE(IsZero(b, 10));
-  EXPECT_EQ(0, reinterpret_cast<ptrdiff_t>(b) % 8);
-
-  // Any more allocations would result in an assert, but we can't test that.
-}
-
-// Tests that FixedBufferForTesting::Leak passes ownership to the caller.
-TEST(FixedBufferTest, Leak) {
-  void* ptr = nullptr;
-  void* buf_ptr = nullptr;
-  {
-    internal::FixedBufferForTesting buf(8);
-    ASSERT_EQ(8u, buf.size());
-
-    ptr = buf.Allocate(8);
-    ASSERT_TRUE(ptr);
-    buf_ptr = buf.Leak();
-
-    // The buffer should point to the first element allocated.
-    // TODO(mpcomplete): Is this a reasonable expectation?
-    EXPECT_EQ(ptr, buf_ptr);
-
-    // The FixedBufferForTesting should be empty now.
-    EXPECT_EQ(0u, buf.size());
-    EXPECT_FALSE(buf.Leak());
-  }
-
-  // Since we called Leak, ptr is still writable after FixedBufferForTesting
-  // went out of scope.
-  memset(ptr, 1, 8);
-  free(buf_ptr);
-}
-
-#if defined(NDEBUG) && !defined(DCHECK_ALWAYS_ON)
-TEST(FixedBufferTest, TooBig) {
-  internal::FixedBufferForTesting buf(24);
-
-  // A little bit too large.
-  EXPECT_EQ(reinterpret_cast<void*>(0), buf.Allocate(32));
-
-  // Move the cursor forward.
-  EXPECT_NE(reinterpret_cast<void*>(0), buf.Allocate(16));
-
-  // A lot too large.
-  EXPECT_EQ(reinterpret_cast<void*>(0),
-            buf.Allocate(std::numeric_limits<size_t>::max() - 1024u));
-
-  // A lot too large, leading to possible integer overflow.
-  EXPECT_EQ(reinterpret_cast<void*>(0),
-            buf.Allocate(std::numeric_limits<size_t>::max() - 8u));
-}
-#endif
-
-}  // namespace
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/chromium_typemaps.gni b/mojo/public/cpp/bindings/tests/chromium_typemaps.gni
deleted file mode 100644
index 1da7cbf..0000000
--- a/mojo/public/cpp/bindings/tests/chromium_typemaps.gni
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-typemaps = [
-  "//mojo/public/cpp/bindings/tests/rect_chromium.typemap",
-  "//mojo/public/cpp/bindings/tests/struct_with_traits.typemap",
-  "//mojo/public/cpp/bindings/tests/test_native_types_chromium.typemap",
-]
diff --git a/mojo/public/cpp/bindings/tests/connector_unittest.cc b/mojo/public/cpp/bindings/tests/connector_unittest.cc
deleted file mode 100644
index 74ecb7a..0000000
--- a/mojo/public/cpp/bindings/tests/connector_unittest.cc
+++ /dev/null
@@ -1,599 +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 "mojo/public/cpp/bindings/connector.h"
-
-#include <stddef.h>
-#include <stdlib.h>
-#include <string.h>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/callback_helpers.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "base/threading/thread.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "mojo/public/cpp/bindings/lib/message_builder.h"
-#include "mojo/public/cpp/bindings/tests/message_queue.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace test {
-namespace {
-
-class MessageAccumulator : public MessageReceiver {
- public:
-  MessageAccumulator() {}
-  explicit MessageAccumulator(const base::Closure& closure)
-      : closure_(closure) {}
-
-  bool Accept(Message* message) override {
-    queue_.Push(message);
-    if (!closure_.is_null())
-      base::ResetAndReturn(&closure_).Run();
-    return true;
-  }
-
-  bool IsEmpty() const { return queue_.IsEmpty(); }
-
-  void Pop(Message* message) { queue_.Pop(message); }
-
-  void set_closure(const base::Closure& closure) { closure_ = closure; }
-
-  size_t size() const { return queue_.size(); }
-
- private:
-  MessageQueue queue_;
-  base::Closure closure_;
-};
-
-class ConnectorDeletingMessageAccumulator : public MessageAccumulator {
- public:
-  ConnectorDeletingMessageAccumulator(Connector** connector)
-      : connector_(connector) {}
-
-  bool Accept(Message* message) override {
-    delete *connector_;
-    *connector_ = nullptr;
-    return MessageAccumulator::Accept(message);
-  }
-
- private:
-  Connector** connector_;
-};
-
-class ReentrantMessageAccumulator : public MessageAccumulator {
- public:
-  ReentrantMessageAccumulator(Connector* connector)
-      : connector_(connector), number_of_calls_(0) {}
-
-  bool Accept(Message* message) override {
-    if (!MessageAccumulator::Accept(message))
-      return false;
-    number_of_calls_++;
-    if (number_of_calls_ == 1) {
-      return connector_->WaitForIncomingMessage(MOJO_DEADLINE_INDEFINITE);
-    }
-    return true;
-  }
-
-  int number_of_calls() { return number_of_calls_; }
-
- private:
-  Connector* connector_;
-  int number_of_calls_;
-};
-
-class ConnectorTest : public testing::Test {
- public:
-  ConnectorTest() {}
-
-  void SetUp() override {
-    CreateMessagePipe(nullptr, &handle0_, &handle1_);
-  }
-
-  void TearDown() override {}
-
-  void AllocMessage(const char* text, Message* message) {
-    size_t payload_size = strlen(text) + 1;  // Plus null terminator.
-    internal::MessageBuilder builder(1, 0, payload_size, 0);
-    memcpy(builder.buffer()->Allocate(payload_size), text, payload_size);
-
-    *message = std::move(*builder.message());
-  }
-
- protected:
-  ScopedMessagePipeHandle handle0_;
-  ScopedMessagePipeHandle handle1_;
-
- private:
-  base::MessageLoop loop_;
-};
-
-TEST_F(ConnectorTest, Basic) {
-  Connector connector0(std::move(handle0_), Connector::SINGLE_THREADED_SEND,
-                       base::ThreadTaskRunnerHandle::Get());
-  Connector connector1(std::move(handle1_), Connector::SINGLE_THREADED_SEND,
-                       base::ThreadTaskRunnerHandle::Get());
-
-  const char kText[] = "hello world";
-
-  Message message;
-  AllocMessage(kText, &message);
-
-  connector0.Accept(&message);
-
-  base::RunLoop run_loop;
-  MessageAccumulator accumulator(run_loop.QuitClosure());
-  connector1.set_incoming_receiver(&accumulator);
-
-  run_loop.Run();
-
-  ASSERT_FALSE(accumulator.IsEmpty());
-
-  Message message_received;
-  accumulator.Pop(&message_received);
-
-  EXPECT_EQ(
-      std::string(kText),
-      std::string(reinterpret_cast<const char*>(message_received.payload())));
-}
-
-TEST_F(ConnectorTest, Basic_Synchronous) {
-  Connector connector0(std::move(handle0_), Connector::SINGLE_THREADED_SEND,
-                       base::ThreadTaskRunnerHandle::Get());
-  Connector connector1(std::move(handle1_), Connector::SINGLE_THREADED_SEND,
-                       base::ThreadTaskRunnerHandle::Get());
-
-  const char kText[] = "hello world";
-
-  Message message;
-  AllocMessage(kText, &message);
-
-  connector0.Accept(&message);
-
-  MessageAccumulator accumulator;
-  connector1.set_incoming_receiver(&accumulator);
-
-  connector1.WaitForIncomingMessage(MOJO_DEADLINE_INDEFINITE);
-
-  ASSERT_FALSE(accumulator.IsEmpty());
-
-  Message message_received;
-  accumulator.Pop(&message_received);
-
-  EXPECT_EQ(
-      std::string(kText),
-      std::string(reinterpret_cast<const char*>(message_received.payload())));
-}
-
-TEST_F(ConnectorTest, Basic_EarlyIncomingReceiver) {
-  Connector connector0(std::move(handle0_), Connector::SINGLE_THREADED_SEND,
-                       base::ThreadTaskRunnerHandle::Get());
-  Connector connector1(std::move(handle1_), Connector::SINGLE_THREADED_SEND,
-                       base::ThreadTaskRunnerHandle::Get());
-
-  base::RunLoop run_loop;
-  MessageAccumulator accumulator(run_loop.QuitClosure());
-  connector1.set_incoming_receiver(&accumulator);
-
-  const char kText[] = "hello world";
-
-  Message message;
-  AllocMessage(kText, &message);
-
-  connector0.Accept(&message);
-
-  run_loop.Run();
-
-  ASSERT_FALSE(accumulator.IsEmpty());
-
-  Message message_received;
-  accumulator.Pop(&message_received);
-
-  EXPECT_EQ(
-      std::string(kText),
-      std::string(reinterpret_cast<const char*>(message_received.payload())));
-}
-
-TEST_F(ConnectorTest, Basic_TwoMessages) {
-  Connector connector0(std::move(handle0_), Connector::SINGLE_THREADED_SEND,
-                       base::ThreadTaskRunnerHandle::Get());
-  Connector connector1(std::move(handle1_), Connector::SINGLE_THREADED_SEND,
-                       base::ThreadTaskRunnerHandle::Get());
-
-  const char* kText[] = {"hello", "world"};
-
-  for (size_t i = 0; i < arraysize(kText); ++i) {
-    Message message;
-    AllocMessage(kText[i], &message);
-
-    connector0.Accept(&message);
-  }
-
-  MessageAccumulator accumulator;
-  connector1.set_incoming_receiver(&accumulator);
-
-  for (size_t i = 0; i < arraysize(kText); ++i) {
-    if (accumulator.IsEmpty()) {
-      base::RunLoop run_loop;
-      accumulator.set_closure(run_loop.QuitClosure());
-      run_loop.Run();
-    }
-    ASSERT_FALSE(accumulator.IsEmpty());
-
-    Message message_received;
-    accumulator.Pop(&message_received);
-
-    EXPECT_EQ(
-        std::string(kText[i]),
-        std::string(reinterpret_cast<const char*>(message_received.payload())));
-  }
-}
-
-TEST_F(ConnectorTest, Basic_TwoMessages_Synchronous) {
-  Connector connector0(std::move(handle0_), Connector::SINGLE_THREADED_SEND,
-                       base::ThreadTaskRunnerHandle::Get());
-  Connector connector1(std::move(handle1_), Connector::SINGLE_THREADED_SEND,
-                       base::ThreadTaskRunnerHandle::Get());
-
-  const char* kText[] = {"hello", "world"};
-
-  for (size_t i = 0; i < arraysize(kText); ++i) {
-    Message message;
-    AllocMessage(kText[i], &message);
-
-    connector0.Accept(&message);
-  }
-
-  MessageAccumulator accumulator;
-  connector1.set_incoming_receiver(&accumulator);
-
-  connector1.WaitForIncomingMessage(MOJO_DEADLINE_INDEFINITE);
-
-  ASSERT_FALSE(accumulator.IsEmpty());
-
-  Message message_received;
-  accumulator.Pop(&message_received);
-
-  EXPECT_EQ(
-      std::string(kText[0]),
-      std::string(reinterpret_cast<const char*>(message_received.payload())));
-
-  ASSERT_TRUE(accumulator.IsEmpty());
-}
-
-TEST_F(ConnectorTest, WriteToClosedPipe) {
-  Connector connector0(std::move(handle0_), Connector::SINGLE_THREADED_SEND,
-                       base::ThreadTaskRunnerHandle::Get());
-
-  const char kText[] = "hello world";
-
-  Message message;
-  AllocMessage(kText, &message);
-
-  // Close the other end of the pipe.
-  handle1_.reset();
-
-  // Not observed yet because we haven't spun the message loop yet.
-  EXPECT_FALSE(connector0.encountered_error());
-
-  // Write failures are not reported.
-  bool ok = connector0.Accept(&message);
-  EXPECT_TRUE(ok);
-
-  // Still not observed.
-  EXPECT_FALSE(connector0.encountered_error());
-
-  // Spin the message loop, and then we should start observing the closed pipe.
-  base::RunLoop run_loop;
-  connector0.set_connection_error_handler(run_loop.QuitClosure());
-  run_loop.Run();
-
-  EXPECT_TRUE(connector0.encountered_error());
-}
-
-TEST_F(ConnectorTest, MessageWithHandles) {
-  Connector connector0(std::move(handle0_), Connector::SINGLE_THREADED_SEND,
-                       base::ThreadTaskRunnerHandle::Get());
-  Connector connector1(std::move(handle1_), Connector::SINGLE_THREADED_SEND,
-                       base::ThreadTaskRunnerHandle::Get());
-
-  const char kText[] = "hello world";
-
-  Message message1;
-  AllocMessage(kText, &message1);
-
-  MessagePipe pipe;
-  message1.mutable_handles()->push_back(pipe.handle0.release());
-
-  connector0.Accept(&message1);
-
-  // The message should have been transferred, releasing the handles.
-  EXPECT_TRUE(message1.handles()->empty());
-
-  base::RunLoop run_loop;
-  MessageAccumulator accumulator(run_loop.QuitClosure());
-  connector1.set_incoming_receiver(&accumulator);
-
-  run_loop.Run();
-
-  ASSERT_FALSE(accumulator.IsEmpty());
-
-  Message message_received;
-  accumulator.Pop(&message_received);
-
-  EXPECT_EQ(
-      std::string(kText),
-      std::string(reinterpret_cast<const char*>(message_received.payload())));
-  ASSERT_EQ(1U, message_received.handles()->size());
-
-  // Now send a message to the transferred handle and confirm it's sent through
-  // to the orginal pipe.
-  // TODO(vtl): Do we need a better way of "downcasting" the handle types?
-  ScopedMessagePipeHandle smph;
-  smph.reset(MessagePipeHandle(message_received.handles()->front().value()));
-  message_received.mutable_handles()->front() = Handle();
-  // |smph| now owns this handle.
-
-  Connector connector_received(std::move(smph), Connector::SINGLE_THREADED_SEND,
-                               base::ThreadTaskRunnerHandle::Get());
-  Connector connector_original(std::move(pipe.handle1),
-                               Connector::SINGLE_THREADED_SEND,
-                               base::ThreadTaskRunnerHandle::Get());
-
-  Message message2;
-  AllocMessage(kText, &message2);
-
-  connector_received.Accept(&message2);
-  base::RunLoop run_loop2;
-  MessageAccumulator accumulator2(run_loop2.QuitClosure());
-  connector_original.set_incoming_receiver(&accumulator2);
-  run_loop2.Run();
-
-  ASSERT_FALSE(accumulator2.IsEmpty());
-
-  accumulator2.Pop(&message_received);
-
-  EXPECT_EQ(
-      std::string(kText),
-      std::string(reinterpret_cast<const char*>(message_received.payload())));
-}
-
-TEST_F(ConnectorTest, WaitForIncomingMessageWithError) {
-  Connector connector0(std::move(handle0_), Connector::SINGLE_THREADED_SEND,
-                       base::ThreadTaskRunnerHandle::Get());
-  // Close the other end of the pipe.
-  handle1_.reset();
-  ASSERT_FALSE(connector0.WaitForIncomingMessage(MOJO_DEADLINE_INDEFINITE));
-}
-
-TEST_F(ConnectorTest, WaitForIncomingMessageWithDeletion) {
-  Connector connector0(std::move(handle0_), Connector::SINGLE_THREADED_SEND,
-                       base::ThreadTaskRunnerHandle::Get());
-  Connector* connector1 =
-      new Connector(std::move(handle1_), Connector::SINGLE_THREADED_SEND,
-                    base::ThreadTaskRunnerHandle::Get());
-
-  const char kText[] = "hello world";
-
-  Message message;
-  AllocMessage(kText, &message);
-
-  connector0.Accept(&message);
-
-  ConnectorDeletingMessageAccumulator accumulator(&connector1);
-  connector1->set_incoming_receiver(&accumulator);
-
-  connector1->WaitForIncomingMessage(MOJO_DEADLINE_INDEFINITE);
-
-  ASSERT_FALSE(connector1);
-  ASSERT_FALSE(accumulator.IsEmpty());
-
-  Message message_received;
-  accumulator.Pop(&message_received);
-
-  EXPECT_EQ(
-      std::string(kText),
-      std::string(reinterpret_cast<const char*>(message_received.payload())));
-}
-
-TEST_F(ConnectorTest, WaitForIncomingMessageWithReentrancy) {
-  Connector connector0(std::move(handle0_), Connector::SINGLE_THREADED_SEND,
-                       base::ThreadTaskRunnerHandle::Get());
-  Connector connector1(std::move(handle1_), Connector::SINGLE_THREADED_SEND,
-                       base::ThreadTaskRunnerHandle::Get());
-
-  const char* kText[] = {"hello", "world"};
-
-  for (size_t i = 0; i < arraysize(kText); ++i) {
-    Message message;
-    AllocMessage(kText[i], &message);
-
-    connector0.Accept(&message);
-  }
-
-  ReentrantMessageAccumulator accumulator(&connector1);
-  connector1.set_incoming_receiver(&accumulator);
-
-  for (size_t i = 0; i < arraysize(kText); ++i) {
-    if (accumulator.IsEmpty()) {
-      base::RunLoop run_loop;
-      accumulator.set_closure(run_loop.QuitClosure());
-      run_loop.Run();
-    }
-    ASSERT_FALSE(accumulator.IsEmpty());
-
-    Message message_received;
-    accumulator.Pop(&message_received);
-
-    EXPECT_EQ(
-        std::string(kText[i]),
-        std::string(reinterpret_cast<const char*>(message_received.payload())));
-  }
-
-  ASSERT_EQ(2, accumulator.number_of_calls());
-}
-
-void ForwardErrorHandler(bool* called, const base::Closure& callback) {
-  *called = true;
-  callback.Run();
-}
-
-TEST_F(ConnectorTest, RaiseError) {
-  base::RunLoop run_loop, run_loop2;
-  Connector connector0(std::move(handle0_), Connector::SINGLE_THREADED_SEND,
-                       base::ThreadTaskRunnerHandle::Get());
-  bool error_handler_called0 = false;
-  connector0.set_connection_error_handler(
-      base::Bind(&ForwardErrorHandler, &error_handler_called0,
-                 run_loop.QuitClosure()));
-
-  Connector connector1(std::move(handle1_), Connector::SINGLE_THREADED_SEND,
-                       base::ThreadTaskRunnerHandle::Get());
-  bool error_handler_called1 = false;
-  connector1.set_connection_error_handler(
-      base::Bind(&ForwardErrorHandler, &error_handler_called1,
-                 run_loop2.QuitClosure()));
-
-  const char kText[] = "hello world";
-
-  Message message;
-  AllocMessage(kText, &message);
-
-  connector0.Accept(&message);
-  connector0.RaiseError();
-
-  base::RunLoop run_loop3;
-  MessageAccumulator accumulator(run_loop3.QuitClosure());
-  connector1.set_incoming_receiver(&accumulator);
-
-  run_loop3.Run();
-
-  // Messages sent prior to RaiseError() still arrive at the other end.
-  ASSERT_FALSE(accumulator.IsEmpty());
-
-  Message message_received;
-  accumulator.Pop(&message_received);
-
-  EXPECT_EQ(
-      std::string(kText),
-      std::string(reinterpret_cast<const char*>(message_received.payload())));
-
-  run_loop.Run();
-  run_loop2.Run();
-
-  // Connection error handler is called at both sides.
-  EXPECT_TRUE(error_handler_called0);
-  EXPECT_TRUE(error_handler_called1);
-
-  // The error flag is set at both sides.
-  EXPECT_TRUE(connector0.encountered_error());
-  EXPECT_TRUE(connector1.encountered_error());
-
-  // The message pipe handle is valid at both sides.
-  EXPECT_TRUE(connector0.is_valid());
-  EXPECT_TRUE(connector1.is_valid());
-}
-
-void PauseConnectorAndRunClosure(Connector* connector,
-                                 const base::Closure& closure) {
-  connector->PauseIncomingMethodCallProcessing();
-  closure.Run();
-}
-
-TEST_F(ConnectorTest, PauseWithQueuedMessages) {
-  Connector connector0(std::move(handle0_), Connector::SINGLE_THREADED_SEND,
-                       base::ThreadTaskRunnerHandle::Get());
-  Connector connector1(std::move(handle1_), Connector::SINGLE_THREADED_SEND,
-                       base::ThreadTaskRunnerHandle::Get());
-
-  const char kText[] = "hello world";
-
-  // Queue up two messages.
-  Message message;
-  AllocMessage(kText, &message);
-  connector0.Accept(&message);
-  AllocMessage(kText, &message);
-  connector0.Accept(&message);
-
-  base::RunLoop run_loop;
-  // Configure the accumulator such that it pauses after the first message is
-  // received.
-  MessageAccumulator accumulator(
-      base::Bind(&PauseConnectorAndRunClosure, &connector1,
-                 run_loop.QuitClosure()));
-  connector1.set_incoming_receiver(&accumulator);
-
-  run_loop.Run();
-
-  // As we paused after the first message we should only have gotten one
-  // message.
-  ASSERT_EQ(1u, accumulator.size());
-}
-
-void AccumulateWithNestedLoop(MessageAccumulator* accumulator,
-                              const base::Closure& closure) {
-  base::RunLoop nested_run_loop;
-  base::MessageLoop::ScopedNestableTaskAllower allow(
-      base::MessageLoop::current());
-  accumulator->set_closure(nested_run_loop.QuitClosure());
-  nested_run_loop.Run();
-  closure.Run();
-}
-
-TEST_F(ConnectorTest, ProcessWhenNested) {
-  Connector connector0(std::move(handle0_), Connector::SINGLE_THREADED_SEND,
-                       base::ThreadTaskRunnerHandle::Get());
-  Connector connector1(std::move(handle1_), Connector::SINGLE_THREADED_SEND,
-                       base::ThreadTaskRunnerHandle::Get());
-
-  const char kText[] = "hello world";
-
-  // Queue up two messages.
-  Message message;
-  AllocMessage(kText, &message);
-  connector0.Accept(&message);
-  AllocMessage(kText, &message);
-  connector0.Accept(&message);
-
-  base::RunLoop run_loop;
-  MessageAccumulator accumulator;
-  // When the accumulator gets the first message it spins a nested message
-  // loop. The loop is quit when another message is received.
-  accumulator.set_closure(base::Bind(&AccumulateWithNestedLoop, &accumulator,
-                                     run_loop.QuitClosure()));
-  connector1.set_incoming_receiver(&accumulator);
-
-  run_loop.Run();
-
-  ASSERT_EQ(2u, accumulator.size());
-}
-
-TEST_F(ConnectorTest, DestroyOnDifferentThreadAfterClose) {
-  std::unique_ptr<Connector> connector(
-      new Connector(std::move(handle0_), Connector::SINGLE_THREADED_SEND,
-                    base::ThreadTaskRunnerHandle::Get()));
-
-  connector->CloseMessagePipe();
-
-  base::Thread another_thread("ThreadForDestroyingConnector");
-  another_thread.Start();
-
-  base::RunLoop run_loop;
-  another_thread.task_runner()->PostTaskAndReply(
-      FROM_HERE,
-      base::Bind(
-          [](std::unique_ptr<Connector> connector) { connector.reset(); },
-          base::Passed(std::move(connector))),
-      run_loop.QuitClosure());
-
-  run_loop.Run();
-}
-
-}  // namespace
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/constant_unittest.cc b/mojo/public/cpp/bindings/tests/constant_unittest.cc
deleted file mode 100644
index caa6464..0000000
--- a/mojo/public/cpp/bindings/tests/constant_unittest.cc
+++ /dev/null
@@ -1,60 +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 <cmath>
-
-#include "base/strings/string_piece.h"
-#include "mojo/public/interfaces/bindings/tests/test_constants.mojom.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace test {
-
-TEST(ConstantTest, GlobalConstants) {
-  // Compile-time constants.
-  static_assert(kBoolValue == true, "");
-  static_assert(kInt8Value == -2, "");
-  static_assert(kUint8Value == 128U, "");
-  static_assert(kInt16Value == -233, "");
-  static_assert(kUint16Value == 44204U, "");
-  static_assert(kInt32Value == -44204, "");
-  static_assert(kUint32Value == 4294967295U, "");
-  static_assert(kInt64Value == -9223372036854775807, "");
-  static_assert(kUint64Value == 9999999999999999999ULL, "");
-  static_assert(kDoubleValue == 3.14159, "");
-  static_assert(kFloatValue == 2.71828f, "");
-
-  EXPECT_EQ(base::StringPiece(kStringValue), "test string contents");
-  EXPECT_TRUE(std::isnan(kDoubleNaN));
-  EXPECT_TRUE(std::isinf(kDoubleInfinity));
-  EXPECT_TRUE(std::isinf(kDoubleNegativeInfinity));
-  EXPECT_NE(kDoubleInfinity, kDoubleNegativeInfinity);
-  EXPECT_TRUE(std::isnan(kFloatNaN));
-  EXPECT_TRUE(std::isinf(kFloatInfinity));
-  EXPECT_TRUE(std::isinf(kFloatNegativeInfinity));
-  EXPECT_NE(kFloatInfinity, kFloatNegativeInfinity);
-}
-
-TEST(ConstantTest, StructConstants) {
-  // Compile-time constants.
-  static_assert(StructWithConstants::kInt8Value == 5U, "");
-  static_assert(StructWithConstants::kFloatValue == 765.432f, "");
-
-  EXPECT_EQ(base::StringPiece(StructWithConstants::kStringValue),
-            "struct test string contents");
-}
-
-TEST(ConstantTest, InterfaceConstants) {
-  // Compile-time constants.
-  static_assert(InterfaceWithConstants::kUint32Value == 20100722, "");
-  static_assert(InterfaceWithConstants::kDoubleValue == 12.34567, "");
-
-  EXPECT_EQ(base::StringPiece(InterfaceWithConstants::kStringValue),
-            "interface test string contents");
-  EXPECT_EQ(base::StringPiece(InterfaceWithConstants::Name_),
-            "mojo::test::InterfaceWithConstants");
-}
-
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/container_test_util.cc b/mojo/public/cpp/bindings/tests/container_test_util.cc
deleted file mode 100644
index a53d351..0000000
--- a/mojo/public/cpp/bindings/tests/container_test_util.cc
+++ /dev/null
@@ -1,52 +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 <stddef.h>
-
-#include "mojo/public/cpp/bindings/tests/container_test_util.h"
-
-namespace mojo {
-
-size_t CopyableType::num_instances_ = 0;
-size_t MoveOnlyType::num_instances_ = 0;
-
-CopyableType::CopyableType() : copied_(false), ptr_(this) {
-  num_instances_++;
-}
-
-CopyableType::CopyableType(const CopyableType& other)
-    : copied_(true), ptr_(other.ptr()) {
-  num_instances_++;
-}
-
-CopyableType& CopyableType::operator=(const CopyableType& other) {
-  copied_ = true;
-  ptr_ = other.ptr();
-  return *this;
-}
-
-CopyableType::~CopyableType() {
-  num_instances_--;
-}
-
-MoveOnlyType::MoveOnlyType() : moved_(false), ptr_(this) {
-  num_instances_++;
-}
-
-MoveOnlyType::MoveOnlyType(MoveOnlyType&& other)
-    : moved_(true), ptr_(other.ptr()) {
-  num_instances_++;
-}
-
-MoveOnlyType& MoveOnlyType::operator=(MoveOnlyType&& other) {
-  moved_ = true;
-  ptr_ = other.ptr();
-  return *this;
-}
-
-MoveOnlyType::~MoveOnlyType() {
-  num_instances_--;
-}
-
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/container_test_util.h b/mojo/public/cpp/bindings/tests/container_test_util.h
deleted file mode 100644
index f709c15..0000000
--- a/mojo/public/cpp/bindings/tests/container_test_util.h
+++ /dev/null
@@ -1,55 +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 MOJO_PUBLIC_CPP_BINDINGS_TESTS_CONTAINER_TEST_UTIL_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_TESTS_CONTAINER_TEST_UTIL_H_
-
-#include <stddef.h>
-
-#include "base/macros.h"
-
-namespace mojo {
-
-class CopyableType {
- public:
-  CopyableType();
-  CopyableType(const CopyableType& other);
-  CopyableType& operator=(const CopyableType& other);
-  ~CopyableType();
-
-  bool copied() const { return copied_; }
-  static size_t num_instances() { return num_instances_; }
-  CopyableType* ptr() const { return ptr_; }
-  void ResetCopied() { copied_ = false; }
-
- private:
-  bool copied_;
-  static size_t num_instances_;
-  CopyableType* ptr_;
-};
-
-class MoveOnlyType {
- public:
-  typedef MoveOnlyType Data_;
-  MoveOnlyType();
-  MoveOnlyType(MoveOnlyType&& other);
-  MoveOnlyType& operator=(MoveOnlyType&& other);
-  ~MoveOnlyType();
-
-  bool moved() const { return moved_; }
-  static size_t num_instances() { return num_instances_; }
-  MoveOnlyType* ptr() const { return ptr_; }
-  void ResetMoved() { moved_ = false; }
-
- private:
-  bool moved_;
-  static size_t num_instances_;
-  MoveOnlyType* ptr_;
-
-  DISALLOW_COPY_AND_ASSIGN(MoveOnlyType);
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_TESTS_CONTAINER_TEST_UTIL_H_
diff --git a/mojo/public/cpp/bindings/tests/data_view_unittest.cc b/mojo/public/cpp/bindings/tests/data_view_unittest.cc
deleted file mode 100644
index 0ebfda5..0000000
--- a/mojo/public/cpp/bindings/tests/data_view_unittest.cc
+++ /dev/null
@@ -1,303 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <memory>
-#include <string>
-#include <unordered_map>
-#include <vector>
-
-#include "base/message_loop/message_loop.h"
-#include "mojo/public/cpp/bindings/binding.h"
-#include "mojo/public/cpp/bindings/lib/fixed_buffer.h"
-#include "mojo/public/cpp/bindings/lib/serialization.h"
-#include "mojo/public/interfaces/bindings/tests/test_data_view.mojom.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace test {
-namespace data_view {
-namespace {
-
-class DataViewTest : public testing::Test {
- private:
-  base::MessageLoop message_loop_;
-};
-
-struct DataViewHolder {
-  std::unique_ptr<TestStructDataView> data_view;
-  std::unique_ptr<mojo::internal::FixedBufferForTesting> buf;
-  mojo::internal::SerializationContext context;
-};
-
-std::unique_ptr<DataViewHolder> SerializeTestStruct(TestStructPtr input) {
-  std::unique_ptr<DataViewHolder> result(new DataViewHolder);
-
-  size_t size = mojo::internal::PrepareToSerialize<TestStructDataView>(
-      input, &result->context);
-
-  result->buf.reset(new mojo::internal::FixedBufferForTesting(size));
-  internal::TestStruct_Data* data = nullptr;
-  mojo::internal::Serialize<TestStructDataView>(input, result->buf.get(), &data,
-                                                &result->context);
-
-  result->data_view.reset(new TestStructDataView(data, &result->context));
-  return result;
-}
-
-class TestInterfaceImpl : public TestInterface {
- public:
-  explicit TestInterfaceImpl(TestInterfaceRequest request)
-      : binding_(this, std::move(request)) {}
-  ~TestInterfaceImpl() override {}
-
-  // TestInterface implementation:
-  void Echo(int32_t value, const EchoCallback& callback) override {
-    callback.Run(value);
-  }
-
- private:
-  Binding<TestInterface> binding_;
-};
-
-}  // namespace
-
-TEST_F(DataViewTest, String) {
-  TestStructPtr obj(TestStruct::New());
-  obj->f_string = "hello";
-
-  auto data_view_holder = SerializeTestStruct(std::move(obj));
-  auto& data_view = *data_view_holder->data_view;
-
-  StringDataView string_data_view;
-  data_view.GetFStringDataView(&string_data_view);
-
-  ASSERT_FALSE(string_data_view.is_null());
-  EXPECT_EQ(std::string("hello"),
-            std::string(string_data_view.storage(), string_data_view.size()));
-}
-
-TEST_F(DataViewTest, NestedStruct) {
-  TestStructPtr obj(TestStruct::New());
-  obj->f_struct = NestedStruct::New();
-  obj->f_struct->f_int32 = 42;
-
-  auto data_view_holder = SerializeTestStruct(std::move(obj));
-  auto& data_view = *data_view_holder->data_view;
-
-  NestedStructDataView struct_data_view;
-  data_view.GetFStructDataView(&struct_data_view);
-
-  ASSERT_FALSE(struct_data_view.is_null());
-  EXPECT_EQ(42, struct_data_view.f_int32());
-}
-
-TEST_F(DataViewTest, NativeStruct) {
-  TestStructPtr obj(TestStruct::New());
-  obj->f_native_struct = NativeStruct::New();
-  obj->f_native_struct->data = std::vector<uint8_t>({3, 2, 1});
-
-  auto data_view_holder = SerializeTestStruct(std::move(obj));
-  auto& data_view = *data_view_holder->data_view;
-
-  NativeStructDataView struct_data_view;
-  data_view.GetFNativeStructDataView(&struct_data_view);
-
-  ASSERT_FALSE(struct_data_view.is_null());
-  ASSERT_EQ(3u, struct_data_view.size());
-  EXPECT_EQ(3, struct_data_view[0]);
-  EXPECT_EQ(2, struct_data_view[1]);
-  EXPECT_EQ(1, struct_data_view[2]);
-  EXPECT_EQ(3, *struct_data_view.data());
-}
-
-TEST_F(DataViewTest, BoolArray) {
-  TestStructPtr obj(TestStruct::New());
-  obj->f_bool_array = {true, false};
-
-  auto data_view_holder = SerializeTestStruct(std::move(obj));
-  auto& data_view = *data_view_holder->data_view;
-
-  ArrayDataView<bool> array_data_view;
-  data_view.GetFBoolArrayDataView(&array_data_view);
-
-  ASSERT_FALSE(array_data_view.is_null());
-  ASSERT_EQ(2u, array_data_view.size());
-  EXPECT_TRUE(array_data_view[0]);
-  EXPECT_FALSE(array_data_view[1]);
-}
-
-TEST_F(DataViewTest, IntegerArray) {
-  TestStructPtr obj(TestStruct::New());
-  obj->f_int32_array = {1024, 128};
-
-  auto data_view_holder = SerializeTestStruct(std::move(obj));
-  auto& data_view = *data_view_holder->data_view;
-
-  ArrayDataView<int32_t> array_data_view;
-  data_view.GetFInt32ArrayDataView(&array_data_view);
-
-  ASSERT_FALSE(array_data_view.is_null());
-  ASSERT_EQ(2u, array_data_view.size());
-  EXPECT_EQ(1024, array_data_view[0]);
-  EXPECT_EQ(128, array_data_view[1]);
-  EXPECT_EQ(1024, *array_data_view.data());
-}
-
-TEST_F(DataViewTest, EnumArray) {
-  TestStructPtr obj(TestStruct::New());
-  obj->f_enum_array = {TestEnum::VALUE_1, TestEnum::VALUE_0};
-
-  auto data_view_holder = SerializeTestStruct(std::move(obj));
-  auto& data_view = *data_view_holder->data_view;
-
-  ArrayDataView<TestEnum> array_data_view;
-  data_view.GetFEnumArrayDataView(&array_data_view);
-
-  ASSERT_FALSE(array_data_view.is_null());
-  ASSERT_EQ(2u, array_data_view.size());
-  EXPECT_EQ(TestEnum::VALUE_1, array_data_view[0]);
-  EXPECT_EQ(TestEnum::VALUE_0, array_data_view[1]);
-  EXPECT_EQ(TestEnum::VALUE_0, *(array_data_view.data() + 1));
-
-  TestEnum output;
-  ASSERT_TRUE(array_data_view.Read(0, &output));
-  EXPECT_EQ(TestEnum::VALUE_1, output);
-}
-
-TEST_F(DataViewTest, InterfaceArray) {
-  TestInterfacePtr ptr;
-  TestInterfaceImpl impl(MakeRequest(&ptr));
-
-  TestStructPtr obj(TestStruct::New());
-  obj->f_interface_array.push_back(std::move(ptr));
-
-  auto data_view_holder = SerializeTestStruct(std::move(obj));
-  auto& data_view = *data_view_holder->data_view;
-
-  ArrayDataView<TestInterfacePtrDataView> array_data_view;
-  data_view.GetFInterfaceArrayDataView(&array_data_view);
-
-  ASSERT_FALSE(array_data_view.is_null());
-  ASSERT_EQ(1u, array_data_view.size());
-
-  TestInterfacePtr ptr2 = array_data_view.Take<TestInterfacePtr>(0);
-  ASSERT_TRUE(ptr2);
-  int32_t result = 0;
-  ASSERT_TRUE(ptr2->Echo(42, &result));
-  EXPECT_EQ(42, result);
-}
-
-TEST_F(DataViewTest, NestedArray) {
-  TestStructPtr obj(TestStruct::New());
-  obj->f_nested_array = {{3, 4}, {2}};
-
-  auto data_view_holder = SerializeTestStruct(std::move(obj));
-  auto& data_view = *data_view_holder->data_view;
-
-  ArrayDataView<ArrayDataView<int32_t>> array_data_view;
-  data_view.GetFNestedArrayDataView(&array_data_view);
-
-  ASSERT_FALSE(array_data_view.is_null());
-  ASSERT_EQ(2u, array_data_view.size());
-
-  ArrayDataView<int32_t> nested_array_data_view;
-  array_data_view.GetDataView(0, &nested_array_data_view);
-  ASSERT_FALSE(nested_array_data_view.is_null());
-  ASSERT_EQ(2u, nested_array_data_view.size());
-  EXPECT_EQ(4, nested_array_data_view[1]);
-
-  std::vector<int32_t> vec;
-  ASSERT_TRUE(array_data_view.Read(1, &vec));
-  ASSERT_EQ(1u, vec.size());
-  EXPECT_EQ(2, vec[0]);
-}
-
-TEST_F(DataViewTest, StructArray) {
-  NestedStructPtr nested_struct(NestedStruct::New());
-  nested_struct->f_int32 = 42;
-
-  TestStructPtr obj(TestStruct::New());
-  obj->f_struct_array.push_back(std::move(nested_struct));
-
-  auto data_view_holder = SerializeTestStruct(std::move(obj));
-  auto& data_view = *data_view_holder->data_view;
-
-  ArrayDataView<NestedStructDataView> array_data_view;
-  data_view.GetFStructArrayDataView(&array_data_view);
-
-  ASSERT_FALSE(array_data_view.is_null());
-  ASSERT_EQ(1u, array_data_view.size());
-
-  NestedStructDataView struct_data_view;
-  array_data_view.GetDataView(0, &struct_data_view);
-  ASSERT_FALSE(struct_data_view.is_null());
-  EXPECT_EQ(42, struct_data_view.f_int32());
-
-  NestedStructPtr nested_struct2;
-  ASSERT_TRUE(array_data_view.Read(0, &nested_struct2));
-  ASSERT_TRUE(nested_struct2);
-  EXPECT_EQ(42, nested_struct2->f_int32);
-}
-
-TEST_F(DataViewTest, Map) {
-  TestStructPtr obj(TestStruct::New());
-  obj->f_map["1"] = 1;
-  obj->f_map["2"] = 2;
-
-  auto data_view_holder = SerializeTestStruct(std::move(obj));
-  auto& data_view = *data_view_holder->data_view;
-
-  MapDataView<StringDataView, int32_t> map_data_view;
-  data_view.GetFMapDataView(&map_data_view);
-
-  ASSERT_FALSE(map_data_view.is_null());
-  ASSERT_EQ(2u, map_data_view.size());
-
-  ASSERT_FALSE(map_data_view.keys().is_null());
-  ASSERT_EQ(2u, map_data_view.keys().size());
-
-  ASSERT_FALSE(map_data_view.values().is_null());
-  ASSERT_EQ(2u, map_data_view.values().size());
-
-  std::vector<std::string> keys;
-  ASSERT_TRUE(map_data_view.ReadKeys(&keys));
-  std::vector<int32_t> values;
-  ASSERT_TRUE(map_data_view.ReadValues(&values));
-
-  std::unordered_map<std::string, int32_t> map;
-  for (size_t i = 0; i < 2; ++i)
-    map[keys[i]] = values[i];
-
-  EXPECT_EQ(1, map["1"]);
-  EXPECT_EQ(2, map["2"]);
-}
-
-TEST_F(DataViewTest, UnionArray) {
-  TestUnionPtr union_ptr(TestUnion::New());
-  union_ptr->set_f_int32(1024);
-
-  TestStructPtr obj(TestStruct::New());
-  obj->f_union_array.push_back(std::move(union_ptr));
-
-  auto data_view_holder = SerializeTestStruct(std::move(obj));
-  auto& data_view = *data_view_holder->data_view;
-
-  ArrayDataView<TestUnionDataView> array_data_view;
-  data_view.GetFUnionArrayDataView(&array_data_view);
-  ASSERT_FALSE(array_data_view.is_null());
-  ASSERT_EQ(1u, array_data_view.size());
-
-  TestUnionDataView union_data_view;
-  array_data_view.GetDataView(0, &union_data_view);
-  ASSERT_FALSE(union_data_view.is_null());
-
-  TestUnionPtr union_ptr2;
-  ASSERT_TRUE(array_data_view.Read(0, &union_ptr2));
-  ASSERT_TRUE(union_ptr2->is_f_int32());
-  EXPECT_EQ(1024, union_ptr2->get_f_int32());
-}
-
-}  // namespace data_view
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/e2e_perftest.cc b/mojo/public/cpp/bindings/tests/e2e_perftest.cc
deleted file mode 100644
index bc69e0f..0000000
--- a/mojo/public/cpp/bindings/tests/e2e_perftest.cc
+++ /dev/null
@@ -1,204 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <string>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/memory/ptr_util.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "base/strings/stringprintf.h"
-#include "base/test/perf_time_logger.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/test/mojo_test_base.h"
-#include "mojo/public/cpp/bindings/strong_binding.h"
-#include "mojo/public/interfaces/bindings/tests/ping_service.mojom.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace {
-
-class EchoServiceImpl : public test::EchoService {
- public:
-  explicit EchoServiceImpl(const base::Closure& quit_closure);
-  ~EchoServiceImpl() override;
-
-  // |EchoService| methods:
-  void Echo(const std::string& test_data,
-            const EchoCallback& callback) override;
-
- private:
-  const base::Closure quit_closure_;
-};
-
-EchoServiceImpl::EchoServiceImpl(const base::Closure& quit_closure)
-    : quit_closure_(quit_closure) {}
-
-EchoServiceImpl::~EchoServiceImpl() {
-  quit_closure_.Run();
-}
-
-void EchoServiceImpl::Echo(const std::string& test_data,
-                           const EchoCallback& callback) {
-  callback.Run(test_data);
-}
-
-class PingPongTest {
- public:
-  explicit PingPongTest(test::EchoServicePtr service);
-
-  void RunTest(int iterations, int batch_size, int message_size);
-
- private:
-  void DoPing();
-  void OnPingDone(const std::string& reply);
-
-  test::EchoServicePtr service_;
-  const base::Callback<void(const std::string&)> ping_done_callback_;
-
-  int iterations_;
-  int batch_size_;
-  std::string message_;
-
-  int current_iterations_;
-  int calls_outstanding_;
-
-  base::Closure quit_closure_;
-};
-
-PingPongTest::PingPongTest(test::EchoServicePtr service)
-    : service_(std::move(service)),
-      ping_done_callback_(
-          base::Bind(&PingPongTest::OnPingDone, base::Unretained(this))) {}
-
-void PingPongTest::RunTest(int iterations, int batch_size, int message_size) {
-  iterations_ = iterations;
-  batch_size_ = batch_size;
-  message_ = std::string(message_size, 'a');
-  current_iterations_ = 0;
-  calls_outstanding_ = 0;
-
-  base::MessageLoop::current()->SetNestableTasksAllowed(true);
-  base::RunLoop run_loop;
-  quit_closure_ = run_loop.QuitClosure();
-  base::ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, base::Bind(&PingPongTest::DoPing, base::Unretained(this)));
-  run_loop.Run();
-}
-
-void PingPongTest::DoPing() {
-  DCHECK_EQ(0, calls_outstanding_);
-  current_iterations_++;
-  if (current_iterations_ > iterations_) {
-    quit_closure_.Run();
-    return;
-  }
-
-  calls_outstanding_ = batch_size_;
-  for (int i = 0; i < batch_size_; i++) {
-    service_->Echo(message_, ping_done_callback_);
-  }
-}
-
-void PingPongTest::OnPingDone(const std::string& reply) {
-  DCHECK_GT(calls_outstanding_, 0);
-  calls_outstanding_--;
-
-  if (!calls_outstanding_)
-    DoPing();
-}
-
-class MojoE2EPerftest : public edk::test::MojoTestBase {
- public:
-  void RunTestOnTaskRunner(base::TaskRunner* runner,
-                           MojoHandle client_mp,
-                           const std::string& test_name) {
-    if (runner == base::ThreadTaskRunnerHandle::Get().get()) {
-      RunTests(client_mp, test_name);
-    } else {
-      base::RunLoop run_loop;
-      runner->PostTaskAndReply(
-          FROM_HERE, base::Bind(&MojoE2EPerftest::RunTests,
-                                base::Unretained(this), client_mp, test_name),
-          run_loop.QuitClosure());
-      run_loop.Run();
-    }
-  }
-
- protected:
-  base::MessageLoop message_loop_;
-
- private:
-  void RunTests(MojoHandle client_mp, const std::string& test_name) {
-    const int kMessages = 10000;
-    const int kBatchSizes[] = {1, 10, 100};
-    const int kMessageSizes[] = {8, 64, 512, 4096, 65536};
-
-    test::EchoServicePtr service;
-    service.Bind(InterfacePtrInfo<test::EchoService>(
-        ScopedMessagePipeHandle(MessagePipeHandle(client_mp)),
-        service.version()));
-    PingPongTest test(std::move(service));
-
-    for (int batch_size : kBatchSizes) {
-      for (int message_size : kMessageSizes) {
-        int num_messages = kMessages;
-        if (message_size == 65536)
-          num_messages /= 10;
-        std::string sub_test_name = base::StringPrintf(
-            "%s/%dx%d/%dbytes", test_name.c_str(), num_messages / batch_size,
-            batch_size, message_size);
-        base::PerfTimeLogger timer(sub_test_name.c_str());
-        test.RunTest(num_messages / batch_size, batch_size, message_size);
-      }
-    }
-  }
-};
-
-void CreateAndRunService(InterfaceRequest<test::EchoService> request,
-                         const base::Closure& cb) {
-  MakeStrongBinding(base::MakeUnique<EchoServiceImpl>(cb), std::move(request));
-}
-
-DEFINE_TEST_CLIENT_TEST_WITH_PIPE(PingService, MojoE2EPerftest, mp) {
-  MojoHandle service_mp;
-  EXPECT_EQ("hello", ReadMessageWithHandles(mp, &service_mp, 1));
-
-  InterfaceRequest<test::EchoService> request;
-  request.Bind(ScopedMessagePipeHandle(MessagePipeHandle(service_mp)));
-  base::RunLoop run_loop;
-  edk::GetIOTaskRunner()->PostTask(
-      FROM_HERE,
-      base::Bind(&CreateAndRunService, base::Passed(&request),
-                 base::Bind(base::IgnoreResult(&base::TaskRunner::PostTask),
-                            message_loop_.task_runner(), FROM_HERE,
-                            run_loop.QuitClosure())));
-  run_loop.Run();
-}
-
-TEST_F(MojoE2EPerftest, MultiProcessEchoMainThread) {
-  RUN_CHILD_ON_PIPE(PingService, mp)
-    MojoHandle client_mp, service_mp;
-    CreateMessagePipe(&client_mp, &service_mp);
-    WriteMessageWithHandles(mp, "hello", &service_mp, 1);
-    RunTestOnTaskRunner(message_loop_.task_runner().get(), client_mp,
-                        "MultiProcessEchoMainThread");
-  END_CHILD()
-}
-
-TEST_F(MojoE2EPerftest, MultiProcessEchoIoThread) {
-  RUN_CHILD_ON_PIPE(PingService, mp)
-    MojoHandle client_mp, service_mp;
-    CreateMessagePipe(&client_mp, &service_mp);
-    WriteMessageWithHandles(mp, "hello", &service_mp, 1);
-    RunTestOnTaskRunner(edk::GetIOTaskRunner().get(), client_mp,
-                        "MultiProcessEchoIoThread");
-  END_CHILD()
-}
-
-}  // namespace
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/equals_unittest.cc b/mojo/public/cpp/bindings/tests/equals_unittest.cc
deleted file mode 100644
index 6483baf..0000000
--- a/mojo/public/cpp/bindings/tests/equals_unittest.cc
+++ /dev/null
@@ -1,122 +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 <utility>
-
-#include "base/message_loop/message_loop.h"
-#include "mojo/public/interfaces/bindings/tests/test_structs.mojom.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace test {
-
-namespace {
-
-RectPtr CreateRect() {
-  return Rect::New(1, 2, 3, 4);
-}
-
-using EqualsTest = testing::Test;
-
-}  // namespace
-
-TEST_F(EqualsTest, NullStruct) {
-  RectPtr r1;
-  RectPtr r2;
-  EXPECT_TRUE(r1.Equals(r2));
-  EXPECT_TRUE(r2.Equals(r1));
-
-  r1 = CreateRect();
-  EXPECT_FALSE(r1.Equals(r2));
-  EXPECT_FALSE(r2.Equals(r1));
-}
-
-TEST_F(EqualsTest, Struct) {
-  RectPtr r1(CreateRect());
-  RectPtr r2(r1.Clone());
-  EXPECT_TRUE(r1.Equals(r2));
-  r2->y = 1;
-  EXPECT_FALSE(r1.Equals(r2));
-  r2.reset();
-  EXPECT_FALSE(r1.Equals(r2));
-}
-
-TEST_F(EqualsTest, StructNested) {
-  RectPairPtr p1(RectPair::New(CreateRect(), CreateRect()));
-  RectPairPtr p2(p1.Clone());
-  EXPECT_TRUE(p1.Equals(p2));
-  p2->second->width = 0;
-  EXPECT_FALSE(p1.Equals(p2));
-  p2->second.reset();
-  EXPECT_FALSE(p1.Equals(p2));
-}
-
-TEST_F(EqualsTest, Array) {
-  std::vector<RectPtr> rects;
-  rects.push_back(CreateRect());
-  NamedRegionPtr n1(NamedRegion::New(std::string("n1"), std::move(rects)));
-  NamedRegionPtr n2(n1.Clone());
-  EXPECT_TRUE(n1.Equals(n2));
-
-  n2->rects = base::nullopt;
-  EXPECT_FALSE(n1.Equals(n2));
-  n2->rects.emplace();
-  EXPECT_FALSE(n1.Equals(n2));
-
-  n2->rects->push_back(CreateRect());
-  n2->rects->push_back(CreateRect());
-  EXPECT_FALSE(n1.Equals(n2));
-
-  n2->rects->resize(1);
-  (*n2->rects)[0]->width = 0;
-  EXPECT_FALSE(n1.Equals(n2));
-
-  (*n2->rects)[0] = CreateRect();
-  EXPECT_TRUE(n1.Equals(n2));
-}
-
-TEST_F(EqualsTest, InterfacePtr) {
-  base::MessageLoop message_loop;
-
-  SomeInterfacePtr inf1;
-  SomeInterfacePtr inf2;
-
-  EXPECT_TRUE(inf1.Equals(inf1));
-  EXPECT_TRUE(inf1.Equals(inf2));
-
-  auto inf1_request = MakeRequest(&inf1);
-  ALLOW_UNUSED_LOCAL(inf1_request);
-
-  EXPECT_TRUE(inf1.Equals(inf1));
-  EXPECT_FALSE(inf1.Equals(inf2));
-
-  auto inf2_request = MakeRequest(&inf2);
-  ALLOW_UNUSED_LOCAL(inf2_request);
-
-  EXPECT_FALSE(inf1.Equals(inf2));
-}
-
-TEST_F(EqualsTest, InterfaceRequest) {
-  base::MessageLoop message_loop;
-
-  InterfaceRequest<SomeInterface> req1;
-  InterfaceRequest<SomeInterface> req2;
-
-  EXPECT_TRUE(req1.Equals(req1));
-  EXPECT_TRUE(req1.Equals(req2));
-
-  SomeInterfacePtr inf1;
-  req1 = MakeRequest(&inf1);
-
-  EXPECT_TRUE(req1.Equals(req1));
-  EXPECT_FALSE(req1.Equals(req2));
-
-  SomeInterfacePtr inf2;
-  req2 = MakeRequest(&inf2);
-
-  EXPECT_FALSE(req1.Equals(req2));
-}
-
-}  // test
-}  // mojo
diff --git a/mojo/public/cpp/bindings/tests/handle_passing_unittest.cc b/mojo/public/cpp/bindings/tests/handle_passing_unittest.cc
deleted file mode 100644
index ef977af..0000000
--- a/mojo/public/cpp/bindings/tests/handle_passing_unittest.cc
+++ /dev/null
@@ -1,356 +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 <stdint.h>
-#include <utility>
-
-#include "base/memory/ptr_util.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "mojo/public/cpp/bindings/binding.h"
-#include "mojo/public/cpp/bindings/strong_binding.h"
-#include "mojo/public/cpp/system/wait.h"
-#include "mojo/public/cpp/test_support/test_utils.h"
-#include "mojo/public/interfaces/bindings/tests/sample_factory.mojom.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace test {
-namespace {
-
-const char kText1[] = "hello";
-const char kText2[] = "world";
-
-void RecordString(std::string* storage,
-                  const base::Closure& closure,
-                  const std::string& str) {
-  *storage = str;
-  closure.Run();
-}
-
-base::Callback<void(const std::string&)> MakeStringRecorder(
-    std::string* storage,
-    const base::Closure& closure) {
-  return base::Bind(&RecordString, storage, closure);
-}
-
-class ImportedInterfaceImpl : public imported::ImportedInterface {
- public:
-  ImportedInterfaceImpl(
-      InterfaceRequest<imported::ImportedInterface> request,
-      const base::Closure& closure)
-      : binding_(this, std::move(request)), closure_(closure) {}
-
-  void DoSomething() override {
-    do_something_count_++;
-    closure_.Run();
-  }
-
-  static int do_something_count() { return do_something_count_; }
-
- private:
-  static int do_something_count_;
-  Binding<ImportedInterface> binding_;
-  base::Closure closure_;
-};
-int ImportedInterfaceImpl::do_something_count_ = 0;
-
-class SampleNamedObjectImpl : public sample::NamedObject {
- public:
-  SampleNamedObjectImpl() {}
-
-  void SetName(const std::string& name) override { name_ = name; }
-
-  void GetName(const GetNameCallback& callback) override {
-    callback.Run(name_);
-  }
-
- private:
-  std::string name_;
-};
-
-class SampleFactoryImpl : public sample::Factory {
- public:
-  explicit SampleFactoryImpl(InterfaceRequest<sample::Factory> request)
-      : binding_(this, std::move(request)) {}
-
-  void DoStuff(sample::RequestPtr request,
-               ScopedMessagePipeHandle pipe,
-               const DoStuffCallback& callback) override {
-    std::string text1;
-    if (pipe.is_valid())
-      EXPECT_TRUE(ReadTextMessage(pipe.get(), &text1));
-
-    std::string text2;
-    if (request->pipe.is_valid()) {
-      EXPECT_TRUE(ReadTextMessage(request->pipe.get(), &text2));
-
-      // Ensure that simply accessing request->pipe does not close it.
-      EXPECT_TRUE(request->pipe.is_valid());
-    }
-
-    ScopedMessagePipeHandle pipe0;
-    if (!text2.empty()) {
-      CreateMessagePipe(nullptr, &pipe0, &pipe1_);
-      EXPECT_TRUE(WriteTextMessage(pipe1_.get(), text2));
-    }
-
-    sample::ResponsePtr response(sample::Response::New(2, std::move(pipe0)));
-    callback.Run(std::move(response), text1);
-
-    if (request->obj)
-      request->obj->DoSomething();
-  }
-
-  void DoStuff2(ScopedDataPipeConsumerHandle pipe,
-                const DoStuff2Callback& callback) override {
-    // Read the data from the pipe, writing the response (as a string) to
-    // DidStuff2().
-    ASSERT_TRUE(pipe.is_valid());
-    uint32_t data_size = 0;
-
-    MojoHandleSignalsState state;
-    ASSERT_EQ(MOJO_RESULT_OK,
-              mojo::Wait(pipe.get(), MOJO_HANDLE_SIGNAL_READABLE, &state));
-    ASSERT_TRUE(state.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE);
-    ASSERT_EQ(MOJO_RESULT_OK,
-              ReadDataRaw(
-                  pipe.get(), nullptr, &data_size, MOJO_READ_DATA_FLAG_QUERY));
-    ASSERT_NE(0, static_cast<int>(data_size));
-    char data[64];
-    ASSERT_LT(static_cast<int>(data_size), 64);
-    ASSERT_EQ(
-        MOJO_RESULT_OK,
-        ReadDataRaw(
-            pipe.get(), data, &data_size, MOJO_READ_DATA_FLAG_ALL_OR_NONE));
-
-    callback.Run(data);
-  }
-
-  void CreateNamedObject(
-      InterfaceRequest<sample::NamedObject> object_request) override {
-    EXPECT_TRUE(object_request.is_pending());
-    MakeStrongBinding(base::MakeUnique<SampleNamedObjectImpl>(),
-                      std::move(object_request));
-  }
-
-  // These aren't called or implemented, but exist here to test that the
-  // methods are generated with the correct argument types for imported
-  // interfaces.
-  void RequestImportedInterface(
-      InterfaceRequest<imported::ImportedInterface> imported,
-      const RequestImportedInterfaceCallback& callback) override {}
-  void TakeImportedInterface(
-      imported::ImportedInterfacePtr imported,
-      const TakeImportedInterfaceCallback& callback) override {}
-
- private:
-  ScopedMessagePipeHandle pipe1_;
-  Binding<sample::Factory> binding_;
-};
-
-class HandlePassingTest : public testing::Test {
- public:
-  HandlePassingTest() {}
-
-  void TearDown() override { PumpMessages(); }
-
-  void PumpMessages() { base::RunLoop().RunUntilIdle(); }
-
- private:
-  base::MessageLoop loop_;
-};
-
-void DoStuff(bool* got_response,
-             std::string* got_text_reply,
-             const base::Closure& closure,
-             sample::ResponsePtr response,
-             const std::string& text_reply) {
-  *got_text_reply = text_reply;
-
-  if (response->pipe.is_valid()) {
-    std::string text2;
-    EXPECT_TRUE(ReadTextMessage(response->pipe.get(), &text2));
-
-    // Ensure that simply accessing response.pipe does not close it.
-    EXPECT_TRUE(response->pipe.is_valid());
-
-    EXPECT_EQ(std::string(kText2), text2);
-
-    // Do some more tests of handle passing:
-    ScopedMessagePipeHandle p = std::move(response->pipe);
-    EXPECT_TRUE(p.is_valid());
-    EXPECT_FALSE(response->pipe.is_valid());
-  }
-
-  *got_response = true;
-  closure.Run();
-}
-
-void DoStuff2(bool* got_response,
-              std::string* got_text_reply,
-              const base::Closure& closure,
-              const std::string& text_reply) {
-  *got_response = true;
-  *got_text_reply = text_reply;
-  closure.Run();
-}
-
-TEST_F(HandlePassingTest, Basic) {
-  sample::FactoryPtr factory;
-  SampleFactoryImpl factory_impl(MakeRequest(&factory));
-
-  MessagePipe pipe0;
-  EXPECT_TRUE(WriteTextMessage(pipe0.handle1.get(), kText1));
-
-  MessagePipe pipe1;
-  EXPECT_TRUE(WriteTextMessage(pipe1.handle1.get(), kText2));
-
-  imported::ImportedInterfacePtr imported;
-  base::RunLoop run_loop;
-  ImportedInterfaceImpl imported_impl(MakeRequest(&imported),
-                                      run_loop.QuitClosure());
-
-  sample::RequestPtr request(sample::Request::New(
-      1, std::move(pipe1.handle0), base::nullopt, std::move(imported)));
-  bool got_response = false;
-  std::string got_text_reply;
-  base::RunLoop run_loop2;
-  factory->DoStuff(std::move(request), std::move(pipe0.handle0),
-                   base::Bind(&DoStuff, &got_response, &got_text_reply,
-                              run_loop2.QuitClosure()));
-
-  EXPECT_FALSE(got_response);
-  int count_before = ImportedInterfaceImpl::do_something_count();
-
-  run_loop.Run();
-  run_loop2.Run();
-
-  EXPECT_TRUE(got_response);
-  EXPECT_EQ(kText1, got_text_reply);
-  EXPECT_EQ(1, ImportedInterfaceImpl::do_something_count() - count_before);
-}
-
-TEST_F(HandlePassingTest, PassInvalid) {
-  sample::FactoryPtr factory;
-  SampleFactoryImpl factory_impl(MakeRequest(&factory));
-
-  sample::RequestPtr request(
-      sample::Request::New(1, ScopedMessagePipeHandle(), base::nullopt,
-                           imported::ImportedInterfacePtr()));
-  bool got_response = false;
-  std::string got_text_reply;
-  base::RunLoop run_loop;
-  factory->DoStuff(std::move(request), ScopedMessagePipeHandle(),
-                   base::Bind(&DoStuff, &got_response, &got_text_reply,
-                              run_loop.QuitClosure()));
-
-  EXPECT_FALSE(got_response);
-
-  run_loop.Run();
-
-  EXPECT_TRUE(got_response);
-}
-
-// Verifies DataPipeConsumer can be passed and read from.
-TEST_F(HandlePassingTest, DataPipe) {
-  sample::FactoryPtr factory;
-  SampleFactoryImpl factory_impl(MakeRequest(&factory));
-
-  // Writes a string to a data pipe and passes the data pipe (consumer) to the
-  // factory.
-  ScopedDataPipeProducerHandle producer_handle;
-  ScopedDataPipeConsumerHandle consumer_handle;
-  MojoCreateDataPipeOptions options = {sizeof(MojoCreateDataPipeOptions),
-                                       MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,
-                                       1,
-                                       1024};
-  ASSERT_EQ(MOJO_RESULT_OK,
-            CreateDataPipe(&options, &producer_handle, &consumer_handle));
-  std::string expected_text_reply = "got it";
-  // +1 for \0.
-  uint32_t data_size = static_cast<uint32_t>(expected_text_reply.size() + 1);
-  ASSERT_EQ(MOJO_RESULT_OK,
-            WriteDataRaw(producer_handle.get(),
-                         expected_text_reply.c_str(),
-                         &data_size,
-                         MOJO_WRITE_DATA_FLAG_ALL_OR_NONE));
-
-  bool got_response = false;
-  std::string got_text_reply;
-  base::RunLoop run_loop;
-  factory->DoStuff2(std::move(consumer_handle),
-                    base::Bind(&DoStuff2, &got_response, &got_text_reply,
-                               run_loop.QuitClosure()));
-
-  EXPECT_FALSE(got_response);
-
-  run_loop.Run();
-
-  EXPECT_TRUE(got_response);
-  EXPECT_EQ(expected_text_reply, got_text_reply);
-}
-
-TEST_F(HandlePassingTest, PipesAreClosed) {
-  sample::FactoryPtr factory;
-  SampleFactoryImpl factory_impl(MakeRequest(&factory));
-
-  MessagePipe extra_pipe;
-
-  MojoHandle handle0_value = extra_pipe.handle0.get().value();
-  MojoHandle handle1_value = extra_pipe.handle1.get().value();
-
-  {
-    std::vector<ScopedMessagePipeHandle> pipes(2);
-    pipes[0] = std::move(extra_pipe.handle0);
-    pipes[1] = std::move(extra_pipe.handle1);
-
-    sample::RequestPtr request(sample::Request::New());
-    request->more_pipes = std::move(pipes);
-
-    factory->DoStuff(std::move(request), ScopedMessagePipeHandle(),
-                     sample::Factory::DoStuffCallback());
-  }
-
-  // We expect the pipes to have been closed.
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(handle0_value));
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(handle1_value));
-}
-
-TEST_F(HandlePassingTest, CreateNamedObject) {
-  sample::FactoryPtr factory;
-  SampleFactoryImpl factory_impl(MakeRequest(&factory));
-
-  sample::NamedObjectPtr object1;
-  EXPECT_FALSE(object1);
-
-  InterfaceRequest<sample::NamedObject> object1_request(&object1);
-  EXPECT_TRUE(object1_request.is_pending());
-  factory->CreateNamedObject(std::move(object1_request));
-  EXPECT_FALSE(object1_request.is_pending());  // We've passed the request.
-
-  ASSERT_TRUE(object1);
-  object1->SetName("object1");
-
-  sample::NamedObjectPtr object2;
-  factory->CreateNamedObject(MakeRequest(&object2));
-  object2->SetName("object2");
-
-  base::RunLoop run_loop, run_loop2;
-  std::string name1;
-  object1->GetName(MakeStringRecorder(&name1, run_loop.QuitClosure()));
-
-  std::string name2;
-  object2->GetName(MakeStringRecorder(&name2, run_loop2.QuitClosure()));
-
-  run_loop.Run();
-  run_loop2.Run();
-
-  EXPECT_EQ(std::string("object1"), name1);
-  EXPECT_EQ(std::string("object2"), name2);
-}
-
-}  // namespace
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/hash_unittest.cc b/mojo/public/cpp/bindings/tests/hash_unittest.cc
deleted file mode 100644
index 9ce1f5b..0000000
--- a/mojo/public/cpp/bindings/tests/hash_unittest.cc
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/bindings/lib/hash_util.h"
-
-#include "mojo/public/interfaces/bindings/tests/test_structs.mojom.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace test {
-namespace {
-
-using HashTest = testing::Test;
-
-TEST_F(HashTest, NestedStruct) {
-  // Just check that this template instantiation compiles.
-  ASSERT_EQ(
-      ::mojo::internal::Hash(::mojo::internal::kHashSeed,
-                             SimpleNestedStruct::New(ContainsOther::New(1))),
-      ::mojo::internal::Hash(::mojo::internal::kHashSeed,
-                             SimpleNestedStruct::New(ContainsOther::New(1))));
-}
-
-TEST_F(HashTest, UnmappedNativeStruct) {
-  // Just check that this template instantiation compiles.
-  ASSERT_EQ(::mojo::internal::Hash(::mojo::internal::kHashSeed,
-                                   UnmappedNativeStruct::New()),
-            ::mojo::internal::Hash(::mojo::internal::kHashSeed,
-                                   UnmappedNativeStruct::New()));
-}
-
-}  // namespace
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/interface_ptr_unittest.cc b/mojo/public/cpp/bindings/tests/interface_ptr_unittest.cc
deleted file mode 100644
index 431a844..0000000
--- a/mojo/public/cpp/bindings/tests/interface_ptr_unittest.cc
+++ /dev/null
@@ -1,937 +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 <stdint.h>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/memory/ptr_util.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "base/threading/sequenced_task_runner_handle.h"
-#include "base/threading/thread.h"
-#include "mojo/public/cpp/bindings/binding.h"
-#include "mojo/public/cpp/bindings/strong_binding.h"
-#include "mojo/public/cpp/bindings/thread_safe_interface_ptr.h"
-#include "mojo/public/interfaces/bindings/tests/math_calculator.mojom.h"
-#include "mojo/public/interfaces/bindings/tests/sample_interfaces.mojom.h"
-#include "mojo/public/interfaces/bindings/tests/sample_service.mojom.h"
-#include "mojo/public/interfaces/bindings/tests/scoping.mojom.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace test {
-namespace {
-
-typedef base::Callback<void(double)> CalcCallback;
-
-class MathCalculatorImpl : public math::Calculator {
- public:
-  explicit MathCalculatorImpl(InterfaceRequest<math::Calculator> request)
-      : total_(0.0), binding_(this, std::move(request)) {}
-  ~MathCalculatorImpl() override {}
-
-  void Clear(const CalcCallback& callback) override {
-    total_ = 0.0;
-    callback.Run(total_);
-  }
-
-  void Add(double value, const CalcCallback& callback) override {
-    total_ += value;
-    callback.Run(total_);
-  }
-
-  void Multiply(double value, const CalcCallback& callback) override {
-    total_ *= value;
-    callback.Run(total_);
-  }
-
-  Binding<math::Calculator>* binding() { return &binding_; }
-
- private:
-  double total_;
-  Binding<math::Calculator> binding_;
-};
-
-class MathCalculatorUI {
- public:
-  explicit MathCalculatorUI(math::CalculatorPtr calculator)
-      : calculator_(std::move(calculator)),
-        output_(0.0) {}
-
-  bool encountered_error() const { return calculator_.encountered_error(); }
-  void set_connection_error_handler(const base::Closure& closure) {
-    calculator_.set_connection_error_handler(closure);
-  }
-
-  void Add(double value, const base::Closure& closure) {
-    calculator_->Add(
-        value,
-        base::Bind(&MathCalculatorUI::Output, base::Unretained(this), closure));
-  }
-
-  void Multiply(double value, const base::Closure& closure) {
-    calculator_->Multiply(
-        value,
-        base::Bind(&MathCalculatorUI::Output, base::Unretained(this), closure));
-  }
-
-  double GetOutput() const { return output_; }
-
-  math::CalculatorPtr& GetInterfacePtr() { return calculator_; }
-
- private:
-  void Output(const base::Closure& closure, double output) {
-    output_ = output;
-    if (!closure.is_null())
-      closure.Run();
-  }
-
-  math::CalculatorPtr calculator_;
-  double output_;
-  base::Closure closure_;
-};
-
-class SelfDestructingMathCalculatorUI {
- public:
-  explicit SelfDestructingMathCalculatorUI(math::CalculatorPtr calculator)
-      : calculator_(std::move(calculator)), nesting_level_(0) {
-    ++num_instances_;
-  }
-
-  void BeginTest(bool nested, const base::Closure& closure) {
-    nesting_level_ = nested ? 2 : 1;
-    calculator_->Add(
-        1.0,
-        base::Bind(&SelfDestructingMathCalculatorUI::Output,
-                   base::Unretained(this), closure));
-  }
-
-  static int num_instances() { return num_instances_; }
-
-  void Output(const base::Closure& closure, double value) {
-    if (--nesting_level_ > 0) {
-      // Add some more and wait for re-entrant call to Output!
-      calculator_->Add(
-          1.0,
-          base::Bind(&SelfDestructingMathCalculatorUI::Output,
-                     base::Unretained(this), closure));
-    } else {
-      closure.Run();
-      delete this;
-    }
-  }
-
- private:
-  ~SelfDestructingMathCalculatorUI() { --num_instances_; }
-
-  math::CalculatorPtr calculator_;
-  int nesting_level_;
-  static int num_instances_;
-};
-
-// static
-int SelfDestructingMathCalculatorUI::num_instances_ = 0;
-
-class ReentrantServiceImpl : public sample::Service {
- public:
-  ~ReentrantServiceImpl() override {}
-
-  explicit ReentrantServiceImpl(InterfaceRequest<sample::Service> request)
-      : call_depth_(0),
-        max_call_depth_(0),
-        binding_(this, std::move(request)) {}
-
-  int max_call_depth() { return max_call_depth_; }
-
-  void Frobinate(sample::FooPtr foo,
-                 sample::Service::BazOptions baz,
-                 sample::PortPtr port,
-                 const sample::Service::FrobinateCallback& callback) override {
-    max_call_depth_ = std::max(++call_depth_, max_call_depth_);
-    if (call_depth_ == 1) {
-      EXPECT_TRUE(binding_.WaitForIncomingMethodCall());
-    }
-    call_depth_--;
-    callback.Run(5);
-  }
-
-  void GetPort(mojo::InterfaceRequest<sample::Port> port) override {}
-
- private:
-  int call_depth_;
-  int max_call_depth_;
-  Binding<sample::Service> binding_;
-};
-
-class IntegerAccessorImpl : public sample::IntegerAccessor {
- public:
-  IntegerAccessorImpl() : integer_(0) {}
-  ~IntegerAccessorImpl() override {}
-
-  int64_t integer() const { return integer_; }
-
-  void set_closure(const base::Closure& closure) { closure_ = closure; }
-
- private:
-  // sample::IntegerAccessor implementation.
-  void GetInteger(const GetIntegerCallback& callback) override {
-    callback.Run(integer_, sample::Enum::VALUE);
-  }
-  void SetInteger(int64_t data, sample::Enum type) override {
-    integer_ = data;
-    if (!closure_.is_null()) {
-      closure_.Run();
-      closure_.Reset();
-    }
-  }
-
-  int64_t integer_;
-  base::Closure closure_;
-};
-
-class InterfacePtrTest : public testing::Test {
- public:
-  InterfacePtrTest() {}
-  ~InterfacePtrTest() override { base::RunLoop().RunUntilIdle(); }
-
-  void PumpMessages() { base::RunLoop().RunUntilIdle(); }
-
- private:
-  base::MessageLoop loop_;
-};
-
-void SetFlagAndRunClosure(bool* flag, const base::Closure& closure) {
-  *flag = true;
-  closure.Run();
-}
-
-void IgnoreValueAndRunClosure(const base::Closure& closure, int32_t value) {
-  closure.Run();
-}
-
-void ExpectValueAndRunClosure(uint32_t expected_value,
-                              const base::Closure& closure,
-                              uint32_t value) {
-  EXPECT_EQ(expected_value, value);
-  closure.Run();
-}
-
-TEST_F(InterfacePtrTest, IsBound) {
-  math::CalculatorPtr calc;
-  EXPECT_FALSE(calc.is_bound());
-  MathCalculatorImpl calc_impl(MakeRequest(&calc));
-  EXPECT_TRUE(calc.is_bound());
-}
-
-TEST_F(InterfacePtrTest, EndToEnd) {
-  math::CalculatorPtr calc;
-  MathCalculatorImpl calc_impl(MakeRequest(&calc));
-
-  // Suppose this is instantiated in a process that has pipe1_.
-  MathCalculatorUI calculator_ui(std::move(calc));
-
-  base::RunLoop run_loop, run_loop2;
-  calculator_ui.Add(2.0, run_loop.QuitClosure());
-  calculator_ui.Multiply(5.0, run_loop2.QuitClosure());
-  run_loop.Run();
-  run_loop2.Run();
-
-  EXPECT_EQ(10.0, calculator_ui.GetOutput());
-}
-
-TEST_F(InterfacePtrTest, EndToEnd_Synchronous) {
-  math::CalculatorPtr calc;
-  MathCalculatorImpl calc_impl(MakeRequest(&calc));
-
-  // Suppose this is instantiated in a process that has pipe1_.
-  MathCalculatorUI calculator_ui(std::move(calc));
-
-  EXPECT_EQ(0.0, calculator_ui.GetOutput());
-
-  base::RunLoop run_loop;
-  calculator_ui.Add(2.0, run_loop.QuitClosure());
-  EXPECT_EQ(0.0, calculator_ui.GetOutput());
-  calc_impl.binding()->WaitForIncomingMethodCall();
-  run_loop.Run();
-  EXPECT_EQ(2.0, calculator_ui.GetOutput());
-
-  base::RunLoop run_loop2;
-  calculator_ui.Multiply(5.0, run_loop2.QuitClosure());
-  EXPECT_EQ(2.0, calculator_ui.GetOutput());
-  calc_impl.binding()->WaitForIncomingMethodCall();
-  run_loop2.Run();
-  EXPECT_EQ(10.0, calculator_ui.GetOutput());
-}
-
-TEST_F(InterfacePtrTest, Movable) {
-  math::CalculatorPtr a;
-  math::CalculatorPtr b;
-  MathCalculatorImpl calc_impl(MakeRequest(&b));
-
-  EXPECT_TRUE(!a);
-  EXPECT_FALSE(!b);
-
-  a = std::move(b);
-
-  EXPECT_FALSE(!a);
-  EXPECT_TRUE(!b);
-}
-
-TEST_F(InterfacePtrTest, Resettable) {
-  math::CalculatorPtr a;
-
-  EXPECT_TRUE(!a);
-
-  MessagePipe pipe;
-
-  // Save this so we can test it later.
-  Handle handle = pipe.handle0.get();
-
-  a = MakeProxy(
-      InterfacePtrInfo<math::Calculator>(std::move(pipe.handle0), 0u));
-
-  EXPECT_FALSE(!a);
-
-  a.reset();
-
-  EXPECT_TRUE(!a);
-  EXPECT_FALSE(a.internal_state()->is_bound());
-
-  // Test that handle was closed.
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, CloseRaw(handle));
-}
-
-TEST_F(InterfacePtrTest, BindInvalidHandle) {
-  math::CalculatorPtr ptr;
-  EXPECT_FALSE(ptr.get());
-  EXPECT_FALSE(ptr);
-
-  ptr.Bind(InterfacePtrInfo<math::Calculator>());
-  EXPECT_FALSE(ptr.get());
-  EXPECT_FALSE(ptr);
-}
-
-TEST_F(InterfacePtrTest, EncounteredError) {
-  math::CalculatorPtr proxy;
-  MathCalculatorImpl calc_impl(MakeRequest(&proxy));
-
-  MathCalculatorUI calculator_ui(std::move(proxy));
-
-  base::RunLoop run_loop;
-  calculator_ui.Add(2.0, run_loop.QuitClosure());
-  run_loop.Run();
-  EXPECT_EQ(2.0, calculator_ui.GetOutput());
-  EXPECT_FALSE(calculator_ui.encountered_error());
-
-  calculator_ui.Multiply(5.0, base::Closure());
-  EXPECT_FALSE(calculator_ui.encountered_error());
-
-  // Close the server.
-  calc_impl.binding()->Close();
-
-  // The state change isn't picked up locally yet.
-  base::RunLoop run_loop2;
-  calculator_ui.set_connection_error_handler(run_loop2.QuitClosure());
-  EXPECT_FALSE(calculator_ui.encountered_error());
-
-  run_loop2.Run();
-
-  // OK, now we see the error.
-  EXPECT_TRUE(calculator_ui.encountered_error());
-}
-
-TEST_F(InterfacePtrTest, EncounteredErrorCallback) {
-  math::CalculatorPtr proxy;
-  MathCalculatorImpl calc_impl(MakeRequest(&proxy));
-
-  bool encountered_error = false;
-  base::RunLoop run_loop;
-  proxy.set_connection_error_handler(
-      base::Bind(&SetFlagAndRunClosure, &encountered_error,
-                 run_loop.QuitClosure()));
-
-  MathCalculatorUI calculator_ui(std::move(proxy));
-
-  base::RunLoop run_loop2;
-  calculator_ui.Add(2.0, run_loop2.QuitClosure());
-  run_loop2.Run();
-  EXPECT_EQ(2.0, calculator_ui.GetOutput());
-  EXPECT_FALSE(calculator_ui.encountered_error());
-
-  calculator_ui.Multiply(5.0, base::Closure());
-  EXPECT_FALSE(calculator_ui.encountered_error());
-
-  // Close the server.
-  calc_impl.binding()->Close();
-
-  // The state change isn't picked up locally yet.
-  EXPECT_FALSE(calculator_ui.encountered_error());
-
-  run_loop.Run();
-
-  // OK, now we see the error.
-  EXPECT_TRUE(calculator_ui.encountered_error());
-
-  // We should have also been able to observe the error through the error
-  // handler.
-  EXPECT_TRUE(encountered_error);
-}
-
-TEST_F(InterfacePtrTest, DestroyInterfacePtrOnMethodResponse) {
-  math::CalculatorPtr proxy;
-  MathCalculatorImpl calc_impl(MakeRequest(&proxy));
-
-  EXPECT_EQ(0, SelfDestructingMathCalculatorUI::num_instances());
-
-  SelfDestructingMathCalculatorUI* impl =
-      new SelfDestructingMathCalculatorUI(std::move(proxy));
-  base::RunLoop run_loop;
-  impl->BeginTest(false, run_loop.QuitClosure());
-  run_loop.Run();
-
-  EXPECT_EQ(0, SelfDestructingMathCalculatorUI::num_instances());
-}
-
-TEST_F(InterfacePtrTest, NestedDestroyInterfacePtrOnMethodResponse) {
-  math::CalculatorPtr proxy;
-  MathCalculatorImpl calc_impl(MakeRequest(&proxy));
-
-  EXPECT_EQ(0, SelfDestructingMathCalculatorUI::num_instances());
-
-  SelfDestructingMathCalculatorUI* impl =
-      new SelfDestructingMathCalculatorUI(std::move(proxy));
-  base::RunLoop run_loop;
-  impl->BeginTest(true, run_loop.QuitClosure());
-  run_loop.Run();
-
-  EXPECT_EQ(0, SelfDestructingMathCalculatorUI::num_instances());
-}
-
-TEST_F(InterfacePtrTest, ReentrantWaitForIncomingMethodCall) {
-  sample::ServicePtr proxy;
-  ReentrantServiceImpl impl(MakeRequest(&proxy));
-
-  base::RunLoop run_loop, run_loop2;
-  proxy->Frobinate(nullptr, sample::Service::BazOptions::REGULAR, nullptr,
-                   base::Bind(&IgnoreValueAndRunClosure,
-                              run_loop.QuitClosure()));
-  proxy->Frobinate(nullptr, sample::Service::BazOptions::REGULAR, nullptr,
-                   base::Bind(&IgnoreValueAndRunClosure,
-                              run_loop2.QuitClosure()));
-
-  run_loop.Run();
-  run_loop2.Run();
-
-  EXPECT_EQ(2, impl.max_call_depth());
-}
-
-TEST_F(InterfacePtrTest, QueryVersion) {
-  IntegerAccessorImpl impl;
-  sample::IntegerAccessorPtr ptr;
-  Binding<sample::IntegerAccessor> binding(&impl, MakeRequest(&ptr));
-
-  EXPECT_EQ(0u, ptr.version());
-
-  base::RunLoop run_loop;
-  ptr.QueryVersion(base::Bind(&ExpectValueAndRunClosure, 3u,
-                              run_loop.QuitClosure()));
-  run_loop.Run();
-
-  EXPECT_EQ(3u, ptr.version());
-}
-
-TEST_F(InterfacePtrTest, RequireVersion) {
-  IntegerAccessorImpl impl;
-  sample::IntegerAccessorPtr ptr;
-  Binding<sample::IntegerAccessor> binding(&impl, MakeRequest(&ptr));
-
-  EXPECT_EQ(0u, ptr.version());
-
-  ptr.RequireVersion(1u);
-  EXPECT_EQ(1u, ptr.version());
-  base::RunLoop run_loop;
-  impl.set_closure(run_loop.QuitClosure());
-  ptr->SetInteger(123, sample::Enum::VALUE);
-  run_loop.Run();
-  EXPECT_FALSE(ptr.encountered_error());
-  EXPECT_EQ(123, impl.integer());
-
-  ptr.RequireVersion(3u);
-  EXPECT_EQ(3u, ptr.version());
-  base::RunLoop run_loop2;
-  impl.set_closure(run_loop2.QuitClosure());
-  ptr->SetInteger(456, sample::Enum::VALUE);
-  run_loop2.Run();
-  EXPECT_FALSE(ptr.encountered_error());
-  EXPECT_EQ(456, impl.integer());
-
-  // Require a version that is not supported by the impl side.
-  ptr.RequireVersion(4u);
-  // This value is set to the input of RequireVersion() synchronously.
-  EXPECT_EQ(4u, ptr.version());
-  base::RunLoop run_loop3;
-  ptr.set_connection_error_handler(run_loop3.QuitClosure());
-  ptr->SetInteger(789, sample::Enum::VALUE);
-  run_loop3.Run();
-  EXPECT_TRUE(ptr.encountered_error());
-  // The call to SetInteger() after RequireVersion(4u) is ignored.
-  EXPECT_EQ(456, impl.integer());
-}
-
-class StrongMathCalculatorImpl : public math::Calculator {
- public:
-  StrongMathCalculatorImpl(bool* destroyed) : destroyed_(destroyed) {}
-  ~StrongMathCalculatorImpl() override { *destroyed_ = true; }
-
-  // math::Calculator implementation.
-  void Clear(const CalcCallback& callback) override { callback.Run(total_); }
-
-  void Add(double value, const CalcCallback& callback) override {
-    total_ += value;
-    callback.Run(total_);
-  }
-
-  void Multiply(double value, const CalcCallback& callback) override {
-    total_ *= value;
-    callback.Run(total_);
-  }
-
- private:
-  double total_ = 0.0;
-  bool* destroyed_;
-};
-
-TEST(StrongConnectorTest, Math) {
-  base::MessageLoop loop;
-
-  bool error_received = false;
-  bool destroyed = false;
-  math::CalculatorPtr calc;
-  base::RunLoop run_loop;
-
-  auto binding =
-      MakeStrongBinding(base::MakeUnique<StrongMathCalculatorImpl>(&destroyed),
-                        MakeRequest(&calc));
-  binding->set_connection_error_handler(base::Bind(
-      &SetFlagAndRunClosure, &error_received, run_loop.QuitClosure()));
-
-  {
-    // Suppose this is instantiated in a process that has the other end of the
-    // message pipe.
-    MathCalculatorUI calculator_ui(std::move(calc));
-
-    base::RunLoop run_loop, run_loop2;
-    calculator_ui.Add(2.0, run_loop.QuitClosure());
-    calculator_ui.Multiply(5.0, run_loop2.QuitClosure());
-    run_loop.Run();
-    run_loop2.Run();
-
-    EXPECT_EQ(10.0, calculator_ui.GetOutput());
-    EXPECT_FALSE(error_received);
-    EXPECT_FALSE(destroyed);
-  }
-  // Destroying calculator_ui should close the pipe and generate an error on the
-  // other
-  // end which will destroy the instance since it is strongly bound.
-
-  run_loop.Run();
-  EXPECT_TRUE(error_received);
-  EXPECT_TRUE(destroyed);
-}
-
-class WeakMathCalculatorImpl : public math::Calculator {
- public:
-  WeakMathCalculatorImpl(ScopedMessagePipeHandle handle,
-                         bool* error_received,
-                         bool* destroyed,
-                         const base::Closure& closure)
-      : error_received_(error_received),
-        destroyed_(destroyed),
-        closure_(closure),
-        binding_(this, std::move(handle)) {
-    binding_.set_connection_error_handler(
-        base::Bind(&SetFlagAndRunClosure, error_received_, closure_));
-  }
-  ~WeakMathCalculatorImpl() override { *destroyed_ = true; }
-
-  void Clear(const CalcCallback& callback) override { callback.Run(total_); }
-
-  void Add(double value, const CalcCallback& callback) override {
-    total_ += value;
-    callback.Run(total_);
-  }
-
-  void Multiply(double value, const CalcCallback& callback) override {
-    total_ *= value;
-    callback.Run(total_);
-  }
-
- private:
-  double total_ = 0.0;
-  bool* error_received_;
-  bool* destroyed_;
-  base::Closure closure_;
-
-  Binding<math::Calculator> binding_;
-};
-
-TEST(WeakConnectorTest, Math) {
-  base::MessageLoop loop;
-
-  bool error_received = false;
-  bool destroyed = false;
-  MessagePipe pipe;
-  base::RunLoop run_loop;
-  WeakMathCalculatorImpl impl(std::move(pipe.handle0), &error_received,
-                              &destroyed, run_loop.QuitClosure());
-
-  math::CalculatorPtr calc;
-  calc.Bind(InterfacePtrInfo<math::Calculator>(std::move(pipe.handle1), 0u));
-
-  {
-    // Suppose this is instantiated in a process that has the other end of the
-    // message pipe.
-    MathCalculatorUI calculator_ui(std::move(calc));
-
-    base::RunLoop run_loop, run_loop2;
-    calculator_ui.Add(2.0, run_loop.QuitClosure());
-    calculator_ui.Multiply(5.0, run_loop2.QuitClosure());
-    run_loop.Run();
-    run_loop2.Run();
-
-    EXPECT_EQ(10.0, calculator_ui.GetOutput());
-    EXPECT_FALSE(error_received);
-    EXPECT_FALSE(destroyed);
-    // Destroying calculator_ui should close the pipe and generate an error on
-    // the other
-    // end which will destroy the instance since it is strongly bound.
-  }
-
-  run_loop.Run();
-  EXPECT_TRUE(error_received);
-  EXPECT_FALSE(destroyed);
-}
-
-class CImpl : public C {
- public:
-  CImpl(bool* d_called, const base::Closure& closure)
-      : d_called_(d_called), closure_(closure) {}
-  ~CImpl() override {}
-
- private:
-  void D() override {
-    *d_called_ = true;
-    closure_.Run();
-  }
-
-  bool* d_called_;
-  base::Closure closure_;
-};
-
-class BImpl : public B {
- public:
-  BImpl(bool* d_called, const base::Closure& closure)
-      : d_called_(d_called), closure_(closure) {}
-  ~BImpl() override {}
-
- private:
-  void GetC(InterfaceRequest<C> c) override {
-    MakeStrongBinding(base::MakeUnique<CImpl>(d_called_, closure_),
-                      std::move(c));
-  }
-
-  bool* d_called_;
-  base::Closure closure_;
-};
-
-class AImpl : public A {
- public:
-  AImpl(InterfaceRequest<A> request, const base::Closure& closure)
-      : d_called_(false), binding_(this, std::move(request)),
-        closure_(closure) {}
-  ~AImpl() override {}
-
-  bool d_called() const { return d_called_; }
-
- private:
-  void GetB(InterfaceRequest<B> b) override {
-    MakeStrongBinding(base::MakeUnique<BImpl>(&d_called_, closure_),
-                      std::move(b));
-  }
-
-  bool d_called_;
-  Binding<A> binding_;
-  base::Closure closure_;
-};
-
-TEST_F(InterfacePtrTest, Scoping) {
-  APtr a;
-  base::RunLoop run_loop;
-  AImpl a_impl(MakeRequest(&a), run_loop.QuitClosure());
-
-  EXPECT_FALSE(a_impl.d_called());
-
-  {
-    BPtr b;
-    a->GetB(MakeRequest(&b));
-    CPtr c;
-    b->GetC(MakeRequest(&c));
-    c->D();
-  }
-
-  // While B & C have fallen out of scope, the pipes will remain until they are
-  // flushed.
-  EXPECT_FALSE(a_impl.d_called());
-  run_loop.Run();
-  EXPECT_TRUE(a_impl.d_called());
-}
-
-class PingTestImpl : public sample::PingTest {
- public:
-  explicit PingTestImpl(InterfaceRequest<sample::PingTest> request)
-      : binding_(this, std::move(request)) {}
-  ~PingTestImpl() override {}
-
- private:
-  // sample::PingTest:
-  void Ping(const PingCallback& callback) override { callback.Run(); }
-
-  Binding<sample::PingTest> binding_;
-};
-
-// Tests that FuseProxy does what it's supposed to do.
-TEST_F(InterfacePtrTest, Fusion) {
-  sample::PingTestPtr proxy;
-  PingTestImpl impl(MakeRequest(&proxy));
-
-  // Create another PingTest pipe.
-  sample::PingTestPtr ptr;
-  sample::PingTestRequest request(&ptr);
-
-  // Fuse the new pipe to the one hanging off |impl|.
-  EXPECT_TRUE(FuseInterface(std::move(request), proxy.PassInterface()));
-
-  // Ping!
-  bool called = false;
-  base::RunLoop loop;
-  ptr->Ping(base::Bind(&SetFlagAndRunClosure, &called, loop.QuitClosure()));
-  loop.Run();
-  EXPECT_TRUE(called);
-}
-
-void Fail() {
-  FAIL() << "Unexpected connection error";
-}
-
-TEST_F(InterfacePtrTest, FlushForTesting) {
-  math::CalculatorPtr calc;
-  MathCalculatorImpl calc_impl(MakeRequest(&calc));
-  calc.set_connection_error_handler(base::Bind(&Fail));
-
-  MathCalculatorUI calculator_ui(std::move(calc));
-
-  calculator_ui.Add(2.0, base::Bind(&base::DoNothing));
-  calculator_ui.GetInterfacePtr().FlushForTesting();
-  EXPECT_EQ(2.0, calculator_ui.GetOutput());
-
-  calculator_ui.Multiply(5.0, base::Bind(&base::DoNothing));
-  calculator_ui.GetInterfacePtr().FlushForTesting();
-
-  EXPECT_EQ(10.0, calculator_ui.GetOutput());
-}
-
-void SetBool(bool* value) {
-  *value = true;
-}
-
-TEST_F(InterfacePtrTest, FlushForTestingWithClosedPeer) {
-  math::CalculatorPtr calc;
-  MakeRequest(&calc);
-  bool called = false;
-  calc.set_connection_error_handler(base::Bind(&SetBool, &called));
-  calc.FlushForTesting();
-  EXPECT_TRUE(called);
-  calc.FlushForTesting();
-}
-
-TEST_F(InterfacePtrTest, ConnectionErrorWithReason) {
-  math::CalculatorPtr calc;
-  MathCalculatorImpl calc_impl(MakeRequest(&calc));
-
-  base::RunLoop run_loop;
-  calc.set_connection_error_with_reason_handler(base::Bind(
-      [](const base::Closure& quit_closure, uint32_t custom_reason,
-         const std::string& description) {
-        EXPECT_EQ(42u, custom_reason);
-        EXPECT_EQ("hey", description);
-        quit_closure.Run();
-      },
-      run_loop.QuitClosure()));
-
-  calc_impl.binding()->CloseWithReason(42u, "hey");
-
-  run_loop.Run();
-}
-
-TEST_F(InterfacePtrTest, InterfaceRequestResetWithReason) {
-  math::CalculatorPtr calc;
-  auto request = MakeRequest(&calc);
-
-  base::RunLoop run_loop;
-  calc.set_connection_error_with_reason_handler(base::Bind(
-      [](const base::Closure& quit_closure, uint32_t custom_reason,
-         const std::string& description) {
-        EXPECT_EQ(88u, custom_reason);
-        EXPECT_EQ("greetings", description);
-        quit_closure.Run();
-      },
-      run_loop.QuitClosure()));
-
-  request.ResetWithReason(88u, "greetings");
-
-  run_loop.Run();
-}
-
-TEST_F(InterfacePtrTest, CallbackIsPassedInterfacePtr) {
-  sample::PingTestPtr ptr;
-  sample::PingTestRequest request(&ptr);
-
-  base::RunLoop run_loop;
-
-  // Make a call with the proxy's lifetime bound to the response callback.
-  sample::PingTest* raw_proxy = ptr.get();
-  ptr.set_connection_error_handler(run_loop.QuitClosure());
-  raw_proxy->Ping(
-      base::Bind([](sample::PingTestPtr ptr) {}, base::Passed(&ptr)));
-
-  // Trigger an error on |ptr|. This will ultimately lead to the proxy's
-  // response callbacks being destroyed, which will in turn lead to the proxy
-  // being destroyed. This should not crash.
-  request.PassMessagePipe();
-  run_loop.Run();
-}
-
-TEST_F(InterfacePtrTest, ConnectionErrorHandlerOwnsInterfacePtr) {
-  sample::PingTestPtr* ptr = new sample::PingTestPtr;
-  sample::PingTestRequest request(ptr);
-
-  base::RunLoop run_loop;
-
-  // Make a call with |ptr|'s lifetime bound to the connection error handler
-  // callback.
-  ptr->set_connection_error_handler(base::Bind(
-      [](const base::Closure& quit, sample::PingTestPtr* ptr) {
-        ptr->reset();
-        quit.Run();
-      },
-      run_loop.QuitClosure(), base::Owned(ptr)));
-
-  // Trigger an error on |ptr|. In the error handler |ptr| is reset. This
-  // shouldn't immediately destroy the callback (and |ptr| that it owns), before
-  // the callback is completed.
-  request.PassMessagePipe();
-  run_loop.Run();
-}
-
-TEST_F(InterfacePtrTest, ThreadSafeInterfacePointer) {
-  math::CalculatorPtr ptr;
-  MathCalculatorImpl calc_impl(MakeRequest(&ptr));
-  scoped_refptr<math::ThreadSafeCalculatorPtr> thread_safe_ptr =
-      math::ThreadSafeCalculatorPtr::Create(std::move(ptr));
-
-  base::RunLoop run_loop;
-
-  // Create and start the thread from where we'll call the interface pointer.
-  base::Thread other_thread("service test thread");
-  other_thread.Start();
-
-  auto run_method = base::Bind(
-      [](const scoped_refptr<base::TaskRunner>& main_task_runner,
-         const base::Closure& quit_closure,
-         const scoped_refptr<math::ThreadSafeCalculatorPtr>& thread_safe_ptr) {
-        auto calc_callback = base::Bind(
-            [](const scoped_refptr<base::TaskRunner>& main_task_runner,
-               const base::Closure& quit_closure,
-               base::PlatformThreadId thread_id,
-               double result) {
-              EXPECT_EQ(123, result);
-              // Validate the callback is invoked on the calling thread.
-              EXPECT_EQ(thread_id, base::PlatformThread::CurrentId());
-              // Notify the run_loop to quit.
-              main_task_runner->PostTask(FROM_HERE, quit_closure);
-            });
-        (*thread_safe_ptr)->Add(
-            123, base::Bind(calc_callback, main_task_runner, quit_closure,
-                            base::PlatformThread::CurrentId()));
-      },
-      base::SequencedTaskRunnerHandle::Get(), run_loop.QuitClosure(),
-      thread_safe_ptr);
-  other_thread.message_loop()->task_runner()->PostTask(FROM_HERE, run_method);
-
-  // Block until the method callback is called on the background thread.
-  run_loop.Run();
-}
-
-TEST_F(InterfacePtrTest, ThreadSafeInterfacePointerWithTaskRunner) {
-  // Create and start the thread from where we'll bind the interface pointer.
-  base::Thread other_thread("service test thread");
-  other_thread.Start();
-  const scoped_refptr<base::SingleThreadTaskRunner>& other_thread_task_runner =
-      other_thread.message_loop()->task_runner();
-
-  math::CalculatorPtr ptr;
-  math::CalculatorRequest request(&ptr);
-
-  // Create a ThreadSafeInterfacePtr that we'll bind from a different thread.
-  scoped_refptr<math::ThreadSafeCalculatorPtr> thread_safe_ptr =
-      math::ThreadSafeCalculatorPtr::Create(ptr.PassInterface(),
-                                            other_thread_task_runner);
-  ASSERT_TRUE(thread_safe_ptr);
-
-  MathCalculatorImpl* math_calc_impl = nullptr;
-  {
-    base::RunLoop run_loop;
-    auto run_method = base::Bind(
-        [](const scoped_refptr<base::TaskRunner>& main_task_runner,
-           const base::Closure& quit_closure,
-           const scoped_refptr<math::ThreadSafeCalculatorPtr>& thread_safe_ptr,
-           math::CalculatorRequest request,
-           MathCalculatorImpl** math_calc_impl) {
-          math::CalculatorPtr ptr;
-          // In real life, the implementation would have a legitimate owner.
-          *math_calc_impl = new MathCalculatorImpl(std::move(request));
-          main_task_runner->PostTask(FROM_HERE, quit_closure);
-        },
-        base::SequencedTaskRunnerHandle::Get(), run_loop.QuitClosure(),
-        thread_safe_ptr, base::Passed(&request), &math_calc_impl);
-    other_thread.message_loop()->task_runner()->PostTask(FROM_HERE, run_method);
-    run_loop.Run();
-  }
-
-  {
-    // The interface ptr is bound, we can call methods on it.
-    auto calc_callback =
-        base::Bind([](const base::Closure& quit_closure, double result) {
-          EXPECT_EQ(123, result);
-          quit_closure.Run();
-        });
-    base::RunLoop run_loop;
-    (*thread_safe_ptr)
-        ->Add(123, base::Bind(calc_callback, run_loop.QuitClosure()));
-    // Block until the method callback is called.
-    run_loop.Run();
-  }
-
-  other_thread_task_runner->DeleteSoon(FROM_HERE, math_calc_impl);
-
-  // Reset the pointer now so the InterfacePtr associated resources can be
-  // deleted before the background thread's message loop is invalidated.
-  thread_safe_ptr = nullptr;
-}
-
-}  // namespace
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/map_unittest.cc b/mojo/public/cpp/bindings/tests/map_unittest.cc
deleted file mode 100644
index 8d630a5..0000000
--- a/mojo/public/cpp/bindings/tests/map_unittest.cc
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <stddef.h>
-#include <stdint.h>
-#include <unordered_map>
-#include <utility>
-
-#include "mojo/public/cpp/bindings/tests/rect_chromium.h"
-#include "mojo/public/interfaces/bindings/tests/rect.mojom.h"
-#include "mojo/public/interfaces/bindings/tests/test_structs.mojom.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace test {
-namespace {
-
-TEST(MapTest, StructKey) {
-  std::unordered_map<RectPtr, int32_t> map;
-  map.insert(std::make_pair(Rect::New(1, 2, 3, 4), 123));
-
-  RectPtr key = Rect::New(1, 2, 3, 4);
-  ASSERT_NE(map.end(), map.find(key));
-  ASSERT_EQ(123, map.find(key)->second);
-
-  map.erase(key);
-  ASSERT_EQ(0u, map.size());
-}
-
-TEST(MapTest, TypemappedStructKey) {
-  std::unordered_map<ContainsHashablePtr, int32_t> map;
-  map.insert(
-      std::make_pair(ContainsHashable::New(RectChromium(1, 2, 3, 4)), 123));
-
-  ContainsHashablePtr key = ContainsHashable::New(RectChromium(1, 2, 3, 4));
-  ASSERT_NE(map.end(), map.find(key));
-  ASSERT_EQ(123, map.find(key)->second);
-
-  map.erase(key);
-  ASSERT_EQ(0u, map.size());
-}
-
-}  // namespace
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/message_queue.cc b/mojo/public/cpp/bindings/tests/message_queue.cc
deleted file mode 100644
index 32ed763..0000000
--- a/mojo/public/cpp/bindings/tests/message_queue.cc
+++ /dev/null
@@ -1,39 +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 "mojo/public/cpp/bindings/tests/message_queue.h"
-
-#include "base/logging.h"
-#include "mojo/public/cpp/bindings/message.h"
-
-namespace mojo {
-namespace test {
-
-MessageQueue::MessageQueue() {
-}
-
-MessageQueue::~MessageQueue() {
-}
-
-bool MessageQueue::IsEmpty() const {
-  return queue_.empty();
-}
-
-void MessageQueue::Push(Message* message) {
-  queue_.emplace(std::move(*message));
-}
-
-void MessageQueue::Pop(Message* message) {
-  DCHECK(!queue_.empty());
-  *message = std::move(queue_.front());
-  Pop();
-}
-
-void MessageQueue::Pop() {
-  DCHECK(!queue_.empty());
-  queue_.pop();
-}
-
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/message_queue.h b/mojo/public/cpp/bindings/tests/message_queue.h
deleted file mode 100644
index 8f13f7a..0000000
--- a/mojo/public/cpp/bindings/tests/message_queue.h
+++ /dev/null
@@ -1,44 +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 MOJO_PUBLIC_CPP_BINDINGS_TESTS_MESSAGE_QUEUE_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_TESTS_MESSAGE_QUEUE_H_
-
-#include <queue>
-
-#include "base/macros.h"
-#include "mojo/public/cpp/bindings/message.h"
-
-namespace mojo {
-namespace test {
-
-// A queue for Message objects.
-class MessageQueue {
- public:
-  MessageQueue();
-  ~MessageQueue();
-
-  bool IsEmpty() const;
-
-  // This method copies the message data and steals ownership of its handles.
-  void Push(Message* message);
-
-  // Removes the next message from the queue, copying its data and transferring
-  // ownership of its handles to the given |message|.
-  void Pop(Message* message);
-
-  size_t size() const { return queue_.size(); }
-
- private:
-  void Pop();
-
-  std::queue<Message> queue_;
-
-  DISALLOW_COPY_AND_ASSIGN(MessageQueue);
-};
-
-}  // namespace test
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_TESTS_MESSAGE_QUEUE_H_
diff --git a/mojo/public/cpp/bindings/tests/mojo_test_blink_export.h b/mojo/public/cpp/bindings/tests/mojo_test_blink_export.h
deleted file mode 100644
index b3bbe27..0000000
--- a/mojo/public/cpp/bindings/tests/mojo_test_blink_export.h
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_TESTS_MOJO_TEST_BLINK_EXPORT_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_TESTS_MOJO_TEST_BLINK_EXPORT_H_
-
-#if defined(COMPONENT_BUILD)
-#if defined(WIN32)
-
-#if defined(MOJO_TEST_BLINK_IMPLEMENTATION)
-#define MOJO_TEST_BLINK_EXPORT __declspec(dllexport)
-#else
-#define MOJO_TEST_BLINK_EXPORT __declspec(dllimport)
-#endif  // defined(MOJO_TEST_BLINK_IMPLEMENTATION)
-
-#else  // defined(WIN32)
-#if defined(MOJO_TEST_BLINK_IMPLEMENTATION)
-#define MOJO_TEST_BLINK_EXPORT __attribute__((visibility("default")))
-#else
-#define MOJO_TEST_BLINK_EXPORT
-#endif
-#endif
-
-#else  // defined(COMPONENT_BUILD)
-#define MOJO_TEST_BLINK_EXPORT
-#endif
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_TESTS_MOJO_TEST_BLINK_EXPORT_H_
diff --git a/mojo/public/cpp/bindings/tests/mojo_test_export.h b/mojo/public/cpp/bindings/tests/mojo_test_export.h
deleted file mode 100644
index a48a1ba..0000000
--- a/mojo/public/cpp/bindings/tests/mojo_test_export.h
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_TESTS_MOJO_TEST_EXPORT_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_TESTS_MOJO_TEST_EXPORT_H_
-
-#if defined(COMPONENT_BUILD)
-#if defined(WIN32)
-
-#if defined(MOJO_TEST_IMPLEMENTATION)
-#define MOJO_TEST_EXPORT __declspec(dllexport)
-#else
-#define MOJO_TEST_EXPORT __declspec(dllimport)
-#endif  // defined(MOJO_TEST_IMPLEMENTATION)
-
-#else  // defined(WIN32)
-#if defined(MOJO_TEST_IMPLEMENTATION)
-#define MOJO_TEST_EXPORT __attribute__((visibility("default")))
-#else
-#define MOJO_TEST_EXPORT
-#endif
-#endif
-
-#else  // defined(COMPONENT_BUILD)
-#define MOJO_TEST_EXPORT
-#endif
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_TESTS_MOJO_TEST_EXPORT_H_
diff --git a/mojo/public/cpp/bindings/tests/multiplex_router_unittest.cc b/mojo/public/cpp/bindings/tests/multiplex_router_unittest.cc
deleted file mode 100644
index 8950928..0000000
--- a/mojo/public/cpp/bindings/tests/multiplex_router_unittest.cc
+++ /dev/null
@@ -1,314 +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 "mojo/public/cpp/bindings/lib/multiplex_router.h"
-
-#include <utility>
-
-#include "base/bind.h"
-#include "base/memory/ptr_util.h"
-#include "base/memory/ref_counted.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "mojo/public/cpp/bindings/interface_endpoint_client.h"
-#include "mojo/public/cpp/bindings/message.h"
-#include "mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h"
-#include "mojo/public/cpp/bindings/tests/message_queue.h"
-#include "mojo/public/cpp/bindings/tests/router_test_util.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace test {
-namespace {
-
-using mojo::internal::MultiplexRouter;
-
-class MultiplexRouterTest : public testing::Test {
- public:
-  MultiplexRouterTest() {}
-
-  void SetUp() override {
-    MessagePipe pipe;
-    router0_ = new MultiplexRouter(std::move(pipe.handle0),
-                                   MultiplexRouter::MULTI_INTERFACE, false,
-                                   base::ThreadTaskRunnerHandle::Get());
-    router1_ = new MultiplexRouter(std::move(pipe.handle1),
-                                   MultiplexRouter::MULTI_INTERFACE, true,
-                                   base::ThreadTaskRunnerHandle::Get());
-    ScopedInterfaceEndpointHandle::CreatePairPendingAssociation(&endpoint0_,
-                                                                &endpoint1_);
-    auto id = router0_->AssociateInterface(std::move(endpoint1_));
-    endpoint1_ = router1_->CreateLocalEndpointHandle(id);
-  }
-
-  void TearDown() override {}
-
-  void PumpMessages() { base::RunLoop().RunUntilIdle(); }
-
- protected:
-  scoped_refptr<MultiplexRouter> router0_;
-  scoped_refptr<MultiplexRouter> router1_;
-  ScopedInterfaceEndpointHandle endpoint0_;
-  ScopedInterfaceEndpointHandle endpoint1_;
-
- private:
-  base::MessageLoop loop_;
-};
-
-TEST_F(MultiplexRouterTest, BasicRequestResponse) {
-  InterfaceEndpointClient client0(std::move(endpoint0_), nullptr,
-                                  base::MakeUnique<PassThroughFilter>(), false,
-                                  base::ThreadTaskRunnerHandle::Get(), 0u);
-  ResponseGenerator generator;
-  InterfaceEndpointClient client1(std::move(endpoint1_), &generator,
-                                  base::MakeUnique<PassThroughFilter>(), false,
-                                  base::ThreadTaskRunnerHandle::Get(), 0u);
-
-  Message request;
-  AllocRequestMessage(1, "hello", &request);
-
-  MessageQueue message_queue;
-  base::RunLoop run_loop;
-  client0.AcceptWithResponder(
-      &request, base::MakeUnique<MessageAccumulator>(&message_queue,
-                                                     run_loop.QuitClosure()));
-
-  run_loop.Run();
-
-  EXPECT_FALSE(message_queue.IsEmpty());
-
-  Message response;
-  message_queue.Pop(&response);
-
-  EXPECT_EQ(std::string("hello world!"),
-            std::string(reinterpret_cast<const char*>(response.payload())));
-
-  // Send a second message on the pipe.
-  Message request2;
-  AllocRequestMessage(1, "hello again", &request2);
-
-  base::RunLoop run_loop2;
-  client0.AcceptWithResponder(
-      &request2, base::MakeUnique<MessageAccumulator>(&message_queue,
-                                                      run_loop2.QuitClosure()));
-
-  run_loop2.Run();
-
-  EXPECT_FALSE(message_queue.IsEmpty());
-
-  message_queue.Pop(&response);
-
-  EXPECT_EQ(std::string("hello again world!"),
-            std::string(reinterpret_cast<const char*>(response.payload())));
-}
-
-TEST_F(MultiplexRouterTest, BasicRequestResponse_Synchronous) {
-  InterfaceEndpointClient client0(std::move(endpoint0_), nullptr,
-                                  base::MakeUnique<PassThroughFilter>(), false,
-                                  base::ThreadTaskRunnerHandle::Get(), 0u);
-  ResponseGenerator generator;
-  InterfaceEndpointClient client1(std::move(endpoint1_), &generator,
-                                  base::MakeUnique<PassThroughFilter>(), false,
-                                  base::ThreadTaskRunnerHandle::Get(), 0u);
-
-  Message request;
-  AllocRequestMessage(1, "hello", &request);
-
-  MessageQueue message_queue;
-  client0.AcceptWithResponder(
-      &request, base::MakeUnique<MessageAccumulator>(&message_queue));
-
-  router1_->WaitForIncomingMessage(MOJO_DEADLINE_INDEFINITE);
-  router0_->WaitForIncomingMessage(MOJO_DEADLINE_INDEFINITE);
-
-  EXPECT_FALSE(message_queue.IsEmpty());
-
-  Message response;
-  message_queue.Pop(&response);
-
-  EXPECT_EQ(std::string("hello world!"),
-            std::string(reinterpret_cast<const char*>(response.payload())));
-
-  // Send a second message on the pipe.
-  Message request2;
-  AllocRequestMessage(1, "hello again", &request2);
-
-  client0.AcceptWithResponder(
-      &request2, base::MakeUnique<MessageAccumulator>(&message_queue));
-
-  router1_->WaitForIncomingMessage(MOJO_DEADLINE_INDEFINITE);
-  router0_->WaitForIncomingMessage(MOJO_DEADLINE_INDEFINITE);
-
-  EXPECT_FALSE(message_queue.IsEmpty());
-
-  message_queue.Pop(&response);
-
-  EXPECT_EQ(std::string("hello again world!"),
-            std::string(reinterpret_cast<const char*>(response.payload())));
-}
-
-// Tests MultiplexRouter using the LazyResponseGenerator. The responses will not
-// be sent until after the requests have been accepted.
-TEST_F(MultiplexRouterTest, LazyResponses) {
-  InterfaceEndpointClient client0(
-      std::move(endpoint0_), nullptr, base::WrapUnique(new PassThroughFilter()),
-      false, base::ThreadTaskRunnerHandle::Get(), 0u);
-  base::RunLoop run_loop;
-  LazyResponseGenerator generator(run_loop.QuitClosure());
-  InterfaceEndpointClient client1(std::move(endpoint1_), &generator,
-                                  base::WrapUnique(new PassThroughFilter()),
-                                  false, base::ThreadTaskRunnerHandle::Get(),
-                                  0u);
-
-  Message request;
-  AllocRequestMessage(1, "hello", &request);
-
-  MessageQueue message_queue;
-  base::RunLoop run_loop2;
-  client0.AcceptWithResponder(
-      &request, base::MakeUnique<MessageAccumulator>(&message_queue,
-                                                     run_loop2.QuitClosure()));
-  run_loop.Run();
-
-  // The request has been received but the response has not been sent yet.
-  EXPECT_TRUE(message_queue.IsEmpty());
-
-  // Send the response.
-  EXPECT_TRUE(generator.responder_is_valid());
-  generator.CompleteWithResponse();
-  run_loop2.Run();
-
-  // Check the response.
-  EXPECT_FALSE(message_queue.IsEmpty());
-  Message response;
-  message_queue.Pop(&response);
-  EXPECT_EQ(std::string("hello world!"),
-            std::string(reinterpret_cast<const char*>(response.payload())));
-
-  // Send a second message on the pipe.
-  base::RunLoop run_loop3;
-  generator.set_closure(run_loop3.QuitClosure());
-  Message request2;
-  AllocRequestMessage(1, "hello again", &request2);
-
-  base::RunLoop run_loop4;
-  client0.AcceptWithResponder(
-      &request2, base::MakeUnique<MessageAccumulator>(&message_queue,
-                                                      run_loop4.QuitClosure()));
-  run_loop3.Run();
-
-  // The request has been received but the response has not been sent yet.
-  EXPECT_TRUE(message_queue.IsEmpty());
-
-  // Send the second response.
-  EXPECT_TRUE(generator.responder_is_valid());
-  generator.CompleteWithResponse();
-  run_loop4.Run();
-
-  // Check the second response.
-  EXPECT_FALSE(message_queue.IsEmpty());
-  message_queue.Pop(&response);
-  EXPECT_EQ(std::string("hello again world!"),
-            std::string(reinterpret_cast<const char*>(response.payload())));
-}
-
-void ForwardErrorHandler(bool* called, const base::Closure& callback) {
-  *called = true;
-  callback.Run();
-}
-
-// Tests that if the receiving application destroys the responder_ without
-// sending a response, then we trigger connection error at both sides. Moreover,
-// both sides still appear to have a valid message pipe handle bound.
-TEST_F(MultiplexRouterTest, MissingResponses) {
-  base::RunLoop run_loop0, run_loop1;
-  InterfaceEndpointClient client0(
-      std::move(endpoint0_), nullptr, base::WrapUnique(new PassThroughFilter()),
-      false, base::ThreadTaskRunnerHandle::Get(), 0u);
-  bool error_handler_called0 = false;
-  client0.set_connection_error_handler(
-      base::Bind(&ForwardErrorHandler, &error_handler_called0,
-                 run_loop0.QuitClosure()));
-
-  base::RunLoop run_loop3;
-  LazyResponseGenerator generator(run_loop3.QuitClosure());
-  InterfaceEndpointClient client1(std::move(endpoint1_), &generator,
-                                  base::WrapUnique(new PassThroughFilter()),
-                                  false, base::ThreadTaskRunnerHandle::Get(),
-                                  0u);
-  bool error_handler_called1 = false;
-  client1.set_connection_error_handler(
-      base::Bind(&ForwardErrorHandler, &error_handler_called1,
-                 run_loop1.QuitClosure()));
-
-  Message request;
-  AllocRequestMessage(1, "hello", &request);
-
-  MessageQueue message_queue;
-  client0.AcceptWithResponder(
-      &request, base::MakeUnique<MessageAccumulator>(&message_queue));
-  run_loop3.Run();
-
-  // The request has been received but no response has been sent.
-  EXPECT_TRUE(message_queue.IsEmpty());
-
-  // Destroy the responder MessagerReceiver but don't send any response.
-  generator.CompleteWithoutResponse();
-  run_loop0.Run();
-  run_loop1.Run();
-
-  // Check that no response was received.
-  EXPECT_TRUE(message_queue.IsEmpty());
-
-  // Connection error handler is called at both sides.
-  EXPECT_TRUE(error_handler_called0);
-  EXPECT_TRUE(error_handler_called1);
-
-  // The error flag is set at both sides.
-  EXPECT_TRUE(client0.encountered_error());
-  EXPECT_TRUE(client1.encountered_error());
-
-  // The message pipe handle is valid at both sides.
-  EXPECT_TRUE(router0_->is_valid());
-  EXPECT_TRUE(router1_->is_valid());
-}
-
-TEST_F(MultiplexRouterTest, LateResponse) {
-  // Test that things won't blow up if we try to send a message to a
-  // MessageReceiver, which was given to us via AcceptWithResponder,
-  // after the router has gone away.
-
-  base::RunLoop run_loop;
-  LazyResponseGenerator generator(run_loop.QuitClosure());
-  {
-    InterfaceEndpointClient client0(
-        std::move(endpoint0_), nullptr, base::MakeUnique<PassThroughFilter>(),
-        false, base::ThreadTaskRunnerHandle::Get(), 0u);
-    InterfaceEndpointClient client1(std::move(endpoint1_), &generator,
-                                    base::MakeUnique<PassThroughFilter>(),
-                                    false, base::ThreadTaskRunnerHandle::Get(),
-                                    0u);
-
-    Message request;
-    AllocRequestMessage(1, "hello", &request);
-
-    MessageQueue message_queue;
-    client0.AcceptWithResponder(
-        &request, base::MakeUnique<MessageAccumulator>(&message_queue));
-
-    run_loop.Run();
-
-    EXPECT_TRUE(generator.has_responder());
-  }
-
-  EXPECT_FALSE(generator.responder_is_valid());
-  generator.CompleteWithResponse();  // This should end up doing nothing.
-}
-
-// TODO(yzshen): add more tests.
-
-}  // namespace
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/pickle_unittest.cc b/mojo/public/cpp/bindings/tests/pickle_unittest.cc
deleted file mode 100644
index a5947ce..0000000
--- a/mojo/public/cpp/bindings/tests/pickle_unittest.cc
+++ /dev/null
@@ -1,403 +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 <string>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/logging.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "mojo/public/cpp/bindings/binding_set.h"
-#include "mojo/public/cpp/bindings/interface_request.h"
-#include "mojo/public/cpp/bindings/tests/pickled_types_blink.h"
-#include "mojo/public/cpp/bindings/tests/pickled_types_chromium.h"
-#include "mojo/public/cpp/bindings/tests/variant_test_util.h"
-#include "mojo/public/interfaces/bindings/tests/test_native_types.mojom-blink.h"
-#include "mojo/public/interfaces/bindings/tests/test_native_types.mojom.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace test {
-namespace {
-
-template <typename T>
-void DoExpectResult(int foo, int bar, const base::Closure& callback, T actual) {
-  EXPECT_EQ(foo, actual.foo());
-  EXPECT_EQ(bar, actual.bar());
-  callback.Run();
-}
-
-template <typename T>
-base::Callback<void(T)> ExpectResult(const T& t,
-                                     const base::Closure& callback) {
-  return base::Bind(&DoExpectResult<T>, t.foo(), t.bar(), callback);
-}
-
-template <typename T>
-void DoFail(const std::string& reason, T) {
-  EXPECT_TRUE(false) << reason;
-}
-
-template <typename T>
-base::Callback<void(T)> Fail(const std::string& reason) {
-  return base::Bind(&DoFail<T>, reason);
-}
-
-template <typename T>
-void DoExpectEnumResult(T expected, const base::Closure& callback, T actual) {
-  EXPECT_EQ(expected, actual);
-  callback.Run();
-}
-
-template <typename T>
-base::Callback<void(T)> ExpectEnumResult(T t, const base::Closure& callback) {
-  return base::Bind(&DoExpectEnumResult<T>, t, callback);
-}
-
-template <typename T>
-void DoEnumFail(const std::string& reason, T) {
-  EXPECT_TRUE(false) << reason;
-}
-
-template <typename T>
-base::Callback<void(T)> EnumFail(const std::string& reason) {
-  return base::Bind(&DoEnumFail<T>, reason);
-}
-
-template <typename T>
-void ExpectError(InterfacePtr<T>* proxy, const base::Closure& callback) {
-  proxy->set_connection_error_handler(callback);
-}
-
-template <typename Func, typename Arg>
-void RunSimpleLambda(Func func, Arg arg) { func(std::move(arg)); }
-
-template <typename Arg, typename Func>
-base::Callback<void(Arg)> BindSimpleLambda(Func func) {
-  return base::Bind(&RunSimpleLambda<Func, Arg>, func);
-}
-
-// This implements the generated Chromium variant of PicklePasser.
-class ChromiumPicklePasserImpl : public PicklePasser {
- public:
-  ChromiumPicklePasserImpl() {}
-
-  // mojo::test::PicklePasser:
-  void PassPickledStruct(PickledStructChromium pickle,
-                         const PassPickledStructCallback& callback) override {
-    callback.Run(std::move(pickle));
-  }
-
-  void PassPickledEnum(PickledEnumChromium pickle,
-                       const PassPickledEnumCallback& callback) override {
-    callback.Run(pickle);
-  }
-
-  void PassPickleContainer(
-      PickleContainerPtr container,
-      const PassPickleContainerCallback& callback) override {
-    callback.Run(std::move(container));
-  }
-
-  void PassPickles(std::vector<PickledStructChromium> pickles,
-                   const PassPicklesCallback& callback) override {
-    callback.Run(std::move(pickles));
-  }
-
-  void PassPickleArrays(
-      std::vector<std::vector<PickledStructChromium>> pickle_arrays,
-      const PassPickleArraysCallback& callback) override {
-    callback.Run(std::move(pickle_arrays));
-  }
-};
-
-// This implements the generated Blink variant of PicklePasser.
-class BlinkPicklePasserImpl : public blink::PicklePasser {
- public:
-  BlinkPicklePasserImpl() {}
-
-  // mojo::test::blink::PicklePasser:
-  void PassPickledStruct(PickledStructBlink pickle,
-                         const PassPickledStructCallback& callback) override {
-    callback.Run(std::move(pickle));
-  }
-
-  void PassPickledEnum(PickledEnumBlink pickle,
-                       const PassPickledEnumCallback& callback) override {
-    callback.Run(pickle);
-  }
-
-  void PassPickleContainer(
-      blink::PickleContainerPtr container,
-      const PassPickleContainerCallback& callback) override {
-    callback.Run(std::move(container));
-  }
-
-  void PassPickles(WTF::Vector<PickledStructBlink> pickles,
-                   const PassPicklesCallback& callback) override {
-    callback.Run(std::move(pickles));
-  }
-
-  void PassPickleArrays(
-      WTF::Vector<WTF::Vector<PickledStructBlink>> pickle_arrays,
-      const PassPickleArraysCallback& callback) override {
-    callback.Run(std::move(pickle_arrays));
-  }
-};
-
-// A test which runs both Chromium and Blink implementations of the
-// PicklePasser service.
-class PickleTest : public testing::Test {
- public:
-  PickleTest() {}
-
-  template <typename ProxyType = PicklePasser>
-  InterfacePtr<ProxyType> ConnectToChromiumService() {
-    InterfacePtr<ProxyType> proxy;
-    InterfaceRequest<ProxyType> request(&proxy);
-    chromium_bindings_.AddBinding(
-        &chromium_service_,
-        ConvertInterfaceRequest<PicklePasser>(std::move(request)));
-    return proxy;
-  }
-
-  template <typename ProxyType = blink::PicklePasser>
-  InterfacePtr<ProxyType> ConnectToBlinkService() {
-    InterfacePtr<ProxyType> proxy;
-    InterfaceRequest<ProxyType> request(&proxy);
-    blink_bindings_.AddBinding(
-        &blink_service_,
-        ConvertInterfaceRequest<blink::PicklePasser>(std::move(request)));
-    return proxy;
-  }
-
- private:
-  base::MessageLoop loop_;
-  ChromiumPicklePasserImpl chromium_service_;
-  BindingSet<PicklePasser> chromium_bindings_;
-  BlinkPicklePasserImpl blink_service_;
-  BindingSet<blink::PicklePasser> blink_bindings_;
-};
-
-}  // namespace
-
-TEST_F(PickleTest, ChromiumProxyToChromiumService) {
-  auto chromium_proxy = ConnectToChromiumService();
-  {
-    base::RunLoop loop;
-    chromium_proxy->PassPickledStruct(
-        PickledStructChromium(1, 2),
-        ExpectResult(PickledStructChromium(1, 2), loop.QuitClosure()));
-    loop.Run();
-  }
-  {
-    base::RunLoop loop;
-    chromium_proxy->PassPickledStruct(
-        PickledStructChromium(4, 5),
-        ExpectResult(PickledStructChromium(4, 5), loop.QuitClosure()));
-    loop.Run();
-  }
-
-  {
-    base::RunLoop loop;
-    chromium_proxy->PassPickledEnum(
-        PickledEnumChromium::VALUE_1,
-        ExpectEnumResult(PickledEnumChromium::VALUE_1, loop.QuitClosure()));
-    loop.Run();
-  }
-}
-
-TEST_F(PickleTest, ChromiumProxyToBlinkService) {
-  auto chromium_proxy = ConnectToBlinkService<PicklePasser>();
-  {
-    base::RunLoop loop;
-    chromium_proxy->PassPickledStruct(
-        PickledStructChromium(1, 2),
-        ExpectResult(PickledStructChromium(1, 2), loop.QuitClosure()));
-    loop.Run();
-  }
-  {
-    base::RunLoop loop;
-    chromium_proxy->PassPickledStruct(
-        PickledStructChromium(4, 5),
-        ExpectResult(PickledStructChromium(4, 5), loop.QuitClosure()));
-    loop.Run();
-  }
-  // The Blink service should drop our connection because the
-  // PickledStructBlink ParamTraits deserializer rejects negative values.
-  {
-    base::RunLoop loop;
-    chromium_proxy->PassPickledStruct(
-        PickledStructChromium(-1, -1),
-        Fail<PickledStructChromium>("Blink service should reject this."));
-    ExpectError(&chromium_proxy, loop.QuitClosure());
-    loop.Run();
-  }
-
-  chromium_proxy = ConnectToBlinkService<PicklePasser>();
-  {
-    base::RunLoop loop;
-    chromium_proxy->PassPickledEnum(
-        PickledEnumChromium::VALUE_0,
-        ExpectEnumResult(PickledEnumChromium::VALUE_0, loop.QuitClosure()));
-    loop.Run();
-  }
-
-  // The Blink service should drop our connection because the
-  // PickledEnumBlink ParamTraits deserializer rejects this value.
-  {
-    base::RunLoop loop;
-    chromium_proxy->PassPickledEnum(
-        PickledEnumChromium::VALUE_2,
-        EnumFail<PickledEnumChromium>("Blink service should reject this."));
-    ExpectError(&chromium_proxy, loop.QuitClosure());
-    loop.Run();
-  }
-}
-
-TEST_F(PickleTest, BlinkProxyToBlinkService) {
-  auto blink_proxy = ConnectToBlinkService();
-  {
-    base::RunLoop loop;
-    blink_proxy->PassPickledStruct(
-        PickledStructBlink(1, 1),
-        ExpectResult(PickledStructBlink(1, 1), loop.QuitClosure()));
-    loop.Run();
-  }
-
-  {
-    base::RunLoop loop;
-    blink_proxy->PassPickledEnum(
-        PickledEnumBlink::VALUE_0,
-        ExpectEnumResult(PickledEnumBlink::VALUE_0, loop.QuitClosure()));
-    loop.Run();
-  }
-}
-
-TEST_F(PickleTest, BlinkProxyToChromiumService) {
-  auto blink_proxy = ConnectToChromiumService<blink::PicklePasser>();
-  {
-    base::RunLoop loop;
-    blink_proxy->PassPickledStruct(
-        PickledStructBlink(1, 1),
-        ExpectResult(PickledStructBlink(1, 1), loop.QuitClosure()));
-    loop.Run();
-  }
-
-  {
-    base::RunLoop loop;
-    blink_proxy->PassPickledEnum(
-        PickledEnumBlink::VALUE_1,
-        ExpectEnumResult(PickledEnumBlink::VALUE_1, loop.QuitClosure()));
-    loop.Run();
-  }
-}
-
-TEST_F(PickleTest, PickleArray) {
-  auto proxy = ConnectToChromiumService();
-  auto pickles = std::vector<PickledStructChromium>(2);
-  pickles[0].set_foo(1);
-  pickles[0].set_bar(2);
-  pickles[0].set_baz(100);
-  pickles[1].set_foo(3);
-  pickles[1].set_bar(4);
-  pickles[1].set_baz(100);
-  {
-    base::RunLoop run_loop;
-    // Verify that the array of pickled structs can be serialized and
-    // deserialized intact. This ensures that the ParamTraits are actually used
-    // rather than doing a byte-for-byte copy of the element data, beacuse the
-    // |baz| field should never be serialized.
-    proxy->PassPickles(std::move(pickles),
-                       BindSimpleLambda<std::vector<PickledStructChromium>>(
-                           [&](std::vector<PickledStructChromium> passed) {
-                             ASSERT_EQ(2u, passed.size());
-                             EXPECT_EQ(1, passed[0].foo());
-                             EXPECT_EQ(2, passed[0].bar());
-                             EXPECT_EQ(0, passed[0].baz());
-                             EXPECT_EQ(3, passed[1].foo());
-                             EXPECT_EQ(4, passed[1].bar());
-                             EXPECT_EQ(0, passed[1].baz());
-                             run_loop.Quit();
-                           }));
-    run_loop.Run();
-  }
-}
-
-TEST_F(PickleTest, PickleArrayArray) {
-  auto proxy = ConnectToChromiumService();
-  auto pickle_arrays = std::vector<std::vector<PickledStructChromium>>(2);
-  for (size_t i = 0; i < 2; ++i)
-    pickle_arrays[i] = std::vector<PickledStructChromium>(2);
-
-  pickle_arrays[0][0].set_foo(1);
-  pickle_arrays[0][0].set_bar(2);
-  pickle_arrays[0][0].set_baz(100);
-  pickle_arrays[0][1].set_foo(3);
-  pickle_arrays[0][1].set_bar(4);
-  pickle_arrays[0][1].set_baz(100);
-  pickle_arrays[1][0].set_foo(5);
-  pickle_arrays[1][0].set_bar(6);
-  pickle_arrays[1][0].set_baz(100);
-  pickle_arrays[1][1].set_foo(7);
-  pickle_arrays[1][1].set_bar(8);
-  pickle_arrays[1][1].set_baz(100);
-  {
-    base::RunLoop run_loop;
-    // Verify that the array-of-arrays serializes and deserializes properly.
-    proxy->PassPickleArrays(
-        std::move(pickle_arrays),
-        BindSimpleLambda<std::vector<std::vector<PickledStructChromium>>>(
-            [&](std::vector<std::vector<PickledStructChromium>> passed) {
-              ASSERT_EQ(2u, passed.size());
-              ASSERT_EQ(2u, passed[0].size());
-              ASSERT_EQ(2u, passed[1].size());
-              EXPECT_EQ(1, passed[0][0].foo());
-              EXPECT_EQ(2, passed[0][0].bar());
-              EXPECT_EQ(0, passed[0][0].baz());
-              EXPECT_EQ(3, passed[0][1].foo());
-              EXPECT_EQ(4, passed[0][1].bar());
-              EXPECT_EQ(0, passed[0][1].baz());
-              EXPECT_EQ(5, passed[1][0].foo());
-              EXPECT_EQ(6, passed[1][0].bar());
-              EXPECT_EQ(0, passed[1][0].baz());
-              EXPECT_EQ(7, passed[1][1].foo());
-              EXPECT_EQ(8, passed[1][1].bar());
-              EXPECT_EQ(0, passed[1][1].baz());
-              run_loop.Quit();
-            }));
-    run_loop.Run();
-  }
-}
-
-TEST_F(PickleTest, PickleContainer) {
-  auto proxy = ConnectToChromiumService();
-  PickleContainerPtr pickle_container = PickleContainer::New();
-  pickle_container->f_struct.set_foo(42);
-  pickle_container->f_struct.set_bar(43);
-  pickle_container->f_struct.set_baz(44);
-  pickle_container->f_enum = PickledEnumChromium::VALUE_1;
-  EXPECT_TRUE(pickle_container.Equals(pickle_container));
-  EXPECT_FALSE(pickle_container.Equals(PickleContainer::New()));
-  {
-    base::RunLoop run_loop;
-    proxy->PassPickleContainer(std::move(pickle_container),
-                               BindSimpleLambda<PickleContainerPtr>(
-                                   [&](PickleContainerPtr passed) {
-                                     ASSERT_FALSE(passed.is_null());
-                                     EXPECT_EQ(42, passed->f_struct.foo());
-                                     EXPECT_EQ(43, passed->f_struct.bar());
-                                     EXPECT_EQ(0, passed->f_struct.baz());
-                                     EXPECT_EQ(PickledEnumChromium::VALUE_1,
-                                               passed->f_enum);
-                                     run_loop.Quit();
-                                   }));
-    run_loop.Run();
-  }
-}
-
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/pickled_types_blink.cc b/mojo/public/cpp/bindings/tests/pickled_types_blink.cc
deleted file mode 100644
index 7e55650..0000000
--- a/mojo/public/cpp/bindings/tests/pickled_types_blink.cc
+++ /dev/null
@@ -1,67 +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 "mojo/public/cpp/bindings/tests/pickled_types_blink.h"
-
-#include "base/logging.h"
-#include "base/pickle.h"
-
-namespace mojo {
-namespace test {
-
-PickledStructBlink::PickledStructBlink() {}
-
-PickledStructBlink::PickledStructBlink(int foo, int bar)
-    : foo_(foo), bar_(bar) {
-  DCHECK_GE(foo_, 0);
-  DCHECK_GE(bar_, 0);
-}
-
-PickledStructBlink::~PickledStructBlink() {}
-
-}  // namespace test
-}  // namespace mojo
-
-namespace IPC {
-
-void ParamTraits<mojo::test::PickledStructBlink>::GetSize(
-    base::PickleSizer* sizer,
-    const param_type& p) {
-  sizer->AddInt();
-  sizer->AddInt();
-}
-
-void ParamTraits<mojo::test::PickledStructBlink>::Write(base::Pickle* m,
-                                                        const param_type& p) {
-  m->WriteInt(p.foo());
-  m->WriteInt(p.bar());
-}
-
-bool ParamTraits<mojo::test::PickledStructBlink>::Read(
-    const base::Pickle* m,
-    base::PickleIterator* iter,
-    param_type* p) {
-  int foo, bar;
-  if (!iter->ReadInt(&foo) || !iter->ReadInt(&bar) || foo < 0 || bar < 0)
-    return false;
-
-  p->set_foo(foo);
-  p->set_bar(bar);
-  return true;
-}
-
-#include "ipc/param_traits_size_macros.h"
-IPC_ENUM_TRAITS_MAX_VALUE(mojo::test::PickledEnumBlink,
-                          mojo::test::PickledEnumBlink::VALUE_1)
-#include "ipc/param_traits_write_macros.h"
-IPC_ENUM_TRAITS_MAX_VALUE(mojo::test::PickledEnumBlink,
-                          mojo::test::PickledEnumBlink::VALUE_1)
-#include "ipc/param_traits_read_macros.h"
-IPC_ENUM_TRAITS_MAX_VALUE(mojo::test::PickledEnumBlink,
-                          mojo::test::PickledEnumBlink::VALUE_1)
-#include "ipc/param_traits_log_macros.h"
-IPC_ENUM_TRAITS_MAX_VALUE(mojo::test::PickledEnumBlink,
-                          mojo::test::PickledEnumBlink::VALUE_1)
-
-}  // namespace IPC
diff --git a/mojo/public/cpp/bindings/tests/pickled_types_blink.h b/mojo/public/cpp/bindings/tests/pickled_types_blink.h
deleted file mode 100644
index 37e9e70..0000000
--- a/mojo/public/cpp/bindings/tests/pickled_types_blink.h
+++ /dev/null
@@ -1,88 +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 MOJO_PUBLIC_CPP_BINDINGS_TESTS_PICKLED_TYPES_BLINK_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_TESTS_PICKLED_TYPES_BLINK_H_
-
-#include <stddef.h>
-
-#include <string>
-
-#include "base/logging.h"
-#include "base/macros.h"
-#include "ipc/ipc_message_macros.h"
-#include "ipc/ipc_param_traits.h"
-
-namespace base {
-class Pickle;
-class PickleIterator;
-class PickleSizer;
-}
-
-namespace mojo {
-namespace test {
-
-// Implementation of types with IPC::ParamTraits for consumers in Blink.
-
-enum class PickledEnumBlink { VALUE_0, VALUE_1 };
-
-// To make things slightly more interesting, this variation of the type doesn't
-// support negative values. It'll DCHECK if you try to construct it with any,
-// and it will fail deserialization if negative values are decoded.
-class PickledStructBlink {
- public:
-  PickledStructBlink();
-  PickledStructBlink(int foo, int bar);
-  PickledStructBlink(PickledStructBlink&& other) = default;
-  ~PickledStructBlink();
-
-  PickledStructBlink& operator=(PickledStructBlink&& other) = default;
-
-  int foo() const { return foo_; }
-  void set_foo(int foo) {
-    DCHECK_GE(foo, 0);
-    foo_ = foo;
-  }
-
-  int bar() const { return bar_; }
-  void set_bar(int bar) {
-    DCHECK_GE(bar, 0);
-    bar_ = bar;
-  }
-
-  // The |baz| field should never be serialized.
-  int baz() const { return baz_; }
-  void set_baz(int baz) { baz_ = baz; }
-
- private:
-  int foo_ = 0;
-  int bar_ = 0;
-  int baz_ = 0;
-
-  DISALLOW_COPY_AND_ASSIGN(PickledStructBlink);
-};
-
-}  // namespace test
-}  // namespace mojo
-
-namespace IPC {
-
-template <>
-struct ParamTraits<mojo::test::PickledStructBlink> {
-  using param_type = mojo::test::PickledStructBlink;
-
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
-  static void Write(base::Pickle* m, const param_type& p);
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r);
-  static void Log(const param_type& p, std::string* l) {}
-};
-
-}  // namespace IPC
-
-IPC_ENUM_TRAITS_MAX_VALUE(mojo::test::PickledEnumBlink,
-                          mojo::test::PickledEnumBlink::VALUE_1)
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_TESTS_PICKLED_TYPES_BLINK_H_
diff --git a/mojo/public/cpp/bindings/tests/pickled_types_chromium.cc b/mojo/public/cpp/bindings/tests/pickled_types_chromium.cc
deleted file mode 100644
index 9957c9a..0000000
--- a/mojo/public/cpp/bindings/tests/pickled_types_chromium.cc
+++ /dev/null
@@ -1,69 +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 "mojo/public/cpp/bindings/tests/pickled_types_chromium.h"
-
-#include "base/pickle.h"
-
-namespace mojo {
-namespace test {
-
-PickledStructChromium::PickledStructChromium() {}
-
-PickledStructChromium::PickledStructChromium(int foo, int bar)
-    : foo_(foo), bar_(bar) {}
-
-PickledStructChromium::~PickledStructChromium() {}
-
-bool operator==(const PickledStructChromium& a,
-                const PickledStructChromium& b) {
-  return a.foo() == b.foo() && a.bar() == b.bar() && a.baz() == b.baz();
-}
-
-}  // namespace test
-}  // namespace mojo
-
-namespace IPC {
-
-void ParamTraits<mojo::test::PickledStructChromium>::GetSize(
-    base::PickleSizer* sizer,
-    const param_type& p) {
-  sizer->AddInt();
-  sizer->AddInt();
-}
-
-void ParamTraits<mojo::test::PickledStructChromium>::Write(
-    base::Pickle* m,
-    const param_type& p) {
-  m->WriteInt(p.foo());
-  m->WriteInt(p.bar());
-}
-
-bool ParamTraits<mojo::test::PickledStructChromium>::Read(
-    const base::Pickle* m,
-    base::PickleIterator* iter,
-    param_type* p) {
-  int foo, bar;
-  if (!iter->ReadInt(&foo) || !iter->ReadInt(&bar))
-    return false;
-
-  p->set_foo(foo);
-  p->set_bar(bar);
-  return true;
-}
-
-#include "ipc/param_traits_size_macros.h"
-IPC_ENUM_TRAITS_MAX_VALUE(mojo::test::PickledEnumChromium,
-                          mojo::test::PickledEnumChromium::VALUE_2)
-#include "ipc/param_traits_write_macros.h"
-IPC_ENUM_TRAITS_MAX_VALUE(mojo::test::PickledEnumChromium,
-                          mojo::test::PickledEnumChromium::VALUE_2)
-#include "ipc/param_traits_read_macros.h"
-IPC_ENUM_TRAITS_MAX_VALUE(mojo::test::PickledEnumChromium,
-                          mojo::test::PickledEnumChromium::VALUE_2)
-#include "ipc/param_traits_log_macros.h"
-IPC_ENUM_TRAITS_MAX_VALUE(mojo::test::PickledEnumChromium,
-                          mojo::test::PickledEnumChromium::VALUE_2)
-
-}  // namespace IPC
diff --git a/mojo/public/cpp/bindings/tests/pickled_types_chromium.h b/mojo/public/cpp/bindings/tests/pickled_types_chromium.h
deleted file mode 100644
index d9287b6..0000000
--- a/mojo/public/cpp/bindings/tests/pickled_types_chromium.h
+++ /dev/null
@@ -1,81 +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 MOJO_PUBLIC_CPP_BINDINGS_TESTS_PICKLED_TYPES_CHROMIUM_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_TESTS_PICKLED_TYPES_CHROMIUM_H_
-
-#include <stddef.h>
-
-#include <string>
-
-#include "base/macros.h"
-#include "ipc/ipc_message_macros.h"
-#include "ipc/ipc_param_traits.h"
-
-namespace base {
-class Pickle;
-class PickleIterator;
-class PickleSizer;
-}
-
-namespace mojo {
-namespace test {
-
-// Implementation of types with IPC::ParamTraits for consumers in the greater
-// Chromium tree.
-
-enum class PickledEnumChromium { VALUE_0, VALUE_1, VALUE_2 };
-
-class PickledStructChromium {
- public:
-  PickledStructChromium();
-  PickledStructChromium(int foo, int bar);
-  PickledStructChromium(PickledStructChromium&& other) = default;
-  ~PickledStructChromium();
-
-  PickledStructChromium& operator=(PickledStructChromium&& other) = default;
-
-  int foo() const { return foo_; }
-  void set_foo(int foo) { foo_ = foo; }
-
-  int bar() const { return bar_; }
-  void set_bar(int bar) { bar_ = bar; }
-
-  // The |baz| field should never be serialized.
-  int baz() const { return baz_; }
-  void set_baz(int baz) { baz_ = baz; }
-
- private:
-  int foo_ = 0;
-  int bar_ = 0;
-  int baz_ = 0;
-
-  DISALLOW_COPY_AND_ASSIGN(PickledStructChromium);
-};
-
-bool operator==(const PickledStructChromium& a, const PickledStructChromium& b);
-
-}  // namespace test
-}  // namespace mojo
-
-namespace IPC {
-
-template <>
-struct ParamTraits<mojo::test::PickledStructChromium> {
-  using param_type = mojo::test::PickledStructChromium;
-
-  static void GetSize(base::PickleSizer* sizer, const param_type& p);
-  static void Write(base::Pickle* m, const param_type& p);
-  static bool Read(const base::Pickle* m,
-                   base::PickleIterator* iter,
-                   param_type* r);
-  static void Log(const param_type& p, std::string* l) {}
-};
-
-}  // namespace IPC
-
-IPC_ENUM_TRAITS_MAX_VALUE(mojo::test::PickledEnumChromium,
-                          mojo::test::PickledEnumChromium::VALUE_2)
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_TESTS_PICKLED_TYPES_CHROMIUM_H_
diff --git a/mojo/public/cpp/bindings/tests/rect_blink.h b/mojo/public/cpp/bindings/tests/rect_blink.h
deleted file mode 100644
index 7335989..0000000
--- a/mojo/public/cpp/bindings/tests/rect_blink.h
+++ /dev/null
@@ -1,83 +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 MOJO_PUBLIC_CPP_BINDINGS_TESTS_RECT_BLINK_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_TESTS_RECT_BLINK_H_
-
-#include "base/logging.h"
-
-namespace mojo {
-namespace test {
-
-// An implementation of a hypothetical Rect type specifically for consumers in
-// in Blink. Unlike the Chromium variant (see rect_chromium.h) this does not
-// support negative origin coordinates and is not copyable.
-class RectBlink {
- public:
-  RectBlink() {}
-  RectBlink(int x, int y, int width, int height) :
-      x_(x), y_(y), width_(width), height_(height) {
-    DCHECK_GE(x_, 0);
-    DCHECK_GE(y_, 0);
-    DCHECK_GE(width_, 0);
-    DCHECK_GE(height_, 0);
-  }
-  ~RectBlink() {}
-
-  int x() const { return x_; }
-  void setX(int x) {
-    DCHECK_GE(x, 0);
-    x_ = x;
-  }
-
-  int y() const { return y_; }
-  void setY(int y) {
-    DCHECK_GE(y, 0);
-    y_ = y;
-  }
-
-  int width() const { return width_; }
-  void setWidth(int width) {
-    DCHECK_GE(width, 0);
-    width_ = width;
-  }
-
-  int height() const { return height_; }
-  void setHeight(int height) {
-    DCHECK_GE(height, 0);
-    height_ = height;
-  }
-
-  int computeArea() const { return width_ * height_; }
-
-  bool operator==(const RectBlink& other) const {
-    return (x() == other.x() && y() == other.y() && width() == other.width() &&
-            height() == other.height());
-  }
-  bool operator!=(const RectBlink& other) const { return !(*this == other); }
-
- private:
-  int x_ = 0;
-  int y_ = 0;
-  int width_ = 0;
-  int height_ = 0;
-};
-
-}  // namespace test
-}  // namespace mojo
-
-namespace std {
-
-template <>
-struct hash<mojo::test::RectBlink> {
-  size_t operator()(const mojo::test::RectBlink& value) {
-    // Terrible hash function:
-    return (std::hash<int>()(value.x()) ^ std::hash<int>()(value.y()) ^
-            std::hash<int>()(value.width()) ^ std::hash<int>()(value.height()));
-  }
-};
-
-}  // namespace std
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_TESTS_RECT_BLINK_H_
diff --git a/mojo/public/cpp/bindings/tests/rect_blink.typemap b/mojo/public/cpp/bindings/tests/rect_blink.typemap
deleted file mode 100644
index 657ea1a..0000000
--- a/mojo/public/cpp/bindings/tests/rect_blink.typemap
+++ /dev/null
@@ -1,18 +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.
-
-mojom = "//mojo/public/interfaces/bindings/tests/rect.mojom"
-public_headers = [
-  "//mojo/public/cpp/bindings/tests/rect_blink.h",
-  "//mojo/public/cpp/bindings/tests/shared_rect.h",
-]
-traits_headers = [
-  "//mojo/public/cpp/bindings/tests/rect_blink_traits.h",
-  "//mojo/public/cpp/bindings/tests/shared_rect_traits.h",
-]
-
-type_mappings = [
-  "mojo.test.TypemappedRect=mojo::test::RectBlink[hashable]",
-  "mojo.test.SharedTypemappedRect=mojo::test::SharedRect",
-]
diff --git a/mojo/public/cpp/bindings/tests/rect_blink_traits.h b/mojo/public/cpp/bindings/tests/rect_blink_traits.h
deleted file mode 100644
index 7258739..0000000
--- a/mojo/public/cpp/bindings/tests/rect_blink_traits.h
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_TESTS_RECT_BLINK_TRAITS_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_TESTS_RECT_BLINK_TRAITS_H_
-
-#include "mojo/public/cpp/bindings/struct_traits.h"
-#include "mojo/public/cpp/bindings/tests/rect_blink.h"
-#include "mojo/public/interfaces/bindings/tests/rect.mojom-blink.h"
-
-namespace mojo {
-
-template <>
-struct StructTraits<test::TypemappedRectDataView, test::RectBlink> {
-  static int x(const test::RectBlink& r) { return r.x(); }
-  static int y(const test::RectBlink& r) { return r.y(); }
-  static int width(const test::RectBlink& r) { return r.width(); }
-  static int height(const test::RectBlink& r) { return r.height(); }
-
-  static bool Read(test::TypemappedRectDataView r, test::RectBlink* out) {
-    if (r.x() < 0 || r.y() < 0 || r.width() < 0 || r.height() < 0) {
-      return false;
-    }
-    out->setX(r.x());
-    out->setY(r.y());
-    out->setWidth(r.width());
-    out->setHeight(r.height());
-    return true;
-  }
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_TESTS_RECT_BLINK_TRAITS_H_
diff --git a/mojo/public/cpp/bindings/tests/rect_chromium.h b/mojo/public/cpp/bindings/tests/rect_chromium.h
deleted file mode 100644
index d2e0a3e..0000000
--- a/mojo/public/cpp/bindings/tests/rect_chromium.h
+++ /dev/null
@@ -1,87 +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 MOJO_PUBLIC_CPP_BINDINGS_TESTS_RECT_CHROMIUM_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_TESTS_RECT_CHROMIUM_H_
-
-#include "base/logging.h"
-
-namespace mojo {
-namespace test {
-
-// An implementation of a hypothetical Rect type specifically for consumers in
-// in Chromium.
-class RectChromium {
- public:
-  RectChromium() {}
-  RectChromium(const RectChromium& other)
-      : x_(other.x_),
-        y_(other.y_),
-        width_(other.width_),
-        height_(other.height_) {}
-  RectChromium(int x, int y, int width, int height) :
-      x_(x), y_(y), width_(width), height_(height) {
-    DCHECK_GE(width_, 0);
-    DCHECK_GE(height_, 0);
-  }
-  ~RectChromium() {}
-
-  RectChromium& operator=(const RectChromium& other) {
-    x_ = other.x_;
-    y_ = other.y_;
-    width_ = other.width_;
-    height_ = other.height_;
-    return *this;
-  }
-
-  int x() const { return x_; }
-  void set_x(int x) { x_ = x; }
-
-  int y() const { return y_; }
-  void set_y(int y) { y_ = y; }
-
-  int width() const { return width_; }
-  void set_width(int width) {
-    DCHECK_GE(width, 0);
-    width_ = width;
-  }
-
-  int height() const { return height_; }
-  void set_height(int height) {
-    DCHECK_GE(height, 0);
-    height_ = height;
-  }
-
-  int GetArea() const { return width_ * height_; }
-
-  bool operator==(const RectChromium& other) const {
-    return (x() == other.x() && y() == other.y() && width() == other.width() &&
-            height() == other.height());
-  }
-  bool operator!=(const RectChromium& other) const { return !(*this == other); }
-
- private:
-  int x_ = 0;
-  int y_ = 0;
-  int width_ = 0;
-  int height_ = 0;
-};
-
-}  // namespace test
-}  // namespace mojo
-
-namespace std {
-
-template <>
-struct hash<mojo::test::RectChromium> {
-  size_t operator()(const mojo::test::RectChromium& value) {
-    // Terrible hash function:
-    return (std::hash<int>()(value.x()) ^ std::hash<int>()(value.y()) ^
-            std::hash<int>()(value.width()) ^ std::hash<int>()(value.height()));
-  }
-};
-
-}  // namespace std
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_TESTS_RECT_CHROMIUM_H_
diff --git a/mojo/public/cpp/bindings/tests/rect_chromium.typemap b/mojo/public/cpp/bindings/tests/rect_chromium.typemap
deleted file mode 100644
index 7e5df84..0000000
--- a/mojo/public/cpp/bindings/tests/rect_chromium.typemap
+++ /dev/null
@@ -1,18 +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.
-
-mojom = "//mojo/public/interfaces/bindings/tests/rect.mojom"
-public_headers = [
-  "//mojo/public/cpp/bindings/tests/rect_chromium.h",
-  "//mojo/public/cpp/bindings/tests/shared_rect.h",
-]
-traits_headers = [
-  "//mojo/public/cpp/bindings/tests/rect_chromium_traits.h",
-  "//mojo/public/cpp/bindings/tests/shared_rect_traits.h",
-]
-
-type_mappings = [
-  "mojo.test.TypemappedRect=mojo::test::RectChromium[hashable]",
-  "mojo.test.SharedTypemappedRect=mojo::test::SharedRect",
-]
diff --git a/mojo/public/cpp/bindings/tests/rect_chromium_traits.h b/mojo/public/cpp/bindings/tests/rect_chromium_traits.h
deleted file mode 100644
index b446d7d..0000000
--- a/mojo/public/cpp/bindings/tests/rect_chromium_traits.h
+++ /dev/null
@@ -1,34 +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 MOJO_PUBLIC_CPP_BINDINGS_TESTS_RECT_CHROMIUM_TRAITS_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_TESTS_RECT_CHROMIUM_TRAITS_H_
-
-#include "mojo/public/cpp/bindings/struct_traits.h"
-#include "mojo/public/cpp/bindings/tests/rect_chromium.h"
-#include "mojo/public/interfaces/bindings/tests/rect.mojom.h"
-
-namespace mojo {
-
-template <>
-struct StructTraits<test::TypemappedRectDataView, test::RectChromium> {
-  static int x(const test::RectChromium& r) { return r.x(); }
-  static int y(const test::RectChromium& r) { return r.y(); }
-  static int width(const test::RectChromium& r) { return r.width(); }
-  static int height(const test::RectChromium& r) { return r.height(); }
-
-  static bool Read(test::TypemappedRectDataView r, test::RectChromium* out) {
-    if (r.width() < 0 || r.height() < 0)
-      return false;
-    out->set_x(r.x());
-    out->set_y(r.y());
-    out->set_width(r.width());
-    out->set_height(r.height());
-    return true;
-  }
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_TESTS_RECT_CHROMIUM_TRAITS_H_
diff --git a/mojo/public/cpp/bindings/tests/report_bad_message_unittest.cc b/mojo/public/cpp/bindings/tests/report_bad_message_unittest.cc
deleted file mode 100644
index 1bf3f7a..0000000
--- a/mojo/public/cpp/bindings/tests/report_bad_message_unittest.cc
+++ /dev/null
@@ -1,194 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/macros.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/public/cpp/bindings/binding.h"
-#include "mojo/public/cpp/bindings/message.h"
-#include "mojo/public/interfaces/bindings/tests/test_bad_messages.mojom.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace test {
-namespace {
-
-class TestBadMessagesImpl : public TestBadMessages {
- public:
-  TestBadMessagesImpl() : binding_(this) {}
-  ~TestBadMessagesImpl() override {}
-
-  void BindImpl(TestBadMessagesRequest request) {
-    binding_.Bind(std::move(request));
-  }
-
-  const ReportBadMessageCallback& bad_message_callback() {
-    return bad_message_callback_;
-  }
-
- private:
-  // TestBadMessages:
-  void RejectEventually(const RejectEventuallyCallback& callback) override {
-    bad_message_callback_ = GetBadMessageCallback();
-    callback.Run();
-  }
-
-  void RequestResponse(const RequestResponseCallback& callback) override {
-    callback.Run();
-  }
-
-  void RejectSync(const RejectSyncCallback& callback) override {
-    callback.Run();
-    ReportBadMessage("go away");
-  }
-
-  void RequestResponseSync(
-      const RequestResponseSyncCallback& callback) override {
-    callback.Run();
-  }
-
-  ReportBadMessageCallback bad_message_callback_;
-  mojo::Binding<TestBadMessages> binding_;
-
-  DISALLOW_COPY_AND_ASSIGN(TestBadMessagesImpl);
-};
-
-class ReportBadMessageTest : public testing::Test {
- public:
-  ReportBadMessageTest() {}
-
-  void SetUp() override {
-    mojo::edk::SetDefaultProcessErrorCallback(
-        base::Bind(&ReportBadMessageTest::OnProcessError,
-                   base::Unretained(this)));
-
-    impl_.BindImpl(MakeRequest(&proxy_));
-  }
-
-  void TearDown() override {
-    mojo::edk::SetDefaultProcessErrorCallback(
-        mojo::edk::ProcessErrorCallback());
-  }
-
-  TestBadMessages* proxy() { return proxy_.get(); }
-
-  TestBadMessagesImpl* impl() { return &impl_; }
-
-  void SetErrorHandler(const base::Closure& handler) {
-    error_handler_ = handler;
-  }
-
- private:
-  void OnProcessError(const std::string& error) {
-    if (!error_handler_.is_null())
-      error_handler_.Run();
-  }
-
-  TestBadMessagesPtr proxy_;
-  TestBadMessagesImpl impl_;
-  base::Closure error_handler_;
-  base::MessageLoop message_loop;
-};
-
-TEST_F(ReportBadMessageTest, Request) {
-  // Verify that basic immediate error reporting works.
-  bool error = false;
-  SetErrorHandler(base::Bind([] (bool* flag) { *flag = true; }, &error));
-  EXPECT_TRUE(proxy()->RejectSync());
-  EXPECT_TRUE(error);
-}
-
-TEST_F(ReportBadMessageTest, RequestAsync) {
-  bool error = false;
-  SetErrorHandler(base::Bind([] (bool* flag) { *flag = true; }, &error));
-
-  // This should capture a bad message reporting callback in the impl.
-  base::RunLoop loop;
-  proxy()->RejectEventually(loop.QuitClosure());
-  loop.Run();
-
-  EXPECT_FALSE(error);
-
-  // Now we can run the callback and it should trigger a bad message report.
-  DCHECK(!impl()->bad_message_callback().is_null());
-  impl()->bad_message_callback().Run("bad!");
-  EXPECT_TRUE(error);
-}
-
-TEST_F(ReportBadMessageTest, Response) {
-  bool error = false;
-  SetErrorHandler(base::Bind([] (bool* flag) { *flag = true; }, &error));
-
-  base::RunLoop loop;
-  proxy()->RequestResponse(
-      base::Bind([] (const base::Closure& quit) {
-        // Report a bad message inside the response callback. This should
-        // trigger the error handler.
-        ReportBadMessage("no way!");
-        quit.Run();
-      },
-      loop.QuitClosure()));
-  loop.Run();
-
-  EXPECT_TRUE(error);
-}
-
-TEST_F(ReportBadMessageTest, ResponseAsync) {
-  bool error = false;
-  SetErrorHandler(base::Bind([] (bool* flag) { *flag = true; }, &error));
-
-  ReportBadMessageCallback bad_message_callback;
-  base::RunLoop loop;
-  proxy()->RequestResponse(
-      base::Bind([] (const base::Closure& quit,
-                     ReportBadMessageCallback* callback) {
-        // Capture the bad message callback inside the response callback.
-        *callback = GetBadMessageCallback();
-        quit.Run();
-      },
-      loop.QuitClosure(), &bad_message_callback));
-  loop.Run();
-
-  EXPECT_FALSE(error);
-
-  // Invoking this callback should report a bad message and trigger the error
-  // handler immediately.
-  bad_message_callback.Run("this message is bad and should feel bad");
-  EXPECT_TRUE(error);
-}
-
-TEST_F(ReportBadMessageTest, ResponseSync) {
-  bool error = false;
-  SetErrorHandler(base::Bind([] (bool* flag) { *flag = true; }, &error));
-
-  SyncMessageResponseContext context;
-  proxy()->RequestResponseSync();
-
-  EXPECT_FALSE(error);
-  context.ReportBadMessage("i don't like this response");
-  EXPECT_TRUE(error);
-}
-
-TEST_F(ReportBadMessageTest, ResponseSyncDeferred) {
-  bool error = false;
-  SetErrorHandler(base::Bind([] (bool* flag) { *flag = true; }, &error));
-
-  ReportBadMessageCallback bad_message_callback;
-  {
-    SyncMessageResponseContext context;
-    proxy()->RequestResponseSync();
-    bad_message_callback = context.GetBadMessageCallback();
-  }
-
-  EXPECT_FALSE(error);
-  bad_message_callback.Run("nope nope nope");
-  EXPECT_TRUE(error);
-}
-
-}  // namespace
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/request_response_unittest.cc b/mojo/public/cpp/bindings/tests/request_response_unittest.cc
deleted file mode 100644
index 43b8f0d..0000000
--- a/mojo/public/cpp/bindings/tests/request_response_unittest.cc
+++ /dev/null
@@ -1,157 +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 <stdint.h>
-#include <utility>
-
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "mojo/public/cpp/bindings/binding.h"
-#include "mojo/public/cpp/test_support/test_utils.h"
-#include "mojo/public/interfaces/bindings/tests/sample_import.mojom.h"
-#include "mojo/public/interfaces/bindings/tests/sample_interfaces.mojom.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace test {
-namespace {
-
-class ProviderImpl : public sample::Provider {
- public:
-  explicit ProviderImpl(InterfaceRequest<sample::Provider> request)
-      : binding_(this, std::move(request)) {}
-
-  void EchoString(const std::string& a,
-                  const EchoStringCallback& callback) override {
-    EchoStringCallback callback_copy;
-    // Make sure operator= is used.
-    callback_copy = callback;
-    callback_copy.Run(a);
-  }
-
-  void EchoStrings(const std::string& a,
-                   const std::string& b,
-                   const EchoStringsCallback& callback) override {
-    callback.Run(a, b);
-  }
-
-  void EchoMessagePipeHandle(
-      ScopedMessagePipeHandle a,
-      const EchoMessagePipeHandleCallback& callback) override {
-    callback.Run(std::move(a));
-  }
-
-  void EchoEnum(sample::Enum a, const EchoEnumCallback& callback) override {
-    callback.Run(a);
-  }
-
-  void EchoInt(int32_t a, const EchoIntCallback& callback) override {
-    callback.Run(a);
-  }
-
-  Binding<sample::Provider> binding_;
-};
-
-void RecordString(std::string* storage,
-                  const base::Closure& closure,
-                  const std::string& str) {
-  *storage = str;
-  closure.Run();
-}
-
-void RecordStrings(std::string* storage,
-                   const base::Closure& closure,
-                   const std::string& a,
-                   const std::string& b) {
-  *storage = a + b;
-  closure.Run();
-}
-
-void WriteToMessagePipe(const char* text,
-                        const base::Closure& closure,
-                        ScopedMessagePipeHandle handle) {
-  WriteTextMessage(handle.get(), text);
-  closure.Run();
-}
-
-void RecordEnum(sample::Enum* storage,
-                const base::Closure& closure,
-                sample::Enum value) {
-  *storage = value;
-  closure.Run();
-}
-
-class RequestResponseTest : public testing::Test {
- public:
-  RequestResponseTest() {}
-  ~RequestResponseTest() override { base::RunLoop().RunUntilIdle(); }
-
-  void PumpMessages() { base::RunLoop().RunUntilIdle(); }
-
- private:
-  base::MessageLoop loop_;
-};
-
-TEST_F(RequestResponseTest, EchoString) {
-  sample::ProviderPtr provider;
-  ProviderImpl provider_impl(MakeRequest(&provider));
-
-  std::string buf;
-  base::RunLoop run_loop;
-  provider->EchoString("hello",
-                       base::Bind(&RecordString, &buf, run_loop.QuitClosure()));
-
-  run_loop.Run();
-
-  EXPECT_EQ(std::string("hello"), buf);
-}
-
-TEST_F(RequestResponseTest, EchoStrings) {
-  sample::ProviderPtr provider;
-  ProviderImpl provider_impl(MakeRequest(&provider));
-
-  std::string buf;
-  base::RunLoop run_loop;
-  provider->EchoStrings("hello", " world", base::Bind(&RecordStrings, &buf,
-                                                      run_loop.QuitClosure()));
-
-  run_loop.Run();
-
-  EXPECT_EQ(std::string("hello world"), buf);
-}
-
-TEST_F(RequestResponseTest, EchoMessagePipeHandle) {
-  sample::ProviderPtr provider;
-  ProviderImpl provider_impl(MakeRequest(&provider));
-
-  MessagePipe pipe2;
-  base::RunLoop run_loop;
-  provider->EchoMessagePipeHandle(
-      std::move(pipe2.handle1),
-      base::Bind(&WriteToMessagePipe, "hello", run_loop.QuitClosure()));
-
-  run_loop.Run();
-
-  std::string value;
-  ReadTextMessage(pipe2.handle0.get(), &value);
-
-  EXPECT_EQ(std::string("hello"), value);
-}
-
-TEST_F(RequestResponseTest, EchoEnum) {
-  sample::ProviderPtr provider;
-  ProviderImpl provider_impl(MakeRequest(&provider));
-
-  sample::Enum value;
-  base::RunLoop run_loop;
-  provider->EchoEnum(sample::Enum::VALUE,
-                     base::Bind(&RecordEnum, &value, run_loop.QuitClosure()));
-  run_loop.Run();
-
-  EXPECT_EQ(sample::Enum::VALUE, value);
-}
-
-}  // namespace
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/router_test_util.cc b/mojo/public/cpp/bindings/tests/router_test_util.cc
deleted file mode 100644
index 9bab1cb..0000000
--- a/mojo/public/cpp/bindings/tests/router_test_util.cc
+++ /dev/null
@@ -1,111 +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 "mojo/public/cpp/bindings/tests/router_test_util.h"
-
-#include <stddef.h>
-#include <stdint.h>
-#include <string.h>
-
-#include "mojo/public/cpp/bindings/lib/message_builder.h"
-#include "mojo/public/cpp/bindings/tests/message_queue.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace test {
-
-void AllocRequestMessage(uint32_t name, const char* text, Message* message) {
-  size_t payload_size = strlen(text) + 1;  // Plus null terminator.
-  internal::MessageBuilder builder(name, Message::kFlagExpectsResponse,
-                                   payload_size, 0);
-  memcpy(builder.buffer()->Allocate(payload_size), text, payload_size);
-  *message = std::move(*builder.message());
-}
-
-void AllocResponseMessage(uint32_t name,
-                          const char* text,
-                          uint64_t request_id,
-                          Message* message) {
-  size_t payload_size = strlen(text) + 1;  // Plus null terminator.
-  internal::MessageBuilder builder(name, Message::kFlagIsResponse, payload_size,
-                                   0);
-  builder.message()->set_request_id(request_id);
-  memcpy(builder.buffer()->Allocate(payload_size), text, payload_size);
-  *message = std::move(*builder.message());
-}
-
-MessageAccumulator::MessageAccumulator(MessageQueue* queue,
-                                       const base::Closure& closure)
-    : queue_(queue), closure_(closure) {}
-
-MessageAccumulator::~MessageAccumulator() {}
-
-bool MessageAccumulator::Accept(Message* message) {
-  queue_->Push(message);
-  if (!closure_.is_null()) {
-    closure_.Run();
-    closure_.Reset();
-  }
-  return true;
-}
-
-ResponseGenerator::ResponseGenerator() {}
-
-bool ResponseGenerator::Accept(Message* message) {
-  return false;
-}
-
-bool ResponseGenerator::AcceptWithResponder(
-    Message* message,
-    std::unique_ptr<MessageReceiverWithStatus> responder) {
-  EXPECT_TRUE(message->has_flag(Message::kFlagExpectsResponse));
-
-  bool result = SendResponse(message->name(), message->request_id(),
-                             reinterpret_cast<const char*>(message->payload()),
-                             responder.get());
-  EXPECT_TRUE(responder->IsValid());
-  return result;
-}
-
-bool ResponseGenerator::SendResponse(uint32_t name,
-                                     uint64_t request_id,
-                                     const char* request_string,
-                                     MessageReceiver* responder) {
-  Message response;
-  std::string response_string(request_string);
-  response_string += " world!";
-  AllocResponseMessage(name, response_string.c_str(), request_id, &response);
-
-  return responder->Accept(&response);
-}
-
-LazyResponseGenerator::LazyResponseGenerator(const base::Closure& closure)
-    : responder_(nullptr), name_(0), request_id_(0), closure_(closure) {}
-
-LazyResponseGenerator::~LazyResponseGenerator() = default;
-
-bool LazyResponseGenerator::AcceptWithResponder(
-    Message* message,
-    std::unique_ptr<MessageReceiverWithStatus> responder) {
-  name_ = message->name();
-  request_id_ = message->request_id();
-  request_string_ =
-      std::string(reinterpret_cast<const char*>(message->payload()));
-  responder_ = std::move(responder);
-  if (!closure_.is_null()) {
-    closure_.Run();
-    closure_.Reset();
-  }
-  return true;
-}
-
-void LazyResponseGenerator::Complete(bool send_response) {
-  if (send_response) {
-    SendResponse(name_, request_id_, request_string_.c_str(), responder_.get());
-  }
-  responder_ = nullptr;
-}
-
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/router_test_util.h b/mojo/public/cpp/bindings/tests/router_test_util.h
deleted file mode 100644
index dd6aff6..0000000
--- a/mojo/public/cpp/bindings/tests/router_test_util.h
+++ /dev/null
@@ -1,92 +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 MOJO_PUBLIC_CPP_BINDINGS_TESTS_ROUTER_TEST_UTIL_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_TESTS_ROUTER_TEST_UTIL_H_
-
-#include <stdint.h>
-
-#include <string>
-
-#include "base/callback.h"
-#include "mojo/public/cpp/bindings/message.h"
-
-namespace mojo {
-namespace test {
-
-class MessageQueue;
-
-void AllocRequestMessage(uint32_t name, const char* text, Message* message);
-void AllocResponseMessage(uint32_t name,
-                          const char* text,
-                          uint64_t request_id,
-                          Message* message);
-
-class MessageAccumulator : public MessageReceiver {
- public:
-  MessageAccumulator(MessageQueue* queue,
-                     const base::Closure& closure = base::Closure());
-  ~MessageAccumulator() override;
-
-  bool Accept(Message* message) override;
-
- private:
-  MessageQueue* queue_;
-  base::Closure closure_;
-};
-
-class ResponseGenerator : public MessageReceiverWithResponderStatus {
- public:
-  ResponseGenerator();
-
-  bool Accept(Message* message) override;
-
-  bool AcceptWithResponder(
-      Message* message,
-      std::unique_ptr<MessageReceiverWithStatus> responder) override;
-  bool SendResponse(uint32_t name,
-                    uint64_t request_id,
-                    const char* request_string,
-                    MessageReceiver* responder);
-};
-
-class LazyResponseGenerator : public ResponseGenerator {
- public:
-  explicit LazyResponseGenerator(
-      const base::Closure& closure = base::Closure());
-
-  ~LazyResponseGenerator() override;
-
-  bool AcceptWithResponder(
-      Message* message,
-      std::unique_ptr<MessageReceiverWithStatus> responder) override;
-
-  bool has_responder() const { return !!responder_; }
-
-  bool responder_is_valid() const { return responder_->IsValid(); }
-
-  void set_closure(const base::Closure& closure) { closure_ = closure; }
-
-  // Sends the response and delete the responder.
-  void CompleteWithResponse() { Complete(true); }
-
-  // Deletes the responder without sending a response.
-  void CompleteWithoutResponse() { Complete(false); }
-
- private:
-  // Completes the request handling by deleting responder_. Optionally
-  // also sends a response.
-  void Complete(bool send_response);
-
-  std::unique_ptr<MessageReceiverWithStatus> responder_;
-  uint32_t name_;
-  uint64_t request_id_;
-  std::string request_string_;
-  base::Closure closure_;
-};
-
-}  // namespace test
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_TESTS_ROUTER_TEST_UTIL_H_
diff --git a/mojo/public/cpp/bindings/tests/sample_service_unittest.cc b/mojo/public/cpp/bindings/tests/sample_service_unittest.cc
deleted file mode 100644
index 1f95a27..0000000
--- a/mojo/public/cpp/bindings/tests/sample_service_unittest.cc
+++ /dev/null
@@ -1,362 +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 <stddef.h>
-#include <stdint.h>
-#include <algorithm>
-#include <ostream>
-#include <string>
-#include <utility>
-
-#include "mojo/public/interfaces/bindings/tests/sample_service.mojom.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-
-template <>
-struct TypeConverter<int32_t, sample::BarPtr> {
-  static int32_t Convert(const sample::BarPtr& bar) {
-    return static_cast<int32_t>(bar->alpha) << 16 |
-           static_cast<int32_t>(bar->beta) << 8 |
-           static_cast<int32_t>(bar->gamma);
-  }
-};
-
-}  // namespace mojo
-
-namespace sample {
-namespace {
-
-// Set this variable to true to print the message in hex.
-bool g_dump_message_as_hex = false;
-
-// Set this variable to true to print the message in human readable form.
-bool g_dump_message_as_text = false;
-
-// Make a sample |Foo|.
-FooPtr MakeFoo() {
-  std::string name("foopy");
-
-  BarPtr bar(Bar::New(20, 40, 60, Bar::Type::VERTICAL));
-
-  std::vector<BarPtr> extra_bars(3);
-  for (size_t i = 0; i < extra_bars.size(); ++i) {
-    Bar::Type type = i % 2 == 0 ? Bar::Type::VERTICAL : Bar::Type::HORIZONTAL;
-    uint8_t base = static_cast<uint8_t>(i * 100);
-    extra_bars[i] = Bar::New(base, base + 20, base + 40, type);
-  }
-
-  std::vector<uint8_t> data(10);
-  for (size_t i = 0; i < data.size(); ++i)
-    data[i] = static_cast<uint8_t>(data.size() - i);
-
-  std::vector<mojo::ScopedDataPipeConsumerHandle> input_streams(2);
-  std::vector<mojo::ScopedDataPipeProducerHandle> output_streams(2);
-  for (size_t i = 0; i < input_streams.size(); ++i) {
-    MojoCreateDataPipeOptions options;
-    options.struct_size = sizeof(MojoCreateDataPipeOptions);
-    options.flags = MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE;
-    options.element_num_bytes = 1;
-    options.capacity_num_bytes = 1024;
-    mojo::ScopedDataPipeProducerHandle producer;
-    mojo::ScopedDataPipeConsumerHandle consumer;
-    mojo::CreateDataPipe(&options, &producer, &consumer);
-    input_streams[i] = std::move(consumer);
-    output_streams[i] = std::move(producer);
-  }
-
-  std::vector<std::vector<bool>> array_of_array_of_bools(2);
-  for (size_t i = 0; i < 2; ++i) {
-    std::vector<bool> array_of_bools(2);
-    for (size_t j = 0; j < 2; ++j)
-      array_of_bools[j] = j;
-    array_of_array_of_bools[i] = std::move(array_of_bools);
-  }
-
-  mojo::MessagePipe pipe;
-  return Foo::New(name, 1, 2, false, true, false, std::move(bar),
-                  std::move(extra_bars), std::move(data),
-                  std::move(pipe.handle1), std::move(input_streams),
-                  std::move(output_streams), std::move(array_of_array_of_bools),
-                  base::nullopt, base::nullopt);
-}
-
-// Check that the given |Foo| is identical to the one made by |MakeFoo()|.
-void CheckFoo(const Foo& foo) {
-  const std::string kName("foopy");
-  EXPECT_EQ(kName.size(), foo.name.size());
-  for (size_t i = 0; i < std::min(kName.size(), foo.name.size()); i++) {
-    // Test both |operator[]| and |at|.
-    EXPECT_EQ(kName[i], foo.name.at(i)) << i;
-    EXPECT_EQ(kName[i], foo.name[i]) << i;
-  }
-  EXPECT_EQ(kName, foo.name);
-
-  EXPECT_EQ(1, foo.x);
-  EXPECT_EQ(2, foo.y);
-  EXPECT_FALSE(foo.a);
-  EXPECT_TRUE(foo.b);
-  EXPECT_FALSE(foo.c);
-
-  EXPECT_EQ(20, foo.bar->alpha);
-  EXPECT_EQ(40, foo.bar->beta);
-  EXPECT_EQ(60, foo.bar->gamma);
-  EXPECT_EQ(Bar::Type::VERTICAL, foo.bar->type);
-
-  EXPECT_EQ(3u, foo.extra_bars->size());
-  for (size_t i = 0; i < foo.extra_bars->size(); i++) {
-    uint8_t base = static_cast<uint8_t>(i * 100);
-    Bar::Type type = i % 2 == 0 ? Bar::Type::VERTICAL : Bar::Type::HORIZONTAL;
-    EXPECT_EQ(base, (*foo.extra_bars)[i]->alpha) << i;
-    EXPECT_EQ(base + 20, (*foo.extra_bars)[i]->beta) << i;
-    EXPECT_EQ(base + 40, (*foo.extra_bars)[i]->gamma) << i;
-    EXPECT_EQ(type, (*foo.extra_bars)[i]->type) << i;
-  }
-
-  EXPECT_EQ(10u, foo.data->size());
-  for (size_t i = 0; i < foo.data->size(); ++i) {
-    EXPECT_EQ(static_cast<uint8_t>(foo.data->size() - i), (*foo.data)[i]) << i;
-  }
-
-  EXPECT_TRUE(foo.input_streams);
-  EXPECT_EQ(2u, foo.input_streams->size());
-
-  EXPECT_TRUE(foo.output_streams);
-  EXPECT_EQ(2u, foo.output_streams->size());
-
-  EXPECT_EQ(2u, foo.array_of_array_of_bools->size());
-  for (size_t i = 0; i < foo.array_of_array_of_bools->size(); ++i) {
-    EXPECT_EQ(2u, (*foo.array_of_array_of_bools)[i].size());
-    for (size_t j = 0; j < (*foo.array_of_array_of_bools)[i].size(); ++j) {
-      EXPECT_EQ(bool(j), (*foo.array_of_array_of_bools)[i][j]);
-    }
-  }
-}
-
-void PrintSpacer(int depth) {
-  for (int i = 0; i < depth; ++i)
-    std::cout << "   ";
-}
-
-void Print(int depth, const char* name, bool value) {
-  PrintSpacer(depth);
-  std::cout << name << ": " << (value ? "true" : "false") << std::endl;
-}
-
-void Print(int depth, const char* name, int32_t value) {
-  PrintSpacer(depth);
-  std::cout << name << ": " << value << std::endl;
-}
-
-void Print(int depth, const char* name, uint8_t value) {
-  PrintSpacer(depth);
-  std::cout << name << ": " << uint32_t(value) << std::endl;
-}
-
-template <typename H>
-void Print(int depth,
-           const char* name,
-           const mojo::ScopedHandleBase<H>& value) {
-  PrintSpacer(depth);
-  std::cout << name << ": 0x" << std::hex << value.get().value() << std::endl;
-}
-
-void Print(int depth, const char* name, const std::string& str) {
-  PrintSpacer(depth);
-  std::cout << name << ": \"" << str << "\"" << std::endl;
-}
-
-void Print(int depth, const char* name, const BarPtr& bar) {
-  PrintSpacer(depth);
-  std::cout << name << ":" << std::endl;
-  if (!bar.is_null()) {
-    ++depth;
-    Print(depth, "alpha", bar->alpha);
-    Print(depth, "beta", bar->beta);
-    Print(depth, "gamma", bar->gamma);
-    Print(depth, "packed", bar.To<int32_t>());
-    --depth;
-  }
-}
-
-template <typename T>
-void Print(int depth, const char* name, const std::vector<T>& array) {
-  PrintSpacer(depth);
-  std::cout << name << ":" << std::endl;
-  ++depth;
-  for (size_t i = 0; i < array.size(); ++i) {
-    std::stringstream buf;
-    buf << i;
-    Print(depth, buf.str().data(), array.at(i));
-  }
-  --depth;
-}
-
-template <typename T>
-void Print(int depth,
-           const char* name,
-           const base::Optional<std::vector<T>>& array) {
-  if (array)
-    Print(depth, name, *array);
-  else
-    Print(depth, name, std::vector<T>());
-}
-
-void Print(int depth, const char* name, const FooPtr& foo) {
-  PrintSpacer(depth);
-  std::cout << name << ":" << std::endl;
-  if (!foo.is_null()) {
-    ++depth;
-    Print(depth, "name", foo->name);
-    Print(depth, "x", foo->x);
-    Print(depth, "y", foo->y);
-    Print(depth, "a", foo->a);
-    Print(depth, "b", foo->b);
-    Print(depth, "c", foo->c);
-    Print(depth, "bar", foo->bar);
-    Print(depth, "extra_bars", foo->extra_bars);
-    Print(depth, "data", foo->data);
-    Print(depth, "source", foo->source);
-    Print(depth, "input_streams", foo->input_streams);
-    Print(depth, "output_streams", foo->output_streams);
-    Print(depth, "array_of_array_of_bools", foo->array_of_array_of_bools);
-    --depth;
-  }
-}
-
-void DumpHex(const uint8_t* bytes, uint32_t num_bytes) {
-  for (uint32_t i = 0; i < num_bytes; ++i) {
-    std::cout << std::setw(2) << std::setfill('0') << std::hex
-              << uint32_t(bytes[i]);
-
-    if (i % 16 == 15) {
-      std::cout << std::endl;
-      continue;
-    }
-
-    if (i % 2 == 1)
-      std::cout << " ";
-    if (i % 8 == 7)
-      std::cout << " ";
-  }
-}
-
-class ServiceImpl : public Service {
- public:
-  void Frobinate(FooPtr foo,
-                 BazOptions baz,
-                 PortPtr port,
-                 const Service::FrobinateCallback& callback) override {
-    // Users code goes here to handle the incoming Frobinate message.
-
-    // We mainly check that we're given the expected arguments.
-    EXPECT_FALSE(foo.is_null());
-    if (!foo.is_null())
-      CheckFoo(*foo);
-    EXPECT_EQ(BazOptions::EXTRA, baz);
-
-    if (g_dump_message_as_text) {
-      // Also dump the Foo structure and all of its members.
-      std::cout << "Frobinate:" << std::endl;
-      int depth = 1;
-      Print(depth, "foo", foo);
-      Print(depth, "baz", static_cast<int32_t>(baz));
-      Print(depth, "port", port.get());
-    }
-    callback.Run(5);
-  }
-
-  void GetPort(mojo::InterfaceRequest<Port> port_request) override {}
-};
-
-class ServiceProxyImpl : public ServiceProxy {
- public:
-  explicit ServiceProxyImpl(mojo::MessageReceiverWithResponder* receiver)
-      : ServiceProxy(receiver) {}
-};
-
-class SimpleMessageReceiver : public mojo::MessageReceiverWithResponder {
- public:
-  bool Accept(mojo::Message* message) override {
-    // Imagine some IPC happened here.
-
-    if (g_dump_message_as_hex) {
-      DumpHex(reinterpret_cast<const uint8_t*>(message->data()),
-              message->data_num_bytes());
-    }
-
-    // In the receiving process, an implementation of ServiceStub is known to
-    // the system. It receives the incoming message.
-    ServiceImpl impl;
-
-    ServiceStub<> stub;
-    stub.set_sink(&impl);
-    return stub.Accept(message);
-  }
-
-  bool AcceptWithResponder(
-      mojo::Message* message,
-      std::unique_ptr<mojo::MessageReceiver> responder) override {
-    return false;
-  }
-};
-
-using BindingsSampleTest = testing::Test;
-
-TEST_F(BindingsSampleTest, Basic) {
-  SimpleMessageReceiver receiver;
-
-  // User has a proxy to a Service somehow.
-  Service* service = new ServiceProxyImpl(&receiver);
-
-  // User constructs a message to send.
-
-  // Notice that it doesn't matter in what order the structs / arrays are
-  // allocated. Here, the various members of Foo are allocated before Foo is
-  // allocated.
-
-  FooPtr foo = MakeFoo();
-  CheckFoo(*foo);
-
-  PortPtr port;
-  service->Frobinate(std::move(foo), Service::BazOptions::EXTRA,
-                     std::move(port), Service::FrobinateCallback());
-
-  delete service;
-}
-
-TEST_F(BindingsSampleTest, DefaultValues) {
-  DefaultsTestPtr defaults(DefaultsTest::New());
-  EXPECT_EQ(-12, defaults->a0);
-  EXPECT_EQ(kTwelve, defaults->a1);
-  EXPECT_EQ(1234, defaults->a2);
-  EXPECT_EQ(34567U, defaults->a3);
-  EXPECT_EQ(123456, defaults->a4);
-  EXPECT_EQ(3456789012U, defaults->a5);
-  EXPECT_EQ(-111111111111LL, defaults->a6);
-  EXPECT_EQ(9999999999999999999ULL, defaults->a7);
-  EXPECT_EQ(0x12345, defaults->a8);
-  EXPECT_EQ(-0x12345, defaults->a9);
-  EXPECT_EQ(1234, defaults->a10);
-  EXPECT_TRUE(defaults->a11);
-  EXPECT_FALSE(defaults->a12);
-  EXPECT_FLOAT_EQ(123.25f, defaults->a13);
-  EXPECT_DOUBLE_EQ(1234567890.123, defaults->a14);
-  EXPECT_DOUBLE_EQ(1E10, defaults->a15);
-  EXPECT_DOUBLE_EQ(-1.2E+20, defaults->a16);
-  EXPECT_DOUBLE_EQ(1.23E-20, defaults->a17);
-  EXPECT_TRUE(defaults->a18.empty());
-  EXPECT_TRUE(defaults->a19.empty());
-  EXPECT_EQ(Bar::Type::BOTH, defaults->a20);
-  EXPECT_TRUE(defaults->a21.is_null());
-  ASSERT_FALSE(defaults->a22.is_null());
-  EXPECT_EQ(imported::Shape::RECTANGLE, defaults->a22->shape);
-  EXPECT_EQ(imported::Color::BLACK, defaults->a22->color);
-  EXPECT_EQ(0xFFFFFFFFFFFFFFFFULL, defaults->a23);
-  EXPECT_EQ(0x123456789, defaults->a24);
-  EXPECT_EQ(-0x123456789, defaults->a25);
-}
-
-}  // namespace
-}  // namespace sample
diff --git a/mojo/public/cpp/bindings/tests/serialization_warning_unittest.cc b/mojo/public/cpp/bindings/tests/serialization_warning_unittest.cc
deleted file mode 100644
index 275f10f..0000000
--- a/mojo/public/cpp/bindings/tests/serialization_warning_unittest.cc
+++ /dev/null
@@ -1,251 +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.
-
-// Serialization warnings are only recorded when DLOG is enabled.
-#if !defined(NDEBUG) || defined(DCHECK_ALWAYS_ON)
-
-#include <stddef.h>
-#include <utility>
-
-#include "mojo/public/cpp/bindings/lib/array_internal.h"
-#include "mojo/public/cpp/bindings/lib/fixed_buffer.h"
-#include "mojo/public/cpp/bindings/lib/serialization.h"
-#include "mojo/public/cpp/bindings/lib/validation_errors.h"
-#include "mojo/public/cpp/system/message_pipe.h"
-#include "mojo/public/interfaces/bindings/tests/serialization_test_structs.mojom.h"
-#include "mojo/public/interfaces/bindings/tests/test_unions.mojom.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace test {
-namespace {
-
-using mojo::internal::ContainerValidateParams;
-
-// Creates an array of arrays of handles (2 X 3) for testing.
-std::vector<base::Optional<std::vector<ScopedHandle>>>
-CreateTestNestedHandleArray() {
-  std::vector<base::Optional<std::vector<ScopedHandle>>> array(2);
-  for (size_t i = 0; i < array.size(); ++i) {
-    std::vector<ScopedHandle> nested_array(3);
-    for (size_t j = 0; j < nested_array.size(); ++j) {
-      MessagePipe pipe;
-      nested_array[j] = ScopedHandle::From(std::move(pipe.handle1));
-    }
-    array[i].emplace(std::move(nested_array));
-  }
-
-  return array;
-}
-
-class SerializationWarningTest : public testing::Test {
- public:
-  ~SerializationWarningTest() override {}
-
- protected:
-  template <typename T>
-  void TestWarning(T obj, mojo::internal::ValidationError expected_warning) {
-    using MojomType = typename T::Struct::DataView;
-
-    warning_observer_.set_last_warning(mojo::internal::VALIDATION_ERROR_NONE);
-
-    mojo::internal::SerializationContext context;
-    mojo::internal::FixedBufferForTesting buf(
-        mojo::internal::PrepareToSerialize<MojomType>(obj, &context));
-    typename mojo::internal::MojomTypeTraits<MojomType>::Data* data;
-    mojo::internal::Serialize<MojomType>(obj, &buf, &data, &context);
-
-    EXPECT_EQ(expected_warning, warning_observer_.last_warning());
-  }
-
-  template <typename MojomType, typename T>
-  void TestArrayWarning(T obj,
-                        mojo::internal::ValidationError expected_warning,
-                        const ContainerValidateParams* validate_params) {
-    warning_observer_.set_last_warning(mojo::internal::VALIDATION_ERROR_NONE);
-
-    mojo::internal::SerializationContext context;
-    mojo::internal::FixedBufferForTesting buf(
-        mojo::internal::PrepareToSerialize<MojomType>(obj, &context));
-    typename mojo::internal::MojomTypeTraits<MojomType>::Data* data;
-    mojo::internal::Serialize<MojomType>(obj, &buf, &data, validate_params,
-                                         &context);
-
-    EXPECT_EQ(expected_warning, warning_observer_.last_warning());
-  }
-
-  template <typename T>
-  void TestUnionWarning(T obj,
-                        mojo::internal::ValidationError expected_warning) {
-    using MojomType = typename T::Struct::DataView;
-
-    warning_observer_.set_last_warning(mojo::internal::VALIDATION_ERROR_NONE);
-
-    mojo::internal::SerializationContext context;
-    mojo::internal::FixedBufferForTesting buf(
-        mojo::internal::PrepareToSerialize<MojomType>(obj, false, &context));
-    typename mojo::internal::MojomTypeTraits<MojomType>::Data* data;
-    mojo::internal::Serialize<MojomType>(obj, &buf, &data, false, &context);
-
-    EXPECT_EQ(expected_warning, warning_observer_.last_warning());
-  }
-
-  mojo::internal::SerializationWarningObserverForTesting warning_observer_;
-};
-
-TEST_F(SerializationWarningTest, HandleInStruct) {
-  Struct2Ptr test_struct(Struct2::New());
-  EXPECT_FALSE(test_struct->hdl.is_valid());
-
-  TestWarning(std::move(test_struct),
-              mojo::internal::VALIDATION_ERROR_UNEXPECTED_INVALID_HANDLE);
-
-  test_struct = Struct2::New();
-  MessagePipe pipe;
-  test_struct->hdl = ScopedHandle::From(std::move(pipe.handle1));
-
-  TestWarning(std::move(test_struct), mojo::internal::VALIDATION_ERROR_NONE);
-}
-
-TEST_F(SerializationWarningTest, StructInStruct) {
-  Struct3Ptr test_struct(Struct3::New());
-  EXPECT_TRUE(!test_struct->struct_1);
-
-  TestWarning(std::move(test_struct),
-              mojo::internal::VALIDATION_ERROR_UNEXPECTED_NULL_POINTER);
-
-  test_struct = Struct3::New();
-  test_struct->struct_1 = Struct1::New();
-
-  TestWarning(std::move(test_struct), mojo::internal::VALIDATION_ERROR_NONE);
-}
-
-TEST_F(SerializationWarningTest, ArrayOfStructsInStruct) {
-  Struct4Ptr test_struct(Struct4::New());
-  test_struct->data.resize(1);
-
-  TestWarning(std::move(test_struct),
-              mojo::internal::VALIDATION_ERROR_UNEXPECTED_NULL_POINTER);
-
-  test_struct = Struct4::New();
-  test_struct->data.resize(0);
-
-  TestWarning(std::move(test_struct), mojo::internal::VALIDATION_ERROR_NONE);
-
-  test_struct = Struct4::New();
-  test_struct->data.resize(1);
-  test_struct->data[0] = Struct1::New();
-
-  TestWarning(std::move(test_struct), mojo::internal::VALIDATION_ERROR_NONE);
-}
-
-TEST_F(SerializationWarningTest, FixedArrayOfStructsInStruct) {
-  Struct5Ptr test_struct(Struct5::New());
-  test_struct->pair.resize(1);
-  test_struct->pair[0] = Struct1::New();
-
-  TestWarning(std::move(test_struct),
-              mojo::internal::VALIDATION_ERROR_UNEXPECTED_ARRAY_HEADER);
-
-  test_struct = Struct5::New();
-  test_struct->pair.resize(2);
-  test_struct->pair[0] = Struct1::New();
-  test_struct->pair[1] = Struct1::New();
-
-  TestWarning(std::move(test_struct), mojo::internal::VALIDATION_ERROR_NONE);
-}
-
-TEST_F(SerializationWarningTest, ArrayOfArraysOfHandles) {
-  using MojomType = ArrayDataView<ArrayDataView<ScopedHandle>>;
-  auto test_array = CreateTestNestedHandleArray();
-  test_array[0] = base::nullopt;
-  (*test_array[1])[0] = ScopedHandle();
-
-  ContainerValidateParams validate_params_0(
-      0, true, new ContainerValidateParams(0, true, nullptr));
-  TestArrayWarning<MojomType>(std::move(test_array),
-                              mojo::internal::VALIDATION_ERROR_NONE,
-                              &validate_params_0);
-
-  test_array = CreateTestNestedHandleArray();
-  test_array[0] = base::nullopt;
-  ContainerValidateParams validate_params_1(
-      0, false, new ContainerValidateParams(0, true, nullptr));
-  TestArrayWarning<MojomType>(
-      std::move(test_array),
-      mojo::internal::VALIDATION_ERROR_UNEXPECTED_NULL_POINTER,
-      &validate_params_1);
-
-  test_array = CreateTestNestedHandleArray();
-  (*test_array[1])[0] = ScopedHandle();
-  ContainerValidateParams validate_params_2(
-      0, true, new ContainerValidateParams(0, false, nullptr));
-  TestArrayWarning<MojomType>(
-      std::move(test_array),
-      mojo::internal::VALIDATION_ERROR_UNEXPECTED_INVALID_HANDLE,
-      &validate_params_2);
-}
-
-TEST_F(SerializationWarningTest, ArrayOfStrings) {
-  using MojomType = ArrayDataView<StringDataView>;
-
-  std::vector<std::string> test_array(3);
-  for (size_t i = 0; i < test_array.size(); ++i)
-    test_array[i] = "hello";
-
-  ContainerValidateParams validate_params_0(
-      0, true, new ContainerValidateParams(0, false, nullptr));
-  TestArrayWarning<MojomType>(std::move(test_array),
-                              mojo::internal::VALIDATION_ERROR_NONE,
-                              &validate_params_0);
-
-  std::vector<base::Optional<std::string>> optional_test_array(3);
-  ContainerValidateParams validate_params_1(
-      0, false, new ContainerValidateParams(0, false, nullptr));
-  TestArrayWarning<MojomType>(
-      std::move(optional_test_array),
-      mojo::internal::VALIDATION_ERROR_UNEXPECTED_NULL_POINTER,
-      &validate_params_1);
-
-  test_array = std::vector<std::string>(2);
-  ContainerValidateParams validate_params_2(
-      3, true, new ContainerValidateParams(0, false, nullptr));
-  TestArrayWarning<MojomType>(
-      std::move(test_array),
-      mojo::internal::VALIDATION_ERROR_UNEXPECTED_ARRAY_HEADER,
-      &validate_params_2);
-}
-
-TEST_F(SerializationWarningTest, StructInUnion) {
-  DummyStructPtr dummy(nullptr);
-  ObjectUnionPtr obj(ObjectUnion::New());
-  obj->set_f_dummy(std::move(dummy));
-
-  TestUnionWarning(std::move(obj),
-                   mojo::internal::VALIDATION_ERROR_UNEXPECTED_NULL_POINTER);
-}
-
-TEST_F(SerializationWarningTest, UnionInUnion) {
-  PodUnionPtr pod(nullptr);
-  ObjectUnionPtr obj(ObjectUnion::New());
-  obj->set_f_pod_union(std::move(pod));
-
-  TestUnionWarning(std::move(obj),
-                   mojo::internal::VALIDATION_ERROR_UNEXPECTED_NULL_POINTER);
-}
-
-TEST_F(SerializationWarningTest, HandleInUnion) {
-  ScopedMessagePipeHandle pipe;
-  HandleUnionPtr handle(HandleUnion::New());
-  handle->set_f_message_pipe(std::move(pipe));
-
-  TestUnionWarning(std::move(handle),
-                   mojo::internal::VALIDATION_ERROR_UNEXPECTED_INVALID_HANDLE);
-}
-
-}  // namespace
-}  // namespace test
-}  // namespace mojo
-
-#endif
diff --git a/mojo/public/cpp/bindings/tests/shared_rect.h b/mojo/public/cpp/bindings/tests/shared_rect.h
deleted file mode 100644
index c0a4771..0000000
--- a/mojo/public/cpp/bindings/tests/shared_rect.h
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_TESTS_SHARED_RECT_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_TESTS_SHARED_RECT_H_
-
-#include "base/logging.h"
-
-namespace mojo {
-namespace test {
-
-// An implementation of a hypothetical Rect type specifically for consumers in
-// both Chromium and Blink.
-class SharedRect {
- public:
-  SharedRect() {}
-  SharedRect(int x, int y, int width, int height)
-      : x_(x), y_(y), width_(width), height_(height) {}
-
-  int x() const { return x_; }
-  void set_x(int x) { x_ = x; }
-
-  int y() const { return y_; }
-  void set_y(int y) { y_ = y; }
-
-  int width() const { return width_; }
-  void set_width(int width) { width_ = width; }
-
-  int height() const { return height_; }
-  void set_height(int height) { height_ = height; }
-
- private:
-  int x_ = 0;
-  int y_ = 0;
-  int width_ = 0;
-  int height_ = 0;
-};
-
-}  // namespace test
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_TESTS_SHARED_RECT_H_
diff --git a/mojo/public/cpp/bindings/tests/shared_rect_traits.h b/mojo/public/cpp/bindings/tests/shared_rect_traits.h
deleted file mode 100644
index bbf04d5..0000000
--- a/mojo/public/cpp/bindings/tests/shared_rect_traits.h
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_TESTS_SHARED_RECT_TRAITS_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_TESTS_SHARED_RECT_TRAITS_H_
-
-#include "mojo/public/cpp/bindings/struct_traits.h"
-#include "mojo/public/cpp/bindings/tests/shared_rect.h"
-#include "mojo/public/interfaces/bindings/tests/rect.mojom-shared.h"
-
-namespace mojo {
-
-template <>
-struct StructTraits<test::SharedTypemappedRectDataView, test::SharedRect> {
-  static int x(const test::SharedRect& r) { return r.x(); }
-  static int y(const test::SharedRect& r) { return r.y(); }
-  static int width(const test::SharedRect& r) { return r.width(); }
-  static int height(const test::SharedRect& r) { return r.height(); }
-
-  static bool Read(test::SharedTypemappedRectDataView r,
-                   test::SharedRect* out) {
-    out->set_x(r.x());
-    out->set_y(r.y());
-    out->set_width(r.width());
-    out->set_height(r.height());
-    return true;
-  }
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_TESTS_SHARED_RECT_TRAITS_H_
diff --git a/mojo/public/cpp/bindings/tests/struct_traits_unittest.cc b/mojo/public/cpp/bindings/tests/struct_traits_unittest.cc
deleted file mode 100644
index 77b448a..0000000
--- a/mojo/public/cpp/bindings/tests/struct_traits_unittest.cc
+++ /dev/null
@@ -1,553 +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/bind.h"
-#include "base/callback.h"
-#include "base/logging.h"
-#include "base/memory/ptr_util.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "mojo/public/cpp/bindings/binding_set.h"
-#include "mojo/public/cpp/bindings/interface_request.h"
-#include "mojo/public/cpp/bindings/tests/rect_blink.h"
-#include "mojo/public/cpp/bindings/tests/rect_chromium.h"
-#include "mojo/public/cpp/bindings/tests/struct_with_traits_impl.h"
-#include "mojo/public/cpp/bindings/tests/struct_with_traits_impl_traits.h"
-#include "mojo/public/cpp/bindings/tests/variant_test_util.h"
-#include "mojo/public/cpp/system/wait.h"
-#include "mojo/public/interfaces/bindings/tests/struct_with_traits.mojom.h"
-#include "mojo/public/interfaces/bindings/tests/test_native_types.mojom-blink.h"
-#include "mojo/public/interfaces/bindings/tests/test_native_types.mojom.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace test {
-namespace {
-
-template <typename T>
-void DoExpectResult(const T& expected,
-                    const base::Closure& callback,
-                    const T& actual) {
-  EXPECT_EQ(expected.x(), actual.x());
-  EXPECT_EQ(expected.y(), actual.y());
-  EXPECT_EQ(expected.width(), actual.width());
-  EXPECT_EQ(expected.height(), actual.height());
-  callback.Run();
-}
-
-template <typename T>
-base::Callback<void(const T&)> ExpectResult(const T& r,
-                                            const base::Closure& callback) {
-  return base::Bind(&DoExpectResult<T>, r, callback);
-}
-
-template <typename T>
-void DoFail(const std::string& reason, const T&) {
-  EXPECT_TRUE(false) << reason;
-}
-
-template <typename T>
-base::Callback<void(const T&)> Fail(const std::string& reason) {
-  return base::Bind(&DoFail<T>, reason);
-}
-
-template <typename T>
-void ExpectError(InterfacePtr<T> *proxy, const base::Closure& callback) {
-  proxy->set_connection_error_handler(callback);
-}
-
-// This implements the generated Chromium variant of RectService.
-class ChromiumRectServiceImpl : public RectService {
- public:
-  ChromiumRectServiceImpl() {}
-
-  // mojo::test::RectService:
-  void AddRect(const RectChromium& r) override {
-    if (r.GetArea() > largest_rect_.GetArea())
-      largest_rect_ = r;
-  }
-
-  void GetLargestRect(const GetLargestRectCallback& callback) override {
-    callback.Run(largest_rect_);
-  }
-
-  void PassSharedRect(const SharedRect& r,
-                      const PassSharedRectCallback& callback) override {
-    callback.Run(r);
-  }
-
- private:
-  RectChromium largest_rect_;
-};
-
-// This implements the generated Blink variant of RectService.
-class BlinkRectServiceImpl : public blink::RectService {
- public:
-  BlinkRectServiceImpl() {}
-
-  // mojo::test::blink::RectService:
-  void AddRect(const RectBlink& r) override {
-    if (r.computeArea() > largest_rect_.computeArea()) {
-      largest_rect_.setX(r.x());
-      largest_rect_.setY(r.y());
-      largest_rect_.setWidth(r.width());
-      largest_rect_.setHeight(r.height());
-    }
-  }
-
-  void GetLargestRect(const GetLargestRectCallback& callback) override {
-    callback.Run(largest_rect_);
-  }
-
-  void PassSharedRect(const SharedRect& r,
-                      const PassSharedRectCallback& callback) override {
-    callback.Run(r);
-  }
-
- private:
-  RectBlink largest_rect_;
-};
-
-// A test which runs both Chromium and Blink implementations of a RectService.
-class StructTraitsTest : public testing::Test,
-                         public TraitsTestService {
- public:
-  StructTraitsTest() {}
-
- protected:
-  void BindToChromiumService(RectServiceRequest request) {
-    chromium_bindings_.AddBinding(&chromium_service_, std::move(request));
-  }
-  void BindToChromiumService(blink::RectServiceRequest request) {
-    chromium_bindings_.AddBinding(
-        &chromium_service_,
-        ConvertInterfaceRequest<RectService>(std::move(request)));
-  }
-
-  void BindToBlinkService(blink::RectServiceRequest request) {
-    blink_bindings_.AddBinding(&blink_service_, std::move(request));
-  }
-  void BindToBlinkService(RectServiceRequest request) {
-    blink_bindings_.AddBinding(
-        &blink_service_,
-        ConvertInterfaceRequest<blink::RectService>(std::move(request)));
-  }
-
-  TraitsTestServicePtr GetTraitsTestProxy() {
-    return traits_test_bindings_.CreateInterfacePtrAndBind(this);
-  }
-
- private:
-  // TraitsTestService:
-  void EchoStructWithTraits(
-      const StructWithTraitsImpl& s,
-      const EchoStructWithTraitsCallback& callback) override {
-    callback.Run(s);
-  }
-
-  void EchoTrivialStructWithTraits(
-      TrivialStructWithTraitsImpl s,
-      const EchoTrivialStructWithTraitsCallback& callback) override {
-    callback.Run(s);
-  }
-
-  void EchoMoveOnlyStructWithTraits(
-      MoveOnlyStructWithTraitsImpl s,
-      const EchoMoveOnlyStructWithTraitsCallback& callback) override {
-    callback.Run(std::move(s));
-  }
-
-  void EchoNullableMoveOnlyStructWithTraits(
-      base::Optional<MoveOnlyStructWithTraitsImpl> s,
-      const EchoNullableMoveOnlyStructWithTraitsCallback& callback) override {
-    callback.Run(std::move(s));
-  }
-
-  void EchoEnumWithTraits(EnumWithTraitsImpl e,
-                          const EchoEnumWithTraitsCallback& callback) override {
-    callback.Run(e);
-  }
-
-  void EchoStructWithTraitsForUniquePtr(
-      std::unique_ptr<int> e,
-      const EchoStructWithTraitsForUniquePtrCallback& callback) override {
-    callback.Run(std::move(e));
-  }
-
-  void EchoNullableStructWithTraitsForUniquePtr(
-      std::unique_ptr<int> e,
-      const EchoNullableStructWithTraitsForUniquePtrCallback& callback)
-      override {
-    callback.Run(std::move(e));
-  }
-
-  void EchoUnionWithTraits(
-      std::unique_ptr<test::UnionWithTraitsBase> u,
-      const EchoUnionWithTraitsCallback& callback) override {
-    callback.Run(std::move(u));
-  }
-
-  base::MessageLoop loop_;
-
-  ChromiumRectServiceImpl chromium_service_;
-  BindingSet<RectService> chromium_bindings_;
-
-  BlinkRectServiceImpl blink_service_;
-  BindingSet<blink::RectService> blink_bindings_;
-
-  BindingSet<TraitsTestService> traits_test_bindings_;
-};
-
-}  // namespace
-
-TEST_F(StructTraitsTest, ChromiumProxyToChromiumService) {
-  RectServicePtr chromium_proxy;
-  BindToChromiumService(MakeRequest(&chromium_proxy));
-  {
-    base::RunLoop loop;
-    chromium_proxy->AddRect(RectChromium(1, 1, 4, 5));
-    chromium_proxy->AddRect(RectChromium(-1, -1, 2, 2));
-    chromium_proxy->GetLargestRect(
-        ExpectResult(RectChromium(1, 1, 4, 5), loop.QuitClosure()));
-    loop.Run();
-  }
-  {
-    base::RunLoop loop;
-    chromium_proxy->PassSharedRect(
-        {1, 2, 3, 4},
-        ExpectResult(SharedRect({1, 2, 3, 4}), loop.QuitClosure()));
-    loop.Run();
-  }
-}
-
-TEST_F(StructTraitsTest, ChromiumToBlinkService) {
-  RectServicePtr chromium_proxy;
-  BindToBlinkService(MakeRequest(&chromium_proxy));
-  {
-    base::RunLoop loop;
-    chromium_proxy->AddRect(RectChromium(1, 1, 4, 5));
-    chromium_proxy->AddRect(RectChromium(2, 2, 5, 5));
-    chromium_proxy->GetLargestRect(
-        ExpectResult(RectChromium(2, 2, 5, 5), loop.QuitClosure()));
-    loop.Run();
-  }
-  {
-    base::RunLoop loop;
-    chromium_proxy->PassSharedRect(
-        {1, 2, 3, 4},
-        ExpectResult(SharedRect({1, 2, 3, 4}), loop.QuitClosure()));
-    loop.Run();
-  }
-  // The Blink service should drop our connection because RectBlink's
-  // deserializer rejects negative origins.
-  {
-    base::RunLoop loop;
-    ExpectError(&chromium_proxy, loop.QuitClosure());
-    chromium_proxy->AddRect(RectChromium(-1, -1, 2, 2));
-    chromium_proxy->GetLargestRect(
-        Fail<RectChromium>("The pipe should have been closed."));
-    loop.Run();
-  }
-}
-
-TEST_F(StructTraitsTest, BlinkProxyToBlinkService) {
-  blink::RectServicePtr blink_proxy;
-  BindToBlinkService(MakeRequest(&blink_proxy));
-  {
-    base::RunLoop loop;
-    blink_proxy->AddRect(RectBlink(1, 1, 4, 5));
-    blink_proxy->AddRect(RectBlink(10, 10, 20, 20));
-    blink_proxy->GetLargestRect(
-        ExpectResult(RectBlink(10, 10, 20, 20), loop.QuitClosure()));
-    loop.Run();
-  }
-  {
-    base::RunLoop loop;
-    blink_proxy->PassSharedRect(
-        {4, 3, 2, 1},
-        ExpectResult(SharedRect({4, 3, 2, 1}), loop.QuitClosure()));
-    loop.Run();
-  }
-}
-
-TEST_F(StructTraitsTest, BlinkProxyToChromiumService) {
-  blink::RectServicePtr blink_proxy;
-  BindToChromiumService(MakeRequest(&blink_proxy));
-  {
-    base::RunLoop loop;
-    blink_proxy->AddRect(RectBlink(1, 1, 4, 5));
-    blink_proxy->AddRect(RectBlink(10, 10, 2, 2));
-    blink_proxy->GetLargestRect(
-        ExpectResult(RectBlink(1, 1, 4, 5), loop.QuitClosure()));
-    loop.Run();
-  }
-  {
-    base::RunLoop loop;
-    blink_proxy->PassSharedRect(
-        {4, 3, 2, 1},
-        ExpectResult(SharedRect({4, 3, 2, 1}), loop.QuitClosure()));
-    loop.Run();
-  }
-}
-
-void ExpectStructWithTraits(const StructWithTraitsImpl& expected,
-                            const base::Closure& closure,
-                            const StructWithTraitsImpl& passed) {
-  EXPECT_EQ(expected.get_enum(), passed.get_enum());
-  EXPECT_EQ(expected.get_bool(), passed.get_bool());
-  EXPECT_EQ(expected.get_uint32(), passed.get_uint32());
-  EXPECT_EQ(expected.get_uint64(), passed.get_uint64());
-  EXPECT_EQ(expected.get_string(), passed.get_string());
-  EXPECT_EQ(expected.get_string_array(), passed.get_string_array());
-  EXPECT_EQ(expected.get_struct(), passed.get_struct());
-  EXPECT_EQ(expected.get_struct_array(), passed.get_struct_array());
-  EXPECT_EQ(expected.get_struct_map(), passed.get_struct_map());
-  closure.Run();
-}
-
-TEST_F(StructTraitsTest, EchoStructWithTraits) {
-  StructWithTraitsImpl input;
-  input.set_enum(EnumWithTraitsImpl::CUSTOM_VALUE_1);
-  input.set_bool(true);
-  input.set_uint32(7);
-  input.set_uint64(42);
-  input.set_string("hello world!");
-  input.get_mutable_string_array().assign({"hello", "world!"});
-  input.get_mutable_string_set().insert("hello");
-  input.get_mutable_string_set().insert("world!");
-  input.get_mutable_struct().value = 42;
-  input.get_mutable_struct_array().resize(2);
-  input.get_mutable_struct_array()[0].value = 1;
-  input.get_mutable_struct_array()[1].value = 2;
-  input.get_mutable_struct_map()["hello"] = NestedStructWithTraitsImpl(1024);
-  input.get_mutable_struct_map()["world"] = NestedStructWithTraitsImpl(2048);
-
-  base::RunLoop loop;
-  TraitsTestServicePtr proxy = GetTraitsTestProxy();
-
-  proxy->EchoStructWithTraits(
-      input,
-      base::Bind(&ExpectStructWithTraits, input, loop.QuitClosure()));
-  loop.Run();
-}
-
-TEST_F(StructTraitsTest, CloneStructWithTraitsContainer) {
-  StructWithTraitsContainerPtr container = StructWithTraitsContainer::New();
-  container->f_struct.set_uint32(7);
-  container->f_struct.set_uint64(42);
-  StructWithTraitsContainerPtr cloned_container = container.Clone();
-  EXPECT_EQ(7u, cloned_container->f_struct.get_uint32());
-  EXPECT_EQ(42u, cloned_container->f_struct.get_uint64());
-}
-
-void ExpectTrivialStructWithTraits(TrivialStructWithTraitsImpl expected,
-                                   const base::Closure& closure,
-                                   TrivialStructWithTraitsImpl passed) {
-  EXPECT_EQ(expected.value, passed.value);
-  closure.Run();
-}
-
-TEST_F(StructTraitsTest, EchoTrivialStructWithTraits) {
-  TrivialStructWithTraitsImpl input;
-  input.value = 42;
-
-  base::RunLoop loop;
-  TraitsTestServicePtr proxy = GetTraitsTestProxy();
-
-  proxy->EchoTrivialStructWithTraits(
-      input,
-      base::Bind(&ExpectTrivialStructWithTraits, input, loop.QuitClosure()));
-  loop.Run();
-}
-
-void CaptureMessagePipe(ScopedMessagePipeHandle* storage,
-                        const base::Closure& closure,
-                        MoveOnlyStructWithTraitsImpl passed) {
-  storage->reset(MessagePipeHandle(
-      passed.get_mutable_handle().release().value()));
-  closure.Run();
-}
-
-TEST_F(StructTraitsTest, EchoMoveOnlyStructWithTraits) {
-  MessagePipe mp;
-  MoveOnlyStructWithTraitsImpl input;
-  input.get_mutable_handle().reset(mp.handle0.release());
-
-  base::RunLoop loop;
-  TraitsTestServicePtr proxy = GetTraitsTestProxy();
-
-  ScopedMessagePipeHandle received;
-  proxy->EchoMoveOnlyStructWithTraits(
-      std::move(input),
-      base::Bind(&CaptureMessagePipe, &received, loop.QuitClosure()));
-  loop.Run();
-
-  ASSERT_TRUE(received.is_valid());
-
-  // Verify that the message pipe handle is correctly passed.
-  const char kHello[] = "hello";
-  const uint32_t kHelloSize = static_cast<uint32_t>(sizeof(kHello));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            WriteMessageRaw(mp.handle1.get(), kHello, kHelloSize, nullptr, 0,
-                            MOJO_WRITE_MESSAGE_FLAG_NONE));
-
-  EXPECT_EQ(MOJO_RESULT_OK, Wait(received.get(), MOJO_HANDLE_SIGNAL_READABLE));
-
-  char buffer[10] = {0};
-  uint32_t buffer_size = static_cast<uint32_t>(sizeof(buffer));
-  EXPECT_EQ(MOJO_RESULT_OK,
-            ReadMessageRaw(received.get(), buffer, &buffer_size, nullptr,
-                           nullptr, MOJO_READ_MESSAGE_FLAG_NONE));
-  EXPECT_EQ(kHelloSize, buffer_size);
-  EXPECT_STREQ(kHello, buffer);
-}
-
-void CaptureNullableMoveOnlyStructWithTraitsImpl(
-    base::Optional<MoveOnlyStructWithTraitsImpl>* storage,
-    const base::Closure& closure,
-    base::Optional<MoveOnlyStructWithTraitsImpl> passed) {
-  *storage = std::move(passed);
-  closure.Run();
-}
-
-TEST_F(StructTraitsTest, EchoNullableMoveOnlyStructWithTraits) {
-  base::RunLoop loop;
-  TraitsTestServicePtr proxy = GetTraitsTestProxy();
-
-  base::Optional<MoveOnlyStructWithTraitsImpl> received;
-  proxy->EchoNullableMoveOnlyStructWithTraits(
-      base::nullopt, base::Bind(&CaptureNullableMoveOnlyStructWithTraitsImpl,
-                                &received, loop.QuitClosure()));
-  loop.Run();
-
-  EXPECT_FALSE(received);
-}
-
-void ExpectEnumWithTraits(EnumWithTraitsImpl expected_value,
-                          const base::Closure& closure,
-                          EnumWithTraitsImpl value) {
-  EXPECT_EQ(expected_value, value);
-  closure.Run();
-}
-
-TEST_F(StructTraitsTest, EchoEnumWithTraits) {
-  base::RunLoop loop;
-  TraitsTestServicePtr proxy = GetTraitsTestProxy();
-
-  proxy->EchoEnumWithTraits(
-      EnumWithTraitsImpl::CUSTOM_VALUE_1,
-      base::Bind(&ExpectEnumWithTraits, EnumWithTraitsImpl::CUSTOM_VALUE_1,
-                 loop.QuitClosure()));
-  loop.Run();
-}
-
-TEST_F(StructTraitsTest, SerializeStructWithTraits) {
-  StructWithTraitsImpl input;
-  input.set_enum(EnumWithTraitsImpl::CUSTOM_VALUE_1);
-  input.set_bool(true);
-  input.set_uint32(7);
-  input.set_uint64(42);
-  input.set_string("hello world!");
-  input.get_mutable_string_array().assign({ "hello", "world!" });
-  input.get_mutable_string_set().insert("hello");
-  input.get_mutable_string_set().insert("world!");
-  input.get_mutable_struct().value = 42;
-  input.get_mutable_struct_array().resize(2);
-  input.get_mutable_struct_array()[0].value = 1;
-  input.get_mutable_struct_array()[1].value = 2;
-  input.get_mutable_struct_map()["hello"] = NestedStructWithTraitsImpl(1024);
-  input.get_mutable_struct_map()["world"] = NestedStructWithTraitsImpl(2048);
-
-  auto data = StructWithTraits::Serialize(&input);
-  StructWithTraitsImpl output;
-  ASSERT_TRUE(StructWithTraits::Deserialize(std::move(data), &output));
-
-  EXPECT_EQ(input.get_enum(), output.get_enum());
-  EXPECT_EQ(input.get_bool(), output.get_bool());
-  EXPECT_EQ(input.get_uint32(), output.get_uint32());
-  EXPECT_EQ(input.get_uint64(), output.get_uint64());
-  EXPECT_EQ(input.get_string(), output.get_string());
-  EXPECT_EQ(input.get_string_array(), output.get_string_array());
-  EXPECT_EQ(input.get_string_set(), output.get_string_set());
-  EXPECT_EQ(input.get_struct(), output.get_struct());
-  EXPECT_EQ(input.get_struct_array(), output.get_struct_array());
-  EXPECT_EQ(input.get_struct_map(), output.get_struct_map());
-}
-
-void ExpectUniquePtr(std::unique_ptr<int> expected,
-                     const base::Closure& closure,
-                     std::unique_ptr<int> value) {
-  ASSERT_EQ(!expected, !value);
-  if (expected)
-    EXPECT_EQ(*expected, *value);
-  closure.Run();
-}
-
-TEST_F(StructTraitsTest, TypemapUniquePtr) {
-  TraitsTestServicePtr proxy = GetTraitsTestProxy();
-
-  {
-    base::RunLoop loop;
-    proxy->EchoStructWithTraitsForUniquePtr(
-        base::MakeUnique<int>(12345),
-        base::Bind(&ExpectUniquePtr, base::Passed(base::MakeUnique<int>(12345)),
-                   loop.QuitClosure()));
-    loop.Run();
-  }
-  {
-    base::RunLoop loop;
-    proxy->EchoNullableStructWithTraitsForUniquePtr(
-        nullptr, base::Bind(&ExpectUniquePtr, nullptr, loop.QuitClosure()));
-    loop.Run();
-  }
-}
-
-TEST_F(StructTraitsTest, EchoUnionWithTraits) {
-  TraitsTestServicePtr proxy = GetTraitsTestProxy();
-
-  {
-    std::unique_ptr<test::UnionWithTraitsBase> input(
-        new test::UnionWithTraitsInt32(1234));
-    base::RunLoop loop;
-    proxy->EchoUnionWithTraits(
-        std::move(input),
-        base::Bind(
-            [](const base::Closure& quit_closure,
-               std::unique_ptr<test::UnionWithTraitsBase> passed) {
-              ASSERT_EQ(test::UnionWithTraitsBase::Type::INT32, passed->type());
-              EXPECT_EQ(1234,
-                        static_cast<test::UnionWithTraitsInt32*>(passed.get())
-                            ->value());
-              quit_closure.Run();
-
-            },
-            loop.QuitClosure()));
-    loop.Run();
-  }
-
-  {
-    std::unique_ptr<test::UnionWithTraitsBase> input(
-        new test::UnionWithTraitsStruct(4321));
-    base::RunLoop loop;
-    proxy->EchoUnionWithTraits(
-        std::move(input),
-        base::Bind(
-            [](const base::Closure& quit_closure,
-               std::unique_ptr<test::UnionWithTraitsBase> passed) {
-              ASSERT_EQ(test::UnionWithTraitsBase::Type::STRUCT,
-                        passed->type());
-              EXPECT_EQ(4321,
-                        static_cast<test::UnionWithTraitsStruct*>(passed.get())
-                            ->get_struct()
-                            .value);
-              quit_closure.Run();
-
-            },
-            loop.QuitClosure()));
-    loop.Run();
-  }
-}
-
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/struct_unittest.cc b/mojo/public/cpp/bindings/tests/struct_unittest.cc
deleted file mode 100644
index a687052..0000000
--- a/mojo/public/cpp/bindings/tests/struct_unittest.cc
+++ /dev/null
@@ -1,526 +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 <stddef.h>
-#include <stdint.h>
-#include <string.h>
-#include <utility>
-
-#include "mojo/public/cpp/bindings/lib/fixed_buffer.h"
-#include "mojo/public/cpp/system/message_pipe.h"
-#include "mojo/public/interfaces/bindings/tests/test_export2.mojom.h"
-#include "mojo/public/interfaces/bindings/tests/test_structs.mojom.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace test {
-namespace {
-
-RectPtr MakeRect(int32_t factor = 1) {
-  return Rect::New(1 * factor, 2 * factor, 10 * factor, 20 * factor);
-}
-
-void CheckRect(const Rect& rect, int32_t factor = 1) {
-  EXPECT_EQ(1 * factor, rect.x);
-  EXPECT_EQ(2 * factor, rect.y);
-  EXPECT_EQ(10 * factor, rect.width);
-  EXPECT_EQ(20 * factor, rect.height);
-}
-
-MultiVersionStructPtr MakeMultiVersionStruct() {
-  MessagePipe pipe;
-  return MultiVersionStruct::New(123, MakeRect(5), std::string("hello"),
-                                 std::vector<int8_t>{10, 9, 8},
-                                 std::move(pipe.handle0), false, 42);
-}
-
-template <typename U, typename T>
-U SerializeAndDeserialize(T input) {
-  using InputMojomType = typename T::Struct::DataView;
-  using OutputMojomType = typename U::Struct::DataView;
-
-  using InputDataType =
-      typename mojo::internal::MojomTypeTraits<InputMojomType>::Data*;
-  using OutputDataType =
-      typename mojo::internal::MojomTypeTraits<OutputMojomType>::Data*;
-
-  mojo::internal::SerializationContext context;
-  size_t size =
-      mojo::internal::PrepareToSerialize<InputMojomType>(input, &context);
-  mojo::internal::FixedBufferForTesting buf(size + 32);
-  InputDataType data;
-  mojo::internal::Serialize<InputMojomType>(input, &buf, &data, &context);
-
-  // Set the subsequent area to a special value, so that we can find out if we
-  // mistakenly access the area.
-  void* subsequent_area = buf.Allocate(32);
-  memset(subsequent_area, 0xAA, 32);
-
-  OutputDataType output_data = reinterpret_cast<OutputDataType>(data);
-
-  U output;
-  mojo::internal::Deserialize<OutputMojomType>(output_data, &output, &context);
-  return std::move(output);
-}
-
-using StructTest = testing::Test;
-
-}  // namespace
-
-TEST_F(StructTest, Rect) {
-  RectPtr rect;
-  EXPECT_TRUE(rect.is_null());
-  EXPECT_TRUE(!rect);
-  EXPECT_FALSE(rect);
-
-  rect = nullptr;
-  EXPECT_TRUE(rect.is_null());
-  EXPECT_TRUE(!rect);
-  EXPECT_FALSE(rect);
-
-  rect = MakeRect();
-  EXPECT_FALSE(rect.is_null());
-  EXPECT_FALSE(!rect);
-  EXPECT_TRUE(rect);
-
-  RectPtr null_rect = nullptr;
-  EXPECT_TRUE(null_rect.is_null());
-  EXPECT_TRUE(!null_rect);
-  EXPECT_FALSE(null_rect);
-
-  CheckRect(*rect);
-}
-
-TEST_F(StructTest, Clone) {
-  NamedRegionPtr region;
-
-  NamedRegionPtr clone_region = region.Clone();
-  EXPECT_TRUE(clone_region.is_null());
-
-  region = NamedRegion::New();
-  clone_region = region.Clone();
-  EXPECT_FALSE(clone_region->name);
-  EXPECT_FALSE(clone_region->rects);
-
-  region->name.emplace("hello world");
-  clone_region = region.Clone();
-  EXPECT_EQ(region->name, clone_region->name);
-
-  region->rects.emplace(2);
-  (*region->rects)[1] = MakeRect();
-  clone_region = region.Clone();
-  EXPECT_EQ(2u, clone_region->rects->size());
-  EXPECT_TRUE((*clone_region->rects)[0].is_null());
-  CheckRect(*(*clone_region->rects)[1]);
-
-  // NoDefaultFieldValues contains handles, so Clone() is not available, but
-  // NoDefaultFieldValuesPtr should still compile.
-  NoDefaultFieldValuesPtr no_default_field_values(NoDefaultFieldValues::New());
-  EXPECT_FALSE(no_default_field_values->f13.is_valid());
-}
-
-// Serialization test of a struct with no pointer or handle members.
-TEST_F(StructTest, Serialization_Basic) {
-  RectPtr rect(MakeRect());
-
-  size_t size = mojo::internal::PrepareToSerialize<RectDataView>(rect, nullptr);
-  EXPECT_EQ(8U + 16U, size);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::Rect_Data* data;
-  mojo::internal::Serialize<RectDataView>(rect, &buf, &data, nullptr);
-
-  RectPtr rect2;
-  mojo::internal::Deserialize<RectDataView>(data, &rect2, nullptr);
-
-  CheckRect(*rect2);
-}
-
-// Construction of a struct with struct pointers from null.
-TEST_F(StructTest, Construction_StructPointers) {
-  RectPairPtr pair;
-  EXPECT_TRUE(pair.is_null());
-
-  pair = RectPair::New();
-  EXPECT_FALSE(pair.is_null());
-  EXPECT_TRUE(pair->first.is_null());
-  EXPECT_TRUE(pair->first.is_null());
-
-  pair = nullptr;
-  EXPECT_TRUE(pair.is_null());
-}
-
-// Serialization test of a struct with struct pointers.
-TEST_F(StructTest, Serialization_StructPointers) {
-  RectPairPtr pair(RectPair::New(MakeRect(), MakeRect()));
-
-  size_t size =
-      mojo::internal::PrepareToSerialize<RectPairDataView>(pair, nullptr);
-  EXPECT_EQ(8U + 16U + 2 * (8U + 16U), size);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::RectPair_Data* data;
-  mojo::internal::Serialize<RectPairDataView>(pair, &buf, &data, nullptr);
-
-  RectPairPtr pair2;
-  mojo::internal::Deserialize<RectPairDataView>(data, &pair2, nullptr);
-
-  CheckRect(*pair2->first);
-  CheckRect(*pair2->second);
-}
-
-// Serialization test of a struct with an array member.
-TEST_F(StructTest, Serialization_ArrayPointers) {
-  std::vector<RectPtr> rects;
-  for (size_t i = 0; i < 4; ++i)
-    rects.push_back(MakeRect(static_cast<int32_t>(i) + 1));
-
-  NamedRegionPtr region(
-      NamedRegion::New(std::string("region"), std::move(rects)));
-
-  size_t size =
-      mojo::internal::PrepareToSerialize<NamedRegionDataView>(region, nullptr);
-  EXPECT_EQ(8U +            // header
-                8U +        // name pointer
-                8U +        // rects pointer
-                8U +        // name header
-                8U +        // name payload (rounded up)
-                8U +        // rects header
-                4 * 8U +    // rects payload (four pointers)
-                4 * (8U +   // rect header
-                     16U),  // rect payload (four ints)
-            size);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::NamedRegion_Data* data;
-  mojo::internal::Serialize<NamedRegionDataView>(region, &buf, &data, nullptr);
-
-  NamedRegionPtr region2;
-  mojo::internal::Deserialize<NamedRegionDataView>(data, &region2, nullptr);
-
-  EXPECT_EQ("region", *region2->name);
-
-  EXPECT_EQ(4U, region2->rects->size());
-  for (size_t i = 0; i < region2->rects->size(); ++i)
-    CheckRect(*(*region2->rects)[i], static_cast<int32_t>(i) + 1);
-}
-
-// Serialization test of a struct with null array pointers.
-TEST_F(StructTest, Serialization_NullArrayPointers) {
-  NamedRegionPtr region(NamedRegion::New());
-  EXPECT_FALSE(region->name);
-  EXPECT_FALSE(region->rects);
-
-  size_t size =
-      mojo::internal::PrepareToSerialize<NamedRegionDataView>(region, nullptr);
-  EXPECT_EQ(8U +      // header
-                8U +  // name pointer
-                8U,   // rects pointer
-            size);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::NamedRegion_Data* data;
-  mojo::internal::Serialize<NamedRegionDataView>(region, &buf, &data, nullptr);
-
-  NamedRegionPtr region2;
-  mojo::internal::Deserialize<NamedRegionDataView>(data, &region2, nullptr);
-
-  EXPECT_FALSE(region2->name);
-  EXPECT_FALSE(region2->rects);
-}
-
-// Tests deserializing structs as a newer version.
-TEST_F(StructTest, Versioning_OldToNew) {
-  {
-    MultiVersionStructV0Ptr input(MultiVersionStructV0::New(123));
-    MultiVersionStructPtr expected_output(MultiVersionStruct::New(123));
-
-    MultiVersionStructPtr output =
-        SerializeAndDeserialize<MultiVersionStructPtr>(std::move(input));
-    EXPECT_TRUE(output);
-    EXPECT_TRUE(output->Equals(*expected_output));
-  }
-
-  {
-    MultiVersionStructV1Ptr input(MultiVersionStructV1::New(123, MakeRect(5)));
-    MultiVersionStructPtr expected_output(
-        MultiVersionStruct::New(123, MakeRect(5)));
-
-    MultiVersionStructPtr output =
-        SerializeAndDeserialize<MultiVersionStructPtr>(std::move(input));
-    EXPECT_TRUE(output);
-    EXPECT_TRUE(output->Equals(*expected_output));
-  }
-
-  {
-    MultiVersionStructV3Ptr input(
-        MultiVersionStructV3::New(123, MakeRect(5), std::string("hello")));
-    MultiVersionStructPtr expected_output(
-        MultiVersionStruct::New(123, MakeRect(5), std::string("hello")));
-
-    MultiVersionStructPtr output =
-        SerializeAndDeserialize<MultiVersionStructPtr>(std::move(input));
-    EXPECT_TRUE(output);
-    EXPECT_TRUE(output->Equals(*expected_output));
-  }
-
-  {
-    MultiVersionStructV5Ptr input(MultiVersionStructV5::New(
-        123, MakeRect(5), std::string("hello"), std::vector<int8_t>{10, 9, 8}));
-    MultiVersionStructPtr expected_output(MultiVersionStruct::New(
-        123, MakeRect(5), std::string("hello"), std::vector<int8_t>{10, 9, 8}));
-
-    MultiVersionStructPtr output =
-        SerializeAndDeserialize<MultiVersionStructPtr>(std::move(input));
-    EXPECT_TRUE(output);
-    EXPECT_TRUE(output->Equals(*expected_output));
-  }
-
-  {
-    MessagePipe pipe;
-    MultiVersionStructV7Ptr input(MultiVersionStructV7::New(
-        123, MakeRect(5), std::string("hello"), std::vector<int8_t>{10, 9, 8},
-        std::move(pipe.handle0), false));
-
-    MultiVersionStructPtr expected_output(MultiVersionStruct::New(
-        123, MakeRect(5), std::string("hello"), std::vector<int8_t>{10, 9, 8}));
-    // Save the raw handle value separately so that we can compare later.
-    MojoHandle expected_handle = input->f_message_pipe.get().value();
-
-    MultiVersionStructPtr output =
-        SerializeAndDeserialize<MultiVersionStructPtr>(std::move(input));
-    EXPECT_TRUE(output);
-    EXPECT_EQ(expected_handle, output->f_message_pipe.get().value());
-    output->f_message_pipe.reset();
-    EXPECT_TRUE(output->Equals(*expected_output));
-  }
-}
-
-// Tests deserializing structs as an older version.
-TEST_F(StructTest, Versioning_NewToOld) {
-  {
-    MultiVersionStructPtr input = MakeMultiVersionStruct();
-    MultiVersionStructV7Ptr expected_output(MultiVersionStructV7::New(
-        123, MakeRect(5), std::string("hello"), std::vector<int8_t>{10, 9, 8}));
-    // Save the raw handle value separately so that we can compare later.
-    MojoHandle expected_handle = input->f_message_pipe.get().value();
-
-    MultiVersionStructV7Ptr output =
-        SerializeAndDeserialize<MultiVersionStructV7Ptr>(std::move(input));
-    EXPECT_TRUE(output);
-    EXPECT_EQ(expected_handle, output->f_message_pipe.get().value());
-    output->f_message_pipe.reset();
-    EXPECT_TRUE(output->Equals(*expected_output));
-  }
-
-  {
-    MultiVersionStructPtr input = MakeMultiVersionStruct();
-    MultiVersionStructV5Ptr expected_output(MultiVersionStructV5::New(
-        123, MakeRect(5), std::string("hello"), std::vector<int8_t>{10, 9, 8}));
-
-    MultiVersionStructV5Ptr output =
-        SerializeAndDeserialize<MultiVersionStructV5Ptr>(std::move(input));
-    EXPECT_TRUE(output);
-    EXPECT_TRUE(output->Equals(*expected_output));
-  }
-
-  {
-    MultiVersionStructPtr input = MakeMultiVersionStruct();
-    MultiVersionStructV3Ptr expected_output(
-        MultiVersionStructV3::New(123, MakeRect(5), std::string("hello")));
-
-    MultiVersionStructV3Ptr output =
-        SerializeAndDeserialize<MultiVersionStructV3Ptr>(std::move(input));
-    EXPECT_TRUE(output);
-    EXPECT_TRUE(output->Equals(*expected_output));
-  }
-
-  {
-    MultiVersionStructPtr input = MakeMultiVersionStruct();
-    MultiVersionStructV1Ptr expected_output(
-        MultiVersionStructV1::New(123, MakeRect(5)));
-
-    MultiVersionStructV1Ptr output =
-        SerializeAndDeserialize<MultiVersionStructV1Ptr>(std::move(input));
-    EXPECT_TRUE(output);
-    EXPECT_TRUE(output->Equals(*expected_output));
-  }
-
-  {
-    MultiVersionStructPtr input = MakeMultiVersionStruct();
-    MultiVersionStructV0Ptr expected_output(MultiVersionStructV0::New(123));
-
-    MultiVersionStructV0Ptr output =
-        SerializeAndDeserialize<MultiVersionStructV0Ptr>(std::move(input));
-    EXPECT_TRUE(output);
-    EXPECT_TRUE(output->Equals(*expected_output));
-  }
-}
-
-// Serialization test for native struct.
-TEST_F(StructTest, Serialization_NativeStruct) {
-  using Data = mojo::internal::NativeStruct_Data;
-  {
-    // Serialization of a null native struct.
-    NativeStructPtr native;
-    size_t size = mojo::internal::PrepareToSerialize<NativeStructDataView>(
-        native, nullptr);
-    EXPECT_EQ(0u, size);
-    mojo::internal::FixedBufferForTesting buf(size);
-
-    Data* data = nullptr;
-    mojo::internal::Serialize<NativeStructDataView>(std::move(native), &buf,
-                                                    &data, nullptr);
-
-    EXPECT_EQ(nullptr, data);
-
-    NativeStructPtr output_native;
-    mojo::internal::Deserialize<NativeStructDataView>(data, &output_native,
-                                                      nullptr);
-    EXPECT_TRUE(output_native.is_null());
-  }
-
-  {
-    // Serialization of a native struct with null data.
-    NativeStructPtr native(NativeStruct::New());
-    size_t size = mojo::internal::PrepareToSerialize<NativeStructDataView>(
-        native, nullptr);
-    EXPECT_EQ(0u, size);
-    mojo::internal::FixedBufferForTesting buf(size);
-
-    Data* data = nullptr;
-    mojo::internal::Serialize<NativeStructDataView>(std::move(native), &buf,
-                                                    &data, nullptr);
-
-    EXPECT_EQ(nullptr, data);
-
-    NativeStructPtr output_native;
-    mojo::internal::Deserialize<NativeStructDataView>(data, &output_native,
-                                                      nullptr);
-    EXPECT_TRUE(output_native.is_null());
-  }
-
-  {
-    NativeStructPtr native(NativeStruct::New());
-    native->data = std::vector<uint8_t>{'X', 'Y'};
-
-    size_t size = mojo::internal::PrepareToSerialize<NativeStructDataView>(
-        native, nullptr);
-    EXPECT_EQ(16u, size);
-    mojo::internal::FixedBufferForTesting buf(size);
-
-    Data* data = nullptr;
-    mojo::internal::Serialize<NativeStructDataView>(std::move(native), &buf,
-                                                    &data, nullptr);
-
-    EXPECT_NE(nullptr, data);
-
-    NativeStructPtr output_native;
-    mojo::internal::Deserialize<NativeStructDataView>(data, &output_native,
-                                                      nullptr);
-    ASSERT_TRUE(output_native);
-    ASSERT_FALSE(output_native->data->empty());
-    EXPECT_EQ(2u, output_native->data->size());
-    EXPECT_EQ('X', (*output_native->data)[0]);
-    EXPECT_EQ('Y', (*output_native->data)[1]);
-  }
-}
-
-TEST_F(StructTest, Serialization_PublicAPI) {
-  {
-    // A null struct pointer.
-    RectPtr null_struct;
-    auto data = Rect::Serialize(&null_struct);
-    EXPECT_TRUE(data.empty());
-
-    // Initialize it to non-null.
-    RectPtr output(Rect::New());
-    ASSERT_TRUE(Rect::Deserialize(data, &output));
-    EXPECT_TRUE(output.is_null());
-  }
-
-  {
-    // A struct with no fields.
-    EmptyStructPtr empty_struct(EmptyStruct::New());
-    auto data = EmptyStruct::Serialize(&empty_struct);
-    EXPECT_FALSE(data.empty());
-
-    EmptyStructPtr output;
-    ASSERT_TRUE(EmptyStruct::Deserialize(data, &output));
-    EXPECT_FALSE(output.is_null());
-  }
-
-  {
-    // A simple struct.
-    RectPtr rect = MakeRect();
-    RectPtr cloned_rect = rect.Clone();
-    auto data = Rect::Serialize(&rect);
-
-    RectPtr output;
-    ASSERT_TRUE(Rect::Deserialize(data, &output));
-    EXPECT_TRUE(output.Equals(cloned_rect));
-  }
-
-  {
-    // A struct containing other objects.
-    std::vector<RectPtr> rects;
-    for (size_t i = 0; i < 3; ++i)
-      rects.push_back(MakeRect(static_cast<int32_t>(i) + 1));
-    NamedRegionPtr region(
-        NamedRegion::New(std::string("region"), std::move(rects)));
-
-    NamedRegionPtr cloned_region = region.Clone();
-    auto data = NamedRegion::Serialize(&region);
-
-    // Make sure that the serialized result gets pointers encoded properly.
-    auto cloned_data = data;
-    NamedRegionPtr output;
-    ASSERT_TRUE(NamedRegion::Deserialize(cloned_data, &output));
-    EXPECT_TRUE(output.Equals(cloned_region));
-  }
-
-  {
-    // Deserialization failure.
-    RectPtr rect = MakeRect();
-    auto data = Rect::Serialize(&rect);
-
-    NamedRegionPtr output;
-    EXPECT_FALSE(NamedRegion::Deserialize(data, &output));
-  }
-
-  {
-    // A struct from another component.
-    auto pair = test_export2::StringPair::New("hello", "world");
-    auto data = test_export2::StringPair::Serialize(&pair);
-
-    test_export2::StringPairPtr output;
-    ASSERT_TRUE(test_export2::StringPair::Deserialize(data, &output));
-    EXPECT_TRUE(output.Equals(pair));
-  }
-}
-
-TEST_F(StructTest, VersionedStructConstructor) {
-  auto reordered = ReorderedStruct::New(123, 456, 789);
-  EXPECT_EQ(123, reordered->a);
-  EXPECT_EQ(456, reordered->b);
-  EXPECT_EQ(789, reordered->c);
-
-  reordered = ReorderedStruct::New(123, 456);
-  EXPECT_EQ(123, reordered->a);
-  EXPECT_EQ(6, reordered->b);
-  EXPECT_EQ(456, reordered->c);
-
-  reordered = ReorderedStruct::New(123);
-  EXPECT_EQ(3, reordered->a);
-  EXPECT_EQ(6, reordered->b);
-  EXPECT_EQ(123, reordered->c);
-
-  reordered = ReorderedStruct::New();
-  EXPECT_EQ(3, reordered->a);
-  EXPECT_EQ(6, reordered->b);
-  EXPECT_EQ(1, reordered->c);
-}
-
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/struct_with_traits.typemap b/mojo/public/cpp/bindings/tests/struct_with_traits.typemap
deleted file mode 100644
index 752ce44..0000000
--- a/mojo/public/cpp/bindings/tests/struct_with_traits.typemap
+++ /dev/null
@@ -1,26 +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.
-
-mojom = "//mojo/public/interfaces/bindings/tests/struct_with_traits.mojom"
-public_headers =
-    [ "//mojo/public/cpp/bindings/tests/struct_with_traits_impl.h" ]
-traits_headers =
-    [ "//mojo/public/cpp/bindings/tests/struct_with_traits_impl_traits.h" ]
-sources = [
-  "//mojo/public/cpp/bindings/tests/struct_with_traits_impl_traits.cc",
-]
-deps = [
-  "//mojo/public/cpp/bindings/tests:struct_with_traits_impl",
-  "//mojo/public/cpp/system:system",
-]
-
-type_mappings = [
-  "mojo.test.EnumWithTraits=mojo::test::EnumWithTraitsImpl",
-  "mojo.test.StructWithTraits=mojo::test::StructWithTraitsImpl",
-  "mojo.test.NestedStructWithTraits=mojo::test::NestedStructWithTraitsImpl",
-  "mojo.test.TrivialStructWithTraits=mojo::test::TrivialStructWithTraitsImpl[copyable_pass_by_value]",
-  "mojo.test.MoveOnlyStructWithTraits=mojo::test::MoveOnlyStructWithTraitsImpl[move_only]",
-  "mojo.test.StructWithTraitsForUniquePtr=std::unique_ptr<int>[move_only,nullable_is_same_type]",
-  "mojo.test.UnionWithTraits=std::unique_ptr<mojo::test::UnionWithTraitsBase>[move_only,nullable_is_same_type]",
-]
diff --git a/mojo/public/cpp/bindings/tests/struct_with_traits_impl.cc b/mojo/public/cpp/bindings/tests/struct_with_traits_impl.cc
deleted file mode 100644
index cbdd4bf..0000000
--- a/mojo/public/cpp/bindings/tests/struct_with_traits_impl.cc
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/bindings/tests/struct_with_traits_impl.h"
-
-namespace mojo {
-namespace test {
-
-NestedStructWithTraitsImpl::NestedStructWithTraitsImpl() {}
-NestedStructWithTraitsImpl::NestedStructWithTraitsImpl(int32_t in_value)
-    : value(in_value) {}
-
-StructWithTraitsImpl::StructWithTraitsImpl() {}
-
-StructWithTraitsImpl::~StructWithTraitsImpl() {}
-
-StructWithTraitsImpl::StructWithTraitsImpl(const StructWithTraitsImpl& other) =
-    default;
-
-MoveOnlyStructWithTraitsImpl::MoveOnlyStructWithTraitsImpl() {}
-
-MoveOnlyStructWithTraitsImpl::MoveOnlyStructWithTraitsImpl(
-    MoveOnlyStructWithTraitsImpl&& other) = default;
-
-MoveOnlyStructWithTraitsImpl::~MoveOnlyStructWithTraitsImpl() {}
-
-MoveOnlyStructWithTraitsImpl& MoveOnlyStructWithTraitsImpl::operator=(
-    MoveOnlyStructWithTraitsImpl&& other) = default;
-
-UnionWithTraitsInt32::~UnionWithTraitsInt32() {}
-
-UnionWithTraitsStruct::~UnionWithTraitsStruct() {}
-
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/struct_with_traits_impl.h b/mojo/public/cpp/bindings/tests/struct_with_traits_impl.h
deleted file mode 100644
index 7b007cc..0000000
--- a/mojo/public/cpp/bindings/tests/struct_with_traits_impl.h
+++ /dev/null
@@ -1,168 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_TESTS_STRUCT_WITH_TRAITS_IMPL_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_TESTS_STRUCT_WITH_TRAITS_IMPL_H_
-
-#include <stdint.h>
-
-#include <map>
-#include <set>
-#include <string>
-#include <vector>
-
-#include "base/strings/string_piece.h"
-#include "mojo/public/cpp/system/handle.h"
-
-namespace mojo {
-namespace test {
-
-struct NestedStructWithTraitsImpl {
- public:
-  NestedStructWithTraitsImpl();
-  explicit NestedStructWithTraitsImpl(int32_t in_value);
-
-  bool operator==(const NestedStructWithTraitsImpl& other) const {
-    return value == other.value;
-  }
-
-  int32_t value = 0;
-};
-
-enum class EnumWithTraitsImpl { CUSTOM_VALUE_0 = 10, CUSTOM_VALUE_1 = 11 };
-
-// A type which knows how to look like a mojo::test::StructWithTraits mojom type
-// by way of mojo::StructTraits.
-class StructWithTraitsImpl {
- public:
-  StructWithTraitsImpl();
-  ~StructWithTraitsImpl();
-
-  StructWithTraitsImpl(const StructWithTraitsImpl& other);
-
-  void set_enum(EnumWithTraitsImpl value) { enum_ = value; }
-  EnumWithTraitsImpl get_enum() const { return enum_; }
-
-  void set_bool(bool value) { bool_ = value; }
-  bool get_bool() const { return bool_; }
-
-  void set_uint32(uint32_t value) { uint32_ = value; }
-  uint32_t get_uint32() const { return uint32_; }
-
-  void set_uint64(uint64_t value) { uint64_ = value; }
-  uint64_t get_uint64() const { return uint64_; }
-
-  void set_string(std::string value) { string_ = value; }
-  base::StringPiece get_string_as_string_piece() const { return string_; }
-  const std::string& get_string() const { return string_; }
-
-  const std::vector<std::string>& get_string_array() const {
-    return string_array_;
-  }
-  std::vector<std::string>& get_mutable_string_array() { return string_array_; }
-
-  const std::set<std::string>& get_string_set() const {
-    return string_set_;
-  }
-  std::set<std::string>& get_mutable_string_set() { return string_set_; }
-
-  const NestedStructWithTraitsImpl& get_struct() const { return struct_; }
-  NestedStructWithTraitsImpl& get_mutable_struct() { return struct_; }
-
-  const std::vector<NestedStructWithTraitsImpl>& get_struct_array() const {
-    return struct_array_;
-  }
-  std::vector<NestedStructWithTraitsImpl>& get_mutable_struct_array() {
-    return struct_array_;
-  }
-
-  const std::map<std::string, NestedStructWithTraitsImpl>& get_struct_map()
-      const {
-    return struct_map_;
-  }
-  std::map<std::string, NestedStructWithTraitsImpl>& get_mutable_struct_map() {
-    return struct_map_;
-  }
-
- private:
-  EnumWithTraitsImpl enum_ = EnumWithTraitsImpl::CUSTOM_VALUE_0;
-  bool bool_ = false;
-  uint32_t uint32_ = 0;
-  uint64_t uint64_ = 0;
-  std::string string_;
-  std::vector<std::string> string_array_;
-  std::set<std::string> string_set_;
-  NestedStructWithTraitsImpl struct_;
-  std::vector<NestedStructWithTraitsImpl> struct_array_;
-  std::map<std::string, NestedStructWithTraitsImpl> struct_map_;
-};
-
-// A type which knows how to look like a mojo::test::TrivialStructWithTraits
-// mojom type by way of mojo::StructTraits.
-struct TrivialStructWithTraitsImpl {
-  int32_t value;
-};
-
-// A type which knows how to look like a mojo::test::MoveOnlyStructWithTraits
-// mojom type by way of mojo::StructTraits.
-class MoveOnlyStructWithTraitsImpl {
- public:
-  MoveOnlyStructWithTraitsImpl();
-  MoveOnlyStructWithTraitsImpl(MoveOnlyStructWithTraitsImpl&& other);
-  ~MoveOnlyStructWithTraitsImpl();
-
-  ScopedHandle& get_mutable_handle() { return handle_; }
-
-  MoveOnlyStructWithTraitsImpl& operator=(MoveOnlyStructWithTraitsImpl&& other);
-
- private:
-  ScopedHandle handle_;
-  DISALLOW_COPY_AND_ASSIGN(MoveOnlyStructWithTraitsImpl);
-};
-
-class UnionWithTraitsBase {
- public:
-  enum class Type { INT32, STRUCT };
-
-  virtual ~UnionWithTraitsBase() {}
-
-  Type type() const { return type_; }
-
- protected:
-  Type type_ = Type::INT32;
-};
-
-class UnionWithTraitsInt32 : public UnionWithTraitsBase {
- public:
-  UnionWithTraitsInt32() {}
-  explicit UnionWithTraitsInt32(int32_t value) : value_(value) {}
-
-  ~UnionWithTraitsInt32() override;
-
-  int32_t value() const { return value_; }
-  void set_value(int32_t value) { value_ = value; }
-
- private:
-  int32_t value_ = 0;
-};
-
-class UnionWithTraitsStruct : public UnionWithTraitsBase {
- public:
-  UnionWithTraitsStruct() { type_ = Type::STRUCT; }
-  explicit UnionWithTraitsStruct(int32_t value) : struct_(value) {
-    type_ = Type::STRUCT;
-  }
-  ~UnionWithTraitsStruct() override;
-
-  NestedStructWithTraitsImpl& get_mutable_struct() { return struct_; }
-  const NestedStructWithTraitsImpl& get_struct() const { return struct_; }
-
- private:
-  NestedStructWithTraitsImpl struct_;
-};
-
-}  // namespace test
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_TESTS_STRUCT_WITH_TRAITS_IMPL_H_
diff --git a/mojo/public/cpp/bindings/tests/struct_with_traits_impl_traits.cc b/mojo/public/cpp/bindings/tests/struct_with_traits_impl_traits.cc
deleted file mode 100644
index 6b770b1..0000000
--- a/mojo/public/cpp/bindings/tests/struct_with_traits_impl_traits.cc
+++ /dev/null
@@ -1,137 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/bindings/tests/struct_with_traits_impl_traits.h"
-
-namespace mojo {
-namespace {
-
-struct Context {
-  int32_t value;
-};
-
-}  // namespace
-
-// static
-void* StructTraits<test::NestedStructWithTraitsDataView,
-                   test::NestedStructWithTraitsImpl>::
-    SetUpContext(const test::NestedStructWithTraitsImpl& input) {
-  Context* context = new Context;
-  context->value = input.value;
-  return context;
-}
-
-// static
-void StructTraits<test::NestedStructWithTraitsDataView,
-                  test::NestedStructWithTraitsImpl>::
-    TearDownContext(const test::NestedStructWithTraitsImpl& input,
-                    void* context) {
-  Context* context_obj = static_cast<Context*>(context);
-  CHECK_EQ(context_obj->value, input.value);
-  delete context_obj;
-}
-
-// static
-int32_t StructTraits<test::NestedStructWithTraitsDataView,
-                     test::NestedStructWithTraitsImpl>::
-    value(const test::NestedStructWithTraitsImpl& input, void* context) {
-  Context* context_obj = static_cast<Context*>(context);
-  CHECK_EQ(context_obj->value, input.value);
-  return input.value;
-}
-
-// static
-bool StructTraits<test::NestedStructWithTraitsDataView,
-                  test::NestedStructWithTraitsImpl>::
-    Read(test::NestedStructWithTraits::DataView data,
-         test::NestedStructWithTraitsImpl* output) {
-  output->value = data.value();
-  return true;
-}
-
-test::EnumWithTraits
-EnumTraits<test::EnumWithTraits, test::EnumWithTraitsImpl>::ToMojom(
-    test::EnumWithTraitsImpl input) {
-  switch (input) {
-    case test::EnumWithTraitsImpl::CUSTOM_VALUE_0:
-      return test::EnumWithTraits::VALUE_0;
-    case test::EnumWithTraitsImpl::CUSTOM_VALUE_1:
-      return test::EnumWithTraits::VALUE_1;
-  };
-
-  NOTREACHED();
-  return test::EnumWithTraits::VALUE_0;
-}
-
-bool EnumTraits<test::EnumWithTraits, test::EnumWithTraitsImpl>::FromMojom(
-    test::EnumWithTraits input,
-    test::EnumWithTraitsImpl* output) {
-  switch (input) {
-    case test::EnumWithTraits::VALUE_0:
-      *output = test::EnumWithTraitsImpl::CUSTOM_VALUE_0;
-      return true;
-    case test::EnumWithTraits::VALUE_1:
-      *output = test::EnumWithTraitsImpl::CUSTOM_VALUE_1;
-      return true;
-  };
-
-  return false;
-}
-
-// static
-bool StructTraits<test::StructWithTraitsDataView, test::StructWithTraitsImpl>::
-    Read(test::StructWithTraits::DataView data,
-         test::StructWithTraitsImpl* out) {
-  test::EnumWithTraitsImpl f_enum;
-  if (!data.ReadFEnum(&f_enum))
-    return false;
-  out->set_enum(f_enum);
-
-  out->set_bool(data.f_bool());
-  out->set_uint32(data.f_uint32());
-  out->set_uint64(data.f_uint64());
-
-  base::StringPiece f_string;
-  std::string f_string2;
-  if (!data.ReadFString(&f_string) || !data.ReadFString2(&f_string2) ||
-      f_string != f_string2) {
-    return false;
-  }
-  out->set_string(f_string2);
-
-  if (!data.ReadFStringArray(&out->get_mutable_string_array()))
-    return false;
-
-  // We can't deserialize as a std::set, so we have to manually copy from the
-  // data view.
-  ArrayDataView<StringDataView> string_set_data_view;
-  data.GetFStringSetDataView(&string_set_data_view);
-  for (size_t i = 0; i < string_set_data_view.size(); ++i) {
-    std::string value;
-    string_set_data_view.Read(i, &value);
-    out->get_mutable_string_set().insert(value);
-  }
-
-  if (!data.ReadFStruct(&out->get_mutable_struct()))
-    return false;
-
-  if (!data.ReadFStructArray(&out->get_mutable_struct_array()))
-    return false;
-
-  if (!data.ReadFStructMap(&out->get_mutable_struct_map()))
-    return false;
-
-  return true;
-}
-
-// static
-bool StructTraits<test::MoveOnlyStructWithTraitsDataView,
-                  test::MoveOnlyStructWithTraitsImpl>::
-    Read(test::MoveOnlyStructWithTraits::DataView data,
-         test::MoveOnlyStructWithTraitsImpl* out) {
-  out->get_mutable_handle() = data.TakeFHandle();
-  return true;
-}
-
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/struct_with_traits_impl_traits.h b/mojo/public/cpp/bindings/tests/struct_with_traits_impl_traits.h
deleted file mode 100644
index adcad8a..0000000
--- a/mojo/public/cpp/bindings/tests/struct_with_traits_impl_traits.h
+++ /dev/null
@@ -1,196 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_TESTS_STRUCT_WITH_TRAITS_IMPL_TRAITS_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_TESTS_STRUCT_WITH_TRAITS_IMPL_TRAITS_H_
-
-#include <stdint.h>
-
-#include <string>
-#include <vector>
-
-#include "base/strings/string_piece.h"
-#include "mojo/public/cpp/bindings/struct_traits.h"
-#include "mojo/public/cpp/bindings/tests/struct_with_traits_impl.h"
-#include "mojo/public/interfaces/bindings/tests/struct_with_traits.mojom.h"
-
-namespace mojo {
-
-template <>
-struct StructTraits<test::NestedStructWithTraitsDataView,
-                    test::NestedStructWithTraitsImpl> {
-  static void* SetUpContext(const test::NestedStructWithTraitsImpl& input);
-  static void TearDownContext(const test::NestedStructWithTraitsImpl& input,
-                              void* context);
-
-  static int32_t value(const test::NestedStructWithTraitsImpl& input,
-                       void* context);
-
-  static bool Read(test::NestedStructWithTraitsDataView data,
-                   test::NestedStructWithTraitsImpl* output);
-};
-
-template <>
-struct EnumTraits<test::EnumWithTraits, test::EnumWithTraitsImpl> {
-  static test::EnumWithTraits ToMojom(test::EnumWithTraitsImpl input);
-  static bool FromMojom(test::EnumWithTraits input,
-                        test::EnumWithTraitsImpl* output);
-};
-
-template <>
-struct StructTraits<test::StructWithTraitsDataView,
-                    test::StructWithTraitsImpl> {
-  // Deserialization to test::StructTraitsImpl.
-  static bool Read(test::StructWithTraitsDataView data,
-                   test::StructWithTraitsImpl* out);
-
-  // Fields in test::StructWithTraits.
-  // See src/mojo/public/interfaces/bindings/tests/struct_with_traits.mojom.
-  static test::EnumWithTraitsImpl f_enum(
-      const test::StructWithTraitsImpl& value) {
-    return value.get_enum();
-  }
-
-  static bool f_bool(const test::StructWithTraitsImpl& value) {
-    return value.get_bool();
-  }
-
-  static uint32_t f_uint32(const test::StructWithTraitsImpl& value) {
-    return value.get_uint32();
-  }
-
-  static uint64_t f_uint64(const test::StructWithTraitsImpl& value) {
-    return value.get_uint64();
-  }
-
-  static base::StringPiece f_string(const test::StructWithTraitsImpl& value) {
-    return value.get_string_as_string_piece();
-  }
-
-  static const std::string& f_string2(const test::StructWithTraitsImpl& value) {
-    return value.get_string();
-  }
-
-  static const std::vector<std::string>& f_string_array(
-      const test::StructWithTraitsImpl& value) {
-    return value.get_string_array();
-  }
-
-  static const std::set<std::string>& f_string_set(
-      const test::StructWithTraitsImpl& value) {
-    return value.get_string_set();
-  }
-
-  static const test::NestedStructWithTraitsImpl& f_struct(
-      const test::StructWithTraitsImpl& value) {
-    return value.get_struct();
-  }
-
-  static const std::vector<test::NestedStructWithTraitsImpl>& f_struct_array(
-      const test::StructWithTraitsImpl& value) {
-    return value.get_struct_array();
-  }
-
-  static const std::map<std::string, test::NestedStructWithTraitsImpl>&
-  f_struct_map(const test::StructWithTraitsImpl& value) {
-    return value.get_struct_map();
-  }
-};
-
-template <>
-struct StructTraits<test::TrivialStructWithTraitsDataView,
-                    test::TrivialStructWithTraitsImpl> {
-  // Deserialization to test::TrivialStructTraitsImpl.
-  static bool Read(test::TrivialStructWithTraitsDataView data,
-                   test::TrivialStructWithTraitsImpl* out) {
-    out->value = data.value();
-    return true;
-  }
-
-  // Fields in test::TrivialStructWithTraits.
-  // See src/mojo/public/interfaces/bindings/tests/struct_with_traits.mojom.
-  static int32_t value(test::TrivialStructWithTraitsImpl& input) {
-    return input.value;
-  }
-};
-
-template <>
-struct StructTraits<test::MoveOnlyStructWithTraitsDataView,
-                    test::MoveOnlyStructWithTraitsImpl> {
-  // Deserialization to test::MoveOnlyStructTraitsImpl.
-  static bool Read(test::MoveOnlyStructWithTraitsDataView data,
-                   test::MoveOnlyStructWithTraitsImpl* out);
-
-  // Fields in test::MoveOnlyStructWithTraits.
-  // See src/mojo/public/interfaces/bindings/tests/struct_with_traits.mojom.
-  static ScopedHandle f_handle(test::MoveOnlyStructWithTraitsImpl& value) {
-    return std::move(value.get_mutable_handle());
-  }
-};
-
-template <>
-struct StructTraits<test::StructWithTraitsForUniquePtrDataView,
-                    std::unique_ptr<int>> {
-  static bool IsNull(const std::unique_ptr<int>& data) { return !data; }
-  static void SetToNull(std::unique_ptr<int>* data) { data->reset(); }
-
-  static int f_int32(const std::unique_ptr<int>& data) { return *data; }
-
-  static bool Read(test::StructWithTraitsForUniquePtrDataView data,
-                   std::unique_ptr<int>* out) {
-    out->reset(new int(data.f_int32()));
-    return true;
-  }
-};
-
-template <>
-struct UnionTraits<test::UnionWithTraitsDataView,
-                   std::unique_ptr<test::UnionWithTraitsBase>> {
-  static bool IsNull(const std::unique_ptr<test::UnionWithTraitsBase>& data) {
-    return !data;
-  }
-  static void SetToNull(std::unique_ptr<test::UnionWithTraitsBase>* data) {
-    data->reset();
-  }
-
-  static test::UnionWithTraitsDataView::Tag GetTag(
-      const std::unique_ptr<test::UnionWithTraitsBase>& data) {
-    if (data->type() == test::UnionWithTraitsBase::Type::INT32)
-      return test::UnionWithTraitsDataView::Tag::F_INT32;
-
-    return test::UnionWithTraitsDataView::Tag::F_STRUCT;
-  }
-
-  static int32_t f_int32(
-      const std::unique_ptr<test::UnionWithTraitsBase>& data) {
-    return static_cast<test::UnionWithTraitsInt32*>(data.get())->value();
-  }
-
-  static const test::NestedStructWithTraitsImpl& f_struct(
-      const std::unique_ptr<test::UnionWithTraitsBase>& data) {
-    return static_cast<test::UnionWithTraitsStruct*>(data.get())->get_struct();
-  }
-
-  static bool Read(test::UnionWithTraitsDataView data,
-                   std::unique_ptr<test::UnionWithTraitsBase>* out) {
-    switch (data.tag()) {
-      case test::UnionWithTraitsDataView::Tag::F_INT32: {
-        out->reset(new test::UnionWithTraitsInt32(data.f_int32()));
-        return true;
-      }
-      case test::UnionWithTraitsDataView::Tag::F_STRUCT: {
-        auto* struct_object = new test::UnionWithTraitsStruct();
-        out->reset(struct_object);
-        return data.ReadFStruct(&struct_object->get_mutable_struct());
-      }
-    }
-
-    NOTREACHED();
-    return false;
-  }
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_TESTS_STRUCT_WITH_TRAITS_IMPL_TRAITS_H_
diff --git a/mojo/public/cpp/bindings/tests/sync_method_unittest.cc b/mojo/public/cpp/bindings/tests/sync_method_unittest.cc
deleted file mode 100644
index 084e080..0000000
--- a/mojo/public/cpp/bindings/tests/sync_method_unittest.cc
+++ /dev/null
@@ -1,831 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <utility>
-
-#include "base/bind.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "base/threading/thread.h"
-#include "mojo/public/cpp/bindings/associated_binding.h"
-#include "mojo/public/cpp/bindings/binding.h"
-#include "mojo/public/interfaces/bindings/tests/test_sync_methods.mojom.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace test {
-namespace {
-
-template <typename... Args>
-struct LambdaBinder {
-  using CallbackType = base::Callback<void(Args...)>;
-
-  template <typename Func>
-  static void RunLambda(Func func, Args... args) {
-    func(std::move(args)...);
-  }
-
-  template <typename Func>
-  static CallbackType BindLambda(Func func) {
-    return base::Bind(&LambdaBinder::RunLambda<Func>, func);
-  }
-};
-
-class TestSyncCommonImpl {
- public:
-  TestSyncCommonImpl() {}
-
-  using PingHandler = base::Callback<void(const base::Callback<void()>&)>;
-  using PingBinder = LambdaBinder<const base::Callback<void()>&>;
-  template <typename Func>
-  void set_ping_handler(Func handler) {
-    ping_handler_ = PingBinder::BindLambda(handler);
-  }
-
-  using EchoHandler =
-      base::Callback<void(int32_t, const base::Callback<void(int32_t)>&)>;
-  using EchoBinder =
-      LambdaBinder<int32_t, const base::Callback<void(int32_t)>&>;
-  template <typename Func>
-  void set_echo_handler(Func handler) {
-    echo_handler_ = EchoBinder::BindLambda(handler);
-  }
-
-  using AsyncEchoHandler =
-      base::Callback<void(int32_t, const base::Callback<void(int32_t)>&)>;
-  using AsyncEchoBinder =
-      LambdaBinder<int32_t, const base::Callback<void(int32_t)>&>;
-  template <typename Func>
-  void set_async_echo_handler(Func handler) {
-    async_echo_handler_ = AsyncEchoBinder::BindLambda(handler);
-  }
-
-  using SendInterfaceHandler = base::Callback<void(TestSyncAssociatedPtrInfo)>;
-  using SendInterfaceBinder = LambdaBinder<TestSyncAssociatedPtrInfo>;
-  template <typename Func>
-  void set_send_interface_handler(Func handler) {
-    send_interface_handler_ = SendInterfaceBinder::BindLambda(handler);
-  }
-
-  using SendRequestHandler = base::Callback<void(TestSyncAssociatedRequest)>;
-  using SendRequestBinder = LambdaBinder<TestSyncAssociatedRequest>;
-  template <typename Func>
-  void set_send_request_handler(Func handler) {
-    send_request_handler_ = SendRequestBinder::BindLambda(handler);
-  }
-
-  void PingImpl(const base::Callback<void()>& callback) {
-    if (ping_handler_.is_null()) {
-      callback.Run();
-      return;
-    }
-    ping_handler_.Run(callback);
-  }
-  void EchoImpl(int32_t value, const base::Callback<void(int32_t)>& callback) {
-    if (echo_handler_.is_null()) {
-      callback.Run(value);
-      return;
-    }
-    echo_handler_.Run(value, callback);
-  }
-  void AsyncEchoImpl(int32_t value,
-                     const base::Callback<void(int32_t)>& callback) {
-    if (async_echo_handler_.is_null()) {
-      callback.Run(value);
-      return;
-    }
-    async_echo_handler_.Run(value, callback);
-  }
-  void SendInterfaceImpl(TestSyncAssociatedPtrInfo ptr) {
-    send_interface_handler_.Run(std::move(ptr));
-  }
-  void SendRequestImpl(TestSyncAssociatedRequest request) {
-    send_request_handler_.Run(std::move(request));
-  }
-
- private:
-  PingHandler ping_handler_;
-  EchoHandler echo_handler_;
-  AsyncEchoHandler async_echo_handler_;
-  SendInterfaceHandler send_interface_handler_;
-  SendRequestHandler send_request_handler_;
-
-  DISALLOW_COPY_AND_ASSIGN(TestSyncCommonImpl);
-};
-
-class TestSyncImpl : public TestSync, public TestSyncCommonImpl {
- public:
-  explicit TestSyncImpl(TestSyncRequest request)
-      : binding_(this, std::move(request)) {}
-
-  // TestSync implementation:
-  void Ping(const PingCallback& callback) override { PingImpl(callback); }
-  void Echo(int32_t value, const EchoCallback& callback) override {
-    EchoImpl(value, callback);
-  }
-  void AsyncEcho(int32_t value, const AsyncEchoCallback& callback) override {
-    AsyncEchoImpl(value, callback);
-  }
-
-  Binding<TestSync>* binding() { return &binding_; }
-
- private:
-  Binding<TestSync> binding_;
-
-  DISALLOW_COPY_AND_ASSIGN(TestSyncImpl);
-};
-
-class TestSyncMasterImpl : public TestSyncMaster, public TestSyncCommonImpl {
- public:
-  explicit TestSyncMasterImpl(TestSyncMasterRequest request)
-      : binding_(this, std::move(request)) {}
-
-  // TestSyncMaster implementation:
-  void Ping(const PingCallback& callback) override { PingImpl(callback); }
-  void Echo(int32_t value, const EchoCallback& callback) override {
-    EchoImpl(value, callback);
-  }
-  void AsyncEcho(int32_t value, const AsyncEchoCallback& callback) override {
-    AsyncEchoImpl(value, callback);
-  }
-  void SendInterface(TestSyncAssociatedPtrInfo ptr) override {
-    SendInterfaceImpl(std::move(ptr));
-  }
-  void SendRequest(TestSyncAssociatedRequest request) override {
-    SendRequestImpl(std::move(request));
-  }
-
-  Binding<TestSyncMaster>* binding() { return &binding_; }
-
- private:
-  Binding<TestSyncMaster> binding_;
-
-  DISALLOW_COPY_AND_ASSIGN(TestSyncMasterImpl);
-};
-
-class TestSyncAssociatedImpl : public TestSync, public TestSyncCommonImpl {
- public:
-  explicit TestSyncAssociatedImpl(TestSyncAssociatedRequest request)
-      : binding_(this, std::move(request)) {}
-
-  // TestSync implementation:
-  void Ping(const PingCallback& callback) override { PingImpl(callback); }
-  void Echo(int32_t value, const EchoCallback& callback) override {
-    EchoImpl(value, callback);
-  }
-  void AsyncEcho(int32_t value, const AsyncEchoCallback& callback) override {
-    AsyncEchoImpl(value, callback);
-  }
-
-  AssociatedBinding<TestSync>* binding() { return &binding_; }
-
- private:
-  AssociatedBinding<TestSync> binding_;
-
-  DISALLOW_COPY_AND_ASSIGN(TestSyncAssociatedImpl);
-};
-
-template <typename Interface>
-struct ImplTraits;
-
-template <>
-struct ImplTraits<TestSync> {
-  using Type = TestSyncImpl;
-};
-
-template <>
-struct ImplTraits<TestSyncMaster> {
-  using Type = TestSyncMasterImpl;
-};
-
-template <typename Interface>
-using ImplTypeFor = typename ImplTraits<Interface>::Type;
-
-// A wrapper for either an InterfacePtr or scoped_refptr<ThreadSafeInterfacePtr>
-// that exposes the InterfacePtr interface.
-template <typename Interface>
-class PtrWrapper {
- public:
-  explicit PtrWrapper(InterfacePtr<Interface> ptr) : ptr_(std::move(ptr)) {}
-
-  explicit PtrWrapper(
-      scoped_refptr<ThreadSafeInterfacePtr<Interface>> thread_safe_ptr)
-      : thread_safe_ptr_(thread_safe_ptr) {}
-
-  PtrWrapper(PtrWrapper&& other) = default;
-
-  Interface* operator->() {
-    return thread_safe_ptr_ ? thread_safe_ptr_->get() : ptr_.get();
-  }
-
-  void set_connection_error_handler(const base::Closure& error_handler) {
-    DCHECK(!thread_safe_ptr_);
-    ptr_.set_connection_error_handler(error_handler);
-  }
-
-  void reset() {
-    ptr_ = nullptr;
-    thread_safe_ptr_ = nullptr;
-  }
-
- private:
-  InterfacePtr<Interface> ptr_;
-  scoped_refptr<ThreadSafeInterfacePtr<Interface>> thread_safe_ptr_;
-
-  DISALLOW_COPY_AND_ASSIGN(PtrWrapper);
-};
-
-// The type parameter for SyncMethodCommonTests for varying the Interface and
-// whether to use InterfacePtr or ThreadSafeInterfacePtr.
-template <typename InterfaceT, bool use_thread_safe_ptr>
-struct TestParams {
-  using Interface = InterfaceT;
-  static const bool kIsThreadSafeInterfacePtrTest = use_thread_safe_ptr;
-
-  static PtrWrapper<InterfaceT> Wrap(InterfacePtr<Interface> ptr) {
-    if (kIsThreadSafeInterfacePtrTest) {
-      return PtrWrapper<Interface>(
-          ThreadSafeInterfacePtr<Interface>::Create(std::move(ptr)));
-    } else {
-      return PtrWrapper<Interface>(std::move(ptr));
-    }
-  }
-};
-
-template <typename Interface>
-class TestSyncServiceThread {
- public:
-  TestSyncServiceThread()
-      : thread_("TestSyncServiceThread"), ping_called_(false) {
-    thread_.Start();
-  }
-
-  void SetUp(InterfaceRequest<Interface> request) {
-    CHECK(thread_.task_runner()->BelongsToCurrentThread());
-    impl_.reset(new ImplTypeFor<Interface>(std::move(request)));
-    impl_->set_ping_handler(
-        [this](const typename Interface::PingCallback& callback) {
-          {
-            base::AutoLock locker(lock_);
-            ping_called_ = true;
-          }
-          callback.Run();
-        });
-  }
-
-  void TearDown() {
-    CHECK(thread_.task_runner()->BelongsToCurrentThread());
-    impl_.reset();
-  }
-
-  base::Thread* thread() { return &thread_; }
-  bool ping_called() const {
-    base::AutoLock locker(lock_);
-    return ping_called_;
-  }
-
- private:
-  base::Thread thread_;
-
-  std::unique_ptr<ImplTypeFor<Interface>> impl_;
-
-  mutable base::Lock lock_;
-  bool ping_called_;
-
-  DISALLOW_COPY_AND_ASSIGN(TestSyncServiceThread);
-};
-
-class SyncMethodTest : public testing::Test {
- public:
-  SyncMethodTest() {}
-  ~SyncMethodTest() override { base::RunLoop().RunUntilIdle(); }
-
- protected:
-  base::MessageLoop loop_;
-};
-
-template <typename T>
-class SyncMethodCommonTest : public SyncMethodTest {
- public:
-  SyncMethodCommonTest() {}
-  ~SyncMethodCommonTest() override {}
-};
-
-class SyncMethodAssociatedTest : public SyncMethodTest {
- public:
-  SyncMethodAssociatedTest() {}
-  ~SyncMethodAssociatedTest() override {}
-
- protected:
-  void SetUp() override {
-    master_impl_.reset(new TestSyncMasterImpl(MakeRequest(&master_ptr_)));
-
-    asso_request_ = MakeRequest(&asso_ptr_info_);
-    opposite_asso_request_ = MakeRequest(&opposite_asso_ptr_info_);
-
-    master_impl_->set_send_interface_handler(
-        [this](TestSyncAssociatedPtrInfo ptr) {
-          opposite_asso_ptr_info_ = std::move(ptr);
-        });
-    base::RunLoop run_loop;
-    master_impl_->set_send_request_handler(
-        [this, &run_loop](TestSyncAssociatedRequest request) {
-          asso_request_ = std::move(request);
-          run_loop.Quit();
-        });
-
-    master_ptr_->SendInterface(std::move(opposite_asso_ptr_info_));
-    master_ptr_->SendRequest(std::move(asso_request_));
-    run_loop.Run();
-  }
-
-  void TearDown() override {
-    asso_ptr_info_ = TestSyncAssociatedPtrInfo();
-    asso_request_ = TestSyncAssociatedRequest();
-    opposite_asso_ptr_info_ = TestSyncAssociatedPtrInfo();
-    opposite_asso_request_ = TestSyncAssociatedRequest();
-
-    master_ptr_ = nullptr;
-    master_impl_.reset();
-  }
-
-  InterfacePtr<TestSyncMaster> master_ptr_;
-  std::unique_ptr<TestSyncMasterImpl> master_impl_;
-
-  // An associated interface whose binding lives at the |master_impl_| side.
-  TestSyncAssociatedPtrInfo asso_ptr_info_;
-  TestSyncAssociatedRequest asso_request_;
-
-  // An associated interface whose binding lives at the |master_ptr_| side.
-  TestSyncAssociatedPtrInfo opposite_asso_ptr_info_;
-  TestSyncAssociatedRequest opposite_asso_request_;
-};
-
-void SetFlagAndRunClosure(bool* flag, const base::Closure& closure) {
-  *flag = true;
-  closure.Run();
-}
-
-void ExpectValueAndRunClosure(int32_t expected_value,
-                              const base::Closure& closure,
-                              int32_t value) {
-  EXPECT_EQ(expected_value, value);
-  closure.Run();
-}
-
-template <typename Func>
-void CallAsyncEchoCallback(Func func, int32_t value) {
-  func(value);
-}
-
-template <typename Func>
-TestSync::AsyncEchoCallback BindAsyncEchoCallback(Func func) {
-  return base::Bind(&CallAsyncEchoCallback<Func>, func);
-}
-
-// TestSync (without associated interfaces) and TestSyncMaster (with associated
-// interfaces) exercise MultiplexRouter with different configurations.
-// Each test is run once with an InterfacePtr and once with a
-// ThreadSafeInterfacePtr to ensure that they behave the same with respect to
-// sync calls.
-using InterfaceTypes = testing::Types<TestParams<TestSync, true>,
-                                      TestParams<TestSync, false>,
-                                      TestParams<TestSyncMaster, true>,
-                                      TestParams<TestSyncMaster, false>>;
-TYPED_TEST_CASE(SyncMethodCommonTest, InterfaceTypes);
-
-TYPED_TEST(SyncMethodCommonTest, CallSyncMethodAsynchronously) {
-  using Interface = typename TypeParam::Interface;
-  InterfacePtr<Interface> interface_ptr;
-  ImplTypeFor<Interface> impl(MakeRequest(&interface_ptr));
-  auto ptr = TypeParam::Wrap(std::move(interface_ptr));
-
-  base::RunLoop run_loop;
-  ptr->Echo(123, base::Bind(&ExpectValueAndRunClosure, 123,
-                            run_loop.QuitClosure()));
-  run_loop.Run();
-}
-
-TYPED_TEST(SyncMethodCommonTest, BasicSyncCalls) {
-  using Interface = typename TypeParam::Interface;
-  InterfacePtr<Interface> interface_ptr;
-  InterfaceRequest<Interface> request = MakeRequest(&interface_ptr);
-  auto ptr = TypeParam::Wrap(std::move(interface_ptr));
-
-  TestSyncServiceThread<Interface> service_thread;
-  service_thread.thread()->task_runner()->PostTask(
-      FROM_HERE,
-      base::Bind(&TestSyncServiceThread<Interface>::SetUp,
-                 base::Unretained(&service_thread), base::Passed(&request)));
-  ASSERT_TRUE(ptr->Ping());
-  ASSERT_TRUE(service_thread.ping_called());
-
-  int32_t output_value = -1;
-  ASSERT_TRUE(ptr->Echo(42, &output_value));
-  ASSERT_EQ(42, output_value);
-
-  base::RunLoop run_loop;
-  service_thread.thread()->task_runner()->PostTaskAndReply(
-      FROM_HERE,
-      base::Bind(&TestSyncServiceThread<Interface>::TearDown,
-                 base::Unretained(&service_thread)),
-      run_loop.QuitClosure());
-  run_loop.Run();
-}
-
-TYPED_TEST(SyncMethodCommonTest, ReenteredBySyncMethodBinding) {
-  // Test that an interface pointer waiting for a sync call response can be
-  // reentered by a binding serving sync methods on the same thread.
-
-  using Interface = typename TypeParam::Interface;
-  InterfacePtr<Interface> interface_ptr;
-  // The binding lives on the same thread as the interface pointer.
-  ImplTypeFor<Interface> impl(MakeRequest(&interface_ptr));
-  auto ptr = TypeParam::Wrap(std::move(interface_ptr));
-  int32_t output_value = -1;
-  ASSERT_TRUE(ptr->Echo(42, &output_value));
-  EXPECT_EQ(42, output_value);
-}
-
-TYPED_TEST(SyncMethodCommonTest, InterfacePtrDestroyedDuringSyncCall) {
-  // Test that it won't result in crash or hang if an interface pointer is
-  // destroyed while it is waiting for a sync call response.
-
-  using Interface = typename TypeParam::Interface;
-  InterfacePtr<Interface> interface_ptr;
-  ImplTypeFor<Interface> impl(MakeRequest(&interface_ptr));
-  auto ptr = TypeParam::Wrap(std::move(interface_ptr));
-  impl.set_ping_handler([&ptr](const TestSync::PingCallback& callback) {
-    ptr.reset();
-    callback.Run();
-  });
-  ASSERT_FALSE(ptr->Ping());
-}
-
-TYPED_TEST(SyncMethodCommonTest, BindingDestroyedDuringSyncCall) {
-  // Test that it won't result in crash or hang if a binding is
-  // closed (and therefore the message pipe handle is closed) while the
-  // corresponding interface pointer is waiting for a sync call response.
-
-  using Interface = typename TypeParam::Interface;
-  InterfacePtr<Interface> interface_ptr;
-  ImplTypeFor<Interface> impl(MakeRequest(&interface_ptr));
-  auto ptr = TypeParam::Wrap(std::move(interface_ptr));
-  impl.set_ping_handler([&impl](const TestSync::PingCallback& callback) {
-    impl.binding()->Close();
-    callback.Run();
-  });
-  ASSERT_FALSE(ptr->Ping());
-}
-
-TYPED_TEST(SyncMethodCommonTest, NestedSyncCallsWithInOrderResponses) {
-  // Test that we can call a sync method on an interface ptr, while there is
-  // already a sync call ongoing. The responses arrive in order.
-
-  using Interface = typename TypeParam::Interface;
-  InterfacePtr<Interface> interface_ptr;
-  ImplTypeFor<Interface> impl(MakeRequest(&interface_ptr));
-  auto ptr = TypeParam::Wrap(std::move(interface_ptr));
-
-  // The same variable is used to store the output of the two sync calls, in
-  // order to test that responses are handled in the correct order.
-  int32_t result_value = -1;
-
-  bool first_call = true;
-  impl.set_echo_handler([&first_call, &ptr, &result_value](
-      int32_t value, const TestSync::EchoCallback& callback) {
-    if (first_call) {
-      first_call = false;
-      ASSERT_TRUE(ptr->Echo(456, &result_value));
-      EXPECT_EQ(456, result_value);
-    }
-    callback.Run(value);
-  });
-
-  ASSERT_TRUE(ptr->Echo(123, &result_value));
-  EXPECT_EQ(123, result_value);
-}
-
-TYPED_TEST(SyncMethodCommonTest, NestedSyncCallsWithOutOfOrderResponses) {
-  // Test that we can call a sync method on an interface ptr, while there is
-  // already a sync call ongoing. The responses arrive out of order.
-
-  using Interface = typename TypeParam::Interface;
-  InterfacePtr<Interface> interface_ptr;
-  ImplTypeFor<Interface> impl(MakeRequest(&interface_ptr));
-  auto ptr = TypeParam::Wrap(std::move(interface_ptr));
-
-  // The same variable is used to store the output of the two sync calls, in
-  // order to test that responses are handled in the correct order.
-  int32_t result_value = -1;
-
-  bool first_call = true;
-  impl.set_echo_handler([&first_call, &ptr, &result_value](
-      int32_t value, const TestSync::EchoCallback& callback) {
-    callback.Run(value);
-    if (first_call) {
-      first_call = false;
-      ASSERT_TRUE(ptr->Echo(456, &result_value));
-      EXPECT_EQ(456, result_value);
-    }
-  });
-
-  ASSERT_TRUE(ptr->Echo(123, &result_value));
-  EXPECT_EQ(123, result_value);
-}
-
-TYPED_TEST(SyncMethodCommonTest, AsyncResponseQueuedDuringSyncCall) {
-  // Test that while an interface pointer is waiting for the response to a sync
-  // call, async responses are queued until the sync call completes.
-
-  using Interface = typename TypeParam::Interface;
-  InterfacePtr<Interface> interface_ptr;
-  ImplTypeFor<Interface> impl(MakeRequest(&interface_ptr));
-  auto ptr = TypeParam::Wrap(std::move(interface_ptr));
-
-  int32_t async_echo_request_value = -1;
-  TestSync::AsyncEchoCallback async_echo_request_callback;
-  base::RunLoop run_loop1;
-  impl.set_async_echo_handler(
-      [&async_echo_request_value, &async_echo_request_callback, &run_loop1](
-          int32_t value, const TestSync::AsyncEchoCallback& callback) {
-        async_echo_request_value = value;
-        async_echo_request_callback = callback;
-        run_loop1.Quit();
-      });
-
-  bool async_echo_response_dispatched = false;
-  base::RunLoop run_loop2;
-  ptr->AsyncEcho(
-      123,
-      BindAsyncEchoCallback(
-         [&async_echo_response_dispatched, &run_loop2](int32_t result) {
-           async_echo_response_dispatched = true;
-           EXPECT_EQ(123, result);
-           run_loop2.Quit();
-         }));
-  // Run until the AsyncEcho request reaches the service side.
-  run_loop1.Run();
-
-  impl.set_echo_handler(
-      [&async_echo_request_value, &async_echo_request_callback](
-          int32_t value, const TestSync::EchoCallback& callback) {
-        // Send back the async response first.
-        EXPECT_FALSE(async_echo_request_callback.is_null());
-        async_echo_request_callback.Run(async_echo_request_value);
-
-        callback.Run(value);
-      });
-
-  int32_t result_value = -1;
-  ASSERT_TRUE(ptr->Echo(456, &result_value));
-  EXPECT_EQ(456, result_value);
-
-  // Although the AsyncEcho response arrives before the Echo response, it should
-  // be queued and not yet dispatched.
-  EXPECT_FALSE(async_echo_response_dispatched);
-
-  // Run until the AsyncEcho response is dispatched.
-  run_loop2.Run();
-
-  EXPECT_TRUE(async_echo_response_dispatched);
-}
-
-TYPED_TEST(SyncMethodCommonTest, AsyncRequestQueuedDuringSyncCall) {
-  // Test that while an interface pointer is waiting for the response to a sync
-  // call, async requests for a binding running on the same thread are queued
-  // until the sync call completes.
-
-  using Interface = typename TypeParam::Interface;
-  InterfacePtr<Interface> interface_ptr;
-  ImplTypeFor<Interface> impl(MakeRequest(&interface_ptr));
-  auto ptr = TypeParam::Wrap(std::move(interface_ptr));
-
-  bool async_echo_request_dispatched = false;
-  impl.set_async_echo_handler([&async_echo_request_dispatched](
-      int32_t value, const TestSync::AsyncEchoCallback& callback) {
-    async_echo_request_dispatched = true;
-    callback.Run(value);
-  });
-
-  bool async_echo_response_dispatched = false;
-  base::RunLoop run_loop;
-  ptr->AsyncEcho(
-      123,
-      BindAsyncEchoCallback(
-         [&async_echo_response_dispatched, &run_loop](int32_t result) {
-           async_echo_response_dispatched = true;
-           EXPECT_EQ(123, result);
-           run_loop.Quit();
-         }));
-
-  impl.set_echo_handler([&async_echo_request_dispatched](
-      int32_t value, const TestSync::EchoCallback& callback) {
-    // Although the AsyncEcho request is sent before the Echo request, it
-    // shouldn't be dispatched yet at this point, because there is an ongoing
-    // sync call on the same thread.
-    EXPECT_FALSE(async_echo_request_dispatched);
-    callback.Run(value);
-  });
-
-  int32_t result_value = -1;
-  ASSERT_TRUE(ptr->Echo(456, &result_value));
-  EXPECT_EQ(456, result_value);
-
-  // Although the AsyncEcho request is sent before the Echo request, it
-  // shouldn't be dispatched yet.
-  EXPECT_FALSE(async_echo_request_dispatched);
-
-  // Run until the AsyncEcho response is dispatched.
-  run_loop.Run();
-
-  EXPECT_TRUE(async_echo_response_dispatched);
-}
-
-TYPED_TEST(SyncMethodCommonTest,
-           QueuedMessagesProcessedBeforeErrorNotification) {
-  // Test that while an interface pointer is waiting for the response to a sync
-  // call, async responses are queued. If the message pipe is disconnected
-  // before the queued messages are processed, the connection error
-  // notification is delayed until all the queued messages are processed.
-
-  // ThreadSafeInterfacePtr doesn't guarantee that messages are delivered before
-  // error notifications, so skip it for this test.
-  if (TypeParam::kIsThreadSafeInterfacePtrTest)
-    return;
-
-  using Interface = typename TypeParam::Interface;
-  InterfacePtr<Interface> ptr;
-  ImplTypeFor<Interface> impl(MakeRequest(&ptr));
-
-  int32_t async_echo_request_value = -1;
-  TestSync::AsyncEchoCallback async_echo_request_callback;
-  base::RunLoop run_loop1;
-  impl.set_async_echo_handler(
-      [&async_echo_request_value, &async_echo_request_callback, &run_loop1](
-          int32_t value, const TestSync::AsyncEchoCallback& callback) {
-        async_echo_request_value = value;
-        async_echo_request_callback = callback;
-        run_loop1.Quit();
-      });
-
-  bool async_echo_response_dispatched = false;
-  bool connection_error_dispatched = false;
-  base::RunLoop run_loop2;
-  ptr->AsyncEcho(
-      123,
-      BindAsyncEchoCallback(
-          [&async_echo_response_dispatched, &connection_error_dispatched, &ptr,
-              &run_loop2](int32_t result) {
-            async_echo_response_dispatched = true;
-            // At this point, error notification should not be dispatched
-            // yet.
-            EXPECT_FALSE(connection_error_dispatched);
-            EXPECT_FALSE(ptr.encountered_error());
-            EXPECT_EQ(123, result);
-            run_loop2.Quit();
-          }));
-  // Run until the AsyncEcho request reaches the service side.
-  run_loop1.Run();
-
-  impl.set_echo_handler(
-      [&impl, &async_echo_request_value, &async_echo_request_callback](
-          int32_t value, const TestSync::EchoCallback& callback) {
-        // Send back the async response first.
-        EXPECT_FALSE(async_echo_request_callback.is_null());
-        async_echo_request_callback.Run(async_echo_request_value);
-
-        impl.binding()->Close();
-      });
-
-  base::RunLoop run_loop3;
-  ptr.set_connection_error_handler(
-      base::Bind(&SetFlagAndRunClosure, &connection_error_dispatched,
-                 run_loop3.QuitClosure()));
-
-  int32_t result_value = -1;
-  ASSERT_FALSE(ptr->Echo(456, &result_value));
-  EXPECT_EQ(-1, result_value);
-  ASSERT_FALSE(connection_error_dispatched);
-  EXPECT_FALSE(ptr.encountered_error());
-
-  // Although the AsyncEcho response arrives before the Echo response, it should
-  // be queued and not yet dispatched.
-  EXPECT_FALSE(async_echo_response_dispatched);
-
-  // Run until the AsyncEcho response is dispatched.
-  run_loop2.Run();
-
-  EXPECT_TRUE(async_echo_response_dispatched);
-
-  // Run until the error notification is dispatched.
-  run_loop3.Run();
-
-  ASSERT_TRUE(connection_error_dispatched);
-  EXPECT_TRUE(ptr.encountered_error());
-}
-
-TYPED_TEST(SyncMethodCommonTest, InvalidMessageDuringSyncCall) {
-  // Test that while an interface pointer is waiting for the response to a sync
-  // call, an invalid incoming message will disconnect the message pipe, cause
-  // the sync call to return false, and run the connection error handler
-  // asynchronously.
-
-  using Interface = typename TypeParam::Interface;
-  MessagePipe pipe;
-
-  InterfacePtr<Interface> interface_ptr;
-  interface_ptr.Bind(InterfacePtrInfo<Interface>(std::move(pipe.handle0), 0u));
-  auto ptr = TypeParam::Wrap(std::move(interface_ptr));
-
-  MessagePipeHandle raw_binding_handle = pipe.handle1.get();
-  ImplTypeFor<Interface> impl(MakeRequest<Interface>(std::move(pipe.handle1)));
-
-  impl.set_echo_handler([&raw_binding_handle](
-      int32_t value, const TestSync::EchoCallback& callback) {
-    // Write a 1-byte message, which is considered invalid.
-    char invalid_message = 0;
-    MojoResult result =
-        WriteMessageRaw(raw_binding_handle, &invalid_message, 1u, nullptr, 0u,
-                        MOJO_WRITE_MESSAGE_FLAG_NONE);
-    ASSERT_EQ(MOJO_RESULT_OK, result);
-    callback.Run(value);
-  });
-
-  bool connection_error_dispatched = false;
-  base::RunLoop run_loop;
-  // ThreadSafeInterfacePtr doesn't support setting connection error handlers.
-  if (!TypeParam::kIsThreadSafeInterfacePtrTest) {
-    ptr.set_connection_error_handler(base::Bind(&SetFlagAndRunClosure,
-                                                &connection_error_dispatched,
-                                                run_loop.QuitClosure()));
-  }
-
-  int32_t result_value = -1;
-  ASSERT_FALSE(ptr->Echo(456, &result_value));
-  EXPECT_EQ(-1, result_value);
-  ASSERT_FALSE(connection_error_dispatched);
-
-  if (!TypeParam::kIsThreadSafeInterfacePtrTest) {
-    run_loop.Run();
-    ASSERT_TRUE(connection_error_dispatched);
-  }
-}
-
-TEST_F(SyncMethodAssociatedTest, ReenteredBySyncMethodAssoBindingOfSameRouter) {
-  // Test that an interface pointer waiting for a sync call response can be
-  // reentered by an associated binding serving sync methods on the same thread.
-  // The associated binding belongs to the same MultiplexRouter as the waiting
-  // interface pointer.
-
-  TestSyncAssociatedImpl opposite_asso_impl(std::move(opposite_asso_request_));
-  TestSyncAssociatedPtr opposite_asso_ptr;
-  opposite_asso_ptr.Bind(std::move(opposite_asso_ptr_info_));
-
-  master_impl_->set_echo_handler([&opposite_asso_ptr](
-      int32_t value, const TestSyncMaster::EchoCallback& callback) {
-    int32_t result_value = -1;
-
-    ASSERT_TRUE(opposite_asso_ptr->Echo(123, &result_value));
-    EXPECT_EQ(123, result_value);
-    callback.Run(value);
-  });
-
-  int32_t result_value = -1;
-  ASSERT_TRUE(master_ptr_->Echo(456, &result_value));
-  EXPECT_EQ(456, result_value);
-}
-
-TEST_F(SyncMethodAssociatedTest,
-       ReenteredBySyncMethodAssoBindingOfDifferentRouter) {
-  // Test that an interface pointer waiting for a sync call response can be
-  // reentered by an associated binding serving sync methods on the same thread.
-  // The associated binding belongs to a different MultiplexRouter as the
-  // waiting interface pointer.
-
-  TestSyncAssociatedImpl asso_impl(std::move(asso_request_));
-  TestSyncAssociatedPtr asso_ptr;
-  asso_ptr.Bind(std::move(asso_ptr_info_));
-
-  master_impl_->set_echo_handler(
-      [&asso_ptr](int32_t value, const TestSyncMaster::EchoCallback& callback) {
-        int32_t result_value = -1;
-
-        ASSERT_TRUE(asso_ptr->Echo(123, &result_value));
-        EXPECT_EQ(123, result_value);
-        callback.Run(value);
-      });
-
-  int32_t result_value = -1;
-  ASSERT_TRUE(master_ptr_->Echo(456, &result_value));
-  EXPECT_EQ(456, result_value);
-}
-
-// TODO(yzshen): Add more tests related to associated interfaces.
-
-}  // namespace
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/test_native_types_blink.typemap b/mojo/public/cpp/bindings/tests/test_native_types_blink.typemap
deleted file mode 100644
index 1bdfbbc..0000000
--- a/mojo/public/cpp/bindings/tests/test_native_types_blink.typemap
+++ /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.
-
-mojom = "//mojo/public/interfaces/bindings/tests/test_native_types.mojom"
-public_headers = [ "//mojo/public/cpp/bindings/tests/pickled_types_blink.h" ]
-sources = [
-  "//mojo/public/cpp/bindings/tests/pickled_types_blink.cc",
-]
-deps = [
-  "//ipc",
-]
-
-type_mappings = [
-  "mojo.test.PickledEnum=mojo::test::PickledEnumBlink",
-  "mojo.test.PickledStruct=mojo::test::PickledStructBlink[move_only]",
-]
diff --git a/mojo/public/cpp/bindings/tests/test_native_types_chromium.typemap b/mojo/public/cpp/bindings/tests/test_native_types_chromium.typemap
deleted file mode 100644
index 50e8076..0000000
--- a/mojo/public/cpp/bindings/tests/test_native_types_chromium.typemap
+++ /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.
-
-mojom = "//mojo/public/interfaces/bindings/tests/test_native_types.mojom"
-public_headers = [ "//mojo/public/cpp/bindings/tests/pickled_types_chromium.h" ]
-sources = [
-  "//mojo/public/cpp/bindings/tests/pickled_types_chromium.cc",
-]
-deps = [
-  "//ipc",
-]
-
-type_mappings = [
-  "mojo.test.PickledEnum=mojo::test::PickledEnumChromium",
-  "mojo.test.PickledStruct=mojo::test::PickledStructChromium[move_only]",
-]
diff --git a/mojo/public/cpp/bindings/tests/type_conversion_unittest.cc b/mojo/public/cpp/bindings/tests/type_conversion_unittest.cc
deleted file mode 100644
index b0124aa..0000000
--- a/mojo/public/cpp/bindings/tests/type_conversion_unittest.cc
+++ /dev/null
@@ -1,161 +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 <stddef.h>
-#include <stdint.h>
-
-#include "mojo/public/interfaces/bindings/tests/test_structs.mojom.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace {
-
-struct RedmondRect {
-  int32_t left;
-  int32_t top;
-  int32_t right;
-  int32_t bottom;
-};
-
-struct RedmondNamedRegion {
-  std::string name;
-  std::vector<RedmondRect> rects;
-};
-
-bool AreEqualRectArrays(const std::vector<test::RectPtr>& rects1,
-                        const std::vector<test::RectPtr>& rects2) {
-  if (rects1.size() != rects2.size())
-    return false;
-
-  for (size_t i = 0; i < rects1.size(); ++i) {
-    if (rects1[i]->x != rects2[i]->x || rects1[i]->y != rects2[i]->y ||
-        rects1[i]->width != rects2[i]->width ||
-        rects1[i]->height != rects2[i]->height) {
-      return false;
-    }
-  }
-
-  return true;
-}
-
-}  // namespace
-
-template <>
-struct TypeConverter<test::RectPtr, RedmondRect> {
-  static test::RectPtr Convert(const RedmondRect& input) {
-    return test::Rect::New(input.left, input.top, input.right - input.left,
-                           input.bottom - input.top);
-  }
-};
-
-template <>
-struct TypeConverter<RedmondRect, test::RectPtr> {
-  static RedmondRect Convert(const test::RectPtr& input) {
-    RedmondRect rect;
-    rect.left = input->x;
-    rect.top = input->y;
-    rect.right = input->x + input->width;
-    rect.bottom = input->y + input->height;
-    return rect;
-  }
-};
-
-template <>
-struct TypeConverter<test::NamedRegionPtr, RedmondNamedRegion> {
-  static test::NamedRegionPtr Convert(const RedmondNamedRegion& input) {
-    return test::NamedRegion::New(
-        input.name, ConvertTo<std::vector<test::RectPtr>>(input.rects));
-  }
-};
-
-template <>
-struct TypeConverter<RedmondNamedRegion, test::NamedRegionPtr> {
-  static RedmondNamedRegion Convert(const test::NamedRegionPtr& input) {
-    RedmondNamedRegion region;
-    if (input->name)
-      region.name = input->name.value();
-    if (input->rects) {
-      region.rects.reserve(input->rects->size());
-      for (const auto& element : *input->rects)
-        region.rects.push_back(element.To<RedmondRect>());
-    }
-    return region;
-  }
-};
-
-namespace test {
-namespace {
-
-TEST(TypeConversionTest, CustomTypeConverter) {
-  RectPtr rect(Rect::New(10, 20, 50, 45));
-
-  RedmondRect rr = rect.To<RedmondRect>();
-  EXPECT_EQ(10, rr.left);
-  EXPECT_EQ(20, rr.top);
-  EXPECT_EQ(60, rr.right);
-  EXPECT_EQ(65, rr.bottom);
-
-  RectPtr rect2(Rect::From(rr));
-  EXPECT_EQ(rect->x, rect2->x);
-  EXPECT_EQ(rect->y, rect2->y);
-  EXPECT_EQ(rect->width, rect2->width);
-  EXPECT_EQ(rect->height, rect2->height);
-}
-
-TEST(TypeConversionTest, CustomTypeConverter_Array_Null) {
-  std::vector<RectPtr> rects;
-
-  auto redmond_rects = ConvertTo<std::vector<RedmondRect>>(rects);
-
-  EXPECT_TRUE(redmond_rects.empty());
-}
-
-TEST(TypeConversionTest, CustomTypeConverter_Array) {
-  const RedmondRect kBase = {10, 20, 30, 40};
-
-  std::vector<RectPtr> rects(10);
-  for (size_t i = 0; i < rects.size(); ++i) {
-    RedmondRect rr = kBase;
-    rr.left += static_cast<int32_t>(i);
-    rr.top += static_cast<int32_t>(i);
-    rects[i] = Rect::From(rr);
-  }
-
-  auto redmond_rects = ConvertTo<std::vector<RedmondRect>>(rects);
-
-  auto rects2 = ConvertTo<std::vector<RectPtr>>(redmond_rects);
-  EXPECT_TRUE(AreEqualRectArrays(rects, rects2));
-}
-
-TEST(TypeConversionTest, CustomTypeConverter_Nested) {
-  RedmondNamedRegion redmond_region;
-  redmond_region.name = "foopy";
-
-  const RedmondRect kBase = {10, 20, 30, 40};
-
-  for (size_t i = 0; i < 10; ++i) {
-    RedmondRect rect = kBase;
-    rect.left += static_cast<int32_t>(i);
-    rect.top += static_cast<int32_t>(i);
-    redmond_region.rects.push_back(rect);
-  }
-
-  // Round-trip through generated struct and TypeConverter.
-
-  NamedRegionPtr copy = NamedRegion::From(redmond_region);
-  RedmondNamedRegion redmond_region2 = copy.To<RedmondNamedRegion>();
-
-  EXPECT_EQ(redmond_region.name, redmond_region2.name);
-  EXPECT_EQ(redmond_region.rects.size(), redmond_region2.rects.size());
-  for (size_t i = 0; i < redmond_region.rects.size(); ++i) {
-    EXPECT_EQ(redmond_region.rects[i].left, redmond_region2.rects[i].left);
-    EXPECT_EQ(redmond_region.rects[i].top, redmond_region2.rects[i].top);
-    EXPECT_EQ(redmond_region.rects[i].right, redmond_region2.rects[i].right);
-    EXPECT_EQ(redmond_region.rects[i].bottom, redmond_region2.rects[i].bottom);
-  }
-}
-
-}  // namespace
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/union_unittest.cc b/mojo/public/cpp/bindings/tests/union_unittest.cc
deleted file mode 100644
index bdf27df..0000000
--- a/mojo/public/cpp/bindings/tests/union_unittest.cc
+++ /dev/null
@@ -1,1246 +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 <stddef.h>
-#include <stdint.h>
-#include <utility>
-#include <vector>
-
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "mojo/public/cpp/bindings/binding.h"
-#include "mojo/public/cpp/bindings/lib/array_internal.h"
-#include "mojo/public/cpp/bindings/lib/fixed_buffer.h"
-#include "mojo/public/cpp/bindings/lib/serialization.h"
-#include "mojo/public/cpp/bindings/lib/validation_context.h"
-#include "mojo/public/cpp/bindings/lib/validation_errors.h"
-#include "mojo/public/cpp/test_support/test_utils.h"
-#include "mojo/public/interfaces/bindings/tests/test_structs.mojom.h"
-#include "mojo/public/interfaces/bindings/tests/test_unions.mojom.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace test {
-
-TEST(UnionTest, PlainOldDataGetterSetter) {
-  PodUnionPtr pod(PodUnion::New());
-
-  pod->set_f_int8(10);
-  EXPECT_EQ(10, pod->get_f_int8());
-  EXPECT_TRUE(pod->is_f_int8());
-  EXPECT_FALSE(pod->is_f_int8_other());
-  EXPECT_EQ(pod->which(), PodUnion::Tag::F_INT8);
-
-  pod->set_f_uint8(11);
-  EXPECT_EQ(11, pod->get_f_uint8());
-  EXPECT_TRUE(pod->is_f_uint8());
-  EXPECT_FALSE(pod->is_f_int8());
-  EXPECT_EQ(pod->which(), PodUnion::Tag::F_UINT8);
-
-  pod->set_f_int16(12);
-  EXPECT_EQ(12, pod->get_f_int16());
-  EXPECT_TRUE(pod->is_f_int16());
-  EXPECT_EQ(pod->which(), PodUnion::Tag::F_INT16);
-
-  pod->set_f_uint16(13);
-  EXPECT_EQ(13, pod->get_f_uint16());
-  EXPECT_TRUE(pod->is_f_uint16());
-  EXPECT_EQ(pod->which(), PodUnion::Tag::F_UINT16);
-
-  pod->set_f_int32(14);
-  EXPECT_EQ(14, pod->get_f_int32());
-  EXPECT_TRUE(pod->is_f_int32());
-  EXPECT_EQ(pod->which(), PodUnion::Tag::F_INT32);
-
-  pod->set_f_uint32(static_cast<uint32_t>(15));
-  EXPECT_EQ(static_cast<uint32_t>(15), pod->get_f_uint32());
-  EXPECT_TRUE(pod->is_f_uint32());
-  EXPECT_EQ(pod->which(), PodUnion::Tag::F_UINT32);
-
-  pod->set_f_int64(16);
-  EXPECT_EQ(16, pod->get_f_int64());
-  EXPECT_TRUE(pod->is_f_int64());
-  EXPECT_EQ(pod->which(), PodUnion::Tag::F_INT64);
-
-  pod->set_f_uint64(static_cast<uint64_t>(17));
-  EXPECT_EQ(static_cast<uint64_t>(17), pod->get_f_uint64());
-  EXPECT_TRUE(pod->is_f_uint64());
-  EXPECT_EQ(pod->which(), PodUnion::Tag::F_UINT64);
-
-  pod->set_f_float(1.5);
-  EXPECT_EQ(1.5, pod->get_f_float());
-  EXPECT_TRUE(pod->is_f_float());
-  EXPECT_EQ(pod->which(), PodUnion::Tag::F_FLOAT);
-
-  pod->set_f_double(1.9);
-  EXPECT_EQ(1.9, pod->get_f_double());
-  EXPECT_TRUE(pod->is_f_double());
-  EXPECT_EQ(pod->which(), PodUnion::Tag::F_DOUBLE);
-
-  pod->set_f_bool(true);
-  EXPECT_TRUE(pod->get_f_bool());
-  pod->set_f_bool(false);
-  EXPECT_FALSE(pod->get_f_bool());
-  EXPECT_TRUE(pod->is_f_bool());
-  EXPECT_EQ(pod->which(), PodUnion::Tag::F_BOOL);
-
-  pod->set_f_enum(AnEnum::SECOND);
-  EXPECT_EQ(AnEnum::SECOND, pod->get_f_enum());
-  EXPECT_TRUE(pod->is_f_enum());
-  EXPECT_EQ(pod->which(), PodUnion::Tag::F_ENUM);
-}
-
-TEST(UnionTest, PodEquals) {
-  PodUnionPtr pod1(PodUnion::New());
-  PodUnionPtr pod2(PodUnion::New());
-
-  pod1->set_f_int8(10);
-  pod2->set_f_int8(10);
-  EXPECT_TRUE(pod1.Equals(pod2));
-
-  pod2->set_f_int8(11);
-  EXPECT_FALSE(pod1.Equals(pod2));
-
-  pod2->set_f_int8_other(10);
-  EXPECT_FALSE(pod1.Equals(pod2));
-}
-
-TEST(UnionTest, PodClone) {
-  PodUnionPtr pod(PodUnion::New());
-  pod->set_f_int8(10);
-
-  PodUnionPtr pod_clone = pod.Clone();
-  EXPECT_EQ(10, pod_clone->get_f_int8());
-  EXPECT_TRUE(pod_clone->is_f_int8());
-  EXPECT_EQ(pod_clone->which(), PodUnion::Tag::F_INT8);
-}
-
-TEST(UnionTest, PodSerialization) {
-  PodUnionPtr pod1(PodUnion::New());
-  pod1->set_f_int8(10);
-
-  mojo::internal::SerializationContext context;
-  size_t size = mojo::internal::PrepareToSerialize<PodUnionDataView>(
-      pod1, false, &context);
-  EXPECT_EQ(16U, size);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::PodUnion_Data* data = nullptr;
-  mojo::internal::Serialize<PodUnionDataView>(pod1, &buf, &data, false,
-                                              &context);
-
-  PodUnionPtr pod2;
-  mojo::internal::Deserialize<PodUnionDataView>(data, &pod2, &context);
-
-  EXPECT_EQ(10, pod2->get_f_int8());
-  EXPECT_TRUE(pod2->is_f_int8());
-  EXPECT_EQ(pod2->which(), PodUnion::Tag::F_INT8);
-}
-
-TEST(UnionTest, EnumSerialization) {
-  PodUnionPtr pod1(PodUnion::New());
-  pod1->set_f_enum(AnEnum::SECOND);
-
-  size_t size = mojo::internal::PrepareToSerialize<PodUnionDataView>(
-      pod1, false, nullptr);
-  EXPECT_EQ(16U, size);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::PodUnion_Data* data = nullptr;
-  mojo::internal::Serialize<PodUnionDataView>(pod1, &buf, &data, false,
-                                              nullptr);
-
-  PodUnionPtr pod2;
-  mojo::internal::Deserialize<PodUnionDataView>(data, &pod2, nullptr);
-
-  EXPECT_EQ(AnEnum::SECOND, pod2->get_f_enum());
-  EXPECT_TRUE(pod2->is_f_enum());
-  EXPECT_EQ(pod2->which(), PodUnion::Tag::F_ENUM);
-}
-
-TEST(UnionTest, PodValidation) {
-  PodUnionPtr pod(PodUnion::New());
-  pod->set_f_int8(10);
-
-  size_t size =
-      mojo::internal::PrepareToSerialize<PodUnionDataView>(pod, false, nullptr);
-  EXPECT_EQ(16U, size);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::PodUnion_Data* data = nullptr;
-  mojo::internal::Serialize<PodUnionDataView>(pod, &buf, &data, false, nullptr);
-
-  void* raw_buf = buf.Leak();
-  mojo::internal::ValidationContext validation_context(
-      data, static_cast<uint32_t>(size), 0, 0);
-  EXPECT_TRUE(
-      internal::PodUnion_Data::Validate(raw_buf, &validation_context, false));
-  free(raw_buf);
-}
-
-TEST(UnionTest, SerializeNotNull) {
-  PodUnionPtr pod(PodUnion::New());
-  pod->set_f_int8(0);
-  size_t size =
-      mojo::internal::PrepareToSerialize<PodUnionDataView>(pod, false, nullptr);
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::PodUnion_Data* data = nullptr;
-  mojo::internal::Serialize<PodUnionDataView>(pod, &buf, &data, false, nullptr);
-  EXPECT_FALSE(data->is_null());
-}
-
-TEST(UnionTest, SerializeIsNullInlined) {
-  PodUnionPtr pod;
-  size_t size =
-      mojo::internal::PrepareToSerialize<PodUnionDataView>(pod, false, nullptr);
-  EXPECT_EQ(16U, size);
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::PodUnion_Data* data = internal::PodUnion_Data::New(&buf);
-
-  // Check that dirty output buffers are handled correctly by serialization.
-  data->size = 16U;
-  data->tag = PodUnion::Tag::F_UINT16;
-  data->data.f_f_int16 = 20;
-
-  mojo::internal::Serialize<PodUnionDataView>(pod, &buf, &data, true, nullptr);
-  EXPECT_TRUE(data->is_null());
-
-  PodUnionPtr pod2;
-  mojo::internal::Deserialize<PodUnionDataView>(data, &pod2, nullptr);
-  EXPECT_TRUE(pod2.is_null());
-}
-
-TEST(UnionTest, SerializeIsNullNotInlined) {
-  PodUnionPtr pod;
-  size_t size =
-      mojo::internal::PrepareToSerialize<PodUnionDataView>(pod, false, nullptr);
-  EXPECT_EQ(16U, size);
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::PodUnion_Data* data = nullptr;
-  mojo::internal::Serialize<PodUnionDataView>(pod, &buf, &data, false, nullptr);
-  EXPECT_EQ(nullptr, data);
-}
-
-TEST(UnionTest, NullValidation) {
-  void* buf = nullptr;
-  mojo::internal::ValidationContext validation_context(buf, 0, 0, 0);
-  EXPECT_TRUE(internal::PodUnion_Data::Validate(
-      buf, &validation_context, false));
-}
-
-TEST(UnionTest, OutOfAlignmentValidation) {
-  size_t size = sizeof(internal::PodUnion_Data);
-  // Get an aligned object and shift the alignment.
-  mojo::internal::FixedBufferForTesting aligned_buf(size + 1);
-  void* raw_buf = aligned_buf.Leak();
-  char* buf = reinterpret_cast<char*>(raw_buf) + 1;
-
-  internal::PodUnion_Data* data =
-      reinterpret_cast<internal::PodUnion_Data*>(buf);
-  mojo::internal::ValidationContext validation_context(
-      data, static_cast<uint32_t>(size), 0, 0);
-  EXPECT_FALSE(internal::PodUnion_Data::Validate(
-      buf, &validation_context, false));
-  free(raw_buf);
-}
-
-TEST(UnionTest, OOBValidation) {
-  size_t size = sizeof(internal::PodUnion_Data) - 1;
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::PodUnion_Data* data = internal::PodUnion_Data::New(&buf);
-  mojo::internal::ValidationContext validation_context(
-      data, static_cast<uint32_t>(size), 0, 0);
-  void* raw_buf = buf.Leak();
-  EXPECT_FALSE(
-      internal::PodUnion_Data::Validate(raw_buf, &validation_context, false));
-  free(raw_buf);
-}
-
-TEST(UnionTest, UnknownTagValidation) {
-  size_t size = sizeof(internal::PodUnion_Data);
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::PodUnion_Data* data = internal::PodUnion_Data::New(&buf);
-  data->tag = static_cast<internal::PodUnion_Data::PodUnion_Tag>(0xFFFFFF);
-  mojo::internal::ValidationContext validation_context(
-      data, static_cast<uint32_t>(size), 0, 0);
-  void* raw_buf = buf.Leak();
-  EXPECT_FALSE(
-      internal::PodUnion_Data::Validate(raw_buf, &validation_context, false));
-  free(raw_buf);
-}
-
-TEST(UnionTest, UnknownEnumValueValidation) {
-  PodUnionPtr pod(PodUnion::New());
-  pod->set_f_enum(static_cast<AnEnum>(0xFFFF));
-
-  size_t size =
-      mojo::internal::PrepareToSerialize<PodUnionDataView>(pod, false, nullptr);
-  EXPECT_EQ(16U, size);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::PodUnion_Data* data = nullptr;
-  mojo::internal::Serialize<PodUnionDataView>(pod, &buf, &data, false, nullptr);
-
-  void* raw_buf = buf.Leak();
-  mojo::internal::ValidationContext validation_context(
-      data, static_cast<uint32_t>(size), 0, 0);
-  EXPECT_FALSE(
-      internal::PodUnion_Data::Validate(raw_buf, &validation_context, false));
-  free(raw_buf);
-}
-
-TEST(UnionTest, UnknownExtensibleEnumValueValidation) {
-  PodUnionPtr pod(PodUnion::New());
-  pod->set_f_extensible_enum(static_cast<AnExtensibleEnum>(0xFFFF));
-
-  size_t size =
-      mojo::internal::PrepareToSerialize<PodUnionDataView>(pod, false, nullptr);
-  EXPECT_EQ(16U, size);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::PodUnion_Data* data = nullptr;
-  mojo::internal::Serialize<PodUnionDataView>(pod, &buf, &data, false, nullptr);
-
-  void* raw_buf = buf.Leak();
-  mojo::internal::ValidationContext validation_context(
-      data, static_cast<uint32_t>(size), 0, 0);
-  EXPECT_TRUE(
-      internal::PodUnion_Data::Validate(raw_buf, &validation_context, false));
-  free(raw_buf);
-}
-
-TEST(UnionTest, StringGetterSetter) {
-  ObjectUnionPtr pod(ObjectUnion::New());
-
-  std::string hello("hello world");
-  pod->set_f_string(hello);
-  EXPECT_EQ(hello, pod->get_f_string());
-  EXPECT_TRUE(pod->is_f_string());
-  EXPECT_EQ(pod->which(), ObjectUnion::Tag::F_STRING);
-}
-
-TEST(UnionTest, StringEquals) {
-  ObjectUnionPtr pod1(ObjectUnion::New());
-  ObjectUnionPtr pod2(ObjectUnion::New());
-
-  pod1->set_f_string("hello world");
-  pod2->set_f_string("hello world");
-  EXPECT_TRUE(pod1.Equals(pod2));
-
-  pod2->set_f_string("hello universe");
-  EXPECT_FALSE(pod1.Equals(pod2));
-}
-
-TEST(UnionTest, StringClone) {
-  ObjectUnionPtr pod(ObjectUnion::New());
-
-  std::string hello("hello world");
-  pod->set_f_string(hello);
-  ObjectUnionPtr pod_clone = pod.Clone();
-  EXPECT_EQ(hello, pod_clone->get_f_string());
-  EXPECT_TRUE(pod_clone->is_f_string());
-  EXPECT_EQ(pod_clone->which(), ObjectUnion::Tag::F_STRING);
-}
-
-TEST(UnionTest, StringSerialization) {
-  ObjectUnionPtr pod1(ObjectUnion::New());
-
-  std::string hello("hello world");
-  pod1->set_f_string(hello);
-
-  size_t size = mojo::internal::PrepareToSerialize<ObjectUnionDataView>(
-      pod1, false, nullptr);
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::ObjectUnion_Data* data = nullptr;
-  mojo::internal::Serialize<ObjectUnionDataView>(pod1, &buf, &data, false,
-                                                 nullptr);
-
-  ObjectUnionPtr pod2;
-  mojo::internal::Deserialize<ObjectUnionDataView>(data, &pod2, nullptr);
-  EXPECT_EQ(hello, pod2->get_f_string());
-  EXPECT_TRUE(pod2->is_f_string());
-  EXPECT_EQ(pod2->which(), ObjectUnion::Tag::F_STRING);
-}
-
-TEST(UnionTest, NullStringValidation) {
-  size_t size = sizeof(internal::ObjectUnion_Data);
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::ObjectUnion_Data* data = internal::ObjectUnion_Data::New(&buf);
-  data->tag = internal::ObjectUnion_Data::ObjectUnion_Tag::F_STRING;
-  data->data.unknown = 0x0;
-  mojo::internal::ValidationContext validation_context(
-      data, static_cast<uint32_t>(size), 0, 0);
-  void* raw_buf = buf.Leak();
-  EXPECT_FALSE(internal::ObjectUnion_Data::Validate(
-      raw_buf, &validation_context, false));
-  free(raw_buf);
-}
-
-TEST(UnionTest, StringPointerOverflowValidation) {
-  size_t size = sizeof(internal::ObjectUnion_Data);
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::ObjectUnion_Data* data = internal::ObjectUnion_Data::New(&buf);
-  data->tag = internal::ObjectUnion_Data::ObjectUnion_Tag::F_STRING;
-  data->data.unknown = 0xFFFFFFFFFFFFFFFF;
-  mojo::internal::ValidationContext validation_context(
-      data, static_cast<uint32_t>(size), 0, 0);
-  void* raw_buf = buf.Leak();
-  EXPECT_FALSE(internal::ObjectUnion_Data::Validate(
-      raw_buf, &validation_context, false));
-  free(raw_buf);
-}
-
-TEST(UnionTest, StringValidateOOB) {
-  size_t size = 32;
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::ObjectUnion_Data* data = internal::ObjectUnion_Data::New(&buf);
-  data->tag = internal::ObjectUnion_Data::ObjectUnion_Tag::F_STRING;
-
-  data->data.f_f_string.offset = 8;
-  char* ptr = reinterpret_cast<char*>(&data->data.f_f_string);
-  mojo::internal::ArrayHeader* array_header =
-      reinterpret_cast<mojo::internal::ArrayHeader*>(ptr + *ptr);
-  array_header->num_bytes = 20;  // This should go out of bounds.
-  array_header->num_elements = 20;
-  mojo::internal::ValidationContext validation_context(data, 32, 0, 0);
-  void* raw_buf = buf.Leak();
-  EXPECT_FALSE(internal::ObjectUnion_Data::Validate(
-      raw_buf, &validation_context, false));
-  free(raw_buf);
-}
-
-// TODO(azani): Move back in array_unittest.cc when possible.
-// Array tests
-TEST(UnionTest, PodUnionInArray) {
-  SmallStructPtr small_struct(SmallStruct::New());
-  small_struct->pod_union_array.emplace(2);
-  small_struct->pod_union_array.value()[0] = PodUnion::New();
-  small_struct->pod_union_array.value()[1] = PodUnion::New();
-
-  small_struct->pod_union_array.value()[0]->set_f_int8(10);
-  small_struct->pod_union_array.value()[1]->set_f_int16(12);
-
-  EXPECT_EQ(10, small_struct->pod_union_array.value()[0]->get_f_int8());
-  EXPECT_EQ(12, small_struct->pod_union_array.value()[1]->get_f_int16());
-}
-
-TEST(UnionTest, PodUnionInArraySerialization) {
-  std::vector<PodUnionPtr> array(2);
-  array[0] = PodUnion::New();
-  array[1] = PodUnion::New();
-
-  array[0]->set_f_int8(10);
-  array[1]->set_f_int16(12);
-  EXPECT_EQ(2U, array.size());
-
-  size_t size =
-      mojo::internal::PrepareToSerialize<ArrayDataView<PodUnionDataView>>(
-          array, nullptr);
-  EXPECT_EQ(40U, size);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  mojo::internal::Array_Data<internal::PodUnion_Data>* data;
-  mojo::internal::ContainerValidateParams validate_params(0, false, nullptr);
-  mojo::internal::Serialize<ArrayDataView<PodUnionDataView>>(
-      array, &buf, &data, &validate_params, nullptr);
-
-  std::vector<PodUnionPtr> array2;
-  mojo::internal::Deserialize<ArrayDataView<PodUnionDataView>>(data, &array2,
-                                                               nullptr);
-
-  EXPECT_EQ(2U, array2.size());
-
-  EXPECT_EQ(10, array2[0]->get_f_int8());
-  EXPECT_EQ(12, array2[1]->get_f_int16());
-}
-
-TEST(UnionTest, PodUnionInArraySerializationWithNull) {
-  std::vector<PodUnionPtr> array(2);
-  array[0] = PodUnion::New();
-
-  array[0]->set_f_int8(10);
-  EXPECT_EQ(2U, array.size());
-
-  size_t size =
-      mojo::internal::PrepareToSerialize<ArrayDataView<PodUnionDataView>>(
-          array, nullptr);
-  EXPECT_EQ(40U, size);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  mojo::internal::Array_Data<internal::PodUnion_Data>* data;
-  mojo::internal::ContainerValidateParams validate_params(0, true, nullptr);
-  mojo::internal::Serialize<ArrayDataView<PodUnionDataView>>(
-      array, &buf, &data, &validate_params, nullptr);
-
-  std::vector<PodUnionPtr> array2;
-  mojo::internal::Deserialize<ArrayDataView<PodUnionDataView>>(data, &array2,
-                                                               nullptr);
-
-  EXPECT_EQ(2U, array2.size());
-
-  EXPECT_EQ(10, array2[0]->get_f_int8());
-  EXPECT_TRUE(array2[1].is_null());
-}
-
-TEST(UnionTest, ObjectUnionInArraySerialization) {
-  std::vector<ObjectUnionPtr> array(2);
-  array[0] = ObjectUnion::New();
-  array[1] = ObjectUnion::New();
-
-  array[0]->set_f_string("hello");
-  array[1]->set_f_string("world");
-  EXPECT_EQ(2U, array.size());
-
-  size_t size =
-      mojo::internal::PrepareToSerialize<ArrayDataView<ObjectUnionDataView>>(
-          array, nullptr);
-  EXPECT_EQ(72U, size);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-
-  mojo::internal::Array_Data<internal::ObjectUnion_Data>* data;
-  mojo::internal::ContainerValidateParams validate_params(0, false, nullptr);
-  mojo::internal::Serialize<ArrayDataView<ObjectUnionDataView>>(
-      array, &buf, &data, &validate_params, nullptr);
-
-  std::vector<char> new_buf;
-  new_buf.resize(size);
-
-  void* raw_buf = buf.Leak();
-  memcpy(new_buf.data(), raw_buf, size);
-  free(raw_buf);
-
-  data =
-      reinterpret_cast<mojo::internal::Array_Data<internal::ObjectUnion_Data>*>(
-          new_buf.data());
-  mojo::internal::ValidationContext validation_context(
-      data, static_cast<uint32_t>(size), 0, 0);
-  ASSERT_TRUE(mojo::internal::Array_Data<internal::ObjectUnion_Data>::Validate(
-      data, &validation_context, &validate_params));
-
-  std::vector<ObjectUnionPtr> array2;
-  mojo::internal::Deserialize<ArrayDataView<ObjectUnionDataView>>(data, &array2,
-                                                                  nullptr);
-
-  EXPECT_EQ(2U, array2.size());
-
-  EXPECT_EQ("hello", array2[0]->get_f_string());
-  EXPECT_EQ("world", array2[1]->get_f_string());
-}
-
-// TODO(azani): Move back in struct_unittest.cc when possible.
-// Struct tests
-TEST(UnionTest, Clone_Union) {
-  SmallStructPtr small_struct(SmallStruct::New());
-  small_struct->pod_union = PodUnion::New();
-  small_struct->pod_union->set_f_int8(10);
-
-  SmallStructPtr clone = small_struct.Clone();
-  EXPECT_EQ(10, clone->pod_union->get_f_int8());
-}
-
-// Serialization test of a struct with a union of plain old data.
-TEST(UnionTest, Serialization_UnionOfPods) {
-  SmallStructPtr small_struct(SmallStruct::New());
-  small_struct->pod_union = PodUnion::New();
-  small_struct->pod_union->set_f_int32(10);
-
-  mojo::internal::SerializationContext context;
-  size_t size = mojo::internal::PrepareToSerialize<SmallStructDataView>(
-      small_struct, &context);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::SmallStruct_Data* data = nullptr;
-  mojo::internal::Serialize<SmallStructDataView>(small_struct, &buf, &data,
-                                                 &context);
-
-  SmallStructPtr deserialized;
-  mojo::internal::Deserialize<SmallStructDataView>(data, &deserialized,
-                                                   &context);
-
-  EXPECT_EQ(10, deserialized->pod_union->get_f_int32());
-}
-
-// Serialization test of a struct with a union of structs.
-TEST(UnionTest, Serialization_UnionOfObjects) {
-  SmallObjStructPtr obj_struct(SmallObjStruct::New());
-  obj_struct->obj_union = ObjectUnion::New();
-  std::string hello("hello world");
-  obj_struct->obj_union->set_f_string(hello);
-
-  size_t size = mojo::internal::PrepareToSerialize<SmallObjStructDataView>(
-      obj_struct, nullptr);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::SmallObjStruct_Data* data = nullptr;
-  mojo::internal::Serialize<SmallObjStructDataView>(obj_struct, &buf, &data,
-                                                    nullptr);
-
-  SmallObjStructPtr deserialized;
-  mojo::internal::Deserialize<SmallObjStructDataView>(data, &deserialized,
-                                                      nullptr);
-
-  EXPECT_EQ(hello, deserialized->obj_union->get_f_string());
-}
-
-// Validation test of a struct with a union.
-TEST(UnionTest, Validation_UnionsInStruct) {
-  SmallStructPtr small_struct(SmallStruct::New());
-  small_struct->pod_union = PodUnion::New();
-  small_struct->pod_union->set_f_int32(10);
-
-  mojo::internal::SerializationContext context;
-  size_t size = mojo::internal::PrepareToSerialize<SmallStructDataView>(
-      small_struct, &context);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::SmallStruct_Data* data = nullptr;
-  mojo::internal::Serialize<SmallStructDataView>(small_struct, &buf, &data,
-                                                 &context);
-
-  void* raw_buf = buf.Leak();
-  mojo::internal::ValidationContext validation_context(
-      data, static_cast<uint32_t>(size), 0, 0);
-  EXPECT_TRUE(internal::SmallStruct_Data::Validate(
-      raw_buf, &validation_context));
-  free(raw_buf);
-}
-
-// Validation test of a struct union fails due to unknown union tag.
-TEST(UnionTest, Validation_PodUnionInStruct_Failure) {
-  SmallStructPtr small_struct(SmallStruct::New());
-  small_struct->pod_union = PodUnion::New();
-  small_struct->pod_union->set_f_int32(10);
-
-  mojo::internal::SerializationContext context;
-  size_t size = mojo::internal::PrepareToSerialize<SmallStructDataView>(
-      small_struct, &context);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::SmallStruct_Data* data = nullptr;
-  mojo::internal::Serialize<SmallStructDataView>(small_struct, &buf, &data,
-                                                 &context);
-  data->pod_union.tag = static_cast<internal::PodUnion_Data::PodUnion_Tag>(100);
-
-  void* raw_buf = buf.Leak();
-  mojo::internal::ValidationContext validation_context(
-      data, static_cast<uint32_t>(size), 0, 0);
-  EXPECT_FALSE(internal::SmallStruct_Data::Validate(
-      raw_buf, &validation_context));
-  free(raw_buf);
-}
-
-// Validation fails due to non-nullable null union in struct.
-TEST(UnionTest, Validation_NullUnion_Failure) {
-  SmallStructNonNullableUnionPtr small_struct(
-      SmallStructNonNullableUnion::New());
-
-  size_t size =
-      mojo::internal::PrepareToSerialize<SmallStructNonNullableUnionDataView>(
-          small_struct, nullptr);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::SmallStructNonNullableUnion_Data* data =
-      internal::SmallStructNonNullableUnion_Data::New(&buf);
-
-  void* raw_buf = buf.Leak();
-  mojo::internal::ValidationContext validation_context(
-      data, static_cast<uint32_t>(size), 0, 0);
-  EXPECT_FALSE(internal::SmallStructNonNullableUnion_Data::Validate(
-      raw_buf, &validation_context));
-  free(raw_buf);
-}
-
-// Validation passes with nullable null union.
-TEST(UnionTest, Validation_NullableUnion) {
-  SmallStructPtr small_struct(SmallStruct::New());
-
-  mojo::internal::SerializationContext context;
-  size_t size = mojo::internal::PrepareToSerialize<SmallStructDataView>(
-      small_struct, &context);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::SmallStruct_Data* data = nullptr;
-  mojo::internal::Serialize<SmallStructDataView>(small_struct, &buf, &data,
-                                                 &context);
-
-  void* raw_buf = buf.Leak();
-  mojo::internal::ValidationContext validation_context(
-      data, static_cast<uint32_t>(size), 0, 0);
-  EXPECT_TRUE(internal::SmallStruct_Data::Validate(
-      raw_buf, &validation_context));
-  free(raw_buf);
-}
-
-// TODO(azani): Move back in map_unittest.cc when possible.
-// Map Tests
-TEST(UnionTest, PodUnionInMap) {
-  SmallStructPtr small_struct(SmallStruct::New());
-  small_struct->pod_union_map.emplace();
-  small_struct->pod_union_map.value()["one"] = PodUnion::New();
-  small_struct->pod_union_map.value()["two"] = PodUnion::New();
-
-  small_struct->pod_union_map.value()["one"]->set_f_int8(8);
-  small_struct->pod_union_map.value()["two"]->set_f_int16(16);
-
-  EXPECT_EQ(8, small_struct->pod_union_map.value()["one"]->get_f_int8());
-  EXPECT_EQ(16, small_struct->pod_union_map.value()["two"]->get_f_int16());
-}
-
-TEST(UnionTest, PodUnionInMapSerialization) {
-  using MojomType = MapDataView<StringDataView, PodUnionDataView>;
-
-  std::unordered_map<std::string, PodUnionPtr> map;
-  map.insert(std::make_pair("one", PodUnion::New()));
-  map.insert(std::make_pair("two", PodUnion::New()));
-
-  map["one"]->set_f_int8(8);
-  map["two"]->set_f_int16(16);
-
-  mojo::internal::SerializationContext context;
-  size_t size = mojo::internal::PrepareToSerialize<MojomType>(map, &context);
-  EXPECT_EQ(120U, size);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-
-  typename mojo::internal::MojomTypeTraits<MojomType>::Data* data;
-  mojo::internal::ContainerValidateParams validate_params(
-      new mojo::internal::ContainerValidateParams(0, false, nullptr),
-      new mojo::internal::ContainerValidateParams(0, false, nullptr));
-  mojo::internal::Serialize<MojomType>(map, &buf, &data, &validate_params,
-                                       &context);
-
-  std::unordered_map<std::string, PodUnionPtr> map2;
-  mojo::internal::Deserialize<MojomType>(data, &map2, &context);
-
-  EXPECT_EQ(8, map2["one"]->get_f_int8());
-  EXPECT_EQ(16, map2["two"]->get_f_int16());
-}
-
-TEST(UnionTest, PodUnionInMapSerializationWithNull) {
-  using MojomType = MapDataView<StringDataView, PodUnionDataView>;
-
-  std::unordered_map<std::string, PodUnionPtr> map;
-  map.insert(std::make_pair("one", PodUnion::New()));
-  map.insert(std::make_pair("two", nullptr));
-
-  map["one"]->set_f_int8(8);
-
-  mojo::internal::SerializationContext context;
-  size_t size = mojo::internal::PrepareToSerialize<MojomType>(map, &context);
-  EXPECT_EQ(120U, size);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  typename mojo::internal::MojomTypeTraits<MojomType>::Data* data;
-  mojo::internal::ContainerValidateParams validate_params(
-      new mojo::internal::ContainerValidateParams(0, false, nullptr),
-      new mojo::internal::ContainerValidateParams(0, true, nullptr));
-  mojo::internal::Serialize<MojomType>(map, &buf, &data, &validate_params,
-                                       &context);
-
-  std::unordered_map<std::string, PodUnionPtr> map2;
-  mojo::internal::Deserialize<MojomType>(data, &map2, &context);
-
-  EXPECT_EQ(8, map2["one"]->get_f_int8());
-  EXPECT_TRUE(map2["two"].is_null());
-}
-
-TEST(UnionTest, StructInUnionGetterSetterPasser) {
-  DummyStructPtr dummy(DummyStruct::New());
-  dummy->f_int8 = 8;
-
-  ObjectUnionPtr obj(ObjectUnion::New());
-  obj->set_f_dummy(std::move(dummy));
-
-  EXPECT_EQ(8, obj->get_f_dummy()->f_int8);
-}
-
-TEST(UnionTest, StructInUnionSerialization) {
-  DummyStructPtr dummy(DummyStruct::New());
-  dummy->f_int8 = 8;
-
-  ObjectUnionPtr obj(ObjectUnion::New());
-  obj->set_f_dummy(std::move(dummy));
-
-  size_t size = mojo::internal::PrepareToSerialize<ObjectUnionDataView>(
-      obj, false, nullptr);
-  EXPECT_EQ(32U, size);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::ObjectUnion_Data* data = nullptr;
-  mojo::internal::Serialize<ObjectUnionDataView>(obj, &buf, &data, false,
-                                                 nullptr);
-
-  ObjectUnionPtr obj2;
-  mojo::internal::Deserialize<ObjectUnionDataView>(data, &obj2, nullptr);
-  EXPECT_EQ(8, obj2->get_f_dummy()->f_int8);
-}
-
-TEST(UnionTest, StructInUnionValidation) {
-  DummyStructPtr dummy(DummyStruct::New());
-  dummy->f_int8 = 8;
-
-  ObjectUnionPtr obj(ObjectUnion::New());
-  obj->set_f_dummy(std::move(dummy));
-
-  size_t size = mojo::internal::PrepareToSerialize<ObjectUnionDataView>(
-      obj, false, nullptr);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::ObjectUnion_Data* data = nullptr;
-  mojo::internal::Serialize<ObjectUnionDataView>(obj, &buf, &data, false,
-                                                 nullptr);
-
-  void* raw_buf = buf.Leak();
-  mojo::internal::ValidationContext validation_context(
-      data, static_cast<uint32_t>(size), 0, 0);
-  EXPECT_TRUE(internal::ObjectUnion_Data::Validate(
-      raw_buf, &validation_context, false));
-  free(raw_buf);
-}
-
-TEST(UnionTest, StructInUnionValidationNonNullable) {
-  mojo::internal::SerializationWarningObserverForTesting suppress_warning;
-
-  DummyStructPtr dummy(nullptr);
-
-  ObjectUnionPtr obj(ObjectUnion::New());
-  obj->set_f_dummy(std::move(dummy));
-
-  size_t size = mojo::internal::PrepareToSerialize<ObjectUnionDataView>(
-      obj, false, nullptr);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::ObjectUnion_Data* data = nullptr;
-  mojo::internal::Serialize<ObjectUnionDataView>(obj, &buf, &data, false,
-                                                 nullptr);
-
-  void* raw_buf = buf.Leak();
-  mojo::internal::ValidationContext validation_context(
-      data, static_cast<uint32_t>(size), 0, 0);
-  EXPECT_FALSE(internal::ObjectUnion_Data::Validate(
-      raw_buf, &validation_context, false));
-  free(raw_buf);
-}
-
-TEST(UnionTest, StructInUnionValidationNullable) {
-  DummyStructPtr dummy(nullptr);
-
-  ObjectUnionPtr obj(ObjectUnion::New());
-  obj->set_f_nullable(std::move(dummy));
-
-  size_t size = mojo::internal::PrepareToSerialize<ObjectUnionDataView>(
-      obj, false, nullptr);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::ObjectUnion_Data* data = nullptr;
-  mojo::internal::Serialize<ObjectUnionDataView>(obj, &buf, &data, false,
-                                                 nullptr);
-
-  void* raw_buf = buf.Leak();
-  mojo::internal::ValidationContext validation_context(
-      data, static_cast<uint32_t>(size), 0, 0);
-  EXPECT_TRUE(internal::ObjectUnion_Data::Validate(
-      raw_buf, &validation_context, false));
-  free(raw_buf);
-}
-
-TEST(UnionTest, ArrayInUnionGetterSetter) {
-  std::vector<int8_t> array(2);
-  array[0] = 8;
-  array[1] = 9;
-
-  ObjectUnionPtr obj(ObjectUnion::New());
-  obj->set_f_array_int8(std::move(array));
-
-  EXPECT_EQ(8, obj->get_f_array_int8()[0]);
-  EXPECT_EQ(9, obj->get_f_array_int8()[1]);
-}
-
-TEST(UnionTest, ArrayInUnionSerialization) {
-  std::vector<int8_t> array(2);
-  array[0] = 8;
-  array[1] = 9;
-
-  ObjectUnionPtr obj(ObjectUnion::New());
-  obj->set_f_array_int8(std::move(array));
-
-  size_t size = mojo::internal::PrepareToSerialize<ObjectUnionDataView>(
-      obj, false, nullptr);
-  EXPECT_EQ(32U, size);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::ObjectUnion_Data* data = nullptr;
-  mojo::internal::Serialize<ObjectUnionDataView>(obj, &buf, &data, false,
-                                                 nullptr);
-
-  ObjectUnionPtr obj2;
-  mojo::internal::Deserialize<ObjectUnionDataView>(data, &obj2, nullptr);
-
-  EXPECT_EQ(8, obj2->get_f_array_int8()[0]);
-  EXPECT_EQ(9, obj2->get_f_array_int8()[1]);
-}
-
-TEST(UnionTest, ArrayInUnionValidation) {
-  std::vector<int8_t> array(2);
-  array[0] = 8;
-  array[1] = 9;
-
-  ObjectUnionPtr obj(ObjectUnion::New());
-  obj->set_f_array_int8(std::move(array));
-
-  size_t size = mojo::internal::PrepareToSerialize<ObjectUnionDataView>(
-      obj, false, nullptr);
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::ObjectUnion_Data* data = nullptr;
-  mojo::internal::Serialize<ObjectUnionDataView>(obj, &buf, &data, false,
-                                                 nullptr);
-
-  void* raw_buf = buf.Leak();
-  mojo::internal::ValidationContext validation_context(
-      data, static_cast<uint32_t>(size), 0, 0);
-
-  EXPECT_TRUE(internal::ObjectUnion_Data::Validate(
-      raw_buf, &validation_context, false));
-  free(raw_buf);
-}
-
-TEST(UnionTest, MapInUnionGetterSetter) {
-  std::unordered_map<std::string, int8_t> map;
-  map.insert({"one", 1});
-  map.insert({"two", 2});
-
-  ObjectUnionPtr obj(ObjectUnion::New());
-  obj->set_f_map_int8(std::move(map));
-
-  EXPECT_EQ(1, obj->get_f_map_int8()["one"]);
-  EXPECT_EQ(2, obj->get_f_map_int8()["two"]);
-}
-
-TEST(UnionTest, MapInUnionSerialization) {
-  std::unordered_map<std::string, int8_t> map;
-  map.insert({"one", 1});
-  map.insert({"two", 2});
-
-  ObjectUnionPtr obj(ObjectUnion::New());
-  obj->set_f_map_int8(std::move(map));
-
-  mojo::internal::SerializationContext context;
-  size_t size = mojo::internal::PrepareToSerialize<ObjectUnionDataView>(
-      obj, false, &context);
-  EXPECT_EQ(112U, size);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::ObjectUnion_Data* data = nullptr;
-  mojo::internal::Serialize<ObjectUnionDataView>(obj, &buf, &data, false,
-                                                 &context);
-
-  ObjectUnionPtr obj2;
-  mojo::internal::Deserialize<ObjectUnionDataView>(data, &obj2, &context);
-
-  EXPECT_EQ(1, obj2->get_f_map_int8()["one"]);
-  EXPECT_EQ(2, obj2->get_f_map_int8()["two"]);
-}
-
-TEST(UnionTest, MapInUnionValidation) {
-  std::unordered_map<std::string, int8_t> map;
-  map.insert({"one", 1});
-  map.insert({"two", 2});
-
-  ObjectUnionPtr obj(ObjectUnion::New());
-  obj->set_f_map_int8(std::move(map));
-
-  mojo::internal::SerializationContext context;
-  size_t size = mojo::internal::PrepareToSerialize<ObjectUnionDataView>(
-      obj, false, &context);
-  EXPECT_EQ(112U, size);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::ObjectUnion_Data* data = nullptr;
-  mojo::internal::Serialize<ObjectUnionDataView>(obj, &buf, &data, false,
-                                                 &context);
-
-  void* raw_buf = buf.Leak();
-  mojo::internal::ValidationContext validation_context(
-      data, static_cast<uint32_t>(size), 0, 0);
-
-  EXPECT_TRUE(internal::ObjectUnion_Data::Validate(
-      raw_buf, &validation_context, false));
-  free(raw_buf);
-}
-
-TEST(UnionTest, UnionInUnionGetterSetter) {
-  PodUnionPtr pod(PodUnion::New());
-  pod->set_f_int8(10);
-
-  ObjectUnionPtr obj(ObjectUnion::New());
-  obj->set_f_pod_union(std::move(pod));
-
-  EXPECT_EQ(10, obj->get_f_pod_union()->get_f_int8());
-}
-
-TEST(UnionTest, UnionInUnionSerialization) {
-  PodUnionPtr pod(PodUnion::New());
-  pod->set_f_int8(10);
-
-  ObjectUnionPtr obj(ObjectUnion::New());
-  obj->set_f_pod_union(std::move(pod));
-
-  size_t size = mojo::internal::PrepareToSerialize<ObjectUnionDataView>(
-      obj, false, nullptr);
-  EXPECT_EQ(32U, size);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::ObjectUnion_Data* data = nullptr;
-  mojo::internal::Serialize<ObjectUnionDataView>(obj, &buf, &data, false,
-                                                 nullptr);
-
-  ObjectUnionPtr obj2;
-  mojo::internal::Deserialize<ObjectUnionDataView>(data, &obj2, nullptr);
-  EXPECT_EQ(10, obj2->get_f_pod_union()->get_f_int8());
-}
-
-TEST(UnionTest, UnionInUnionValidation) {
-  PodUnionPtr pod(PodUnion::New());
-  pod->set_f_int8(10);
-
-  ObjectUnionPtr obj(ObjectUnion::New());
-  obj->set_f_pod_union(std::move(pod));
-
-  size_t size = mojo::internal::PrepareToSerialize<ObjectUnionDataView>(
-      obj, false, nullptr);
-  EXPECT_EQ(32U, size);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::ObjectUnion_Data* data = nullptr;
-  mojo::internal::Serialize<ObjectUnionDataView>(obj, &buf, &data, false,
-                                                 nullptr);
-
-  void* raw_buf = buf.Leak();
-  mojo::internal::ValidationContext validation_context(
-      data, static_cast<uint32_t>(size), 0, 0);
-  EXPECT_TRUE(internal::ObjectUnion_Data::Validate(
-      raw_buf, &validation_context, false));
-  free(raw_buf);
-}
-
-TEST(UnionTest, UnionInUnionValidationNonNullable) {
-  mojo::internal::SerializationWarningObserverForTesting suppress_warning;
-
-  PodUnionPtr pod(nullptr);
-
-  ObjectUnionPtr obj(ObjectUnion::New());
-  obj->set_f_pod_union(std::move(pod));
-
-  size_t size = mojo::internal::PrepareToSerialize<ObjectUnionDataView>(
-      obj, false, nullptr);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::ObjectUnion_Data* data = nullptr;
-  mojo::internal::Serialize<ObjectUnionDataView>(obj, &buf, &data, false,
-                                                 nullptr);
-
-  void* raw_buf = buf.Leak();
-  mojo::internal::ValidationContext validation_context(
-      data, static_cast<uint32_t>(size), 0, 0);
-  EXPECT_FALSE(internal::ObjectUnion_Data::Validate(
-      raw_buf, &validation_context, false));
-  free(raw_buf);
-}
-
-TEST(UnionTest, HandleInUnionGetterSetter) {
-  ScopedMessagePipeHandle pipe0;
-  ScopedMessagePipeHandle pipe1;
-
-  CreateMessagePipe(nullptr, &pipe0, &pipe1);
-
-  HandleUnionPtr handle(HandleUnion::New());
-  handle->set_f_message_pipe(std::move(pipe1));
-
-  std::string golden("hello world");
-  WriteTextMessage(pipe0.get(), golden);
-
-  std::string actual;
-  ReadTextMessage(handle->get_f_message_pipe().get(), &actual);
-
-  EXPECT_EQ(golden, actual);
-}
-
-TEST(UnionTest, HandleInUnionSerialization) {
-  ScopedMessagePipeHandle pipe0;
-  ScopedMessagePipeHandle pipe1;
-
-  CreateMessagePipe(nullptr, &pipe0, &pipe1);
-
-  HandleUnionPtr handle(HandleUnion::New());
-  handle->set_f_message_pipe(std::move(pipe1));
-
-  mojo::internal::SerializationContext context;
-  size_t size = mojo::internal::PrepareToSerialize<HandleUnionDataView>(
-      handle, false, &context);
-  EXPECT_EQ(16U, size);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::HandleUnion_Data* data = nullptr;
-  mojo::internal::Serialize<HandleUnionDataView>(handle, &buf, &data, false,
-                                                 &context);
-  EXPECT_EQ(1U, context.handles.size());
-
-  HandleUnionPtr handle2(HandleUnion::New());
-  mojo::internal::Deserialize<HandleUnionDataView>(data, &handle2, &context);
-
-  std::string golden("hello world");
-  WriteTextMessage(pipe0.get(), golden);
-
-  std::string actual;
-  ReadTextMessage(handle2->get_f_message_pipe().get(), &actual);
-
-  EXPECT_EQ(golden, actual);
-}
-
-TEST(UnionTest, HandleInUnionValidation) {
-  ScopedMessagePipeHandle pipe0;
-  ScopedMessagePipeHandle pipe1;
-
-  CreateMessagePipe(nullptr, &pipe0, &pipe1);
-
-  HandleUnionPtr handle(HandleUnion::New());
-  handle->set_f_message_pipe(std::move(pipe1));
-
-  mojo::internal::SerializationContext context;
-  size_t size = mojo::internal::PrepareToSerialize<HandleUnionDataView>(
-      handle, false, &context);
-  EXPECT_EQ(16U, size);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::HandleUnion_Data* data = nullptr;
-  mojo::internal::Serialize<HandleUnionDataView>(handle, &buf, &data, false,
-                                                 &context);
-
-  void* raw_buf = buf.Leak();
-  mojo::internal::ValidationContext validation_context(
-      data, static_cast<uint32_t>(size), 1, 0);
-  EXPECT_TRUE(internal::HandleUnion_Data::Validate(
-      raw_buf, &validation_context, false));
-  free(raw_buf);
-}
-
-TEST(UnionTest, HandleInUnionValidationNull) {
-  mojo::internal::SerializationWarningObserverForTesting suppress_warning;
-
-  ScopedMessagePipeHandle pipe;
-  HandleUnionPtr handle(HandleUnion::New());
-  handle->set_f_message_pipe(std::move(pipe));
-
-  mojo::internal::SerializationContext context;
-  size_t size = mojo::internal::PrepareToSerialize<HandleUnionDataView>(
-      handle, false, &context);
-  EXPECT_EQ(16U, size);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::HandleUnion_Data* data = nullptr;
-  mojo::internal::Serialize<HandleUnionDataView>(handle, &buf, &data, false,
-                                                 &context);
-
-  void* raw_buf = buf.Leak();
-  mojo::internal::ValidationContext validation_context(
-      data, static_cast<uint32_t>(size), 1, 0);
-  EXPECT_FALSE(internal::HandleUnion_Data::Validate(
-      raw_buf, &validation_context, false));
-  free(raw_buf);
-}
-
-class SmallCacheImpl : public SmallCache {
- public:
-  explicit SmallCacheImpl(const base::Closure& closure)
-      : int_value_(0), closure_(closure) {}
-  ~SmallCacheImpl() override {}
-  int64_t int_value() const { return int_value_; }
-
- private:
-  void SetIntValue(int64_t int_value) override {
-    int_value_ = int_value;
-    closure_.Run();
-  }
-  void GetIntValue(const GetIntValueCallback& callback) override {
-    callback.Run(int_value_);
-  }
-
-  int64_t int_value_;
-  base::Closure closure_;
-};
-
-TEST(UnionTest, InterfaceInUnion) {
-  base::MessageLoop message_loop;
-  base::RunLoop run_loop;
-  SmallCacheImpl impl(run_loop.QuitClosure());
-  SmallCachePtr ptr;
-  Binding<SmallCache> bindings(&impl, MakeRequest(&ptr));
-
-  HandleUnionPtr handle(HandleUnion::New());
-  handle->set_f_small_cache(std::move(ptr));
-
-  handle->get_f_small_cache()->SetIntValue(10);
-  run_loop.Run();
-  EXPECT_EQ(10, impl.int_value());
-}
-
-TEST(UnionTest, InterfaceInUnionSerialization) {
-  base::MessageLoop message_loop;
-  base::RunLoop run_loop;
-  SmallCacheImpl impl(run_loop.QuitClosure());
-  SmallCachePtr ptr;
-  Binding<SmallCache> bindings(&impl, MakeRequest(&ptr));
-
-  mojo::internal::SerializationContext context;
-  HandleUnionPtr handle(HandleUnion::New());
-  handle->set_f_small_cache(std::move(ptr));
-  size_t size = mojo::internal::PrepareToSerialize<HandleUnionDataView>(
-      handle, false, &context);
-  EXPECT_EQ(16U, size);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  internal::HandleUnion_Data* data = nullptr;
-  mojo::internal::Serialize<HandleUnionDataView>(handle, &buf, &data, false,
-                                                 &context);
-  EXPECT_EQ(1U, context.handles.size());
-
-  HandleUnionPtr handle2(HandleUnion::New());
-  mojo::internal::Deserialize<HandleUnionDataView>(data, &handle2, &context);
-
-  handle2->get_f_small_cache()->SetIntValue(10);
-  run_loop.Run();
-  EXPECT_EQ(10, impl.int_value());
-}
-
-class UnionInterfaceImpl : public UnionInterface {
- public:
-  UnionInterfaceImpl() {}
-  ~UnionInterfaceImpl() override {}
-
- private:
-  void Echo(PodUnionPtr in, const EchoCallback& callback) override {
-    callback.Run(std::move(in));
-  }
-};
-
-void ExpectInt16(int16_t value, PodUnionPtr out) {
-  EXPECT_EQ(value, out->get_f_int16());
-}
-
-TEST(UnionTest, UnionInInterface) {
-  base::MessageLoop message_loop;
-  UnionInterfaceImpl impl;
-  UnionInterfacePtr ptr;
-  Binding<UnionInterface> bindings(&impl, MakeRequest(&ptr));
-
-  PodUnionPtr pod(PodUnion::New());
-  pod->set_f_int16(16);
-
-  ptr->Echo(std::move(pod), base::Bind(&ExpectInt16, 16));
-  base::RunLoop().RunUntilIdle();
-}
-
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/validation_context_unittest.cc b/mojo/public/cpp/bindings/tests/validation_context_unittest.cc
deleted file mode 100644
index 9ce9d60..0000000
--- a/mojo/public/cpp/bindings/tests/validation_context_unittest.cc
+++ /dev/null
@@ -1,297 +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 <stddef.h>
-#include <stdint.h>
-
-#include <limits>
-
-#include "mojo/public/cpp/bindings/lib/serialization_util.h"
-#include "mojo/public/cpp/bindings/lib/validation_context.h"
-#include "mojo/public/cpp/system/core.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace test {
-namespace {
-
-using Handle_Data = mojo::internal::Handle_Data;
-using AssociatedEndpointHandle_Data =
-    mojo::internal::AssociatedEndpointHandle_Data;
-
-const void* ToPtr(uintptr_t ptr) {
-  return reinterpret_cast<const void*>(ptr);
-}
-
-#if defined(NDEBUG) && !defined(DCHECK_ALWAYS_ON)
-TEST(ValidationContextTest, ConstructorRangeOverflow) {
-  {
-    // Test memory range overflow.
-    internal::ValidationContext context(
-        ToPtr(std::numeric_limits<uintptr_t>::max() - 3000), 5000, 0, 0);
-
-    EXPECT_FALSE(context.IsValidRange(
-        ToPtr(std::numeric_limits<uintptr_t>::max() - 3000), 1));
-    EXPECT_FALSE(context.ClaimMemory(
-        ToPtr(std::numeric_limits<uintptr_t>::max() - 3000), 1));
-  }
-
-  if (sizeof(size_t) <= sizeof(uint32_t))
-    return;
-
-  {
-    // Test handle index range overflow.
-    size_t num_handles =
-        static_cast<size_t>(std::numeric_limits<uint32_t>::max()) + 5;
-    internal::ValidationContext context(ToPtr(0), 0, num_handles, 0);
-
-    EXPECT_FALSE(context.ClaimHandle(Handle_Data(0)));
-    EXPECT_FALSE(context.ClaimHandle(
-        Handle_Data(std::numeric_limits<uint32_t>::max() - 1)));
-
-    EXPECT_TRUE(context.ClaimHandle(
-        Handle_Data(internal::kEncodedInvalidHandleValue)));
-  }
-
-  {
-    size_t num_associated_endpoint_handles =
-        static_cast<size_t>(std::numeric_limits<uint32_t>::max()) + 5;
-    internal::ValidationContext context(ToPtr(0), 0, 0,
-                                        num_associated_endpoint_handles);
-
-    EXPECT_FALSE(context.ClaimAssociatedEndpointHandle(
-        AssociatedEndpointHandle_Data(0)));
-    EXPECT_FALSE(
-        context.ClaimAssociatedEndpointHandle(AssociatedEndpointHandle_Data(
-            std::numeric_limits<uint32_t>::max() - 1)));
-
-    EXPECT_TRUE(context.ClaimAssociatedEndpointHandle(
-        AssociatedEndpointHandle_Data(internal::kEncodedInvalidHandleValue)));
-  }
-}
-#endif
-
-TEST(ValidationContextTest, IsValidRange) {
-  {
-    internal::ValidationContext context(ToPtr(1234), 100, 0, 0);
-
-    // Basics.
-    EXPECT_FALSE(context.IsValidRange(ToPtr(100), 5));
-    EXPECT_FALSE(context.IsValidRange(ToPtr(1230), 50));
-    EXPECT_TRUE(context.IsValidRange(ToPtr(1234), 5));
-    EXPECT_TRUE(context.IsValidRange(ToPtr(1240), 50));
-    EXPECT_TRUE(context.IsValidRange(ToPtr(1234), 100));
-    EXPECT_FALSE(context.IsValidRange(ToPtr(1234), 101));
-    EXPECT_FALSE(context.IsValidRange(ToPtr(1240), 100));
-    EXPECT_FALSE(context.IsValidRange(ToPtr(1333), 5));
-    EXPECT_FALSE(context.IsValidRange(ToPtr(2234), 5));
-
-    // ClaimMemory() updates the valid range.
-    EXPECT_TRUE(context.ClaimMemory(ToPtr(1254), 10));
-
-    EXPECT_FALSE(context.IsValidRange(ToPtr(1234), 1));
-    EXPECT_FALSE(context.IsValidRange(ToPtr(1254), 10));
-    EXPECT_FALSE(context.IsValidRange(ToPtr(1263), 1));
-    EXPECT_FALSE(context.IsValidRange(ToPtr(1263), 10));
-    EXPECT_TRUE(context.IsValidRange(ToPtr(1264), 10));
-    EXPECT_TRUE(context.IsValidRange(ToPtr(1264), 70));
-    EXPECT_FALSE(context.IsValidRange(ToPtr(1264), 71));
-  }
-
-  {
-    internal::ValidationContext context(ToPtr(1234), 100, 0, 0);
-    // Should return false for empty ranges.
-    EXPECT_FALSE(context.IsValidRange(ToPtr(0), 0));
-    EXPECT_FALSE(context.IsValidRange(ToPtr(1200), 0));
-    EXPECT_FALSE(context.IsValidRange(ToPtr(1234), 0));
-    EXPECT_FALSE(context.IsValidRange(ToPtr(1240), 0));
-    EXPECT_FALSE(context.IsValidRange(ToPtr(2234), 0));
-  }
-
-  {
-    // The valid memory range is empty.
-    internal::ValidationContext context(ToPtr(1234), 0, 0, 0);
-
-    EXPECT_FALSE(context.IsValidRange(ToPtr(1234), 1));
-    EXPECT_FALSE(context.IsValidRange(ToPtr(1234), 0));
-  }
-
-  {
-    internal::ValidationContext context(
-        ToPtr(std::numeric_limits<uintptr_t>::max() - 2000), 1000, 0, 0);
-
-    // Test overflow.
-    EXPECT_FALSE(context.IsValidRange(
-        ToPtr(std::numeric_limits<uintptr_t>::max() - 1500), 4000));
-    EXPECT_FALSE(context.IsValidRange(
-        ToPtr(std::numeric_limits<uintptr_t>::max() - 1500),
-        std::numeric_limits<uint32_t>::max()));
-
-    // This should be fine.
-    EXPECT_TRUE(context.IsValidRange(
-        ToPtr(std::numeric_limits<uintptr_t>::max() - 1500), 200));
-  }
-}
-
-TEST(ValidationContextTest, ClaimHandle) {
-  {
-    internal::ValidationContext context(ToPtr(0), 0, 10, 0);
-
-    // Basics.
-    EXPECT_TRUE(context.ClaimHandle(Handle_Data(0)));
-    EXPECT_FALSE(context.ClaimHandle(Handle_Data(0)));
-
-    EXPECT_TRUE(context.ClaimHandle(Handle_Data(9)));
-    EXPECT_FALSE(context.ClaimHandle(Handle_Data(10)));
-
-    // Should fail because it is smaller than the max index that has been
-    // claimed.
-    EXPECT_FALSE(context.ClaimHandle(Handle_Data(8)));
-
-    // Should return true for invalid handle.
-    EXPECT_TRUE(context.ClaimHandle(
-        Handle_Data(internal::kEncodedInvalidHandleValue)));
-    EXPECT_TRUE(context.ClaimHandle(
-        Handle_Data(internal::kEncodedInvalidHandleValue)));
-  }
-
-  {
-    // No handle to claim.
-    internal::ValidationContext context(ToPtr(0), 0, 0, 0);
-
-    EXPECT_FALSE(context.ClaimHandle(Handle_Data(0)));
-
-    // Should still return true for invalid handle.
-    EXPECT_TRUE(context.ClaimHandle(
-        Handle_Data(internal::kEncodedInvalidHandleValue)));
-  }
-
-  {
-    // Test the case that |num_handles| is the same value as
-    // |internal::kEncodedInvalidHandleValue|.
-    EXPECT_EQ(internal::kEncodedInvalidHandleValue,
-              std::numeric_limits<uint32_t>::max());
-    internal::ValidationContext context(
-        ToPtr(0), 0, std::numeric_limits<uint32_t>::max(), 0);
-
-    EXPECT_TRUE(context.ClaimHandle(
-        Handle_Data(std::numeric_limits<uint32_t>::max() - 1)));
-    EXPECT_FALSE(context.ClaimHandle(
-        Handle_Data(std::numeric_limits<uint32_t>::max() - 1)));
-    EXPECT_FALSE(context.ClaimHandle(Handle_Data(0)));
-
-    // Should still return true for invalid handle.
-    EXPECT_TRUE(context.ClaimHandle(
-        Handle_Data(internal::kEncodedInvalidHandleValue)));
-  }
-}
-
-TEST(ValidationContextTest, ClaimAssociatedEndpointHandle) {
-  {
-    internal::ValidationContext context(ToPtr(0), 0, 0, 10);
-
-    // Basics.
-    EXPECT_TRUE(context.ClaimAssociatedEndpointHandle(
-        AssociatedEndpointHandle_Data(0)));
-    EXPECT_FALSE(context.ClaimAssociatedEndpointHandle(
-        AssociatedEndpointHandle_Data(0)));
-
-    EXPECT_TRUE(context.ClaimAssociatedEndpointHandle(
-        AssociatedEndpointHandle_Data(9)));
-    EXPECT_FALSE(context.ClaimAssociatedEndpointHandle(
-        AssociatedEndpointHandle_Data(10)));
-
-    // Should fail because it is smaller than the max index that has been
-    // claimed.
-    EXPECT_FALSE(context.ClaimAssociatedEndpointHandle(
-        AssociatedEndpointHandle_Data(8)));
-
-    // Should return true for invalid handle.
-    EXPECT_TRUE(context.ClaimAssociatedEndpointHandle(
-        AssociatedEndpointHandle_Data(internal::kEncodedInvalidHandleValue)));
-    EXPECT_TRUE(context.ClaimAssociatedEndpointHandle(
-        AssociatedEndpointHandle_Data(internal::kEncodedInvalidHandleValue)));
-  }
-
-  {
-    // No handle to claim.
-    internal::ValidationContext context(ToPtr(0), 0, 0, 0);
-
-    EXPECT_FALSE(context.ClaimAssociatedEndpointHandle(
-        AssociatedEndpointHandle_Data(0)));
-
-    // Should still return true for invalid handle.
-    EXPECT_TRUE(context.ClaimAssociatedEndpointHandle(
-        AssociatedEndpointHandle_Data(internal::kEncodedInvalidHandleValue)));
-  }
-
-  {
-    // Test the case that |num_associated_endpoint_handles| is the same value as
-    // |internal::kEncodedInvalidHandleValue|.
-    EXPECT_EQ(internal::kEncodedInvalidHandleValue,
-              std::numeric_limits<uint32_t>::max());
-    internal::ValidationContext context(ToPtr(0), 0, 0,
-                                        std::numeric_limits<uint32_t>::max());
-
-    EXPECT_TRUE(
-        context.ClaimAssociatedEndpointHandle(AssociatedEndpointHandle_Data(
-            std::numeric_limits<uint32_t>::max() - 1)));
-    EXPECT_FALSE(
-        context.ClaimAssociatedEndpointHandle(AssociatedEndpointHandle_Data(
-            std::numeric_limits<uint32_t>::max() - 1)));
-    EXPECT_FALSE(context.ClaimAssociatedEndpointHandle(
-        AssociatedEndpointHandle_Data(0)));
-
-    // Should still return true for invalid handle.
-    EXPECT_TRUE(context.ClaimAssociatedEndpointHandle(
-        AssociatedEndpointHandle_Data(internal::kEncodedInvalidHandleValue)));
-  }
-}
-
-TEST(ValidationContextTest, ClaimMemory) {
-  {
-    internal::ValidationContext context(ToPtr(1000), 2000, 0, 0);
-
-    // Basics.
-    EXPECT_FALSE(context.ClaimMemory(ToPtr(500), 100));
-    EXPECT_FALSE(context.ClaimMemory(ToPtr(800), 300));
-    EXPECT_TRUE(context.ClaimMemory(ToPtr(1000), 100));
-    EXPECT_FALSE(context.ClaimMemory(ToPtr(1099), 100));
-    EXPECT_TRUE(context.ClaimMemory(ToPtr(1100), 200));
-    EXPECT_FALSE(context.ClaimMemory(ToPtr(2000), 1001));
-    EXPECT_TRUE(context.ClaimMemory(ToPtr(2000), 500));
-    EXPECT_FALSE(context.ClaimMemory(ToPtr(2000), 500));
-    EXPECT_FALSE(context.ClaimMemory(ToPtr(1400), 100));
-    EXPECT_FALSE(context.ClaimMemory(ToPtr(3000), 1));
-    EXPECT_TRUE(context.ClaimMemory(ToPtr(2500), 500));
-  }
-
-  {
-    // No memory to claim.
-    internal::ValidationContext context(ToPtr(10000), 0, 0, 0);
-
-    EXPECT_FALSE(context.ClaimMemory(ToPtr(10000), 1));
-    EXPECT_FALSE(context.ClaimMemory(ToPtr(10000), 0));
-  }
-
-  {
-    internal::ValidationContext context(
-        ToPtr(std::numeric_limits<uintptr_t>::max() - 1000), 500, 0, 0);
-
-    // Test overflow.
-    EXPECT_FALSE(context.ClaimMemory(
-        ToPtr(std::numeric_limits<uintptr_t>::max() - 750), 4000));
-    EXPECT_FALSE(
-        context.ClaimMemory(ToPtr(std::numeric_limits<uintptr_t>::max() - 750),
-                            std::numeric_limits<uint32_t>::max()));
-
-    // This should be fine.
-    EXPECT_TRUE(context.ClaimMemory(
-        ToPtr(std::numeric_limits<uintptr_t>::max() - 750), 200));
-  }
-}
-
-}  // namespace
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/validation_test_input_parser.cc b/mojo/public/cpp/bindings/tests/validation_test_input_parser.cc
deleted file mode 100644
index f309737..0000000
--- a/mojo/public/cpp/bindings/tests/validation_test_input_parser.cc
+++ /dev/null
@@ -1,412 +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 "mojo/public/cpp/bindings/tests/validation_test_input_parser.h"
-
-#include <assert.h>
-#include <stddef.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <string.h>
-
-#include <limits>
-#include <map>
-#include <set>
-#include <utility>
-
-#include "mojo/public/c/system/macros.h"
-
-namespace mojo {
-namespace test {
-namespace {
-
-class ValidationTestInputParser {
- public:
-  ValidationTestInputParser(const std::string& input,
-                            std::vector<uint8_t>* data,
-                            size_t* num_handles,
-                            std::string* error_message);
-  ~ValidationTestInputParser();
-
-  bool Run();
-
- private:
-  struct DataType;
-
-  typedef std::pair<const char*, const char*> Range;
-
-  typedef bool (ValidationTestInputParser::*ParseDataFunc)(
-      const DataType& type,
-      const std::string& value_string);
-
-  struct DataType {
-    const char* name;
-    size_t name_size;
-    size_t data_size;
-    ParseDataFunc parse_data_func;
-  };
-
-  // A dist4/8 item that hasn't been matched with an anchr item.
-  struct PendingDistanceItem {
-    // Where this data item is located in |data_|.
-    size_t pos;
-    // Either 4 or 8 (bytes).
-    size_t data_size;
-  };
-
-  bool GetNextItem(Range* range);
-
-  bool ParseItem(const Range& range);
-
-  bool ParseUnsignedInteger(const DataType& type,
-                            const std::string& value_string);
-  bool ParseSignedInteger(const DataType& type,
-                          const std::string& value_string);
-  bool ParseFloat(const DataType& type, const std::string& value_string);
-  bool ParseDouble(const DataType& type, const std::string& value_string);
-  bool ParseBinarySequence(const DataType& type,
-                           const std::string& value_string);
-  bool ParseDistance(const DataType& type, const std::string& value_string);
-  bool ParseAnchor(const DataType& type, const std::string& value_string);
-  bool ParseHandles(const DataType& type, const std::string& value_string);
-
-  bool StartsWith(const Range& range, const char* prefix, size_t prefix_length);
-
-  bool ConvertToUnsignedInteger(const std::string& value_string,
-                                unsigned long long int* value);
-
-  template <typename T>
-  void AppendData(T data) {
-    size_t pos = data_->size();
-    data_->resize(pos + sizeof(T));
-    memcpy(&(*data_)[pos], &data, sizeof(T));
-  }
-
-  template <typename TargetType, typename InputType>
-  bool ConvertAndAppendData(InputType value) {
-    if (value > std::numeric_limits<TargetType>::max() ||
-        value < std::numeric_limits<TargetType>::min()) {
-      return false;
-    }
-    AppendData(static_cast<TargetType>(value));
-    return true;
-  }
-
-  template <typename TargetType, typename InputType>
-  bool ConvertAndFillData(size_t pos, InputType value) {
-    if (value > std::numeric_limits<TargetType>::max() ||
-        value < std::numeric_limits<TargetType>::min()) {
-      return false;
-    }
-    TargetType target_value = static_cast<TargetType>(value);
-    assert(pos + sizeof(TargetType) <= data_->size());
-    memcpy(&(*data_)[pos], &target_value, sizeof(TargetType));
-    return true;
-  }
-
-  static const DataType kDataTypes[];
-  static const size_t kDataTypeCount;
-
-  const std::string& input_;
-  size_t input_cursor_;
-
-  std::vector<uint8_t>* data_;
-  size_t* num_handles_;
-  std::string* error_message_;
-
-  std::map<std::string, PendingDistanceItem> pending_distance_items_;
-  std::set<std::string> anchors_;
-};
-
-#define DATA_TYPE(name, data_size, parse_data_func) \
-  { name, sizeof(name) - 1, data_size, parse_data_func }
-
-const ValidationTestInputParser::DataType
-    ValidationTestInputParser::kDataTypes[] = {
-        DATA_TYPE("[u1]", 1, &ValidationTestInputParser::ParseUnsignedInteger),
-        DATA_TYPE("[u2]", 2, &ValidationTestInputParser::ParseUnsignedInteger),
-        DATA_TYPE("[u4]", 4, &ValidationTestInputParser::ParseUnsignedInteger),
-        DATA_TYPE("[u8]", 8, &ValidationTestInputParser::ParseUnsignedInteger),
-        DATA_TYPE("[s1]", 1, &ValidationTestInputParser::ParseSignedInteger),
-        DATA_TYPE("[s2]", 2, &ValidationTestInputParser::ParseSignedInteger),
-        DATA_TYPE("[s4]", 4, &ValidationTestInputParser::ParseSignedInteger),
-        DATA_TYPE("[s8]", 8, &ValidationTestInputParser::ParseSignedInteger),
-        DATA_TYPE("[b]", 1, &ValidationTestInputParser::ParseBinarySequence),
-        DATA_TYPE("[f]", 4, &ValidationTestInputParser::ParseFloat),
-        DATA_TYPE("[d]", 8, &ValidationTestInputParser::ParseDouble),
-        DATA_TYPE("[dist4]", 4, &ValidationTestInputParser::ParseDistance),
-        DATA_TYPE("[dist8]", 8, &ValidationTestInputParser::ParseDistance),
-        DATA_TYPE("[anchr]", 0, &ValidationTestInputParser::ParseAnchor),
-        DATA_TYPE("[handles]", 0, &ValidationTestInputParser::ParseHandles)};
-
-const size_t ValidationTestInputParser::kDataTypeCount =
-    sizeof(ValidationTestInputParser::kDataTypes) /
-    sizeof(ValidationTestInputParser::kDataTypes[0]);
-
-ValidationTestInputParser::ValidationTestInputParser(const std::string& input,
-                                                     std::vector<uint8_t>* data,
-                                                     size_t* num_handles,
-                                                     std::string* error_message)
-    : input_(input),
-      input_cursor_(0),
-      data_(data),
-      num_handles_(num_handles),
-      error_message_(error_message) {
-  assert(data_);
-  assert(num_handles_);
-  assert(error_message_);
-  data_->clear();
-  *num_handles_ = 0;
-  error_message_->clear();
-}
-
-ValidationTestInputParser::~ValidationTestInputParser() {
-}
-
-bool ValidationTestInputParser::Run() {
-  Range range;
-  bool result = true;
-  while (result && GetNextItem(&range))
-    result = ParseItem(range);
-
-  if (!result) {
-    *error_message_ =
-        "Error occurred when parsing " + std::string(range.first, range.second);
-  } else if (!pending_distance_items_.empty()) {
-    // We have parsed all the contents in |input_| successfully, but there are
-    // unmatched dist4/8 items.
-    *error_message_ = "Error occurred when matching [dist4/8] and [anchr].";
-    result = false;
-  }
-  if (!result) {
-    data_->clear();
-    *num_handles_ = 0;
-  } else {
-    assert(error_message_->empty());
-  }
-
-  return result;
-}
-
-bool ValidationTestInputParser::GetNextItem(Range* range) {
-  const char kWhitespaceChars[] = " \t\n\r";
-  const char kItemDelimiters[] = " \t\n\r/";
-  const char kEndOfLineChars[] = "\n\r";
-  while (true) {
-    // Skip leading whitespaces.
-    // If there are no non-whitespace characters left, |input_cursor_| will be
-    // set to std::npos.
-    input_cursor_ = input_.find_first_not_of(kWhitespaceChars, input_cursor_);
-
-    if (input_cursor_ >= input_.size())
-      return false;
-
-    if (StartsWith(
-            Range(&input_[0] + input_cursor_, &input_[0] + input_.size()),
-            "//",
-            2)) {
-      // Skip contents until the end of the line.
-      input_cursor_ = input_.find_first_of(kEndOfLineChars, input_cursor_);
-    } else {
-      range->first = &input_[0] + input_cursor_;
-      input_cursor_ = input_.find_first_of(kItemDelimiters, input_cursor_);
-      range->second = input_cursor_ >= input_.size()
-                          ? &input_[0] + input_.size()
-                          : &input_[0] + input_cursor_;
-      return true;
-    }
-  }
-  return false;
-}
-
-bool ValidationTestInputParser::ParseItem(const Range& range) {
-  for (size_t i = 0; i < kDataTypeCount; ++i) {
-    if (StartsWith(range, kDataTypes[i].name, kDataTypes[i].name_size)) {
-      return (this->*kDataTypes[i].parse_data_func)(
-          kDataTypes[i],
-          std::string(range.first + kDataTypes[i].name_size, range.second));
-    }
-  }
-
-  // "[u1]" is optional.
-  return ParseUnsignedInteger(kDataTypes[0],
-                              std::string(range.first, range.second));
-}
-
-bool ValidationTestInputParser::ParseUnsignedInteger(
-    const DataType& type,
-    const std::string& value_string) {
-  unsigned long long int value;
-  if (!ConvertToUnsignedInteger(value_string, &value))
-    return false;
-
-  switch (type.data_size) {
-    case 1:
-      return ConvertAndAppendData<uint8_t>(value);
-    case 2:
-      return ConvertAndAppendData<uint16_t>(value);
-    case 4:
-      return ConvertAndAppendData<uint32_t>(value);
-    case 8:
-      return ConvertAndAppendData<uint64_t>(value);
-    default:
-      assert(false);
-      return false;
-  }
-}
-
-bool ValidationTestInputParser::ParseSignedInteger(
-    const DataType& type,
-    const std::string& value_string) {
-  long long int value;
-  if (sscanf(value_string.c_str(), "%lli", &value) != 1)
-    return false;
-
-  switch (type.data_size) {
-    case 1:
-      return ConvertAndAppendData<int8_t>(value);
-    case 2:
-      return ConvertAndAppendData<int16_t>(value);
-    case 4:
-      return ConvertAndAppendData<int32_t>(value);
-    case 8:
-      return ConvertAndAppendData<int64_t>(value);
-    default:
-      assert(false);
-      return false;
-  }
-}
-
-bool ValidationTestInputParser::ParseFloat(const DataType& type,
-                                           const std::string& value_string) {
-  static_assert(sizeof(float) == 4, "sizeof(float) is not 4");
-
-  float value;
-  if (sscanf(value_string.c_str(), "%f", &value) != 1)
-    return false;
-
-  AppendData(value);
-  return true;
-}
-
-bool ValidationTestInputParser::ParseDouble(const DataType& type,
-                                            const std::string& value_string) {
-  static_assert(sizeof(double) == 8, "sizeof(double) is not 8");
-
-  double value;
-  if (sscanf(value_string.c_str(), "%lf", &value) != 1)
-    return false;
-
-  AppendData(value);
-  return true;
-}
-
-bool ValidationTestInputParser::ParseBinarySequence(
-    const DataType& type,
-    const std::string& value_string) {
-  if (value_string.size() != 8)
-    return false;
-
-  uint8_t value = 0;
-  for (std::string::const_iterator iter = value_string.begin();
-       iter != value_string.end();
-       ++iter) {
-    value <<= 1;
-    if (*iter == '1')
-      value++;
-    else if (*iter != '0')
-      return false;
-  }
-  AppendData(value);
-  return true;
-}
-
-bool ValidationTestInputParser::ParseDistance(const DataType& type,
-                                              const std::string& value_string) {
-  if (pending_distance_items_.find(value_string) !=
-      pending_distance_items_.end())
-    return false;
-
-  PendingDistanceItem item = {data_->size(), type.data_size};
-  data_->resize(data_->size() + type.data_size);
-  pending_distance_items_[value_string] = item;
-
-  return true;
-}
-
-bool ValidationTestInputParser::ParseAnchor(const DataType& type,
-                                            const std::string& value_string) {
-  if (anchors_.find(value_string) != anchors_.end())
-    return false;
-  anchors_.insert(value_string);
-
-  std::map<std::string, PendingDistanceItem>::iterator iter =
-      pending_distance_items_.find(value_string);
-  if (iter == pending_distance_items_.end())
-    return false;
-
-  PendingDistanceItem dist_item = iter->second;
-  pending_distance_items_.erase(iter);
-
-  size_t distance = data_->size() - dist_item.pos;
-  switch (dist_item.data_size) {
-    case 4:
-      return ConvertAndFillData<uint32_t>(dist_item.pos, distance);
-    case 8:
-      return ConvertAndFillData<uint64_t>(dist_item.pos, distance);
-    default:
-      assert(false);
-      return false;
-  }
-}
-
-bool ValidationTestInputParser::ParseHandles(const DataType& type,
-                                             const std::string& value_string) {
-  // It should be the first item.
-  if (!data_->empty())
-    return false;
-
-  unsigned long long int value;
-  if (!ConvertToUnsignedInteger(value_string, &value))
-    return false;
-
-  if (value > std::numeric_limits<size_t>::max())
-    return false;
-
-  *num_handles_ = static_cast<size_t>(value);
-  return true;
-}
-
-bool ValidationTestInputParser::StartsWith(const Range& range,
-                                           const char* prefix,
-                                           size_t prefix_length) {
-  if (static_cast<size_t>(range.second - range.first) < prefix_length)
-    return false;
-
-  return memcmp(range.first, prefix, prefix_length) == 0;
-}
-
-bool ValidationTestInputParser::ConvertToUnsignedInteger(
-    const std::string& value_string,
-    unsigned long long int* value) {
-  const char* format = nullptr;
-  if (value_string.find_first_of("xX") != std::string::npos)
-    format = "%llx";
-  else
-    format = "%llu";
-  return sscanf(value_string.c_str(), format, value) == 1;
-}
-
-}  // namespace
-
-bool ParseValidationTestInput(const std::string& input,
-                              std::vector<uint8_t>* data,
-                              size_t* num_handles,
-                              std::string* error_message) {
-  ValidationTestInputParser parser(input, data, num_handles, error_message);
-  return parser.Run();
-}
-
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/validation_test_input_parser.h b/mojo/public/cpp/bindings/tests/validation_test_input_parser.h
deleted file mode 100644
index d08f359..0000000
--- a/mojo/public/cpp/bindings/tests/validation_test_input_parser.h
+++ /dev/null
@@ -1,121 +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 MOJO_PUBLIC_CPP_BINDINGS_TESTS_VALIDATION_TEST_INPUT_PARSER_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_TESTS_VALIDATION_TEST_INPUT_PARSER_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <string>
-#include <vector>
-
-namespace mojo {
-namespace test {
-
-// Input Format of Mojo Message Validation Tests.
-//
-// Data items are separated by whitespaces:
-//   - ' ' (0x20) space;
-//   - '\t' (0x09) horizontal tab;
-//   - '\n' (0x0a) newline;
-//   - '\r' (0x0d) carriage return.
-// A comment starts with //, extending to the end of the line.
-// Each data item is of the format [<type>]<value>. The types defined and the
-// corresponding value formats are described below.
-//
-// Type: u1 / u2 / u4 / u8
-// Description: Little-endian 1/2/4/8-byte unsigned integer.
-// Value Format:
-//   - Decimal integer: 0|[1-9][0-9]*
-//   - Hexadecimal integer: 0[xX][0-9a-fA-F]+
-//   - The type prefix (including the square brackets) of 1-byte unsigned
-//   integer is optional.
-//
-// Type: s1 / s2 / s4 / s8
-// Description: Little-endian 1/2/4/8-byte signed integer.
-// Value Format:
-//   - Decimal integer: [-+]?(0|[1-9][0-9]*)
-//   - Hexadecimal integer: [-+]?0[xX][0-9a-fA-F]+
-//
-// Type: b
-// Description: Binary sequence of 1 byte.
-// Value Format: [01]{8}
-//
-// Type: f / d
-// Description: Little-endian IEEE-754 format of float (4 bytes) and double (8
-// bytes).
-// Value Format: [-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?
-//
-// Type: dist4 / dist8
-// Description: Little-endian 4/8-byte unsigned integer. The actual value is set
-// to the byte distance from the location of this integer to the location of the
-// anchr item with the same ID. A dist8 and anchr pair can be used to easily
-// represent an encoded pointer. A dist4 and anchr pair can be used to easily
-// calculate struct/array size.
-// Value Format: The value is an ID: [0-9a-zA-Z_]+
-//
-// Type: anchr
-// Description: Mark an anchor location. It doesn’t translate into any actual
-// data.
-// Value Format: The value is an ID of the same format as that of dist4/8.
-//
-// Type: handles
-// Description: The number of handles that are associated with the message. This
-// special item is not part of the message data. If specified, it should be the
-// first item.
-// Value Format: The same format as u1/2/4/8.
-//
-// EXAMPLE:
-//
-// Suppose you have the following Mojo types defined:
-//   struct Bar {
-//     int32_t a;
-//     bool b;
-//     bool c;
-//   };
-//   struct Foo {
-//     Bar x;
-//     uint32_t y;
-//   };
-//
-// The following describes a valid message whose payload is a Foo struct:
-//   // message header
-//   [dist4]message_header   // num_bytes
-//   [u4]3                   // version
-//   [u4]0                   // type
-//   [u4]1                   // flags
-//   [u8]1234                // request_id
-//   [anchr]message_header
-//
-//   // payload
-//   [dist4]foo      // num_bytes
-//   [u4]2           // version
-//   [dist8]bar_ptr  // x
-//   [u4]0xABCD      // y
-//   [u4]0           // padding
-//   [anchr]foo
-//
-//   [anchr]bar_ptr
-//   [dist4]bar   // num_bytes
-//   [u4]3        // version
-//   [s4]-1       // a
-//   [b]00000010  // b and c
-//   0 0 0        // padding
-//   [anchr]bar
-
-// Parses validation test input.
-// On success, |data| and |num_handles| store the parsing result,
-// |error_message| is cleared; on failure, |error_message| is set to a message
-// describing the error, |data| is cleared and |num_handles| set to 0.
-// Note: For now, this method only works on little-endian platforms.
-bool ParseValidationTestInput(const std::string& input,
-                              std::vector<uint8_t>* data,
-                              size_t* num_handles,
-                              std::string* error_message);
-
-}  // namespace test
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_TESTS_VALIDATION_TEST_INPUT_PARSER_H_
diff --git a/mojo/public/cpp/bindings/tests/validation_unittest.cc b/mojo/public/cpp/bindings/tests/validation_unittest.cc
deleted file mode 100644
index 7af7396..0000000
--- a/mojo/public/cpp/bindings/tests/validation_unittest.cc
+++ /dev/null
@@ -1,498 +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 <stddef.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <algorithm>
-#include <string>
-#include <utility>
-#include <vector>
-
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "mojo/public/c/system/macros.h"
-#include "mojo/public/cpp/bindings/binding.h"
-#include "mojo/public/cpp/bindings/connector.h"
-#include "mojo/public/cpp/bindings/filter_chain.h"
-#include "mojo/public/cpp/bindings/interface_ptr.h"
-#include "mojo/public/cpp/bindings/lib/validation_errors.h"
-#include "mojo/public/cpp/bindings/message.h"
-#include "mojo/public/cpp/bindings/message_header_validator.h"
-#include "mojo/public/cpp/bindings/tests/validation_test_input_parser.h"
-#include "mojo/public/cpp/system/core.h"
-#include "mojo/public/cpp/test_support/test_support.h"
-#include "mojo/public/interfaces/bindings/tests/validation_test_associated_interfaces.mojom.h"
-#include "mojo/public/interfaces/bindings/tests/validation_test_interfaces.mojom.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace test {
-namespace {
-
-template <typename T>
-void Append(std::vector<uint8_t>* data_vector, T data) {
-  size_t pos = data_vector->size();
-  data_vector->resize(pos + sizeof(T));
-  memcpy(&(*data_vector)[pos], &data, sizeof(T));
-}
-
-bool TestInputParser(const std::string& input,
-                     bool expected_result,
-                     const std::vector<uint8_t>& expected_data,
-                     size_t expected_num_handles) {
-  std::vector<uint8_t> data;
-  size_t num_handles;
-  std::string error_message;
-
-  bool result =
-      ParseValidationTestInput(input, &data, &num_handles, &error_message);
-  if (expected_result) {
-    if (result && error_message.empty() && expected_data == data &&
-        expected_num_handles == num_handles) {
-      return true;
-    }
-
-    // Compare with an empty string instead of checking |error_message.empty()|,
-    // so that the message will be printed out if the two are not equal.
-    EXPECT_EQ(std::string(), error_message);
-    EXPECT_EQ(expected_data, data);
-    EXPECT_EQ(expected_num_handles, num_handles);
-    return false;
-  }
-
-  EXPECT_FALSE(error_message.empty());
-  return !result && !error_message.empty();
-}
-
-std::vector<std::string> GetMatchingTests(const std::vector<std::string>& names,
-                                          const std::string& prefix) {
-  const std::string suffix = ".data";
-  std::vector<std::string> tests;
-  for (size_t i = 0; i < names.size(); ++i) {
-    if (names[i].size() >= suffix.size() &&
-        names[i].substr(0, prefix.size()) == prefix &&
-        names[i].substr(names[i].size() - suffix.size()) == suffix)
-      tests.push_back(names[i].substr(0, names[i].size() - suffix.size()));
-  }
-  return tests;
-}
-
-bool ReadFile(const std::string& path, std::string* result) {
-  FILE* fp = OpenSourceRootRelativeFile(path.c_str());
-  if (!fp) {
-    ADD_FAILURE() << "File not found: " << path;
-    return false;
-  }
-  fseek(fp, 0, SEEK_END);
-  size_t size = static_cast<size_t>(ftell(fp));
-  if (size == 0) {
-    result->clear();
-    fclose(fp);
-    return true;
-  }
-  fseek(fp, 0, SEEK_SET);
-  result->resize(size);
-  size_t size_read = fread(&result->at(0), 1, size, fp);
-  fclose(fp);
-  return size == size_read;
-}
-
-bool ReadAndParseDataFile(const std::string& path,
-                          std::vector<uint8_t>* data,
-                          size_t* num_handles) {
-  std::string input;
-  if (!ReadFile(path, &input))
-    return false;
-
-  std::string error_message;
-  if (!ParseValidationTestInput(input, data, num_handles, &error_message)) {
-    ADD_FAILURE() << error_message;
-    return false;
-  }
-
-  return true;
-}
-
-bool ReadResultFile(const std::string& path, std::string* result) {
-  if (!ReadFile(path, result))
-    return false;
-
-  // Result files are new-line delimited text files. Remove any CRs.
-  result->erase(std::remove(result->begin(), result->end(), '\r'),
-                result->end());
-
-  // Remove trailing LFs.
-  size_t pos = result->find_last_not_of('\n');
-  if (pos == std::string::npos)
-    result->clear();
-  else
-    result->resize(pos + 1);
-
-  return true;
-}
-
-std::string GetPath(const std::string& root, const std::string& suffix) {
-  return "mojo/public/interfaces/bindings/tests/data/validation/" + root +
-         suffix;
-}
-
-// |message| should be a newly created object.
-bool ReadTestCase(const std::string& test,
-                  Message* message,
-                  std::string* expected) {
-  std::vector<uint8_t> data;
-  size_t num_handles;
-  if (!ReadAndParseDataFile(GetPath(test, ".data"), &data, &num_handles) ||
-      !ReadResultFile(GetPath(test, ".expected"), expected)) {
-    return false;
-  }
-
-  message->Initialize(static_cast<uint32_t>(data.size()),
-                      false /* zero_initialized */);
-  if (!data.empty())
-    memcpy(message->mutable_data(), &data[0], data.size());
-  message->mutable_handles()->resize(num_handles);
-
-  return true;
-}
-
-void RunValidationTests(const std::string& prefix,
-                        MessageReceiver* test_message_receiver) {
-  std::vector<std::string> names =
-      EnumerateSourceRootRelativeDirectory(GetPath("", ""));
-  std::vector<std::string> tests = GetMatchingTests(names, prefix);
-  ASSERT_FALSE(tests.empty());
-
-  for (size_t i = 0; i < tests.size(); ++i) {
-    Message message;
-    std::string expected;
-    ASSERT_TRUE(ReadTestCase(tests[i], &message, &expected));
-
-    std::string result;
-    base::RunLoop run_loop;
-    mojo::internal::ValidationErrorObserverForTesting observer(
-        run_loop.QuitClosure());
-    ignore_result(test_message_receiver->Accept(&message));
-    if (expected != "PASS")  // Observer only gets called on errors.
-      run_loop.Run();
-    if (observer.last_error() == mojo::internal::VALIDATION_ERROR_NONE)
-      result = "PASS";
-    else
-      result = mojo::internal::ValidationErrorToString(observer.last_error());
-
-    EXPECT_EQ(expected, result) << "failed test: " << tests[i];
-  }
-}
-
-class DummyMessageReceiver : public MessageReceiver {
- public:
-  bool Accept(Message* message) override {
-    return true;  // Any message is OK.
-  }
-};
-
-class ValidationTest : public testing::Test {
- public:
-  ValidationTest() {}
-
- protected:
-  base::MessageLoop loop_;
-};
-
-class ValidationIntegrationTest : public ValidationTest {
- public:
-  ValidationIntegrationTest() : test_message_receiver_(nullptr) {}
-
-  ~ValidationIntegrationTest() override {}
-
-  void SetUp() override {
-    ScopedMessagePipeHandle tester_endpoint;
-    ASSERT_EQ(MOJO_RESULT_OK,
-              CreateMessagePipe(nullptr, &tester_endpoint, &testee_endpoint_));
-    test_message_receiver_ =
-        new TestMessageReceiver(this, std::move(tester_endpoint));
-  }
-
-  void TearDown() override {
-    delete test_message_receiver_;
-    test_message_receiver_ = nullptr;
-
-    // Make sure that the other end receives the OnConnectionError()
-    // notification.
-    PumpMessages();
-  }
-
-  MessageReceiver* test_message_receiver() { return test_message_receiver_; }
-
-  ScopedMessagePipeHandle testee_endpoint() {
-    return std::move(testee_endpoint_);
-  }
-
- private:
-  class TestMessageReceiver : public MessageReceiver {
-   public:
-    TestMessageReceiver(ValidationIntegrationTest* owner,
-                        ScopedMessagePipeHandle handle)
-        : owner_(owner),
-          connector_(std::move(handle),
-                     mojo::Connector::SINGLE_THREADED_SEND,
-                     base::ThreadTaskRunnerHandle::Get()) {
-      connector_.set_enforce_errors_from_incoming_receiver(false);
-    }
-    ~TestMessageReceiver() override {}
-
-    bool Accept(Message* message) override {
-      return connector_.Accept(message);
-    }
-
-   public:
-    ValidationIntegrationTest* owner_;
-    mojo::Connector connector_;
-  };
-
-  void PumpMessages() { base::RunLoop().RunUntilIdle(); }
-
-  TestMessageReceiver* test_message_receiver_;
-  ScopedMessagePipeHandle testee_endpoint_;
-};
-
-class IntegrationTestInterfaceImpl : public IntegrationTestInterface {
- public:
-  ~IntegrationTestInterfaceImpl() override {}
-
-  void Method0(BasicStructPtr param0,
-               const Method0Callback& callback) override {
-    callback.Run(std::vector<uint8_t>());
-  }
-};
-
-TEST_F(ValidationTest, InputParser) {
-  {
-    // The parser, as well as Append() defined above, assumes that this code is
-    // running on a little-endian platform. Test whether that is true.
-    uint16_t x = 1;
-    ASSERT_EQ(1, *(reinterpret_cast<char*>(&x)));
-  }
-  {
-    // Test empty input.
-    std::string input;
-    std::vector<uint8_t> expected;
-
-    EXPECT_TRUE(TestInputParser(input, true, expected, 0));
-  }
-  {
-    // Test input that only consists of comments and whitespaces.
-    std::string input = "    \t  // hello world \n\r \t// the answer is 42   ";
-    std::vector<uint8_t> expected;
-
-    EXPECT_TRUE(TestInputParser(input, true, expected, 0));
-  }
-  {
-    std::string input =
-        "[u1]0x10// hello world !! \n\r  \t [u2]65535 \n"
-        "[u4]65536 [u8]0xFFFFFFFFFFFFFFFF 0 0Xff";
-    std::vector<uint8_t> expected;
-    Append(&expected, static_cast<uint8_t>(0x10));
-    Append(&expected, static_cast<uint16_t>(65535));
-    Append(&expected, static_cast<uint32_t>(65536));
-    Append(&expected, static_cast<uint64_t>(0xffffffffffffffff));
-    Append(&expected, static_cast<uint8_t>(0));
-    Append(&expected, static_cast<uint8_t>(0xff));
-
-    EXPECT_TRUE(TestInputParser(input, true, expected, 0));
-  }
-  {
-    std::string input = "[s8]-0x800 [s1]-128\t[s2]+0 [s4]-40";
-    std::vector<uint8_t> expected;
-    Append(&expected, -static_cast<int64_t>(0x800));
-    Append(&expected, static_cast<int8_t>(-128));
-    Append(&expected, static_cast<int16_t>(0));
-    Append(&expected, static_cast<int32_t>(-40));
-
-    EXPECT_TRUE(TestInputParser(input, true, expected, 0));
-  }
-  {
-    std::string input = "[b]00001011 [b]10000000  // hello world\r [b]00000000";
-    std::vector<uint8_t> expected;
-    Append(&expected, static_cast<uint8_t>(11));
-    Append(&expected, static_cast<uint8_t>(128));
-    Append(&expected, static_cast<uint8_t>(0));
-
-    EXPECT_TRUE(TestInputParser(input, true, expected, 0));
-  }
-  {
-    std::string input = "[f]+.3e9 [d]-10.03";
-    std::vector<uint8_t> expected;
-    Append(&expected, +.3e9f);
-    Append(&expected, -10.03);
-
-    EXPECT_TRUE(TestInputParser(input, true, expected, 0));
-  }
-  {
-    std::string input = "[dist4]foo 0 [dist8]bar 0 [anchr]foo [anchr]bar";
-    std::vector<uint8_t> expected;
-    Append(&expected, static_cast<uint32_t>(14));
-    Append(&expected, static_cast<uint8_t>(0));
-    Append(&expected, static_cast<uint64_t>(9));
-    Append(&expected, static_cast<uint8_t>(0));
-
-    EXPECT_TRUE(TestInputParser(input, true, expected, 0));
-  }
-  {
-    std::string input = "// This message has handles! \n[handles]50 [u8]2";
-    std::vector<uint8_t> expected;
-    Append(&expected, static_cast<uint64_t>(2));
-
-    EXPECT_TRUE(TestInputParser(input, true, expected, 50));
-  }
-
-  // Test some failure cases.
-  {
-    const char* error_inputs[] = {"/ hello world",
-                                  "[u1]x",
-                                  "[u2]-1000",
-                                  "[u1]0x100",
-                                  "[s2]-0x8001",
-                                  "[b]1",
-                                  "[b]1111111k",
-                                  "[dist4]unmatched",
-                                  "[anchr]hello [dist8]hello",
-                                  "[dist4]a [dist4]a [anchr]a",
-                                  "[dist4]a [anchr]a [dist4]a [anchr]a",
-                                  "0 [handles]50",
-                                  nullptr};
-
-    for (size_t i = 0; error_inputs[i]; ++i) {
-      std::vector<uint8_t> expected;
-      if (!TestInputParser(error_inputs[i], false, expected, 0))
-        ADD_FAILURE() << "Unexpected test result for: " << error_inputs[i];
-    }
-  }
-}
-
-TEST_F(ValidationTest, Conformance) {
-  DummyMessageReceiver dummy_receiver;
-  mojo::FilterChain validators(&dummy_receiver);
-  validators.Append<mojo::MessageHeaderValidator>();
-  validators.Append<ConformanceTestInterface::RequestValidator_>();
-
-  RunValidationTests("conformance_", &validators);
-}
-
-TEST_F(ValidationTest, AssociatedConformace) {
-  DummyMessageReceiver dummy_receiver;
-  mojo::FilterChain validators(&dummy_receiver);
-  validators.Append<mojo::MessageHeaderValidator>();
-  validators.Append<AssociatedConformanceTestInterface::RequestValidator_>();
-
-  RunValidationTests("associated_conformance_", &validators);
-}
-
-// This test is similar to Conformance test but its goal is specifically
-// do bounds-check testing of message validation. For example we test the
-// detection of off-by-one errors in method ordinals.
-TEST_F(ValidationTest, BoundsCheck) {
-  DummyMessageReceiver dummy_receiver;
-  mojo::FilterChain validators(&dummy_receiver);
-  validators.Append<mojo::MessageHeaderValidator>();
-  validators.Append<BoundsCheckTestInterface::RequestValidator_>();
-
-  RunValidationTests("boundscheck_", &validators);
-}
-
-// This test is similar to the Conformance test but for responses.
-TEST_F(ValidationTest, ResponseConformance) {
-  DummyMessageReceiver dummy_receiver;
-  mojo::FilterChain validators(&dummy_receiver);
-  validators.Append<mojo::MessageHeaderValidator>();
-  validators.Append<ConformanceTestInterface::ResponseValidator_>();
-
-  RunValidationTests("resp_conformance_", &validators);
-}
-
-// This test is similar to the BoundsCheck test but for responses.
-TEST_F(ValidationTest, ResponseBoundsCheck) {
-  DummyMessageReceiver dummy_receiver;
-  mojo::FilterChain validators(&dummy_receiver);
-  validators.Append<mojo::MessageHeaderValidator>();
-  validators.Append<BoundsCheckTestInterface::ResponseValidator_>();
-
-  RunValidationTests("resp_boundscheck_", &validators);
-}
-
-// Test that InterfacePtr<X> applies the correct validators and they don't
-// conflict with each other:
-//   - MessageHeaderValidator
-//   - X::ResponseValidator_
-TEST_F(ValidationIntegrationTest, InterfacePtr) {
-  IntegrationTestInterfacePtr interface_ptr = MakeProxy(
-      InterfacePtrInfo<IntegrationTestInterface>(testee_endpoint(), 0u));
-  interface_ptr.internal_state()->EnableTestingMode();
-
-  RunValidationTests("integration_intf_resp", test_message_receiver());
-  RunValidationTests("integration_msghdr", test_message_receiver());
-}
-
-// Test that Binding<X> applies the correct validators and they don't
-// conflict with each other:
-//   - MessageHeaderValidator
-//   - X::RequestValidator_
-TEST_F(ValidationIntegrationTest, Binding) {
-  IntegrationTestInterfaceImpl interface_impl;
-  Binding<IntegrationTestInterface> binding(
-      &interface_impl,
-      MakeRequest<IntegrationTestInterface>(testee_endpoint()));
-  binding.EnableTestingMode();
-
-  RunValidationTests("integration_intf_rqst", test_message_receiver());
-  RunValidationTests("integration_msghdr", test_message_receiver());
-}
-
-// Test pointer validation (specifically, that the encoded offset is 32-bit)
-TEST_F(ValidationTest, ValidateEncodedPointer) {
-  uint64_t offset;
-
-  offset = 0ULL;
-  EXPECT_TRUE(mojo::internal::ValidateEncodedPointer(&offset));
-
-  offset = 1ULL;
-  EXPECT_TRUE(mojo::internal::ValidateEncodedPointer(&offset));
-
-  // offset must be <= 32-bit.
-  offset = std::numeric_limits<uint32_t>::max() + 1ULL;
-  EXPECT_FALSE(mojo::internal::ValidateEncodedPointer(&offset));
-}
-
-// Tests the IsKnownEnumValue() function generated for BasicEnum.
-TEST(EnumValueValidationTest, BasicEnum) {
-  // BasicEnum can have -3,0,1,10 as possible integral values.
-  EXPECT_FALSE(IsKnownEnumValue(static_cast<BasicEnum>(-4)));
-  EXPECT_TRUE(IsKnownEnumValue(static_cast<BasicEnum>(-3)));
-  EXPECT_FALSE(IsKnownEnumValue(static_cast<BasicEnum>(-2)));
-  EXPECT_FALSE(IsKnownEnumValue(static_cast<BasicEnum>(-1)));
-  EXPECT_TRUE(IsKnownEnumValue(static_cast<BasicEnum>(0)));
-  EXPECT_TRUE(IsKnownEnumValue(static_cast<BasicEnum>(1)));
-  EXPECT_FALSE(IsKnownEnumValue(static_cast<BasicEnum>(2)));
-  EXPECT_FALSE(IsKnownEnumValue(static_cast<BasicEnum>(9)));
-  // In the mojom, we represent this value as hex (0xa).
-  EXPECT_TRUE(IsKnownEnumValue(static_cast<BasicEnum>(10)));
-  EXPECT_FALSE(IsKnownEnumValue(static_cast<BasicEnum>(11)));
-}
-
-// Tests the IsKnownEnumValue() method generated for StructWithEnum.
-TEST(EnumValueValidationTest, EnumWithin) {
-  // StructWithEnum::EnumWithin can have [0,4] as possible integral values.
-  EXPECT_FALSE(IsKnownEnumValue(static_cast<StructWithEnum::EnumWithin>(-1)));
-  EXPECT_TRUE(IsKnownEnumValue(static_cast<StructWithEnum::EnumWithin>(0)));
-  EXPECT_TRUE(IsKnownEnumValue(static_cast<StructWithEnum::EnumWithin>(1)));
-  EXPECT_TRUE(IsKnownEnumValue(static_cast<StructWithEnum::EnumWithin>(2)));
-  EXPECT_TRUE(IsKnownEnumValue(static_cast<StructWithEnum::EnumWithin>(3)));
-  EXPECT_FALSE(IsKnownEnumValue(static_cast<StructWithEnum::EnumWithin>(4)));
-}
-
-}  // namespace
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/variant_test_util.h b/mojo/public/cpp/bindings/tests/variant_test_util.h
deleted file mode 100644
index 3f6b1f1..0000000
--- a/mojo/public/cpp/bindings/tests/variant_test_util.h
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_TESTS_VARIANT_TEST_UTIL_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_TESTS_VARIANT_TEST_UTIL_H_
-
-#include <string.h>
-
-#include "base/logging.h"
-#include "mojo/public/cpp/bindings/interface_request.h"
-
-namespace mojo {
-namespace test {
-
-// Converts a request of Interface1 to a request of Interface0. Interface0 and
-// Interface1 are expected to be two variants of the same mojom interface.
-// In real-world use cases, users shouldn't need to worry about this. Because it
-// is rare to deal with two variants of the same interface in the same app.
-template <typename Interface0, typename Interface1>
-InterfaceRequest<Interface0> ConvertInterfaceRequest(
-    InterfaceRequest<Interface1> request) {
-  DCHECK_EQ(0, strcmp(Interface0::Name_, Interface1::Name_));
-  InterfaceRequest<Interface0> result;
-  result.Bind(request.PassMessagePipe());
-  return result;
-}
-
-}  // namespace test
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_TESTS_VARIANT_TEST_UTIL_H_
diff --git a/mojo/public/cpp/bindings/tests/versioning_apptest.cc b/mojo/public/cpp/bindings/tests/versioning_apptest.cc
deleted file mode 100644
index 95a89c0..0000000
--- a/mojo/public/cpp/bindings/tests/versioning_apptest.cc
+++ /dev/null
@@ -1,123 +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 <stddef.h>
-#include <stdint.h>
-
-#include "base/macros.h"
-#include "mojo/public/interfaces/bindings/tests/versioning_test_client.mojom.h"
-#include "services/service_manager/public/cpp/application_test_base.h"
-#include "services/service_manager/public/cpp/connector.h"
-
-namespace mojo {
-namespace test {
-namespace versioning {
-
-class VersioningApplicationTest : public ApplicationTestBase {
- public:
-  VersioningApplicationTest() : ApplicationTestBase() {}
-  ~VersioningApplicationTest() override {}
-
- protected:
-  // ApplicationTestBase overrides.
-  void SetUp() override {
-    ApplicationTestBase::SetUp();
-
-    connector()->BindInterface("versioning_test_service", &database_);
-  }
-
-  HumanResourceDatabasePtr database_;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(VersioningApplicationTest);
-};
-
-TEST_F(VersioningApplicationTest, Struct) {
-  // The service side uses a newer version of Employee defintion.
-  // The returned struct should be truncated.
-  EmployeePtr employee(Employee::New());
-  employee->employee_id = 1;
-  employee->name = "Homer Simpson";
-  employee->department = DEPARTMENT_DEV;
-
-  database_->QueryEmployee(1, true,
-                           [&employee](EmployeePtr returned_employee,
-                                       Array<uint8_t> returned_finger_print) {
-                             EXPECT_TRUE(employee->Equals(*returned_employee));
-                             EXPECT_FALSE(returned_finger_print.is_null());
-                           });
-  database_.WaitForIncomingResponse();
-
-  // Passing a struct of older version to the service side works.
-  EmployeePtr new_employee(Employee::New());
-  new_employee->employee_id = 2;
-  new_employee->name = "Marge Simpson";
-  new_employee->department = DEPARTMENT_SALES;
-
-  database_->AddEmployee(new_employee.Clone(),
-                         [](bool success) { EXPECT_TRUE(success); });
-  database_.WaitForIncomingResponse();
-
-  database_->QueryEmployee(
-      2, false, [&new_employee](EmployeePtr returned_employee,
-                                Array<uint8_t> returned_finger_print) {
-        EXPECT_TRUE(new_employee->Equals(*returned_employee));
-        EXPECT_TRUE(returned_finger_print.is_null());
-      });
-  database_.WaitForIncomingResponse();
-}
-
-TEST_F(VersioningApplicationTest, QueryVersion) {
-  EXPECT_EQ(0u, database_.version());
-  database_.QueryVersion([](uint32_t version) { EXPECT_EQ(1u, version); });
-  database_.WaitForIncomingResponse();
-  EXPECT_EQ(1u, database_.version());
-}
-
-TEST_F(VersioningApplicationTest, RequireVersion) {
-  EXPECT_EQ(0u, database_.version());
-
-  database_.RequireVersion(1);
-  EXPECT_EQ(1u, database_.version());
-  database_->QueryEmployee(3, false,
-                           [](EmployeePtr returned_employee,
-                              Array<uint8_t> returned_finger_print) {});
-  database_.WaitForIncomingResponse();
-  EXPECT_FALSE(database_.encountered_error());
-
-  // Requiring a version higher than what the service side implements will close
-  // the pipe.
-  database_.RequireVersion(3);
-  EXPECT_EQ(3u, database_.version());
-  database_->QueryEmployee(1, false,
-                           [](EmployeePtr returned_employee,
-                              Array<uint8_t> returned_finger_print) {});
-  database_.WaitForIncomingResponse();
-  EXPECT_TRUE(database_.encountered_error());
-}
-
-TEST_F(VersioningApplicationTest, CallNonexistentMethod) {
-  EXPECT_EQ(0u, database_.version());
-
-  Array<uint8_t> new_finger_print(128);
-  for (size_t i = 0; i < 128; ++i)
-    new_finger_print[i] = i + 13;
-
-  // Although the client side doesn't know whether the service side supports
-  // version 1, calling a version 1 method succeeds as long as the service side
-  // supports version 1.
-  database_->AttachFingerPrint(1, new_finger_print.Clone(),
-                               [](bool success) { EXPECT_TRUE(success); });
-  database_.WaitForIncomingResponse();
-
-  // Calling a version 2 method (which the service side doesn't support) closes
-  // the pipe.
-  database_->ListEmployeeIds([](Array<uint64_t> ids) { EXPECT_TRUE(false); });
-  database_.WaitForIncomingResponse();
-  EXPECT_TRUE(database_.encountered_error());
-}
-
-}  // namespace versioning
-}  // namespace examples
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/versioning_test_service.cc b/mojo/public/cpp/bindings/tests/versioning_test_service.cc
deleted file mode 100644
index 313a624..0000000
--- a/mojo/public/cpp/bindings/tests/versioning_test_service.cc
+++ /dev/null
@@ -1,127 +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 <stdint.h>
-
-#include <map>
-#include <utility>
-
-#include "base/macros.h"
-#include "mojo/public/cpp/bindings/strong_binding.h"
-#include "mojo/public/interfaces/bindings/tests/versioning_test_service.mojom.h"
-#include "services/service_manager/public/c/main.h"
-#include "services/service_manager/public/cpp/interface_factory.h"
-#include "services/service_manager/public/cpp/service.h"
-#include "services/service_manager/public/cpp/service_runner.h"
-
-namespace mojo {
-namespace test {
-namespace versioning {
-
-struct EmployeeInfo {
- public:
-  EmployeeInfo() {}
-
-  EmployeePtr employee;
-  Array<uint8_t> finger_print;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(EmployeeInfo);
-};
-
-class HumanResourceDatabaseImpl : public HumanResourceDatabase {
- public:
-  explicit HumanResourceDatabaseImpl(
-      InterfaceRequest<HumanResourceDatabase> request)
-      : strong_binding_(this, std::move(request)) {
-    // Pretend that there is already some data in the system.
-    EmployeeInfo* info = new EmployeeInfo();
-    employees_[1] = info;
-    info->employee = Employee::New();
-    info->employee->employee_id = 1;
-    info->employee->name = "Homer Simpson";
-    info->employee->department = DEPARTMENT_DEV;
-    info->employee->birthday = Date::New();
-    info->employee->birthday->year = 1955;
-    info->employee->birthday->month = 5;
-    info->employee->birthday->day = 12;
-    info->finger_print.resize(1024);
-    for (uint32_t i = 0; i < 1024; ++i)
-      info->finger_print[i] = i;
-  }
-
-  ~HumanResourceDatabaseImpl() override {
-    for (auto iter = employees_.begin(); iter != employees_.end(); ++iter)
-      delete iter->second;
-  }
-
-  void AddEmployee(EmployeePtr employee,
-                   const AddEmployeeCallback& callback) override {
-    uint64_t id = employee->employee_id;
-    if (employees_.find(id) == employees_.end())
-      employees_[id] = new EmployeeInfo();
-    employees_[id]->employee = std::move(employee);
-    callback.Run(true);
-  }
-
-  void QueryEmployee(uint64_t id,
-                     bool retrieve_finger_print,
-                     const QueryEmployeeCallback& callback) override {
-    if (employees_.find(id) == employees_.end()) {
-      callback.Run(nullptr, Array<uint8_t>());
-      return;
-    }
-    callback.Run(employees_[id]->employee.Clone(),
-                 retrieve_finger_print ? employees_[id]->finger_print.Clone()
-                                       : Array<uint8_t>());
-  }
-
-  void AttachFingerPrint(uint64_t id,
-                         Array<uint8_t> finger_print,
-                         const AttachFingerPrintCallback& callback) override {
-    if (employees_.find(id) == employees_.end()) {
-      callback.Run(false);
-      return;
-    }
-    employees_[id]->finger_print = std::move(finger_print);
-    callback.Run(true);
-  }
-
- private:
-  std::map<uint64_t, EmployeeInfo*> employees_;
-
-  StrongBinding<HumanResourceDatabase> strong_binding_;
-};
-
-class HumanResourceSystemServer
-    : public service_manager::Service,
-      public InterfaceFactory<HumanResourceDatabase> {
- public:
-  HumanResourceSystemServer() {}
-
-  // service_manager::Service implementation.
-  bool OnConnect(Connection* connection) override {
-    connection->AddInterface<HumanResourceDatabase>(this);
-    return true;
-  }
-
-  // InterfaceFactory<HumanResourceDatabase> implementation.
-  void Create(Connection* connection,
-              InterfaceRequest<HumanResourceDatabase> request) override {
-    // It will be deleted automatically when the underlying pipe encounters a
-    // connection error.
-    new HumanResourceDatabaseImpl(std::move(request));
-  }
-};
-
-}  // namespace versioning
-}  // namespace test
-}  // namespace mojo
-
-MojoResult ServiceMain(MojoHandle request) {
-  mojo::ServiceRunner runner(
-      new mojo::test::versioning::HumanResourceSystemServer());
-
-  return runner.Run(request);
-}
diff --git a/mojo/public/cpp/bindings/tests/wtf_hash_unittest.cc b/mojo/public/cpp/bindings/tests/wtf_hash_unittest.cc
deleted file mode 100644
index 959d25b..0000000
--- a/mojo/public/cpp/bindings/tests/wtf_hash_unittest.cc
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/bindings/lib/wtf_hash_util.h"
-
-#include "mojo/public/interfaces/bindings/tests/test_structs.mojom-blink.h"
-#include "mojo/public/interfaces/bindings/tests/test_wtf_types.mojom-blink.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/WebKit/Source/wtf/HashFunctions.h"
-
-namespace mojo {
-namespace test {
-namespace {
-
-using WTFHashTest = testing::Test;
-
-TEST_F(WTFHashTest, NestedStruct) {
-  // Just check that this template instantiation compiles.
-  ASSERT_EQ(::mojo::internal::Hash(
-                ::mojo::internal::kHashSeed,
-                blink::SimpleNestedStruct::New(blink::ContainsOther::New(1))),
-            ::mojo::internal::Hash(
-                ::mojo::internal::kHashSeed,
-                blink::SimpleNestedStruct::New(blink::ContainsOther::New(1))));
-}
-
-TEST_F(WTFHashTest, UnmappedNativeStruct) {
-  // Just check that this template instantiation compiles.
-  ASSERT_EQ(::mojo::internal::Hash(::mojo::internal::kHashSeed,
-                                   blink::UnmappedNativeStruct::New()),
-            ::mojo::internal::Hash(::mojo::internal::kHashSeed,
-                                   blink::UnmappedNativeStruct::New()));
-}
-
-TEST_F(WTFHashTest, Enum) {
-  // Just check that this template instantiation compiles.
-
-  // Top-level.
-  ASSERT_EQ(WTF::DefaultHash<blink::TopLevelEnum>::Hash().hash(
-                blink::TopLevelEnum::E0),
-            WTF::DefaultHash<blink::TopLevelEnum>::Hash().hash(
-                blink::TopLevelEnum::E0));
-
-  // Nested in struct.
-  ASSERT_EQ(WTF::DefaultHash<blink::TestWTFStruct::NestedEnum>::Hash().hash(
-                blink::TestWTFStruct::NestedEnum::E0),
-            WTF::DefaultHash<blink::TestWTFStruct::NestedEnum>::Hash().hash(
-                blink::TestWTFStruct::NestedEnum::E0));
-
-  // Nested in interface.
-  ASSERT_EQ(WTF::DefaultHash<blink::TestWTF::NestedEnum>::Hash().hash(
-                blink::TestWTF::NestedEnum::E0),
-            WTF::DefaultHash<blink::TestWTF::NestedEnum>::Hash().hash(
-                blink::TestWTF::NestedEnum::E0));
-}
-
-}  // namespace
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/wtf_map_unittest.cc b/mojo/public/cpp/bindings/tests/wtf_map_unittest.cc
deleted file mode 100644
index dc40143..0000000
--- a/mojo/public/cpp/bindings/tests/wtf_map_unittest.cc
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/bindings/tests/rect_blink.h"
-#include "mojo/public/interfaces/bindings/tests/rect.mojom-blink.h"
-#include "mojo/public/interfaces/bindings/tests/test_structs.mojom-blink.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace test {
-namespace {
-
-TEST(WTFMapTest, StructKey) {
-  WTF::HashMap<blink::RectPtr, int32_t> map;
-  map.insert(blink::Rect::New(1, 2, 3, 4), 123);
-
-  blink::RectPtr key = blink::Rect::New(1, 2, 3, 4);
-  ASSERT_NE(map.end(), map.find(key));
-  ASSERT_EQ(123, map.find(key)->value);
-
-  map.erase(key);
-  ASSERT_EQ(0u, map.size());
-}
-
-TEST(WTFMapTest, TypemappedStructKey) {
-  WTF::HashMap<blink::ContainsHashablePtr, int32_t> map;
-  map.insert(blink::ContainsHashable::New(RectBlink(1, 2, 3, 4)), 123);
-
-  blink::ContainsHashablePtr key =
-      blink::ContainsHashable::New(RectBlink(1, 2, 3, 4));
-  ASSERT_NE(map.end(), map.find(key));
-  ASSERT_EQ(123, map.find(key)->value);
-
-  map.erase(key);
-  ASSERT_EQ(0u, map.size());
-}
-
-}  // namespace
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/wtf_types_unittest.cc b/mojo/public/cpp/bindings/tests/wtf_types_unittest.cc
deleted file mode 100644
index 363ef7c..0000000
--- a/mojo/public/cpp/bindings/tests/wtf_types_unittest.cc
+++ /dev/null
@@ -1,245 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/bind.h"
-#include "base/macros.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "mojo/public/cpp/bindings/binding.h"
-#include "mojo/public/cpp/bindings/lib/fixed_buffer.h"
-#include "mojo/public/cpp/bindings/lib/serialization.h"
-#include "mojo/public/cpp/bindings/lib/wtf_serialization.h"
-#include "mojo/public/cpp/bindings/tests/variant_test_util.h"
-#include "mojo/public/interfaces/bindings/tests/test_wtf_types.mojom-blink.h"
-#include "mojo/public/interfaces/bindings/tests/test_wtf_types.mojom.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/WebKit/Source/wtf/text/StringHash.h"
-
-namespace mojo {
-namespace test {
-namespace {
-
-const char kHelloWorld[] = "hello world";
-
-// Replace the "o"s in "hello world" with "o"s with acute.
-const char kUTF8HelloWorld[] = "hell\xC3\xB3 w\xC3\xB3rld";
-
-class TestWTFImpl : public TestWTF {
- public:
-  explicit TestWTFImpl(TestWTFRequest request)
-      : binding_(this, std::move(request)) {}
-
-  // mojo::test::TestWTF implementation:
-  void EchoString(const base::Optional<std::string>& str,
-                  const EchoStringCallback& callback) override {
-    callback.Run(str);
-  }
-
-  void EchoStringArray(
-      const base::Optional<std::vector<base::Optional<std::string>>>& arr,
-      const EchoStringArrayCallback& callback) override {
-    callback.Run(std::move(arr));
-  }
-
-  void EchoStringMap(
-      const base::Optional<
-          std::unordered_map<std::string, base::Optional<std::string>>>&
-          str_map,
-      const EchoStringMapCallback& callback) override {
-    callback.Run(std::move(str_map));
-  }
-
- private:
-  Binding<TestWTF> binding_;
-};
-
-class WTFTypesTest : public testing::Test {
- public:
-  WTFTypesTest() {}
-
- private:
-  base::MessageLoop loop_;
-};
-
-WTF::Vector<WTF::String> ConstructStringArray() {
-  WTF::Vector<WTF::String> strs(4);
-  // strs[0] is null.
-  // strs[1] is empty.
-  strs[1] = "";
-  strs[2] = kHelloWorld;
-  strs[3] = WTF::String::fromUTF8(kUTF8HelloWorld);
-
-  return strs;
-}
-
-WTF::HashMap<WTF::String, WTF::String> ConstructStringMap() {
-  WTF::HashMap<WTF::String, WTF::String> str_map;
-  // A null string as value.
-  str_map.insert("0", WTF::String());
-  str_map.insert("1", kHelloWorld);
-  str_map.insert("2", WTF::String::fromUTF8(kUTF8HelloWorld));
-
-  return str_map;
-}
-
-void ExpectString(const WTF::String& expected_string,
-                  const base::Closure& closure,
-                  const WTF::String& string) {
-  EXPECT_EQ(expected_string, string);
-  closure.Run();
-}
-
-void ExpectStringArray(WTF::Optional<WTF::Vector<WTF::String>>* expected_arr,
-                       const base::Closure& closure,
-                       const WTF::Optional<WTF::Vector<WTF::String>>& arr) {
-  EXPECT_EQ(*expected_arr, arr);
-  closure.Run();
-}
-
-void ExpectStringMap(
-    WTF::Optional<WTF::HashMap<WTF::String, WTF::String>>* expected_map,
-    const base::Closure& closure,
-    const WTF::Optional<WTF::HashMap<WTF::String, WTF::String>>& map) {
-  EXPECT_EQ(*expected_map, map);
-  closure.Run();
-}
-
-}  // namespace
-
-TEST_F(WTFTypesTest, Serialization_WTFVectorToWTFVector) {
-  using MojomType = ArrayDataView<StringDataView>;
-
-  WTF::Vector<WTF::String> strs = ConstructStringArray();
-  auto cloned_strs = strs;
-
-  mojo::internal::SerializationContext context;
-  size_t size =
-      mojo::internal::PrepareToSerialize<MojomType>(cloned_strs, &context);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  typename mojo::internal::MojomTypeTraits<MojomType>::Data* data;
-  mojo::internal::ContainerValidateParams validate_params(
-      0, true, new mojo::internal::ContainerValidateParams(0, false, nullptr));
-  mojo::internal::Serialize<MojomType>(cloned_strs, &buf, &data,
-                                       &validate_params, &context);
-
-  WTF::Vector<WTF::String> strs2;
-  mojo::internal::Deserialize<MojomType>(data, &strs2, &context);
-
-  EXPECT_EQ(strs, strs2);
-}
-
-TEST_F(WTFTypesTest, Serialization_WTFVectorToStlVector) {
-  using MojomType = ArrayDataView<StringDataView>;
-
-  WTF::Vector<WTF::String> strs = ConstructStringArray();
-  auto cloned_strs = strs;
-
-  mojo::internal::SerializationContext context;
-  size_t size =
-      mojo::internal::PrepareToSerialize<MojomType>(cloned_strs, &context);
-
-  mojo::internal::FixedBufferForTesting buf(size);
-  typename mojo::internal::MojomTypeTraits<MojomType>::Data* data;
-  mojo::internal::ContainerValidateParams validate_params(
-      0, true, new mojo::internal::ContainerValidateParams(0, false, nullptr));
-  mojo::internal::Serialize<MojomType>(cloned_strs, &buf, &data,
-                                       &validate_params, &context);
-
-  std::vector<base::Optional<std::string>> strs2;
-  mojo::internal::Deserialize<MojomType>(data, &strs2, &context);
-
-  ASSERT_EQ(4u, strs2.size());
-  EXPECT_FALSE(strs2[0]);
-  EXPECT_EQ("", *strs2[1]);
-  EXPECT_EQ(kHelloWorld, *strs2[2]);
-  EXPECT_EQ(kUTF8HelloWorld, *strs2[3]);
-}
-
-TEST_F(WTFTypesTest, Serialization_PublicAPI) {
-  blink::TestWTFStructPtr input(blink::TestWTFStruct::New(kHelloWorld, 42));
-
-  blink::TestWTFStructPtr cloned_input = input.Clone();
-
-  auto data = blink::TestWTFStruct::Serialize(&input);
-
-  blink::TestWTFStructPtr output;
-  ASSERT_TRUE(blink::TestWTFStruct::Deserialize(std::move(data), &output));
-  EXPECT_TRUE(cloned_input.Equals(output));
-}
-
-TEST_F(WTFTypesTest, SendString) {
-  blink::TestWTFPtr ptr;
-  TestWTFImpl impl(ConvertInterfaceRequest<TestWTF>(MakeRequest(&ptr)));
-
-  WTF::Vector<WTF::String> strs = ConstructStringArray();
-
-  for (size_t i = 0; i < strs.size(); ++i) {
-    base::RunLoop loop;
-    // Test that a WTF::String is unchanged after the following conversion:
-    //   - serialized;
-    //   - deserialized as base::Optional<std::string>;
-    //   - serialized;
-    //   - deserialized as WTF::String.
-    ptr->EchoString(strs[i],
-                    base::Bind(&ExpectString, strs[i], loop.QuitClosure()));
-    loop.Run();
-  }
-}
-
-TEST_F(WTFTypesTest, SendStringArray) {
-  blink::TestWTFPtr ptr;
-  TestWTFImpl impl(ConvertInterfaceRequest<TestWTF>(MakeRequest(&ptr)));
-
-  WTF::Optional<WTF::Vector<WTF::String>> arrs[3];
-  // arrs[0] is empty.
-  arrs[0].emplace();
-  // arrs[1] is null.
-  arrs[2] = ConstructStringArray();
-
-  for (size_t i = 0; i < arraysize(arrs); ++i) {
-    base::RunLoop loop;
-    // Test that a WTF::Optional<WTF::Vector<WTF::String>> is unchanged after
-    // the following conversion:
-    //   - serialized;
-    //   - deserialized as
-    //     base::Optional<std::vector<base::Optional<std::string>>>;
-    //   - serialized;
-    //   - deserialized as WTF::Optional<WTF::Vector<WTF::String>>.
-    ptr->EchoStringArray(
-        arrs[i], base::Bind(&ExpectStringArray, base::Unretained(&arrs[i]),
-                            loop.QuitClosure()));
-    loop.Run();
-  }
-}
-
-TEST_F(WTFTypesTest, SendStringMap) {
-  blink::TestWTFPtr ptr;
-  TestWTFImpl impl(ConvertInterfaceRequest<TestWTF>(MakeRequest(&ptr)));
-
-  WTF::Optional<WTF::HashMap<WTF::String, WTF::String>> maps[3];
-  // maps[0] is empty.
-  maps[0].emplace();
-  // maps[1] is null.
-  maps[2] = ConstructStringMap();
-
-  for (size_t i = 0; i < arraysize(maps); ++i) {
-    base::RunLoop loop;
-    // Test that a WTF::Optional<WTF::HashMap<WTF::String, WTF::String>> is
-    // unchanged after the following conversion:
-    //   - serialized;
-    //   - deserialized as base::Optional<
-    //     std::unordered_map<std::string, base::Optional<std::string>>>;
-    //   - serialized;
-    //   - deserialized as WTF::Optional<WTF::HashMap<WTF::String,
-    //     WTF::String>>.
-    ptr->EchoStringMap(maps[i],
-                       base::Bind(&ExpectStringMap, base::Unretained(&maps[i]),
-                                  loop.QuitClosure()));
-    loop.Run();
-  }
-}
-
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/thread_safe_interface_ptr.h b/mojo/public/cpp/bindings/thread_safe_interface_ptr.h
deleted file mode 100644
index 740687f..0000000
--- a/mojo/public/cpp/bindings/thread_safe_interface_ptr.h
+++ /dev/null
@@ -1,394 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_THREAD_SAFE_INTERFACE_PTR_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_THREAD_SAFE_INTERFACE_PTR_H_
-
-#include <memory>
-
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "base/memory/ref_counted.h"
-#include "base/stl_util.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/task_runner.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "mojo/public/cpp/bindings/associated_group.h"
-#include "mojo/public/cpp/bindings/associated_interface_ptr.h"
-#include "mojo/public/cpp/bindings/interface_ptr.h"
-#include "mojo/public/cpp/bindings/message.h"
-#include "mojo/public/cpp/bindings/sync_call_restrictions.h"
-#include "mojo/public/cpp/bindings/sync_event_watcher.h"
-
-// ThreadSafeInterfacePtr wraps a non-thread-safe InterfacePtr and proxies
-// messages to it. Async calls are posted to the thread that the InteracePtr is
-// bound to, and the responses are posted back. Sync calls are dispatched
-// directly if the call is made on the thread that the wrapped InterfacePtr is
-// bound to, or posted otherwise. It's important to be aware that sync calls
-// block both the calling thread and the InterfacePtr thread. That means that
-// you cannot make sync calls through a ThreadSafeInterfacePtr if the
-// underlying InterfacePtr is bound to a thread that cannot block, like the IO
-// thread.
-
-namespace mojo {
-
-// Instances of this class may be used from any thread to serialize |Interface|
-// messages and forward them elsewhere. In general you should use one of the
-// ThreadSafeInterfacePtrBase helper aliases defined below, but this type may be
-// useful if you need/want to manually manage the lifetime of the underlying
-// proxy object which will be used to ultimately send messages.
-template <typename Interface>
-class ThreadSafeForwarder : public MessageReceiverWithResponder {
- public:
-  using ProxyType = typename Interface::Proxy_;
-  using ForwardMessageCallback = base::Callback<void(Message)>;
-  using ForwardMessageWithResponderCallback =
-      base::Callback<void(Message, std::unique_ptr<MessageReceiver>)>;
-
-  // Constructs a ThreadSafeForwarder through which Messages are forwarded to
-  // |forward| or |forward_with_responder| by posting to |task_runner|.
-  //
-  // Any message sent through this forwarding interface will dispatch its reply,
-  // if any, back to the thread which called the corresponding interface method.
-  ThreadSafeForwarder(
-      const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
-      const ForwardMessageCallback& forward,
-      const ForwardMessageWithResponderCallback& forward_with_responder,
-      const AssociatedGroup& associated_group)
-      : proxy_(this),
-        task_runner_(task_runner),
-        forward_(forward),
-        forward_with_responder_(forward_with_responder),
-        associated_group_(associated_group),
-        sync_calls_(new InProgressSyncCalls()) {}
-
-  ~ThreadSafeForwarder() override {
-    // If there are ongoing sync calls signal their completion now.
-    base::AutoLock l(sync_calls_->lock);
-    for (const auto& pending_response : sync_calls_->pending_responses)
-      pending_response->event.Signal();
-  }
-
-  ProxyType& proxy() { return proxy_; }
-
- private:
-  // MessageReceiverWithResponder implementation:
-  bool Accept(Message* message) override {
-    if (!message->associated_endpoint_handles()->empty()) {
-      // If this DCHECK fails, it is likely because:
-      // - This is a non-associated interface pointer setup using
-      //     PtrWrapper::BindOnTaskRunner(
-      //         InterfacePtrInfo<InterfaceType> ptr_info);
-      //   Please see the TODO in that method.
-      // - This is an associated interface which hasn't been associated with a
-      //   message pipe. In other words, the corresponding
-      //   AssociatedInterfaceRequest hasn't been sent.
-      DCHECK(associated_group_.GetController());
-      message->SerializeAssociatedEndpointHandles(
-          associated_group_.GetController());
-    }
-    task_runner_->PostTask(FROM_HERE,
-                           base::Bind(forward_, base::Passed(message)));
-    return true;
-  }
-
-  bool AcceptWithResponder(
-      Message* message,
-      std::unique_ptr<MessageReceiver> responder) override {
-    if (!message->associated_endpoint_handles()->empty()) {
-      // Please see comment for the DCHECK in the previous method.
-      DCHECK(associated_group_.GetController());
-      message->SerializeAssociatedEndpointHandles(
-          associated_group_.GetController());
-    }
-
-    // Async messages are always posted (even if |task_runner_| runs tasks on
-    // this thread) to guarantee that two async calls can't be reordered.
-    if (!message->has_flag(Message::kFlagIsSync)) {
-      auto reply_forwarder =
-          base::MakeUnique<ForwardToCallingThread>(std::move(responder));
-      task_runner_->PostTask(
-          FROM_HERE, base::Bind(forward_with_responder_, base::Passed(message),
-                                base::Passed(&reply_forwarder)));
-      return true;
-    }
-
-    SyncCallRestrictions::AssertSyncCallAllowed();
-
-    // If the InterfacePtr is bound to this thread, dispatch it directly.
-    if (task_runner_->RunsTasksOnCurrentThread()) {
-      forward_with_responder_.Run(std::move(*message), std::move(responder));
-      return true;
-    }
-
-    // If the InterfacePtr is bound on another thread, post the call.
-    // TODO(yzshen, watk): We block both this thread and the InterfacePtr
-    // thread. Ideally only this thread would block.
-    auto response = make_scoped_refptr(new SyncResponseInfo());
-    auto response_signaler = base::MakeUnique<SyncResponseSignaler>(response);
-    task_runner_->PostTask(
-        FROM_HERE, base::Bind(forward_with_responder_, base::Passed(message),
-                              base::Passed(&response_signaler)));
-
-    // Save the pending SyncResponseInfo so that if the sync call deletes
-    // |this|, we can signal the completion of the call to return from
-    // SyncWatch().
-    auto sync_calls = sync_calls_;
-    {
-      base::AutoLock l(sync_calls->lock);
-      sync_calls->pending_responses.push_back(response.get());
-    }
-
-    auto assign_true = [](bool* b) { *b = true; };
-    bool event_signaled = false;
-    SyncEventWatcher watcher(&response->event,
-                             base::Bind(assign_true, &event_signaled));
-    watcher.SyncWatch(&event_signaled);
-
-    {
-      base::AutoLock l(sync_calls->lock);
-      base::Erase(sync_calls->pending_responses, response.get());
-    }
-
-    if (response->received)
-      ignore_result(responder->Accept(&response->message));
-
-    return true;
-  }
-
-  // Data that we need to share between the threads involved in a sync call.
-  struct SyncResponseInfo
-      : public base::RefCountedThreadSafe<SyncResponseInfo> {
-    Message message;
-    bool received = false;
-    base::WaitableEvent event{base::WaitableEvent::ResetPolicy::MANUAL,
-                              base::WaitableEvent::InitialState::NOT_SIGNALED};
-
-   private:
-    friend class base::RefCountedThreadSafe<SyncResponseInfo>;
-  };
-
-  // A MessageReceiver that signals |response| when it either accepts the
-  // response message, or is destructed.
-  class SyncResponseSignaler : public MessageReceiver {
-   public:
-    explicit SyncResponseSignaler(scoped_refptr<SyncResponseInfo> response)
-        : response_(response) {}
-
-    ~SyncResponseSignaler() override {
-      // If Accept() was not called we must still notify the waiter that the
-      // sync call is finished.
-      if (response_)
-        response_->event.Signal();
-    }
-
-    bool Accept(Message* message) {
-      response_->message = std::move(*message);
-      response_->received = true;
-      response_->event.Signal();
-      response_ = nullptr;
-      return true;
-    }
-
-   private:
-    scoped_refptr<SyncResponseInfo> response_;
-  };
-
-  // A record of the pending sync responses for canceling pending sync calls
-  // when the owning ThreadSafeForwarder is destructed.
-  struct InProgressSyncCalls
-      : public base::RefCountedThreadSafe<InProgressSyncCalls> {
-    // |lock| protects access to |pending_responses|.
-    base::Lock lock;
-    std::vector<SyncResponseInfo*> pending_responses;
-  };
-
-  class ForwardToCallingThread : public MessageReceiver {
-   public:
-    explicit ForwardToCallingThread(std::unique_ptr<MessageReceiver> responder)
-        : responder_(std::move(responder)),
-          caller_task_runner_(base::ThreadTaskRunnerHandle::Get()) {}
-
-   private:
-    bool Accept(Message* message) {
-      // The current instance will be deleted when this method returns, so we
-      // have to relinquish the responder's ownership so it does not get
-      // deleted.
-      caller_task_runner_->PostTask(
-          FROM_HERE,
-          base::Bind(&ForwardToCallingThread::CallAcceptAndDeleteResponder,
-                     base::Passed(std::move(responder_)),
-                     base::Passed(std::move(*message))));
-      return true;
-    }
-
-    static void CallAcceptAndDeleteResponder(
-        std::unique_ptr<MessageReceiver> responder,
-        Message message) {
-      ignore_result(responder->Accept(&message));
-    }
-
-    std::unique_ptr<MessageReceiver> responder_;
-    scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner_;
-  };
-
-  ProxyType proxy_;
-  const scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
-  const ForwardMessageCallback forward_;
-  const ForwardMessageWithResponderCallback forward_with_responder_;
-  AssociatedGroup associated_group_;
-  scoped_refptr<InProgressSyncCalls> sync_calls_;
-
-  DISALLOW_COPY_AND_ASSIGN(ThreadSafeForwarder);
-};
-
-template <typename InterfacePtrType>
-class ThreadSafeInterfacePtrBase
-    : public base::RefCountedThreadSafe<
-          ThreadSafeInterfacePtrBase<InterfacePtrType>> {
- public:
-  using InterfaceType = typename InterfacePtrType::InterfaceType;
-  using PtrInfoType = typename InterfacePtrType::PtrInfoType;
-
-  explicit ThreadSafeInterfacePtrBase(
-      std::unique_ptr<ThreadSafeForwarder<InterfaceType>> forwarder)
-      : forwarder_(std::move(forwarder)) {}
-
-  // Creates a ThreadSafeInterfacePtrBase wrapping an underlying non-thread-safe
-  // InterfacePtrType which is bound to the calling thread. All messages sent
-  // via this thread-safe proxy will internally be sent by first posting to this
-  // (the calling) thread's TaskRunner.
-  static scoped_refptr<ThreadSafeInterfacePtrBase> Create(
-      InterfacePtrType interface_ptr) {
-    scoped_refptr<PtrWrapper> wrapper =
-        new PtrWrapper(std::move(interface_ptr));
-    return new ThreadSafeInterfacePtrBase(wrapper->CreateForwarder());
-  }
-
-  // Creates a ThreadSafeInterfacePtrBase which binds the underlying
-  // non-thread-safe InterfacePtrType on the specified TaskRunner. All messages
-  // sent via this thread-safe proxy will internally be sent by first posting to
-  // that TaskRunner.
-  static scoped_refptr<ThreadSafeInterfacePtrBase> Create(
-      PtrInfoType ptr_info,
-      const scoped_refptr<base::SingleThreadTaskRunner>& bind_task_runner) {
-    scoped_refptr<PtrWrapper> wrapper = new PtrWrapper(bind_task_runner);
-    wrapper->BindOnTaskRunner(std::move(ptr_info));
-    return new ThreadSafeInterfacePtrBase(wrapper->CreateForwarder());
-  }
-
-  InterfaceType* get() { return &forwarder_->proxy(); }
-  InterfaceType* operator->() { return get(); }
-  InterfaceType& operator*() { return *get(); }
-
- private:
-  friend class base::RefCountedThreadSafe<
-      ThreadSafeInterfacePtrBase<InterfacePtrType>>;
-
-  struct PtrWrapperDeleter;
-
-  // Helper class which owns an |InterfacePtrType| instance on an appropriate
-  // thread. This is kept alive as long its bound within some
-  // ThreadSafeForwarder's callbacks.
-  class PtrWrapper
-      : public base::RefCountedThreadSafe<PtrWrapper, PtrWrapperDeleter> {
-   public:
-    explicit PtrWrapper(InterfacePtrType ptr)
-        : PtrWrapper(base::ThreadTaskRunnerHandle::Get()) {
-      ptr_ = std::move(ptr);
-      associated_group_ = *ptr_.internal_state()->associated_group();
-    }
-
-    explicit PtrWrapper(
-        const scoped_refptr<base::SingleThreadTaskRunner>& task_runner)
-        : task_runner_(task_runner) {}
-
-    void BindOnTaskRunner(AssociatedInterfacePtrInfo<InterfaceType> ptr_info) {
-      associated_group_ = AssociatedGroup(ptr_info.handle());
-      task_runner_->PostTask(FROM_HERE, base::Bind(&PtrWrapper::Bind, this,
-                                                   base::Passed(&ptr_info)));
-    }
-
-    void BindOnTaskRunner(InterfacePtrInfo<InterfaceType> ptr_info) {
-      // TODO(yzhsen): At the momment we don't have a group controller
-      // available. That means the user won't be able to pass associated
-      // endpoints on this interface (at least not immediately). In order to fix
-      // this, we need to create a MultiplexRouter immediately and bind it to
-      // the interface pointer on the |task_runner_|. Therefore, MultiplexRouter
-      // should be able to be created on a thread different than the one that it
-      // is supposed to listen on. crbug.com/682334
-      task_runner_->PostTask(FROM_HERE, base::Bind(&PtrWrapper::Bind, this,
-                                                   base::Passed(&ptr_info)));
-    }
-
-    std::unique_ptr<ThreadSafeForwarder<InterfaceType>> CreateForwarder() {
-      return base::MakeUnique<ThreadSafeForwarder<InterfaceType>>(
-          task_runner_, base::Bind(&PtrWrapper::Accept, this),
-          base::Bind(&PtrWrapper::AcceptWithResponder, this),
-          associated_group_);
-    }
-
-   private:
-    friend struct PtrWrapperDeleter;
-
-    ~PtrWrapper() {}
-
-    void Bind(PtrInfoType ptr_info) {
-      DCHECK(task_runner_->RunsTasksOnCurrentThread());
-      ptr_.Bind(std::move(ptr_info));
-    }
-
-    void Accept(Message message) {
-      ptr_.internal_state()->ForwardMessage(std::move(message));
-    }
-
-    void AcceptWithResponder(Message message,
-                             std::unique_ptr<MessageReceiver> responder) {
-      ptr_.internal_state()->ForwardMessageWithResponder(std::move(message),
-                                                         std::move(responder));
-    }
-
-    void DeleteOnCorrectThread() const {
-      if (!task_runner_->RunsTasksOnCurrentThread()) {
-        // NOTE: This is only called when there are no more references to
-        // |this|, so binding it unretained is both safe and necessary.
-        task_runner_->PostTask(FROM_HERE,
-                               base::Bind(&PtrWrapper::DeleteOnCorrectThread,
-                                          base::Unretained(this)));
-      } else {
-        delete this;
-      }
-    }
-
-    InterfacePtrType ptr_;
-    const scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
-    AssociatedGroup associated_group_;
-
-    DISALLOW_COPY_AND_ASSIGN(PtrWrapper);
-  };
-
-  struct PtrWrapperDeleter {
-    static void Destruct(const PtrWrapper* interface_ptr) {
-      interface_ptr->DeleteOnCorrectThread();
-    }
-  };
-
-  ~ThreadSafeInterfacePtrBase() {}
-
-  const std::unique_ptr<ThreadSafeForwarder<InterfaceType>> forwarder_;
-
-  DISALLOW_COPY_AND_ASSIGN(ThreadSafeInterfacePtrBase);
-};
-
-template <typename Interface>
-using ThreadSafeAssociatedInterfacePtr =
-    ThreadSafeInterfacePtrBase<AssociatedInterfacePtr<Interface>>;
-
-template <typename Interface>
-using ThreadSafeInterfacePtr =
-    ThreadSafeInterfacePtrBase<InterfacePtr<Interface>>;
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_THREAD_SAFE_INTERFACE_PTR_H_
diff --git a/mojo/public/cpp/bindings/type_converter.h b/mojo/public/cpp/bindings/type_converter.h
deleted file mode 100644
index 395eeb4..0000000
--- a/mojo/public/cpp/bindings/type_converter.h
+++ /dev/null
@@ -1,116 +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 MOJO_PUBLIC_CPP_BINDINGS_TYPE_CONVERTER_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_TYPE_CONVERTER_H_
-
-#include <stdint.h>
-
-#include <vector>
-
-namespace mojo {
-
-// NOTE: TypeConverter is deprecated. Please consider StructTraits /
-// UnionTraits / EnumTraits / ArrayTraits / MapTraits / StringTraits if you
-// would like to convert between custom types and the wire format of mojom
-// types.
-//
-// Specialize the following class:
-//   template <typename T, typename U> struct TypeConverter;
-// to perform type conversion for Mojom-defined structs and arrays. Here, T is
-// the target type; U is the input type.
-//
-// Specializations should implement the following interfaces:
-//   namespace mojo {
-//   template <>
-//   struct TypeConverter<X, Y> {
-//     static X Convert(const Y& input);
-//   };
-//   template <>
-//   struct TypeConverter<Y, X> {
-//     static Y Convert(const X& input);
-//   };
-//   }
-//
-// EXAMPLE:
-//
-// Suppose you have the following Mojom-defined struct:
-//
-//   module geometry {
-//   struct Point {
-//     int32_t x;
-//     int32_t y;
-//   };
-//   }
-//
-// Now, imagine you wanted to write a TypeConverter specialization for
-// gfx::Point. It might look like this:
-//
-//   namespace mojo {
-//   template <>
-//   struct TypeConverter<geometry::PointPtr, gfx::Point> {
-//     static geometry::PointPtr Convert(const gfx::Point& input) {
-//       geometry::PointPtr result;
-//       result->x = input.x();
-//       result->y = input.y();
-//       return result;
-//     }
-//   };
-//   template <>
-//   struct TypeConverter<gfx::Point, geometry::PointPtr> {
-//     static gfx::Point Convert(const geometry::PointPtr& input) {
-//       return input ? gfx::Point(input->x, input->y) : gfx::Point();
-//     }
-//   };
-//   }
-//
-// With the above TypeConverter defined, it is possible to write code like this:
-//
-//   void AcceptPoint(const geometry::PointPtr& input) {
-//     // With an explicit cast using the .To<> method.
-//     gfx::Point pt = input.To<gfx::Point>();
-//
-//     // With an explicit cast using the static From() method.
-//     geometry::PointPtr output = geometry::Point::From(pt);
-//
-//     // Inferring the input type using the ConvertTo helper function.
-//     gfx::Point pt2 = ConvertTo<gfx::Point>(input);
-//   }
-//
-template <typename T, typename U>
-struct TypeConverter;
-
-template <typename T, typename U>
-inline T ConvertTo(const U& obj);
-
-// The following specialization is useful when you are converting between
-// Array<POD> and std::vector<POD>.
-template <typename T>
-struct TypeConverter<T, T> {
-  static T Convert(const T& obj) { return obj; }
-};
-
-template <typename T, typename Container>
-struct TypeConverter<std::vector<T>, Container> {
-  static std::vector<T> Convert(const Container& container) {
-    std::vector<T> output;
-    output.reserve(container.size());
-    for (const auto& obj : container) {
-      output.push_back(ConvertTo<T>(obj));
-    }
-    return output;
-  }
-};
-
-// The following helper function is useful for shorthand. The compiler can infer
-// the input type, so you can write:
-//   OutputType out = ConvertTo<OutputType>(input);
-template <typename T, typename U>
-inline T ConvertTo(const U& obj) {
-  return TypeConverter<T, U>::Convert(obj);
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_TYPE_CONVERTER_H_
diff --git a/mojo/public/cpp/bindings/union_traits.h b/mojo/public/cpp/bindings/union_traits.h
deleted file mode 100644
index 292ee58..0000000
--- a/mojo/public/cpp/bindings/union_traits.h
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_UNION_TRAITS_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_UNION_TRAITS_H_
-
-namespace mojo {
-
-// This must be specialized for any type |T| to be serialized/deserialized as
-// a mojom union. |DataViewType| is the corresponding data view type of the
-// mojom union. For example, if the mojom union is example.Foo, |DataViewType|
-// will be example::FooDataView, which can also be referred to by
-// example::Foo::DataView (in chromium) and example::blink::Foo::DataView (in
-// blink).
-//
-// Similar to StructTraits, each specialization of UnionTraits implements the
-// following methods:
-//   1. Getters for each field in the Mojom type.
-//   2. Read() method.
-//   3. [Optional] IsNull() and SetToNull().
-//   4. [Optional] SetUpContext() and TearDownContext().
-// Please see the documentation of StructTraits for details of these methods.
-//
-// Unlike StructTraits, there is one more method to implement:
-//   5. A static GetTag() method indicating which field is the current active
-//      field for serialization:
-//
-//        static DataViewType::Tag GetTag(const T& input);
-//
-//      During serialization, only the field getter corresponding to this tag
-//      will be called.
-//
-template <typename DataViewType, typename T>
-struct UnionTraits;
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_UNION_TRAITS_H_
diff --git a/mojo/public/cpp/bindings/unique_ptr_impl_ref_traits.h b/mojo/public/cpp/bindings/unique_ptr_impl_ref_traits.h
deleted file mode 100644
index f1ac097..0000000
--- a/mojo/public/cpp/bindings/unique_ptr_impl_ref_traits.h
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_BINDINGS_UNIQUE_PTR_IMPL_REF_TRAITS_H_
-#define MOJO_PUBLIC_CPP_BINDINGS_UNIQUE_PTR_IMPL_REF_TRAITS_H_
-
-namespace mojo {
-
-// Traits for a binding's implementation reference type.
-// This corresponds to a unique_ptr reference type.
-template <typename Interface>
-struct UniquePtrImplRefTraits {
-  using PointerType = std::unique_ptr<Interface>;
-
-  static bool IsNull(const PointerType& ptr) { return !ptr; }
-  static Interface* GetRawPointer(PointerType* ptr) { return ptr->get(); }
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_BINDINGS_UNIQUE_PTR_IMPL_REF_TRAITS_H_
diff --git a/mojo/public/cpp/system/BUILD.gn b/mojo/public/cpp/system/BUILD.gn
deleted file mode 100644
index 35087ef..0000000
--- a/mojo/public/cpp/system/BUILD.gn
+++ /dev/null
@@ -1,57 +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.
-
-# Deletes libsystem.dylib from the build dir, since it shadows
-# /usr/lib/libSystem.dylib on macOS.
-# TODO(thakis): Remove this after a while.
-action("clean_up_old_dylib") {
-  script = "//build/rm.py"
-  stamp = "$target_gen_dir/clean_up_stamp"
-  outputs = [
-    stamp,
-  ]
-  args = [
-    "--stamp",
-    rebase_path(stamp, root_build_dir),
-    "-f",
-    "libsystem.dylib",
-  ]
-}
-
-component("system") {
-  output_name = "mojo_public_system_cpp"
-
-  sources = [
-    "buffer.cc",
-    "buffer.h",
-    "core.h",
-    "data_pipe.h",
-    "functions.h",
-    "handle.h",
-    "handle_signals_state.h",
-    "message.h",
-    "message_pipe.h",
-    "platform_handle.cc",
-    "platform_handle.h",
-    "simple_watcher.cc",
-    "simple_watcher.h",
-    "system_export.h",
-    "wait.cc",
-    "wait.h",
-    "wait_set.cc",
-    "wait_set.h",
-    "watcher.cc",
-    "watcher.h",
-  ]
-
-  public_deps = [
-    "//base",
-    "//mojo/public/c/system",
-  ]
-  deps = [
-    ":clean_up_old_dylib",
-  ]
-
-  defines = [ "MOJO_CPP_SYSTEM_IMPLEMENTATION" ]
-}
diff --git a/mojo/public/cpp/system/README.md b/mojo/public/cpp/system/README.md
deleted file mode 100644
index 782744f..0000000
--- a/mojo/public/cpp/system/README.md
+++ /dev/null
@@ -1,396 +0,0 @@
-# ![Mojo Graphic](https://goo.gl/6CdlbH) Mojo C++ System API
-This document is a subset of the [Mojo documentation](/mojo).
-
-[TOC]
-
-## Overview
-The Mojo C++ System API provides a convenient set of helper classes and
-functions for working with Mojo primitives. Unlike the low-level
-[C API](/mojo/public/c/system) (upon which this is built) this library takes
-advantage of C++ language features and common STL and `//base` types to provide
-a slightly more idiomatic interface to the Mojo system layer, making it
-generally easier to use.
-
-This document provides a brief guide to API usage with example code snippets.
-For a detailed API references please consult the headers in
-[//mojo/public/cpp/system](https://cs.chromium.org/chromium/src/mojo/public/cpp/system/).
-
-Note that all API symbols referenced in this document are implicitly in the
-top-level `mojo` namespace.
-
-## Scoped, Typed Handles
-
-All types of Mojo handles in the C API are simply opaque, integral `MojoHandle`
-values. The C++ API has more strongly typed wrappers defined for different
-handle types: `MessagePipeHandle`, `SharedBufferHandle`,
-`DataPipeConsumerHandle`, `DataPipeProducerHandle`, and `WatcherHandle`.
-
-Each of these also has a corresponding, move-only, scoped type for safer usage:
-`ScopedMessagePipeHandle`, `ScopedSharedBufferHandle`, and so on. When a scoped
-handle type is destroyed, its handle is automatically closed via `MojoClose`.
-When working with raw handles you should **always** prefer to use one of the
-scoped types for ownership.
-
-Similar to `std::unique_ptr`, scoped handle types expose a `get()` method to get
-at the underlying unscoped handle type as well as the `->` operator to
-dereference the scoper and make calls directly on the underlying handle type.
-
-## Message Pipes
-
-There are two ways to create a new message pipe using the C++ API. You may
-construct a `MessagePipe` object:
-
-``` cpp
-mojo::MessagePipe pipe;
-
-// NOTE: Because pipes are bi-directional there is no implicit semantic
-// difference between |handle0| or |handle1| here. They're just two ends of a
-// pipe. The choice to treat one as a "client" and one as a "server" is entirely
-// a the API user's decision.
-mojo::ScopedMessagePipeHandle client = std::move(pipe.handle0);
-mojo::ScopedMessagePipeHandle server = std::move(pipe.handle1);
-```
-
-or you may call `CreateMessagePipe`:
-
-``` cpp
-mojo::ScopedMessagePipeHandle client;
-mojo::ScopedMessagePipeHandle server;
-mojo::CreateMessagePipe(nullptr, &client, &server);
-```
-
-There are also some helper functions for constructing message objects and
-reading/writing them on pipes using the library's more strongly-typed C++
-handles:
-
-``` cpp
-mojo::ScopedMessageHandle message;
-mojo::AllocMessage(6, nullptr, 0, MOJO_ALLOC_MESSAGE_FLAG_NONE, &message);
-
-void *buffer;
-mojo::GetMessageBuffer(message.get(), &buffer);
-
-const std::string kMessage = "hello";
-std::copy(kMessage.begin(), kMessage.end(), static_cast<char*>(buffer));
-
-mojo::WriteMessageNew(client.get(), std::move(message),
-                      MOJO_WRITE_MESSAGE_FLAG_NONE);
-
-// Some time later...
-
-mojo::ScopedMessageHandle received_message;
-uint32_t num_bytes;
-mojo::ReadMessageNew(server.get(), &received_message, &num_bytes, nullptr,
-                     nullptr, MOJO_READ_MESSAGE_FLAG_NONE);
-```
-
-See [message_pipe.h](https://cs.chromium.org/chromium/src/mojo/public/cpp/system/message_pipe.h)
-for detailed C++ message pipe API documentation.
-
-## Data Pipes
-
-Similar to [Message Pipes](#Message-Pipes), the C++ library has some simple
-helpers for more strongly-typed data pipe usage:
-
-``` cpp
-mojo::DataPipe pipe;
-mojo::ScopedDataPipeProducerHandle producer = std::move(pipe.producer);
-mojo::ScopedDataPipeConsumerHandle consumer = std::move(pipe.consumer);
-
-// Or alternatively:
-mojo::ScopedDataPipeProducerHandle producer;
-mojo::ScopedDataPipeConsumerHandle consumer;
-mojo::CreateDataPipe(null, &producer, &consumer);
-```
-
-// Reads from a data pipe. See |MojoReadData()| for complete documentation.
-inline MojoResult ReadDataRaw(DataPipeConsumerHandle data_pipe_consumer,
-                              void* elements,
-                              uint32_t* num_bytes,
-                              MojoReadDataFlags flags) {
-  return MojoReadData(data_pipe_consumer.value(), elements, num_bytes, flags);
-}
-
-// Begins a two-phase read
-C++ helpers which correspond directly to the
-[Data Pipe C API](/mojo/public/c/system#Data-Pipes) for immediate and two-phase
-I/O are provided as well. For example:
-
-``` cpp
-uint32_t num_bytes = 7;
-mojo::WriteDataRaw(producer.get(), "hihihi",
-                   &num_bytes, MOJO_WRITE_DATA_FLAG_NONE);
-
-// Some time later...
-
-char buffer[64];
-uint32_t num_bytes = 64;
-mojo::ReadDataRaw(consumer.get(), buffer, &num_bytes, MOJO_READ_DATA_FLAG_NONE);
-```
-
-See [data_pipe.h](https://cs.chromium.org/chromium/src/mojo/public/cpp/system/data_pipe.h)
-for detailed C++ data pipe API documentation.
-
-## Shared Buffers
-
-A new shared buffers can be allocated like so:
-
-``` cpp
-mojo::ScopedSharedBufferHandle buffer =
-    mojo::ScopedSharedBufferHandle::Create(4096);
-```
-
-This new handle can be cloned arbitrarily many times by using the underlying
-handle's `Clone` method:
-
-``` cpp
-mojo::ScopedSharedBufferHandle another_handle = buffer->Clone();
-mojo::ScopedSharedBufferHandle read_only_handle =
-    buffer->Clone(mojo::SharedBufferHandle::AccessMode::READ_ONLY);
-```
-
-And finally the library also provides a scoper for mapping the shared buffer's
-memory:
-
-``` cpp
-mojo::ScopedSharedBufferMapping mapping = buffer->Map(64);
-static_cast<int*>(mapping.get()) = 42;
-
-mojo::ScopedSharedBufferMapping another_mapping = buffer->MapAtOffset(64, 4);
-static_cast<int*>(mapping.get()) = 43;
-```
-
-When `mapping` and `another_mapping` are destroyed, they automatically unmap
-their respective memory regions.
-
-See [buffer.h](https://cs.chromium.org/chromium/src/mojo/public/cpp/system/buffer.h)
-for detailed C++ shared buffer API documentation.
-
-## Native Platform Handles (File Descriptors, Windows Handles, *etc.*)
-
-The C++ library provides several helpers for wrapping system handle types.
-These are specifically useful when working with a few `//base` types, namely
-`base::PlatformFile` and `base::SharedMemoryHandle`. See
-[platform_handle.h](https://cs.chromium.org/chromium/src/mojo/public/cpp/system/platform_handle.h)
-for detailed C++ platform handle API documentation.
-
-## Signals & Watchers
-
-For an introduction to the concepts of handle signals and watchers, check out
-the C API's documentation on [Signals & Watchers](/mojo/public/c/system#Signals-Watchers).
-
-### Querying Signals
-
-Any C++ handle type's last known signaling state can be queried by calling the
-`QuerySignalsState` method on the handle:
-
-``` cpp
-mojo::MessagePipe message_pipe;
-mojo::DataPipe data_pipe;
-mojo::HandleSignalsState a = message_pipe.handle0->QuerySignalsState();
-mojo::HandleSignalsState b = data_pipe.consumer->QuerySignalsState();
-```
-
-The `HandleSignalsState` is a thin wrapper interface around the C API's
-`MojoHandleSignalsState` structure with convenient accessors for testing
-the signal bitmasks. Whereas when using the C API you might write:
-
-``` c
-struct MojoHandleSignalsState state;
-MojoQueryHandleSignalsState(handle0, &state);
-if (state.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE) {
-  // ...
-}
-```
-
-the C++ API equivalent would be:
-
-``` cpp
-if (message_pipe.handle0->QuerySignalsState().readable()) {
-  // ...
-}
-```
-
-### Watching Handles
-
-The [`mojo::SimpleWatcher`](https://cs.chromium.org/chromium/src/mojo/public/cpp/system/simple_watcher.h)
-class serves as a convenient helper for using the [low-level watcher API](/mojo/public/c/system#Signals-Watchers)
-to watch a handle for signaling state changes. A `SimpleWatcher` is bound to a
-single thread and always dispatches its notifications on a
-`base::SingleThreadTaskRunner`.
-
-`SimpleWatcher` has two possible modes of operation, selected at construction
-time by the `mojo::SimpleWatcher::ArmingPolicy` enum:
-
-* `MANUAL` mode requires the user to manually call `Arm` and/or `ArmOrNotify`
-  before any notifications will fire regarding the state of the watched handle.
-  Every time the notification callback is run, the `SimpleWatcher` must be
-  rearmed again before the next one can fire. See 
-  [Arming a Watcher](/mojo/public/c/system#Arming-a-Watcher) and the
-  documentation in `SimpleWatcher`'s header.
-
-* `AUTOMATIC` mode ensures that the `SimpleWatcher` always either is armed or
-  has a pending notification task queued for execution.
-
-`AUTOMATIC` mode is more convenient but can result in redundant notification
-tasks, especially if the provided callback does not make a strong effort to
-return the watched handle to an uninteresting signaling state (by *e.g.*,
-reading all its available messages when notified of readability.)
-
-Example usage:
-
-``` cpp
-class PipeReader {
- public:
-  PipeReader(mojo::ScopedMessagePipeHandle pipe)
-      : pipe_(std::move(pipe)),
-        watcher_(mojo::SimpleWatcher::ArmingPolicy::AUTOMATIC) {
-    // NOTE: base::Unretained is safe because the callback can never be run
-    // after SimpleWatcher destruction.
-    watcher_.Watch(pipe_.get(), MOJO_HANDLE_SIGNAL_READABLE,
-                   base::Bind(&PipeReader::OnReadable, base::Unretained(this)));
-  }
-
-  ~PipeReader() {}
-
- private:
-  void OnReadable(MojoResult result) {
-    while (result == MOJO_RESULT_OK) {
-      mojo::ScopedMessageHandle message;
-      uint32_t num_bytes;
-      result = mojo::ReadMessageNew(pipe_.get(), &message, &num_bytes, nullptr,
-                                    nullptr, MOJO_READ_MESSAGE_FLAG_NONE);
-      DCHECK_EQ(result, MOJO_RESULT_OK);
-      messages_.emplace_back(std::move(message));
-    }
-  }
-
-  mojo::ScopedMessagePipeHandle pipe_;
-  mojo::SimpleWatcher watcher_;
-  std::vector<mojo::ScopedMessageHandle> messages_;
-};
-
-mojo::MessagePipe pipe;
-PipeReader reader(std::move(pipe.handle0));
-
-// Written messages will asynchronously end up in |reader.messages_|.
-WriteABunchOfStuff(pipe.handle1.get());
-```
-
-## Synchronous Waiting
-
-The C++ System API defines some utilities to block a calling thread while
-waiting for one or more handles to change signaling state in an interesting way.
-These threads combine usage of the [low-level Watcher API](/mojo/public/c/system#Signals-Watchers)
-with common synchronization primitives (namely `base::WaitableEvent`.)
-
-While these API features should be used sparingly, they are sometimes necessary.
-
-See the documentation in 
-[wait.h](https://cs.chromium.org/chromium/src/mojo/public/cpp/system/wait.h)
-and [wait_set.h](https://cs.chromium.org/chromium/src/mojo/public/cpp/system/wait_set.h)
-for a more detailed API reference.
-
-### Waiting On a Single Handle
-
-The `mojo::Wait` function simply blocks the calling thread until a given signal
-mask is either partially satisfied or fully unsatisfiable on a given handle.
-
-``` cpp
-mojo::MessagePipe pipe;
-mojo::WriteMessageRaw(pipe.handle0.get(), "hey", 3, nullptr, nullptr,
-                      MOJO_WRITE_MESSAGE_FLAG_NONE);
-MojoResult result = mojo::Wait(pipe.handle1.get(), MOJO_HANDLE_SIGNAL_READABLE);
-DCHECK_EQ(result, MOJO_RESULT_OK);
-
-// Guaranteed to succeed because we know |handle1| is readable now.
-mojo::ScopedMessageHandle message;
-uint32_t num_bytes;
-mojo::ReadMessageNew(pipe.handle1.get(), &num_bytes, nullptr, nullptr,
-                     MOJO_READ_MESSAGE_FLAG_NONE);
-```
-
-`mojo::Wait` is most typically useful in limited testing scenarios.
-
-### Waiting On Multiple Handles
-
-`mojo::WaitMany` provides a simple API to wait on multiple handles
-simultaneously, returning when any handle's given signal mask is either
-partially satisfied or fully unsatisfiable.
-
-``` cpp
-mojo::MessagePipe a, b;
-GoDoSomethingWithPipes(std:move(a.handle1), std::move(b.handle1));
-
-mojo::MessagePipeHandle handles[2] = {a.handle0.get(), b.handle0.get()};
-MojoHandleSignals signals[2] = {MOJO_HANDLE_SIGNAL_READABLE,
-                                MOJO_HANDLE_SIGNAL_READABLE};
-size_t ready_index;
-MojoResult result = mojo::WaitMany(handles, signals, 2, &ready_index);
-if (ready_index == 0) {
-  // a.handle0 was ready.
-} else {
-  // b.handle0 was ready.
-}
-```
-
-Similar to `mojo::Wait`, `mojo::WaitMany` is primarily useful in testing. When
-waiting on multiple handles in production code, you should almost always instead 
-use a more efficient and more flexible `mojo::WaitSet` as described in the next
-section.
-
-### Waiting On Handles and Events Simultaneously
-
-Typically when waiting on one or more handles to signal, the set of handles and
-conditions being waited upon do not change much between consecutive blocking
-waits. It's also often useful to be able to interrupt the blocking operation
-as efficiently as possible.
-
-[`mojo::WaitSet`](https://cs.chromium.org/chromium/src/mojo/public/cpp/system/wait_set.h)
-is designed with these conditions in mind. A `WaitSet` maintains a persistent
-set of (not-owned) Mojo handles and `base::WaitableEvent`s, which may be
-explicitly added to or removed from the set at any time.
-
-The `WaitSet` may be waited upon repeatedly, each time blocking the calling
-thread until either one of the handles attains an interesting signaling state or
-one of the events is signaled. For example let's suppose we want to wait up to 5
-seconds for either one of two handles to become readable:
-
-``` cpp
-base::WaitableEvent timeout_event(
-    base::WaitableEvent::ResetPolicy::MANUAL,
-    base::WaitableEvent::InitialState::NOT_SIGNALED);
-mojo::MessagePipe a, b;
-
-GoDoStuffWithPipes(std::move(a.handle1), std::move(b.handle1));
-
-mojo::WaitSet wait_set;
-wait_set.AddHandle(a.handle0.get(), MOJO_HANDLE_SIGNAL_READABLE);
-wait_set.AddHandle(b.handle0.get(), MOJO_HANDLE_SIGNAL_READABLE);
-wait_set.AddEvent(&timeout_event);
-
-// Ensure the Wait() lasts no more than 5 seconds.
-bg_thread->task_runner()->PostDelayedTask(
-    FROM_HERE,
-    base::Bind([](base::WaitableEvent* e) { e->Signal(); }, &timeout_event);
-    base::TimeDelta::FromSeconds(5));
-
-base::WaitableEvent* ready_event = nullptr;
-size_t num_ready_handles = 1;
-mojo::Handle ready_handle;
-MojoResult ready_result;
-wait_set.Wait(&ready_event, &num_ready_handles, &ready_handle, &ready_result);
-
-// The apex of thread-safety.
-bg_thread->Stop();
-
-if (ready_event) {
-  // The event signaled...
-}
-
-if (num_ready_handles > 0) {
-  // At least one of the handles signaled...
-  // NOTE: This and the above condition are not mutually exclusive. If handle
-  // signaling races with timeout, both things might be true.
-}
-```
diff --git a/mojo/public/cpp/system/buffer.cc b/mojo/public/cpp/system/buffer.cc
deleted file mode 100644
index 49f45d8..0000000
--- a/mojo/public/cpp/system/buffer.cc
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/system/buffer.h"
-
-namespace mojo {
-
-// static
-ScopedSharedBufferHandle SharedBufferHandle::Create(uint64_t num_bytes) {
-  MojoCreateSharedBufferOptions options = {
-      sizeof(options), MOJO_CREATE_SHARED_BUFFER_OPTIONS_FLAG_NONE};
-  SharedBufferHandle handle;
-  MojoCreateSharedBuffer(&options, num_bytes, handle.mutable_value());
-  return MakeScopedHandle(handle);
-}
-
-ScopedSharedBufferHandle SharedBufferHandle::Clone(
-    SharedBufferHandle::AccessMode access_mode) const {
-  ScopedSharedBufferHandle result;
-  if (!is_valid())
-    return result;
-
-  MojoDuplicateBufferHandleOptions options = {
-      sizeof(options), MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_NONE};
-  if (access_mode == AccessMode::READ_ONLY)
-    options.flags |= MOJO_DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_READ_ONLY;
-  SharedBufferHandle result_handle;
-  MojoDuplicateBufferHandle(value(), &options, result_handle.mutable_value());
-  result.reset(result_handle);
-  return result;
-}
-
-ScopedSharedBufferMapping SharedBufferHandle::Map(uint64_t size) const {
-  return MapAtOffset(size, 0);
-}
-
-ScopedSharedBufferMapping SharedBufferHandle::MapAtOffset(
-    uint64_t size,
-    uint64_t offset) const {
-  void* buffer = nullptr;
-  MojoMapBuffer(value(), offset, size, &buffer, MOJO_MAP_BUFFER_FLAG_NONE);
-  return ScopedSharedBufferMapping(buffer);
-}
-
-}  // namespace mojo
diff --git a/mojo/public/cpp/system/buffer.h b/mojo/public/cpp/system/buffer.h
deleted file mode 100644
index 1ae923c..0000000
--- a/mojo/public/cpp/system/buffer.h
+++ /dev/null
@@ -1,82 +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.
-
-// This file provides a C++ wrapping around the Mojo C API for shared buffers,
-// replacing the prefix of "Mojo" with a "mojo" namespace, and using more
-// strongly-typed representations of |MojoHandle|s.
-//
-// Please see "mojo/public/c/system/buffer.h" for complete documentation of the
-// API.
-
-#ifndef MOJO_PUBLIC_CPP_SYSTEM_BUFFER_H_
-#define MOJO_PUBLIC_CPP_SYSTEM_BUFFER_H_
-
-#include <stdint.h>
-
-#include <memory>
-
-#include "base/compiler_specific.h"
-#include "base/logging.h"
-#include "mojo/public/c/system/buffer.h"
-#include "mojo/public/cpp/system/handle.h"
-#include "mojo/public/cpp/system/system_export.h"
-
-namespace mojo {
-namespace internal {
-
-struct Unmapper {
-  void operator()(void* buffer) {
-    MojoResult result = MojoUnmapBuffer(buffer);
-    DCHECK_EQ(MOJO_RESULT_OK, result);
-  }
-};
-
-}  // namespace internal
-
-using ScopedSharedBufferMapping = std::unique_ptr<void, internal::Unmapper>;
-
-class SharedBufferHandle;
-
-typedef ScopedHandleBase<SharedBufferHandle> ScopedSharedBufferHandle;
-
-// A strongly-typed representation of a |MojoHandle| referring to a shared
-// buffer.
-class MOJO_CPP_SYSTEM_EXPORT SharedBufferHandle
-    : NON_EXPORTED_BASE(public Handle) {
- public:
-  enum class AccessMode {
-    READ_WRITE,
-    READ_ONLY,
-  };
-
-  SharedBufferHandle() {}
-  explicit SharedBufferHandle(MojoHandle value) : Handle(value) {}
-
-  // Copying and assignment allowed.
-
-  // Creates a new SharedBufferHandle. Returns an invalid handle on failure.
-  static ScopedSharedBufferHandle Create(uint64_t num_bytes);
-
-  // Clones this shared buffer handle. If |access_mode| is READ_ONLY or this is
-  // a read-only handle, the new handle will be read-only. On failure, this will
-  // return an empty result.
-  ScopedSharedBufferHandle Clone(AccessMode = AccessMode::READ_WRITE) const;
-
-  // Maps |size| bytes of this shared buffer. On failure, this will return a
-  // null mapping.
-  ScopedSharedBufferMapping Map(uint64_t size) const;
-
-  // Maps |size| bytes of this shared buffer, starting |offset| bytes into the
-  // buffer. On failure, this will return a null mapping.
-  ScopedSharedBufferMapping MapAtOffset(uint64_t size, uint64_t offset) const;
-};
-
-static_assert(sizeof(SharedBufferHandle) == sizeof(Handle),
-              "Bad size for C++ SharedBufferHandle");
-static_assert(sizeof(ScopedSharedBufferHandle) == sizeof(SharedBufferHandle),
-              "Bad size for C++ ScopedSharedBufferHandle");
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_SYSTEM_BUFFER_H_
diff --git a/mojo/public/cpp/system/core.h b/mojo/public/cpp/system/core.h
deleted file mode 100644
index f1d18d9..0000000
--- a/mojo/public/cpp/system/core.h
+++ /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.
-
-#ifndef MOJO_PUBLIC_CPP_SYSTEM_CORE_H_
-#define MOJO_PUBLIC_CPP_SYSTEM_CORE_H_
-
-#include "mojo/public/cpp/system/buffer.h"
-#include "mojo/public/cpp/system/data_pipe.h"
-#include "mojo/public/cpp/system/functions.h"
-#include "mojo/public/cpp/system/handle.h"
-#include "mojo/public/cpp/system/message_pipe.h"
-
-#endif  // MOJO_PUBLIC_CPP_SYSTEM_CORE_H_
diff --git a/mojo/public/cpp/system/data_pipe.h b/mojo/public/cpp/system/data_pipe.h
deleted file mode 100644
index 0dbc3c7..0000000
--- a/mojo/public/cpp/system/data_pipe.h
+++ /dev/null
@@ -1,163 +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.
-
-// This file provides a C++ wrapping around the Mojo C API for data pipes,
-// replacing the prefix of "Mojo" with a "mojo" namespace, and using more
-// strongly-typed representations of |MojoHandle|s.
-//
-// Please see "mojo/public/c/system/data_pipe.h" for complete documentation of
-// the API.
-
-#ifndef MOJO_PUBLIC_CPP_SYSTEM_DATA_PIPE_H_
-#define MOJO_PUBLIC_CPP_SYSTEM_DATA_PIPE_H_
-
-#include <stdint.h>
-
-#include "base/compiler_specific.h"
-#include "base/logging.h"
-#include "mojo/public/c/system/data_pipe.h"
-#include "mojo/public/cpp/system/handle.h"
-
-namespace mojo {
-
-// A strongly-typed representation of a |MojoHandle| to the producer end of a
-// data pipe.
-class DataPipeProducerHandle : public Handle {
- public:
-  DataPipeProducerHandle() {}
-  explicit DataPipeProducerHandle(MojoHandle value) : Handle(value) {}
-
-  // Copying and assignment allowed.
-};
-
-static_assert(sizeof(DataPipeProducerHandle) == sizeof(Handle),
-              "Bad size for C++ DataPipeProducerHandle");
-
-typedef ScopedHandleBase<DataPipeProducerHandle> ScopedDataPipeProducerHandle;
-static_assert(sizeof(ScopedDataPipeProducerHandle) ==
-                  sizeof(DataPipeProducerHandle),
-              "Bad size for C++ ScopedDataPipeProducerHandle");
-
-// A strongly-typed representation of a |MojoHandle| to the consumer end of a
-// data pipe.
-class DataPipeConsumerHandle : public Handle {
- public:
-  DataPipeConsumerHandle() {}
-  explicit DataPipeConsumerHandle(MojoHandle value) : Handle(value) {}
-
-  // Copying and assignment allowed.
-};
-
-static_assert(sizeof(DataPipeConsumerHandle) == sizeof(Handle),
-              "Bad size for C++ DataPipeConsumerHandle");
-
-typedef ScopedHandleBase<DataPipeConsumerHandle> ScopedDataPipeConsumerHandle;
-static_assert(sizeof(ScopedDataPipeConsumerHandle) ==
-                  sizeof(DataPipeConsumerHandle),
-              "Bad size for C++ ScopedDataPipeConsumerHandle");
-
-// Creates a new data pipe. See |MojoCreateDataPipe()| for complete
-// documentation.
-inline MojoResult CreateDataPipe(
-    const MojoCreateDataPipeOptions* options,
-    ScopedDataPipeProducerHandle* data_pipe_producer,
-    ScopedDataPipeConsumerHandle* data_pipe_consumer) {
-  DCHECK(data_pipe_producer);
-  DCHECK(data_pipe_consumer);
-  DataPipeProducerHandle producer_handle;
-  DataPipeConsumerHandle consumer_handle;
-  MojoResult rv = MojoCreateDataPipe(options,
-                                     producer_handle.mutable_value(),
-                                     consumer_handle.mutable_value());
-  // Reset even on failure (reduces the chances that a "stale"/incorrect handle
-  // will be used).
-  data_pipe_producer->reset(producer_handle);
-  data_pipe_consumer->reset(consumer_handle);
-  return rv;
-}
-
-// Writes to a data pipe. See |MojoWriteData| for complete documentation.
-inline MojoResult WriteDataRaw(DataPipeProducerHandle data_pipe_producer,
-                               const void* elements,
-                               uint32_t* num_bytes,
-                               MojoWriteDataFlags flags) {
-  return MojoWriteData(data_pipe_producer.value(), elements, num_bytes, flags);
-}
-
-// Begins a two-phase write to a data pipe. See |MojoBeginWriteData()| for
-// complete documentation.
-inline MojoResult BeginWriteDataRaw(DataPipeProducerHandle data_pipe_producer,
-                                    void** buffer,
-                                    uint32_t* buffer_num_bytes,
-                                    MojoWriteDataFlags flags) {
-  return MojoBeginWriteData(
-      data_pipe_producer.value(), buffer, buffer_num_bytes, flags);
-}
-
-// Completes a two-phase write to a data pipe. See |MojoEndWriteData()| for
-// complete documentation.
-inline MojoResult EndWriteDataRaw(DataPipeProducerHandle data_pipe_producer,
-                                  uint32_t num_bytes_written) {
-  return MojoEndWriteData(data_pipe_producer.value(), num_bytes_written);
-}
-
-// Reads from a data pipe. See |MojoReadData()| for complete documentation.
-inline MojoResult ReadDataRaw(DataPipeConsumerHandle data_pipe_consumer,
-                              void* elements,
-                              uint32_t* num_bytes,
-                              MojoReadDataFlags flags) {
-  return MojoReadData(data_pipe_consumer.value(), elements, num_bytes, flags);
-}
-
-// Begins a two-phase read from a data pipe. See |MojoBeginReadData()| for
-// complete documentation.
-inline MojoResult BeginReadDataRaw(DataPipeConsumerHandle data_pipe_consumer,
-                                   const void** buffer,
-                                   uint32_t* buffer_num_bytes,
-                                   MojoReadDataFlags flags) {
-  return MojoBeginReadData(
-      data_pipe_consumer.value(), buffer, buffer_num_bytes, flags);
-}
-
-// Completes a two-phase read from a data pipe. See |MojoEndReadData()| for
-// complete documentation.
-inline MojoResult EndReadDataRaw(DataPipeConsumerHandle data_pipe_consumer,
-                                 uint32_t num_bytes_read) {
-  return MojoEndReadData(data_pipe_consumer.value(), num_bytes_read);
-}
-
-// A wrapper class that automatically creates a data pipe and owns both handles.
-// TODO(vtl): Make an even more friendly version? (Maybe templatized for a
-// particular type instead of some "element"? Maybe functions that take
-// vectors?)
-class DataPipe {
- public:
-  DataPipe();
-  explicit DataPipe(const MojoCreateDataPipeOptions& options);
-  ~DataPipe();
-
-  ScopedDataPipeProducerHandle producer_handle;
-  ScopedDataPipeConsumerHandle consumer_handle;
-};
-
-inline DataPipe::DataPipe() {
-  MojoResult result =
-      CreateDataPipe(nullptr, &producer_handle, &consumer_handle);
-  ALLOW_UNUSED_LOCAL(result);
-  DCHECK_EQ(MOJO_RESULT_OK, result);
-}
-
-inline DataPipe::DataPipe(const MojoCreateDataPipeOptions& options) {
-  MojoResult result =
-      CreateDataPipe(&options, &producer_handle, &consumer_handle);
-  ALLOW_UNUSED_LOCAL(result);
-  DCHECK_EQ(MOJO_RESULT_OK, result);
-}
-
-inline DataPipe::~DataPipe() {
-}
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_SYSTEM_DATA_PIPE_H_
diff --git a/mojo/public/cpp/system/functions.h b/mojo/public/cpp/system/functions.h
deleted file mode 100644
index 31edf57..0000000
--- a/mojo/public/cpp/system/functions.h
+++ /dev/null
@@ -1,26 +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.
-
-// This file provides a C++ wrapping around the standalone functions of the Mojo
-// C API, replacing the prefix of "Mojo" with a "mojo" namespace.
-//
-// Please see "mojo/public/c/system/functions.h" for complete documentation of
-// the API.
-
-#ifndef MOJO_PUBLIC_CPP_SYSTEM_FUNCTIONS_H_
-#define MOJO_PUBLIC_CPP_SYSTEM_FUNCTIONS_H_
-
-#include "mojo/public/c/system/functions.h"
-
-namespace mojo {
-
-// Returns the current |MojoTimeTicks| value. See |MojoGetTimeTicksNow()| for
-// complete documentation.
-inline MojoTimeTicks GetTimeTicksNow() {
-  return MojoGetTimeTicksNow();
-}
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_SYSTEM_FUNCTIONS_H_
diff --git a/mojo/public/cpp/system/handle.h b/mojo/public/cpp/system/handle.h
deleted file mode 100644
index 781944e..0000000
--- a/mojo/public/cpp/system/handle.h
+++ /dev/null
@@ -1,220 +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 MOJO_PUBLIC_CPP_SYSTEM_HANDLE_H_
-#define MOJO_PUBLIC_CPP_SYSTEM_HANDLE_H_
-
-#include <stdint.h>
-#include <limits>
-
-#include "base/compiler_specific.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "mojo/public/c/system/functions.h"
-#include "mojo/public/c/system/types.h"
-#include "mojo/public/cpp/system/handle_signals_state.h"
-
-namespace mojo {
-
-// OVERVIEW
-//
-// |Handle| and |...Handle|:
-//
-// |Handle| is a simple, copyable wrapper for the C type |MojoHandle| (which is
-// just an integer). Its purpose is to increase type-safety, not provide
-// lifetime management. For the same purpose, we have trivial *subclasses* of
-// |Handle|, e.g., |MessagePipeHandle| and |DataPipeProducerHandle|. |Handle|
-// and its subclasses impose *no* extra overhead over using |MojoHandle|s
-// directly.
-//
-// Note that though we provide constructors for |Handle|/|...Handle| from a
-// |MojoHandle|, we do not provide, e.g., a constructor for |MessagePipeHandle|
-// from a |Handle|. This is for type safety: If we did, you'd then be able to
-// construct a |MessagePipeHandle| from, e.g., a |DataPipeProducerHandle| (since
-// it's a |Handle|).
-//
-// |ScopedHandleBase| and |Scoped...Handle|:
-//
-// |ScopedHandleBase<HandleType>| is a templated scoped wrapper, for the handle
-// types above (in the same sense that a C++11 |unique_ptr<T>| is a scoped
-// wrapper for a |T*|). It provides lifetime management, closing its owned
-// handle on destruction. It also provides (emulated) move semantics, again
-// along the lines of C++11's |unique_ptr| (and exactly like Chromium's
-// |scoped_ptr|).
-//
-// |ScopedHandle| is just (a typedef of) a |ScopedHandleBase<Handle>|.
-// Similarly, |ScopedMessagePipeHandle| is just a
-// |ScopedHandleBase<MessagePipeHandle>|. Etc. Note that a
-// |ScopedMessagePipeHandle| is *not* a (subclass of) |ScopedHandle|.
-//
-// Wrapper functions:
-//
-// We provide simple wrappers for the |Mojo...()| functions (in
-// mojo/public/c/system/core.h -- see that file for details on individual
-// functions).
-//
-// The general guideline is functions that imply ownership transfer of a handle
-// should take (or produce) an appropriate |Scoped...Handle|, while those that
-// don't take a |...Handle|. For example, |CreateMessagePipe()| has two
-// |ScopedMessagePipe| "out" parameters, whereas |Wait()| and |WaitMany()| take
-// |Handle| parameters. Some, have both: e.g., |DuplicatedBuffer()| takes a
-// suitable (unscoped) handle (e.g., |SharedBufferHandle|) "in" parameter and
-// produces a suitable scoped handle (e.g., |ScopedSharedBufferHandle| a.k.a.
-// |ScopedHandleBase<SharedBufferHandle>|) as an "out" parameter.
-//
-// An exception are some of the |...Raw()| functions. E.g., |CloseRaw()| takes a
-// |Handle|, leaving the user to discard the wrapper.
-//
-// ScopedHandleBase ------------------------------------------------------------
-
-// Scoper for the actual handle types defined further below. It's move-only,
-// like the C++11 |unique_ptr|.
-template <class HandleType>
-class ScopedHandleBase {
- public:
-  using RawHandleType = HandleType;
-
-  ScopedHandleBase() {}
-  explicit ScopedHandleBase(HandleType handle) : handle_(handle) {}
-  ~ScopedHandleBase() { CloseIfNecessary(); }
-
-  template <class CompatibleHandleType>
-  explicit ScopedHandleBase(ScopedHandleBase<CompatibleHandleType> other)
-      : handle_(other.release()) {}
-
-  // Move-only constructor and operator=.
-  ScopedHandleBase(ScopedHandleBase&& other) : handle_(other.release()) {}
-  ScopedHandleBase& operator=(ScopedHandleBase&& other) {
-    if (&other != this) {
-      CloseIfNecessary();
-      handle_ = other.release();
-    }
-    return *this;
-  }
-
-  const HandleType& get() const { return handle_; }
-  const HandleType* operator->() const { return &handle_; }
-
-  template <typename PassedHandleType>
-  static ScopedHandleBase<HandleType> From(
-      ScopedHandleBase<PassedHandleType> other) {
-    static_assert(
-        sizeof(static_cast<PassedHandleType*>(static_cast<HandleType*>(0))),
-        "HandleType is not a subtype of PassedHandleType");
-    return ScopedHandleBase<HandleType>(
-        static_cast<HandleType>(other.release().value()));
-  }
-
-  void swap(ScopedHandleBase& other) { handle_.swap(other.handle_); }
-
-  HandleType release() WARN_UNUSED_RESULT {
-    HandleType rv;
-    rv.swap(handle_);
-    return rv;
-  }
-
-  void reset(HandleType handle = HandleType()) {
-    CloseIfNecessary();
-    handle_ = handle;
-  }
-
-  bool is_valid() const { return handle_.is_valid(); }
-
-  bool operator==(const ScopedHandleBase& other) const {
-    return handle_.value() == other.get().value();
-  }
-
- private:
-  void CloseIfNecessary() {
-    if (handle_.is_valid())
-      handle_.Close();
-  }
-
-  HandleType handle_;
-
-  DISALLOW_COPY_AND_ASSIGN(ScopedHandleBase);
-};
-
-template <typename HandleType>
-inline ScopedHandleBase<HandleType> MakeScopedHandle(HandleType handle) {
-  return ScopedHandleBase<HandleType>(handle);
-}
-
-// Handle ----------------------------------------------------------------------
-
-const MojoHandle kInvalidHandleValue = MOJO_HANDLE_INVALID;
-
-// Wrapper base class for |MojoHandle|.
-class Handle {
- public:
-  Handle() : value_(kInvalidHandleValue) {}
-  explicit Handle(MojoHandle value) : value_(value) {}
-  ~Handle() {}
-
-  void swap(Handle& other) {
-    MojoHandle temp = value_;
-    value_ = other.value_;
-    other.value_ = temp;
-  }
-
-  bool is_valid() const { return value_ != kInvalidHandleValue; }
-
-  const MojoHandle& value() const { return value_; }
-  MojoHandle* mutable_value() { return &value_; }
-  void set_value(MojoHandle value) { value_ = value; }
-
-  void Close() {
-    DCHECK(is_valid());
-    MojoResult result = MojoClose(value_);
-    ALLOW_UNUSED_LOCAL(result);
-    DCHECK_EQ(MOJO_RESULT_OK, result);
-  }
-
-  HandleSignalsState QuerySignalsState() const {
-    HandleSignalsState signals_state;
-    MojoResult result = MojoQueryHandleSignalsState(
-        value_, static_cast<MojoHandleSignalsState*>(&signals_state));
-    DCHECK_EQ(MOJO_RESULT_OK, result);
-    return signals_state;
-  }
-
- private:
-  MojoHandle value_;
-
-  // Copying and assignment allowed.
-};
-
-// Should have zero overhead.
-static_assert(sizeof(Handle) == sizeof(MojoHandle), "Bad size for C++ Handle");
-
-// The scoper should also impose no more overhead.
-typedef ScopedHandleBase<Handle> ScopedHandle;
-static_assert(sizeof(ScopedHandle) == sizeof(Handle),
-              "Bad size for C++ ScopedHandle");
-
-// |Close()| takes ownership of the handle, since it'll invalidate it.
-// Note: There's nothing to do, since the argument will be destroyed when it
-// goes out of scope.
-template <class HandleType>
-inline void Close(ScopedHandleBase<HandleType> /*handle*/) {
-}
-
-// Most users should typically use |Close()| (above) instead.
-inline MojoResult CloseRaw(Handle handle) {
-  return MojoClose(handle.value());
-}
-
-// Strict weak ordering, so that |Handle|s can be used as keys in |std::map|s,
-inline bool operator<(const Handle a, const Handle b) {
-  return a.value() < b.value();
-}
-
-// Comparison, so that |Handle|s can be used as keys in hash maps.
-inline bool operator==(const Handle a, const Handle b) {
-  return a.value() == b.value();
-}
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_SYSTEM_HANDLE_H_
diff --git a/mojo/public/cpp/system/handle_signals_state.h b/mojo/public/cpp/system/handle_signals_state.h
deleted file mode 100644
index 9e2430f..0000000
--- a/mojo/public/cpp/system/handle_signals_state.h
+++ /dev/null
@@ -1,83 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_SYSTEM_HANDLE_SIGNALS_STATE_H_
-#define MOJO_PUBLIC_CPP_SYSTEM_HANDLE_SIGNALS_STATE_H_
-
-#include "mojo/public/c/system/types.h"
-#include "mojo/public/cpp/system/system_export.h"
-
-namespace mojo {
-
-// A convenience wrapper around the MojoHandleSignalsState struct.
-struct MOJO_CPP_SYSTEM_EXPORT HandleSignalsState final
-    : public MojoHandleSignalsState {
-  HandleSignalsState() {
-    satisfied_signals = MOJO_HANDLE_SIGNAL_NONE;
-    satisfiable_signals = MOJO_HANDLE_SIGNAL_NONE;
-  }
-
-  HandleSignalsState(MojoHandleSignals satisfied,
-                     MojoHandleSignals satisfiable) {
-    satisfied_signals = satisfied;
-    satisfiable_signals = satisfiable;
-  }
-
-  bool operator==(const HandleSignalsState& other) const {
-    return satisfied_signals == other.satisfied_signals &&
-           satisfiable_signals == other.satisfiable_signals;
-  }
-
-  // TODO(rockot): Remove this in favor of operator==.
-  bool equals(const HandleSignalsState& other) const {
-    return satisfied_signals == other.satisfied_signals &&
-           satisfiable_signals == other.satisfiable_signals;
-  }
-
-  bool satisfies(MojoHandleSignals signals) const {
-    return !!(satisfied_signals & signals);
-  }
-
-  bool can_satisfy(MojoHandleSignals signals) const {
-    return !!(satisfiable_signals & signals);
-  }
-
-  // The handle is currently readable. May apply to a message pipe handle or
-  // data pipe consumer handle.
-  bool readable() const { return satisfies(MOJO_HANDLE_SIGNAL_READABLE); }
-
-  // The handle is currently writable. May apply to a message pipe handle or
-  // data pipe producer handle.
-  bool writable() const { return satisfies(MOJO_HANDLE_SIGNAL_WRITABLE); }
-
-  // The handle's peer is closed. May apply to any message pipe or data pipe
-  // handle.
-  bool peer_closed() const { return satisfies(MOJO_HANDLE_SIGNAL_PEER_CLOSED); }
-
-  // The handle will never be |readable()| again.
-  bool never_readable() const {
-    return !can_satisfy(MOJO_HANDLE_SIGNAL_READABLE);
-  }
-
-  // The handle will never be |writable()| again.
-  bool never_writable() const {
-    return !can_satisfy(MOJO_HANDLE_SIGNAL_WRITABLE);
-  }
-
-  // The handle can never indicate |peer_closed()|. Never true for message pipe
-  // or data pipe handles (they can always signal peer closure), but always true
-  // for other types of handles (they have no peer.)
-  bool never_peer_closed() const {
-    return !can_satisfy(MOJO_HANDLE_SIGNAL_PEER_CLOSED);
-  }
-
-  // (Copy and assignment allowed.)
-};
-
-static_assert(sizeof(HandleSignalsState) == sizeof(MojoHandleSignalsState),
-              "HandleSignalsState should add no overhead");
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_SYSTEM_HANDLE_SIGNALS_STATE_H_
diff --git a/mojo/public/cpp/system/message.cc b/mojo/public/cpp/system/message.cc
deleted file mode 100644
index 09d8d46..0000000
--- a/mojo/public/cpp/system/message.cc
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/system/message.h"
-
-namespace mojo {
-
-ScopedMessageHandle::~ScopedMessageHandle() {
-
-}
-
-}  // namespace mojo
diff --git a/mojo/public/cpp/system/message.h b/mojo/public/cpp/system/message.h
deleted file mode 100644
index d4406ee..0000000
--- a/mojo/public/cpp/system/message.h
+++ /dev/null
@@ -1,83 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_SYSTEM_MESSAGE_H_
-#define MOJO_PUBLIC_CPP_SYSTEM_MESSAGE_H_
-
-#include <limits>
-
-#include "base/macros.h"
-#include "base/strings/string_piece.h"
-#include "mojo/public/c/system/message_pipe.h"
-#include "mojo/public/cpp/system/handle.h"
-
-namespace mojo {
-
-const MojoMessageHandle kInvalidMessageHandleValue =
-    MOJO_MESSAGE_HANDLE_INVALID;
-
-// Handle wrapper base class for a |MojoMessageHandle|.
-class MessageHandle {
- public:
-  MessageHandle() : value_(kInvalidMessageHandleValue) {}
-  explicit MessageHandle(MojoMessageHandle value) : value_(value) {}
-  ~MessageHandle() {}
-
-  void swap(MessageHandle& other) {
-    MojoMessageHandle temp = value_;
-    value_ = other.value_;
-    other.value_ = temp;
-  }
-
-  bool is_valid() const { return value_ != kInvalidMessageHandleValue; }
-
-  const MojoMessageHandle& value() const { return value_; }
-  MojoMessageHandle* mutable_value() { return &value_; }
-  void set_value(MojoMessageHandle value) { value_ = value; }
-
-  void Close() {
-    DCHECK(is_valid());
-    MojoResult result = MojoFreeMessage(value_);
-    ALLOW_UNUSED_LOCAL(result);
-    DCHECK_EQ(MOJO_RESULT_OK, result);
-  }
-
- private:
-  MojoMessageHandle value_;
-};
-
-using ScopedMessageHandle = ScopedHandleBase<MessageHandle>;
-
-inline MojoResult AllocMessage(size_t num_bytes,
-                               const MojoHandle* handles,
-                               size_t num_handles,
-                               MojoAllocMessageFlags flags,
-                               ScopedMessageHandle* handle) {
-  DCHECK_LE(num_bytes, std::numeric_limits<uint32_t>::max());
-  DCHECK_LE(num_handles, std::numeric_limits<uint32_t>::max());
-  MojoMessageHandle raw_handle;
-  MojoResult rv = MojoAllocMessage(static_cast<uint32_t>(num_bytes), handles,
-                                   static_cast<uint32_t>(num_handles), flags,
-                                   &raw_handle);
-  if (rv != MOJO_RESULT_OK)
-    return rv;
-
-  handle->reset(MessageHandle(raw_handle));
-  return MOJO_RESULT_OK;
-}
-
-inline MojoResult GetMessageBuffer(MessageHandle message, void** buffer) {
-  DCHECK(message.is_valid());
-  return MojoGetMessageBuffer(message.value(), buffer);
-}
-
-inline MojoResult NotifyBadMessage(MessageHandle message,
-                                   const base::StringPiece& error) {
-  DCHECK(message.is_valid());
-  return MojoNotifyBadMessage(message.value(), error.data(), error.size());
-}
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_SYSTEM_MESSAGE_H_
diff --git a/mojo/public/cpp/system/message_pipe.h b/mojo/public/cpp/system/message_pipe.h
deleted file mode 100644
index 7fbe43f..0000000
--- a/mojo/public/cpp/system/message_pipe.h
+++ /dev/null
@@ -1,158 +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.
-
-// This file provides a C++ wrapping around the Mojo C API for message pipes,
-// replacing the prefix of "Mojo" with a "mojo" namespace, and using more
-// strongly-typed representations of |MojoHandle|s.
-//
-// Please see "mojo/public/c/system/message_pipe.h" for complete documentation
-// of the API.
-
-#ifndef MOJO_PUBLIC_CPP_SYSTEM_MESSAGE_PIPE_H_
-#define MOJO_PUBLIC_CPP_SYSTEM_MESSAGE_PIPE_H_
-
-#include <stdint.h>
-
-#include "base/compiler_specific.h"
-#include "base/logging.h"
-#include "mojo/public/c/system/message_pipe.h"
-#include "mojo/public/cpp/system/handle.h"
-#include "mojo/public/cpp/system/message.h"
-
-namespace mojo {
-
-// A strongly-typed representation of a |MojoHandle| to one end of a message
-// pipe.
-class MessagePipeHandle : public Handle {
- public:
-  MessagePipeHandle() {}
-  explicit MessagePipeHandle(MojoHandle value) : Handle(value) {}
-
-  // Copying and assignment allowed.
-};
-
-static_assert(sizeof(MessagePipeHandle) == sizeof(Handle),
-              "Bad size for C++ MessagePipeHandle");
-
-typedef ScopedHandleBase<MessagePipeHandle> ScopedMessagePipeHandle;
-static_assert(sizeof(ScopedMessagePipeHandle) == sizeof(MessagePipeHandle),
-              "Bad size for C++ ScopedMessagePipeHandle");
-
-// Creates a message pipe. See |MojoCreateMessagePipe()| for complete
-// documentation.
-inline MojoResult CreateMessagePipe(const MojoCreateMessagePipeOptions* options,
-                                    ScopedMessagePipeHandle* message_pipe0,
-                                    ScopedMessagePipeHandle* message_pipe1) {
-  DCHECK(message_pipe0);
-  DCHECK(message_pipe1);
-  MessagePipeHandle handle0;
-  MessagePipeHandle handle1;
-  MojoResult rv = MojoCreateMessagePipe(
-      options, handle0.mutable_value(), handle1.mutable_value());
-  // Reset even on failure (reduces the chances that a "stale"/incorrect handle
-  // will be used).
-  message_pipe0->reset(handle0);
-  message_pipe1->reset(handle1);
-  return rv;
-}
-
-// The following "...Raw" versions fully expose the underlying API, and don't
-// help with ownership of handles (especially when writing messages). It is
-// expected that in most cases these methods will be called through generated
-// bindings anyway.
-// TODO(vtl): Write friendlier versions of these functions (using scoped
-// handles and/or vectors) if there is a demonstrated need for them.
-
-// Writes to a message pipe.  If handles are attached, on success the handles
-// will no longer be valid (the receiver will receive equivalent, but logically
-// different, handles). See |MojoWriteMessage()| for complete documentation.
-inline MojoResult WriteMessageRaw(MessagePipeHandle message_pipe,
-                                  const void* bytes,
-                                  uint32_t num_bytes,
-                                  const MojoHandle* handles,
-                                  uint32_t num_handles,
-                                  MojoWriteMessageFlags flags) {
-  return MojoWriteMessage(
-      message_pipe.value(), bytes, num_bytes, handles, num_handles, flags);
-}
-
-// Reads from a message pipe. See |MojoReadMessage()| for complete
-// documentation.
-inline MojoResult ReadMessageRaw(MessagePipeHandle message_pipe,
-                                 void* bytes,
-                                 uint32_t* num_bytes,
-                                 MojoHandle* handles,
-                                 uint32_t* num_handles,
-                                 MojoReadMessageFlags flags) {
-  return MojoReadMessage(
-      message_pipe.value(), bytes, num_bytes, handles, num_handles, flags);
-}
-
-// Writes to a message pipe. Takes ownership of |message| and any attached
-// handles.
-inline MojoResult WriteMessageNew(MessagePipeHandle message_pipe,
-                                  ScopedMessageHandle message,
-                                  MojoWriteMessageFlags flags) {
-  return MojoWriteMessageNew(
-      message_pipe.value(), message.release().value(), flags);
-}
-
-// Reads from a message pipe. See |MojoReadMessageNew()| for complete
-// documentation.
-inline MojoResult ReadMessageNew(MessagePipeHandle message_pipe,
-                                 ScopedMessageHandle* message,
-                                 uint32_t* num_bytes,
-                                 MojoHandle* handles,
-                                 uint32_t* num_handles,
-                                 MojoReadMessageFlags flags) {
-  MojoMessageHandle raw_message;
-  MojoResult rv = MojoReadMessageNew(message_pipe.value(), &raw_message,
-                                     num_bytes, handles, num_handles, flags);
-  if (rv != MOJO_RESULT_OK)
-    return rv;
-
-  message->reset(MessageHandle(raw_message));
-  return MOJO_RESULT_OK;
-}
-
-// Fuses two message pipes together at the given handles. See
-// |MojoFuseMessagePipes()| for complete documentation.
-inline MojoResult FuseMessagePipes(ScopedMessagePipeHandle message_pipe0,
-                                   ScopedMessagePipeHandle message_pipe1) {
-  return MojoFuseMessagePipes(message_pipe0.release().value(),
-                              message_pipe1.release().value());
-}
-
-// A wrapper class that automatically creates a message pipe and owns both
-// handles.
-class MessagePipe {
- public:
-  MessagePipe();
-  explicit MessagePipe(const MojoCreateMessagePipeOptions& options);
-  ~MessagePipe();
-
-  ScopedMessagePipeHandle handle0;
-  ScopedMessagePipeHandle handle1;
-};
-
-inline MessagePipe::MessagePipe() {
-  MojoResult result = CreateMessagePipe(nullptr, &handle0, &handle1);
-  DCHECK_EQ(MOJO_RESULT_OK, result);
-  DCHECK(handle0.is_valid());
-  DCHECK(handle1.is_valid());
-}
-
-inline MessagePipe::MessagePipe(const MojoCreateMessagePipeOptions& options) {
-  MojoResult result = CreateMessagePipe(&options, &handle0, &handle1);
-  DCHECK_EQ(MOJO_RESULT_OK, result);
-  DCHECK(handle0.is_valid());
-  DCHECK(handle1.is_valid());
-}
-
-inline MessagePipe::~MessagePipe() {
-}
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_SYSTEM_MESSAGE_PIPE_H_
diff --git a/mojo/public/cpp/system/platform_handle.cc b/mojo/public/cpp/system/platform_handle.cc
deleted file mode 100644
index 42e4aba..0000000
--- a/mojo/public/cpp/system/platform_handle.cc
+++ /dev/null
@@ -1,178 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/system/platform_handle.h"
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-#include <mach/mach.h>
-#include "base/mac/mach_logging.h"
-#endif
-
-namespace mojo {
-
-namespace {
-
-uint64_t PlatformHandleValueFromPlatformFile(base::PlatformFile file) {
-#if defined(OS_WIN)
-  return reinterpret_cast<uint64_t>(file);
-#else
-  return static_cast<uint64_t>(file);
-#endif
-}
-
-base::PlatformFile PlatformFileFromPlatformHandleValue(uint64_t value) {
-#if defined(OS_WIN)
-  return reinterpret_cast<base::PlatformFile>(value);
-#else
-  return static_cast<base::PlatformFile>(value);
-#endif
-}
-
-}  // namespace
-
-ScopedHandle WrapPlatformFile(base::PlatformFile platform_file) {
-  MojoPlatformHandle platform_handle;
-  platform_handle.struct_size = sizeof(MojoPlatformHandle);
-  platform_handle.type = kPlatformFileHandleType;
-  platform_handle.value = PlatformHandleValueFromPlatformFile(platform_file);
-
-  MojoHandle mojo_handle;
-  MojoResult result = MojoWrapPlatformHandle(&platform_handle, &mojo_handle);
-  CHECK_EQ(result, MOJO_RESULT_OK);
-
-  return ScopedHandle(Handle(mojo_handle));
-}
-
-MojoResult UnwrapPlatformFile(ScopedHandle handle, base::PlatformFile* file) {
-  MojoPlatformHandle platform_handle;
-  platform_handle.struct_size = sizeof(MojoPlatformHandle);
-  MojoResult result = MojoUnwrapPlatformHandle(handle.release().value(),
-                                               &platform_handle);
-  if (result != MOJO_RESULT_OK)
-    return result;
-
-  if (platform_handle.type == MOJO_PLATFORM_HANDLE_TYPE_INVALID) {
-    *file = base::kInvalidPlatformFile;
-  } else {
-    CHECK_EQ(platform_handle.type, kPlatformFileHandleType);
-    *file = PlatformFileFromPlatformHandleValue(platform_handle.value);
-  }
-
-  return MOJO_RESULT_OK;
-}
-
-ScopedSharedBufferHandle WrapSharedMemoryHandle(
-    const base::SharedMemoryHandle& memory_handle,
-    size_t size,
-    bool read_only) {
-#if defined(OS_POSIX) && !(defined(OS_MACOSX) && !defined(OS_IOS))
-  if (memory_handle.fd == base::kInvalidPlatformFile)
-    return ScopedSharedBufferHandle();
-#else
-  if (!memory_handle.IsValid())
-    return ScopedSharedBufferHandle();
-#endif
-  MojoPlatformHandle platform_handle;
-  platform_handle.struct_size = sizeof(MojoPlatformHandle);
-  platform_handle.type = kPlatformSharedBufferHandleType;
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-  platform_handle.value =
-      static_cast<uint64_t>(memory_handle.GetMemoryObject());
-#elif defined(OS_POSIX)
-  platform_handle.value = PlatformHandleValueFromPlatformFile(memory_handle.fd);
-#elif defined(OS_WIN)
-  platform_handle.value =
-      PlatformHandleValueFromPlatformFile(memory_handle.GetHandle());
-#endif
-
-  MojoPlatformSharedBufferHandleFlags flags =
-      MOJO_PLATFORM_SHARED_BUFFER_HANDLE_FLAG_NONE;
-  if (read_only)
-    flags |= MOJO_PLATFORM_SHARED_BUFFER_HANDLE_FLAG_READ_ONLY;
-
-  MojoHandle mojo_handle;
-  MojoResult result = MojoWrapPlatformSharedBufferHandle(
-      &platform_handle, size, flags, &mojo_handle);
-  CHECK_EQ(result, MOJO_RESULT_OK);
-
-  return ScopedSharedBufferHandle(SharedBufferHandle(mojo_handle));
-}
-
-MojoResult UnwrapSharedMemoryHandle(ScopedSharedBufferHandle handle,
-                                    base::SharedMemoryHandle* memory_handle,
-                                    size_t* size,
-                                    bool* read_only) {
-  if (!handle.is_valid())
-    return MOJO_RESULT_INVALID_ARGUMENT;
-  MojoPlatformHandle platform_handle;
-  platform_handle.struct_size = sizeof(MojoPlatformHandle);
-
-  MojoPlatformSharedBufferHandleFlags flags;
-  size_t num_bytes;
-  MojoResult result = MojoUnwrapPlatformSharedBufferHandle(
-      handle.release().value(), &platform_handle, &num_bytes, &flags);
-  if (result != MOJO_RESULT_OK)
-    return result;
-
-  if (size)
-    *size = num_bytes;
-
-  if (read_only)
-    *read_only = flags & MOJO_PLATFORM_SHARED_BUFFER_HANDLE_FLAG_READ_ONLY;
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-  CHECK_EQ(platform_handle.type, MOJO_PLATFORM_HANDLE_TYPE_MACH_PORT);
-  *memory_handle = base::SharedMemoryHandle(
-      static_cast<mach_port_t>(platform_handle.value), num_bytes,
-      base::GetCurrentProcId());
-#elif defined(OS_POSIX)
-  CHECK_EQ(platform_handle.type, MOJO_PLATFORM_HANDLE_TYPE_FILE_DESCRIPTOR);
-  *memory_handle = base::SharedMemoryHandle(
-      static_cast<int>(platform_handle.value), false);
-#elif defined(OS_WIN)
-  CHECK_EQ(platform_handle.type, MOJO_PLATFORM_HANDLE_TYPE_WINDOWS_HANDLE);
-  *memory_handle = base::SharedMemoryHandle(
-      reinterpret_cast<HANDLE>(platform_handle.value),
-      base::GetCurrentProcId());
-#endif
-
-  return MOJO_RESULT_OK;
-}
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-ScopedHandle WrapMachPort(mach_port_t port) {
-  kern_return_t kr =
-      mach_port_mod_refs(mach_task_self(), port, MACH_PORT_RIGHT_SEND, 1);
-  MACH_LOG_IF(ERROR, kr != KERN_SUCCESS, kr)
-      << "MachPortAttachmentMac mach_port_mod_refs";
-  if (kr != KERN_SUCCESS)
-    return ScopedHandle();
-
-  MojoPlatformHandle platform_handle;
-  platform_handle.struct_size = sizeof(MojoPlatformHandle);
-  platform_handle.type = MOJO_PLATFORM_HANDLE_TYPE_MACH_PORT;
-  platform_handle.value = static_cast<uint64_t>(port);
-
-  MojoHandle mojo_handle;
-  MojoResult result = MojoWrapPlatformHandle(&platform_handle, &mojo_handle);
-  CHECK_EQ(result, MOJO_RESULT_OK);
-
-  return ScopedHandle(Handle(mojo_handle));
-}
-
-MojoResult UnwrapMachPort(ScopedHandle handle, mach_port_t* port) {
-  MojoPlatformHandle platform_handle;
-  platform_handle.struct_size = sizeof(MojoPlatformHandle);
-  MojoResult result =
-      MojoUnwrapPlatformHandle(handle.release().value(), &platform_handle);
-  if (result != MOJO_RESULT_OK)
-    return result;
-
-  CHECK_EQ(platform_handle.type, MOJO_PLATFORM_HANDLE_TYPE_MACH_PORT);
-  *port = static_cast<mach_port_t>(platform_handle.value);
-  return MOJO_RESULT_OK;
-}
-#endif  // defined(OS_MACOSX) && !defined(OS_IOS)
-
-}  // namespace mojo
diff --git a/mojo/public/cpp/system/platform_handle.h b/mojo/public/cpp/system/platform_handle.h
deleted file mode 100644
index 801264e..0000000
--- a/mojo/public/cpp/system/platform_handle.h
+++ /dev/null
@@ -1,92 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// This file provides a C++ wrapping around the Mojo C API for platform handles,
-// replacing the prefix of "Mojo" with a "mojo" namespace.
-//
-// Please see "mojo/public/c/system/platform_handle.h" for complete
-// documentation of the API.
-
-#ifndef MOJO_PUBLIC_CPP_SYSTEM_PLATFORM_HANDLE_H_
-#define MOJO_PUBLIC_CPP_SYSTEM_PLATFORM_HANDLE_H_
-
-#include <stdint.h>
-
-#include "base/compiler_specific.h"
-#include "base/files/file.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/memory/shared_memory_handle.h"
-#include "base/process/process_handle.h"
-#include "mojo/public/c/system/platform_handle.h"
-#include "mojo/public/cpp/system/buffer.h"
-#include "mojo/public/cpp/system/handle.h"
-#include "mojo/public/cpp/system/system_export.h"
-
-#if defined(OS_WIN)
-#include <windows.h>
-#endif
-
-namespace mojo {
-
-#if defined(OS_POSIX)
-const MojoPlatformHandleType kPlatformFileHandleType =
-    MOJO_PLATFORM_HANDLE_TYPE_FILE_DESCRIPTOR;
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-const MojoPlatformHandleType kPlatformSharedBufferHandleType =
-    MOJO_PLATFORM_HANDLE_TYPE_MACH_PORT;
-#else
-const MojoPlatformHandleType kPlatformSharedBufferHandleType =
-    MOJO_PLATFORM_HANDLE_TYPE_FILE_DESCRIPTOR;
-#endif  // defined(OS_MACOSX) && !defined(OS_IOS)
-
-#elif defined(OS_WIN)
-const MojoPlatformHandleType kPlatformFileHandleType =
-    MOJO_PLATFORM_HANDLE_TYPE_WINDOWS_HANDLE;
-
-const MojoPlatformHandleType kPlatformSharedBufferHandleType =
-    MOJO_PLATFORM_HANDLE_TYPE_WINDOWS_HANDLE;
-#endif  // defined(OS_POSIX)
-
-// Wraps a PlatformFile as a Mojo handle. Takes ownership of the file object.
-MOJO_CPP_SYSTEM_EXPORT
-ScopedHandle WrapPlatformFile(base::PlatformFile platform_file);
-
-// Unwraps a PlatformFile from a Mojo handle.
-MOJO_CPP_SYSTEM_EXPORT
-MojoResult UnwrapPlatformFile(ScopedHandle handle, base::PlatformFile* file);
-
-// Wraps a base::SharedMemoryHandle as a Mojo handle. Takes ownership of the
-// SharedMemoryHandle. Note that |read_only| is only an indicator of whether
-// |memory_handle| only supports read-only mapping. It does NOT have any
-// influence on the access control of the shared buffer object.
-MOJO_CPP_SYSTEM_EXPORT
-ScopedSharedBufferHandle WrapSharedMemoryHandle(
-    const base::SharedMemoryHandle& memory_handle,
-    size_t size,
-    bool read_only);
-
-// Unwraps a base::SharedMemoryHandle from a Mojo handle. The caller assumes
-// responsibility for the lifetime of the SharedMemoryHandle.
-MOJO_CPP_SYSTEM_EXPORT MojoResult
-UnwrapSharedMemoryHandle(ScopedSharedBufferHandle handle,
-                         base::SharedMemoryHandle* memory_handle,
-                         size_t* size,
-                         bool* read_only);
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-// Wraps a mach_port_t as a Mojo handle. This takes a reference to the
-// Mach port.
-MOJO_CPP_SYSTEM_EXPORT ScopedHandle WrapMachPort(mach_port_t port);
-
-// Unwraps a mach_port_t from a Mojo handle. The caller gets ownership of the
-// Mach port.
-MOJO_CPP_SYSTEM_EXPORT MojoResult UnwrapMachPort(ScopedHandle handle,
-                                                 mach_port_t* port);
-#endif  // defined(OS_MACOSX) && !defined(OS_IOS)
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_SYSTEM_PLATFORM_HANDLE_H_
diff --git a/mojo/public/cpp/system/simple_watcher.cc b/mojo/public/cpp/system/simple_watcher.cc
deleted file mode 100644
index ae96faa..0000000
--- a/mojo/public/cpp/system/simple_watcher.cc
+++ /dev/null
@@ -1,279 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/system/simple_watcher.h"
-
-#include "base/bind.h"
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "base/single_thread_task_runner.h"
-#include "base/synchronization/lock.h"
-#include "base/trace_event/heap_profiler.h"
-#include "mojo/public/c/system/watcher.h"
-
-namespace mojo {
-
-// Thread-safe Context object used to dispatch watch notifications from a
-// arbitrary threads.
-class SimpleWatcher::Context : public base::RefCountedThreadSafe<Context> {
- public:
-  // Creates a |Context| instance for a new watch on |watcher|, to watch
-  // |handle| for |signals|.
-  static scoped_refptr<Context> Create(
-      base::WeakPtr<SimpleWatcher> watcher,
-      scoped_refptr<base::SingleThreadTaskRunner> task_runner,
-      WatcherHandle watcher_handle,
-      Handle handle,
-      MojoHandleSignals signals,
-      int watch_id,
-      MojoResult* watch_result) {
-    scoped_refptr<Context> context =
-        new Context(watcher, task_runner, watch_id);
-
-    // If MojoWatch succeeds, it assumes ownership of a reference to |context|.
-    // In that case, this reference is balanced in CallNotify() when |result| is
-    // |MOJO_RESULT_CANCELLED|.
-    context->AddRef();
-
-    *watch_result = MojoWatch(watcher_handle.value(), handle.value(), signals,
-                              context->value());
-    if (*watch_result != MOJO_RESULT_OK) {
-      // Balanced by the AddRef() above since watching failed.
-      context->Release();
-      return nullptr;
-    }
-
-    return context;
-  }
-
-  static void CallNotify(uintptr_t context_value,
-                         MojoResult result,
-                         MojoHandleSignalsState signals_state,
-                         MojoWatcherNotificationFlags flags) {
-    auto* context = reinterpret_cast<Context*>(context_value);
-    context->Notify(result, signals_state, flags);
-
-    // That was the last notification for the context. We can release the ref
-    // owned by the watch, which may in turn delete the Context.
-    if (result == MOJO_RESULT_CANCELLED)
-      context->Release();
-  }
-
-  uintptr_t value() const { return reinterpret_cast<uintptr_t>(this); }
-
-  void DisableCancellationNotifications() {
-    base::AutoLock lock(lock_);
-    enable_cancellation_notifications_ = false;
-  }
-
- private:
-  friend class base::RefCountedThreadSafe<Context>;
-
-  Context(base::WeakPtr<SimpleWatcher> weak_watcher,
-          scoped_refptr<base::SingleThreadTaskRunner> task_runner,
-          int watch_id)
-      : weak_watcher_(weak_watcher),
-        task_runner_(task_runner),
-        watch_id_(watch_id) {}
-  ~Context() {}
-
-  void Notify(MojoResult result,
-              MojoHandleSignalsState signals_state,
-              MojoWatcherNotificationFlags flags) {
-    if (result == MOJO_RESULT_CANCELLED) {
-      // The SimpleWatcher may have explicitly cancelled this watch, so we don't
-      // bother dispatching the notification - it would be ignored anyway.
-      //
-      // TODO(rockot): This shouldn't really be necessary, but there are already
-      // instances today where bindings object may be bound and subsequently
-      // closed due to pipe error, all before the thread's TaskRunner has been
-      // properly initialized.
-      base::AutoLock lock(lock_);
-      if (!enable_cancellation_notifications_)
-        return;
-    }
-
-    if ((flags & MOJO_WATCHER_NOTIFICATION_FLAG_FROM_SYSTEM) &&
-        task_runner_->RunsTasksOnCurrentThread() && weak_watcher_ &&
-        weak_watcher_->is_default_task_runner_) {
-      // System notifications will trigger from the task runner passed to
-      // mojo::edk::InitIPCSupport(). In Chrome this happens to always be the
-      // default task runner for the IO thread.
-      weak_watcher_->OnHandleReady(watch_id_, result);
-    } else {
-      task_runner_->PostTask(
-          FROM_HERE, base::Bind(&SimpleWatcher::OnHandleReady, weak_watcher_,
-                                watch_id_, result));
-    }
-  }
-
-  const base::WeakPtr<SimpleWatcher> weak_watcher_;
-  const scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
-  const int watch_id_;
-
-  base::Lock lock_;
-  bool enable_cancellation_notifications_ = true;
-
-  DISALLOW_COPY_AND_ASSIGN(Context);
-};
-
-SimpleWatcher::SimpleWatcher(const tracked_objects::Location& from_here,
-                             ArmingPolicy arming_policy,
-                             scoped_refptr<base::SingleThreadTaskRunner> runner)
-    : arming_policy_(arming_policy),
-      task_runner_(std::move(runner)),
-      is_default_task_runner_(task_runner_ ==
-                              base::ThreadTaskRunnerHandle::Get()),
-      heap_profiler_tag_(from_here.file_name()),
-      weak_factory_(this) {
-  MojoResult rv = CreateWatcher(&Context::CallNotify, &watcher_handle_);
-  DCHECK_EQ(MOJO_RESULT_OK, rv);
-  DCHECK(task_runner_->BelongsToCurrentThread());
-}
-
-SimpleWatcher::~SimpleWatcher() {
-  if (IsWatching())
-    Cancel();
-}
-
-bool SimpleWatcher::IsWatching() const {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  return context_ != nullptr;
-}
-
-MojoResult SimpleWatcher::Watch(Handle handle,
-                                MojoHandleSignals signals,
-                                const ReadyCallback& callback) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  DCHECK(!IsWatching());
-  DCHECK(!callback.is_null());
-
-  callback_ = callback;
-  handle_ = handle;
-  watch_id_ += 1;
-
-  MojoResult watch_result = MOJO_RESULT_UNKNOWN;
-  context_ = Context::Create(weak_factory_.GetWeakPtr(), task_runner_,
-                             watcher_handle_.get(), handle_, signals, watch_id_,
-                             &watch_result);
-  if (!context_) {
-    handle_.set_value(kInvalidHandleValue);
-    callback_.Reset();
-    DCHECK_EQ(MOJO_RESULT_INVALID_ARGUMENT, watch_result);
-    return watch_result;
-  }
-
-  if (arming_policy_ == ArmingPolicy::AUTOMATIC)
-    ArmOrNotify();
-
-  return MOJO_RESULT_OK;
-}
-
-void SimpleWatcher::Cancel() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-
-  // The watcher may have already been cancelled if the handle was closed.
-  if (!context_)
-    return;
-
-  // Prevent the cancellation notification from being dispatched to
-  // OnHandleReady() when cancellation is explicit. See the note in the
-  // implementation of DisableCancellationNotifications() above.
-  context_->DisableCancellationNotifications();
-
-  handle_.set_value(kInvalidHandleValue);
-  callback_.Reset();
-
-  // Ensure |context_| is unset by the time we call MojoCancelWatch, as may
-  // re-enter the notification callback and we want to ensure |context_| is
-  // unset by then.
-  scoped_refptr<Context> context;
-  std::swap(context, context_);
-  MojoResult rv =
-      MojoCancelWatch(watcher_handle_.get().value(), context->value());
-
-  // It's possible this cancellation could race with a handle closure
-  // notification, in which case the watch may have already been implicitly
-  // cancelled.
-  DCHECK(rv == MOJO_RESULT_OK || rv == MOJO_RESULT_NOT_FOUND);
-}
-
-MojoResult SimpleWatcher::Arm(MojoResult* ready_result) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  uint32_t num_ready_contexts = 1;
-  uintptr_t ready_context;
-  MojoResult local_ready_result;
-  MojoHandleSignalsState ready_state;
-  MojoResult rv =
-      MojoArmWatcher(watcher_handle_.get().value(), &num_ready_contexts,
-                     &ready_context, &local_ready_result, &ready_state);
-  if (rv == MOJO_RESULT_FAILED_PRECONDITION) {
-    DCHECK(context_);
-    DCHECK_EQ(1u, num_ready_contexts);
-    DCHECK_EQ(context_->value(), ready_context);
-    if (ready_result)
-      *ready_result = local_ready_result;
-  }
-
-  return rv;
-}
-
-void SimpleWatcher::ArmOrNotify() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-
-  // Already cancelled, nothing to do.
-  if (!IsWatching())
-    return;
-
-  MojoResult ready_result;
-  MojoResult rv = Arm(&ready_result);
-  if (rv == MOJO_RESULT_OK)
-    return;
-
-  DCHECK_EQ(MOJO_RESULT_FAILED_PRECONDITION, rv);
-  task_runner_->PostTask(FROM_HERE, base::Bind(&SimpleWatcher::OnHandleReady,
-                                               weak_factory_.GetWeakPtr(),
-                                               watch_id_, ready_result));
-}
-
-void SimpleWatcher::OnHandleReady(int watch_id, MojoResult result) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-
-  // This notification may be for a previously watched context, in which case
-  // we just ignore it.
-  if (watch_id != watch_id_)
-    return;
-
-  ReadyCallback callback = callback_;
-  if (result == MOJO_RESULT_CANCELLED) {
-    // Implicit cancellation due to someone closing the watched handle. We clear
-    // the SimppleWatcher's state before dispatching this.
-    context_ = nullptr;
-    handle_.set_value(kInvalidHandleValue);
-    callback_.Reset();
-  }
-
-  // NOTE: It's legal for |callback| to delete |this|.
-  if (!callback.is_null()) {
-    TRACE_HEAP_PROFILER_API_SCOPED_TASK_EXECUTION event(heap_profiler_tag_);
-
-    base::WeakPtr<SimpleWatcher> weak_self = weak_factory_.GetWeakPtr();
-    callback.Run(result);
-    if (!weak_self)
-      return;
-
-    if (unsatisfiable_)
-      return;
-
-    // Prevent |MOJO_RESULT_FAILED_PRECONDITION| task spam by only notifying
-    // at most once in AUTOMATIC arming mode.
-    if (result == MOJO_RESULT_FAILED_PRECONDITION)
-      unsatisfiable_ = true;
-
-    if (arming_policy_ == ArmingPolicy::AUTOMATIC && IsWatching())
-      ArmOrNotify();
-  }
-}
-
-}  // namespace mojo
diff --git a/mojo/public/cpp/system/simple_watcher.h b/mojo/public/cpp/system/simple_watcher.h
deleted file mode 100644
index 9001884..0000000
--- a/mojo/public/cpp/system/simple_watcher.h
+++ /dev/null
@@ -1,215 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_SYSTEM_SIMPLE_WATCHER_H_
-#define MOJO_PUBLIC_CPP_SYSTEM_SIMPLE_WATCHER_H_
-
-#include "base/callback.h"
-#include "base/location.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/memory/weak_ptr.h"
-#include "base/threading/thread_checker.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "mojo/public/c/system/types.h"
-#include "mojo/public/cpp/system/system_export.h"
-#include "mojo/public/cpp/system/watcher.h"
-
-namespace base {
-class SingleThreadTaskRunner;
-}
-
-namespace mojo {
-
-// This provides a convenient thread-bound watcher implementation to safely
-// watch a single handle, dispatching state change notifications to an arbitrary
-// SingleThreadTaskRunner running on the same thread as the SimpleWatcher.
-//
-// SimpleWatcher exposes the concept of "arming" from the low-level Watcher API.
-// In general, a SimpleWatcher must be "armed" in order to dispatch a single
-// notification, and must then be rearmed before it will dispatch another. For
-// more details, see the documentation for ArmingPolicy and the Arm() and
-// ArmOrNotify() methods below.
-class MOJO_CPP_SYSTEM_EXPORT SimpleWatcher {
- public:
-  // A callback to be called any time a watched handle changes state in some
-  // interesting way. The |result| argument indicates one of the following
-  // conditions depending on its value:
-  //
-  //   |MOJO_RESULT_OK|: One or more of the signals being watched is satisfied.
-  //
-  //   |MOJO_RESULT_FAILED_PRECONDITION|: None of the signals being watched can
-  //       ever be satisfied again.
-  //
-  //   |MOJO_RESULT_CANCELLED|: The watched handle has been closed. No further
-  //       notifications will be fired, as this equivalent to an implicit
-  //       CancelWatch().
-  //
-  // Note that unlike the first two conditions, this callback may be invoked
-  // with |MOJO_RESULT_CANCELLED| even while the SimpleWatcher is disarmed.
-  using ReadyCallback = base::Callback<void(MojoResult result)>;
-
-  // Selects how this SimpleWatcher is to be armed.
-  enum class ArmingPolicy {
-    // The SimpleWatcher is armed automatically on Watch() and rearmed again
-    // after every invocation of the ReadyCallback. There is no need to manually
-    // call Arm() on a SimpleWatcher using this policy. This mode is equivalent
-    // to calling ArmOrNotify() once after Watch() and once again after every
-    // dispatched notification in MANUAL mode.
-    //
-    // This provides a reasonable approximation of edge-triggered behavior,
-    // mitigating (but not completely eliminating) the potential for redundant
-    // notifications.
-    //
-    // NOTE: It is important when using AUTOMATIC policy that your ReadyCallback
-    // always attempt to change the state of the handle (e.g. read available
-    // messages on a message pipe.) Otherwise this will result in a potentially
-    // large number of avoidable redundant tasks.
-    //
-    // For perfect edge-triggered behavior, use MANUAL policy and manually Arm()
-    // the SimpleWatcher as soon as it becomes possible to do so again.
-    AUTOMATIC,
-
-    // The SimpleWatcher is never armed automatically. Arm() or ArmOrNotify()
-    // must be called manually before any non-cancellation notification can be
-    // dispatched to the ReadyCallback. See the documentation for Arm() and
-    // ArmNotify() methods below for more details.
-    MANUAL,
-  };
-
-  SimpleWatcher(const tracked_objects::Location& from_here,
-                ArmingPolicy arming_policy,
-                scoped_refptr<base::SingleThreadTaskRunner> runner =
-                    base::ThreadTaskRunnerHandle::Get());
-  ~SimpleWatcher();
-
-  // Indicates if the SimpleWatcher is currently watching a handle.
-  bool IsWatching() const;
-
-  // Starts watching |handle|. A SimpleWatcher may only watch one handle at a
-  // time, but it is safe to call this more than once as long as the previous
-  // watch has been cancelled (i.e. |IsWatching()| returns |false|.)
-  //
-  // If |handle| is not a valid watchable (message or data pipe) handle or
-  // |signals| is not a valid set of signals to watch, this returns
-  // |MOJO_RESULT_INVALID_ARGUMENT|.
-  //
-  // Otherwise |MOJO_RESULT_OK| is returned and the handle will be watched until
-  // either |handle| is closed, the SimpleWatcher is destroyed, or Cancel() is
-  // explicitly called.
-  //
-  // Once the watch is started, |callback| may be called at any time on the
-  // current thread until |Cancel()| is called or the handle is closed. Note
-  // that |callback| can be called for results other than
-  // |MOJO_RESULT_CANCELLED| only if the SimpleWatcher is currently armed. Use
-  // ArmingPolicy to configure how a SimpleWatcher is armed.
-  //
-  // |MOJO_RESULT_CANCELLED| may be dispatched even while the SimpleWatcher
-  // is disarmed, and no further notifications will be dispatched after that.
-  //
-  // Destroying the SimpleWatcher implicitly calls |Cancel()|.
-  MojoResult Watch(Handle handle,
-                   MojoHandleSignals signals,
-                   const ReadyCallback& callback);
-
-  // Cancels the current watch. Once this returns, the ReadyCallback previously
-  // passed to |Watch()| will never be called again for this SimpleWatcher.
-  //
-  // Note that when cancelled with an explicit call to |Cancel()| the
-  // ReadyCallback will not be invoked with a |MOJO_RESULT_CANCELLED| result.
-  void Cancel();
-
-  // Manually arms the SimpleWatcher.
-  //
-  // Arming the SimpleWatcher allows it to fire a single notification regarding
-  // some future relevant change in the watched handle's state. It's only valid
-  // to call Arm() while a handle is being watched (see Watch() above.)
-  //
-  // SimpleWatcher is always disarmed immediately before invoking its
-  // ReadyCallback and must be rearmed again before another notification can
-  // fire.
-  //
-  // If the watched handle already meets the watched signaling conditions -
-  // i.e., if it would have notified immediately once armed - the SimpleWatcher
-  // is NOT armed, and this call fails with a return value of
-  // |MOJO_RESULT_FAILED_PRECONDITION|. In that case, what would have been the
-  // result code for that immediate notification is instead placed in
-  // |*ready_result| if |ready_result| is non-null.
-  //
-  // If the watcher is successfully armed, this returns |MOJO_RESULT_OK| and
-  // |ready_result| is ignored.
-  MojoResult Arm(MojoResult* ready_result = nullptr);
-
-  // Manually arms the SimpleWatcher OR posts a task to invoke the ReadyCallback
-  // with the ready result of the failed arming attempt.
-  //
-  // This is meant as a convenient helper for a common usage of Arm(), and it
-  // ensures that the ReadyCallback will be invoked asynchronously again as soon
-  // as the watch's conditions are satisfied, assuming the SimpleWatcher isn't
-  // cancelled first.
-  //
-  // Unlike Arm() above, this can never fail.
-  void ArmOrNotify();
-
-  Handle handle() const { return handle_; }
-  ReadyCallback ready_callback() const { return callback_; }
-
-  // Sets the tag used by the heap profiler.
-  // |tag| must be a const string literal.
-  void set_heap_profiler_tag(const char* heap_profiler_tag) {
-    heap_profiler_tag_ = heap_profiler_tag;
-  }
-
- private:
-  class Context;
-
-  void OnHandleReady(int watch_id, MojoResult result);
-
-  base::ThreadChecker thread_checker_;
-
-  // The policy used to determine how this SimpleWatcher is armed.
-  const ArmingPolicy arming_policy_;
-
-  // The TaskRunner of this SimpleWatcher's owning thread. This field is safe to
-  // access from any thread.
-  const scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
-
-  // Whether |task_runner_| is the same as base::ThreadTaskRunnerHandle::Get()
-  // for the thread.
-  const bool is_default_task_runner_;
-
-  ScopedWatcherHandle watcher_handle_;
-
-  // A thread-safe context object corresponding to the currently active watch,
-  // if any.
-  scoped_refptr<Context> context_;
-
-  // Fields below must only be accessed on the SimpleWatcher's owning thread.
-
-  // The handle currently under watch. Not owned.
-  Handle handle_;
-
-  // A simple counter to disambiguate notifications from multiple watch contexts
-  // in the event that this SimpleWatcher cancels and watches multiple times.
-  int watch_id_ = 0;
-
-  // The callback to call when the handle is signaled.
-  ReadyCallback callback_;
-
-  // Tracks if the SimpleWatcher has already notified of unsatisfiability. This
-  // is used to prevent redundant notifications in AUTOMATIC mode.
-  bool unsatisfiable_ = false;
-
-  // Tag used to ID memory allocations that originated from notifications in
-  // this watcher.
-  const char* heap_profiler_tag_ = nullptr;
-
-  base::WeakPtrFactory<SimpleWatcher> weak_factory_;
-
-  DISALLOW_COPY_AND_ASSIGN(SimpleWatcher);
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_SYSTEM_SIMPLE_WATCHER_H_
diff --git a/mojo/public/cpp/system/system_export.h b/mojo/public/cpp/system/system_export.h
deleted file mode 100644
index c9bb140..0000000
--- a/mojo/public/cpp/system/system_export.h
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_SYSTEM_SYSTEM_EXPORT_H_
-#define MOJO_PUBLIC_CPP_SYSTEM_SYSTEM_EXPORT_H_
-
-#if defined(COMPONENT_BUILD)
-
-#if defined(WIN32)
-
-#if defined(MOJO_CPP_SYSTEM_IMPLEMENTATION)
-#define MOJO_CPP_SYSTEM_EXPORT __declspec(dllexport)
-#else
-#define MOJO_CPP_SYSTEM_EXPORT __declspec(dllimport)
-#endif
-
-#else  // !defined(WIN32)
-
-#if defined(MOJO_CPP_SYSTEM_IMPLEMENTATION)
-#define MOJO_CPP_SYSTEM_EXPORT __attribute((visibility("default")))
-#else
-#define MOJO_CPP_SYSTEM_EXPORT
-#endif
-
-#endif  // defined(WIN32)
-
-#else  // !defined(COMPONENT_BUILD)
-
-#define MOJO_CPP_SYSTEM_EXPORT
-
-#endif  // defined(COMPONENT_BUILD)
-
-#endif  // MOJO_PUBLIC_CPP_SYSTEM_SYSTEM_EXPORT_H_
diff --git a/mojo/public/cpp/system/tests/BUILD.gn b/mojo/public/cpp/system/tests/BUILD.gn
deleted file mode 100644
index 705d009..0000000
--- a/mojo/public/cpp/system/tests/BUILD.gn
+++ /dev/null
@@ -1,23 +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.
-
-source_set("tests") {
-  testonly = true
-
-  sources = [
-    "core_unittest.cc",
-    "handle_signals_state_unittest.cc",
-    "simple_watcher_unittest.cc",
-    "wait_set_unittest.cc",
-    "wait_unittest.cc",
-  ]
-
-  deps = [
-    "//base",
-    "//mojo/public/c/system/tests",
-    "//mojo/public/cpp/system",
-    "//mojo/public/cpp/test_support:test_utils",
-    "//testing/gtest",
-  ]
-}
diff --git a/mojo/public/cpp/system/tests/core_unittest.cc b/mojo/public/cpp/system/tests/core_unittest.cc
deleted file mode 100644
index 40a94f0..0000000
--- a/mojo/public/cpp/system/tests/core_unittest.cc
+++ /dev/null
@@ -1,510 +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.
-
-// This file tests the C++ Mojo system core wrappers.
-// TODO(vtl): Maybe rename "CoreCppTest" -> "CoreTest" if/when this gets
-// compiled into a different binary from the C API tests.
-
-#include "mojo/public/cpp/system/core.h"
-
-#include <stddef.h>
-#include <stdint.h>
-#include <map>
-#include <utility>
-
-#include "mojo/public/cpp/system/wait.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace {
-
-const MojoHandleSignals kSignalReadableWritable =
-    MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE;
-
-const MojoHandleSignals kSignalAll = MOJO_HANDLE_SIGNAL_READABLE |
-                                     MOJO_HANDLE_SIGNAL_WRITABLE |
-                                     MOJO_HANDLE_SIGNAL_PEER_CLOSED;
-
-TEST(CoreCppTest, GetTimeTicksNow) {
-  const MojoTimeTicks start = GetTimeTicksNow();
-  EXPECT_NE(static_cast<MojoTimeTicks>(0), start)
-      << "GetTimeTicksNow should return nonzero value";
-}
-
-TEST(CoreCppTest, Basic) {
-  // Basic |Handle| implementation:
-  {
-    EXPECT_EQ(MOJO_HANDLE_INVALID, kInvalidHandleValue);
-
-    Handle h0;
-    EXPECT_EQ(kInvalidHandleValue, h0.value());
-    EXPECT_EQ(kInvalidHandleValue, *h0.mutable_value());
-    EXPECT_FALSE(h0.is_valid());
-
-    Handle h1(static_cast<MojoHandle>(123));
-    EXPECT_EQ(static_cast<MojoHandle>(123), h1.value());
-    EXPECT_EQ(static_cast<MojoHandle>(123), *h1.mutable_value());
-    EXPECT_TRUE(h1.is_valid());
-    *h1.mutable_value() = static_cast<MojoHandle>(456);
-    EXPECT_EQ(static_cast<MojoHandle>(456), h1.value());
-    EXPECT_TRUE(h1.is_valid());
-
-    h1.swap(h0);
-    EXPECT_EQ(static_cast<MojoHandle>(456), h0.value());
-    EXPECT_TRUE(h0.is_valid());
-    EXPECT_FALSE(h1.is_valid());
-
-    h1.set_value(static_cast<MojoHandle>(789));
-    h0.swap(h1);
-    EXPECT_EQ(static_cast<MojoHandle>(789), h0.value());
-    EXPECT_TRUE(h0.is_valid());
-    EXPECT_EQ(static_cast<MojoHandle>(456), h1.value());
-    EXPECT_TRUE(h1.is_valid());
-
-    // Make sure copy constructor works.
-    Handle h2(h0);
-    EXPECT_EQ(static_cast<MojoHandle>(789), h2.value());
-    // And assignment.
-    h2 = h1;
-    EXPECT_EQ(static_cast<MojoHandle>(456), h2.value());
-
-    // Make sure that we can put |Handle|s into |std::map|s.
-    h0 = Handle(static_cast<MojoHandle>(987));
-    h1 = Handle(static_cast<MojoHandle>(654));
-    h2 = Handle(static_cast<MojoHandle>(321));
-    Handle h3;
-    std::map<Handle, int> handle_to_int;
-    handle_to_int[h0] = 0;
-    handle_to_int[h1] = 1;
-    handle_to_int[h2] = 2;
-    handle_to_int[h3] = 3;
-
-    EXPECT_EQ(4u, handle_to_int.size());
-    EXPECT_FALSE(handle_to_int.find(h0) == handle_to_int.end());
-    EXPECT_EQ(0, handle_to_int[h0]);
-    EXPECT_FALSE(handle_to_int.find(h1) == handle_to_int.end());
-    EXPECT_EQ(1, handle_to_int[h1]);
-    EXPECT_FALSE(handle_to_int.find(h2) == handle_to_int.end());
-    EXPECT_EQ(2, handle_to_int[h2]);
-    EXPECT_FALSE(handle_to_int.find(h3) == handle_to_int.end());
-    EXPECT_EQ(3, handle_to_int[h3]);
-    EXPECT_TRUE(handle_to_int.find(Handle(static_cast<MojoHandle>(13579))) ==
-                handle_to_int.end());
-
-    // TODO(vtl): With C++11, support |std::unordered_map|s, etc. (Or figure out
-    // how to support the variations of |hash_map|.)
-  }
-
-  // |Handle|/|ScopedHandle| functions:
-  {
-    ScopedHandle h;
-
-    EXPECT_EQ(kInvalidHandleValue, h.get().value());
-
-    // This should be a no-op.
-    Close(std::move(h));
-
-    // It should still be invalid.
-    EXPECT_EQ(kInvalidHandleValue, h.get().value());
-
-    EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-              Wait(h.get(), ~MOJO_HANDLE_SIGNAL_NONE));
-
-    std::vector<Handle> wh;
-    wh.push_back(h.get());
-    std::vector<MojoHandleSignals> sigs;
-    sigs.push_back(~MOJO_HANDLE_SIGNAL_NONE);
-    size_t result_index;
-    MojoResult rv = WaitMany(wh.data(), sigs.data(), wh.size(), &result_index);
-    EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, rv);
-  }
-
-  // |MakeScopedHandle| (just compilation tests):
-  {
-    EXPECT_FALSE(MakeScopedHandle(Handle()).is_valid());
-    EXPECT_FALSE(MakeScopedHandle(MessagePipeHandle()).is_valid());
-    EXPECT_FALSE(MakeScopedHandle(DataPipeProducerHandle()).is_valid());
-    EXPECT_FALSE(MakeScopedHandle(DataPipeConsumerHandle()).is_valid());
-    EXPECT_FALSE(MakeScopedHandle(SharedBufferHandle()).is_valid());
-  }
-
-  // |MessagePipeHandle|/|ScopedMessagePipeHandle| functions:
-  {
-    MessagePipeHandle h_invalid;
-    EXPECT_FALSE(h_invalid.is_valid());
-    EXPECT_EQ(
-        MOJO_RESULT_INVALID_ARGUMENT,
-        WriteMessageRaw(
-            h_invalid, nullptr, 0, nullptr, 0, MOJO_WRITE_MESSAGE_FLAG_NONE));
-    char buffer[10] = {0};
-    EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-              WriteMessageRaw(h_invalid,
-                              buffer,
-                              sizeof(buffer),
-                              nullptr,
-                              0,
-                              MOJO_WRITE_MESSAGE_FLAG_NONE));
-    EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-              ReadMessageRaw(h_invalid,
-                             nullptr,
-                             nullptr,
-                             nullptr,
-                             nullptr,
-                             MOJO_READ_MESSAGE_FLAG_NONE));
-    uint32_t buffer_size = static_cast<uint32_t>(sizeof(buffer));
-    EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-              ReadMessageRaw(h_invalid,
-                             buffer,
-                             &buffer_size,
-                             nullptr,
-                             nullptr,
-                             MOJO_READ_MESSAGE_FLAG_NONE));
-
-    // Basic tests of waiting and closing.
-    MojoHandle hv0 = kInvalidHandleValue;
-    {
-      ScopedMessagePipeHandle h0;
-      ScopedMessagePipeHandle h1;
-      EXPECT_FALSE(h0.get().is_valid());
-      EXPECT_FALSE(h1.get().is_valid());
-
-      CreateMessagePipe(nullptr, &h0, &h1);
-      EXPECT_TRUE(h0.get().is_valid());
-      EXPECT_TRUE(h1.get().is_valid());
-      EXPECT_NE(h0.get().value(), h1.get().value());
-      // Save the handle values, so we can check that things got closed
-      // correctly.
-      hv0 = h0.get().value();
-      MojoHandle hv1 = h1.get().value();
-      MojoHandleSignalsState state = h0->QuerySignalsState();
-
-      EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, state.satisfied_signals);
-      EXPECT_EQ(kSignalAll, state.satisfiable_signals);
-
-      std::vector<Handle> wh;
-      wh.push_back(h0.get());
-      wh.push_back(h1.get());
-      std::vector<MojoHandleSignals> sigs;
-      sigs.push_back(MOJO_HANDLE_SIGNAL_READABLE);
-      sigs.push_back(MOJO_HANDLE_SIGNAL_WRITABLE);
-      std::vector<MojoHandleSignalsState> states(sigs.size());
-
-      size_t result_index;
-      MojoResult rv = WaitMany(wh.data(), sigs.data(), wh.size(), &result_index,
-                               states.data());
-      EXPECT_EQ(MOJO_RESULT_OK, rv);
-      EXPECT_EQ(1u, result_index);
-      EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, states[0].satisfied_signals);
-      EXPECT_EQ(kSignalAll, states[0].satisfiable_signals);
-      EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, states[1].satisfied_signals);
-      EXPECT_EQ(kSignalAll, states[1].satisfiable_signals);
-
-      // Test closing |h1| explicitly.
-      Close(std::move(h1));
-      EXPECT_FALSE(h1.get().is_valid());
-
-      // Make sure |h1| is closed.
-      EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-                Wait(Handle(hv1), ~MOJO_HANDLE_SIGNAL_NONE));
-
-      EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-                Wait(h0.get(), MOJO_HANDLE_SIGNAL_READABLE, &state));
-
-      EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, state.satisfied_signals);
-      EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, state.satisfiable_signals);
-    }
-    // |hv0| should have been closed when |h0| went out of scope, so this close
-    // should fail.
-    EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(hv0));
-
-    // Actually test writing/reading messages.
-    {
-      ScopedMessagePipeHandle h0;
-      ScopedMessagePipeHandle h1;
-      CreateMessagePipe(nullptr, &h0, &h1);
-
-      const char kHello[] = "hello";
-      const uint32_t kHelloSize = static_cast<uint32_t>(sizeof(kHello));
-      EXPECT_EQ(MOJO_RESULT_OK,
-                WriteMessageRaw(h0.get(),
-                                kHello,
-                                kHelloSize,
-                                nullptr,
-                                0,
-                                MOJO_WRITE_MESSAGE_FLAG_NONE));
-
-      MojoHandleSignalsState state;
-      EXPECT_EQ(MOJO_RESULT_OK,
-                Wait(h1.get(), MOJO_HANDLE_SIGNAL_READABLE, &state));
-      EXPECT_EQ(kSignalReadableWritable, state.satisfied_signals);
-      EXPECT_EQ(kSignalAll, state.satisfiable_signals);
-
-      char buffer[10] = {0};
-      uint32_t buffer_size = static_cast<uint32_t>(sizeof(buffer));
-      EXPECT_EQ(MOJO_RESULT_OK,
-                ReadMessageRaw(h1.get(),
-                               buffer,
-                               &buffer_size,
-                               nullptr,
-                               nullptr,
-                               MOJO_READ_MESSAGE_FLAG_NONE));
-      EXPECT_EQ(kHelloSize, buffer_size);
-      EXPECT_STREQ(kHello, buffer);
-
-      // Send a handle over the previously-establish message pipe. Use the
-      // |MessagePipe| wrapper (to test it), which automatically creates a
-      // message pipe.
-      MessagePipe mp;
-
-      // Write a message to |mp.handle0|, before we send |mp.handle1|.
-      const char kWorld[] = "world!";
-      const uint32_t kWorldSize = static_cast<uint32_t>(sizeof(kWorld));
-      EXPECT_EQ(MOJO_RESULT_OK,
-                WriteMessageRaw(mp.handle0.get(),
-                                kWorld,
-                                kWorldSize,
-                                nullptr,
-                                0,
-                                MOJO_WRITE_MESSAGE_FLAG_NONE));
-
-      // Send |mp.handle1| over |h1| to |h0|.
-      MojoHandle handles[5];
-      handles[0] = mp.handle1.release().value();
-      EXPECT_NE(kInvalidHandleValue, handles[0]);
-      EXPECT_FALSE(mp.handle1.get().is_valid());
-      uint32_t handles_count = 1;
-      EXPECT_EQ(MOJO_RESULT_OK,
-                WriteMessageRaw(h1.get(),
-                                kHello,
-                                kHelloSize,
-                                handles,
-                                handles_count,
-                                MOJO_WRITE_MESSAGE_FLAG_NONE));
-      // |handles[0]| should actually be invalid now.
-      EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(handles[0]));
-
-      // Read "hello" and the sent handle.
-      EXPECT_EQ(MOJO_RESULT_OK,
-                Wait(h0.get(), MOJO_HANDLE_SIGNAL_READABLE, &state));
-      EXPECT_EQ(kSignalReadableWritable, state.satisfied_signals);
-      EXPECT_EQ(kSignalAll, state.satisfiable_signals);
-
-      memset(buffer, 0, sizeof(buffer));
-      buffer_size = static_cast<uint32_t>(sizeof(buffer));
-      for (size_t i = 0; i < arraysize(handles); i++)
-        handles[i] = kInvalidHandleValue;
-      handles_count = static_cast<uint32_t>(arraysize(handles));
-      EXPECT_EQ(MOJO_RESULT_OK,
-                ReadMessageRaw(h0.get(),
-                               buffer,
-                               &buffer_size,
-                               handles,
-                               &handles_count,
-                               MOJO_READ_MESSAGE_FLAG_NONE));
-      EXPECT_EQ(kHelloSize, buffer_size);
-      EXPECT_STREQ(kHello, buffer);
-      EXPECT_EQ(1u, handles_count);
-      EXPECT_NE(kInvalidHandleValue, handles[0]);
-
-      // Read from the sent/received handle.
-      mp.handle1.reset(MessagePipeHandle(handles[0]));
-      // Save |handles[0]| to check that it gets properly closed.
-      hv0 = handles[0];
-
-      EXPECT_EQ(MOJO_RESULT_OK,
-                Wait(mp.handle1.get(), MOJO_HANDLE_SIGNAL_READABLE, &state));
-      EXPECT_EQ(kSignalReadableWritable, state.satisfied_signals);
-      EXPECT_EQ(kSignalAll, state.satisfiable_signals);
-
-      memset(buffer, 0, sizeof(buffer));
-      buffer_size = static_cast<uint32_t>(sizeof(buffer));
-      for (size_t i = 0; i < arraysize(handles); i++)
-        handles[i] = kInvalidHandleValue;
-      handles_count = static_cast<uint32_t>(arraysize(handles));
-      EXPECT_EQ(MOJO_RESULT_OK,
-                ReadMessageRaw(mp.handle1.get(),
-                               buffer,
-                               &buffer_size,
-                               handles,
-                               &handles_count,
-                               MOJO_READ_MESSAGE_FLAG_NONE));
-      EXPECT_EQ(kWorldSize, buffer_size);
-      EXPECT_STREQ(kWorld, buffer);
-      EXPECT_EQ(0u, handles_count);
-    }
-    EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(hv0));
-  }
-
-  // TODO(vtl): Test |CloseRaw()|.
-  // TODO(vtl): Test |reset()| more thoroughly?
-}
-
-TEST(CoreCppTest, TearDownWithMessagesEnqueued) {
-  // Tear down a message pipe which still has a message enqueued, with the
-  // message also having a valid message pipe handle.
-  {
-    ScopedMessagePipeHandle h0;
-    ScopedMessagePipeHandle h1;
-    CreateMessagePipe(nullptr, &h0, &h1);
-
-    // Send a handle over the previously-establish message pipe.
-    ScopedMessagePipeHandle h2;
-    ScopedMessagePipeHandle h3;
-    if (CreateMessagePipe(nullptr, &h2, &h3) != MOJO_RESULT_OK)
-      CreateMessagePipe(nullptr, &h2, &h3);  // Must be old EDK.
-
-    // Write a message to |h2|, before we send |h3|.
-    const char kWorld[] = "world!";
-    const uint32_t kWorldSize = static_cast<uint32_t>(sizeof(kWorld));
-    EXPECT_EQ(MOJO_RESULT_OK,
-              WriteMessageRaw(h2.get(),
-                              kWorld,
-                              kWorldSize,
-                              nullptr,
-                              0,
-                              MOJO_WRITE_MESSAGE_FLAG_NONE));
-    // And also a message to |h3|.
-    EXPECT_EQ(MOJO_RESULT_OK,
-              WriteMessageRaw(h3.get(),
-                              kWorld,
-                              kWorldSize,
-                              nullptr,
-                              0,
-                              MOJO_WRITE_MESSAGE_FLAG_NONE));
-
-    // Send |h3| over |h1| to |h0|.
-    const char kHello[] = "hello";
-    const uint32_t kHelloSize = static_cast<uint32_t>(sizeof(kHello));
-    MojoHandle h3_value;
-    h3_value = h3.release().value();
-    EXPECT_NE(kInvalidHandleValue, h3_value);
-    EXPECT_FALSE(h3.get().is_valid());
-    EXPECT_EQ(MOJO_RESULT_OK,
-              WriteMessageRaw(h1.get(),
-                              kHello,
-                              kHelloSize,
-                              &h3_value,
-                              1,
-                              MOJO_WRITE_MESSAGE_FLAG_NONE));
-    // |h3_value| should actually be invalid now.
-    EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(h3_value));
-
-    EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h0.release().value()));
-    EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h1.release().value()));
-    EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h2.release().value()));
-  }
-
-  // Do this in a different order: make the enqueued message pipe handle only
-  // half-alive.
-  {
-    ScopedMessagePipeHandle h0;
-    ScopedMessagePipeHandle h1;
-    CreateMessagePipe(nullptr, &h0, &h1);
-
-    // Send a handle over the previously-establish message pipe.
-    ScopedMessagePipeHandle h2;
-    ScopedMessagePipeHandle h3;
-    if (CreateMessagePipe(nullptr, &h2, &h3) != MOJO_RESULT_OK)
-      CreateMessagePipe(nullptr, &h2, &h3);  // Must be old EDK.
-
-    // Write a message to |h2|, before we send |h3|.
-    const char kWorld[] = "world!";
-    const uint32_t kWorldSize = static_cast<uint32_t>(sizeof(kWorld));
-    EXPECT_EQ(MOJO_RESULT_OK,
-              WriteMessageRaw(h2.get(),
-                              kWorld,
-                              kWorldSize,
-                              nullptr,
-                              0,
-                              MOJO_WRITE_MESSAGE_FLAG_NONE));
-    // And also a message to |h3|.
-    EXPECT_EQ(MOJO_RESULT_OK,
-              WriteMessageRaw(h3.get(),
-                              kWorld,
-                              kWorldSize,
-                              nullptr,
-                              0,
-                              MOJO_WRITE_MESSAGE_FLAG_NONE));
-
-    // Send |h3| over |h1| to |h0|.
-    const char kHello[] = "hello";
-    const uint32_t kHelloSize = static_cast<uint32_t>(sizeof(kHello));
-    MojoHandle h3_value;
-    h3_value = h3.release().value();
-    EXPECT_NE(kInvalidHandleValue, h3_value);
-    EXPECT_FALSE(h3.get().is_valid());
-    EXPECT_EQ(MOJO_RESULT_OK,
-              WriteMessageRaw(h1.get(),
-                              kHello,
-                              kHelloSize,
-                              &h3_value,
-                              1,
-                              MOJO_WRITE_MESSAGE_FLAG_NONE));
-    // |h3_value| should actually be invalid now.
-    EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(h3_value));
-
-    EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h2.release().value()));
-    EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h0.release().value()));
-    EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h1.release().value()));
-  }
-}
-
-TEST(CoreCppTest, ScopedHandleMoveCtor) {
-  ScopedSharedBufferHandle buffer1 = SharedBufferHandle::Create(1024);
-  EXPECT_TRUE(buffer1.is_valid());
-
-  ScopedSharedBufferHandle buffer2 = SharedBufferHandle::Create(1024);
-  EXPECT_TRUE(buffer2.is_valid());
-
-  // If this fails to close buffer1, ScopedHandleBase::CloseIfNecessary() will
-  // assert.
-  buffer1 = std::move(buffer2);
-
-  EXPECT_TRUE(buffer1.is_valid());
-  EXPECT_FALSE(buffer2.is_valid());
-}
-
-TEST(CoreCppTest, BasicSharedBuffer) {
-  ScopedSharedBufferHandle h0 = SharedBufferHandle::Create(100);
-  ASSERT_TRUE(h0.is_valid());
-
-  // Map everything.
-  ScopedSharedBufferMapping mapping = h0->Map(100);
-  ASSERT_TRUE(mapping);
-  static_cast<char*>(mapping.get())[50] = 'x';
-
-  // Duplicate |h0| to |h1|.
-  ScopedSharedBufferHandle h1 =
-      h0->Clone(SharedBufferHandle::AccessMode::READ_ONLY);
-  ASSERT_TRUE(h1.is_valid());
-
-  // Close |h0|.
-  h0.reset();
-
-  // The mapping should still be good.
-  static_cast<char*>(mapping.get())[51] = 'y';
-
-  // Unmap it.
-  mapping.reset();
-
-  // Map half of |h1|.
-  mapping = h1->MapAtOffset(50, 50);
-  ASSERT_TRUE(mapping);
-
-  // It should have what we wrote.
-  EXPECT_EQ('x', static_cast<char*>(mapping.get())[0]);
-  EXPECT_EQ('y', static_cast<char*>(mapping.get())[1]);
-
-  // Unmap it.
-  mapping.reset();
-  h1.reset();
-
-  // Creating a 1 EB shared buffer should fail without crashing.
-  EXPECT_FALSE(SharedBufferHandle::Create(1ULL << 60).is_valid());
-}
-
-// TODO(vtl): Write data pipe tests.
-
-}  // namespace
-}  // namespace mojo
diff --git a/mojo/public/cpp/system/tests/handle_signals_state_unittest.cc b/mojo/public/cpp/system/tests/handle_signals_state_unittest.cc
deleted file mode 100644
index 82f538e..0000000
--- a/mojo/public/cpp/system/tests/handle_signals_state_unittest.cc
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/system/handle_signals_state.h"
-
-#include "mojo/public/c/system/types.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace {
-
-using HandleSignalsStateTest = testing::Test;
-
-TEST_F(HandleSignalsStateTest, SanityCheck) {
-  // There's not much to test here. Just a quick sanity check to make sure the
-  // code compiles and the helper methods do what they're supposed to do.
-
-  HandleSignalsState empty_signals(MOJO_HANDLE_SIGNAL_NONE,
-                                   MOJO_HANDLE_SIGNAL_NONE);
-  EXPECT_FALSE(empty_signals.readable());
-  EXPECT_FALSE(empty_signals.writable());
-  EXPECT_FALSE(empty_signals.peer_closed());
-  EXPECT_TRUE(empty_signals.never_readable());
-  EXPECT_TRUE(empty_signals.never_writable());
-  EXPECT_TRUE(empty_signals.never_peer_closed());
-
-  HandleSignalsState all_signals(
-      MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
-          MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-      MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
-          MOJO_HANDLE_SIGNAL_PEER_CLOSED);
-  EXPECT_TRUE(all_signals.readable());
-  EXPECT_TRUE(all_signals.writable());
-  EXPECT_TRUE(all_signals.peer_closed());
-  EXPECT_FALSE(all_signals.never_readable());
-  EXPECT_FALSE(all_signals.never_writable());
-  EXPECT_FALSE(all_signals.never_peer_closed());
-}
-
-}  // namespace
-}  // namespace mojo
diff --git a/mojo/public/cpp/system/tests/simple_watcher_unittest.cc b/mojo/public/cpp/system/tests/simple_watcher_unittest.cc
deleted file mode 100644
index 795f262..0000000
--- a/mojo/public/cpp/system/tests/simple_watcher_unittest.cc
+++ /dev/null
@@ -1,277 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/system/simple_watcher.h"
-
-#include <memory>
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/macros.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "mojo/public/c/system/types.h"
-#include "mojo/public/cpp/system/message_pipe.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace {
-
-template <typename Handler>
-void RunResultHandler(Handler f, MojoResult result) {
-  f(result);
-}
-
-template <typename Handler>
-SimpleWatcher::ReadyCallback OnReady(Handler f) {
-  return base::Bind(&RunResultHandler<Handler>, f);
-}
-
-SimpleWatcher::ReadyCallback NotReached() {
-  return OnReady([](MojoResult) { NOTREACHED(); });
-}
-
-class SimpleWatcherTest : public testing::Test {
- public:
-  SimpleWatcherTest() {}
-  ~SimpleWatcherTest() override {}
-
- private:
-  base::MessageLoop message_loop_;
-
-  DISALLOW_COPY_AND_ASSIGN(SimpleWatcherTest);
-};
-
-TEST_F(SimpleWatcherTest, WatchBasic) {
-  ScopedMessagePipeHandle a, b;
-  CreateMessagePipe(nullptr, &a, &b);
-
-  bool notified = false;
-  base::RunLoop run_loop;
-  SimpleWatcher b_watcher(FROM_HERE, SimpleWatcher::ArmingPolicy::AUTOMATIC);
-  EXPECT_EQ(MOJO_RESULT_OK,
-            b_watcher.Watch(b.get(), MOJO_HANDLE_SIGNAL_READABLE,
-                            OnReady([&](MojoResult result) {
-                              EXPECT_EQ(MOJO_RESULT_OK, result);
-                              notified = true;
-                              run_loop.Quit();
-                            })));
-  EXPECT_TRUE(b_watcher.IsWatching());
-
-  EXPECT_EQ(MOJO_RESULT_OK, WriteMessageRaw(a.get(), "hello", 5, nullptr, 0,
-                                            MOJO_WRITE_MESSAGE_FLAG_NONE));
-  run_loop.Run();
-  EXPECT_TRUE(notified);
-
-  b_watcher.Cancel();
-}
-
-TEST_F(SimpleWatcherTest, WatchUnsatisfiable) {
-  ScopedMessagePipeHandle a, b;
-  CreateMessagePipe(nullptr, &a, &b);
-  a.reset();
-
-  SimpleWatcher b_watcher(FROM_HERE, SimpleWatcher::ArmingPolicy::MANUAL);
-  EXPECT_EQ(
-      MOJO_RESULT_OK,
-      b_watcher.Watch(b.get(), MOJO_HANDLE_SIGNAL_READABLE, NotReached()));
-  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, b_watcher.Arm());
-}
-
-TEST_F(SimpleWatcherTest, WatchInvalidHandle) {
-  ScopedMessagePipeHandle a, b;
-  CreateMessagePipe(nullptr, &a, &b);
-  a.reset();
-  b.reset();
-
-  SimpleWatcher b_watcher(FROM_HERE, SimpleWatcher::ArmingPolicy::AUTOMATIC);
-  EXPECT_EQ(
-      MOJO_RESULT_INVALID_ARGUMENT,
-      b_watcher.Watch(b.get(), MOJO_HANDLE_SIGNAL_READABLE, NotReached()));
-  EXPECT_FALSE(b_watcher.IsWatching());
-}
-
-TEST_F(SimpleWatcherTest, Cancel) {
-  ScopedMessagePipeHandle a, b;
-  CreateMessagePipe(nullptr, &a, &b);
-
-  base::RunLoop run_loop;
-  SimpleWatcher b_watcher(FROM_HERE, SimpleWatcher::ArmingPolicy::AUTOMATIC);
-  EXPECT_EQ(
-      MOJO_RESULT_OK,
-      b_watcher.Watch(b.get(), MOJO_HANDLE_SIGNAL_READABLE, NotReached()));
-  EXPECT_TRUE(b_watcher.IsWatching());
-  b_watcher.Cancel();
-  EXPECT_FALSE(b_watcher.IsWatching());
-
-  // This should never trigger the watcher.
-  EXPECT_EQ(MOJO_RESULT_OK, WriteMessageRaw(a.get(), "hello", 5, nullptr, 0,
-                                            MOJO_WRITE_MESSAGE_FLAG_NONE));
-
-  base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                                run_loop.QuitClosure());
-  run_loop.Run();
-}
-
-TEST_F(SimpleWatcherTest, CancelOnClose) {
-  ScopedMessagePipeHandle a, b;
-  CreateMessagePipe(nullptr, &a, &b);
-
-  base::RunLoop run_loop;
-  SimpleWatcher b_watcher(FROM_HERE, SimpleWatcher::ArmingPolicy::AUTOMATIC);
-  EXPECT_EQ(MOJO_RESULT_OK,
-            b_watcher.Watch(b.get(), MOJO_HANDLE_SIGNAL_READABLE,
-                            OnReady([&](MojoResult result) {
-                              EXPECT_EQ(MOJO_RESULT_CANCELLED, result);
-                              run_loop.Quit();
-                            })));
-  EXPECT_TRUE(b_watcher.IsWatching());
-
-  // This should trigger the watcher above.
-  b.reset();
-
-  run_loop.Run();
-
-  EXPECT_FALSE(b_watcher.IsWatching());
-}
-
-TEST_F(SimpleWatcherTest, CancelOnDestruction) {
-  ScopedMessagePipeHandle a, b;
-  CreateMessagePipe(nullptr, &a, &b);
-  base::RunLoop run_loop;
-  {
-    SimpleWatcher b_watcher(FROM_HERE, SimpleWatcher::ArmingPolicy::AUTOMATIC);
-    EXPECT_EQ(
-        MOJO_RESULT_OK,
-        b_watcher.Watch(b.get(), MOJO_HANDLE_SIGNAL_READABLE, NotReached()));
-    EXPECT_TRUE(b_watcher.IsWatching());
-
-    // |b_watcher| should be cancelled when it goes out of scope.
-  }
-
-  // This should never trigger the watcher above.
-  EXPECT_EQ(MOJO_RESULT_OK, WriteMessageRaw(a.get(), "hello", 5, nullptr, 0,
-                                            MOJO_WRITE_MESSAGE_FLAG_NONE));
-  base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                                run_loop.QuitClosure());
-  run_loop.Run();
-}
-
-TEST_F(SimpleWatcherTest, CloseAndCancel) {
-  ScopedMessagePipeHandle a, b;
-  CreateMessagePipe(nullptr, &a, &b);
-
-  SimpleWatcher b_watcher(FROM_HERE, SimpleWatcher::ArmingPolicy::AUTOMATIC);
-  EXPECT_EQ(MOJO_RESULT_OK,
-            b_watcher.Watch(b.get(), MOJO_HANDLE_SIGNAL_READABLE,
-                            OnReady([](MojoResult result) { FAIL(); })));
-  EXPECT_TRUE(b_watcher.IsWatching());
-
-  // This should trigger the watcher above...
-  b.reset();
-  // ...but the watcher is cancelled first.
-  b_watcher.Cancel();
-
-  EXPECT_FALSE(b_watcher.IsWatching());
-
-  base::RunLoop().RunUntilIdle();
-}
-
-TEST_F(SimpleWatcherTest, UnarmedCancel) {
-  ScopedMessagePipeHandle a, b;
-  CreateMessagePipe(nullptr, &a, &b);
-
-  SimpleWatcher b_watcher(FROM_HERE, SimpleWatcher::ArmingPolicy::MANUAL);
-  base::RunLoop loop;
-  EXPECT_EQ(MOJO_RESULT_OK,
-            b_watcher.Watch(b.get(), MOJO_HANDLE_SIGNAL_READABLE,
-                            base::Bind(
-                                [](base::RunLoop* loop, MojoResult result) {
-                                  EXPECT_EQ(result, MOJO_RESULT_CANCELLED);
-                                  loop->Quit();
-                                },
-                                &loop)));
-
-  // This message write will not wake up the watcher since the watcher isn't
-  // armed. Instead, the cancellation will dispatch due to the reset below.
-  EXPECT_EQ(MOJO_RESULT_OK, WriteMessageRaw(a.get(), "hello", 5, nullptr, 0,
-                                            MOJO_WRITE_MESSAGE_FLAG_NONE));
-  b.reset();
-  loop.Run();
-}
-
-TEST_F(SimpleWatcherTest, ManualArming) {
-  ScopedMessagePipeHandle a, b;
-  CreateMessagePipe(nullptr, &a, &b);
-
-  SimpleWatcher b_watcher(FROM_HERE, SimpleWatcher::ArmingPolicy::MANUAL);
-  base::RunLoop loop;
-  EXPECT_EQ(MOJO_RESULT_OK,
-            b_watcher.Watch(b.get(), MOJO_HANDLE_SIGNAL_READABLE,
-                            base::Bind(
-                                [](base::RunLoop* loop, MojoResult result) {
-                                  EXPECT_EQ(result, MOJO_RESULT_OK);
-                                  loop->Quit();
-                                },
-                                &loop)));
-  EXPECT_EQ(MOJO_RESULT_OK, b_watcher.Arm());
-
-  EXPECT_EQ(MOJO_RESULT_OK, WriteMessageRaw(a.get(), "hello", 5, nullptr, 0,
-                                            MOJO_WRITE_MESSAGE_FLAG_NONE));
-  loop.Run();
-}
-
-TEST_F(SimpleWatcherTest, ManualArmOrNotifyWhileSignaled) {
-  ScopedMessagePipeHandle a, b;
-  CreateMessagePipe(nullptr, &a, &b);
-
-  base::RunLoop loop1;
-  SimpleWatcher b_watcher1(FROM_HERE, SimpleWatcher::ArmingPolicy::MANUAL);
-  bool notified1 = false;
-  EXPECT_EQ(MOJO_RESULT_OK,
-            b_watcher1.Watch(
-                b.get(), MOJO_HANDLE_SIGNAL_READABLE,
-                base::Bind(
-                    [](base::RunLoop* loop, bool* notified, MojoResult result) {
-                      EXPECT_EQ(result, MOJO_RESULT_OK);
-                      *notified = true;
-                      loop->Quit();
-                    },
-                    &loop1, &notified1)));
-
-  base::RunLoop loop2;
-  SimpleWatcher b_watcher2(FROM_HERE, SimpleWatcher::ArmingPolicy::MANUAL);
-  bool notified2 = false;
-  EXPECT_EQ(MOJO_RESULT_OK,
-            b_watcher2.Watch(
-                b.get(), MOJO_HANDLE_SIGNAL_READABLE,
-                base::Bind(
-                    [](base::RunLoop* loop, bool* notified, MojoResult result) {
-                      EXPECT_EQ(result, MOJO_RESULT_OK);
-                      *notified = true;
-                      loop->Quit();
-                    },
-                    &loop2, &notified2)));
-
-  // First ensure that |b| is readable.
-  EXPECT_EQ(MOJO_RESULT_OK, b_watcher1.Arm());
-  EXPECT_EQ(MOJO_RESULT_OK, WriteMessageRaw(a.get(), "hello", 5, nullptr, 0,
-                                            MOJO_WRITE_MESSAGE_FLAG_NONE));
-  loop1.Run();
-
-  EXPECT_TRUE(notified1);
-  EXPECT_FALSE(notified2);
-  notified1 = false;
-
-  // Now verify that ArmOrNotify results in a notification.
-  b_watcher2.ArmOrNotify();
-  loop2.Run();
-
-  EXPECT_FALSE(notified1);
-  EXPECT_TRUE(notified2);
-}
-
-}  // namespace
-}  // namespace mojo
diff --git a/mojo/public/cpp/system/tests/wait_set_unittest.cc b/mojo/public/cpp/system/tests/wait_set_unittest.cc
deleted file mode 100644
index d60cb45..0000000
--- a/mojo/public/cpp/system/tests/wait_set_unittest.cc
+++ /dev/null
@@ -1,376 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/system/wait_set.h"
-
-#include <set>
-#include <vector>
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/memory/ptr_util.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/threading/platform_thread.h"
-#include "base/threading/simple_thread.h"
-#include "mojo/public/cpp/system/message_pipe.h"
-#include "mojo/public/cpp/system/wait.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace {
-
-using WaitSetTest = testing::Test;
-
-void WriteMessage(const ScopedMessagePipeHandle& handle,
-                  const base::StringPiece& message) {
-  MojoResult rv = WriteMessageRaw(handle.get(), message.data(),
-                                  static_cast<uint32_t>(message.size()),
-                                  nullptr, 0, MOJO_WRITE_MESSAGE_FLAG_NONE);
-  CHECK_EQ(MOJO_RESULT_OK, rv);
-}
-
-std::string ReadMessage(const ScopedMessagePipeHandle& handle) {
-  uint32_t num_bytes = 0;
-  uint32_t num_handles = 0;
-  MojoResult rv = ReadMessageRaw(handle.get(), nullptr, &num_bytes, nullptr,
-                                 &num_handles, MOJO_READ_MESSAGE_FLAG_NONE);
-  CHECK_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, rv);
-  CHECK_EQ(0u, num_handles);
-
-  std::vector<char> buffer(num_bytes);
-  rv = ReadMessageRaw(handle.get(), buffer.data(), &num_bytes, nullptr,
-                      &num_handles, MOJO_READ_MESSAGE_FLAG_NONE);
-  CHECK_EQ(MOJO_RESULT_OK, rv);
-  return std::string(buffer.data(), buffer.size());
-}
-
-class ThreadedRunner : public base::SimpleThread {
- public:
-  explicit ThreadedRunner(const base::Closure& callback)
-      : SimpleThread("ThreadedRunner"), callback_(callback) {}
-  ~ThreadedRunner() override { Join(); }
-
-  void Run() override { callback_.Run(); }
-
- private:
-  const base::Closure callback_;
-
-  DISALLOW_COPY_AND_ASSIGN(ThreadedRunner);
-};
-
-TEST_F(WaitSetTest, Satisfied) {
-  WaitSet wait_set;
-  MessagePipe p;
-
-  const char kTestMessage1[] = "hello wake up";
-
-  // Watch only one handle and write to the other.
-
-  wait_set.AddHandle(p.handle1.get(), MOJO_HANDLE_SIGNAL_READABLE);
-  WriteMessage(p.handle0, kTestMessage1);
-
-  size_t num_ready_handles = 2;
-  Handle ready_handles[2];
-  MojoResult ready_results[2] = {MOJO_RESULT_UNKNOWN, MOJO_RESULT_UNKNOWN};
-  HandleSignalsState hss[2];
-  wait_set.Wait(nullptr, &num_ready_handles, ready_handles, ready_results, hss);
-
-  EXPECT_EQ(1u, num_ready_handles);
-  EXPECT_EQ(p.handle1.get(), ready_handles[0]);
-  EXPECT_EQ(MOJO_RESULT_OK, ready_results[0]);
-  EXPECT_TRUE(hss[0].readable() && hss[0].writable() && !hss[0].peer_closed());
-
-  wait_set.RemoveHandle(p.handle1.get());
-
-  // Now watch only the other handle and write to the first one.
-
-  wait_set.AddHandle(p.handle0.get(), MOJO_HANDLE_SIGNAL_READABLE);
-  WriteMessage(p.handle1, kTestMessage1);
-
-  num_ready_handles = 2;
-  ready_results[0] = MOJO_RESULT_UNKNOWN;
-  ready_results[1] = MOJO_RESULT_UNKNOWN;
-  wait_set.Wait(nullptr, &num_ready_handles, ready_handles, ready_results, hss);
-
-  EXPECT_EQ(1u, num_ready_handles);
-  EXPECT_EQ(p.handle0.get(), ready_handles[0]);
-  EXPECT_EQ(MOJO_RESULT_OK, ready_results[0]);
-  EXPECT_TRUE(hss[0].readable() && hss[0].writable() && !hss[0].peer_closed());
-
-  // Now wait on both of them.
-  wait_set.AddHandle(p.handle1.get(), MOJO_HANDLE_SIGNAL_READABLE);
-
-  num_ready_handles = 2;
-  ready_results[0] = MOJO_RESULT_UNKNOWN;
-  ready_results[1] = MOJO_RESULT_UNKNOWN;
-  wait_set.Wait(nullptr, &num_ready_handles, ready_handles, ready_results, hss);
-  EXPECT_EQ(2u, num_ready_handles);
-  EXPECT_TRUE((ready_handles[0] == p.handle0.get() &&
-               ready_handles[1] == p.handle1.get()) ||
-              (ready_handles[0] == p.handle1.get() &&
-               ready_handles[1] == p.handle0.get()));
-  EXPECT_EQ(MOJO_RESULT_OK, ready_results[0]);
-  EXPECT_EQ(MOJO_RESULT_OK, ready_results[1]);
-  EXPECT_TRUE(hss[0].readable() && hss[0].writable() && !hss[0].peer_closed());
-  EXPECT_TRUE(hss[1].readable() && hss[1].writable() && !hss[1].peer_closed());
-
-  // Wait on both again, but with only enough output space for one result.
-  num_ready_handles = 1;
-  ready_results[0] = MOJO_RESULT_UNKNOWN;
-  wait_set.Wait(nullptr, &num_ready_handles, ready_handles, ready_results, hss);
-  EXPECT_EQ(1u, num_ready_handles);
-  EXPECT_TRUE(ready_handles[0] == p.handle0.get() ||
-              ready_handles[0] == p.handle1.get());
-  EXPECT_EQ(MOJO_RESULT_OK, ready_results[0]);
-
-  // Remove the ready handle from the set and wait one more time.
-  EXPECT_EQ(MOJO_RESULT_OK, wait_set.RemoveHandle(ready_handles[0]));
-
-  num_ready_handles = 1;
-  ready_results[0] = MOJO_RESULT_UNKNOWN;
-  wait_set.Wait(nullptr, &num_ready_handles, ready_handles, ready_results, hss);
-  EXPECT_EQ(1u, num_ready_handles);
-  EXPECT_TRUE(ready_handles[0] == p.handle0.get() ||
-              ready_handles[0] == p.handle1.get());
-  EXPECT_EQ(MOJO_RESULT_OK, ready_results[0]);
-
-  EXPECT_EQ(MOJO_RESULT_OK, wait_set.RemoveHandle(ready_handles[0]));
-
-  // The wait set should be empty now. Nothing to wait on.
-  num_ready_handles = 2;
-  wait_set.Wait(nullptr, &num_ready_handles, ready_handles, ready_results);
-  EXPECT_EQ(0u, num_ready_handles);
-}
-
-TEST_F(WaitSetTest, Unsatisfiable) {
-  MessagePipe p, q;
-  WaitSet wait_set;
-
-  wait_set.AddHandle(q.handle0.get(), MOJO_HANDLE_SIGNAL_READABLE);
-  wait_set.AddHandle(q.handle1.get(), MOJO_HANDLE_SIGNAL_READABLE);
-  wait_set.AddHandle(p.handle0.get(), MOJO_HANDLE_SIGNAL_READABLE);
-
-  size_t num_ready_handles = 2;
-  Handle ready_handles[2];
-  MojoResult ready_results[2] = {MOJO_RESULT_UNKNOWN, MOJO_RESULT_UNKNOWN};
-
-  p.handle1.reset();
-  wait_set.Wait(nullptr, &num_ready_handles, ready_handles, ready_results);
-  EXPECT_EQ(1u, num_ready_handles);
-  EXPECT_EQ(p.handle0.get(), ready_handles[0]);
-  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, ready_results[0]);
-}
-
-TEST_F(WaitSetTest, CloseWhileWaiting) {
-  MessagePipe p;
-  WaitSet wait_set;
-
-  wait_set.AddHandle(p.handle0.get(), MOJO_HANDLE_SIGNAL_READABLE);
-
-  const Handle handle0_value = p.handle0.get();
-  ThreadedRunner close_after_delay(base::Bind(
-      [](ScopedMessagePipeHandle* handle) {
-        // Wait a little while, then close the handle.
-        base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(200));
-        handle->reset();
-      },
-      &p.handle0));
-  close_after_delay.Start();
-
-  size_t num_ready_handles = 2;
-  Handle ready_handles[2];
-  MojoResult ready_results[2] = {MOJO_RESULT_UNKNOWN, MOJO_RESULT_UNKNOWN};
-  wait_set.Wait(nullptr, &num_ready_handles, ready_handles, ready_results);
-  EXPECT_EQ(1u, num_ready_handles);
-  EXPECT_EQ(handle0_value, ready_handles[0]);
-  EXPECT_EQ(MOJO_RESULT_CANCELLED, ready_results[0]);
-
-  EXPECT_EQ(MOJO_RESULT_NOT_FOUND, wait_set.RemoveHandle(handle0_value));
-}
-
-TEST_F(WaitSetTest, CloseBeforeWaiting) {
-  MessagePipe p;
-  WaitSet wait_set;
-
-  wait_set.AddHandle(p.handle0.get(), MOJO_HANDLE_SIGNAL_READABLE);
-  wait_set.AddHandle(p.handle1.get(), MOJO_HANDLE_SIGNAL_READABLE);
-
-  Handle handle0_value = p.handle0.get();
-  Handle handle1_value = p.handle1.get();
-
-  p.handle0.reset();
-  p.handle1.reset();
-
-  // Ensure that the WaitSet user is always made aware of all cancellations even
-  // if they happen while not waiting, or they have to be returned over the span
-  // of multiple Wait() calls due to insufficient output storage.
-
-  size_t num_ready_handles = 1;
-  Handle ready_handle;
-  MojoResult ready_result = MOJO_RESULT_UNKNOWN;
-  wait_set.Wait(nullptr, &num_ready_handles, &ready_handle, &ready_result);
-  EXPECT_EQ(1u, num_ready_handles);
-  EXPECT_TRUE(ready_handle == handle0_value || ready_handle == handle1_value);
-  EXPECT_EQ(MOJO_RESULT_CANCELLED, ready_result);
-  EXPECT_EQ(MOJO_RESULT_NOT_FOUND, wait_set.RemoveHandle(handle0_value));
-
-  wait_set.Wait(nullptr, &num_ready_handles, &ready_handle, &ready_result);
-  EXPECT_EQ(1u, num_ready_handles);
-  EXPECT_TRUE(ready_handle == handle0_value || ready_handle == handle1_value);
-  EXPECT_EQ(MOJO_RESULT_CANCELLED, ready_result);
-  EXPECT_EQ(MOJO_RESULT_NOT_FOUND, wait_set.RemoveHandle(handle0_value));
-
-  // Nothing more to wait on.
-  wait_set.Wait(nullptr, &num_ready_handles, &ready_handle, &ready_result);
-  EXPECT_EQ(0u, num_ready_handles);
-}
-
-TEST_F(WaitSetTest, SatisfiedThenUnsatisfied) {
-  MessagePipe p;
-  WaitSet wait_set;
-
-  wait_set.AddHandle(p.handle0.get(), MOJO_HANDLE_SIGNAL_READABLE);
-  wait_set.AddHandle(p.handle1.get(), MOJO_HANDLE_SIGNAL_READABLE);
-
-  const char kTestMessage1[] = "testing testing testing";
-  WriteMessage(p.handle0, kTestMessage1);
-
-  size_t num_ready_handles = 2;
-  Handle ready_handles[2];
-  MojoResult ready_results[2] = {MOJO_RESULT_UNKNOWN, MOJO_RESULT_UNKNOWN};
-  wait_set.Wait(nullptr, &num_ready_handles, ready_handles, ready_results);
-  EXPECT_EQ(1u, num_ready_handles);
-  EXPECT_EQ(p.handle1.get(), ready_handles[0]);
-  EXPECT_EQ(MOJO_RESULT_OK, ready_results[0]);
-
-  EXPECT_EQ(kTestMessage1, ReadMessage(p.handle1));
-
-  ThreadedRunner write_after_delay(base::Bind(
-      [](ScopedMessagePipeHandle* handle) {
-        // Wait a little while, then write a message.
-        base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(200));
-        WriteMessage(*handle, "wakey wakey");
-      },
-      &p.handle1));
-  write_after_delay.Start();
-
-  num_ready_handles = 2;
-  wait_set.Wait(nullptr, &num_ready_handles, ready_handles, ready_results);
-  EXPECT_EQ(1u, num_ready_handles);
-  EXPECT_EQ(p.handle0.get(), ready_handles[0]);
-  EXPECT_EQ(MOJO_RESULT_OK, ready_results[0]);
-}
-
-TEST_F(WaitSetTest, EventOnly) {
-  base::WaitableEvent event(base::WaitableEvent::ResetPolicy::MANUAL,
-                            base::WaitableEvent::InitialState::SIGNALED);
-  WaitSet wait_set;
-  wait_set.AddEvent(&event);
-
-  base::WaitableEvent* ready_event = nullptr;
-  size_t num_ready_handles = 1;
-  Handle ready_handle;
-  MojoResult ready_result = MOJO_RESULT_UNKNOWN;
-  wait_set.Wait(&ready_event, &num_ready_handles, &ready_handle, &ready_result);
-  EXPECT_EQ(0u, num_ready_handles);
-  EXPECT_EQ(&event, ready_event);
-}
-
-TEST_F(WaitSetTest, EventAndHandle) {
-  const char kTestMessage[] = "hello hello";
-
-  MessagePipe p;
-  WriteMessage(p.handle0, kTestMessage);
-
-  base::WaitableEvent event(base::WaitableEvent::ResetPolicy::MANUAL,
-                            base::WaitableEvent::InitialState::NOT_SIGNALED);
-
-  WaitSet wait_set;
-  wait_set.AddHandle(p.handle1.get(), MOJO_HANDLE_SIGNAL_READABLE);
-  wait_set.AddEvent(&event);
-
-  base::WaitableEvent* ready_event = nullptr;
-  size_t num_ready_handles = 1;
-  Handle ready_handle;
-  MojoResult ready_result = MOJO_RESULT_UNKNOWN;
-  wait_set.Wait(&ready_event, &num_ready_handles, &ready_handle, &ready_result);
-  EXPECT_EQ(1u, num_ready_handles);
-  EXPECT_EQ(nullptr, ready_event);
-  EXPECT_EQ(p.handle1.get(), ready_handle);
-  EXPECT_EQ(MOJO_RESULT_OK, ready_result);
-
-  EXPECT_EQ(kTestMessage, ReadMessage(p.handle1));
-
-  ThreadedRunner signal_after_delay(base::Bind(
-      [](base::WaitableEvent* event) {
-        // Wait a little while, then close the handle.
-        base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(200));
-        event->Signal();
-      },
-      &event));
-  signal_after_delay.Start();
-
-  wait_set.Wait(&ready_event, &num_ready_handles, &ready_handle, &ready_result);
-  EXPECT_EQ(0u, num_ready_handles);
-  EXPECT_EQ(&event, ready_event);
-}
-
-TEST_F(WaitSetTest, NoStarvation) {
-  const char kTestMessage[] = "wait for it";
-  const size_t kNumTestPipes = 50;
-  const size_t kNumTestEvents = 10;
-
-  // Create a bunch of handles and events which are always ready and add them
-  // to a shared WaitSet.
-
-  WaitSet wait_set;
-
-  MessagePipe pipes[kNumTestPipes];
-  for (size_t i = 0; i < kNumTestPipes; ++i) {
-    WriteMessage(pipes[i].handle0, kTestMessage);
-    Wait(pipes[i].handle1.get(), MOJO_HANDLE_SIGNAL_READABLE);
-
-    WriteMessage(pipes[i].handle1, kTestMessage);
-    Wait(pipes[i].handle0.get(), MOJO_HANDLE_SIGNAL_READABLE);
-
-    wait_set.AddHandle(pipes[i].handle0.get(), MOJO_HANDLE_SIGNAL_READABLE);
-    wait_set.AddHandle(pipes[i].handle1.get(), MOJO_HANDLE_SIGNAL_READABLE);
-  }
-
-  std::vector<std::unique_ptr<base::WaitableEvent>> events(kNumTestEvents);
-  for (auto& event_ptr : events) {
-    event_ptr = base::MakeUnique<base::WaitableEvent>(
-        base::WaitableEvent::ResetPolicy::MANUAL,
-        base::WaitableEvent::InitialState::NOT_SIGNALED);
-    event_ptr->Signal();
-    wait_set.AddEvent(event_ptr.get());
-  }
-
-  // Now verify that all handle and event signals are deteceted within a finite
-  // number of consecutive Wait() calls. Do it a few times for good measure.
-  for (size_t i = 0; i < 3; ++i) {
-    std::set<base::WaitableEvent*> ready_events;
-    std::set<Handle> ready_handles;
-    while (ready_events.size() < kNumTestEvents ||
-           ready_handles.size() < kNumTestPipes * 2) {
-      base::WaitableEvent* ready_event = nullptr;
-      size_t num_ready_handles = 1;
-      Handle ready_handle;
-      MojoResult ready_result = MOJO_RESULT_UNKNOWN;
-      wait_set.Wait(&ready_event, &num_ready_handles, &ready_handle,
-                    &ready_result);
-      if (ready_event)
-        ready_events.insert(ready_event);
-
-      if (num_ready_handles) {
-        EXPECT_EQ(1u, num_ready_handles);
-        EXPECT_EQ(MOJO_RESULT_OK, ready_result);
-        ready_handles.insert(ready_handle);
-      }
-    }
-  }
-}
-
-}  // namespace
-}  // namespace mojo
diff --git a/mojo/public/cpp/system/tests/wait_unittest.cc b/mojo/public/cpp/system/tests/wait_unittest.cc
deleted file mode 100644
index 1d9d3c6..0000000
--- a/mojo/public/cpp/system/tests/wait_unittest.cc
+++ /dev/null
@@ -1,321 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/system/wait.h"
-
-#include <string>
-#include <vector>
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/strings/string_piece.h"
-#include "base/threading/platform_thread.h"
-#include "base/threading/simple_thread.h"
-#include "base/time/time.h"
-#include "mojo/public/c/system/types.h"
-#include "mojo/public/cpp/system/handle_signals_state.h"
-#include "mojo/public/cpp/system/message_pipe.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace {
-
-using WaitTest = testing::Test;
-using WaitManyTest = testing::Test;
-
-void WriteMessage(const ScopedMessagePipeHandle& handle,
-                  const base::StringPiece& message) {
-  MojoResult rv = WriteMessageRaw(handle.get(), message.data(),
-                                  static_cast<uint32_t>(message.size()),
-                                  nullptr, 0, MOJO_WRITE_MESSAGE_FLAG_NONE);
-  CHECK_EQ(MOJO_RESULT_OK, rv);
-}
-
-std::string ReadMessage(const ScopedMessagePipeHandle& handle) {
-  uint32_t num_bytes = 0;
-  uint32_t num_handles = 0;
-  MojoResult rv = ReadMessageRaw(handle.get(), nullptr, &num_bytes, nullptr,
-                                 &num_handles, MOJO_READ_MESSAGE_FLAG_NONE);
-  CHECK_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, rv);
-  CHECK_EQ(0u, num_handles);
-
-  std::vector<char> buffer(num_bytes);
-  rv = ReadMessageRaw(handle.get(), buffer.data(), &num_bytes, nullptr,
-                      &num_handles, MOJO_READ_MESSAGE_FLAG_NONE);
-  CHECK_EQ(MOJO_RESULT_OK, rv);
-  return std::string(buffer.data(), buffer.size());
-}
-
-class ThreadedRunner : public base::SimpleThread {
- public:
-  explicit ThreadedRunner(const base::Closure& callback)
-      : SimpleThread("ThreadedRunner"), callback_(callback) {}
-  ~ThreadedRunner() override { Join(); }
-
-  void Run() override { callback_.Run(); }
-
- private:
-  const base::Closure callback_;
-
-  DISALLOW_COPY_AND_ASSIGN(ThreadedRunner);
-};
-
-TEST_F(WaitTest, InvalidArguments) {
-  Handle invalid_handle;
-
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            Wait(invalid_handle, MOJO_HANDLE_SIGNAL_READABLE));
-
-  MessagePipe p;
-  Handle valid_handles[2] = {p.handle0.get(), p.handle1.get()};
-  Handle invalid_handles[2];
-  MojoHandleSignals signals[2] = {MOJO_HANDLE_SIGNAL_NONE,
-                                  MOJO_HANDLE_SIGNAL_NONE};
-  size_t result_index = 0;
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            WaitMany(invalid_handles, signals, 2, &result_index));
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            WaitMany(nullptr, signals, 2, &result_index));
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            WaitMany(valid_handles, nullptr, 2, &result_index));
-}
-
-TEST_F(WaitTest, Basic) {
-  MessagePipe p;
-
-  // Write to one end of the pipe and wait on the other.
-  const char kTestMessage1[] = "how about a nice game of chess?";
-  WriteMessage(p.handle0, kTestMessage1);
-  EXPECT_EQ(MOJO_RESULT_OK, Wait(p.handle1.get(), MOJO_HANDLE_SIGNAL_READABLE));
-
-  // And make sure we can also grab the handle signals state (with both the C
-  // and C++ library structs.)
-
-  MojoHandleSignalsState c_hss = {0, 0};
-  EXPECT_EQ(MOJO_RESULT_OK,
-            Wait(p.handle1.get(), MOJO_HANDLE_SIGNAL_READABLE, &c_hss));
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
-            c_hss.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
-                MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-            c_hss.satisfiable_signals);
-
-  HandleSignalsState hss;
-  EXPECT_EQ(MOJO_RESULT_OK,
-            Wait(p.handle1.get(), MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  EXPECT_TRUE(hss.readable() && hss.writable() && !hss.peer_closed());
-  EXPECT_FALSE(hss.never_readable() || hss.never_writable() ||
-               hss.never_peer_closed());
-
-  // Now close the writing end and wait for peer closure.
-
-  p.handle0.reset();
-  EXPECT_EQ(MOJO_RESULT_OK,
-            Wait(p.handle1.get(), MOJO_HANDLE_SIGNAL_PEER_CLOSED, &hss));
-
-  // Still readable as there's still a message queued. No longer writable as
-  // peer closure has been detected.
-  EXPECT_TRUE(hss.readable() && hss.peer_closed() && !hss.writable());
-  EXPECT_TRUE(hss.never_writable() && !hss.never_readable() &&
-              !hss.never_peer_closed());
-
-  // Read the message and wait for readable again. Waiting should fail since
-  // there are no more messages and the peer is closed.
-  EXPECT_EQ(kTestMessage1, ReadMessage(p.handle1));
-  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-            Wait(p.handle1.get(), MOJO_HANDLE_SIGNAL_READABLE, &hss));
-
-  // Sanity check the signals state again.
-  EXPECT_TRUE(hss.peer_closed() && !hss.readable() && !hss.writable());
-  EXPECT_TRUE(hss.never_readable() && hss.never_writable() &&
-              !hss.never_peer_closed());
-}
-
-TEST_F(WaitTest, DelayedWrite) {
-  MessagePipe p;
-
-  ThreadedRunner write_after_delay(base::Bind(
-      [](ScopedMessagePipeHandle* handle) {
-        // Wait a little while, then write a message.
-        base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(200));
-        WriteMessage(*handle, "wakey wakey");
-      },
-      &p.handle0));
-  write_after_delay.Start();
-
-  HandleSignalsState hss;
-  EXPECT_EQ(MOJO_RESULT_OK,
-            Wait(p.handle1.get(), MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  EXPECT_TRUE(hss.readable() && hss.writable() && !hss.peer_closed());
-  EXPECT_TRUE(!hss.never_readable() && !hss.never_writable() &&
-              !hss.never_peer_closed());
-}
-
-TEST_F(WaitTest, DelayedPeerClosure) {
-  MessagePipe p;
-
-  ThreadedRunner close_after_delay(base::Bind(
-      [](ScopedMessagePipeHandle* handle) {
-        // Wait a little while, then close the handle.
-        base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(200));
-        handle->reset();
-      },
-      &p.handle0));
-  close_after_delay.Start();
-
-  HandleSignalsState hss;
-  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-            Wait(p.handle1.get(), MOJO_HANDLE_SIGNAL_READABLE, &hss));
-  EXPECT_TRUE(!hss.readable() && !hss.writable() && hss.peer_closed());
-  EXPECT_TRUE(hss.never_readable() && hss.never_writable() &&
-              !hss.never_peer_closed());
-}
-
-TEST_F(WaitTest, CloseWhileWaiting) {
-  MessagePipe p;
-  ThreadedRunner close_after_delay(base::Bind(
-      [](ScopedMessagePipeHandle* handle) {
-        base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(200));
-        handle->reset();
-      },
-      &p.handle0));
-  close_after_delay.Start();
-  EXPECT_EQ(MOJO_RESULT_CANCELLED,
-            Wait(p.handle0.get(), MOJO_HANDLE_SIGNAL_READABLE));
-}
-
-TEST_F(WaitManyTest, Basic) {
-  MessagePipe p;
-
-  const char kTestMessage1[] = "hello";
-  WriteMessage(p.handle0, kTestMessage1);
-
-  // Wait for either handle to become readable. Wait twice, just to verify that
-  // we can use either the C or C++ signaling state structure for the last
-  // argument.
-
-  Handle handles[2] = {p.handle0.get(), p.handle1.get()};
-  MojoHandleSignals signals[2] = {MOJO_HANDLE_SIGNAL_READABLE,
-                                  MOJO_HANDLE_SIGNAL_READABLE};
-  size_t result_index = 0;
-  MojoHandleSignalsState c_hss[2];
-  HandleSignalsState hss[2];
-
-  EXPECT_EQ(MOJO_RESULT_OK,
-            WaitMany(handles, signals, 2, &result_index, c_hss));
-  EXPECT_EQ(1u, result_index);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, c_hss[0].satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
-                MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-            c_hss[0].satisfiable_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
-            c_hss[1].satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
-                MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-            c_hss[1].satisfiable_signals);
-
-  EXPECT_EQ(MOJO_RESULT_OK, WaitMany(handles, signals, 2, &result_index, hss));
-  EXPECT_EQ(1u, result_index);
-  EXPECT_TRUE(!hss[0].readable() && hss[0].writable() && !hss[0].peer_closed());
-  EXPECT_TRUE(!hss[0].never_readable() && !hss[0].never_writable() &&
-              !hss[0].never_peer_closed());
-  EXPECT_TRUE(hss[1].readable() && hss[1].writable() && !hss[1].peer_closed());
-  EXPECT_TRUE(!hss[1].never_readable() && !hss[1].never_writable() &&
-              !hss[1].never_peer_closed());
-
-  // Close the writer and read the message. Try to wait again, and it should
-  // fail due to the conditions being unsatisfiable.
-
-  EXPECT_EQ(kTestMessage1, ReadMessage(p.handle1));
-  p.handle0.reset();
-
-  // handles[0] is invalid.
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            WaitMany(handles, signals, 2, &result_index, hss));
-  handles[0] = handles[1];
-  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-            WaitMany(handles, signals, 1, &result_index, hss));
-  EXPECT_EQ(0u, result_index);
-  EXPECT_TRUE(!hss[0].readable() && !hss[0].writable() && hss[0].peer_closed());
-  EXPECT_TRUE(hss[0].never_readable() && hss[0].never_writable() &&
-              !hss[0].never_peer_closed());
-}
-
-TEST_F(WaitManyTest, CloseWhileWaiting) {
-  MessagePipe p, q;
-
-  Handle handles[3] = {q.handle0.get(), q.handle1.get(), p.handle1.get()};
-  MojoHandleSignals signals[3] = {MOJO_HANDLE_SIGNAL_READABLE,
-                                  MOJO_HANDLE_SIGNAL_READABLE,
-                                  MOJO_HANDLE_SIGNAL_READABLE};
-
-  ThreadedRunner close_after_delay(base::Bind(
-      [](ScopedMessagePipeHandle* handle) {
-        base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(200));
-        handle->reset();
-      },
-      &p.handle1));
-  close_after_delay.Start();
-
-  size_t result_index = 0;
-  EXPECT_EQ(MOJO_RESULT_CANCELLED,
-            WaitMany(handles, signals, 3, &result_index));
-  EXPECT_EQ(2u, result_index);
-}
-
-TEST_F(WaitManyTest, DelayedWrite) {
-  MessagePipe p;
-
-  ThreadedRunner write_after_delay(base::Bind(
-      [](ScopedMessagePipeHandle* handle) {
-        // Wait a little while, then write a message.
-        base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(200));
-        WriteMessage(*handle, "wakey wakey");
-      },
-      &p.handle0));
-  write_after_delay.Start();
-
-  Handle handles[2] = {p.handle0.get(), p.handle1.get()};
-  MojoHandleSignals signals[2] = {MOJO_HANDLE_SIGNAL_READABLE,
-                                  MOJO_HANDLE_SIGNAL_READABLE};
-  size_t result_index = 0;
-  HandleSignalsState hss[2];
-  EXPECT_EQ(MOJO_RESULT_OK, WaitMany(handles, signals, 2, &result_index, hss));
-  EXPECT_EQ(1u, result_index);
-  EXPECT_TRUE(!hss[0].readable() && hss[0].writable() && !hss[0].peer_closed());
-  EXPECT_TRUE(!hss[0].never_readable() && !hss[0].never_writable() &&
-              !hss[0].never_peer_closed());
-  EXPECT_TRUE(hss[1].readable() && hss[1].writable() && !hss[1].peer_closed());
-  EXPECT_TRUE(!hss[1].never_readable() && !hss[1].never_writable() &&
-              !hss[1].never_peer_closed());
-}
-
-TEST_F(WaitManyTest, DelayedPeerClosure) {
-  MessagePipe p, q;
-
-  ThreadedRunner close_after_delay(base::Bind(
-      [](ScopedMessagePipeHandle* handle) {
-        // Wait a little while, then close the handle.
-        base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(200));
-        handle->reset();
-      },
-      &p.handle0));
-  close_after_delay.Start();
-
-  Handle handles[3] = {q.handle0.get(), q.handle1.get(), p.handle1.get()};
-  MojoHandleSignals signals[3] = {MOJO_HANDLE_SIGNAL_READABLE,
-                                  MOJO_HANDLE_SIGNAL_READABLE,
-                                  MOJO_HANDLE_SIGNAL_READABLE};
-  size_t result_index = 0;
-  HandleSignalsState hss[3];
-  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-            WaitMany(handles, signals, 3, &result_index, hss));
-  EXPECT_EQ(2u, result_index);
-  EXPECT_TRUE(!hss[2].readable() && !hss[2].writable() && hss[2].peer_closed());
-  EXPECT_TRUE(hss[2].never_readable() && hss[2].never_writable() &&
-              !hss[2].never_peer_closed());
-}
-
-}  // namespace
-}  // namespace mojo
diff --git a/mojo/public/cpp/system/wait.cc b/mojo/public/cpp/system/wait.cc
deleted file mode 100644
index e4e124f..0000000
--- a/mojo/public/cpp/system/wait.cc
+++ /dev/null
@@ -1,200 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/system/wait.h"
-
-#include <memory>
-#include <vector>
-
-#include "base/memory/ptr_util.h"
-#include "base/memory/ref_counted.h"
-#include "base/synchronization/waitable_event.h"
-#include "mojo/public/c/system/watcher.h"
-#include "mojo/public/cpp/system/watcher.h"
-
-namespace mojo {
-namespace {
-
-class WatchContext : public base::RefCountedThreadSafe<WatchContext> {
- public:
-  WatchContext()
-      : event_(base::WaitableEvent::ResetPolicy::AUTOMATIC,
-               base::WaitableEvent::InitialState::NOT_SIGNALED) {}
-
-  base::WaitableEvent& event() { return event_; }
-  MojoResult wait_result() const { return wait_result_; }
-  MojoHandleSignalsState wait_state() const { return wait_state_; }
-  uintptr_t context_value() const { return reinterpret_cast<uintptr_t>(this); }
-
-  static void OnNotification(uintptr_t context_value,
-                             MojoResult result,
-                             MojoHandleSignalsState state,
-                             MojoWatcherNotificationFlags flags) {
-    auto* context = reinterpret_cast<WatchContext*>(context_value);
-    context->Notify(result, state);
-    if (result == MOJO_RESULT_CANCELLED) {
-      // Balanced in Wait() or WaitMany().
-      context->Release();
-    }
-  }
-
- private:
-  friend class base::RefCountedThreadSafe<WatchContext>;
-
-  ~WatchContext() {}
-
-  void Notify(MojoResult result, MojoHandleSignalsState state) {
-    if (wait_result_ == MOJO_RESULT_UNKNOWN) {
-      wait_result_ = result;
-      wait_state_ = state;
-    }
-    event_.Signal();
-  }
-
-  base::WaitableEvent event_;
-
-  // NOTE: Although these are modified in Notify() which may be called from any
-  // thread, Notify() is guaranteed to never run concurrently with itself.
-  // Furthermore, they are only modified once, before |event_| signals; so there
-  // is no need for a WatchContext user to synchronize access to these fields
-  // apart from waiting on |event()|.
-  MojoResult wait_result_ = MOJO_RESULT_UNKNOWN;
-  MojoHandleSignalsState wait_state_ = {0, 0};
-
-  DISALLOW_COPY_AND_ASSIGN(WatchContext);
-};
-
-}  // namespace
-
-MojoResult Wait(Handle handle,
-                MojoHandleSignals signals,
-                MojoHandleSignalsState* signals_state) {
-  ScopedWatcherHandle watcher;
-  MojoResult rv = CreateWatcher(&WatchContext::OnNotification, &watcher);
-  DCHECK_EQ(MOJO_RESULT_OK, rv);
-
-  scoped_refptr<WatchContext> context = new WatchContext;
-
-  // Balanced in WatchContext::OnNotification if MojoWatch() is successful.
-  // Otherwise balanced immediately below.
-  context->AddRef();
-
-  rv = MojoWatch(watcher.get().value(), handle.value(), signals,
-                 context->context_value());
-  if (rv == MOJO_RESULT_INVALID_ARGUMENT) {
-    // Balanced above.
-    context->Release();
-    return rv;
-  }
-  DCHECK_EQ(MOJO_RESULT_OK, rv);
-
-  uint32_t num_ready_contexts = 1;
-  uintptr_t ready_context;
-  MojoResult ready_result;
-  MojoHandleSignalsState ready_state;
-  rv = MojoArmWatcher(watcher.get().value(), &num_ready_contexts,
-                      &ready_context, &ready_result, &ready_state);
-  if (rv == MOJO_RESULT_FAILED_PRECONDITION) {
-    DCHECK_EQ(1u, num_ready_contexts);
-    if (signals_state)
-      *signals_state = ready_state;
-    return ready_result;
-  }
-
-  // Wait for the first notification only.
-  context->event().Wait();
-
-  ready_result = context->wait_result();
-  DCHECK_NE(MOJO_RESULT_UNKNOWN, ready_result);
-
-  if (signals_state)
-    *signals_state = context->wait_state();
-
-  return ready_result;
-}
-
-MojoResult WaitMany(const Handle* handles,
-                    const MojoHandleSignals* signals,
-                    size_t num_handles,
-                    size_t* result_index,
-                    MojoHandleSignalsState* signals_states) {
-  if (!handles || !signals)
-    return MOJO_RESULT_INVALID_ARGUMENT;
-
-  ScopedWatcherHandle watcher;
-  MojoResult rv = CreateWatcher(&WatchContext::OnNotification, &watcher);
-  DCHECK_EQ(MOJO_RESULT_OK, rv);
-
-  std::vector<scoped_refptr<WatchContext>> contexts(num_handles);
-  std::vector<base::WaitableEvent*> events(num_handles);
-  for (size_t i = 0; i < num_handles; ++i) {
-    contexts[i] = new WatchContext();
-
-    // Balanced in WatchContext::OnNotification if MojoWatch() is successful.
-    // Otherwise balanced immediately below.
-    contexts[i]->AddRef();
-
-    MojoResult rv = MojoWatch(watcher.get().value(), handles[i].value(),
-                              signals[i], contexts[i]->context_value());
-    if (rv == MOJO_RESULT_INVALID_ARGUMENT) {
-      if (result_index)
-        *result_index = i;
-
-      // Balanced above.
-      contexts[i]->Release();
-
-      return MOJO_RESULT_INVALID_ARGUMENT;
-    }
-
-    events[i] = &contexts[i]->event();
-  }
-
-  uint32_t num_ready_contexts = 1;
-  uintptr_t ready_context = 0;
-  MojoResult ready_result = MOJO_RESULT_UNKNOWN;
-  MojoHandleSignalsState ready_state{0, 0};
-  rv = MojoArmWatcher(watcher.get().value(), &num_ready_contexts,
-                      &ready_context, &ready_result, &ready_state);
-
-  size_t index = num_handles;
-  if (rv == MOJO_RESULT_FAILED_PRECONDITION) {
-    DCHECK_EQ(1u, num_ready_contexts);
-
-    // Most commonly we only watch a small number of handles. Just scan for
-    // the right index.
-    for (size_t i = 0; i < num_handles; ++i) {
-      if (contexts[i]->context_value() == ready_context) {
-        index = i;
-        break;
-      }
-    }
-  } else {
-    DCHECK_EQ(MOJO_RESULT_OK, rv);
-
-    // Wait for one of the contexts to signal. First one wins.
-    index = base::WaitableEvent::WaitMany(events.data(), events.size());
-    ready_result = contexts[index]->wait_result();
-    ready_state = contexts[index]->wait_state();
-  }
-
-  DCHECK_NE(MOJO_RESULT_UNKNOWN, ready_result);
-  DCHECK_LT(index, num_handles);
-
-  if (result_index)
-    *result_index = index;
-
-  if (signals_states) {
-    for (size_t i = 0; i < num_handles; ++i) {
-      if (i == index) {
-        signals_states[i] = ready_state;
-      } else {
-        signals_states[i] = handles[i].QuerySignalsState();
-      }
-    }
-  }
-
-  return ready_result;
-}
-
-}  // namespace mojo
diff --git a/mojo/public/cpp/system/wait.h b/mojo/public/cpp/system/wait.h
deleted file mode 100644
index 808e44f..0000000
--- a/mojo/public/cpp/system/wait.h
+++ /dev/null
@@ -1,75 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_SYSTEM_WAIT_H_
-#define MOJO_PUBLIC_CPP_SYSTEM_WAIT_H_
-
-#include <stddef.h>
-
-#include "mojo/public/c/system/types.h"
-#include "mojo/public/cpp/system/handle.h"
-#include "mojo/public/cpp/system/system_export.h"
-
-namespace mojo {
-
-// Blocks the calling thread, waiting for one or more signals in |signals| to be
-// become satisfied -- or for all of them to become unsatisfiable -- on the
-// given Handle.
-//
-// If |signals_state| is non-null, |handle| is valid, the wait is not cancelled
-// (see return values below), the last known signaling state of |handle| is
-// written to |*signals_state| before returning.
-//
-// Return values:
-//   |MOJO_RESULT_OK| if one or more signals in |signals| has been raised on
-//       |handle| .
-//   |MOJO_RESULT_FAILED_PRECONDITION| if the state of |handle| changes such
-//       that no signals in |signals| can ever be raised again.
-//   |MOJO_RESULT_INVALID_ARGUMENT| if |handle| is not a valid handle.
-//   |MOJO_RESULT_CANCELLED| if the wait was cancelled because |handle| was
-//       closed by some other thread while waiting.
-MOJO_CPP_SYSTEM_EXPORT MojoResult
-Wait(Handle handle,
-     MojoHandleSignals signals,
-     MojoHandleSignalsState* signals_state = nullptr);
-
-// Waits on |handles[0]|, ..., |handles[num_handles-1]| until:
-//  - At least one handle satisfies a signal indicated in its respective
-//    |signals[0]|, ..., |signals[num_handles-1]|.
-//  - It becomes known that no signal in some |signals[i]| will ever be
-//    satisfied.
-//
-// This means that |WaitMany()| behaves as if |Wait()| were called on each
-// handle/signals pair simultaneously, completing when the first |Wait()| would
-// complete.
-//
-// If |signals_states| is non-null, all other arguments are valid, and the wait
-// is not cancelled (see return values below), the last known signaling state of
-// each Handle |handles[i]| is written to its corresponding entry in
-// |signals_states[i]| before returning.
-//
-// Returns values:
-//   |MOJO_RESULT_OK| if one of the Handles in |handles| had one or more of its
-//       correpsonding signals satisfied. |*result_index| contains the index
-//       of the Handle in question if |result_index| is non-null.
-//   |MOJO_RESULT_FAILED_PRECONDITION| if one of the Handles in |handles|
-//       changes state such that its corresponding signals become permanently
-//       unsatisfiable. |*result_index| contains the index of the handle in
-//       question if |result_index| is non-null.
-//   |MOJO_RESULT_INVALID_ARGUMENT| if any Handle in |handles| is invalid,
-//       or if either |handles| or |signals| is null.
-//   |MOJO_RESULT_CANCELLED| if the wait was cancelled because a handle in
-//       |handles| was closed by some other thread while waiting.
-//       |*result_index| contains the index of the closed Handle if
-//       |result_index| is non-null.
-MOJO_CPP_SYSTEM_EXPORT MojoResult
-WaitMany(const Handle* handles,
-         const MojoHandleSignals* signals,
-         size_t num_handles,
-         size_t* result_index = nullptr,
-         MojoHandleSignalsState* signals_states = nullptr);
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_SYSTEM_WAIT_H_
diff --git a/mojo/public/cpp/system/wait_set.cc b/mojo/public/cpp/system/wait_set.cc
deleted file mode 100644
index 1728f81..0000000
--- a/mojo/public/cpp/system/wait_set.cc
+++ /dev/null
@@ -1,371 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/system/wait_set.h"
-
-#include <algorithm>
-#include <limits>
-#include <map>
-#include <set>
-#include <vector>
-
-#include "base/containers/stack_container.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "base/synchronization/lock.h"
-#include "base/synchronization/waitable_event.h"
-#include "mojo/public/cpp/system/watcher.h"
-
-namespace mojo {
-
-class WaitSet::State : public base::RefCountedThreadSafe<State> {
- public:
-  State()
-      : handle_event_(base::WaitableEvent::ResetPolicy::MANUAL,
-                      base::WaitableEvent::InitialState::NOT_SIGNALED) {
-    MojoResult rv = CreateWatcher(&Context::OnNotification, &watcher_handle_);
-    DCHECK_EQ(MOJO_RESULT_OK, rv);
-  }
-
-  void ShutDown() {
-    // NOTE: This may immediately invoke Notify for every context.
-    watcher_handle_.reset();
-  }
-
-  MojoResult AddEvent(base::WaitableEvent* event) {
-    auto result = user_events_.insert(event);
-    if (result.second)
-      return MOJO_RESULT_OK;
-    return MOJO_RESULT_ALREADY_EXISTS;
-  }
-
-  MojoResult RemoveEvent(base::WaitableEvent* event) {
-    auto it = user_events_.find(event);
-    if (it == user_events_.end())
-      return MOJO_RESULT_NOT_FOUND;
-    user_events_.erase(it);
-    return MOJO_RESULT_OK;
-  }
-
-  MojoResult AddHandle(Handle handle, MojoHandleSignals signals) {
-    DCHECK(watcher_handle_.is_valid());
-
-    scoped_refptr<Context> context = new Context(this, handle);
-
-    {
-      base::AutoLock lock(lock_);
-
-      if (handle_to_context_.count(handle))
-        return MOJO_RESULT_ALREADY_EXISTS;
-      DCHECK(!contexts_.count(context->context_value()));
-
-      handle_to_context_[handle] = context;
-      contexts_[context->context_value()] = context;
-    }
-
-    // Balanced in State::Notify() with MOJO_RESULT_CANCELLED if
-    // MojoWatch() succeeds. Otherwise balanced immediately below.
-    context->AddRef();
-
-    // This can notify immediately if the watcher is already armed. Don't hold
-    // |lock_| while calling it.
-    MojoResult rv = MojoWatch(watcher_handle_.get().value(), handle.value(),
-                              signals, context->context_value());
-    if (rv == MOJO_RESULT_INVALID_ARGUMENT) {
-      base::AutoLock lock(lock_);
-      handle_to_context_.erase(handle);
-      contexts_.erase(context->context_value());
-
-      // Balanced above.
-      context->Release();
-      return rv;
-    }
-    DCHECK_EQ(MOJO_RESULT_OK, rv);
-
-    return rv;
-  }
-
-  MojoResult RemoveHandle(Handle handle) {
-    DCHECK(watcher_handle_.is_valid());
-
-    scoped_refptr<Context> context;
-    {
-      base::AutoLock lock(lock_);
-      auto it = handle_to_context_.find(handle);
-      if (it == handle_to_context_.end())
-        return MOJO_RESULT_NOT_FOUND;
-
-      context = std::move(it->second);
-      handle_to_context_.erase(it);
-
-      // Ensure that we never return this handle as a ready result again. Note
-      // that it's removal from |handle_to_context_| above ensures it will never
-      // be added back to this map.
-      ready_handles_.erase(handle);
-    }
-
-    // NOTE: This may enter the notification callback immediately, so don't hold
-    // |lock_| while calling it.
-    MojoResult rv = MojoCancelWatch(watcher_handle_.get().value(),
-                                    context->context_value());
-
-    // We don't really care whether or not this succeeds. In either case, the
-    // context was or will imminently be cancelled and moved from |contexts_|
-    // to |cancelled_contexts_|.
-    DCHECK(rv == MOJO_RESULT_OK || rv == MOJO_RESULT_NOT_FOUND);
-
-    {
-      // Always clear |cancelled_contexts_| in case it's accumulated any more
-      // entries since the last time we ran.
-      base::AutoLock lock(lock_);
-      cancelled_contexts_.clear();
-    }
-
-    return rv;
-  }
-
-  void Wait(base::WaitableEvent** ready_event,
-            size_t* num_ready_handles,
-            Handle* ready_handles,
-            MojoResult* ready_results,
-            MojoHandleSignalsState* signals_states) {
-    DCHECK(watcher_handle_.is_valid());
-    DCHECK(num_ready_handles);
-    DCHECK(ready_handles);
-    DCHECK(ready_results);
-    {
-      base::AutoLock lock(lock_);
-      if (ready_handles_.empty()) {
-        // No handles are currently in the ready set. Make sure the event is
-        // reset and try to arm the watcher.
-        handle_event_.Reset();
-
-        DCHECK_LE(*num_ready_handles, std::numeric_limits<uint32_t>::max());
-        uint32_t num_ready_contexts = static_cast<uint32_t>(*num_ready_handles);
-
-        base::StackVector<uintptr_t, 4> ready_contexts;
-        ready_contexts.container().resize(num_ready_contexts);
-        base::StackVector<MojoHandleSignalsState, 4> ready_states;
-        MojoHandleSignalsState* out_states = signals_states;
-        if (!out_states) {
-          // If the caller didn't provide a buffer for signal states, we provide
-          // our own locally. MojoArmWatcher() requires one if we want to handle
-          // arming failure properly.
-          ready_states.container().resize(num_ready_contexts);
-          out_states = ready_states.container().data();
-        }
-        MojoResult rv = MojoArmWatcher(
-            watcher_handle_.get().value(), &num_ready_contexts,
-            ready_contexts.container().data(), ready_results, out_states);
-
-        if (rv == MOJO_RESULT_FAILED_PRECONDITION) {
-          // Simulate the handles becoming ready. We do this in lieu of
-          // returning the results immediately so as to avoid potentially
-          // starving user events. i.e., we always want to call WaitMany()
-          // below.
-          handle_event_.Signal();
-          for (size_t i = 0; i < num_ready_contexts; ++i) {
-            auto it = contexts_.find(ready_contexts.container()[i]);
-            DCHECK(it != contexts_.end());
-            ready_handles_[it->second->handle()] = {ready_results[i],
-                                                    out_states[i]};
-          }
-        } else if (rv == MOJO_RESULT_NOT_FOUND) {
-          // Nothing to watch. If there are no user events, always signal to
-          // avoid deadlock.
-          if (user_events_.empty())
-            handle_event_.Signal();
-        } else {
-          // Watcher must be armed now. No need to manually signal.
-          DCHECK_EQ(MOJO_RESULT_OK, rv);
-        }
-      }
-    }
-
-    // Build a local contiguous array of events to wait on. These are rotated
-    // across Wait() calls to avoid starvation, by virtue of the fact that
-    // WaitMany guarantees left-to-right priority when multiple events are
-    // signaled.
-
-    base::StackVector<base::WaitableEvent*, 4> events;
-    events.container().resize(user_events_.size() + 1);
-    if (waitable_index_shift_ > user_events_.size())
-      waitable_index_shift_ = 0;
-
-    size_t dest_index = waitable_index_shift_++;
-    events.container()[dest_index] = &handle_event_;
-    for (auto* e : user_events_) {
-      dest_index = (dest_index + 1) % events.container().size();
-      events.container()[dest_index] = e;
-    }
-
-    size_t index = base::WaitableEvent::WaitMany(events.container().data(),
-                                                 events.container().size());
-    base::AutoLock lock(lock_);
-
-    // Pop as many handles as we can out of the ready set and return them. Note
-    // that we do this regardless of which event signaled, as there may be
-    // ready handles in any case and they may be interesting to the caller.
-    *num_ready_handles = std::min(*num_ready_handles, ready_handles_.size());
-    for (size_t i = 0; i < *num_ready_handles; ++i) {
-      auto it = ready_handles_.begin();
-      ready_handles[i] = it->first;
-      ready_results[i] = it->second.result;
-      if (signals_states)
-        signals_states[i] = it->second.signals_state;
-      ready_handles_.erase(it);
-    }
-
-    // If the caller cares, let them know which user event unblocked us, if any.
-    if (ready_event) {
-      if (events.container()[index] == &handle_event_)
-        *ready_event = nullptr;
-      else
-        *ready_event = events.container()[index];
-    }
-  }
-
- private:
-  friend class base::RefCountedThreadSafe<State>;
-
-  class Context : public base::RefCountedThreadSafe<Context> {
-   public:
-    Context(scoped_refptr<State> state, Handle handle)
-        : state_(state), handle_(handle) {}
-
-    Handle handle() const { return handle_; }
-
-    uintptr_t context_value() const {
-      return reinterpret_cast<uintptr_t>(this);
-    }
-
-    static void OnNotification(uintptr_t context,
-                               MojoResult result,
-                               MojoHandleSignalsState signals_state,
-                               MojoWatcherNotificationFlags flags) {
-      reinterpret_cast<Context*>(context)->Notify(result, signals_state);
-    }
-
-   private:
-    friend class base::RefCountedThreadSafe<Context>;
-
-    ~Context() {}
-
-    void Notify(MojoResult result, MojoHandleSignalsState signals_state) {
-      state_->Notify(handle_, result, signals_state, this);
-    }
-
-    const scoped_refptr<State> state_;
-    const Handle handle_;
-
-    DISALLOW_COPY_AND_ASSIGN(Context);
-  };
-
-  ~State() {}
-
-  void Notify(Handle handle,
-              MojoResult result,
-              MojoHandleSignalsState signals_state,
-              Context* context) {
-    base::AutoLock lock(lock_);
-
-    // This could be a cancellation notification following an explicit
-    // RemoveHandle(), in which case we really don't care and don't want to
-    // add it to the ready set. Only update and signal if that's not the case.
-    if (!handle_to_context_.count(handle)) {
-      DCHECK_EQ(MOJO_RESULT_CANCELLED, result);
-    } else {
-      ready_handles_[handle] = {result, signals_state};
-      handle_event_.Signal();
-    }
-
-    // Whether it's an implicit or explicit cancellation, erase from |contexts_|
-    // and append to |cancelled_contexts_|.
-    if (result == MOJO_RESULT_CANCELLED) {
-      contexts_.erase(context->context_value());
-      handle_to_context_.erase(handle);
-
-      // NOTE: We retain a context ref in |cancelled_contexts_| to ensure that
-      // this Context's heap address is not reused too soon. For example, it
-      // would otherwise be possible for the user to call AddHandle() from the
-      // WaitSet's thread immediately after this notification has fired on
-      // another thread, potentially reusing the same heap address for the newly
-      // added Context; and then they may call RemoveHandle() for this handle
-      // (not knowing its context has just been implicitly cancelled) and
-      // cause the new Context to be incorrectly removed from |contexts_|.
-      //
-      // This vector is cleared on the WaitSet's own thread every time
-      // RemoveHandle is called.
-      cancelled_contexts_.emplace_back(make_scoped_refptr(context));
-
-      // Balanced in State::AddHandle().
-      context->Release();
-    }
-  }
-
-  struct ReadyState {
-    ReadyState() = default;
-    ReadyState(MojoResult result, MojoHandleSignalsState signals_state)
-        : result(result), signals_state(signals_state) {}
-    ~ReadyState() = default;
-
-    MojoResult result = MOJO_RESULT_UNKNOWN;
-    MojoHandleSignalsState signals_state = {0, 0};
-  };
-
-  // Not guarded by lock. Must only be accessed from the WaitSet's owning
-  // thread.
-  ScopedWatcherHandle watcher_handle_;
-
-  base::Lock lock_;
-  std::map<uintptr_t, scoped_refptr<Context>> contexts_;
-  std::map<Handle, scoped_refptr<Context>> handle_to_context_;
-  std::map<Handle, ReadyState> ready_handles_;
-  std::vector<scoped_refptr<Context>> cancelled_contexts_;
-  std::set<base::WaitableEvent*> user_events_;
-
-  // Event signaled any time a handle notification is received.
-  base::WaitableEvent handle_event_;
-
-  // Offset by which to rotate the current set of waitable objects. This is used
-  // to guard against event starvation, as base::WaitableEvent::WaitMany gives
-  // preference to events in left-to-right order.
-  size_t waitable_index_shift_ = 0;
-
-  DISALLOW_COPY_AND_ASSIGN(State);
-};
-
-WaitSet::WaitSet() : state_(new State) {}
-
-WaitSet::~WaitSet() {
-  state_->ShutDown();
-}
-
-MojoResult WaitSet::AddEvent(base::WaitableEvent* event) {
-  return state_->AddEvent(event);
-}
-
-MojoResult WaitSet::RemoveEvent(base::WaitableEvent* event) {
-  return state_->RemoveEvent(event);
-}
-
-MojoResult WaitSet::AddHandle(Handle handle, MojoHandleSignals signals) {
-  return state_->AddHandle(handle, signals);
-}
-
-MojoResult WaitSet::RemoveHandle(Handle handle) {
-  return state_->RemoveHandle(handle);
-}
-
-void WaitSet::Wait(base::WaitableEvent** ready_event,
-                   size_t* num_ready_handles,
-                   Handle* ready_handles,
-                   MojoResult* ready_results,
-                   MojoHandleSignalsState* signals_states) {
-  state_->Wait(ready_event, num_ready_handles, ready_handles, ready_results,
-               signals_states);
-}
-
-}  // namespace mojo
diff --git a/mojo/public/cpp/system/wait_set.h b/mojo/public/cpp/system/wait_set.h
deleted file mode 100644
index 5047a86..0000000
--- a/mojo/public/cpp/system/wait_set.h
+++ /dev/null
@@ -1,124 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_SYSTEM_WAIT_SET_H_
-#define MOJO_PUBLIC_CPP_SYSTEM_WAIT_SET_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "mojo/public/c/system/types.h"
-#include "mojo/public/cpp/system/handle.h"
-#include "mojo/public/cpp/system/system_export.h"
-
-namespace base {
-class WaitableEvent;
-}
-
-namespace mojo {
-
-// WaitSet provides an efficient means of blocking a thread on any number of
-// events and Mojo handle state changes.
-//
-// Unlike WaitMany(), which incurs some extra setup cost for every call, a
-// WaitSet maintains some persistent accounting of the handles added or removed
-// from the set. A blocking wait operation (see  the Wait() method  below) can
-// then be performed multiple times for the same set of events and handles with
-// minimal additional setup per call.
-//
-// WaitSet is NOT thread-safe, so naturally handles and events may not be added
-// to or removed from the set while waiting.
-class MOJO_CPP_SYSTEM_EXPORT WaitSet {
- public:
-  WaitSet();
-  ~WaitSet();
-
-  // Adds |event| to the set of events to wait on. If successful, any future
-  // Wait() on this WaitSet will wake up if the event is signaled.
-  //
-  // |event| is not owned.
-  //
-  // Return values:
-  //   |MOJO_RESULT_OK| if |event| has been successfully added.
-  //   |MOJO_RESULT_ALREADY_EXISTS| if |event| is already in this WaitSet.
-  MojoResult AddEvent(base::WaitableEvent* event);
-
-  // Removes |event| from the set of events to wait on.
-  //
-  // Return values:
-  //   |MOJO_RESULT_OK| if |event| has been successfully added.
-  //   |MOJO_RESULT_NOT_FOUND| if |event| was not in the set.
-  MojoResult RemoveEvent(base::WaitableEvent* event);
-
-  // Adds |handle| to the set of handles to wait on. If successful, any future
-  // Wait() on this WaitSet will wake up in the event that one or more signals
-  // in |signals| becomes satisfied on |handle| or all of them become
-  // permanently unsatisfiable.
-  //
-  // Return values:
-  //   |MOJO_RESULT_OK| if |handle| has been successfully added.
-  //   |MOJO_RESULT_ALREADY_EXISTS| if |handle| is already in this WaitSet.
-  //   |MOJO_RESULT_INVALID_ARGUMENT| if |handle| is not a valid handle.
-  MojoResult AddHandle(Handle handle, MojoHandleSignals signals);
-
-  // Removes |handle| from the set of handles to wait on. Future calls to
-  // Wait() will be unaffected by the state of this handle.
-  //
-  // Return values:
-  //   |MOJO_RESULT_OK| if |handle| has been successfully removed.
-  //   |MOJO_RESULT_NOT_FOUND| if |handle| was not in the set.
-  MojoResult RemoveHandle(Handle handle);
-
-  // Waits on the current set of handles, waking up when one more of them meets
-  // the signaling conditions which were specified when they were added via
-  // AddHandle() above.
-  //
-  // |*num_ready_handles| on input must specify the number of entries available
-  // for output storage in |ready_handles| and |ready_result| (which must both
-  // be non-null). If |signals_states| is non-null it must also point to enough
-  // storage for |*num_ready_handles| MojoHandleSignalsState structures.
-  //
-  // Upon return, |*num_ready_handles| will contain the total number of handles
-  // whose information is stored in the given output buffers.
-  //
-  // If |ready_event| is non-null and the Wait() was unblocked by a user event
-  // signaling, the address of the event which signaled will be placed in
-  // |*ready_event|. Note that this is not necessarily exclusive to one or more
-  // handles also being ready. If |ready_event| is non-null and no user event
-  // was signaled for this Wait(), |*ready_event| will be null upon return.
-  //
-  // Every entry in |ready_handles| on output corresponds to one of the handles
-  // whose signaling state termianted the Wait() operation. Every corresponding
-  // entry in |ready_results| indicates the status of a ready handle according
-  // to the following result codes:
-  //   |MOJO_RESULT_OK| one or more signals for the handle has been satisfied.
-  //   |MOJO_RESULT_FAILED_PRECONDITION| all of the signals for the handle have
-  //       become permanently unsatisfiable.
-  //   |MOJO_RESULT_CANCELLED| if the handle has been closed from another
-  //       thread. NOTE: It is important to recognize that this means the
-  //       corresponding value in |ready_handles| is either invalid, or valid
-  //       but referring to a different handle (i.e. has already been reused) by
-  //       the time Wait() returns. The handle in question is automatically
-  //       removed from the WaitSet.
-  void Wait(base::WaitableEvent** ready_event,
-            size_t* num_ready_handles,
-            Handle* ready_handles,
-            MojoResult* ready_results,
-            MojoHandleSignalsState* signals_states = nullptr);
-
- private:
-  class State;
-
-  // Thread-safe state associated with this WaitSet. Used to aggregate
-  // notifications from watched handles.
-  scoped_refptr<State> state_;
-
-  DISALLOW_COPY_AND_ASSIGN(WaitSet);
-};
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_SYSTEM_WAIT_SET_H_
diff --git a/mojo/public/cpp/system/watcher.cc b/mojo/public/cpp/system/watcher.cc
deleted file mode 100644
index 0c62ba8..0000000
--- a/mojo/public/cpp/system/watcher.cc
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/public/cpp/system/watcher.h"
-
-#include "mojo/public/c/system/functions.h"
-
-namespace mojo {
-
-MojoResult CreateWatcher(MojoWatcherCallback callback,
-                         ScopedWatcherHandle* watcher_handle) {
-  MojoHandle handle;
-  MojoResult rv = MojoCreateWatcher(callback, &handle);
-  if (rv == MOJO_RESULT_OK)
-    watcher_handle->reset(WatcherHandle(handle));
-  return rv;
-}
-
-}  // namespace mojo
diff --git a/mojo/public/cpp/system/watcher.h b/mojo/public/cpp/system/watcher.h
deleted file mode 100644
index d0a2578..0000000
--- a/mojo/public/cpp/system/watcher.h
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MOJO_PUBLIC_CPP_SYSTEM_WATCHER_H_
-#define MOJO_PUBLIC_CPP_SYSTEM_WATCHER_H_
-
-#include "mojo/public/c/system/types.h"
-#include "mojo/public/c/system/watcher.h"
-#include "mojo/public/cpp/system/handle.h"
-#include "mojo/public/cpp/system/system_export.h"
-
-namespace mojo {
-
-// A strongly-typed representation of a |MojoHandle| for a watcher.
-class WatcherHandle : public Handle {
- public:
-  WatcherHandle() = default;
-  explicit WatcherHandle(MojoHandle value) : Handle(value) {}
-
-  // Copying and assignment allowed.
-};
-
-static_assert(sizeof(WatcherHandle) == sizeof(Handle),
-              "Bad size for C++ WatcherHandle");
-
-typedef ScopedHandleBase<WatcherHandle> ScopedWatcherHandle;
-static_assert(sizeof(ScopedWatcherHandle) == sizeof(WatcherHandle),
-              "Bad size for C++ ScopedWatcherHandle");
-
-MOJO_CPP_SYSTEM_EXPORT MojoResult
-CreateWatcher(MojoWatcherCallback callback,
-              ScopedWatcherHandle* watcher_handle);
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_SYSTEM_WATCHER_H_
diff --git a/mojo/public/cpp/test_support/BUILD.gn b/mojo/public/cpp/test_support/BUILD.gn
deleted file mode 100644
index efa1712..0000000
--- a/mojo/public/cpp/test_support/BUILD.gn
+++ /dev/null
@@ -1,19 +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.
-
-static_library("test_utils") {
-  testonly = true
-
-  sources = [
-    "lib/test_support.cc",
-    "lib/test_utils.cc",
-    "test_utils.h",
-  ]
-
-  deps = [
-    "//mojo/public/c/test_support",
-    "//mojo/public/cpp/system",
-    "//testing/gtest",
-  ]
-}
diff --git a/mojo/public/cpp/test_support/lib/test_support.cc b/mojo/public/cpp/test_support/lib/test_support.cc
deleted file mode 100644
index 0b6035b..0000000
--- a/mojo/public/cpp/test_support/lib/test_support.cc
+++ /dev/null
@@ -1,26 +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 "mojo/public/cpp/test_support/test_support.h"
-
-#include <stdlib.h>
-
-namespace mojo {
-namespace test {
-
-std::vector<std::string> EnumerateSourceRootRelativeDirectory(
-    const std::string& relative_path) {
-  char** names = MojoTestSupportEnumerateSourceRootRelativeDirectory(
-      relative_path.c_str());
-  std::vector<std::string> results;
-  for (char** ptr = names; *ptr != nullptr; ++ptr) {
-    results.push_back(*ptr);
-    free(*ptr);
-  }
-  free(names);
-  return results;
-}
-
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/public/cpp/test_support/lib/test_utils.cc b/mojo/public/cpp/test_support/lib/test_utils.cc
deleted file mode 100644
index 7fe6f02..0000000
--- a/mojo/public/cpp/test_support/lib/test_utils.cc
+++ /dev/null
@@ -1,100 +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 "mojo/public/cpp/test_support/test_utils.h"
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include "mojo/public/cpp/system/core.h"
-#include "mojo/public/cpp/system/wait.h"
-#include "mojo/public/cpp/test_support/test_support.h"
-
-namespace mojo {
-namespace test {
-
-bool WriteTextMessage(const MessagePipeHandle& handle,
-                      const std::string& text) {
-  MojoResult rv = WriteMessageRaw(handle,
-                                  text.data(),
-                                  static_cast<uint32_t>(text.size()),
-                                  nullptr,
-                                  0,
-                                  MOJO_WRITE_MESSAGE_FLAG_NONE);
-  return rv == MOJO_RESULT_OK;
-}
-
-bool ReadTextMessage(const MessagePipeHandle& handle, std::string* text) {
-  MojoResult rv;
-  bool did_wait = false;
-
-  uint32_t num_bytes = 0, num_handles = 0;
-  for (;;) {
-    rv = ReadMessageRaw(handle,
-                        nullptr,
-                        &num_bytes,
-                        nullptr,
-                        &num_handles,
-                        MOJO_READ_MESSAGE_FLAG_NONE);
-    if (rv == MOJO_RESULT_SHOULD_WAIT) {
-      if (did_wait) {
-        assert(false);  // Looping endlessly!?
-        return false;
-      }
-      rv = Wait(handle, MOJO_HANDLE_SIGNAL_READABLE);
-      if (rv != MOJO_RESULT_OK)
-        return false;
-      did_wait = true;
-    } else {
-      assert(!num_handles);
-      break;
-    }
-  }
-
-  text->resize(num_bytes);
-  rv = ReadMessageRaw(handle,
-                      &text->at(0),
-                      &num_bytes,
-                      nullptr,
-                      &num_handles,
-                      MOJO_READ_MESSAGE_FLAG_NONE);
-  return rv == MOJO_RESULT_OK;
-}
-
-bool DiscardMessage(const MessagePipeHandle& handle) {
-  MojoResult rv = ReadMessageRaw(handle,
-                                 nullptr,
-                                 nullptr,
-                                 nullptr,
-                                 nullptr,
-                                 MOJO_READ_MESSAGE_FLAG_MAY_DISCARD);
-  return rv == MOJO_RESULT_OK;
-}
-
-void IterateAndReportPerf(const char* test_name,
-                          const char* sub_test_name,
-                          PerfTestSingleIteration single_iteration,
-                          void* closure) {
-  // TODO(vtl): These should be specifiable using command-line flags.
-  static const size_t kGranularity = 100;
-  static const MojoTimeTicks kPerftestTimeMicroseconds = 3 * 1000000;
-
-  const MojoTimeTicks start_time = GetTimeTicksNow();
-  MojoTimeTicks end_time;
-  size_t iterations = 0;
-  do {
-    for (size_t i = 0; i < kGranularity; i++)
-      (*single_iteration)(closure);
-    iterations += kGranularity;
-
-    end_time = GetTimeTicksNow();
-  } while (end_time - start_time < kPerftestTimeMicroseconds);
-
-  MojoTestSupportLogPerfResult(test_name, sub_test_name,
-                               1000000.0 * iterations / (end_time - start_time),
-                               "iterations/second");
-}
-
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/public/cpp/test_support/test_support.h b/mojo/public/cpp/test_support/test_support.h
deleted file mode 100644
index 9a536e6..0000000
--- a/mojo/public/cpp/test_support/test_support.h
+++ /dev/null
@@ -1,35 +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 MOJO_PUBLIC_CPP_TEST_SUPPORT_TEST_SUPPORT_H_
-#define MOJO_PUBLIC_CPP_TEST_SUPPORT_TEST_SUPPORT_H_
-
-#include <string>
-#include <vector>
-
-#include "mojo/public/c/test_support/test_support.h"
-
-namespace mojo {
-namespace test {
-
-inline void LogPerfResult(const char* test_name,
-                          const char* sub_test_name,
-                          double value,
-                          const char* units) {
-  MojoTestSupportLogPerfResult(test_name, sub_test_name, value, units);
-}
-
-// Opens text file relative to the source root for reading.
-inline FILE* OpenSourceRootRelativeFile(const std::string& relative_path) {
-  return MojoTestSupportOpenSourceRootRelativeFile(relative_path.c_str());
-}
-
-// Returns the list of regular files in a directory relative to the source root.
-std::vector<std::string> EnumerateSourceRootRelativeDirectory(
-    const std::string& relative_path);
-
-}  // namespace test
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_TEST_SUPPORT_TEST_SUPPORT_H_
diff --git a/mojo/public/cpp/test_support/test_utils.h b/mojo/public/cpp/test_support/test_utils.h
deleted file mode 100644
index 6fd5a9e..0000000
--- a/mojo/public/cpp/test_support/test_utils.h
+++ /dev/null
@@ -1,40 +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 MOJO_PUBLIC_CPP_TEST_SUPPORT_TEST_UTILS_H_
-#define MOJO_PUBLIC_CPP_TEST_SUPPORT_TEST_UTILS_H_
-
-#include <string>
-
-#include "mojo/public/cpp/system/core.h"
-
-namespace mojo {
-namespace test {
-
-// Writes a message to |handle| with message data |text|. Returns true on
-// success.
-bool WriteTextMessage(const MessagePipeHandle& handle, const std::string& text);
-
-// Reads a message from |handle|, putting its contents into |*text|. Returns
-// true on success. (This blocks if necessary and will call |MojoReadMessage()|
-// multiple times, e.g., to query the size of the message.)
-bool ReadTextMessage(const MessagePipeHandle& handle, std::string* text);
-
-// Discards a message from |handle|. Returns true on success. (This does not
-// block. It will fail if no message is available to discard.)
-bool DiscardMessage(const MessagePipeHandle& handle);
-
-// Run |single_iteration| an appropriate number of times and report its
-// performance appropriately. (This actually runs |single_iteration| for a fixed
-// amount of time and reports the number of iterations per unit time.)
-typedef void (*PerfTestSingleIteration)(void* closure);
-void IterateAndReportPerf(const char* test_name,
-                          const char* sub_test_name,
-                          PerfTestSingleIteration single_iteration,
-                          void* closure);
-
-}  // namespace test
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_CPP_TEST_SUPPORT_TEST_UTILS_H_
diff --git a/mojo/public/interfaces/BUILD.gn b/mojo/public/interfaces/BUILD.gn
deleted file mode 100644
index fb11ec2..0000000
--- a/mojo/public/interfaces/BUILD.gn
+++ /dev/null
@@ -1,9 +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.
-
-group("interfaces") {
-  deps = [
-    "bindings",
-  ]
-}
diff --git a/mojo/public/interfaces/bindings/BUILD.gn b/mojo/public/interfaces/bindings/BUILD.gn
deleted file mode 100644
index c2cadcd..0000000
--- a/mojo/public/interfaces/bindings/BUILD.gn
+++ /dev/null
@@ -1,29 +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.
-
-import("../../tools/bindings/mojom.gni")
-
-mojom("bindings") {
-  visibility = []
-  sources = [
-    "interface_control_messages.mojom",
-    "pipe_control_messages.mojom",
-  ]
-
-  export_class_attribute = "MOJO_CPP_BINDINGS_EXPORT"
-  export_define = "MOJO_CPP_BINDINGS_IMPLEMENTATION"
-  export_header = "mojo/public/cpp/bindings/bindings_export.h"
-}
-
-# TODO(yzshen): Remove this target and use the one above once
-# |use_new_js_bindings| becomes true by default.
-mojom("new_bindings") {
-  visibility = []
-  sources = [
-    "new_bindings/interface_control_messages.mojom",
-    "new_bindings/pipe_control_messages.mojom",
-  ]
-
-  use_new_js_bindings = true
-}
diff --git a/mojo/public/interfaces/bindings/interface_control_messages.mojom b/mojo/public/interfaces/bindings/interface_control_messages.mojom
deleted file mode 100644
index 0a19042..0000000
--- a/mojo/public/interfaces/bindings/interface_control_messages.mojom
+++ /dev/null
@@ -1,67 +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.
-
-[JavaPackage="org.chromium.mojo.bindings.interfacecontrol"]
-module mojo.interface_control;
-
-// For each user-defined interface, some control functions are provided by the
-// interface endpoints at both sides.
-
-////////////////////////////////////////////////////////////////////////////////
-// Run@0xFFFFFFFF(RunInput input) => (RunOutput? output);
-//
-// This control function runs the input command. If the command is not
-// supported, |output| is set to null; otherwise |output| stores the result,
-// whose type depends on the input.
-
-const uint32 kRunMessageId = 0xFFFFFFFF;
-
-struct RunMessageParams {
-  RunInput input;
-};
-union RunInput {
-  QueryVersion query_version;
-  FlushForTesting flush_for_testing;
-};
-
-struct RunResponseMessageParams {
-  RunOutput? output;
-};
-union RunOutput {
-  QueryVersionResult query_version_result;
-};
-
-// Queries the max supported version of the user-defined interface.
-// Sent by the interface client side.
-struct QueryVersion {
-};
-struct QueryVersionResult {
-  uint32 version;
-};
-
-// Sent by either side of the interface.
-struct FlushForTesting {
-};
-
-////////////////////////////////////////////////////////////////////////////////
-// RunOrClosePipe@0xFFFFFFFE(RunOrClosePipeInput input);
-//
-// This control function runs the input command. If the operation fails or the
-// command is not supported, the message pipe is closed.
-
-const uint32 kRunOrClosePipeMessageId = 0xFFFFFFFE;
-
-struct RunOrClosePipeMessageParams {
-  RunOrClosePipeInput input;
-};
-union RunOrClosePipeInput {
-  RequireVersion require_version;
-};
-
-// If the specified version of the user-defined interface is not supported, the
-// function fails and the pipe is closed.
-// Sent by the interface client side.
-struct RequireVersion {
-  uint32 version;
-};
diff --git a/mojo/public/interfaces/bindings/new_bindings/interface_control_messages.mojom b/mojo/public/interfaces/bindings/new_bindings/interface_control_messages.mojom
deleted file mode 100644
index e03ffd6..0000000
--- a/mojo/public/interfaces/bindings/new_bindings/interface_control_messages.mojom
+++ /dev/null
@@ -1,67 +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.
-
-[JavaPackage="org.chromium.mojo.bindings.interfacecontrol"]
-module mojo.interface_control2;
-
-// For each user-defined interface, some control functions are provided by the
-// interface endpoints at both sides.
-
-////////////////////////////////////////////////////////////////////////////////
-// Run@0xFFFFFFFF(RunInput input) => (RunOutput? output);
-//
-// This control function runs the input command. If the command is not
-// supported, |output| is set to null; otherwise |output| stores the result,
-// whose type depends on the input.
-
-const uint32 kRunMessageId = 0xFFFFFFFF;
-
-struct RunMessageParams {
-  RunInput input;
-};
-union RunInput {
-  QueryVersion query_version;
-  FlushForTesting flush_for_testing;
-};
-
-struct RunResponseMessageParams {
-  RunOutput? output;
-};
-union RunOutput {
-  QueryVersionResult query_version_result;
-};
-
-// Queries the max supported version of the user-defined interface.
-// Sent by the interface client side.
-struct QueryVersion {
-};
-struct QueryVersionResult {
-  uint32 version;
-};
-
-// Sent by either side of the interface.
-struct FlushForTesting {
-};
-
-////////////////////////////////////////////////////////////////////////////////
-// RunOrClosePipe@0xFFFFFFFE(RunOrClosePipeInput input);
-//
-// This control function runs the input command. If the operation fails or the
-// command is not supported, the message pipe is closed.
-
-const uint32 kRunOrClosePipeMessageId = 0xFFFFFFFE;
-
-struct RunOrClosePipeMessageParams {
-  RunOrClosePipeInput input;
-};
-union RunOrClosePipeInput {
-  RequireVersion require_version;
-};
-
-// If the specified version of the user-defined interface is not supported, the
-// function fails and the pipe is closed.
-// Sent by the interface client side.
-struct RequireVersion {
-  uint32 version;
-};
diff --git a/mojo/public/interfaces/bindings/new_bindings/pipe_control_messages.mojom b/mojo/public/interfaces/bindings/new_bindings/pipe_control_messages.mojom
deleted file mode 100644
index 69975fc..0000000
--- a/mojo/public/interfaces/bindings/new_bindings/pipe_control_messages.mojom
+++ /dev/null
@@ -1,46 +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.
-
-[JavaPackage="org.chromium.mojo.bindings.pipecontrol"]
-module mojo.pipe_control2;
-
-// For each message pipe running user-defined interfaces, some control
-// functions are provided and used by the routers at both ends of the pipe, so
-// that they can coordinate to manage interface endpoints.
-// All these control messages will have the interface ID field in the message
-// header set to invalid.
-
-////////////////////////////////////////////////////////////////////////////////
-// RunOrClosePipe@0xFFFFFFFE(RunOrClosePipeInput input);
-//
-// This control function runs the input command. If the operation fails or the
-// command is not supported, the message pipe is closed.
-
-const uint32 kRunOrClosePipeMessageId = 0xFFFFFFFE;
-
-struct RunOrClosePipeMessageParams {
-  RunOrClosePipeInput input;
-};
-
-union RunOrClosePipeInput {
-  PeerAssociatedEndpointClosedEvent peer_associated_endpoint_closed_event;
-};
-
-// A user-defined reason about why the interface is disconnected.
-struct DisconnectReason {
-  uint32 custom_reason;
-  string description;
-};
-
-// An event to notify that an interface endpoint set up at the message sender
-// side has been closed.
-//
-// This event is omitted if the endpoint belongs to the master interface and
-// there is no disconnect reason specified.
-struct PeerAssociatedEndpointClosedEvent {
-  // The interface ID.
-  uint32 id;
-  DisconnectReason? disconnect_reason;
-};
-
diff --git a/mojo/public/interfaces/bindings/pipe_control_messages.mojom b/mojo/public/interfaces/bindings/pipe_control_messages.mojom
deleted file mode 100644
index 74e9cc7..0000000
--- a/mojo/public/interfaces/bindings/pipe_control_messages.mojom
+++ /dev/null
@@ -1,46 +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.
-
-[JavaPackage="org.chromium.mojo.bindings.pipecontrol"]
-module mojo.pipe_control;
-
-// For each message pipe running user-defined interfaces, some control
-// functions are provided and used by the routers at both ends of the pipe, so
-// that they can coordinate to manage interface endpoints.
-// All these control messages will have the interface ID field in the message
-// header set to invalid.
-
-////////////////////////////////////////////////////////////////////////////////
-// RunOrClosePipe@0xFFFFFFFE(RunOrClosePipeInput input);
-//
-// This control function runs the input command. If the operation fails or the
-// command is not supported, the message pipe is closed.
-
-const uint32 kRunOrClosePipeMessageId = 0xFFFFFFFE;
-
-struct RunOrClosePipeMessageParams {
-  RunOrClosePipeInput input;
-};
-
-union RunOrClosePipeInput {
-  PeerAssociatedEndpointClosedEvent peer_associated_endpoint_closed_event;
-};
-
-// A user-defined reason about why the interface is disconnected.
-struct DisconnectReason {
-  uint32 custom_reason;
-  string description;
-};
-
-// An event to notify that an interface endpoint set up at the message sender
-// side has been closed.
-//
-// This event is omitted if the endpoint belongs to the master interface and
-// there is no disconnect reason specified.
-struct PeerAssociatedEndpointClosedEvent {
-  // The interface ID.
-  uint32 id;
-  DisconnectReason? disconnect_reason;
-};
-
diff --git a/mojo/public/interfaces/bindings/tests/BUILD.gn b/mojo/public/interfaces/bindings/tests/BUILD.gn
deleted file mode 100644
index e496eb6..0000000
--- a/mojo/public/interfaces/bindings/tests/BUILD.gn
+++ /dev/null
@@ -1,204 +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.
-
-import("../../../tools/bindings/mojom.gni")
-
-mojom("test_interfaces") {
-  testonly = true
-  sources = [
-    "math_calculator.mojom",
-    "no_module.mojom",
-    "ping_service.mojom",
-    "rect.mojom",
-    "regression_tests.mojom",
-    "sample_factory.mojom",
-    "sample_interfaces.mojom",
-    "sample_service.mojom",
-    "scoping.mojom",
-    "serialization_test_structs.mojom",
-    "test_bad_messages.mojom",
-    "test_constants.mojom",
-    "test_data_view.mojom",
-    "test_native_types.mojom",
-    "test_structs.mojom",
-    "test_sync_methods.mojom",
-    "test_unions.mojom",
-    "validation_test_interfaces.mojom",
-  ]
-  public_deps = [
-    ":echo",
-    ":test_mojom_import",
-    ":test_mojom_import2",
-  ]
-}
-
-component("test_export_component") {
-  testonly = true
-  deps = [
-    ":test_export",
-  ]
-}
-
-if (!is_ios) {
-  component("test_export_blink_component") {
-    testonly = true
-    deps = [
-      ":test_export_blink",
-    ]
-  }
-}
-
-mojom("test_export") {
-  testonly = true
-  sources = [
-    "test_export.mojom",
-  ]
-  export_class_attribute = "MOJO_TEST_EXPORT"
-  export_define = "MOJO_TEST_IMPLEMENTATION=1"
-  export_header = "mojo/public/cpp/bindings/tests/mojo_test_export.h"
-  if (!is_ios) {
-    export_class_attribute_blink = "MOJO_TEST_BLINK_EXPORT"
-    export_define_blink = "MOJO_TEST_BLINK_IMPLEMENTATION=1"
-    export_header_blink =
-        "mojo/public/cpp/bindings/tests/mojo_test_blink_export.h"
-  }
-  visibility = [ ":test_export_component" ]
-  if (!is_ios) {
-    visibility_blink = [ ":test_export_blink_component" ]
-  }
-}
-
-mojom("test_exported_import") {
-  testonly = true
-  sources = [
-    "test_import.mojom",
-  ]
-  public_deps = [
-    ":test_export",
-  ]
-
-  overridden_deps = [ ":test_export" ]
-  component_deps = [ ":test_export_component" ]
-  if (!is_ios) {
-    overridden_deps_blink = [ ":test_export" ]
-    component_deps_blink = [ ":test_export_blink_component" ]
-  }
-}
-
-# Used to test that it is okay to call mojom::Foo::Serialize()/Deserialize()
-# even if the mojom target is linked into another component.
-#
-# We don't use |test_export_component| for this test because
-# //mojo/public/cpp/bindings/tests depends on both |test_export_component| and
-# |test_exported_import| and therefore actually get the shared cpp sources of
-# test_export.mojom from |test_exported_import|.
-component("test_export_component2") {
-  testonly = true
-  public_deps = [
-    ":test_export2",
-  ]
-}
-
-mojom("test_export2") {
-  testonly = true
-  sources = [
-    "test_export2.mojom",
-  ]
-  export_class_attribute = "MOJO_TEST_EXPORT"
-  export_define = "MOJO_TEST_IMPLEMENTATION=1"
-  export_header = "mojo/public/cpp/bindings/tests/mojo_test_export.h"
-  visibility = [ ":test_export_component2" ]
-}
-
-mojom("test_mojom_import") {
-  testonly = true
-  sources = [
-    "sample_import.mojom",
-  ]
-}
-
-mojom("test_mojom_import_wrapper") {
-  testonly = true
-  public_deps = [
-    ":test_mojom_import",
-  ]
-}
-
-mojom("test_mojom_import_wrapper_wrapper") {
-  testonly = true
-  public_deps = [
-    ":test_mojom_import_wrapper",
-  ]
-}
-
-mojom("test_mojom_import2") {
-  testonly = true
-  sources = [
-    "sample_import2.mojom",
-  ]
-  public_deps = [
-    ":test_mojom_import",
-    ":test_mojom_import_wrapper_wrapper",
-  ]
-}
-
-mojom("test_struct_traits_interfaces") {
-  testonly = true
-  sources = [
-    "struct_with_traits.mojom",
-  ]
-}
-
-mojom("test_associated_interfaces") {
-  # These files are not included in the test_interfaces target because
-  # associated interfaces are not supported by all bindings languages yet.
-  testonly = true
-  sources = [
-    "test_associated_interfaces.mojom",
-    "validation_test_associated_interfaces.mojom",
-  ]
-
-  public_deps = [
-    ":test_interfaces",
-  ]
-}
-
-mojom("versioning_test_service_interfaces") {
-  testonly = true
-  sources = [
-    "versioning_test_service.mojom",
-  ]
-}
-
-mojom("versioning_test_client_interfaces") {
-  testonly = true
-  sources = [
-    "versioning_test_client.mojom",
-  ]
-}
-
-mojom("test_wtf_types") {
-  testonly = true
-
-  sources = [
-    "test_wtf_types.mojom",
-  ]
-}
-
-mojom("test_no_sources") {
-  testonly = true
-
-  public_deps = [
-    ":test_interfaces",
-  ]
-}
-
-mojom("echo") {
-  testonly = true
-  sources = [
-    "echo.mojom",
-    "echo_import.mojom",
-  ]
-  use_new_js_bindings = true
-}
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd0_good.data b/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd0_good.data
deleted file mode 100644
index b797fea..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd0_good.data
+++ /dev/null
@@ -1,26 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]2                  // version
-[u4]0                  // interface ID
-[u4]0                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[u8]0                  // request_id
-[dist8]payload
-[dist8]payload_interface_ids
-[anchr]message_header
-
-[anchr]payload
-[dist4]method0_params  // num_bytes
-[u4]0                  // version
-[u4]1                  // associated interface pointer: interface ID index
-[u4]1                  // associated interface pointer: version
-[anchr]method0_params
-
-[anchr]payload_interface_ids
-[dist4]interface_id_array  // num_bytes
-[u4]3                      // num_elements : It is okay to have IDs that are not
-                           // referred to.
-[u4]4
-[u4]5
-[u4]8
-[anchr]interface_id_array
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd0_good.expected b/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd0_good.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd0_good.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd0_illegal_invalid_interface_id.data b/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd0_illegal_invalid_interface_id.data
deleted file mode 100644
index a36d807..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd0_illegal_invalid_interface_id.data
+++ /dev/null
@@ -1,24 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]2                  // version
-[u4]0                  // interface ID
-[u4]0                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[u8]0                  // request_id
-[dist8]payload
-[dist8]payload_interface_ids
-[anchr]message_header
-
-[anchr]payload
-[dist4]method0_params  // num_bytes
-[u4]0                  // version
-[u4]1                  // associated interface pointer: interface ID index
-[u4]1                  // associated interface pointer: version
-[anchr]method0_params
-
-[anchr]payload_interface_ids
-[dist4]interface_id_array  // num_bytes
-[u4]2                      // num_elements
-[u4]3
-[u4]0xFFFFFFFF             // Unexpected invalid interface ID.
-[anchr]interface_id_array
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd0_illegal_invalid_interface_id.expected b/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd0_illegal_invalid_interface_id.expected
deleted file mode 100644
index 420b421..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd0_illegal_invalid_interface_id.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_ILLEGAL_INTERFACE_ID
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd0_illegal_master_interface_id.data b/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd0_illegal_master_interface_id.data
deleted file mode 100644
index e3fa5bb..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd0_illegal_master_interface_id.data
+++ /dev/null
@@ -1,24 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]2                  // version
-[u4]0                  // interface ID
-[u4]0                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[u8]0                  // request_id
-[dist8]payload
-[dist8]payload_interface_ids
-[anchr]message_header
-
-[anchr]payload
-[dist4]method0_params  // num_bytes
-[u4]0                  // version
-[u4]1                  // associated interface pointer: interface ID index
-[u4]1                  // associated interface pointer: version
-[anchr]method0_params
-
-[anchr]payload_interface_ids
-[dist4]interface_id_array  // num_bytes
-[u4]2                      // num_elements
-[u4]3
-[u4]0                      // Unexpected master interface ID.
-[anchr]interface_id_array
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd0_illegal_master_interface_id.expected b/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd0_illegal_master_interface_id.expected
deleted file mode 100644
index 420b421..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd0_illegal_master_interface_id.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_ILLEGAL_INTERFACE_ID
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd0_interface_id_index_out_of_range.data b/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd0_interface_id_index_out_of_range.data
deleted file mode 100644
index f9e6201..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd0_interface_id_index_out_of_range.data
+++ /dev/null
@@ -1,27 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]2                  // version
-[u4]0                  // interface ID
-[u4]0                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[u8]0                  // request_id
-[dist8]payload
-[dist8]payload_interface_ids
-[anchr]message_header
-
-[anchr]payload
-[dist4]method0_params  // num_bytes
-[u4]0                  // version
-[u4]1111               // associated interface pointer: The interface ID index
-                       // is out of range.
-[u4]1                  // associated interface pointer: version
-[anchr]method0_params
-
-[anchr]payload_interface_ids
-[dist4]interface_id_array  // num_bytes
-[u4]3                      // num_elements : It is okay to have IDs that are not
-                           // referred to.
-[u4]4
-[u4]5
-[u4]8
-[anchr]interface_id_array
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd0_interface_id_index_out_of_range.expected b/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd0_interface_id_index_out_of_range.expected
deleted file mode 100644
index 420b421..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd0_interface_id_index_out_of_range.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_ILLEGAL_INTERFACE_ID
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd0_unexpected_invalid_associated_interface.data b/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd0_unexpected_invalid_associated_interface.data
deleted file mode 100644
index b785ed1..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd0_unexpected_invalid_associated_interface.data
+++ /dev/null
@@ -1,25 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]2                  // version
-[u4]0                  // interface ID
-[u4]0                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[u8]0                  // request_id
-[dist8]payload
-[dist8]payload_interface_ids
-[anchr]message_header
-
-[anchr]payload
-[dist4]method0_params  // num_bytes
-[u4]0                  // version
-[u4]0xFFFFFFFF         // associated interface pointer: Unexpected invalid
-                       // interface ID index.
-[u4]1                  // associated interface pointer: version
-[anchr]method0_params
-
-[anchr]payload_interface_ids
-[dist4]interface_id_array  // num_bytes
-[u4]2                      // num_elements
-[u4]3
-[u4]4
-[anchr]interface_id_array
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd0_unexpected_invalid_associated_interface.expected b/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd0_unexpected_invalid_associated_interface.expected
deleted file mode 100644
index d8eda1f..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd0_unexpected_invalid_associated_interface.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNEXPECTED_INVALID_INTERFACE_ID
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd1_good.data b/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd1_good.data
deleted file mode 100644
index efa2162..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd1_good.data
+++ /dev/null
@@ -1,26 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]2                  // version
-[u4]0                  // interface ID
-[u4]1                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[u8]0                  // request_id
-[dist8]payload
-[dist8]payload_interface_ids
-[anchr]message_header
-
-[anchr]payload
-[dist4]method1_params  // num_bytes
-[u4]0                  // version
-[u4]1                  // associated interface request: interface ID index
-[u4]0                  // padding
-[anchr]method1_params
-
-[anchr]payload_interface_ids
-[dist4]interface_id_array  // num_bytes
-[u4]3                      // num_elements : It is okay to have IDs that are not
-                           // referred to.
-[u4]4
-[u4]5
-[u4]8
-[anchr]interface_id_array
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd1_good.expected b/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd1_good.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd1_good.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd1_unexpected_invalid_associated_request.data b/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd1_unexpected_invalid_associated_request.data
deleted file mode 100644
index 5a66aad..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd1_unexpected_invalid_associated_request.data
+++ /dev/null
@@ -1,27 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]2                  // version
-[u4]0                  // interface ID
-[u4]1                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[u8]0                  // request_id
-[dist8]payload
-[dist8]payload_interface_ids
-[anchr]message_header
-
-[anchr]payload
-[dist4]method1_params  // num_bytes
-[u4]0                  // version
-[u4]0xFFFFFFFF         // associated interface request: Unexpected invalid
-                       // interface ID index.
-[u4]0                  // padding
-[anchr]method1_params
-
-[anchr]payload_interface_ids
-[dist4]interface_id_array  // num_bytes
-[u4]3                      // num_elements : It is okay to have IDs that are not
-                           // referred to.
-[u4]4
-[u4]5
-[u4]8
-[anchr]interface_id_array
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd1_unexpected_invalid_associated_request.expected b/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd1_unexpected_invalid_associated_request.expected
deleted file mode 100644
index d8eda1f..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd1_unexpected_invalid_associated_request.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNEXPECTED_INVALID_INTERFACE_ID
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd2_good.data b/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd2_good.data
deleted file mode 100644
index ab29603..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd2_good.data
+++ /dev/null
@@ -1,18 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]2                  // version
-[u4]0                  // interface ID
-[u4]2                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[u8]0                  // request_id
-[dist8]payload
-[u8]0                  // payload_interface_ids: This array is a nullable field.
-[anchr]message_header
-
-[anchr]payload
-[dist4]method2_params  // num_bytes
-[u4]0                  // version
-[u4]0xFFFFFFFF         // associated interface pointer: Invalid interface ID
-                       // index.
-[u4]1                  // associated interface pointer: version
-[anchr]method2_params
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd2_good.expected b/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd2_good.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd2_good.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd3_collided_interface_id_indices.data b/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd3_collided_interface_id_indices.data
deleted file mode 100644
index 6cb71d3..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd3_collided_interface_id_indices.data
+++ /dev/null
@@ -1,36 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]2                  // version
-[u4]0                  // interface ID
-[u4]3                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[u8]0                  // request_id
-[dist8]payload
-[dist8]payload_interface_ids
-[anchr]message_header
-
-[anchr]payload
-[dist4]method3_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[anchr]method3_params
-
-[anchr]param0_ptr
-[dist4]associated_interface_array  // num_bytes
-[u4]2                              // num_elements
-[u4]2                              // interface ID index
-[u4]14                             // version
-[u4]2                              // interface ID index: The same value as the
-                                   // one above.
-[u4]18                             // version
-[anchr]associated_interface_array
-
-[anchr]payload_interface_ids
-[dist4]interface_id_array  // num_bytes
-[u4]4                      // num_elements : It is okay to have IDs that are not
-                           // referred to.
-[u4]4
-[u4]5
-[u4]8
-[u4]19
-[anchr]interface_id_array
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd3_collided_interface_id_indices.expected b/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd3_collided_interface_id_indices.expected
deleted file mode 100644
index 420b421..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd3_collided_interface_id_indices.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_ILLEGAL_INTERFACE_ID
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd3_good.data b/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd3_good.data
deleted file mode 100644
index 13df01e..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd3_good.data
+++ /dev/null
@@ -1,35 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]2                  // version
-[u4]0                  // interface ID
-[u4]3                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[u8]0                  // request_id
-[dist8]payload
-[dist8]payload_interface_ids
-[anchr]message_header
-
-[anchr]payload
-[dist4]method3_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[anchr]method3_params
-
-[anchr]param0_ptr
-[dist4]associated_interface_array  // num_bytes
-[u4]2                              // num_elements
-[u4]2                              // interface ID index
-[u4]14                             // version
-[u4]3                              // interface ID index
-[u4]18                             // version
-[anchr]associated_interface_array
-
-[anchr]payload_interface_ids
-[dist4]interface_id_array  // num_bytes
-[u4]4                      // num_elements : It is okay to have IDs that are not
-                           // referred to.
-[u4]4
-[u4]5
-[u4]8
-[u4]19
-[anchr]interface_id_array
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd3_good.expected b/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd3_good.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd3_good.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd3_unexpected_invalid_associated_interface_in_array.data b/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd3_unexpected_invalid_associated_interface_in_array.data
deleted file mode 100644
index 2e163be..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd3_unexpected_invalid_associated_interface_in_array.data
+++ /dev/null
@@ -1,36 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]2                  // version
-[u4]0                  // interface ID
-[u4]3                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[u8]0                  // request_id
-[dist8]payload
-[dist8]payload_interface_ids
-[anchr]message_header
-
-[anchr]payload
-[dist4]method3_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[anchr]method3_params
-
-[anchr]param0_ptr
-[dist4]associated_interface_array  // num_bytes
-[u4]2                              // num_elements
-[u4]2                              // interface ID index
-[u4]14                             // version
-[u4]0xFFFFFFFF                     // interface ID index: Unexpected invalid
-                                   // value.
-[u4]18                             // version
-[anchr]associated_interface_array
-
-[anchr]payload_interface_ids
-[dist4]interface_id_array  // num_bytes
-[u4]4                      // num_elements : It is okay to have IDs that are not
-                           // referred to.
-[u4]4
-[u4]5
-[u4]8
-[u4]19
-[anchr]interface_id_array
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd3_unexpected_invalid_associated_interface_in_array.expected b/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd3_unexpected_invalid_associated_interface_in_array.expected
deleted file mode 100644
index d8eda1f..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd3_unexpected_invalid_associated_interface_in_array.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNEXPECTED_INVALID_INTERFACE_ID
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd3_wrong_interface_id_index_order.data b/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd3_wrong_interface_id_index_order.data
deleted file mode 100644
index 4a63003..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd3_wrong_interface_id_index_order.data
+++ /dev/null
@@ -1,38 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]2                  // version
-[u4]0                  // interface ID
-[u4]3                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[u8]0                  // request_id
-[dist8]payload
-[dist8]payload_interface_ids
-[anchr]message_header
-
-[anchr]payload
-[dist4]method3_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[anchr]method3_params
-
-[anchr]param0_ptr
-[dist4]associated_interface_array  // num_bytes
-[u4]3                              // num_elements
-[u4]2                              // interface ID index
-[u4]14                             // version
-[u4]3                              // interface ID index
-[u4]0                              // version
-[u4]0                              // interface ID index : It is smaller than
-                                   // the first element above, which is wrong.
-[u4]18                             // version
-[anchr]associated_interface_array
-
-[anchr]payload_interface_ids
-[dist4]interface_id_array  // num_bytes
-[u4]4                      // num_elements : It is okay to have IDs that are not
-                           // referred to.
-[u4]4
-[u4]5
-[u4]8
-[u4]19
-[anchr]interface_id_array
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd3_wrong_interface_id_index_order.expected b/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd3_wrong_interface_id_index_order.expected
deleted file mode 100644
index 420b421..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/associated_conformance_mthd3_wrong_interface_id_index_order.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_ILLEGAL_INTERFACE_ID
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/boundscheck_msghdr_no_such_method.data b/mojo/public/interfaces/bindings/tests/data/validation/boundscheck_msghdr_no_such_method.data
deleted file mode 100644
index 30032a1..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/boundscheck_msghdr_no_such_method.data
+++ /dev/null
@@ -1,7 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version number
-[u4]0                  // interface ID
-[u4]2                  // There is no Method2
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/boundscheck_msghdr_no_such_method.expected b/mojo/public/interfaces/bindings/tests/data/validation/boundscheck_msghdr_no_such_method.expected
deleted file mode 100644
index a32d895..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/boundscheck_msghdr_no_such_method.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_MESSAGE_HEADER_UNKNOWN_METHOD
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_empty.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_empty.data
deleted file mode 100644
index e69de29..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_empty.data
+++ /dev/null
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_empty.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_empty.expected
deleted file mode 100644
index 779df88..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_empty.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_incomplete_struct.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_incomplete_struct.data
deleted file mode 100644
index 68899f4..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_incomplete_struct.data
+++ /dev/null
@@ -1,2 +0,0 @@
-[u4]24  // num_bytes: Bigger than the total size of the message.
-[u4]0   // version
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_incomplete_struct.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_incomplete_struct.expected
deleted file mode 100644
index 779df88..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_incomplete_struct.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_incomplete_struct_header.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_incomplete_struct_header.data
deleted file mode 100644
index 21e7fbc..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_incomplete_struct_header.data
+++ /dev/null
@@ -1 +0,0 @@
-0x00
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_incomplete_struct_header.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_incomplete_struct_header.expected
deleted file mode 100644
index 779df88..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_incomplete_struct_header.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_invalid_flag_combo.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_invalid_flag_combo.data
deleted file mode 100644
index dfb2dd2..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_invalid_flag_combo.data
+++ /dev/null
@@ -1,8 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]1                  // version
-[u4]0                  // interface ID
-[u4]0x80000000         // name
-[u4]3                  // flags: This combination is illegal.
-[u4]0                  // padding
-[u8]1                  // request_id
-[anchr]message_header
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_invalid_flag_combo.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_invalid_flag_combo.expected
deleted file mode 100644
index c33fde3..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_invalid_flag_combo.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_MESSAGE_HEADER_INVALID_FLAGS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_missing_request_id.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_missing_request_id.data
deleted file mode 100644
index 27804a8..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_missing_request_id.data
+++ /dev/null
@@ -1,8 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]0x80000000         // name
-[u4]1                  // flags: This is a response message which expects to
-                       // have a request ID.
-[u4]0                  // padding
-[anchr]message_header
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_missing_request_id.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_missing_request_id.expected
deleted file mode 100644
index 083db1a..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_missing_request_id.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_MESSAGE_HEADER_MISSING_REQUEST_ID
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_no_such_method.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_no_such_method.data
deleted file mode 100644
index 6302bae..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_no_such_method.data
+++ /dev/null
@@ -1,7 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version number
-[u4]0                  // interface ID
-[u4]9999               // There is no Method9999.
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_no_such_method.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_no_such_method.expected
deleted file mode 100644
index a32d895..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_no_such_method.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_MESSAGE_HEADER_UNKNOWN_METHOD
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_huge.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_huge.data
deleted file mode 100644
index 2fd0fcd..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_huge.data
+++ /dev/null
@@ -1,6 +0,0 @@
-[u4]0xFFFFFFFF  // num_bytes: Test whether a huge value will cause overflow.
-[u4]0           // version
-[u4]0           // interface ID
-[u4]0x80000000  // name
-[u4]0           // flags
-[u4]0           // padding
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_huge.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_huge.expected
deleted file mode 100644
index 779df88..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_huge.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_less_than_min_requirement.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_less_than_min_requirement.data
deleted file mode 100644
index f58eca9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_less_than_min_requirement.data
+++ /dev/null
@@ -1,4 +0,0 @@
-[dist4]message_header  // num_bytes: Less than the minimal size of message
-                       // header.
-[u4]0                  // version
-[anchr]message_header
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_less_than_min_requirement.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_less_than_min_requirement.expected
deleted file mode 100644
index 25aceee..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_less_than_min_requirement.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNEXPECTED_STRUCT_HEADER
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_less_than_struct_header.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_less_than_struct_header.data
deleted file mode 100644
index e98f66f..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_less_than_struct_header.data
+++ /dev/null
@@ -1,6 +0,0 @@
-[u4]0           // num_bytes
-[u4]0           // version
-[u4]0           // interface ID
-[u4]0x80000000  // name
-[u4]0           // flags
-[u4]0           // padding
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_less_than_struct_header.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_less_than_struct_header.expected
deleted file mode 100644
index 25aceee..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_less_than_struct_header.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNEXPECTED_STRUCT_HEADER
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_version_mismatch_1.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_version_mismatch_1.data
deleted file mode 100644
index df9e418..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_version_mismatch_1.data
+++ /dev/null
@@ -1,9 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]0x80000000         // name
-[u4]0                  // flags
-[u4]0                  // padding
-[u8]0                  // Extra bytes that result in mismatched |num_bytes| and
-                       // |version|.
-[anchr]message_header
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_version_mismatch_1.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_version_mismatch_1.expected
deleted file mode 100644
index 25aceee..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_version_mismatch_1.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNEXPECTED_STRUCT_HEADER
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_version_mismatch_2.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_version_mismatch_2.data
deleted file mode 100644
index e2c574e..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_version_mismatch_2.data
+++ /dev/null
@@ -1,10 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]1                  // version
-[u4]0                  // interface ID
-[u4]0x80000000         // name
-[u4]1                  // flags
-[u4]0                  // padding
-[u8]0                  // request_id
-[u8]0                  // Extra bytes that result in mismatched |num_bytes| and
-                       // |version|.
-[anchr]message_header
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_version_mismatch_2.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_version_mismatch_2.expected
deleted file mode 100644
index 25aceee..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_version_mismatch_2.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNEXPECTED_STRUCT_HEADER
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_version_mismatch_3.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_version_mismatch_3.data
deleted file mode 100644
index f7a321b..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_version_mismatch_3.data
+++ /dev/null
@@ -1,7 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]8                  // version: |num_bytes| is too small for |version|.
-[u4]0                  // interface ID
-[u4]0x80000000         // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_version_mismatch_3.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_version_mismatch_3.expected
deleted file mode 100644
index 25aceee..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_version_mismatch_3.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNEXPECTED_STRUCT_HEADER
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_good.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_good.data
deleted file mode 100644
index 841da5e..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_good.data
+++ /dev/null
@@ -1,13 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]0                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method0_params  // num_bytes
-[u4]0                  // version
-[f]-1                  // param0
-[u4]0                  // padding
-[anchr]method0_params
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_good.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_good.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_good.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_incomplete_struct.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_incomplete_struct.data
deleted file mode 100644
index cff6a30..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_incomplete_struct.data
+++ /dev/null
@@ -1,11 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]0                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[u4]16  // num_bytes: Incomplete struct.
-[u4]0   // version
-[f]-1   // param0
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_incomplete_struct.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_incomplete_struct.expected
deleted file mode 100644
index 779df88..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_incomplete_struct.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_incomplete_struct_header.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_incomplete_struct_header.data
deleted file mode 100644
index 3f03ab2..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_incomplete_struct_header.data
+++ /dev/null
@@ -1,9 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]0                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[u4]16  // num_bytes: Incomplete struct header.
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_incomplete_struct_header.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_incomplete_struct_header.expected
deleted file mode 100644
index 779df88..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_incomplete_struct_header.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_invalid_request_flags.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_invalid_request_flags.data
deleted file mode 100644
index 7aee806..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_invalid_request_flags.data
+++ /dev/null
@@ -1,8 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]1                  // version
-[u4]0                  // interface ID
-[u4]0                  // name
-[u4]2                  // flags: kMessageIsResponse is set in a request.
-[u4]0                  // padding
-[u8]1                  // request_id
-[anchr]message_header
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_invalid_request_flags.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_invalid_request_flags.expected
deleted file mode 100644
index c33fde3..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_invalid_request_flags.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_MESSAGE_HEADER_INVALID_FLAGS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_invalid_request_flags2.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_invalid_request_flags2.data
deleted file mode 100644
index 5448c5f..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_invalid_request_flags2.data
+++ /dev/null
@@ -1,9 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]1                  // version
-[u4]0                  // interface ID
-[u4]0                  // name
-[u4]1                  // flags: kMessageExpectsResponse is set in a request
-                       // for a method that does not take a response.
-[u4]0                  // padding
-[u8]1                  // request_id
-[anchr]message_header
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_invalid_request_flags2.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_invalid_request_flags2.expected
deleted file mode 100644
index c33fde3..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_invalid_request_flags2.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_MESSAGE_HEADER_INVALID_FLAGS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_struct_num_bytes_huge.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_struct_num_bytes_huge.data
deleted file mode 100644
index 4a3e2fe..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_struct_num_bytes_huge.data
+++ /dev/null
@@ -1,12 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]0                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[u4]0xFFFFFFFF  // num_bytes: Test whether a huge value will cause overflow.
-[u4]0           // version
-[f]-1           // param0
-[u4]0           // padding
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_struct_num_bytes_huge.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_struct_num_bytes_huge.expected
deleted file mode 100644
index 779df88..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_struct_num_bytes_huge.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_struct_num_bytes_less_than_min_requirement.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_struct_num_bytes_less_than_min_requirement.data
deleted file mode 100644
index fa4c555..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_struct_num_bytes_less_than_min_requirement.data
+++ /dev/null
@@ -1,11 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]0                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method0_params  // num_bytes: Less than the minimal size that we expect.
-[u4]0                  // version
-[anchr]method0_params
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_struct_num_bytes_less_than_min_requirement.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_struct_num_bytes_less_than_min_requirement.expected
deleted file mode 100644
index 25aceee..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_struct_num_bytes_less_than_min_requirement.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNEXPECTED_STRUCT_HEADER
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_struct_num_bytes_less_than_struct_header.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_struct_num_bytes_less_than_struct_header.data
deleted file mode 100644
index d62206e..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_struct_num_bytes_less_than_struct_header.data
+++ /dev/null
@@ -1,12 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]0                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[u4]4                  // num_bytes: Less than the size of struct header.
-[u4]0                  // version
-[f]-1                  // param0
-[u4]0                  // padding
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_struct_num_bytes_less_than_struct_header.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_struct_num_bytes_less_than_struct_header.expected
deleted file mode 100644
index 25aceee..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_struct_num_bytes_less_than_struct_header.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNEXPECTED_STRUCT_HEADER
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_good.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_good.data
deleted file mode 100644
index 5dca2fe..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_good.data
+++ /dev/null
@@ -1,48 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]10                 // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method10_params  // num_bytes
-[u4]0                   // version
-[dist8]map_data_ptr     // param0
-[anchr]method10_params
-
-[anchr]map_data_ptr
-[dist4]map_data_struct_header  // num_bytes
-[u4]0                          // version
-[dist8]key_array_ptr
-[dist8]value_array_ptr
-[anchr]map_data_struct_header
-
-[anchr]key_array_ptr
-[dist4]key_array_member   // num_bytes
-[u4]2                     // num_elements
-[dist8]key_string_1
-[dist8]key_string_2
-[anchr]key_array_member
-
-[anchr]key_string_1
-[dist4]key_string_1_member  // num_bytes
-[u4]5                       // num_elements
-0 1 2 3 4
-[anchr]key_string_1_member
-
-[u4]0 [u4]0 [u1]0 [u1]0 [u1]0  // manual padding for array alignment
-
-[anchr]key_string_2
-[dist4]key_string_2_member  // num_bytes
-[u4]5                       // num_elements
-5 6 7 8 9
-[anchr]key_string_2_member
-
-[u4]0 [u4]0 [u1]0 [u1]0 [u1]0  // manual padding for array alignment
-
-[anchr]value_array_ptr
-[dist4]value_array_member   // num_bytes
-[u4]2                       // num_elements
-1 2
-[anchr]value_array_member
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_good.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_good.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_good.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_good_non_unique_keys.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_good_non_unique_keys.data
deleted file mode 100644
index f64fbc3..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_good_non_unique_keys.data
+++ /dev/null
@@ -1,48 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]10                 // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method10_params  // num_bytes
-[u4]0                   // version
-[dist8]map_data_ptr     // param0
-[anchr]method10_params
-
-[anchr]map_data_ptr
-[dist4]map_data_struct_header  // num_bytes
-[u4]0                          // version
-[dist8]key_array_ptr
-[dist8]value_array_ptr
-[anchr]map_data_struct_header
-
-[anchr]key_array_ptr
-[dist4]key_array_member   // num_bytes
-[u4]2                     // num_elements
-[dist8]key_string_1
-[dist8]key_string_2
-[anchr]key_array_member
-
-[anchr]key_string_1
-[dist4]key_string_1_member  // num_bytes
-[u4]5                       // num_elements
-0 1 2 3 4
-[anchr]key_string_1_member
-
-[u4]0 [u4]0 [u1]0 [u1]0 [u1]0  // manual padding for array alignment
-
-[anchr]key_string_2
-[dist4]key_string_2_member  // num_bytes
-[u4]5                       // num_elements
-0 1 2 3 4
-[anchr]key_string_2_member
-
-[u4]0 [u4]0 [u1]0 [u1]0 [u1]0  // manual padding for array alignment
-
-[anchr]value_array_ptr
-[dist4]value_array_member   // num_bytes
-[u4]2                       // num_elements
-1 2
-[anchr]value_array_member
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_good_non_unique_keys.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_good_non_unique_keys.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_good_non_unique_keys.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_null_keys.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_null_keys.data
deleted file mode 100644
index 3a99dc2..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_null_keys.data
+++ /dev/null
@@ -1,25 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]10                 // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method10_params  // num_bytes
-[u4]0                   // version
-[dist8]map_data_ptr     // param0
-[anchr]method10_params
-
-[anchr]map_data_ptr
-[dist4]map_data_struct_header  // num_bytes
-[u4]0                          // version
-[u8]0                          // null keys array
-[dist8]value_array_ptr
-[anchr]map_data_struct_header
-
-[anchr]value_array_ptr
-[dist4]value_array_member   // num_bytes
-[u4]2                       // num_elements
-1 2
-[anchr]value_array_member
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_null_keys.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_null_keys.expected
deleted file mode 100644
index 95d8db0..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_null_keys.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNEXPECTED_NULL_POINTER
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_null_values.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_null_values.data
deleted file mode 100644
index 459d806..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_null_values.data
+++ /dev/null
@@ -1,40 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]10                 // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method10_params  // num_bytes
-[u4]0                   // version
-[dist8]map_data_ptr     // param0
-[anchr]method10_params
-
-[anchr]map_data_ptr
-[dist4]map_data_struct_header  // num_bytes
-[u4]0                          // version
-[dist8]key_array_ptr
-[u8]0                          // null values array
-[anchr]map_data_struct_header
-
-[anchr]key_array_ptr
-[dist4]key_array_member   // num_bytes
-[u4]2                     // num_elements
-[dist8]key_string_1
-[dist8]key_string_2
-[anchr]key_array_member
-
-[anchr]key_string_1
-[dist4]key_string_1_member  // num_bytes
-[u4]5                       // num_elements
-0 1 2 3 4
-[anchr]key_string_1_member
-
-[u4]0 [u4]0 [u1]0 [u1]0 [u1]0  // manual padding for array alignment
-
-[anchr]key_string_2
-[dist4]key_string_2_member  // num_bytes
-[u4]5                       // num_elements
-5 6 7 8 9
-[anchr]key_string_2_member
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_null_values.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_null_values.expected
deleted file mode 100644
index 95d8db0..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_null_values.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNEXPECTED_NULL_POINTER
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_one_null_key.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_one_null_key.data
deleted file mode 100644
index 9127a26..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_one_null_key.data
+++ /dev/null
@@ -1,40 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]10                 // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method10_params  // num_bytes
-[u4]0                   // version
-[dist8]map_data_ptr     // param0
-[anchr]method10_params
-
-[anchr]map_data_ptr
-[dist4]map_data_struct_header  // num_bytes
-[u4]0                          // version
-[dist8]key_array_ptr
-[dist8]value_array_ptr
-[anchr]map_data_struct_header
-
-[anchr]key_array_ptr
-[dist4]key_array_member   // num_bytes
-[u4]2                     // num_elements
-[dist8]key_string_1
-[u8]0                     // one null key
-[anchr]key_array_member
-
-[anchr]key_string_1
-[dist4]key_string_1_member  // num_bytes
-[u4]5                       // num_elements
-0 1 2 3 4
-[anchr]key_string_1_member
-
-[u4]0 [u4]0 [u1]0 [u1]0 [u1]0  // manual padding for array alignment
-
-[anchr]value_array_ptr
-[dist4]value_array_member   // num_bytes
-[u4]2                       // num_elements
-1 2
-[anchr]value_array_member
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_one_null_key.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_one_null_key.expected
deleted file mode 100644
index 95d8db0..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_one_null_key.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNEXPECTED_NULL_POINTER
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_unequal_array_size.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_unequal_array_size.data
deleted file mode 100644
index a2f9038..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_unequal_array_size.data
+++ /dev/null
@@ -1,48 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]10                 // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method10_params  // num_bytes
-[u4]0                   // version
-[dist8]map_data_ptr     // param0
-[anchr]method10_params
-
-[anchr]map_data_ptr
-[dist4]map_data_struct_header  // num_bytes
-[u4]0                          // version
-[dist8]key_array_ptr
-[dist8]value_array_ptr
-[anchr]map_data_struct_header
-
-[anchr]key_array_ptr
-[dist4]key_array_member   // num_bytes
-[u4]2                     // num_elements
-[dist8]key_string_1
-[dist8]key_string_2
-[anchr]key_array_member
-
-[anchr]key_string_1
-[dist4]key_string_1_member  // num_bytes
-[u4]5                       // num_elements
-0 1 2 3 4
-[anchr]key_string_1_member
-
-[u4]0 [u4]0 [u1]0 [u1]0 [u1]0  // manual padding for array alignment
-
-[anchr]key_string_2
-[dist4]key_string_2_member  // num_bytes
-[u4]5                       // num_elements
-5 6 7 8 9
-[anchr]key_string_2_member
-
-[u4]0 [u4]0 [u1]0 [u1]0 [u1]0  // manual padding for array alignment
-
-[anchr]value_array_ptr
-[dist4]value_array_member   // num_bytes
-[u4]1                       // num_elements
-1                           // unequal size
-[anchr]value_array_member
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_unequal_array_size.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_unequal_array_size.expected
deleted file mode 100644
index 2798d48..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_unequal_array_size.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_DIFFERENT_SIZED_ARRAYS_IN_MAP
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version0.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version0.data
deleted file mode 100644
index 781079b..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version0.data
+++ /dev/null
@@ -1,19 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]11                 // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method11_params  // num_bytes
-[u4]0                   // version
-[dist8]param0_ptr       // param0
-[anchr]method11_params
-
-[anchr]param0_ptr
-[dist4]struct_g         // num_bytes
-[u4]0                   // version
-[s4]123                 // i
-[u4]0                   // padding
-[anchr]struct_g
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version0.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version0.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version0.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version1.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version1.data
deleted file mode 100644
index b9ab5bf..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version1.data
+++ /dev/null
@@ -1,20 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]11                 // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method11_params  // num_bytes
-[u4]0                   // version
-[dist8]param0_ptr       // param0
-[anchr]method11_params
-
-[anchr]param0_ptr
-[dist4]struct_g         // num_bytes
-[u4]1                   // version
-[s4]123                 // i
-[u4]0                   // padding
-[u8]0                   // struct_a
-[anchr]struct_g
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version1.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version1.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version1.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version2.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version2.data
deleted file mode 100644
index 7d61446..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version2.data
+++ /dev/null
@@ -1,20 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]11                 // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method11_params  // num_bytes
-[u4]0                   // version
-[dist8]param0_ptr       // param0
-[anchr]method11_params
-
-[anchr]param0_ptr
-[dist4]struct_g         // num_bytes
-[u4]2                   // version
-[s4]123                 // i
-[u4]0                   // padding
-[u8]0                   // struct_a
-[anchr]struct_g
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version2.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version2.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version2.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version3.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version3.data
deleted file mode 100644
index 3c3ee12..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version3.data
+++ /dev/null
@@ -1,28 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]11                 // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method11_params  // num_bytes
-[u4]0                   // version
-[dist8]param0_ptr       // param0
-[anchr]method11_params
-
-[anchr]param0_ptr
-[dist4]struct_g         // num_bytes
-[u4]3                   // version
-[s4]123                 // i
-[b]00000001             // b
-0 0 0                   // padding
-[u8]0                   // struct_a
-[dist8]str_ptr          // str
-[anchr]struct_g
-
-[anchr]str_ptr
-[dist4]string           // num_bytes
-[u4]2                   // num_elements
-0 1
-[anchr]string
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version3.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version3.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version3.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version_newer_than_known_1.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version_newer_than_known_1.data
deleted file mode 100644
index 2e9fde6..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version_newer_than_known_1.data
+++ /dev/null
@@ -1,30 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]11                 // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method11_params  // num_bytes
-[u4]0                   // version
-[dist8]param0_ptr       // param0
-[anchr]method11_params
-
-[anchr]param0_ptr
-[dist4]struct_g         // num_bytes
-[u4]5                   // version: Newer than what the validator knows.
-                        // It is okay that the size is the same as the latest
-                        // version that the validator knows.
-[s4]123                 // i
-[b]00000001             // b
-0 0 0                   // padding
-[u8]0                   // struct_a
-[dist8]str_ptr          // str
-[anchr]struct_g
-
-[anchr]str_ptr
-[dist4]string           // num_bytes
-[u4]2                   // num_elements
-0 1
-[anchr]string
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version_newer_than_known_1.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version_newer_than_known_1.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version_newer_than_known_1.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version_newer_than_known_2.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version_newer_than_known_2.data
deleted file mode 100644
index 9a95626..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version_newer_than_known_2.data
+++ /dev/null
@@ -1,30 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]11                 // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method11_params  // num_bytes
-[u4]0                   // version
-[dist8]param0_ptr       // param0
-[anchr]method11_params
-
-[anchr]param0_ptr
-[dist4]struct_g         // num_bytes
-[u4]5                   // version: Newer than what the validator knows.
-[s4]123                 // i
-[b]00000001             // b
-0 0 0                   // padding
-[u8]0                   // struct_a
-[dist8]str_ptr          // str
-[u8]0                   // unknown contents
-[u8]0                   // unknown contents
-[anchr]struct_g
-
-[anchr]str_ptr
-[dist4]string           // num_bytes
-[u4]2                   // num_elements
-0 1
-[anchr]string
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version_newer_than_known_2.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version_newer_than_known_2.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version_newer_than_known_2.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_num_bytes_version_mismatch_1.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_num_bytes_version_mismatch_1.data
deleted file mode 100644
index c2e5a8d..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_num_bytes_version_mismatch_1.data
+++ /dev/null
@@ -1,21 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]11                 // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method11_params  // num_bytes
-[u4]0                   // version
-[dist8]param0_ptr       // param0
-[anchr]method11_params
-
-[anchr]param0_ptr
-[dist4]struct_g         // num_bytes: The size is too big for the version.
-[u4]1                   // version
-[s4]123                 // i
-[u4]0                   // padding
-[u8]0                   // struct_a
-[u8]0                   // Unexpected contents that cause the mismatch.
-[anchr]struct_g
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_num_bytes_version_mismatch_1.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_num_bytes_version_mismatch_1.expected
deleted file mode 100644
index 25aceee..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_num_bytes_version_mismatch_1.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNEXPECTED_STRUCT_HEADER
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_num_bytes_version_mismatch_2.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_num_bytes_version_mismatch_2.data
deleted file mode 100644
index edfe5fa..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_num_bytes_version_mismatch_2.data
+++ /dev/null
@@ -1,19 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]11                 // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method11_params  // num_bytes
-[u4]0                   // version
-[dist8]param0_ptr       // param0
-[anchr]method11_params
-
-[anchr]param0_ptr
-[dist4]struct_g         // num_bytes: The size is too small for the version.
-[u4]2                   // version
-[s4]123                 // i
-[u4]0                   // padding
-[anchr]struct_g
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_num_bytes_version_mismatch_2.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_num_bytes_version_mismatch_2.expected
deleted file mode 100644
index 25aceee..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_num_bytes_version_mismatch_2.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNEXPECTED_STRUCT_HEADER
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd12_invalid_request_flags.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd12_invalid_request_flags.data
deleted file mode 100644
index 13135ae..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd12_invalid_request_flags.data
+++ /dev/null
@@ -1,9 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]1                  // version
-[u4]0                  // interface ID
-[u4]12                 // name
-[u4]0                  // flags: kMessageExpectsResponse is not set but
-                       // expected.
-[u4]0                  // padding
-[u8]1                  // request_id
-[anchr]message_header
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd12_invalid_request_flags.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd12_invalid_request_flags.expected
deleted file mode 100644
index c33fde3..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd12_invalid_request_flags.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_MESSAGE_HEADER_INVALID_FLAGS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd13_good_1.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd13_good_1.data
deleted file mode 100644
index 51973be..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd13_good_1.data
+++ /dev/null
@@ -1,17 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]13                 // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method13_params // num_bytes
-[u4]0                  // version
-[u4]0xFFFFFFFF         // param0
-[u4]1234
-[u4]65535              // param1
-[u4]0xFFFFFFFF         // param2
-[u4]3242
-[u4]0                  // padding
-[anchr]method13_params
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd13_good_1.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd13_good_1.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd13_good_1.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd13_good_2.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd13_good_2.data
deleted file mode 100644
index b739731..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd13_good_2.data
+++ /dev/null
@@ -1,19 +0,0 @@
-[handles]2
-
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]13                 // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method13_params // num_bytes
-[u4]0                  // version
-[u4]0                  // param0
-[u4]1234
-[u4]65535              // param1
-[u4]1                  // param2
-[u4]3242
-[u4]0                  // padding
-[anchr]method13_params
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd13_good_2.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd13_good_2.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd13_good_2.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd14_good_known_enum_values.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd14_good_known_enum_values.data
deleted file mode 100644
index 1444849..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd14_good_known_enum_values.data
+++ /dev/null
@@ -1,13 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]14                 // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method14_params // num_bytes
-[u4]0                  // version
-[u4]0                  // param0
-[u4]1                  // param1
-[anchr]method14_params
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd14_good_known_enum_values.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd14_good_known_enum_values.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd14_good_known_enum_values.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd14_good_uknown_extensible_enum_value.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd14_good_uknown_extensible_enum_value.data
deleted file mode 100644
index 50b9ea3..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd14_good_uknown_extensible_enum_value.data
+++ /dev/null
@@ -1,13 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]14                 // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method14_params // num_bytes
-[u4]0                  // version
-[u4]0                  // param0
-[u4]0xFFFFFFFF         // param1: Unknown value is okay for extensible enum.
-[anchr]method14_params
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd14_good_uknown_extensible_enum_value.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd14_good_uknown_extensible_enum_value.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd14_good_uknown_extensible_enum_value.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd14_uknown_non_extensible_enum_value.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd14_uknown_non_extensible_enum_value.data
deleted file mode 100644
index 567f23b..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd14_uknown_non_extensible_enum_value.data
+++ /dev/null
@@ -1,14 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]14                 // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method14_params // num_bytes
-[u4]0                  // version
-[u4]0xFFFFFFFF         // param0: Unknown value is not allowed for
-                       // non-extensible enum.
-[u4]2                  // param1
-[anchr]method14_params
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd14_uknown_non_extensible_enum_value.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd14_uknown_non_extensible_enum_value.expected
deleted file mode 100644
index 9ef4ce3..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd14_uknown_non_extensible_enum_value.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNKNOWN_ENUM_VALUE
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd15_good_empy_enum_array.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd15_good_empy_enum_array.data
deleted file mode 100644
index 21af8a3..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd15_good_empy_enum_array.data
+++ /dev/null
@@ -1,22 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]15                 // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method15_params // num_bytes
-[u4]0                  // version
-[dist8]enum_array_0    // param0
-[u8]0                  // param1
-[anchr]method15_params
-
-[anchr]enum_array_0
-[dist4]enum_array_0_member  // num_bytes
-[u4]0                       // num_elements
-[anchr]enum_array_0_member
-
-[u8]0x5678                  // This is not part of the array above (which is
-                            // empty), so enum validation shouldn't be done on
-                            // it.
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd15_good_empy_enum_array.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd15_good_empy_enum_array.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd15_good_empy_enum_array.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd15_good_known_enum_array_values.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd15_good_known_enum_array_values.data
deleted file mode 100644
index c418d89..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd15_good_known_enum_array_values.data
+++ /dev/null
@@ -1,27 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]15                 // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method15_params // num_bytes
-[u4]0                  // version
-[dist8]enum_array_0    // param0
-[dist8]enum_array_1    // param1
-[anchr]method15_params
-
-[anchr]enum_array_0
-[dist4]enum_array_0_member  // num_bytes
-[u4]2                       // num_elements
-[u4]0
-[u4]1
-[anchr]enum_array_0_member
-
-[anchr]enum_array_1
-[dist4]enum_array_1_member  // num_bytes
-[u4]2                       // num_elements
-[u4]0
-[u4]1
-[anchr]enum_array_1_member
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd15_good_known_enum_array_values.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd15_good_known_enum_array_values.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd15_good_known_enum_array_values.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd15_good_uknown_extensible_enum_array_value.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd15_good_uknown_extensible_enum_array_value.data
deleted file mode 100644
index b6be6d9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd15_good_uknown_extensible_enum_array_value.data
+++ /dev/null
@@ -1,20 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]15                 // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method15_params // num_bytes
-[u4]0                  // version
-[u8]0                  // param0
-[dist8]enum_array_1    // param1
-[anchr]method15_params
-
-[anchr]enum_array_1
-[dist4]enum_array_1_member  // num_bytes
-[u4]2                       // num_elements
-[u4]0
-[u4]0x1234                  // Unknown value is okay for extensible enum.
-[anchr]enum_array_1_member
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd15_good_uknown_extensible_enum_array_value.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd15_good_uknown_extensible_enum_array_value.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd15_good_uknown_extensible_enum_array_value.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd15_uknown_non_extensible_enum_array_value.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd15_uknown_non_extensible_enum_array_value.data
deleted file mode 100644
index 0a46e0a..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd15_uknown_non_extensible_enum_array_value.data
+++ /dev/null
@@ -1,21 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]15                 // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method15_params // num_bytes
-[u4]0                  // version
-[dist8]enum_array_0    // param0
-[u8]0                  // param1
-[anchr]method15_params
-
-[anchr]enum_array_0
-[dist4]enum_array_0_member  // num_bytes
-[u4]2                       // num_elements
-[u4]1
-[u4]0x5678                  // Unknown value is not allowed for non-extensible
-                            // enum.
-[anchr]enum_array_0_member
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd15_uknown_non_extensible_enum_array_value.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd15_uknown_non_extensible_enum_array_value.expected
deleted file mode 100644
index 9ef4ce3..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd15_uknown_non_extensible_enum_array_value.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNKNOWN_ENUM_VALUE
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd16_uknown_non_extensible_enum_map_key.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd16_uknown_non_extensible_enum_map_key.data
deleted file mode 100644
index 0425ea7..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd16_uknown_non_extensible_enum_map_key.data
+++ /dev/null
@@ -1,34 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]16                 // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method16_params  // num_bytes
-[u4]0                   // version
-[dist8]map_data_ptr     // param0
-[anchr]method16_params
-
-[anchr]map_data_ptr
-[dist4]map_data_struct_header  // num_bytes
-[u4]0                          // version
-[dist8]key_array_ptr
-[dist8]value_array_ptr
-[anchr]map_data_struct_header
-
-[anchr]key_array_ptr
-[dist4]key_array_member     // num_bytes
-[u4]2                       // num_elements
-[u4]0x5678                  // Unknown value is not allowed for non-extensible
-                            // enum.
-[u4]1
-[anchr]key_array_member
-
-[anchr]value_array_ptr
-[dist4]value_array_member   // num_bytes
-[u4]2                       // num_elements
-[u4]1
-[u4]2
-[anchr]value_array_member
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd16_uknown_non_extensible_enum_map_key.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd16_uknown_non_extensible_enum_map_key.expected
deleted file mode 100644
index 9ef4ce3..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd16_uknown_non_extensible_enum_map_key.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNKNOWN_ENUM_VALUE
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd16_uknown_non_extensible_enum_map_value.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd16_uknown_non_extensible_enum_map_value.data
deleted file mode 100644
index 2c2ea26..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd16_uknown_non_extensible_enum_map_value.data
+++ /dev/null
@@ -1,34 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]16                 // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method16_params  // num_bytes
-[u4]0                   // version
-[dist8]map_data_ptr     // param0
-[anchr]method16_params
-
-[anchr]map_data_ptr
-[dist4]map_data_struct_header  // num_bytes
-[u4]0                          // version
-[dist8]key_array_ptr
-[dist8]value_array_ptr
-[anchr]map_data_struct_header
-
-[anchr]key_array_ptr
-[dist4]key_array_member     // num_bytes
-[u4]2                       // num_elements
-[u4]1
-[u4]2
-[anchr]key_array_member
-
-[anchr]value_array_ptr
-[dist4]value_array_member   // num_bytes
-[u4]2                       // num_elements
-[u4]0x5678                  // Unknown value is not allowed for non-extensible
-                            // enum.
-[u4]1
-[anchr]value_array_member
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd16_uknown_non_extensible_enum_map_value.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd16_uknown_non_extensible_enum_map_value.expected
deleted file mode 100644
index 9ef4ce3..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd16_uknown_non_extensible_enum_map_value.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNKNOWN_ENUM_VALUE
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd17_good.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd17_good.data
deleted file mode 100644
index 48807ab..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd17_good.data
+++ /dev/null
@@ -1,23 +0,0 @@
-[handles]10  // Larger than the number of handles that we know about is okay.
-
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]17                 // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method17_params  // num_bytes
-[u4]0                   // version
-[dist8]param0_ptr       // param0
-[anchr]method17_params
-
-[anchr]param0_ptr
-[dist4]interface_array  // num_bytes
-[u4]2                   // num_elements
-[u4]4                   // handle
-[u4]14                  // version
-[u4]5                   // handle
-[u4]18                  // version
-[anchr]interface_array
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd17_good.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd17_good.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd17_good.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd17_interface_handle_out_of_range_in_array.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd17_interface_handle_out_of_range_in_array.data
deleted file mode 100644
index e549a10..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd17_interface_handle_out_of_range_in_array.data
+++ /dev/null
@@ -1,24 +0,0 @@
-[handles]10
-
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]17                 // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method17_params  // num_bytes
-[u4]0                   // version
-[dist8]param0_ptr       // param0
-[anchr]method17_params
-
-[anchr]param0_ptr
-[dist4]interface_array  // num_bytes
-[u4]2                   // num_elements
-[u4]4                   // handle
-[u4]14                  // version
-[u4]10                  // handle: It is outside of the valid encoded handle
-                        // range [0, 10)
-[u4]18                  // version
-[anchr]interface_array
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd17_interface_handle_out_of_range_in_array.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd17_interface_handle_out_of_range_in_array.expected
deleted file mode 100644
index eef8e38..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd17_interface_handle_out_of_range_in_array.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_ILLEGAL_HANDLE
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd17_unexpected_invalid_interface_in_array.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd17_unexpected_invalid_interface_in_array.data
deleted file mode 100644
index 1ce1d92..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd17_unexpected_invalid_interface_in_array.data
+++ /dev/null
@@ -1,23 +0,0 @@
-[handles]10
-
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]17                 // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method17_params  // num_bytes
-[u4]0                   // version
-[dist8]param0_ptr       // param0
-[anchr]method17_params
-
-[anchr]param0_ptr
-[dist4]interface_array  // num_bytes
-[u4]2                   // num_elements
-[u4]4                   // handle
-[u4]14                  // version
-[u4]0xFFFFFFFF          // handle: An unexpected invalid handle.
-[u4]18                  // version
-[anchr]interface_array
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd17_unexpected_invalid_interface_in_array.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd17_unexpected_invalid_interface_in_array.expected
deleted file mode 100644
index 6768236..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd17_unexpected_invalid_interface_in_array.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNEXPECTED_INVALID_HANDLE
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd18_good.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd18_good.data
deleted file mode 100644
index 663796d..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd18_good.data
+++ /dev/null
@@ -1,14 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]18                 // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method18_params  // num_bytes
-[u4]0                   // version
-[u4]0                   // param0: Size 0 indicating the inlined union is null.
-[u4]0                   // param0: Tag field ignored.
-[u8]0                   // param0: Payload field ignored.
-[anchr]method18_params
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd18_good.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd18_good.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd18_good.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd19_exceed_recursion_limit.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd19_exceed_recursion_limit.data
deleted file mode 100644
index 96e52d5..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd19_exceed_recursion_limit.data
+++ /dev/null
@@ -1,612 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]19                 // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method0_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[anchr]method0_params
-
-[anchr]param0_ptr
-[dist4]struct_a1      // num_bytes
-[u4]0                 // version
-[dist8]struct_a2_ptr  // struct_a2
-[anchr]struct_a1
-
-[anchr]struct_a2_ptr
-[dist4]struct_a2      // num_bytes
-[u4]0                 // version
-[dist8]struct_a3_ptr  // struct_a2
-[anchr]struct_a2
-
-[anchr]struct_a3_ptr
-[dist4]struct_a3      // num_bytes
-[u4]0                 // version
-[dist8]struct_a4_ptr  // struct_a3
-[anchr]struct_a3
-
-[anchr]struct_a4_ptr
-[dist4]struct_a4      // num_bytes
-[u4]0                 // version
-[dist8]struct_a5_ptr  // struct_a4
-[anchr]struct_a4
-
-[anchr]struct_a5_ptr
-[dist4]struct_a5      // num_bytes
-[u4]0                 // version
-[dist8]struct_a6_ptr  // struct_a5
-[anchr]struct_a5
-
-[anchr]struct_a6_ptr
-[dist4]struct_a6      // num_bytes
-[u4]0                 // version
-[dist8]struct_a7_ptr  // struct_a6
-[anchr]struct_a6
-
-[anchr]struct_a7_ptr
-[dist4]struct_a7      // num_bytes
-[u4]0                 // version
-[dist8]struct_a8_ptr  // struct_a7
-[anchr]struct_a7
-
-[anchr]struct_a8_ptr
-[dist4]struct_a8      // num_bytes
-[u4]0                 // version
-[dist8]struct_a9_ptr  // struct_a8
-[anchr]struct_a8
-
-[anchr]struct_a9_ptr
-[dist4]struct_a9       // num_bytes
-[u4]0                  // version
-[dist8]struct_a10_ptr  // struct_a9
-[anchr]struct_a9
-
-[anchr]struct_a10_ptr
-[dist4]struct_a10      // num_bytes
-[u4]0                  // version
-[dist8]struct_a11_ptr  // struct_a10
-[anchr]struct_a10
-
-[anchr]struct_a11_ptr
-[dist4]struct_a11      // num_bytes
-[u4]0                  // version
-[dist8]struct_a12_ptr  // struct_a11
-[anchr]struct_a11
-
-[anchr]struct_a12_ptr
-[dist4]struct_a12      // num_bytes
-[u4]0                  // version
-[dist8]struct_a13_ptr  // struct_a12
-[anchr]struct_a12
-
-[anchr]struct_a13_ptr
-[dist4]struct_a13      // num_bytes
-[u4]0                  // version
-[dist8]struct_a14_ptr  // struct_a13
-[anchr]struct_a13
-
-[anchr]struct_a14_ptr
-[dist4]struct_a14      // num_bytes
-[u4]0                  // version
-[dist8]struct_a15_ptr  // struct_a14
-[anchr]struct_a14
-
-[anchr]struct_a15_ptr
-[dist4]struct_a15      // num_bytes
-[u4]0                  // version
-[dist8]struct_a16_ptr  // struct_a15
-[anchr]struct_a15
-
-[anchr]struct_a16_ptr
-[dist4]struct_a16      // num_bytes
-[u4]0                  // version
-[dist8]struct_a17_ptr  // struct_a16
-[anchr]struct_a16
-
-[anchr]struct_a17_ptr
-[dist4]struct_a17      // num_bytes
-[u4]0                  // version
-[dist8]struct_a18_ptr  // struct_a17
-[anchr]struct_a17
-
-[anchr]struct_a18_ptr
-[dist4]struct_a18      // num_bytes
-[u4]0                  // version
-[dist8]struct_a19_ptr  // struct_a18
-[anchr]struct_a18
-
-[anchr]struct_a19_ptr
-[dist4]struct_a19      // num_bytes
-[u4]0                  // version
-[dist8]struct_a20_ptr  // struct_a19
-[anchr]struct_a19
-
-[anchr]struct_a20_ptr
-[dist4]struct_a20      // num_bytes
-[u4]0                  // version
-[dist8]struct_a21_ptr  // struct_a20
-[anchr]struct_a20
-
-[anchr]struct_a21_ptr
-[dist4]struct_a21      // num_bytes
-[u4]0                  // version
-[dist8]struct_a22_ptr  // struct_a21
-[anchr]struct_a21
-
-[anchr]struct_a22_ptr
-[dist4]struct_a22      // num_bytes
-[u4]0                  // version
-[dist8]struct_a23_ptr  // struct_a22
-[anchr]struct_a22
-
-[anchr]struct_a23_ptr
-[dist4]struct_a23      // num_bytes
-[u4]0                  // version
-[dist8]struct_a24_ptr  // struct_a23
-[anchr]struct_a23
-
-[anchr]struct_a24_ptr
-[dist4]struct_a24      // num_bytes
-[u4]0                  // version
-[dist8]struct_a25_ptr  // struct_a24
-[anchr]struct_a24
-
-[anchr]struct_a25_ptr
-[dist4]struct_a25      // num_bytes
-[u4]0                  // version
-[dist8]struct_a26_ptr  // struct_a25
-[anchr]struct_a25
-
-[anchr]struct_a26_ptr
-[dist4]struct_a26      // num_bytes
-[u4]0                  // version
-[dist8]struct_a27_ptr  // struct_a26
-[anchr]struct_a26
-
-[anchr]struct_a27_ptr
-[dist4]struct_a27      // num_bytes
-[u4]0                  // version
-[dist8]struct_a28_ptr  // struct_a27
-[anchr]struct_a27
-
-[anchr]struct_a28_ptr
-[dist4]struct_a28      // num_bytes
-[u4]0                  // version
-[dist8]struct_a29_ptr  // struct_a28
-[anchr]struct_a28
-
-[anchr]struct_a29_ptr
-[dist4]struct_a29      // num_bytes
-[u4]0                  // version
-[dist8]struct_a30_ptr  // struct_a29
-[anchr]struct_a29
-
-[anchr]struct_a30_ptr
-[dist4]struct_a30      // num_bytes
-[u4]0                  // version
-[dist8]struct_a31_ptr  // struct_a30
-[anchr]struct_a30
-
-[anchr]struct_a31_ptr
-[dist4]struct_a31      // num_bytes
-[u4]0                  // version
-[dist8]struct_a32_ptr  // struct_a31
-[anchr]struct_a31
-
-[anchr]struct_a32_ptr
-[dist4]struct_a32      // num_bytes
-[u4]0                  // version
-[dist8]struct_a33_ptr  // struct_a32
-[anchr]struct_a32
-
-[anchr]struct_a33_ptr
-[dist4]struct_a33      // num_bytes
-[u4]0                  // version
-[dist8]struct_a34_ptr  // struct_a33
-[anchr]struct_a33
-
-[anchr]struct_a34_ptr
-[dist4]struct_a34      // num_bytes
-[u4]0                  // version
-[dist8]struct_a35_ptr  // struct_a34
-[anchr]struct_a34
-
-[anchr]struct_a35_ptr
-[dist4]struct_a35      // num_bytes
-[u4]0                  // version
-[dist8]struct_a36_ptr  // struct_a35
-[anchr]struct_a35
-
-[anchr]struct_a36_ptr
-[dist4]struct_a36      // num_bytes
-[u4]0                  // version
-[dist8]struct_a37_ptr  // struct_a36
-[anchr]struct_a36
-
-[anchr]struct_a37_ptr
-[dist4]struct_a37      // num_bytes
-[u4]0                  // version
-[dist8]struct_a38_ptr  // struct_a37
-[anchr]struct_a37
-
-[anchr]struct_a38_ptr
-[dist4]struct_a38      // num_bytes
-[u4]0                  // version
-[dist8]struct_a39_ptr  // struct_a38
-[anchr]struct_a38
-
-[anchr]struct_a39_ptr
-[dist4]struct_a39      // num_bytes
-[u4]0                  // version
-[dist8]struct_a40_ptr  // struct_a39
-[anchr]struct_a39
-
-[anchr]struct_a40_ptr
-[dist4]struct_a40      // num_bytes
-[u4]0                  // version
-[dist8]struct_a41_ptr  // struct_a40
-[anchr]struct_a40
-
-[anchr]struct_a41_ptr
-[dist4]struct_a41      // num_bytes
-[u4]0                  // version
-[dist8]struct_a42_ptr  // struct_a41
-[anchr]struct_a41
-
-[anchr]struct_a42_ptr
-[dist4]struct_a42      // num_bytes
-[u4]0                  // version
-[dist8]struct_a43_ptr  // struct_a42
-[anchr]struct_a42
-
-[anchr]struct_a43_ptr
-[dist4]struct_a43      // num_bytes
-[u4]0                  // version
-[dist8]struct_a44_ptr  // struct_a43
-[anchr]struct_a43
-
-[anchr]struct_a44_ptr
-[dist4]struct_a44      // num_bytes
-[u4]0                  // version
-[dist8]struct_a45_ptr  // struct_a44
-[anchr]struct_a44
-
-[anchr]struct_a45_ptr
-[dist4]struct_a45      // num_bytes
-[u4]0                  // version
-[dist8]struct_a46_ptr  // struct_a45
-[anchr]struct_a45
-
-[anchr]struct_a46_ptr
-[dist4]struct_a46      // num_bytes
-[u4]0                  // version
-[dist8]struct_a47_ptr  // struct_a46
-[anchr]struct_a46
-
-[anchr]struct_a47_ptr
-[dist4]struct_a47      // num_bytes
-[u4]0                  // version
-[dist8]struct_a48_ptr  // struct_a47
-[anchr]struct_a47
-
-[anchr]struct_a48_ptr
-[dist4]struct_a48      // num_bytes
-[u4]0                  // version
-[dist8]struct_a49_ptr  // struct_a48
-[anchr]struct_a48
-
-[anchr]struct_a49_ptr
-[dist4]struct_a49      // num_bytes
-[u4]0                  // version
-[dist8]struct_a50_ptr  // struct_a49
-[anchr]struct_a49
-
-[anchr]struct_a50_ptr
-[dist4]struct_a50      // num_bytes
-[u4]0                  // version
-[dist8]struct_a51_ptr  // struct_a50
-[anchr]struct_a50
-
-[anchr]struct_a51_ptr
-[dist4]struct_a51      // num_bytes
-[u4]0                  // version
-[dist8]struct_a52_ptr  // struct_a51
-[anchr]struct_a51
-
-[anchr]struct_a52_ptr
-[dist4]struct_a52      // num_bytes
-[u4]0                  // version
-[dist8]struct_a53_ptr  // struct_a52
-[anchr]struct_a52
-
-[anchr]struct_a53_ptr
-[dist4]struct_a53      // num_bytes
-[u4]0                  // version
-[dist8]struct_a54_ptr  // struct_a53
-[anchr]struct_a53
-
-[anchr]struct_a54_ptr
-[dist4]struct_a54      // num_bytes
-[u4]0                  // version
-[dist8]struct_a55_ptr  // struct_a54
-[anchr]struct_a54
-
-[anchr]struct_a55_ptr
-[dist4]struct_a55      // num_bytes
-[u4]0                  // version
-[dist8]struct_a56_ptr  // struct_a55
-[anchr]struct_a55
-
-[anchr]struct_a56_ptr
-[dist4]struct_a56      // num_bytes
-[u4]0                  // version
-[dist8]struct_a57_ptr  // struct_a56
-[anchr]struct_a56
-
-[anchr]struct_a57_ptr
-[dist4]struct_a57      // num_bytes
-[u4]0                  // version
-[dist8]struct_a58_ptr  // struct_a57
-[anchr]struct_a57
-
-[anchr]struct_a58_ptr
-[dist4]struct_a58      // num_bytes
-[u4]0                  // version
-[dist8]struct_a59_ptr  // struct_a58
-[anchr]struct_a58
-
-[anchr]struct_a59_ptr
-[dist4]struct_a59      // num_bytes
-[u4]0                  // version
-[dist8]struct_a60_ptr  // struct_a59
-[anchr]struct_a59
-
-[anchr]struct_a60_ptr
-[dist4]struct_a60      // num_bytes
-[u4]0                  // version
-[dist8]struct_a61_ptr  // struct_a60
-[anchr]struct_a60
-
-[anchr]struct_a61_ptr
-[dist4]struct_a61      // num_bytes
-[u4]0                  // version
-[dist8]struct_a62_ptr  // struct_a61
-[anchr]struct_a61
-
-[anchr]struct_a62_ptr
-[dist4]struct_a62      // num_bytes
-[u4]0                  // version
-[dist8]struct_a63_ptr  // struct_a62
-[anchr]struct_a62
-
-[anchr]struct_a63_ptr
-[dist4]struct_a63      // num_bytes
-[u4]0                  // version
-[dist8]struct_a64_ptr  // struct_a63
-[anchr]struct_a63
-
-[anchr]struct_a64_ptr
-[dist4]struct_a64      // num_bytes
-[u4]0                  // version
-[dist8]struct_a65_ptr  // struct_a64
-[anchr]struct_a64
-
-[anchr]struct_a65_ptr
-[dist4]struct_a65      // num_bytes
-[u4]0                  // version
-[dist8]struct_a66_ptr  // struct_a65
-[anchr]struct_a65
-
-[anchr]struct_a66_ptr
-[dist4]struct_a66      // num_bytes
-[u4]0                  // version
-[dist8]struct_a67_ptr  // struct_a66
-[anchr]struct_a66
-
-[anchr]struct_a67_ptr
-[dist4]struct_a67      // num_bytes
-[u4]0                  // version
-[dist8]struct_a68_ptr  // struct_a67
-[anchr]struct_a67
-
-[anchr]struct_a68_ptr
-[dist4]struct_a68      // num_bytes
-[u4]0                  // version
-[dist8]struct_a69_ptr  // struct_a68
-[anchr]struct_a68
-
-[anchr]struct_a69_ptr
-[dist4]struct_a69      // num_bytes
-[u4]0                  // version
-[dist8]struct_a70_ptr  // struct_a69
-[anchr]struct_a69
-
-[anchr]struct_a70_ptr
-[dist4]struct_a70      // num_bytes
-[u4]0                  // version
-[dist8]struct_a71_ptr  // struct_a70
-[anchr]struct_a70
-
-[anchr]struct_a71_ptr
-[dist4]struct_a71      // num_bytes
-[u4]0                  // version
-[dist8]struct_a72_ptr  // struct_a71
-[anchr]struct_a71
-
-[anchr]struct_a72_ptr
-[dist4]struct_a72      // num_bytes
-[u4]0                  // version
-[dist8]struct_a73_ptr  // struct_a72
-[anchr]struct_a72
-
-[anchr]struct_a73_ptr
-[dist4]struct_a73      // num_bytes
-[u4]0                  // version
-[dist8]struct_a74_ptr  // struct_a73
-[anchr]struct_a73
-
-[anchr]struct_a74_ptr
-[dist4]struct_a74      // num_bytes
-[u4]0                  // version
-[dist8]struct_a75_ptr  // struct_a74
-[anchr]struct_a74
-
-[anchr]struct_a75_ptr
-[dist4]struct_a75      // num_bytes
-[u4]0                  // version
-[dist8]struct_a76_ptr  // struct_a75
-[anchr]struct_a75
-
-[anchr]struct_a76_ptr
-[dist4]struct_a76      // num_bytes
-[u4]0                  // version
-[dist8]struct_a77_ptr  // struct_a76
-[anchr]struct_a76
-
-[anchr]struct_a77_ptr
-[dist4]struct_a77      // num_bytes
-[u4]0                  // version
-[dist8]struct_a78_ptr  // struct_a77
-[anchr]struct_a77
-
-[anchr]struct_a78_ptr
-[dist4]struct_a78      // num_bytes
-[u4]0                  // version
-[dist8]struct_a79_ptr  // struct_a78
-[anchr]struct_a78
-
-[anchr]struct_a79_ptr
-[dist4]struct_a79      // num_bytes
-[u4]0                  // version
-[dist8]struct_a80_ptr  // struct_a79
-[anchr]struct_a79
-
-[anchr]struct_a80_ptr
-[dist4]struct_a80      // num_bytes
-[u4]0                  // version
-[dist8]struct_a81_ptr  // struct_a80
-[anchr]struct_a80
-
-[anchr]struct_a81_ptr
-[dist4]struct_a81      // num_bytes
-[u4]0                  // version
-[dist8]struct_a82_ptr  // struct_a81
-[anchr]struct_a81
-
-[anchr]struct_a82_ptr
-[dist4]struct_a82      // num_bytes
-[u4]0                  // version
-[dist8]struct_a83_ptr  // struct_a82
-[anchr]struct_a82
-
-[anchr]struct_a83_ptr
-[dist4]struct_a83      // num_bytes
-[u4]0                  // version
-[dist8]struct_a84_ptr  // struct_a83
-[anchr]struct_a83
-
-[anchr]struct_a84_ptr
-[dist4]struct_a84      // num_bytes
-[u4]0                  // version
-[dist8]struct_a85_ptr  // struct_a84
-[anchr]struct_a84
-
-[anchr]struct_a85_ptr
-[dist4]struct_a85      // num_bytes
-[u4]0                  // version
-[dist8]struct_a86_ptr  // struct_a85
-[anchr]struct_a85
-
-[anchr]struct_a86_ptr
-[dist4]struct_a86      // num_bytes
-[u4]0                  // version
-[dist8]struct_a87_ptr  // struct_a86
-[anchr]struct_a86
-
-[anchr]struct_a87_ptr
-[dist4]struct_a87      // num_bytes
-[u4]0                  // version
-[dist8]struct_a88_ptr  // struct_a87
-[anchr]struct_a87
-
-[anchr]struct_a88_ptr
-[dist4]struct_a88      // num_bytes
-[u4]0                  // version
-[dist8]struct_a89_ptr  // struct_a88
-[anchr]struct_a88
-
-[anchr]struct_a89_ptr
-[dist4]struct_a89      // num_bytes
-[u4]0                  // version
-[dist8]struct_a90_ptr  // struct_a89
-[anchr]struct_a89
-
-[anchr]struct_a90_ptr
-[dist4]struct_a90      // num_bytes
-[u4]0                  // version
-[dist8]struct_a91_ptr  // struct_a90
-[anchr]struct_a90
-
-[anchr]struct_a91_ptr
-[dist4]struct_a91      // num_bytes
-[u4]0                  // version
-[dist8]struct_a92_ptr  // struct_a91
-[anchr]struct_a91
-
-[anchr]struct_a92_ptr
-[dist4]struct_a92      // num_bytes
-[u4]0                  // version
-[dist8]struct_a93_ptr  // struct_a92
-[anchr]struct_a92
-
-[anchr]struct_a93_ptr
-[dist4]struct_a93      // num_bytes
-[u4]0                  // version
-[dist8]struct_a94_ptr  // struct_a93
-[anchr]struct_a93
-
-[anchr]struct_a94_ptr
-[dist4]struct_a94      // num_bytes
-[u4]0                  // version
-[dist8]struct_a95_ptr  // struct_a94
-[anchr]struct_a94
-
-[anchr]struct_a95_ptr
-[dist4]struct_a95      // num_bytes
-[u4]0                  // version
-[dist8]struct_a96_ptr  // struct_a95
-[anchr]struct_a95
-
-[anchr]struct_a96_ptr
-[dist4]struct_a96      // num_bytes
-[u4]0                  // version
-[dist8]struct_a97_ptr  // struct_a96
-[anchr]struct_a96
-
-[anchr]struct_a97_ptr
-[dist4]struct_a97      // num_bytes
-[u4]0                  // version
-[dist8]struct_a98_ptr  // struct_a97
-[anchr]struct_a97
-
-[anchr]struct_a98_ptr
-[dist4]struct_a98      // num_bytes
-[u4]0                  // version
-[dist8]struct_a99_ptr  // struct_a98
-[anchr]struct_a98
-
-[anchr]struct_a99_ptr
-[dist4]struct_a99       // num_bytes
-[u4]0                   // version
-[dist8]struct_a100_ptr  // struct_a99
-[anchr]struct_a99
-
-[anchr]struct_a100_ptr
-[dist4]struct_a100      // num_bytes
-[u4]0                   // version
-[u8]0                   // struct_a100
-[anchr]struct_a100
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd19_exceed_recursion_limit.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd19_exceed_recursion_limit.expected
deleted file mode 100644
index 81d6cd8..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd19_exceed_recursion_limit.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_MAX_RECURSION_DEPTH
\ No newline at end of file
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_good.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_good.data
deleted file mode 100644
index b6c201a..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_good.data
+++ /dev/null
@@ -1,18 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]1                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method1_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[anchr]method1_params
-
-[anchr]param0_ptr
-[dist4]struct_a  // num_bytes
-[u4]0            // version
-[u8]1234         // i
-[anchr]struct_a
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_good.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_good.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_good.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_misaligned_struct.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_misaligned_struct.data
deleted file mode 100644
index ec39b71..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_misaligned_struct.data
+++ /dev/null
@@ -1,20 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]1                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method1_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[anchr]method1_params
-
-[u1]0  // Causes the following struct to be misaligned.
-
-[anchr]param0_ptr
-[dist4]struct_a  // num_bytes
-[u4]0            // version
-[u8]1234         // i
-[anchr]struct_a
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_misaligned_struct.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_misaligned_struct.expected
deleted file mode 100644
index acca999..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_misaligned_struct.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_MISALIGNED_OBJECT
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_struct_pointer_overflow.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_struct_pointer_overflow.data
deleted file mode 100644
index 6d92050..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_struct_pointer_overflow.data
+++ /dev/null
@@ -1,13 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]1                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method1_params   // num_bytes
-[u4]0                   // version
-[u8]0xFFFFFFFFFFFFFFFF  // param0: Test whether decoding the pointer causes
-                        // overflow.
-[anchr]method1_params
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_struct_pointer_overflow.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_struct_pointer_overflow.expected
deleted file mode 100644
index 23abb8c..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_struct_pointer_overflow.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_ILLEGAL_POINTER
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_unexpected_null_struct.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_unexpected_null_struct.data
deleted file mode 100644
index 569733b..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_unexpected_null_struct.data
+++ /dev/null
@@ -1,12 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]1                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method1_params  // num_bytes
-[u4]0                  // version
-[u8]0                  // param0: An unexpected null pointer.
-[anchr]method1_params
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_unexpected_null_struct.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_unexpected_null_struct.expected
deleted file mode 100644
index 95d8db0..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_unexpected_null_struct.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNEXPECTED_NULL_POINTER
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd20_good.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd20_good.data
deleted file mode 100644
index 8ec608b..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd20_good.data
+++ /dev/null
@@ -1,57 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]20                 // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method20_params  // num_bytes
-[u4]0                   // version
-[dist8]map_data_ptr     // param0
-[anchr]method20_params
-
-[anchr]map_data_ptr
-[dist4]map_data_struct_header  // num_bytes
-[u4]0                          // version
-[dist8]key_array_ptr
-[dist8]value_array_ptr
-[anchr]map_data_struct_header
-
-[anchr]key_array_ptr
-[dist4]key_array_member  // num_bytes
-[u4]2                    // num_elements
-[dist8]key_struct_b_1
-[dist8]key_struct_b_2
-[anchr]key_array_member
-
-[anchr]key_struct_b_1
-[dist4]key_struct_b_1_member  // num_bytes
-[u4]0                         // version
-[dist8]key_struct_a_1         // struct_a
-[anchr]key_struct_b_1_member
-
-[anchr]key_struct_a_1
-[dist4]key_struct_a_1_member  // num_bytes
-[u4]0                         // version
-[u8]1234                      // i
-[anchr]key_struct_a_1_member
-
-[anchr]key_struct_b_2
-[dist4]key_struct_b_2_member  // num_bytes
-[u4]0                         // version
-[dist8]key_struct_a_2         // struct_a
-[anchr]key_struct_b_2_member
-
-[anchr]key_struct_a_2
-[dist4]key_struct_a_2_member  // num_bytes
-[u4]0                         // version
-[u8]5678                      // i
-[anchr]key_struct_a_2_member
-
-[anchr]value_array_ptr
-[dist4]value_array_member  // num_bytes
-[u4]2                      // num_elements
-[u1]1
-[u1]2
-[anchr]value_array_member
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd20_good.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd20_good.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd20_good.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd21_empty_extensible_enum_accepts_any_value.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd21_empty_extensible_enum_accepts_any_value.data
deleted file mode 100644
index d3ae88e..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd21_empty_extensible_enum_accepts_any_value.data
+++ /dev/null
@@ -1,13 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]21                 // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method21_params // num_bytes
-[u4]0                  // version
-[u4]7                  // param0. All values are valid for an extensible enum.
-[u4]0                  // padding
-[anchr]method21_params
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd21_empty_extensible_enum_accepts_any_value.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd21_empty_extensible_enum_accepts_any_value.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd21_empty_extensible_enum_accepts_any_value.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd22_empty_nonextensible_enum_accepts_no_values.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd22_empty_nonextensible_enum_accepts_no_values.data
deleted file mode 100644
index 414785c..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd22_empty_nonextensible_enum_accepts_no_values.data
+++ /dev/null
@@ -1,14 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]22                 // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method21_params // num_bytes
-[u4]0                  // version
-[u4]0                  // param0. No values are valid for an empty
-                       // non-extensible enum.
-[u4]0                  // padding
-[anchr]method21_params
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd22_empty_nonextensible_enum_accepts_no_values.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd22_empty_nonextensible_enum_accepts_no_values.expected
deleted file mode 100644
index 9ef4ce3..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd22_empty_nonextensible_enum_accepts_no_values.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNKNOWN_ENUM_VALUE
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_good.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_good.data
deleted file mode 100644
index 40719f5..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_good.data
+++ /dev/null
@@ -1,34 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]2                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method2_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[dist8]param1_ptr      // param1
-[anchr]method2_params
-
-[anchr]param0_ptr
-[dist4]struct_b     // num_bytes
-[u4]0               // version
-[dist8]struct_a_ptr // struct_a
-[anchr]struct_b
-
-[u8]0  // Having extra bytes in the middle is okay if the following objects are
-       // still properly alignmented.
-
-[anchr]struct_a_ptr
-[dist4]struct_a_member  // num_bytes
-[u4]0                   // version
-[u8]12345               // i
-[anchr]struct_a_member
-
-[anchr]param1_ptr
-[dist4]struct_a_param  // num_bytes
-[u4]0                  // version
-[u8]67890              // i
-[anchr]struct_a_param
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_good.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_good.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_good.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_multiple_pointers_to_same_struct.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_multiple_pointers_to_same_struct.data
deleted file mode 100644
index ef6525b..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_multiple_pointers_to_same_struct.data
+++ /dev/null
@@ -1,27 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]2                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method2_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[dist8]param1_ptr      // param1
-[anchr]method2_params
-
-[anchr]param0_ptr
-[dist4]struct_b     // num_bytes
-[u4]0               // version
-[dist8]struct_a_ptr // struct_a
-[anchr]struct_b
-
-// There are two pointers pointing to the same struct.
-[anchr]struct_a_ptr
-[anchr]param1_ptr
-[dist4]struct_a  // num_bytes
-[u4]0            // version
-[u8]12345        // i
-[anchr]struct_a
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_multiple_pointers_to_same_struct.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_multiple_pointers_to_same_struct.expected
deleted file mode 100644
index 779df88..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_multiple_pointers_to_same_struct.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_overlapped_objects.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_overlapped_objects.data
deleted file mode 100644
index 58b25a1..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_overlapped_objects.data
+++ /dev/null
@@ -1,32 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]2                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method2_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[dist8]param1_ptr      // param1
-[anchr]method2_params
-
-[anchr]param0_ptr
-[dist4]struct_b     // num_bytes
-[u4]0               // version
-[dist8]struct_a_ptr // struct_a
-[anchr]struct_b
-
-[anchr]struct_a_ptr
-[dist4]struct_a_member  // num_bytes
-[u4]0                   // version
-
-[anchr]param1_ptr
-// The following |num_bytes| and |version| fields are also the |i| field of the
-// previous struct.
-[dist4]struct_a_param   // num_bytes
-[u4]0                   // version
-[anchr]struct_a_member
-[u8]67890               // i
-[anchr]struct_a_param
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_overlapped_objects.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_overlapped_objects.expected
deleted file mode 100644
index 779df88..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_overlapped_objects.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_wrong_layout_order.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_wrong_layout_order.data
deleted file mode 100644
index 3038ed8..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_wrong_layout_order.data
+++ /dev/null
@@ -1,34 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]2                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method2_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[dist8]param1_ptr      // param1
-[anchr]method2_params
-
-[anchr]param0_ptr
-[dist4]struct_b     // num_bytes
-[u4]0               // version
-[dist8]struct_a_ptr // struct_a
-[anchr]struct_b
-
-// The following two structs are arranged in wrong order.
-
-[anchr]param1_ptr
-[dist4]struct_a_param  // num_bytes
-[u4]0                  // version
-[u8]67890              // i
-[anchr]struct_a_param
-
-[anchr]struct_a_ptr
-[dist4]struct_a_member  // num_bytes
-[u4]0                   // version
-[u8]12345               // i
-[anchr]struct_a_member
-
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_wrong_layout_order.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_wrong_layout_order.expected
deleted file mode 100644
index 779df88..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_wrong_layout_order.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_num_bytes_huge.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_num_bytes_huge.data
deleted file mode 100644
index 6814636..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_num_bytes_huge.data
+++ /dev/null
@@ -1,18 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]3                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method3_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[anchr]method3_params
-
-[anchr]param0_ptr
-[u4]0xFFFFFFFF  // num_bytes: Test whether a huge value will cause overflow.
-[u4]12          // num_elements
-[b]01010101
-[b]00001111
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_num_bytes_huge.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_num_bytes_huge.expected
deleted file mode 100644
index 779df88..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_num_bytes_huge.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_num_bytes_less_than_array_header.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_num_bytes_less_than_array_header.data
deleted file mode 100644
index 45021c0..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_num_bytes_less_than_array_header.data
+++ /dev/null
@@ -1,18 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]3                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method3_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[anchr]method3_params
-
-[anchr]param0_ptr
-[u4]7   // num_bytes: Less than the size of array header.
-[u4]12  // num_elements
-[b]01010101
-[b]00001111
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_num_bytes_less_than_array_header.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_num_bytes_less_than_array_header.expected
deleted file mode 100644
index 5a1ec4e..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_num_bytes_less_than_array_header.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNEXPECTED_ARRAY_HEADER
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_num_bytes_less_than_necessary_size.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_num_bytes_less_than_necessary_size.data
deleted file mode 100644
index 3d38702..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_num_bytes_less_than_necessary_size.data
+++ /dev/null
@@ -1,20 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]3                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method3_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[anchr]method3_params
-
-[anchr]param0_ptr
-[dist4]array  // num_bytes: Less than the size needed (array header + 12 boolean
-              // values).
-[u4]12        // num_elements
-[b]01010101
-[anchr]array
-[b]00001111
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_num_bytes_less_than_necessary_size.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_num_bytes_less_than_necessary_size.expected
deleted file mode 100644
index 5a1ec4e..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_num_bytes_less_than_necessary_size.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNEXPECTED_ARRAY_HEADER
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_pointer_overflow.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_pointer_overflow.data
deleted file mode 100644
index 2f9e091..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_pointer_overflow.data
+++ /dev/null
@@ -1,13 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]3                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method3_params   // num_bytes
-[u4]0                   // version
-[u8]0xFFFFFFFFFFFFFFFF  // param0: Test whether decoding the pointer causes
-                        // overflow.
-[anchr]method3_params
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_pointer_overflow.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_pointer_overflow.expected
deleted file mode 100644
index 23abb8c..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_pointer_overflow.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_ILLEGAL_POINTER
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_good.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_good.data
deleted file mode 100644
index ad26763..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_good.data
+++ /dev/null
@@ -1,19 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]3                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method3_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[anchr]method3_params
-
-[anchr]param0_ptr
-[dist4]array  // num_bytes
-[u4]12        // num_elements
-[b]01010101
-[b]00001111
-[anchr]array
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_good.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_good.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_good.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_incomplete_array.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_incomplete_array.data
deleted file mode 100644
index d773458..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_incomplete_array.data
+++ /dev/null
@@ -1,16 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]3                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method3_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[anchr]method3_params
-
-[anchr]param0_ptr
-[u4]16  // num_bytes
-[u1]0   // num_elements: Incomplete array.
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_incomplete_array.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_incomplete_array.expected
deleted file mode 100644
index 779df88..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_incomplete_array.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_incomplete_array_header.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_incomplete_array_header.data
deleted file mode 100644
index ca462a5..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_incomplete_array_header.data
+++ /dev/null
@@ -1,15 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]3                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method3_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[anchr]method3_params
-
-[anchr]param0_ptr
-[u4]16  // num_bytes: Incomplete array header.
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_incomplete_array_header.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_incomplete_array_header.expected
deleted file mode 100644
index 779df88..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_incomplete_array_header.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_misaligned_array.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_misaligned_array.data
deleted file mode 100644
index 5adfbba..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_misaligned_array.data
+++ /dev/null
@@ -1,21 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]3                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method3_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[anchr]method3_params
-
-[u2]0  // Causes the following array to be misaligned.
-
-[anchr]param0_ptr
-[dist4]array  // num_bytes
-[u4]12        // num_elements
-[b]01010101
-[b]00001111
-[anchr]array
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_misaligned_array.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_misaligned_array.expected
deleted file mode 100644
index acca999..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_misaligned_array.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_MISALIGNED_OBJECT
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_unexpected_null_array.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_unexpected_null_array.data
deleted file mode 100644
index 0f96c4b..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_unexpected_null_array.data
+++ /dev/null
@@ -1,12 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]3                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method3_params  // num_bytes
-[u4]0                  // version
-[u8]0                  // param0: An unexpected null pointer.
-[anchr]method3_params
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_unexpected_null_array.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_unexpected_null_array.expected
deleted file mode 100644
index 95d8db0..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_unexpected_null_array.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNEXPECTED_NULL_POINTER
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_good.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_good.data
deleted file mode 100644
index 84943d2..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_good.data
+++ /dev/null
@@ -1,34 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]4                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method4_params  // num_bytes: Larger than what we know is okay.
-[u4]3                  // version: Larger than what we know is okay.
-[dist8]param0_ptr      // param0
-[dist8]param1_ptr      // param1
-[u8]0                  // unknown
-[anchr]method4_params
-
-[anchr]param0_ptr
-[dist4]struct_c   // num_bytes
-[u4]0             // version
-[dist8]array_ptr  // array
-[anchr]struct_c
-
-[anchr]array_ptr
-[dist4]array_member  // num_bytes
-[u4]3                // num_elements
-0 1 2
-[anchr]array_member
-
-[u4]0 [u1]0  // Padding to make the next array aligned properly.
-
-[anchr]param1_ptr
-[dist4]array_param  // num_bytes
-[u4]10              // num_elements
-0 1 2 3 4 5 6 7 8 9
-[anchr]array_param
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_good.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_good.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_good.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_multiple_pointers_to_same_array.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_multiple_pointers_to_same_array.data
deleted file mode 100644
index 2f84185..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_multiple_pointers_to_same_array.data
+++ /dev/null
@@ -1,26 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]4                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method4_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[dist8]param1_ptr      // param1
-[anchr]method4_params
-
-[anchr]param0_ptr
-[dist4]struct_c   // num_bytes
-[u4]0             // version
-[dist8]array_ptr  // array
-[anchr]struct_c
-
-[anchr]param1_ptr
-[anchr]array_ptr
-[dist4]array_member  // num_bytes
-[u4]3                // num_elements
-0 1 2
-[anchr]array_member
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_multiple_pointers_to_same_array.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_multiple_pointers_to_same_array.expected
deleted file mode 100644
index 779df88..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_multiple_pointers_to_same_array.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_overlapped_objects.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_overlapped_objects.data
deleted file mode 100644
index d863e64..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_overlapped_objects.data
+++ /dev/null
@@ -1,32 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]4                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method4_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[dist8]param1_ptr      // param1
-[anchr]method4_params
-
-[anchr]param0_ptr
-[dist4]struct_c   // num_bytes
-[u4]0             // version
-[dist8]array_ptr  // array
-[anchr]struct_c
-
-[anchr]array_ptr
-[dist4]array_member  // num_bytes
-[u4]3                // num_elements
-
-[anchr]param1_ptr
-// The first three bytes of |num_bytes| are also the elements of the previous
-// array.
-[dist4]array_param  // num_bytes
-[u4]10              // num_elements
-0 1 2 3 4 5 6 7 8 9
-[anchr]array_param
-[anchr]array_member
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_overlapped_objects.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_overlapped_objects.expected
deleted file mode 100644
index 779df88..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_overlapped_objects.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_wrong_layout_order.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_wrong_layout_order.data
deleted file mode 100644
index b61423a..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_wrong_layout_order.data
+++ /dev/null
@@ -1,35 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]4                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method4_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[dist8]param1_ptr      // param1
-[anchr]method4_params
-
-[anchr]param0_ptr
-[dist4]struct_c   // num_bytes
-[u4]0             // version
-[dist8]array_ptr  // array
-[anchr]struct_c
-
-// The following two arrays are arranged in wrong order.
-
-[anchr]param1_ptr
-[dist4]array_param  // num_bytes
-[u4]10              // num_elements
-0 1 2 3 4 5 6 7 8 9
-[anchr]array_param
-
-[u4]0 [u2]0  // Padding to make the next array aligned properly.
-
-[anchr]array_ptr
-[dist4]array_member  // num_bytes
-[u4]3                // num_elements
-0 1 2
-[anchr]array_member
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_wrong_layout_order.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_wrong_layout_order.expected
deleted file mode 100644
index 779df88..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_wrong_layout_order.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_good.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_good.data
deleted file mode 100644
index dcec895..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_good.data
+++ /dev/null
@@ -1,37 +0,0 @@
-[handles]10  // Larger than the number of handles that we know about is okay.
-
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]5                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method5_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[u4]4                  // param1
-[u4]0                  // padding
-[anchr]method5_params
-
-[anchr]param0_ptr
-[dist4]struct_e      // num_bytes
-[u4]0                // version
-[dist8]struct_d_ptr  // struct_d
-[u4]3                // data_pipe_consumer
-[u4]0                // padding
-[anchr]struct_e
-
-[anchr]struct_d_ptr
-[dist4]struct_d           // num_bytes
-[u4]0                     // version
-[dist8]message_pipes_ptr  // message_pipes
-[anchr]struct_d
-
-[anchr]message_pipes_ptr
-[dist4]message_pipe_array  // num_bytes
-[u4]2                      // num_elements
-[u4]0
-[u4]1
-[anchr]message_pipe_array
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_good.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_good.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_good.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_handle_out_of_range.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_handle_out_of_range.data
deleted file mode 100644
index d4a82ed..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_handle_out_of_range.data
+++ /dev/null
@@ -1,38 +0,0 @@
-[handles]10
-
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]5                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method5_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[u4]10                 // param1: It is outside of the valid encoded handle
-                       // range [0, 10).
-[u4]0                  // padding
-[anchr]method5_params
-
-[anchr]param0_ptr
-[dist4]struct_e      // num_bytes
-[u4]0                // version
-[dist8]struct_d_ptr  // struct_d
-[u4]3                // data_pipe_consumer
-[u4]0                // padding
-[anchr]struct_e
-
-[anchr]struct_d_ptr
-[dist4]struct_d           // num_bytes
-[u4]0                     // version
-[dist8]message_pipes_ptr  // message_pipes
-[anchr]struct_d
-
-[anchr]message_pipes_ptr
-[dist4]message_pipe_array  // num_bytes
-[u4]2                      // num_elements
-[u4]0
-[u4]1
-[anchr]message_pipe_array
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_handle_out_of_range.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_handle_out_of_range.expected
deleted file mode 100644
index eef8e38..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_handle_out_of_range.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_ILLEGAL_HANDLE
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_multiple_handles_with_same_value_1.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_multiple_handles_with_same_value_1.data
deleted file mode 100644
index 9ee7a48..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_multiple_handles_with_same_value_1.data
+++ /dev/null
@@ -1,37 +0,0 @@
-[handles]10
-
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]5                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method5_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[u4]4                  // param1
-[u4]0                  // padding
-[anchr]method5_params
-
-[anchr]param0_ptr
-[dist4]struct_e      // num_bytes
-[u4]0                // version
-[dist8]struct_d_ptr  // struct_d
-[u4]4                // data_pipe_consumer: The same value as |param1| above.
-[u4]0                // padding
-[anchr]struct_e
-
-[anchr]struct_d_ptr
-[dist4]struct_d           // num_bytes
-[u4]0                     // version
-[dist8]message_pipes_ptr  // message_pipes
-[anchr]struct_d
-
-[anchr]message_pipes_ptr
-[dist4]message_pipe_array  // num_bytes
-[u4]2                      // num_elements
-[u4]0
-[u4]1
-[anchr]message_pipe_array
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_multiple_handles_with_same_value_1.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_multiple_handles_with_same_value_1.expected
deleted file mode 100644
index eef8e38..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_multiple_handles_with_same_value_1.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_ILLEGAL_HANDLE
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_multiple_handles_with_same_value_2.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_multiple_handles_with_same_value_2.data
deleted file mode 100644
index cb01cae..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_multiple_handles_with_same_value_2.data
+++ /dev/null
@@ -1,37 +0,0 @@
-[handles]10
-
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]5                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method5_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[u4]4                  // param1
-[u4]0                  // padding
-[anchr]method5_params
-
-[anchr]param0_ptr
-[dist4]struct_e      // num_bytes
-[u4]0                // version
-[dist8]struct_d_ptr  // struct_d
-[u4]3                // data_pipe_consumer
-[u4]0                // padding
-[anchr]struct_e
-
-[anchr]struct_d_ptr
-[dist4]struct_d           // num_bytes
-[u4]0                     // version
-[dist8]message_pipes_ptr  // message_pipes
-[anchr]struct_d
-
-[anchr]message_pipes_ptr
-[dist4]message_pipe_array  // num_bytes
-[u4]2                      // num_elements
-[u4]1                      // The two message pipe handles have the same value.
-[u4]1
-[anchr]message_pipe_array
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_multiple_handles_with_same_value_2.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_multiple_handles_with_same_value_2.expected
deleted file mode 100644
index eef8e38..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_multiple_handles_with_same_value_2.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_ILLEGAL_HANDLE
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_unexpected_invalid_handle.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_unexpected_invalid_handle.data
deleted file mode 100644
index b06ae0a..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_unexpected_invalid_handle.data
+++ /dev/null
@@ -1,36 +0,0 @@
-[handles]5
-
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]5                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method5_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[u4]4                  // param1
-[u4]0                  // padding
-[anchr]method5_params
-
-[anchr]param0_ptr
-[dist4]struct_e      // num_bytes
-[u4]0                // version
-[dist8]struct_d_ptr  // struct_d
-[s4]-1               // data_pipe_consumer: An unexpected invalid handle.
-[u4]0                // padding
-[anchr]struct_e
-
-[anchr]struct_d_ptr
-[dist4]struct_d           // num_bytes
-[u4]0                     // version
-[dist8]message_pipes_ptr  // message_pipes
-[anchr]struct_d
-
-[anchr]message_pipes_ptr
-[dist4]message_pipe_array  // num_bytes
-[u4]1                      // num_elements
-[u4]2
-[anchr]message_pipe_array
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_unexpected_invalid_handle.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_unexpected_invalid_handle.expected
deleted file mode 100644
index 6768236..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_unexpected_invalid_handle.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNEXPECTED_INVALID_HANDLE
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_wrong_handle_order.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_wrong_handle_order.data
deleted file mode 100644
index f641de0..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_wrong_handle_order.data
+++ /dev/null
@@ -1,38 +0,0 @@
-[handles]10
-
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]5                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method5_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[u4]9                  // param1
-[u4]0                  // padding
-[anchr]method5_params
-
-[anchr]param0_ptr
-[dist4]struct_e      // num_bytes
-[u4]0                // version
-[dist8]struct_d_ptr  // struct_d
-[u4]1                // data_pipe_consumer: It is smaller than those handles
-                     // in |message_pipe_array|, which is wrong.
-[u4]0                // padding
-[anchr]struct_e
-
-[anchr]struct_d_ptr
-[dist4]struct_d           // num_bytes
-[u4]0                     // version
-[dist8]message_pipes_ptr  // message_pipes
-[anchr]struct_d
-
-[anchr]message_pipes_ptr
-[dist4]message_pipe_array  // num_bytes
-[u4]2                      // num_elements
-[u4]3
-[u4]4
-[anchr]message_pipe_array
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_wrong_handle_order.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_wrong_handle_order.expected
deleted file mode 100644
index eef8e38..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_wrong_handle_order.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_ILLEGAL_HANDLE
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd6_good.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd6_good.data
deleted file mode 100644
index fb3f862..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd6_good.data
+++ /dev/null
@@ -1,24 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]6                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method6_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[anchr]method6_params
-
-[anchr]param0_ptr
-[dist4]array_param  // num_bytes
-[u4]1               // num_elements
-[dist8]element_ptr
-[anchr]array_param
-
-[anchr]element_ptr
-[dist4]array_element  // num_bytes
-[u4]10                // num_elements
-0 1 2 3 4 5 6 7 8 9
-[anchr]array_element
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd6_good.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd6_good.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd6_good.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd6_nested_array_num_bytes_less_than_necessary_size.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd6_nested_array_num_bytes_less_than_necessary_size.data
deleted file mode 100644
index c8cacf0..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd6_nested_array_num_bytes_less_than_necessary_size.data
+++ /dev/null
@@ -1,24 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]6                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method6_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[anchr]method6_params
-
-[anchr]param0_ptr
-[dist4]array_param  // num_bytes
-[u4]1               // num_elements
-[dist8]element_ptr
-[anchr]array_param
-
-[anchr]element_ptr
-[dist4]array_element  // num_bytes: It is insufficient to store 12 elements.
-[u4]12                // num_elements
-0 1 2 3 4 5 6 7 8 9
-[anchr]array_element
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd6_nested_array_num_bytes_less_than_necessary_size.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd6_nested_array_num_bytes_less_than_necessary_size.expected
deleted file mode 100644
index 5a1ec4e..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd6_nested_array_num_bytes_less_than_necessary_size.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNEXPECTED_ARRAY_HEADER
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_good.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_good.data
deleted file mode 100644
index c972676..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_good.data
+++ /dev/null
@@ -1,40 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]7                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method7_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[dist8]param1_ptr      // param1
-[anchr]method7_params
-
-[anchr]param0_ptr
-[dist4]struct_f        // num_bytes
-[u4]0                  // version
-[dist8]array_ptr       // fixed_size_array
-[anchr]struct_f
-
-[anchr]array_ptr
-[dist4]array_member    // num_bytes
-[u4]3                  // num_elements
-0 1 2
-[anchr]array_member
-
-[u4]0 [u1]0            // Padding to make the next array aligned properly.
-
-[anchr]param1_ptr
-[dist4]array_param     // num_bytes
-[u4]2                  // num_elements
-[u8]0                  // A null pointer, which is okay.
-[dist8]array_element_ptr
-[anchr]array_param
-
-[anchr]array_element_ptr
-[dist4]array_element   // num_bytes
-[u4]3                  // num_elements
-0 1 2
-[anchr]array_element
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_good.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_good.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_good.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_unexpected_null_fixed_array.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_unexpected_null_fixed_array.data
deleted file mode 100644
index 4d25cf2..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_unexpected_null_fixed_array.data
+++ /dev/null
@@ -1,26 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]7                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method7_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[dist8]param1_ptr      // param1
-[anchr]method7_params
-
-[anchr]param0_ptr
-[dist4]struct_f        // num_bytes
-[u4]0                  // version
-[u8]0                  // fixed_size_array: An unexpected null pointer.
-[anchr]struct_f
-
-[anchr]param1_ptr
-[dist4]array_param     // num_bytes
-[u4]2                  // num_elements
-[u8]0                  // A null pointer, which is okay.
-[u8]0                  // A null pointer, which is okay.
-[anchr]array_param
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_unexpected_null_fixed_array.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_unexpected_null_fixed_array.expected
deleted file mode 100644
index 95d8db0..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_unexpected_null_fixed_array.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNEXPECTED_NULL_POINTER
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_unmatched_array_elements.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_unmatched_array_elements.data
deleted file mode 100644
index cee6e14..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_unmatched_array_elements.data
+++ /dev/null
@@ -1,34 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]7                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method7_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[dist8]param1_ptr      // param1
-[anchr]method7_params
-
-[anchr]param0_ptr
-[dist4]struct_f        // num_bytes
-[u4]0                  // version
-[dist8]array_ptr       // fixed_size_array
-[anchr]struct_f
-
-[anchr]array_ptr
-[dist4]array_member    // num_bytes
-[u4]2                  // num_elements: Too few elements.
-0 1
-[anchr]array_member
-
-[u4]0 [u1]0 [u1]0      // Padding for alignment of next array.
-
-[anchr]param1_ptr
-[dist4]array_param     // num_bytes
-[u4]2                  // num_elements
-[u8]0                  // A null pointer, which is okay.
-[u8]0                  // A null pointer, which is okay.
-[anchr]array_param
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_unmatched_array_elements.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_unmatched_array_elements.expected
deleted file mode 100644
index 5a1ec4e..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_unmatched_array_elements.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNEXPECTED_ARRAY_HEADER
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_unmatched_array_elements_nested.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_unmatched_array_elements_nested.data
deleted file mode 100644
index 3095a73..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_unmatched_array_elements_nested.data
+++ /dev/null
@@ -1,40 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]7                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method7_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[dist8]param1_ptr      // param1
-[anchr]method7_params
-
-[anchr]param0_ptr
-[dist4]struct_f        // num_bytes
-[u4]0                  // version
-[dist8]array_ptr       // fixed_size_array
-[anchr]struct_f
-
-[anchr]array_ptr
-[dist4]array_member    // num_bytes
-[u4]3                  // num_elements
-0 1 3
-[anchr]array_member
-
-[u4]0 [u1]0            // Padding for alignment of next array.
-
-[anchr]param1_ptr
-[dist4]array_param     // num_bytes
-[u4]2                  // num_elements
-[dist8]array_element_ptr
-[u8]0                  // A null pointer, which is okay.
-[anchr]array_param
-
-[anchr]array_element_ptr
-[dist4]array_element   // num_bytes
-[u4]4                  // num_elements: Too many elements.
-0 1 2 3
-[anchr]array_element
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_unmatched_array_elements_nested.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_unmatched_array_elements_nested.expected
deleted file mode 100644
index 5a1ec4e..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_unmatched_array_elements_nested.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNEXPECTED_ARRAY_HEADER
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_array_num_bytes_overflow.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_array_num_bytes_overflow.data
deleted file mode 100644
index b19e141..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_array_num_bytes_overflow.data
+++ /dev/null
@@ -1,21 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]8                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method8_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[anchr]method8_params
-
-[anchr]param0_ptr
-[dist4]array_param  // num_bytes
-[u4]0x20000001      // num_elements: The corresponding array size should be
-                    // 0x20000001 * 8 + 8 = 0x100000010 which is
-                    // 2^32 + 16 (base-10), while |num_bytes| is a 32-bit
-                    // unsigned integer and its value is 16.
-[u8]0
-[anchr]array_param
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_array_num_bytes_overflow.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_array_num_bytes_overflow.expected
deleted file mode 100644
index 5a1ec4e..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_array_num_bytes_overflow.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNEXPECTED_ARRAY_HEADER
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_good.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_good.data
deleted file mode 100644
index 08c4bc3..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_good.data
+++ /dev/null
@@ -1,32 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]8                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method8_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[anchr]method8_params
-
-[anchr]param0_ptr
-[dist4]array_param       // num_bytes
-[u4]3                    // num_elements
-[u8]0                    // A null pointer, which is okay.
-[dist8]nested_array_ptr
-[u8]0                    // A null pointer, which is okay.
-[anchr]array_param
-
-[anchr]nested_array_ptr
-[dist4]nested_array  // num_bytes
-[u4]1                // num_elements
-[dist8]string_ptr
-[anchr]nested_array
-
-[anchr]string_ptr
-[dist4]string  // num_bytes
-[u4]5          // num_elements
-0 1 2 3 4
-[anchr]string
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_good.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_good.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_good.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_unexpected_null_array.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_unexpected_null_array.data
deleted file mode 100644
index 03f2a10..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_unexpected_null_array.data
+++ /dev/null
@@ -1,12 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]8                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method8_params  // num_bytes
-[u4]0                  // version
-[u8]0                  // param0: An unexpected null pointer.
-[anchr]method8_params
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_unexpected_null_array.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_unexpected_null_array.expected
deleted file mode 100644
index 95d8db0..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_unexpected_null_array.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNEXPECTED_NULL_POINTER
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_unexpected_null_string.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_unexpected_null_string.data
deleted file mode 100644
index b1b4462..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_unexpected_null_string.data
+++ /dev/null
@@ -1,33 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]8                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method8_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[anchr]method8_params
-
-[anchr]param0_ptr
-[dist4]array_param       // num_bytes
-[u4]3                    // num_elements
-[u8]0                    // A null pointer, which is okay.
-[dist8]nested_array_ptr
-[u8]0                    // A null pointer, which is okay.
-[anchr]array_param
-
-[anchr]nested_array_ptr
-[dist4]nested_array  // num_bytes
-[u4]2                // num_elements
-[dist8]string_ptr
-[u8]0                // An unexpected null pointer.
-[anchr]nested_array
-
-[anchr]string_ptr
-[dist4]string  // num_bytes
-[u4]5          // num_elements
-0 1 2 3 4
-[anchr]string
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_unexpected_null_string.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_unexpected_null_string.expected
deleted file mode 100644
index 95d8db0..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_unexpected_null_string.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNEXPECTED_NULL_POINTER
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd9_good.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd9_good.data
deleted file mode 100644
index 6ed0009..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd9_good.data
+++ /dev/null
@@ -1,36 +0,0 @@
-[handles]4
-
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]9                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method9_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[anchr]method9_params
-
-[anchr]param0_ptr
-[dist4]array_param         // num_bytes
-[u4]2                      // num_elements
-[dist8]nested_array_ptr_0
-[dist8]nested_array_ptr_1
-[anchr]array_param
-
-[anchr]nested_array_ptr_0
-[dist4]nested_array_0  // num_bytes
-[u4]2                  // num_elements
-[u4]0
-[s4]-1                 // An invalid handle, which is okay.
-[anchr]nested_array_0
-
-[anchr]nested_array_ptr_1
-[dist4]nested_array_1  // num_bytes
-[u4]3                  // num_elements
-[u4]2
-[s4]-1                 // An invalid handle, which is okay.
-[u4]3
-[anchr]nested_array_1
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd9_good.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd9_good.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd9_good.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd9_good_null_array.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd9_good_null_array.data
deleted file mode 100644
index 90feced..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd9_good_null_array.data
+++ /dev/null
@@ -1,14 +0,0 @@
-[handles]4
-
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]9                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method9_params  // num_bytes
-[u4]0                  // version
-[u8]0                  // param0: A null pointer, which is okay.
-[anchr]method9_params
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd9_good_null_array.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd9_good_null_array.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd9_good_null_array.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd9_unexpected_null_array.data b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd9_unexpected_null_array.data
deleted file mode 100644
index e87fbcb..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd9_unexpected_null_array.data
+++ /dev/null
@@ -1,27 +0,0 @@
-[handles]4
-
-[dist4]message_header  // num_bytes
-[u4]0                  // version
-[u4]0                  // interface ID
-[u4]9                  // name
-[u4]0                  // flags
-[u4]0                  // padding
-[anchr]message_header
-
-[dist4]method9_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[anchr]method9_params
-
-[anchr]param0_ptr
-[dist4]array_param         // num_bytes
-[u4]2                      // num_elements
-[dist8]nested_array_ptr_0
-[u8]0                      // An unexpected null pointer.
-[anchr]array_param
-
-[anchr]nested_array_ptr_0
-[dist4]nested_array_0  // num_bytes
-[u4]1                  // num_elements
-[u4]0
-[anchr]nested_array_0
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd9_unexpected_null_array.expected b/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd9_unexpected_null_array.expected
deleted file mode 100644
index 95d8db0..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd9_unexpected_null_array.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNEXPECTED_NULL_POINTER
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_resp_mthd0_good.data b/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_resp_mthd0_good.data
deleted file mode 100644
index 7da356f..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_resp_mthd0_good.data
+++ /dev/null
@@ -1,19 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]1                  // version
-[u4]0                  // interface ID
-[u4]0                  // name
-[u4]2                  // flags kMessageIsResponse
-[u4]0                  // padding
-[u8]1                  // request_id
-[anchr]message_header
-
-[dist4]method0_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[anchr]method0_params
-
-[anchr]param0_ptr
-[dist4]uint8_array  // num_bytes
-[u4]1               // num_elements
-[u1]0
-[anchr]uint8_array
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_resp_mthd0_good.expected b/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_resp_mthd0_good.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_resp_mthd0_good.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_resp_mthd0_unexpected_array_header.data b/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_resp_mthd0_unexpected_array_header.data
deleted file mode 100644
index bdcfc46..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_resp_mthd0_unexpected_array_header.data
+++ /dev/null
@@ -1,19 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]1                  // version
-[u4]0                  // interface ID
-[u4]0                  // name
-[u4]2                  // flags kMessageIsResponse
-[u4]0                  // padding
-[u8]1                  // request_id
-[anchr]message_header
-
-[dist4]method0_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[anchr]method0_params
-
-[anchr]param0_ptr
-[dist4]uint8_array  // num_bytes
-[u4]2               // num_elements: The size is too small to hold 2 elements.
-[u1]0
-[anchr]uint8_array
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_resp_mthd0_unexpected_array_header.expected b/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_resp_mthd0_unexpected_array_header.expected
deleted file mode 100644
index 5a1ec4e..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_resp_mthd0_unexpected_array_header.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNEXPECTED_ARRAY_HEADER
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_rqst_mthd0_good.data b/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_rqst_mthd0_good.data
deleted file mode 100644
index a1fe69d..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_rqst_mthd0_good.data
+++ /dev/null
@@ -1,20 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]1                  // version
-[u4]0                  // interface ID
-[u4]0                  // name
-[u4]1                  // flags kMessageExpectsResponse
-[u4]0                  // padding
-[u8]7                  // request_id
-[anchr]message_header
-
-[dist4]method0_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[anchr]method0_params
-
-[anchr]param0_ptr
-[dist4]basic_struct  // num_bytes
-[u4]0                // version
-[s4]-1               // a
-[u4]0                // padding
-[anchr]basic_struct
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_rqst_mthd0_good.expected b/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_rqst_mthd0_good.expected
deleted file mode 100644
index 7ef22e9..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_rqst_mthd0_good.expected
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_rqst_mthd0_unexpected_struct_header.data b/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_rqst_mthd0_unexpected_struct_header.data
deleted file mode 100644
index e689adb..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_rqst_mthd0_unexpected_struct_header.data
+++ /dev/null
@@ -1,17 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]1                  // version
-[u4]0                  // interface ID
-[u4]0                  // name
-[u4]1                  // flags kMessageExpectsResponse
-[u4]0                  // padding
-[u8]7                  // request_id
-[anchr]message_header
-
-[dist4]method0_params  // num_bytes
-[u4]0                  // version
-[dist8]param0_ptr      // param0
-[anchr]method0_params
-
-[anchr]param0_ptr
-[u4]0  // num_bytes: The struct size is too small.
-[u4]0  // version
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_rqst_mthd0_unexpected_struct_header.expected b/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_rqst_mthd0_unexpected_struct_header.expected
deleted file mode 100644
index 25aceee..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_rqst_mthd0_unexpected_struct_header.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_UNEXPECTED_STRUCT_HEADER
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/integration_msghdr_invalid_flags.data b/mojo/public/interfaces/bindings/tests/data/validation/integration_msghdr_invalid_flags.data
deleted file mode 100644
index 7198afa..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/integration_msghdr_invalid_flags.data
+++ /dev/null
@@ -1,8 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]1                  // version
-[u4]0                  // interface ID
-[u4]0xffffffff         // name
-[u4]3                  // flags: This combination is illegal.
-[u4]0                  // padding
-[u8]1                  // request_id
-[anchr]message_header
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/integration_msghdr_invalid_flags.expected b/mojo/public/interfaces/bindings/tests/data/validation/integration_msghdr_invalid_flags.expected
deleted file mode 100644
index c33fde3..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/integration_msghdr_invalid_flags.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_MESSAGE_HEADER_INVALID_FLAGS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/resp_boundscheck_msghdr_no_such_method.data b/mojo/public/interfaces/bindings/tests/data/validation/resp_boundscheck_msghdr_no_such_method.data
deleted file mode 100644
index 7283509..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/resp_boundscheck_msghdr_no_such_method.data
+++ /dev/null
@@ -1,8 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]1                  // version
-[u4]0                  // interface ID
-[u4]1                  // name: Method1 does not have a response message.
-[u4]2                  // flags: kMessageIsResponse
-[u4]0                  // padding
-[u8]1                  // request_id
-[anchr]message_header
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/resp_boundscheck_msghdr_no_such_method.expected b/mojo/public/interfaces/bindings/tests/data/validation/resp_boundscheck_msghdr_no_such_method.expected
deleted file mode 100644
index 65a48b3..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/resp_boundscheck_msghdr_no_such_method.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_MESSAGE_HEADER_UNKNOWN_METHOD
\ No newline at end of file
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/resp_conformance_msghdr_invalid_response_flags1.data b/mojo/public/interfaces/bindings/tests/data/validation/resp_conformance_msghdr_invalid_response_flags1.data
deleted file mode 100644
index d1d8d3f..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/resp_conformance_msghdr_invalid_response_flags1.data
+++ /dev/null
@@ -1,8 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]1                  // version
-[u4]0                  // interface ID
-[u4]12                 // name
-[u4]0                  // flags: kMessageIsResponse is not set in a response.
-[u4]0                  // padding
-[u8]1                  // request_id
-[anchr]message_header
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/resp_conformance_msghdr_invalid_response_flags1.expected b/mojo/public/interfaces/bindings/tests/data/validation/resp_conformance_msghdr_invalid_response_flags1.expected
deleted file mode 100644
index c33fde3..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/resp_conformance_msghdr_invalid_response_flags1.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_MESSAGE_HEADER_INVALID_FLAGS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/resp_conformance_msghdr_invalid_response_flags2.data b/mojo/public/interfaces/bindings/tests/data/validation/resp_conformance_msghdr_invalid_response_flags2.data
deleted file mode 100644
index 091b68c..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/resp_conformance_msghdr_invalid_response_flags2.data
+++ /dev/null
@@ -1,8 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]1                  // version
-[u4]0                  // interface ID
-[u4]12                 // name
-[u4]1                  // flags: kMessageExpectsResponse is set in a response.
-[u4]0                  // padding
-[u8]1                  // request_id
-[anchr]message_header
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/resp_conformance_msghdr_invalid_response_flags2.expected b/mojo/public/interfaces/bindings/tests/data/validation/resp_conformance_msghdr_invalid_response_flags2.expected
deleted file mode 100644
index c33fde3..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/resp_conformance_msghdr_invalid_response_flags2.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_MESSAGE_HEADER_INVALID_FLAGS
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/resp_conformance_msghdr_no_such_method.data b/mojo/public/interfaces/bindings/tests/data/validation/resp_conformance_msghdr_no_such_method.data
deleted file mode 100644
index 0eda287..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/resp_conformance_msghdr_no_such_method.data
+++ /dev/null
@@ -1,8 +0,0 @@
-[dist4]message_header  // num_bytes
-[u4]1                  // version
-[u4]0                  // interface ID
-[u4]11                 // name: Method11 does not have a response message.
-[u4]2                  // flags: kMessageIsResponse
-[u4]0                  // padding
-[u8]1                  // request_id
-[anchr]message_header
diff --git a/mojo/public/interfaces/bindings/tests/data/validation/resp_conformance_msghdr_no_such_method.expected b/mojo/public/interfaces/bindings/tests/data/validation/resp_conformance_msghdr_no_such_method.expected
deleted file mode 100644
index 65a48b3..0000000
--- a/mojo/public/interfaces/bindings/tests/data/validation/resp_conformance_msghdr_no_such_method.expected
+++ /dev/null
@@ -1 +0,0 @@
-VALIDATION_ERROR_MESSAGE_HEADER_UNKNOWN_METHOD
\ No newline at end of file
diff --git a/mojo/public/interfaces/bindings/tests/echo.mojom b/mojo/public/interfaces/bindings/tests/echo.mojom
deleted file mode 100644
index 56c6063..0000000
--- a/mojo/public/interfaces/bindings/tests/echo.mojom
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module test.echo.mojom;
-
-import "echo_import.mojom";
-
-interface Echo {
-  EchoPoint(test.echo_import.mojom.Point point)
-      => (test.echo_import.mojom.Point result);
-};
diff --git a/mojo/public/interfaces/bindings/tests/echo_import.mojom b/mojo/public/interfaces/bindings/tests/echo_import.mojom
deleted file mode 100644
index a024ce2..0000000
--- a/mojo/public/interfaces/bindings/tests/echo_import.mojom
+++ /dev/null
@@ -1,10 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module test.echo_import.mojom;
-
-struct Point {
-  int32 x;
-  int32 y;
-};
diff --git a/mojo/public/interfaces/bindings/tests/math_calculator.mojom b/mojo/public/interfaces/bindings/tests/math_calculator.mojom
deleted file mode 100644
index 7d1b171..0000000
--- a/mojo/public/interfaces/bindings/tests/math_calculator.mojom
+++ /dev/null
@@ -1,12 +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.
-
-[JavaPackage="org.chromium.mojo.bindings.test.mojom.math"]
-module math;
-
-interface Calculator {
-  Clear@0() => (double value@0);
-  Add@1(double value@0) => (double value@0);
-  Multiply@2(double value@0) => (double value@0);
-};
diff --git a/mojo/public/interfaces/bindings/tests/no_module.mojom b/mojo/public/interfaces/bindings/tests/no_module.mojom
deleted file mode 100644
index f380011..0000000
--- a/mojo/public/interfaces/bindings/tests/no_module.mojom
+++ /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.
-
-// Entities without module
-
-enum EnumWithoutModule {
-  A
-};
diff --git a/mojo/public/interfaces/bindings/tests/ping_service.mojom b/mojo/public/interfaces/bindings/tests/ping_service.mojom
deleted file mode 100644
index ba6ad3d..0000000
--- a/mojo/public/interfaces/bindings/tests/ping_service.mojom
+++ /dev/null
@@ -1,14 +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.
-
-[JavaPackage="org.chromium.mojo.bindings.test.mojom.ping"]
-module mojo.test;
-
-interface PingService {
-  Ping() => ();
-};
-
-interface EchoService {
-  Echo(string test_data) => (string echo_data);
-};
diff --git a/mojo/public/interfaces/bindings/tests/rect.mojom b/mojo/public/interfaces/bindings/tests/rect.mojom
deleted file mode 100644
index 4ecc4d9..0000000
--- a/mojo/public/interfaces/bindings/tests/rect.mojom
+++ /dev/null
@@ -1,31 +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.
-
-[JavaPackage="org.chromium.mojo.bindings.test.mojom.test_structs"]
-module mojo.test;
-
-struct Rect {
-  int32 x;
-  int32 y;
-  int32 width;
-  int32 height;
-};
-
-// A copy of Rect that is typemapped differently in the chromium and blink
-// variants.
-struct TypemappedRect {
-  int32 x;
-  int32 y;
-  int32 width;
-  int32 height;
-};
-
-// A copy of Rect that is typemapped to the same custom type in the chromium and
-// blink variants.
-struct SharedTypemappedRect {
-  int32 x;
-  int32 y;
-  int32 width;
-  int32 height;
-};
\ No newline at end of file
diff --git a/mojo/public/interfaces/bindings/tests/regression_tests.mojom b/mojo/public/interfaces/bindings/tests/regression_tests.mojom
deleted file mode 100644
index d87a3ad..0000000
--- a/mojo/public/interfaces/bindings/tests/regression_tests.mojom
+++ /dev/null
@@ -1,76 +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.
-
-// Module containing entities for regression tests of the generator. Entities
-// must never be modified, instead new entity must be added to add new tests.
-[JavaPackage="org.chromium.mojo.bindings.test.mojom.regression_tests"]
-module regression_tests;
-
-interface CheckMethodWithEmptyResponse {
-WithouParameterAndEmptyResponse() => ();
-WithParameterAndEmptyResponse(bool b) => ();
-};
-
-interface CheckNameCollision {
-WithNameCollision(bool message, bool response) => (bool message, bool response);
-};
-
-enum EnumWithReference {
-  k_STEREO_AND_KEYBOARD_MIC = 30,
-  k_MAX = k_STEREO_AND_KEYBOARD_MIC
-};
-
-enum EnumWithLowercase {
-  PlanarF16,
-  PlanarF32
-};
-
-enum EnumWithNumbers {
-  k_2_1 = 4
-};
-
-enum EnumWithK {
-  K = 0
-};
-
-struct Edge {
-  Vertex? v;
-};
-
-struct Vertex {
-  EmptyStruct? e;
-};
-
-struct EmptyStruct {
-};
-
-struct A {
-  B? b;
-};
-
-struct B {
-  A? a;
-};
-
-// Previously, a field or parameter called |handles| would be shadowed by a
-// method parameter in generated C++ bindings code.
-struct HandlesNameCollisionStruct {
-  EmptyStruct handles;
-};
-
-struct HandlesHandleNameCollisionStruct {
-  handle handles;
-};
-
-union HandlesNameCollisionUnion {
-  int32 handles;
-};
-
-struct HandlesUnionNameCollisionStruct {
-  HandlesNameCollisionUnion handles;
-};
-
-interface HandlesNameCollisionInterface {
-  Method(EmptyStruct handles) => (handle handles);
-};
diff --git a/mojo/public/interfaces/bindings/tests/sample_factory.mojom b/mojo/public/interfaces/bindings/tests/sample_factory.mojom
deleted file mode 100644
index ade3bf3..0000000
--- a/mojo/public/interfaces/bindings/tests/sample_factory.mojom
+++ /dev/null
@@ -1,41 +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.
-
-[JavaPackage="org.chromium.mojo.bindings.test.mojom.sample"]
-module sample;
-
-import "sample_import.mojom";
-
-// This sample shows how handles to MessagePipes can be sent as both parameters
-// to methods as well as fields on structs.
-
-struct Request {
-  int32 x;
-  handle<message_pipe>? pipe;
-  array<handle<message_pipe>>? more_pipes;
-
-  // Interfaces can be used as members.
-  imported.ImportedInterface? obj;
-};
-
-struct Response {
-  int32 x;
-  handle<message_pipe>? pipe;
-};
-
-interface NamedObject {
-  SetName(string name);
-  GetName() => (string name);
-};
-
-interface Factory {
-  DoStuff(Request request, handle<message_pipe>? pipe) =>
-      (Response response, string text);
-  DoStuff2(handle<data_pipe_consumer> pipe) => (string text);
-  CreateNamedObject(NamedObject& obj);
-  RequestImportedInterface(
-      imported.ImportedInterface& obj) => (imported.ImportedInterface& obj);
-  TakeImportedInterface(
-      imported.ImportedInterface obj) => (imported.ImportedInterface obj);
-};
diff --git a/mojo/public/interfaces/bindings/tests/sample_import.mojom b/mojo/public/interfaces/bindings/tests/sample_import.mojom
deleted file mode 100644
index d28cb7b..0000000
--- a/mojo/public/interfaces/bindings/tests/sample_import.mojom
+++ /dev/null
@@ -1,38 +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.
-
-[JavaPackage="org.chromium.mojo.bindings.test.mojom.imported"]
-module imported;
-
-// This sample just defines some types that are imported into
-// sample_service.mojom, to show how import works.
-
-enum Shape {
-  RECTANGLE = 1,
-  CIRCLE,
-  TRIANGLE,
-  LAST = TRIANGLE,
-};
-
-// These enum values should not interfere with those of Shape above.
-enum AnotherShape {
-  RECTANGLE = 10,
-  CIRCLE,
-  TRIANGLE,
-};
-
-enum YetAnotherShape {
-  RECTANGLE = 20,
-  CIRCLE,
-  TRIANGLE,
-};
-
-struct Point {
-  int32 x;
-  int32 y;
-};
-
-interface ImportedInterface {
-  DoSomething();
-};
diff --git a/mojo/public/interfaces/bindings/tests/sample_import2.mojom b/mojo/public/interfaces/bindings/tests/sample_import2.mojom
deleted file mode 100644
index ca4e81c..0000000
--- a/mojo/public/interfaces/bindings/tests/sample_import2.mojom
+++ /dev/null
@@ -1,28 +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.
-
-[JavaPackage="org.chromium.mojo.bindings.test.mojom.imported"]
-module imported;
-
-import "sample_import.mojom";
-
-// This sample adds more types and constants to the "imported" namespace,
-// to test a bug with importing multiple modules with the same namespace.
-
-enum Color {
-  RED,
-  BLACK,
-};
-
-struct Size {
-  int32 width;
-  int32 height;
-};
-
-struct Thing {
-  imported.Shape shape = RECTANGLE;
-  imported.Color color = Color.BLACK;
-  Point location;
-  Size size;
-};
diff --git a/mojo/public/interfaces/bindings/tests/sample_interfaces.mojom b/mojo/public/interfaces/bindings/tests/sample_interfaces.mojom
deleted file mode 100644
index 5960d75..0000000
--- a/mojo/public/interfaces/bindings/tests/sample_interfaces.mojom
+++ /dev/null
@@ -1,32 +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.
-
-[JavaPackage="org.chromium.mojo.bindings.test.mojom.sample",
- JavaConstantsClassName="InterfaceConstants",
- Foo = "hello world"]
-module sample;
-
-const uint64 kLong = 4405;
-
-enum Enum {
-  VALUE
-};
-
-interface PingTest {
-  Ping() => ();
-};
-
-interface Provider {
-  EchoString(string a) => (string a);
-  EchoStrings(string a, string b) => (string a, string b);
-  EchoMessagePipeHandle(handle<message_pipe> a) => (handle<message_pipe> a);
-  EchoEnum(Enum a) => (Enum a);
-  EchoInt(int32 a) => (int32 a);
-};
-
-interface IntegerAccessor {
-  GetInteger() => (int64 data, [MinVersion=2] Enum type);
-  [MinVersion=1]
-  SetInteger(int64 data, [MinVersion=3] Enum type);
-};
diff --git a/mojo/public/interfaces/bindings/tests/sample_service.mojom b/mojo/public/interfaces/bindings/tests/sample_service.mojom
deleted file mode 100644
index 761cb91..0000000
--- a/mojo/public/interfaces/bindings/tests/sample_service.mojom
+++ /dev/null
@@ -1,112 +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.
-
-[JavaPackage="org.chromium.mojo.bindings.test.mojom.sample"]
-module sample;
-
-import "sample_import.mojom";
-import "sample_import2.mojom";
-
-const uint8 kTwelve = 12;
-
-struct Bar {
-  enum Type {
-    VERTICAL = 1,
-    HORIZONTAL,
-    BOTH,
-    INVALID
-  };
-  uint8 alpha@0 = 0xff;
-  uint8 beta@1;
-  uint8 gamma@2;
-  Type type@3 = sample.Bar.Type.VERTICAL;
-};
-
-struct Foo {
-  const string kFooby = "Fooby";
-  string name@8 = kFooby;
-  int32 x@0;
-  int32 y@1;
-  bool a@2 = true;
-  bool b@3;
-  bool c@4;
-  Bar? bar@5;
-  array<Bar>? extra_bars@7;
-  array<uint8>? data@6;
-  handle<message_pipe>? source@9;
-  array<handle<data_pipe_consumer>>? input_streams@10;
-  array<handle<data_pipe_producer>>? output_streams@11;
-  array<array<bool>>? array_of_array_of_bools@12;
-  array<array<array<string>>>? multi_array_of_strings@13;
-  array<bool>? array_of_bools@14;
-};
-
-struct DefaultsTest {
-  int8 a0@0 = -12;
-  uint8 a1@1 = sample.kTwelve;
-  int16 a2@2 = 1234;
-  uint16 a3@3 = 34567;
-  int32 a4@4 = 123456;
-  uint32 a5@5 = 3456789012;
-  int64 a6@6 = -111111111111;
-  uint64 a7@7 = 9999999999999999999;
-  int32 a8@8 = 0x12345;
-  int32 a9@9 = -0x12345;
-  int32 a10@10 = +1234;
-  bool a11@11 = true;
-  bool a12@12 = false;
-  float a13@13 = 123.25;
-  double a14@14 = 1234567890.123;
-  double a15@15 = 1E10;
-  double a16@16 = -1.2E+20;
-  double a17@17 = +1.23E-20;
-
-  // TODO(vtl): Add tests for default vs null when those are implemented (for
-  // structs, arrays, and strings).
-  array<uint8> a18@18;
-  string a19@19;
-
-  Bar.Type a20@20 = BOTH;
-  imported.Point a21@21;
-  imported.Thing a22@22 = default;
-
-  uint64 a23@23 = 0xFFFFFFFFFFFFFFFF;
-  int64 a24@24 = 0x123456789;
-  int64 a25@25 = -0x123456789;
-
-  double a26@26 = double.INFINITY;
-  double a27@27 = double.NEGATIVE_INFINITY;
-  double a28@28 = double.NAN;
-  float a29@29 = float.INFINITY;
-  float a30@30 = float.NEGATIVE_INFINITY;
-  float a31@31 = float.NAN;
-};
-
-struct StructWithHoleV1 {
-  int32 v1 = 1;
-  int64 v2 = 2;
-};
-
-struct StructWithHoleV2 {
-  int32 v1 = 1;
-  int64 v2 = 2;
-  int32 v3 = 3;
-};
-
-interface Service {
-  enum BazOptions {
-    REGULAR = 0,
-    EXTRA
-  };
-  const uint8 kFavoriteBaz = 1;
-  Frobinate@0(Foo? foo@0, BazOptions baz@1, Port? port@2) => (int32 result@0);
-  GetPort@1(Port& port @0);
-};
-
-// This interface is referenced above where it is defined. It also refers to
-// itself from a method.
-interface Port {
-  PostMessageToPort@0(string message_text@0, Port port@1);
-};
diff --git a/mojo/public/interfaces/bindings/tests/scoping.mojom b/mojo/public/interfaces/bindings/tests/scoping.mojom
deleted file mode 100644
index 2e9edb1..0000000
--- a/mojo/public/interfaces/bindings/tests/scoping.mojom
+++ /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.
-
-module mojo.test;
-
-interface A {
-  GetB(B& b);
-};
-
-interface B {
-  GetC(C& c);
-};
-
-interface C {
-  D();
-};
diff --git a/mojo/public/interfaces/bindings/tests/serialization_test_structs.mojom b/mojo/public/interfaces/bindings/tests/serialization_test_structs.mojom
deleted file mode 100644
index 1239e16..0000000
--- a/mojo/public/interfaces/bindings/tests/serialization_test_structs.mojom
+++ /dev/null
@@ -1,36 +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.
-
-[JavaPackage="org.chromium.mojo.bindings.test.mojom.mojo"]
-module mojo.test;
-
-struct Struct1 {
-  uint8 i;
-};
-
-struct Struct2 {
-  handle hdl;
-};
-
-struct Struct3 {
-  Struct1 struct_1;
-};
-
-struct Struct4 {
-  array<Struct1> data;
-};
-
-struct Struct5 {
-  array<Struct1, 2> pair;
-};
-
-struct Struct6 {
-  string str;
-};
-
-struct StructOfNullables {
-  handle? hdl;
-  Struct1? struct_1;
-  string? str;
-};
diff --git a/mojo/public/interfaces/bindings/tests/struct_with_traits.mojom b/mojo/public/interfaces/bindings/tests/struct_with_traits.mojom
deleted file mode 100644
index b50409e..0000000
--- a/mojo/public/interfaces/bindings/tests/struct_with_traits.mojom
+++ /dev/null
@@ -1,83 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module mojo.test;
-
-// TODO(yzshen): Rename *WithTraits* types to something more readable.
-
-struct NestedStructWithTraits {
-  int32 value;
-};
-
-enum EnumWithTraits {
-  VALUE_0,
-  VALUE_1
-};
-
-struct StructWithTraits {
-  EnumWithTraits f_enum;
-  bool f_bool;
-  uint32 f_uint32;
-  uint64 f_uint64;
-  string f_string;
-  string f_string2;
-  array<string> f_string_array;
-  array<string> f_string_set;
-  NestedStructWithTraits f_struct;
-  array<NestedStructWithTraits> f_struct_array;
-  map<string, NestedStructWithTraits> f_struct_map;
-};
-
-// Test that this container can be cloned.
-struct StructWithTraitsContainer {
-  StructWithTraits f_struct;
-};
-
-// Maps to a pass-by-value trivial struct.
-struct TrivialStructWithTraits {
-  int32 value;
-};
-
-// Maps to a move-only struct.
-struct MoveOnlyStructWithTraits {
-  handle f_handle;
-};
-
-// The custom type for MoveOnlyStructWithTraits is not clonable. Test that
-// this container can compile as long as Clone() is not used.
-struct MoveOnlyStructWithTraitsContainer {
-  MoveOnlyStructWithTraits f_struct;
-};
-
-struct StructWithTraitsForUniquePtr {
-  int32 f_int32;
-};
-
-union UnionWithTraits {
-  int32 f_int32;
-  NestedStructWithTraits f_struct;
-};
-
-interface TraitsTestService {
-  EchoStructWithTraits(StructWithTraits s) => (StructWithTraits passed);
-
-  EchoTrivialStructWithTraits(TrivialStructWithTraits s) =>
-      (TrivialStructWithTraits passed);
-
-  EchoMoveOnlyStructWithTraits(MoveOnlyStructWithTraits s) =>
-      (MoveOnlyStructWithTraits passed);
-
-  EchoNullableMoveOnlyStructWithTraits(MoveOnlyStructWithTraits? s) =>
-      (MoveOnlyStructWithTraits? passed);
-
-  EchoEnumWithTraits(EnumWithTraits e) => (EnumWithTraits passed);
-
-  EchoStructWithTraitsForUniquePtr(StructWithTraitsForUniquePtr e) => (
-      StructWithTraitsForUniquePtr passed);
-
-  EchoNullableStructWithTraitsForUniquePtr(StructWithTraitsForUniquePtr? e) => (
-      StructWithTraitsForUniquePtr? passed);
-
-  EchoUnionWithTraits(UnionWithTraits u) => (UnionWithTraits passed);
-};
diff --git a/mojo/public/interfaces/bindings/tests/test_associated_interfaces.mojom b/mojo/public/interfaces/bindings/tests/test_associated_interfaces.mojom
deleted file mode 100644
index adc4e7e..0000000
--- a/mojo/public/interfaces/bindings/tests/test_associated_interfaces.mojom
+++ /dev/null
@@ -1,54 +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.
-
-module mojo.test;
-
-import "mojo/public/interfaces/bindings/tests/ping_service.mojom";
-
-interface FooInterface {};
-
-struct StructContainsAssociated {
-  associated FooInterface? foo_interface;
-  associated FooInterface& foo_request;
-  array<associated FooInterface> foo_interfaces;
-  array<associated FooInterface&> foo_requests;
-};
-
-union UnionContainsAssociated {
-  associated FooInterface foo_interface;
-  associated FooInterface& foo_request;
-  array<associated FooInterface> foo_interfaces;
-  array<associated FooInterface&> foo_requests;
-};
-
-interface InterfacePassesAssociated {
-  PassFoo(associated FooInterface foo_interface,
-          associated FooInterface& foo_request) =>
-         (associated FooInterface foo_interface,
-          associated FooInterface& foo_request);
-
-  PassStruct(StructContainsAssociated foo_struct) =>
-            (StructContainsAssociated foo_struct);
-
-  PassUnion(UnionContainsAssociated foo_union) =>
-           (UnionContainsAssociated foo_union);
-};
-
-interface IntegerSender {
-  Echo(int32 value) => (int32 value);
-  Send(int32 value);
-};
-
-interface IntegerSenderConnection {
-  GetSender(associated IntegerSender& sender);
-  AsyncGetSender() => (associated IntegerSender sender);
-};
-
-interface AssociatedPingProvider {
-  GetPing(associated PingService& request);
-};
-
-interface AssociatedPingProviderProvider {
-  GetPingProvider(associated AssociatedPingProvider& request);
-};
diff --git a/mojo/public/interfaces/bindings/tests/test_bad_messages.mojom b/mojo/public/interfaces/bindings/tests/test_bad_messages.mojom
deleted file mode 100644
index dcd5947..0000000
--- a/mojo/public/interfaces/bindings/tests/test_bad_messages.mojom
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module mojo.test;
-
-interface TestBadMessages {
-  RejectEventually() => ();
-  RequestResponse() => ();
-
-  [Sync] RejectSync() => ();
-  [Sync] RequestResponseSync() => ();
-};
diff --git a/mojo/public/interfaces/bindings/tests/test_constants.mojom b/mojo/public/interfaces/bindings/tests/test_constants.mojom
deleted file mode 100644
index 272e603..0000000
--- a/mojo/public/interfaces/bindings/tests/test_constants.mojom
+++ /dev/null
@@ -1,57 +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.
-
-[JavaPackage="org.chromium.mojo.bindings.test.mojom.test_constants"]
-module mojo.test;
-
-// Integral types.
-const bool kBoolValue = true;
-
-const int8 kInt8Value = -2;
-
-// In the range of (MAX_INT8, MAX_UINT8].
-const uint8 kUint8Value = 128;
-
-// In the range of [MIN_INT16, MIN_INT8).
-const int16 kInt16Value = -233;
-
-// In the range of (MAX_INT16, MAX_UINT16].
-const uint16 kUint16Value = 44204;
-
-// In the range of [MIN_INT32, MIN_INT16).
-const int32 kInt32Value = -44204;
-
-// In the range of (MAX_INT32, MAX_UINT32].
-const uint32 kUint32Value = 4294967295;
-
-// In the range of [MIN_INT64, MIN_INT32).
-const int64 kInt64Value = -9223372036854775807;
-
-// In the range of (MAX_INT64, MAX_UINT64].
-const uint64 kUint64Value = 9999999999999999999;
-
-// Floating point types.
-const double kDoubleValue = 3.14159;
-const double kDoubleInfinity = double.INFINITY;
-const double kDoubleNegativeInfinity = double.NEGATIVE_INFINITY;
-const double kDoubleNaN = double.NAN;
-
-const float kFloatValue = 2.71828;
-const float kFloatInfinity = float.INFINITY;
-const float kFloatNegativeInfinity = float.NEGATIVE_INFINITY;
-const float kFloatNaN = float.NAN;
-
-const string kStringValue = "test string contents";
-
-struct StructWithConstants {
-  const int8 kInt8Value = 5;
-  const float kFloatValue = 765.432;
-  const string kStringValue = "struct test string contents";
-};
-
-interface InterfaceWithConstants {
-  const uint32 kUint32Value = 20100722;
-  const double kDoubleValue = 12.34567;
-  const string kStringValue = "interface test string contents";
-};
diff --git a/mojo/public/interfaces/bindings/tests/test_data_view.mojom b/mojo/public/interfaces/bindings/tests/test_data_view.mojom
deleted file mode 100644
index 1fe8c6a..0000000
--- a/mojo/public/interfaces/bindings/tests/test_data_view.mojom
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module mojo.test.data_view;
-
-enum TestEnum {
-  VALUE_0,
-  VALUE_1
-};
-
-interface TestInterface {
-  [Sync]
-  Echo(int32 value) => (int32 out_value);
-};
-
-struct NestedStruct {
-  int32 f_int32;
-};
-
-[Native]
-struct TestNativeStruct;
-
-union TestUnion {
-  bool f_bool;
-  int32 f_int32;
-};
-
-struct TestStruct {
-  string f_string;
-  NestedStruct? f_struct;
-  TestNativeStruct? f_native_struct;
-  array<bool> f_bool_array;
-  array<int32> f_int32_array;
-  array<TestEnum> f_enum_array;
-  array<TestInterface> f_interface_array;
-  array<array<int32>> f_nested_array;
-  array<NestedStruct> f_struct_array;
-  array<TestUnion> f_union_array;
-  map<string, int32> f_map;
-};
diff --git a/mojo/public/interfaces/bindings/tests/test_export.mojom b/mojo/public/interfaces/bindings/tests/test_export.mojom
deleted file mode 100644
index 319a15b..0000000
--- a/mojo/public/interfaces/bindings/tests/test_export.mojom
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module mojo.test.test_export;
-
-struct StringPair {
-  string s1;
-  string s2;
-};
-
-// This is a regression test. On Windows, if we export the generated class *and*
-// not explicitly disallow copy constructor and assign operator, compilation
-// will fail because it tries to use copy constructor of
-// InlinedStructPtr<StringPair>.
-struct StringPairContainer {
-  array<StringPair> pairs;
-};
-
-interface ExportedInterface {};
diff --git a/mojo/public/interfaces/bindings/tests/test_export2.mojom b/mojo/public/interfaces/bindings/tests/test_export2.mojom
deleted file mode 100644
index 011395c..0000000
--- a/mojo/public/interfaces/bindings/tests/test_export2.mojom
+++ /dev/null
@@ -1,10 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module mojo.test.test_export2;
-
-struct StringPair {
-  string s1;
-  string s2;
-};
diff --git a/mojo/public/interfaces/bindings/tests/test_import.mojom b/mojo/public/interfaces/bindings/tests/test_import.mojom
deleted file mode 100644
index 42014c6..0000000
--- a/mojo/public/interfaces/bindings/tests/test_import.mojom
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module mojo.test.test_import;
-
-import "mojo/public/interfaces/bindings/tests/test_export.mojom";
-
-struct ImportingStruct {
-  mojo.test.test_export.StringPair strings;
-};
diff --git a/mojo/public/interfaces/bindings/tests/test_native_types.mojom b/mojo/public/interfaces/bindings/tests/test_native_types.mojom
deleted file mode 100644
index 3df4318..0000000
--- a/mojo/public/interfaces/bindings/tests/test_native_types.mojom
+++ /dev/null
@@ -1,38 +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.
-
-module mojo.test;
-
-import "mojo/public/interfaces/bindings/tests/rect.mojom";
-
-// Used to verify that structs can be declared with no body in mojom.
-
-[Native]
-struct PickledStruct;
-
-[Native]
-enum PickledEnum;
-
-struct PickleContainer {
-  PickledStruct f_struct;
-  PickledEnum f_enum;
-};
-
-interface PicklePasser {
-  PassPickledStruct(PickledStruct pickle) => (PickledStruct passed);
-  PassPickledEnum(PickledEnum pickle) => (PickledEnum passed);
-  PassPickleContainer(PickleContainer container) => (PickleContainer passed);
-  PassPickles(array<PickledStruct> pickles) => (array<PickledStruct> passed);
-  PassPickleArrays(array<array<PickledStruct>> pickle_arrays)
-      => (array<array<PickledStruct>> passed);
-};
-
-// Used to verify support for native serialization of mojom-defined structs
-// using StrucTraits with different variants of the Rect type from rect.mojom.
-
-interface RectService {
-  AddRect(TypemappedRect r);
-  GetLargestRect() => (TypemappedRect largest);
-  PassSharedRect(SharedTypemappedRect r) => (SharedTypemappedRect passed);
-};
diff --git a/mojo/public/interfaces/bindings/tests/test_structs.mojom b/mojo/public/interfaces/bindings/tests/test_structs.mojom
deleted file mode 100644
index 03a0a20..0000000
--- a/mojo/public/interfaces/bindings/tests/test_structs.mojom
+++ /dev/null
@@ -1,414 +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.
-
-[JavaPackage="org.chromium.mojo.bindings.test.mojom.test_structs"]
-module mojo.test;
-
-import "mojo/public/interfaces/bindings/tests/rect.mojom";
-
-struct NamedRegion {
-  string? name;
-  array<Rect>? rects;
-};
-
-struct RectPair {
-  Rect? first;
-  Rect? second;
-};
-
-struct EmptyStruct {
-};
-
-[Native]
-struct UnmappedNativeStruct;
-
-// Used to verify that struct fields which don't specify a default are
-// initialized to: false for bool, 0 for numbers, and null for strings,
-// handles, and structs. The "?" nullable suffix shouldn't have any
-// impact on initial field values.
-
-struct NoDefaultFieldValues {
-  bool f0;
-  int8 f1;
-  uint8 f2;
-  int16 f3;
-  uint16 f4;
-  int32 f5;
-  uint32 f6;
-  int64 f7;
-  uint64 f8;
-  float f9;
-  double f10;
-  string f11;
-  string? f12;
-  handle<message_pipe> f13;
-  handle<data_pipe_consumer> f14;
-  handle<data_pipe_producer> f15;
-  handle<message_pipe>? f16;
-  handle<data_pipe_consumer>? f17;
-  handle<data_pipe_producer>? f18;
-  handle f19;
-  handle? f20;
-  handle<shared_buffer> f21;
-  handle<shared_buffer>? f22;
-  array<string> f23;
-  array<string?> f24;
-  array<string>? f25;
-  array<string?>? f26;
-  EmptyStruct f27;
-  EmptyStruct? f28;
-};
-
-// Used to verify that struct fields with an explicit default value
-// are initialized correctly. The "?" nullable suffix shouldn't have any
-// impact on initial field values.
-
-struct DefaultFieldValues {
-  const string kFoo = "foo";
-  bool f0 = true;
-  int8 f1 = 100;
-  uint8 f2 = 100;
-  int16 f3 = 100;
-  uint16 f4 = 100;
-  int32 f5 = 100;
-  uint32 f6 = 100;
-  int64 f7 = 100;
-  uint64 f8 = 100;
-  float f9 = 100;
-  float f10 = 100.0;
-  double f11 = 100;
-  double f12 = 100.0;
-  string f13 = kFoo;
-  string? f14 = kFoo;
-  Rect f15 = default;
-  Rect? f16 = default;
-};
-
-// Used to verify that the code generated for enum and const values defined
-// within a struct is correct. Assuming that a constant's value can be a literal
-// or another constant and that enum values can either be an integer constant or
-// another value from the same enum type.
-
-struct ScopedConstants {
-  const int32 TEN = 10;
-  const int32 ALSO_TEN = TEN;
-  enum EType {
-    E0,
-    E1,
-    E2 = 10,
-    E3 = E2,
-    E4,
-  };
-  EType f0 = E0; // 0
-  EType f1 = E1; // 1
-  EType f2 = E2; // 10
-  EType f3 = E3; // 10
-  EType f4 = E4; // 11
-  int32 f5 = TEN;
-  int32 f6 = ALSO_TEN;
-};
-
-// Used to verify that all possible Map key field types can be encoded and
-// decoded successfully.
-
-struct MapKeyTypes {
-  // TODO(yzshen): WTF::HashMap doesn't support bool as key.
-  // map<bool, bool> f0;
-  map<int8, int8> f1;
-  map<uint8, uint8> f2;
-  map<int16, int16> f3;
-  map<uint16, uint16> f4;
-  map<int32, int32> f5;
-  map<uint32, uint32> f6;
-  map<int64, int64> f7;
-  map<uint64, uint64> f8;
-  map<float, float> f9;
-  map<double, double> f10;
-  map<string, string> f11;
-  // TODO(tibell): JS/Java don't support struct as key.
-  // map<Rect, Rect> f12;
-};
-
-// Used to verify that various map value types can be encoded and decoded
-// successfully.
-
-struct MapValueTypes {
-  map<string, array<string>> f0;
-  map<string, array<string>?> f1;
-  map<string, array<string?>> f2;
-  map<string, array<string, 2>> f3;
-  map<string, array<array<string, 2>?>> f4;
-  map<string, array<array<string, 2>, 1>> f5;
-  map<string, Rect?> f6;
-  map<string, map<string, string>> f7;
-  map<string, array<map<string, string>>> f8;
-  map<string, handle> f9;
-  map<string, array<handle>> f10;
-  map<string, map<string, handle>> f11;
-};
-
-// Used to verify that various array types can be encoded and decoded
-// successfully.
-
-struct ArrayValueTypes {
-  array<int8> f0;
-  array<int16> f1;
-  array<int32> f2;
-  array<int64> f3;
-  array<float> f4;
-  array<double> f5;
-  array<SomeInterface> f6;
-  array<SomeInterface&> f7;
-};
-
-// Used to verify that various float and double values can be encoded and
-// decoded correctly.
-
-struct FloatNumberValues {
-  const double V0 = double.INFINITY;
-  const double V1 = double.NEGATIVE_INFINITY;
-  const double V2 = double.NAN;
-  const float V3 = float.INFINITY;
-  const float V4 = float.NEGATIVE_INFINITY;
-  const float V5 = float.NAN;
-  const float V6 = 0;
-  const double V7 = 1234567890.123;
-  const double V8 = 1.2E+20;
-  const double V9 = -1.2E+20;
-
-  double f0 = V0;
-  double f1 = V1;
-  double f2 = V2;
-  float f3 = V3;
-  float f4 = V4;
-  float f5 = V5;
-  float f6 = V6;
-  double f7 = V7;
-  double f8 = V8;
-  double f9 = V9;
-};
-
-// Used to verify that various signed integer values can be encoded and
-// decoded correctly.
-
-struct IntegerNumberValues {
-  const int8 V0 = -128; // Minimum
-  const int8 V1 = -1;   // -1
-  const int8 V2 = 0;    // 0
-  const int8 V3 = 42;   // An arbitrary valid value.
-  const int8 V4 = 127;  // Maximum
-
-  const int16 V5 = -32768; // ...
-  const int16 V6 = -1;
-  const int16 V7 = 0;
-  const int16 V8 = 12345;
-  const int16 V9 = 32767;
-
-  const int32 V10 = -2147483648;
-  const int32 V11 = -1;
-  const int32 V12 = 0;
-  const int32 V13 = 1234567890;
-  const int32 V14 = 2147483647;
-
-  // The limits for JavaScript integers are +/- (2^53 - 1).
-  const int64 V15 = -9007199254740991; // Number.MIN_SAFE_INTEGER
-  const int64 V16 = -1;
-  const int64 V17 = 0;
-  const int64 V18 = 1234567890123456;
-  const int64 V19 = 9007199254740991; // Number.MAX_SAFE_INTEGER
-
-  int8 f0 = V0;
-  int8 f1 = V1;
-  int8 f2 = V2;
-  int8 f3 = V3;
-  int8 f4 = V4;
-
-  int16 f5 = V5;
-  int16 f6 = V6;
-  int16 f7 = V7;
-  int16 f8 = V8;
-  int16 f9 = V9;
-
-  int32 f10 = V10;
-  int32 f11 = V11;
-  int32 f12 = V12;
-  int32 f13 = V13;
-  int32 f14 = V14;
-
-  int64 f15 = V15;
-  int64 f16 = V16;
-  int64 f17 = V17;
-  int64 f18 = V18;
-  int64 f19 = V19;
-};
-
-// Used to verify that various unsigned integer values can be encoded and
-// decoded correctly.
-
-struct UnsignedNumberValues {
-  const uint8 V0 = 0;    // Minimum = 0.
-  const uint8 V1 = 42;   // An arbitrary valid value.
-  const uint8 V2 = 0xFF; // Maximum
-
-  const uint16 V3 = 0; // ...
-  const uint16 V4 = 12345;
-  const uint16 V5 = 0xFFFF;
-
-  const uint32 V6 = 0;
-  const uint32 V7 = 1234567890;
-  const uint32 V8 = 0xFFFFFFFF;
-
-  // The limits for JavaScript integers are +/- (2^53 - 1).
-  const uint64 V9 = 0;
-  const uint64 V10 = 1234567890123456;
-  const uint64 V11 = 9007199254740991; // Number.MAX_SAFE_INTEGER
-
-  uint8 f0 = V0;
-  uint8 f1 = V1;
-  uint8 f2 = V2;
-
-  uint16 f3 = V3;
-  uint16 f4 = V4;
-  uint16 f5 = V5;
-
-  uint32 f6 = V6;
-  uint32 f7  = V7;
-  uint32 f8 = V8;
-
-  uint64 f9 = V9;
-  uint64 f10 = V10;
-  uint64 f11 = V11;
-};
-
-// Used to verify that various (packed) boolean array values can be encoded
-// and decoded correctly.
-
-struct BitArrayValues {
-  array<bool, 1> f0;
-  array<bool, 7> f1;
-  array<bool, 9> f2;
-  array<bool> f3;
-  array<array<bool>> f4;
-  array<array<bool>?> f5;
-  array<array<bool, 2>?> f6;
-};
-
-// Used to verify that different versions can be decoded correctly.
-
-struct MultiVersionStruct {
-  [MinVersion=0]
-  int32 f_int32;
-  [MinVersion=1]
-  Rect? f_rect;
-  [MinVersion=3]
-  string? f_string;
-  [MinVersion=5]
-  array<int8>? f_array;
-  [MinVersion=7]
-  handle<message_pipe>? f_message_pipe;
-  [MinVersion=7]
-  bool f_bool;
-  [MinVersion=9]
-  int16 f_int16;
-};
-
-struct MultiVersionStructV0 {
-  [MinVersion=0]
-  int32 f_int32;
-};
-
-struct MultiVersionStructV1 {
-  [MinVersion=0]
-  int32 f_int32;
-  [MinVersion=1]
-  Rect? f_rect;
-};
-
-struct MultiVersionStructV3 {
-  [MinVersion=0]
-  int32 f_int32;
-  [MinVersion=1]
-  Rect? f_rect;
-  [MinVersion=3]
-  string? f_string;
-};
-
-struct MultiVersionStructV5 {
-  [MinVersion=0]
-  int32 f_int32;
-  [MinVersion=1]
-  Rect? f_rect;
-  [MinVersion=3]
-  string? f_string;
-  [MinVersion=5]
-  array<int8>? f_array;
-};
-
-struct MultiVersionStructV7 {
-  [MinVersion=0]
-  int32 f_int32;
-  [MinVersion=1]
-  Rect? f_rect;
-  [MinVersion=3]
-  string? f_string;
-  [MinVersion=5]
-  array<int8>? f_array;
-  [MinVersion=7]
-  handle<message_pipe>? f_message_pipe;
-  [MinVersion=7]
-  bool f_bool;
-};
-
-// A struct where the fields are not sorted by their ordinals.
-struct ReorderedStruct {
-  [MinVersion=2]
-  int32 a@3 = 3;
-  [MinVersion=4]
-  int32 b@6 = 6;
-  [MinVersion=1]
-  int32 c@1 = 1;
-};
-
-// Used to verify that interfaces that are struct members can be defined in the
-// same file.
-
-interface SomeInterface {
-  SomeMethod(RectPair pair) => (RectPair other_pair);
-};
-
-struct ContainsInterface {
-  SomeInterface some_interface;
-};
-
-// Verify that a field can be called |other|.
-
-struct ContainsOther {
-  int32 other;
-};
-
-// Used to verify that structs can contain interface requests.
-
-struct ContainsInterfaceRequest {
-  SomeInterface& request;
-};
-
-// Used to verify that boolean fields are correctly serialized/deserialized.
-
-struct SingleBoolStruct {
-  bool value;
-};
-
-// Used to verify that structs containing typemapped types can be hashed (if the
-// typemapped type itself is hashable).
-
-struct ContainsHashable {
-  TypemappedRect rect;
-};
-
-// Used to test that nested structs can be hashed. The nested struct mustn't be
-// nullable.
-
-struct SimpleNestedStruct {
-  ContainsOther nested;
-};
diff --git a/mojo/public/interfaces/bindings/tests/test_sync_methods.mojom b/mojo/public/interfaces/bindings/tests/test_sync_methods.mojom
deleted file mode 100644
index 3b8cfe6..0000000
--- a/mojo/public/interfaces/bindings/tests/test_sync_methods.mojom
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module mojo.test;
-
-interface TestSyncCodeGeneration {
-  [Sync]
-  NoInput() => (int32 result);
-
-  [Sync]
-  NoOutput(int32 value) => ();
-
-  [Sync]
-  NoInOut() => ();
-
-  [Sync]
-  HaveInOut(int32 value1, int32 value2) => (int32 result1, int32 result2);
-};
-
-interface TestSync {
-  [Sync]
-  Ping() => ();
-
-  [Sync]
-  Echo(int32 value) => (int32 result);
-
-  AsyncEcho(int32 value) => (int32 result);
-};
-
-// Test sync method support with associated interfaces.
-interface TestSyncMaster {
-  [Sync]
-  Ping() => ();
-
-  [Sync]
-  Echo(int32 value) => (int32 result);
-
-  AsyncEcho(int32 value) => (int32 result);
-
-  SendInterface(associated TestSync ptr);
-
-  SendRequest(associated TestSync& request);
-};
diff --git a/mojo/public/interfaces/bindings/tests/test_unions.mojom b/mojo/public/interfaces/bindings/tests/test_unions.mojom
deleted file mode 100644
index 41e1ed6..0000000
--- a/mojo/public/interfaces/bindings/tests/test_unions.mojom
+++ /dev/null
@@ -1,105 +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.
-
-module mojo.test;
-
-enum AnEnum {
-  FIRST, SECOND
-};
-
-[Extensible]
-enum AnExtensibleEnum {
-  FIRST, SECOND, THIRD
-};
-
-union PodUnion {
-  int8   f_int8;
-  int8   f_int8_other;
-  uint8  f_uint8;
-  int16  f_int16;
-  uint16 f_uint16;
-  int32  f_int32;
-  uint32 f_uint32;
-  int64  f_int64;
-  uint64 f_uint64;
-  float  f_float;
-  double f_double;
-  bool   f_bool;
-  AnEnum f_enum;
-  AnExtensibleEnum f_extensible_enum;
-};
-
-union ObjectUnion {
-  int8   f_int8;
-  string f_string;
-  DummyStruct f_dummy;
-  DummyStruct? f_nullable;
-  array<int8> f_array_int8;
-  map<string, int8> f_map_int8;
-  PodUnion f_pod_union;
-  // Test that Clone() is defined after SmallStruct is declared.
-  array<SmallStruct> f_small_structs;
-};
-
-union HandleUnion {
-  handle f_handle;
-  handle<message_pipe> f_message_pipe;
-  handle<data_pipe_consumer> f_data_pipe_consumer;
-  handle<data_pipe_producer> f_data_pipe_producer;
-  handle<shared_buffer> f_shared_buffer;
-  SmallCache f_small_cache;
-  SmallCache& f_small_cache_request;
-};
-
-struct WrapperStruct {
-  ObjectUnion? object_union;
-  PodUnion? pod_union;
-  HandleUnion? handle_union;
-};
-
-struct DummyStruct {
-  int8 f_int8;
-};
-
-struct SmallStruct {
-  DummyStruct? dummy_struct;
-  PodUnion? pod_union;
-  array<PodUnion>? pod_union_array;
-  array<PodUnion?>? nullable_pod_union_array;
-  array<DummyStruct>? s_array;
-  map<string, PodUnion>? pod_union_map;
-  map<string, PodUnion?>? nullable_pod_union_map;
-};
-
-struct SmallStructNonNullableUnion {
-  PodUnion pod_union;
-};
-
-struct SmallObjStruct {
-  ObjectUnion obj_union;
-  int8 f_int8;
-};
-
-interface SmallCache {
-  SetIntValue(int64 int_value);
-  GetIntValue() => (int64 int_value);
-};
-
-interface UnionInterface {
-  Echo(PodUnion in_val) => (PodUnion out_val);
-};
-
-struct TryNonNullStruct {
-  DummyStruct? nullable;
-  DummyStruct non_nullable;
-};
-
-union OldUnion {
-  int8 f_int8;
-};
-
-union NewUnion {
-  int8 f_int8;
-  int16 f_int16;
-};
diff --git a/mojo/public/interfaces/bindings/tests/test_wtf_types.mojom b/mojo/public/interfaces/bindings/tests/test_wtf_types.mojom
deleted file mode 100644
index 183f184..0000000
--- a/mojo/public/interfaces/bindings/tests/test_wtf_types.mojom
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module mojo.test;
-
-struct TestWTFCodeGeneration {
-  string str;
-  string? nullable_str;
-  array<string> strs;
-  array<string?> nullable_strs;
-  array<array<int32>> arrays;
-  array<bool> bools;
-  array<handle<message_pipe>> handles;
-  map<string, string?> str_map;
-  map<int32, array<int32>> array_map;
-  map<int32, handle<message_pipe>> handle_map;
-  array<map<string, string?>> str_maps;
-};
-
-union TestWTFCodeGeneration2 {
-  string str;
-  array<string> strs;
-  map<string, string?> str_map;
-};
-
-struct TestWTFStruct {
-  enum NestedEnum {
-    E0,
-    E1,
-  };
-  string str;
-  int32 integer;
-};
-
-interface TestWTF {
-  enum NestedEnum {
-    E0,
-    E1,
-  };
-  EchoString(string? str) => (string? str);
-  EchoStringArray(array<string?>? arr) => (array<string?>? arr);
-  EchoStringMap(map<string, string?>? str_map)
-      => (map<string, string?>? str_map);
-};
-
-enum TopLevelEnum {
-  E0,
-  E1,
-};
diff --git a/mojo/public/interfaces/bindings/tests/validation_test_associated_interfaces.mojom b/mojo/public/interfaces/bindings/tests/validation_test_associated_interfaces.mojom
deleted file mode 100644
index 2fa77ff..0000000
--- a/mojo/public/interfaces/bindings/tests/validation_test_associated_interfaces.mojom
+++ /dev/null
@@ -1,18 +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.
-
-module mojo.test;
-
-// Associated interfaces are not supported by all language bindings yet.
-// Eventually these definitions should live in validation_test_interfaces.mojom.
-
-interface InterfaceX {};
-
-interface AssociatedConformanceTestInterface {
-  Method0(associated InterfaceX param0);
-  Method1(associated InterfaceX& param0);
-  Method2(associated InterfaceX? param0);
-  Method3(array<associated InterfaceX> param0);
-};
-
diff --git a/mojo/public/interfaces/bindings/tests/validation_test_interfaces.mojom b/mojo/public/interfaces/bindings/tests/validation_test_interfaces.mojom
deleted file mode 100644
index ab69045..0000000
--- a/mojo/public/interfaces/bindings/tests/validation_test_interfaces.mojom
+++ /dev/null
@@ -1,135 +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.
-
-
-[JavaPackage="org.chromium.mojo.bindings.test.mojom.mojo"]
-module mojo.test;
-
-struct StructA {
-  uint64 i;
-};
-
-struct StructB {
-  StructA struct_a;
-};
-
-struct StructC {
-  array<uint8> data;
-};
-
-struct StructD {
-  array<handle<message_pipe>> message_pipes;
-};
-
-struct StructE {
-  StructD struct_d;
-  handle<data_pipe_consumer> data_pipe_consumer;
-};
-
-struct StructF {
-  array<uint8, 3> fixed_size_array;
-};
-
-struct StructG {
-  int32 i;
-  [MinVersion=1]
-  StructA? struct_a;
-  [MinVersion=3]
-  string? str;
-  [MinVersion=3]
-  bool b;
-};
-
-interface InterfaceA {
-};
-
-enum EnumA {
-  ENUM_A_0,
-  ENUM_A_1
-};
-
-[Extensible]
-enum EnumB {
-  ENUM_B_0,
-  ENUM_B_1,
-  ENUM_B_2
-};
-
-// A non-extensible enum with no values is valid, but about as useless as
-// you would expect: it will fail validation for all values.
-enum EmptyEnum {};
-
-[Extensible]
-enum ExtensibleEmptyEnum {};
-
-union UnionA {
-  StructA struct_a;
-  bool b;
-};
-
-// This interface is used for testing bounds-checking in the mojom
-// binding code. If you add a method please update the files
-// ./data/validation/boundscheck_*. If you add a response please update
-// ./data/validation/resp_boundscheck_*.
-interface BoundsCheckTestInterface {
-  Method0(uint8 param0) => (uint8 param0);
-  Method1(uint8 param0);
-};
-
-interface ConformanceTestInterface {
-  Method0(float param0);
-  Method1(StructA param0);
-  Method2(StructB param0, StructA param1);
-  Method3(array<bool> param0);
-  Method4(StructC param0, array<uint8> param1);
-  Method5(StructE param0, handle<data_pipe_producer> param1);
-  Method6(array<array<uint8>> param0);
-  Method7(StructF param0, array<array<uint8, 3>?, 2> param1);
-  Method8(array<array<string>?> param0);
-  Method9(array<array<handle?>>? param0);
-  Method10(map<string, uint8> param0);
-  Method11(StructG param0);
-  Method12(float param0) => (float param0);
-  Method13(InterfaceA? param0, uint32 param1, InterfaceA? param2);
-  Method14(EnumA param0, EnumB param1);
-  Method15(array<EnumA>? param0, array<EnumB>? param1);
-  Method16(map<EnumA, EnumA>? param0);
-  Method17(array<InterfaceA> param0);
-  Method18(UnionA? param0);
-  Method19(Recursive recursive);
-  Method20(map<StructB, uint8> param0);
-  Method21(ExtensibleEmptyEnum param0);
-  Method22(EmptyEnum param0);
-};
-
-struct BasicStruct {
-  int32 a;
-};
-
-interface IntegrationTestInterface {
-  Method0(BasicStruct param0) => (array<uint8> param0);
-};
-
-// An enum generates a enum-value validation function, so we want to test it.
-// E.g., valid enum values for this enum should be:  -3, 0, 1, 10
-enum BasicEnum {
-  A,
-  B,
-  C = A,
-  D = -3,
-  E = 0xA
-};
-
-// The enum validation function should be generated within the scope of this
-// struct.
-struct StructWithEnum {
-  enum EnumWithin {
-    A, B, C, D
-  };
-};
-
-// This is used to test that deeply recursive structures don't blow the stack.
-struct Recursive {
-  Recursive? recursive;
-};
diff --git a/mojo/public/interfaces/bindings/tests/versioning_test_client.mojom b/mojo/public/interfaces/bindings/tests/versioning_test_client.mojom
deleted file mode 100644
index f0136db..0000000
--- a/mojo/public/interfaces/bindings/tests/versioning_test_client.mojom
+++ /dev/null
@@ -1,34 +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.
-
-module mojo.test.versioning;
-
-// versioning_test_service.mojom and versioning_test_client.mojom contain
-// different versions of Mojom definitions for a fictitious human resource
-// management system. They are used to test the versioning mechanism.
-
-enum Department {
-  SALES,
-  DEV
-};
-
-struct Employee {
-  uint64 employee_id;
-  string name;
-  Department department;
-};
-
-interface HumanResourceDatabase {
-  AddEmployee(Employee employee) => (bool success);
-
-  QueryEmployee(uint64 id, [MinVersion=1] bool retrieve_finger_print)
-      => (Employee? employee, [MinVersion=1] array<uint8>? finger_print);
-
-  [MinVersion=1]
-  AttachFingerPrint(uint64 id, array<uint8> finger_print)
-      => (bool success);
-
-  [MinVersion=2]
-  ListEmployeeIds() => (array<uint64>? ids);
-};
diff --git a/mojo/public/interfaces/bindings/tests/versioning_test_service.mojom b/mojo/public/interfaces/bindings/tests/versioning_test_service.mojom
deleted file mode 100644
index 59b3832..0000000
--- a/mojo/public/interfaces/bindings/tests/versioning_test_service.mojom
+++ /dev/null
@@ -1,38 +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.
-
-module mojo.test.versioning;
-
-// versioning_test_service.mojom and versioning_test_client.mojom contain
-// different versions of Mojom definitions for a fictitious human resource
-// management system. They are used to test the versioning mechanism.
-
-enum Department {
-  SALES,
-  DEV
-};
-
-struct Date {
-  uint16 year;
-  uint8 month;
-  uint8 day;
-};
-
-struct Employee {
-  uint64 employee_id;
-  string name;
-  Department department;
-  [MinVersion=1] Date? birthday;
-};
-
-interface HumanResourceDatabase {
-  AddEmployee(Employee employee) => (bool success);
-
-  QueryEmployee(uint64 id, [MinVersion=1] bool retrieve_finger_print)
-      => (Employee? employee, [MinVersion=1] array<uint8>? finger_print);
-
-  [MinVersion=1]
-  AttachFingerPrint(uint64 id, array<uint8> finger_print)
-      => (bool success);
-};
diff --git a/mojo/public/java/BUILD.gn b/mojo/public/java/BUILD.gn
deleted file mode 100644
index 0780641..0000000
--- a/mojo/public/java/BUILD.gn
+++ /dev/null
@@ -1,64 +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.
-
-import("//build/config/android/rules.gni")
-
-android_library("system_java") {
-  java_files = [
-    "system/src/org/chromium/mojo/system/Core.java",
-    "system/src/org/chromium/mojo/system/DataPipe.java",
-    "system/src/org/chromium/mojo/system/Flags.java",
-    "system/src/org/chromium/mojo/system/Handle.java",
-    "system/src/org/chromium/mojo/system/InvalidHandle.java",
-    "system/src/org/chromium/mojo/system/MessagePipeHandle.java",
-    "system/src/org/chromium/mojo/system/MojoException.java",
-    "system/src/org/chromium/mojo/system/MojoResult.java",
-    "system/src/org/chromium/mojo/system/Pair.java",
-    "system/src/org/chromium/mojo/system/ResultAnd.java",
-    "system/src/org/chromium/mojo/system/SharedBufferHandle.java",
-    "system/src/org/chromium/mojo/system/UntypedHandle.java",
-    "system/src/org/chromium/mojo/system/RunLoop.java",
-    "system/src/org/chromium/mojo/system/Watcher.java",
-  ]
-}
-
-android_library("bindings_java") {
-  java_files = [
-    "bindings/src/org/chromium/mojo/bindings/AssociatedInterfaceNotSupported.java",
-    "bindings/src/org/chromium/mojo/bindings/AssociatedInterfaceRequestNotSupported.java",
-    "bindings/src/org/chromium/mojo/bindings/AutoCloseableRouter.java",
-    "bindings/src/org/chromium/mojo/bindings/BindingsHelper.java",
-    "bindings/src/org/chromium/mojo/bindings/Callbacks.java",
-    "bindings/src/org/chromium/mojo/bindings/ConnectionErrorHandler.java",
-    "bindings/src/org/chromium/mojo/bindings/Connector.java",
-    "bindings/src/org/chromium/mojo/bindings/DataHeader.java",
-    "bindings/src/org/chromium/mojo/bindings/Decoder.java",
-    "bindings/src/org/chromium/mojo/bindings/DelegatingConnectionErrorHandler.java",
-    "bindings/src/org/chromium/mojo/bindings/DeserializationException.java",
-    "bindings/src/org/chromium/mojo/bindings/Encoder.java",
-    "bindings/src/org/chromium/mojo/bindings/ExecutorFactory.java",
-    "bindings/src/org/chromium/mojo/bindings/HandleOwner.java",
-    "bindings/src/org/chromium/mojo/bindings/InterfaceControlMessagesHelper.java",
-    "bindings/src/org/chromium/mojo/bindings/Interface.java",
-    "bindings/src/org/chromium/mojo/bindings/InterfaceRequest.java",
-    "bindings/src/org/chromium/mojo/bindings/MessageHeader.java",
-    "bindings/src/org/chromium/mojo/bindings/Message.java",
-    "bindings/src/org/chromium/mojo/bindings/MessageReceiver.java",
-    "bindings/src/org/chromium/mojo/bindings/MessageReceiverWithResponder.java",
-    "bindings/src/org/chromium/mojo/bindings/RouterImpl.java",
-    "bindings/src/org/chromium/mojo/bindings/Router.java",
-    "bindings/src/org/chromium/mojo/bindings/SerializationException.java",
-    "bindings/src/org/chromium/mojo/bindings/ServiceMessage.java",
-    "bindings/src/org/chromium/mojo/bindings/SideEffectFreeCloseable.java",
-    "bindings/src/org/chromium/mojo/bindings/Struct.java",
-    "bindings/src/org/chromium/mojo/bindings/Union.java",
-  ]
-
-  deps = [
-    ":system_java",
-    "//base:base_java",
-  ]
-
-  srcjar_deps = [ "../interfaces/bindings:bindings_java_sources" ]
-}
diff --git a/mojo/public/java/bindings/README.md b/mojo/public/java/bindings/README.md
deleted file mode 100644
index 821a230..0000000
--- a/mojo/public/java/bindings/README.md
+++ /dev/null
@@ -1,12 +0,0 @@
-# ![Mojo Graphic](https://goo.gl/6CdlbH) Mojo Java Bindings API
-This document is a subset of the [Mojo documentation](/mojo).
-
-[TOC]
-
-## Overview
-
-This document provides a brief guide to API usage with example code snippets.
-For a detailed API references please consult the class definitions in
-[this directory](https://cs.chromium.org/chromium/src/mojo/public/java/bindings/src/org/chromium/mojo/bindings/)
-
-TODO: Make the contents of this document less non-existent.
diff --git a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/AssociatedInterfaceNotSupported.java b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/AssociatedInterfaceNotSupported.java
deleted file mode 100644
index ee8f631..0000000
--- a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/AssociatedInterfaceNotSupported.java
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.bindings;
-
-/**
- * Associated interface is not supported yet.
- */
-public class AssociatedInterfaceNotSupported {
-}
diff --git a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/AssociatedInterfaceRequestNotSupported.java b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/AssociatedInterfaceRequestNotSupported.java
deleted file mode 100644
index 1b07cd1..0000000
--- a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/AssociatedInterfaceRequestNotSupported.java
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.bindings;
-
-/**
- * Associated interface is not supported yet.
- */
-public class AssociatedInterfaceRequestNotSupported {
-}
diff --git a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/AutoCloseableRouter.java b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/AutoCloseableRouter.java
deleted file mode 100644
index 8a83be9..0000000
--- a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/AutoCloseableRouter.java
+++ /dev/null
@@ -1,116 +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.
-
-package org.chromium.mojo.bindings;
-
-import org.chromium.mojo.system.Core;
-import org.chromium.mojo.system.MessagePipeHandle;
-
-import java.util.concurrent.Executor;
-
-/**
- * Wrapper around {@link Router} that will close the connection when not referenced anymore.
- */
-class AutoCloseableRouter implements Router {
-
-    /**
-     * The underlying router.
-     */
-    private final Router mRouter;
-
-    /**
-     * The executor to close the underlying router.
-     */
-    private final Executor mExecutor;
-
-    /**
-     * Flags to keep track if this router has been correctly closed.
-     */
-    private boolean mClosed;
-
-    /**
-     * Constructor.
-     */
-    public AutoCloseableRouter(Core core, Router router) {
-        mRouter = router;
-        mExecutor = ExecutorFactory.getExecutorForCurrentThread(core);
-    }
-
-    /**
-     * @see Router#setIncomingMessageReceiver(MessageReceiverWithResponder)
-     */
-    @Override
-    public void setIncomingMessageReceiver(MessageReceiverWithResponder incomingMessageReceiver) {
-        mRouter.setIncomingMessageReceiver(incomingMessageReceiver);
-    }
-
-    /**
-     * @see HandleOwner#passHandle()
-     */
-    @Override
-    public MessagePipeHandle passHandle() {
-        return mRouter.passHandle();
-    }
-
-    /**
-     * @see MessageReceiver#accept(Message)
-     */
-    @Override
-    public boolean accept(Message message) {
-        return mRouter.accept(message);
-    }
-
-    /**
-     * @see MessageReceiverWithResponder#acceptWithResponder(Message, MessageReceiver)
-     */
-    @Override
-    public boolean acceptWithResponder(Message message, MessageReceiver responder) {
-        return mRouter.acceptWithResponder(message, responder);
-
-    }
-
-    /**
-     * @see Router#start()
-     */
-    @Override
-    public void start() {
-        mRouter.start();
-    }
-
-    /**
-     * @see Router#setErrorHandler(ConnectionErrorHandler)
-     */
-    @Override
-    public void setErrorHandler(ConnectionErrorHandler errorHandler) {
-        mRouter.setErrorHandler(errorHandler);
-    }
-
-    /**
-     * @see java.io.Closeable#close()
-     */
-    @Override
-    public void close() {
-        mRouter.close();
-        mClosed = true;
-    }
-
-    /**
-     * @see Object#finalize()
-     */
-    @Override
-    protected void finalize() throws Throwable {
-        if (!mClosed) {
-            mExecutor.execute(new Runnable() {
-
-                @Override
-                public void run() {
-                    close();
-                }
-            });
-            throw new IllegalStateException("Warning: Router objects should be explicitly closed " +
-                    "when no longer required otherwise you may leak handles.");
-        }
-        super.finalize();
-    }
-}
diff --git a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/BindingsHelper.java b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/BindingsHelper.java
deleted file mode 100644
index f77399d..0000000
--- a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/BindingsHelper.java
+++ /dev/null
@@ -1,199 +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.
-
-package org.chromium.mojo.bindings;
-
-import org.chromium.mojo.system.Handle;
-import org.chromium.mojo.system.Watcher;
-
-/**
- * Helper functions.
- */
-public class BindingsHelper {
-    /**
-     * Alignment in bytes for mojo serialization.
-     */
-    public static final int ALIGNMENT = 8;
-
-    /**
-     * The size, in bytes, of a serialized handle. A handle is serialized as an int representing the
-     * offset of the handle in the list of handles.
-     */
-    public static final int SERIALIZED_HANDLE_SIZE = 4;
-
-    /**
-     * The size, in bytes, of a serialized interface, which consists of a serialized handle (4
-     * bytes) and a version number (4 bytes).
-     */
-    public static final int SERIALIZED_INTERFACE_SIZE = 8;
-
-    /**
-     * The size, in bytes, of a serialized pointer. A pointer is serializaed as an unsigned long
-     * representing the offset from its position to the pointed elemnt.
-     */
-    public static final int POINTER_SIZE = 8;
-
-    /**
-     * The size, in bytes, of a serialized union.
-     */
-    public static final int UNION_SIZE = 16;
-
-    /**
-     * The header for a serialized map element.
-     */
-    public static final DataHeader MAP_STRUCT_HEADER = new DataHeader(24, 0);
-
-    /**
-     * The value used for the expected length of a non-fixed size array.
-     */
-    public static final int UNSPECIFIED_ARRAY_LENGTH = -1;
-
-    /**
-     * Passed as |arrayNullability| when neither the array nor its elements are nullable.
-     */
-    public static final int NOTHING_NULLABLE = 0;
-
-    /**
-     * "Array bit" of |arrayNullability| is set iff the array itself is nullable.
-     */
-    public static final int ARRAY_NULLABLE = (1 << 0);
-
-    /**
-     * "Element bit" of |arrayNullability| is set iff the array elements are nullable.
-     */
-    public static final int ELEMENT_NULLABLE = (1 << 1);
-
-    public static boolean isArrayNullable(int arrayNullability) {
-        return (arrayNullability & ARRAY_NULLABLE) > 0;
-    }
-
-    public static boolean isElementNullable(int arrayNullability) {
-        return (arrayNullability & ELEMENT_NULLABLE) > 0;
-    }
-
-    /**
-     * Align |size| on {@link BindingsHelper#ALIGNMENT}.
-     */
-    public static int align(int size) {
-        return (size + ALIGNMENT - 1) & ~(ALIGNMENT - 1);
-    }
-
-    /**
-     * Align |size| on {@link BindingsHelper#ALIGNMENT}.
-     */
-    public static long align(long size) {
-        return (size + ALIGNMENT - 1) & ~(ALIGNMENT - 1);
-    }
-
-    /**
-     * Compute the size in bytes of the given string encoded as utf8.
-     */
-    public static int utf8StringSizeInBytes(String s) {
-        int res = 0;
-        for (int i = 0; i < s.length(); ++i) {
-            char c = s.charAt(i);
-            int codepoint = c;
-            if (isSurrogate(c)) {
-                i++;
-                char c2 = s.charAt(i);
-                codepoint = Character.toCodePoint(c, c2);
-            }
-            res += 1;
-            if (codepoint > 0x7f) {
-                res += 1;
-                if (codepoint > 0x7ff) {
-                    res += 1;
-                    if (codepoint > 0xffff) {
-                        res += 1;
-                        if (codepoint > 0x1fffff) {
-                            res += 1;
-                            if (codepoint > 0x3ffffff) {
-                                res += 1;
-                            }
-                        }
-                    }
-                }
-            }
-        }
-        return res;
-    }
-
-    /**
-     * Returns |true| if and only if the two objects are equals, handling |null|.
-     */
-    public static boolean equals(Object o1, Object o2) {
-        if (o1 == o2) {
-            return true;
-        }
-        if (o1 == null) {
-            return false;
-        }
-        return o1.equals(o2);
-    }
-
-    /**
-     * Returns the hash code of the object, handling |null|.
-     */
-    public static int hashCode(Object o) {
-        if (o == null) {
-            return 0;
-        }
-        return o.hashCode();
-    }
-
-    /**
-     * Returns the hash code of the value.
-     */
-    public static int hashCode(boolean o) {
-        return o ? 1231 : 1237;
-    }
-
-    /**
-     * Returns the hash code of the value.
-     */
-    public static int hashCode(long o) {
-        return (int) (o ^ (o >>> 32));
-    }
-
-    /**
-     * Returns the hash code of the value.
-     */
-    public static int hashCode(float o) {
-        return Float.floatToIntBits(o);
-    }
-
-    /**
-     * Returns the hash code of the value.
-     */
-    public static int hashCode(double o) {
-        return hashCode(Double.doubleToLongBits(o));
-    }
-
-    /**
-     * Returns the hash code of the value.
-     */
-    public static int hashCode(int o) {
-        return o;
-    }
-
-    /**
-     * Determines if the given {@code char} value is a Unicode <i>surrogate code unit</i>. See
-     * {@link Character#isSurrogate}. Extracting here because the method only exists at API level
-     * 19.
-     */
-    private static boolean isSurrogate(char c) {
-        return c >= Character.MIN_SURROGATE && c < (Character.MAX_SURROGATE + 1);
-    }
-
-    /**
-     * Returns an {@link AsyncWaiter} to use with the given handle, or |null| if none if available.
-     */
-    static Watcher getWatcherForHandle(Handle handle) {
-        if (handle.getCore() != null) {
-            return handle.getCore().getWatcher();
-        } else {
-            return null;
-        }
-    }
-}
diff --git a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Callbacks.java b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Callbacks.java
deleted file mode 100644
index c6b14c1..0000000
--- a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Callbacks.java
+++ /dev/null
@@ -1,130 +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.
-
-// This file was generated using
-//     mojo/tools/generate_java_callback_interfaces.py
-
-package org.chromium.mojo.bindings;
-
-/**
- * Contains a generic interface for callbacks.
- */
-public interface Callbacks {
-
-    /**
-     * A generic callback.
-     */
-    interface Callback0 {
-        /**
-         * Call the callback.
-         */
-        public void call();
-    }
-
-    /**
-     * A generic 1-argument callback.
-     *
-     * @param <T1> the type of argument 1.
-     */
-    interface Callback1<T1> {
-        /**
-         * Call the callback.
-         */
-        public void call(T1 arg1);
-    }
-
-    /**
-     * A generic 2-argument callback.
-     *
-     * @param <T1> the type of argument 1.
-      * @param <T2> the type of argument 2.
-     */
-    interface Callback2<T1, T2> {
-        /**
-         * Call the callback.
-         */
-        public void call(T1 arg1, T2 arg2);
-    }
-
-    /**
-     * A generic 3-argument callback.
-     *
-     * @param <T1> the type of argument 1.
-      * @param <T2> the type of argument 2.
-      * @param <T3> the type of argument 3.
-     */
-    interface Callback3<T1, T2, T3> {
-        /**
-         * Call the callback.
-         */
-        public void call(T1 arg1, T2 arg2, T3 arg3);
-    }
-
-    /**
-     * A generic 4-argument callback.
-     *
-     * @param <T1> the type of argument 1.
-      * @param <T2> the type of argument 2.
-      * @param <T3> the type of argument 3.
-      * @param <T4> the type of argument 4.
-     */
-    interface Callback4<T1, T2, T3, T4> {
-        /**
-         * Call the callback.
-         */
-        public void call(T1 arg1, T2 arg2, T3 arg3, T4 arg4);
-    }
-
-    /**
-     * A generic 5-argument callback.
-     *
-     * @param <T1> the type of argument 1.
-      * @param <T2> the type of argument 2.
-      * @param <T3> the type of argument 3.
-      * @param <T4> the type of argument 4.
-      * @param <T5> the type of argument 5.
-     */
-    interface Callback5<T1, T2, T3, T4, T5> {
-        /**
-         * Call the callback.
-         */
-        public void call(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5);
-    }
-
-    /**
-     * A generic 6-argument callback.
-     *
-     * @param <T1> the type of argument 1.
-      * @param <T2> the type of argument 2.
-      * @param <T3> the type of argument 3.
-      * @param <T4> the type of argument 4.
-      * @param <T5> the type of argument 5.
-      * @param <T6> the type of argument 6.
-     */
-    interface Callback6<T1, T2, T3, T4, T5, T6> {
-        /**
-         * Call the callback.
-         */
-        public void call(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6);
-    }
-
-    /**
-     * A generic 7-argument callback.
-     *
-     * @param <T1> the type of argument 1.
-      * @param <T2> the type of argument 2.
-      * @param <T3> the type of argument 3.
-      * @param <T4> the type of argument 4.
-      * @param <T5> the type of argument 5.
-      * @param <T6> the type of argument 6.
-      * @param <T7> the type of argument 7.
-     */
-    interface Callback7<T1, T2, T3, T4, T5, T6, T7> {
-        /**
-         * Call the callback.
-         */
-        public void call(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7);
-    }
-
-}
diff --git a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/ConnectionErrorHandler.java b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/ConnectionErrorHandler.java
deleted file mode 100644
index f601fb8..0000000
--- a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/ConnectionErrorHandler.java
+++ /dev/null
@@ -1,15 +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.
-
-package org.chromium.mojo.bindings;
-
-import org.chromium.mojo.system.MojoException;
-
-/**
- * A {@link ConnectionErrorHandler} is notified of an error happening while using the bindings over
- * message pipes.
- */
-public interface ConnectionErrorHandler {
-    public void onConnectionError(MojoException e);
-}
diff --git a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Connector.java b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Connector.java
deleted file mode 100644
index 2aa5ea6..0000000
--- a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Connector.java
+++ /dev/null
@@ -1,214 +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.
-
-package org.chromium.mojo.bindings;
-
-import org.chromium.mojo.system.Core;
-import org.chromium.mojo.system.MessagePipeHandle;
-import org.chromium.mojo.system.MessagePipeHandle.ReadMessageResult;
-import org.chromium.mojo.system.MojoException;
-import org.chromium.mojo.system.MojoResult;
-import org.chromium.mojo.system.ResultAnd;
-import org.chromium.mojo.system.Watcher;
-
-import java.nio.ByteBuffer;
-
-/**
- * A {@link Connector} owns a {@link MessagePipeHandle} and will send any received messages to the
- * registered {@link MessageReceiver}. It also acts as a {@link MessageReceiver} and will send any
- * message through the handle.
- * <p>
- * The method |start| must be called before the {@link Connector} will start listening to incoming
- * messages.
- */
-public class Connector implements MessageReceiver, HandleOwner<MessagePipeHandle> {
-
-    /**
-     * The callback that is notified when the state of the owned handle changes.
-     */
-    private final WatcherCallback mWatcherCallback = new WatcherCallback();
-
-    /**
-     * The owned message pipe.
-     */
-    private final MessagePipeHandle mMessagePipeHandle;
-
-    /**
-     * A watcher which is notified when a new message is available on the owned message pipe.
-     */
-    private final Watcher mWatcher;
-
-    /**
-     * The {@link MessageReceiver} to which received messages are sent.
-     */
-    private MessageReceiver mIncomingMessageReceiver;
-
-    /**
-     * The error handler to notify of errors.
-     */
-    private ConnectionErrorHandler mErrorHandler;
-
-    /**
-     * Create a new connector over a |messagePipeHandle|. The created connector will use the default
-     * {@link AsyncWaiter} from the {@link Core} implementation of |messagePipeHandle|.
-     */
-    public Connector(MessagePipeHandle messagePipeHandle) {
-        this(messagePipeHandle, BindingsHelper.getWatcherForHandle(messagePipeHandle));
-    }
-
-    /**
-     * Create a new connector over a |messagePipeHandle| using the given {@link AsyncWaiter} to get
-     * notified of changes on the handle.
-     */
-    public Connector(MessagePipeHandle messagePipeHandle, Watcher watcher) {
-        mMessagePipeHandle = messagePipeHandle;
-        mWatcher = watcher;
-    }
-
-    /**
-     * Set the {@link MessageReceiver} that will receive message from the owned message pipe.
-     */
-    public void setIncomingMessageReceiver(MessageReceiver incomingMessageReceiver) {
-        mIncomingMessageReceiver = incomingMessageReceiver;
-    }
-
-    /**
-     * Set the {@link ConnectionErrorHandler} that will be notified of errors on the owned message
-     * pipe.
-     */
-    public void setErrorHandler(ConnectionErrorHandler errorHandler) {
-        mErrorHandler = errorHandler;
-    }
-
-    /**
-     * Start listening for incoming messages.
-     */
-    public void start() {
-        mWatcher.start(mMessagePipeHandle, Core.HandleSignals.READABLE, mWatcherCallback);
-    }
-
-    /**
-     * @see MessageReceiver#accept(Message)
-     */
-    @Override
-    public boolean accept(Message message) {
-        try {
-            mMessagePipeHandle.writeMessage(message.getData(),
-                    message.getHandles(), MessagePipeHandle.WriteFlags.NONE);
-            return true;
-        } catch (MojoException e) {
-            onError(e);
-            return false;
-        }
-    }
-
-    /**
-     * Pass the owned handle of the connector. After this, the connector is disconnected. It cannot
-     * accept new message and it isn't listening to the handle anymore.
-     *
-     * @see org.chromium.mojo.bindings.HandleOwner#passHandle()
-     */
-    @Override
-    public MessagePipeHandle passHandle() {
-        cancelIfActive();
-        MessagePipeHandle handle = mMessagePipeHandle.pass();
-        if (mIncomingMessageReceiver != null) {
-            mIncomingMessageReceiver.close();
-        }
-        return handle;
-    }
-
-    /**
-     * @see java.io.Closeable#close()
-     */
-    @Override
-    public void close() {
-        cancelIfActive();
-        mMessagePipeHandle.close();
-        if (mIncomingMessageReceiver != null) {
-            MessageReceiver incomingMessageReceiver = mIncomingMessageReceiver;
-            mIncomingMessageReceiver = null;
-            incomingMessageReceiver.close();
-        }
-    }
-
-    private class WatcherCallback implements Watcher.Callback {
-        /**
-         * @see org.chromium.mojo.system.Watcher.Callback#onResult(int)
-         */
-        @Override
-        public void onResult(int result) {
-            Connector.this.onWatcherResult(result);
-        }
-
-    }
-
-    /**
-     * @see org.chromium.mojo.system.Watcher.Callback#onResult(int)
-     */
-    private void onWatcherResult(int result) {
-        if (result == MojoResult.OK) {
-            readOutstandingMessages();
-        } else {
-            onError(new MojoException(result));
-        }
-    }
-
-    private void onError(MojoException exception) {
-        close();
-        if (mErrorHandler != null) {
-            mErrorHandler.onConnectionError(exception);
-        }
-    }
-
-    /**
-     * Read all available messages on the owned message pipe.
-     */
-    private void readOutstandingMessages() {
-        ResultAnd<Boolean> result;
-        do {
-            try {
-                result = readAndDispatchMessage(mMessagePipeHandle, mIncomingMessageReceiver);
-            } catch (MojoException e) {
-                onError(e);
-                return;
-            }
-        } while (result.getValue());
-        if (result.getMojoResult() != MojoResult.SHOULD_WAIT) {
-            onError(new MojoException(result.getMojoResult()));
-        }
-    }
-
-    private void cancelIfActive() {
-        mWatcher.cancel();
-        mWatcher.destroy();
-    }
-
-    /**
-     * Read a message, and pass it to the given |MessageReceiver| if not null. If the
-     * |MessageReceiver| is null, the message is lost.
-     *
-     * @param receiver The {@link MessageReceiver} that will receive the read {@link Message}. Can
-     *            be <code>null</code>, in which case the message is discarded.
-     */
-    static ResultAnd<Boolean> readAndDispatchMessage(
-            MessagePipeHandle handle, MessageReceiver receiver) {
-        // TODO(qsr) Allow usage of a pool of pre-allocated buffer for performance.
-        ResultAnd<ReadMessageResult> result =
-                handle.readMessage(null, 0, MessagePipeHandle.ReadFlags.NONE);
-        if (result.getMojoResult() != MojoResult.RESOURCE_EXHAUSTED) {
-            return new ResultAnd<Boolean>(result.getMojoResult(), false);
-        }
-        ReadMessageResult readResult = result.getValue();
-        assert readResult != null;
-        ByteBuffer buffer = ByteBuffer.allocateDirect(readResult.getMessageSize());
-        result = handle.readMessage(
-                buffer, readResult.getHandlesCount(), MessagePipeHandle.ReadFlags.NONE);
-        if (receiver != null && result.getMojoResult() == MojoResult.OK) {
-            boolean accepted = receiver.accept(new Message(buffer, result.getValue().getHandles()));
-            return new ResultAnd<Boolean>(result.getMojoResult(), accepted);
-        }
-        return new ResultAnd<Boolean>(result.getMojoResult(), false);
-    }
-}
diff --git a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/DataHeader.java b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/DataHeader.java
deleted file mode 100644
index 96acec9..0000000
--- a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/DataHeader.java
+++ /dev/null
@@ -1,70 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.bindings;
-
-/**
- * The header for a mojo complex element.
- */
-public final class DataHeader {
-    /**
-     * The size of a serialized header, in bytes.
-     */
-    public static final int HEADER_SIZE = 8;
-
-    /**
-     * The offset of the size field.
-     */
-    public static final int SIZE_OFFSET = 0;
-
-    /**
-     * The offset of the number of fields field.
-     */
-    public static final int ELEMENTS_OR_VERSION_OFFSET = 4;
-
-    /**
-     * The size of the object owning this header.
-     */
-    public final int size;
-
-    /**
-     * Number of element (for an array) or version (for a struct) of the object owning this
-     * header.
-     */
-    public final int elementsOrVersion;
-
-    /**
-     * Constructor.
-     */
-    public DataHeader(int size, int elementsOrVersion) {
-        super();
-        this.size = size;
-        this.elementsOrVersion = elementsOrVersion;
-    }
-
-    /**
-     * @see Object#hashCode()
-     */
-    @Override
-    public int hashCode() {
-        final int prime = 31;
-        int result = 1;
-        result = prime * result + elementsOrVersion;
-        result = prime * result + size;
-        return result;
-    }
-
-    /**
-     * @see Object#equals(Object)
-     */
-    @Override
-    public boolean equals(Object object) {
-        if (object == this) return true;
-        if (object == null) return false;
-        if (getClass() != object.getClass()) return false;
-
-        DataHeader other = (DataHeader) object;
-        return (elementsOrVersion == other.elementsOrVersion && size == other.size);
-    }
-}
\ No newline at end of file
diff --git a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Decoder.java b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Decoder.java
deleted file mode 100644
index 64ff1c0..0000000
--- a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Decoder.java
+++ /dev/null
@@ -1,776 +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.
-
-package org.chromium.mojo.bindings;
-
-import org.chromium.mojo.bindings.Interface.Proxy;
-import org.chromium.mojo.system.DataPipe;
-import org.chromium.mojo.system.Handle;
-import org.chromium.mojo.system.InvalidHandle;
-import org.chromium.mojo.system.MessagePipeHandle;
-import org.chromium.mojo.system.SharedBufferHandle;
-import org.chromium.mojo.system.UntypedHandle;
-
-import java.nio.ByteOrder;
-import java.nio.charset.Charset;
-
-/**
- * A Decoder is a helper class for deserializing a mojo struct. It enables deserialization of basic
- * types from a {@link Message} object at a given offset into it's byte buffer.
- */
-public class Decoder {
-
-    /**
-     * Helper class to validate the decoded message.
-     */
-    static final class Validator {
-
-        /**
-         * Minimal value for the next handle to deserialize.
-         */
-        private int mMinNextClaimedHandle;
-        /**
-         * Minimal value of the start of the next memory to claim.
-         */
-        private long mMinNextMemory;
-        /**
-         * The current nesting level when decoding.
-         */
-        private long mStackDepth;
-
-        /**
-         * The maximal memory accessible.
-         */
-        private final long mMaxMemory;
-
-        /**
-         * The number of handles in the message.
-         */
-        private final long mNumberOfHandles;
-
-        /**
-         * The maximum nesting level when decoding.
-         */
-        private static final int MAX_RECURSION_DEPTH = 100;
-
-        /**
-         * Constructor.
-         */
-        Validator(long maxMemory, int numberOfHandles) {
-            mMaxMemory = maxMemory;
-            mNumberOfHandles = numberOfHandles;
-            mStackDepth = 0;
-        }
-
-        public void claimHandle(int handle) {
-            if (handle < mMinNextClaimedHandle) {
-                throw new DeserializationException(
-                        "Trying to access handle out of order.");
-            }
-            if (handle >= mNumberOfHandles) {
-                throw new DeserializationException("Trying to access non present handle.");
-            }
-            mMinNextClaimedHandle = handle + 1;
-        }
-
-        public void claimMemory(long start, long end) {
-            if (start % BindingsHelper.ALIGNMENT != 0) {
-                throw new DeserializationException("Incorrect starting alignment: " + start + ".");
-            }
-            if (start < mMinNextMemory) {
-                throw new DeserializationException("Trying to access memory out of order.");
-            }
-            if (end < start) {
-                throw new DeserializationException("Incorrect memory range.");
-            }
-            if (end > mMaxMemory) {
-                throw new DeserializationException("Trying to access out of range memory.");
-            }
-            mMinNextMemory = BindingsHelper.align(end);
-        }
-
-        public void increaseStackDepth() {
-            ++mStackDepth;
-            if (mStackDepth >= MAX_RECURSION_DEPTH) {
-                throw new DeserializationException("Recursion depth limit exceeded.");
-            }
-        }
-
-        public void decreaseStackDepth() {
-            --mStackDepth;
-        }
-    }
-
-    /**
-     * The message to deserialize from.
-     */
-    private final Message mMessage;
-
-    /**
-     * The base offset in the byte buffer.
-     */
-    private final int mBaseOffset;
-
-    /**
-     * Validator for the decoded message.
-     */
-    private final Validator mValidator;
-
-    /**
-     * Constructor.
-     *
-     * @param message The message to decode.
-     */
-    public Decoder(Message message) {
-        this(message, new Validator(message.getData().limit(), message.getHandles().size()), 0);
-    }
-
-    private Decoder(Message message, Validator validator, int baseOffset) {
-        mMessage = message;
-        mMessage.getData().order(ByteOrder.LITTLE_ENDIAN);
-        mBaseOffset = baseOffset;
-        mValidator = validator;
-    }
-
-    /**
-     * Deserializes a {@link DataHeader} at the current position.
-     */
-    public DataHeader readDataHeader() {
-        // Claim the memory for the header.
-        mValidator.claimMemory(mBaseOffset, mBaseOffset + DataHeader.HEADER_SIZE);
-        DataHeader result = readDataHeaderAtOffset(0, false);
-        // Claim the rest of the memory.
-        mValidator.claimMemory(mBaseOffset + DataHeader.HEADER_SIZE, mBaseOffset + result.size);
-        return result;
-    }
-
-    /**
-     * Deserializes a {@link DataHeader} for an union at the given offset.
-     */
-    public DataHeader readDataHeaderForUnion(int offset) {
-        DataHeader result = readDataHeaderAtOffset(offset, true);
-        if (result.size == 0) {
-            if (result.elementsOrVersion != 0) {
-                throw new DeserializationException(
-                        "Unexpected version tag for a null union. Expecting 0, found: "
-                        + result.elementsOrVersion);
-            }
-        } else if (result.size != BindingsHelper.UNION_SIZE) {
-            throw new DeserializationException(
-                    "Unexpected size of an union. The size must be 0 for a null union, or 16 for "
-                    + "a non-null union.");
-        }
-        return result;
-    }
-
-    /**
-     * @returns a decoder suitable to decode an union defined as the root object of a message.
-     */
-    public Decoder decoderForSerializedUnion() {
-        mValidator.claimMemory(0, BindingsHelper.UNION_SIZE);
-        return this;
-    }
-
-    /**
-     * Deserializes a {@link DataHeader} at the given offset.
-     */
-    private DataHeader readDataHeaderAtOffset(int offset, boolean isUnion) {
-        int size = readInt(offset + DataHeader.SIZE_OFFSET);
-        int elementsOrVersion = readInt(offset + DataHeader.ELEMENTS_OR_VERSION_OFFSET);
-        if (size < 0) {
-            throw new DeserializationException(
-                    "Negative size. Unsigned integers are not valid for java.");
-        }
-        if (elementsOrVersion < 0 && (!isUnion || elementsOrVersion != -1)) {
-            throw new DeserializationException(
-                    "Negative elements or version. Unsigned integers are not valid for java.");
-        }
-
-        return new DataHeader(size, elementsOrVersion);
-    }
-
-    public DataHeader readAndValidateDataHeader(DataHeader[] versionArray) {
-        DataHeader header = readDataHeader();
-        int maxVersionIndex = versionArray.length - 1;
-        if (header.elementsOrVersion <= versionArray[maxVersionIndex].elementsOrVersion) {
-            DataHeader referenceHeader = null;
-            for (int index = maxVersionIndex; index >= 0; index--) {
-                DataHeader dataHeader = versionArray[index];
-                if (header.elementsOrVersion >= dataHeader.elementsOrVersion) {
-                    referenceHeader = dataHeader;
-                    break;
-                }
-            }
-            if (referenceHeader == null || referenceHeader.size != header.size) {
-                throw new DeserializationException(
-                        "Header doesn't correspond to any known version.");
-            }
-        } else {
-            if (header.size < versionArray[maxVersionIndex].size) {
-                throw new DeserializationException("Message newer than the last known version"
-                        + " cannot be shorter than required by the last known version.");
-            }
-        }
-        return header;
-    }
-
-    /**
-     * Deserializes a {@link DataHeader} at the given offset and checks if it is correct for an
-     * array where elements are pointers.
-     */
-    public DataHeader readDataHeaderForPointerArray(int expectedLength) {
-        return readDataHeaderForArray(BindingsHelper.POINTER_SIZE, expectedLength);
-    }
-
-    /**
-     * Deserializes a {@link DataHeader} at the given offset and checks if it is correct for an
-     * array where elements are unions.
-     */
-    public DataHeader readDataHeaderForUnionArray(int expectedLength) {
-        return readDataHeaderForArray(BindingsHelper.UNION_SIZE, expectedLength);
-    }
-
-    /**
-     * Deserializes a {@link DataHeader} at the given offset and checks if it is correct for a map.
-     */
-    public void readDataHeaderForMap() {
-        DataHeader si = readDataHeader();
-        if (si.size != BindingsHelper.MAP_STRUCT_HEADER.size) {
-            throw new DeserializationException(
-                    "Incorrect header for map. The size is incorrect.");
-        }
-        if (si.elementsOrVersion != BindingsHelper.MAP_STRUCT_HEADER.elementsOrVersion) {
-            throw new DeserializationException(
-                    "Incorrect header for map. The version is incorrect.");
-        }
-    }
-
-    /**
-     * Deserializes a byte at the given offset.
-     */
-    public byte readByte(int offset) {
-        validateBufferSize(offset, 1);
-        return mMessage.getData().get(mBaseOffset + offset);
-    }
-
-    /**
-     * Deserializes a boolean at the given offset, re-using any partially read byte.
-     */
-    public boolean readBoolean(int offset, int bit) {
-        validateBufferSize(offset, 1);
-        return (readByte(offset) & (1 << bit)) != 0;
-    }
-
-    /**
-     * Deserializes a short at the given offset.
-     */
-    public short readShort(int offset) {
-        validateBufferSize(offset, 2);
-        return mMessage.getData().getShort(mBaseOffset + offset);
-    }
-
-    /**
-     * Deserializes an int at the given offset.
-     */
-    public int readInt(int offset) {
-        validateBufferSize(offset, 4);
-        return mMessage.getData().getInt(mBaseOffset + offset);
-    }
-
-    /**
-     * Deserializes a float at the given offset.
-     */
-    public float readFloat(int offset) {
-        validateBufferSize(offset, 4);
-        return mMessage.getData().getFloat(mBaseOffset + offset);
-    }
-
-    /**
-     * Deserializes a long at the given offset.
-     */
-    public long readLong(int offset) {
-        validateBufferSize(offset, 8);
-        return mMessage.getData().getLong(mBaseOffset + offset);
-    }
-
-    /**
-     * Deserializes a double at the given offset.
-     */
-    public double readDouble(int offset) {
-        validateBufferSize(offset, 8);
-        return mMessage.getData().getDouble(mBaseOffset + offset);
-    }
-
-    /**
-     * Deserializes a pointer at the given offset. Returns a Decoder suitable to decode the content
-     * of the pointer.
-     */
-    public Decoder readPointer(int offset, boolean nullable) {
-        int basePosition = mBaseOffset + offset;
-        long pointerOffset = readLong(offset);
-        if (pointerOffset == 0) {
-            if (!nullable) {
-                throw new DeserializationException(
-                        "Trying to decode null pointer for a non-nullable type.");
-            }
-            return null;
-        }
-        int newPosition = (int) (basePosition + pointerOffset);
-        // The method |getDecoderAtPosition| will validate that the pointer address is valid.
-        return getDecoderAtPosition(newPosition);
-
-    }
-
-    /**
-     * Deserializes an array of boolean at the given offset.
-     */
-    public boolean[] readBooleans(int offset, int arrayNullability, int expectedLength) {
-        Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
-        if (d == null) {
-            return null;
-        }
-        DataHeader si = d.readDataHeaderForBooleanArray(expectedLength);
-        byte[] bytes = new byte[(si.elementsOrVersion + 7) / BindingsHelper.ALIGNMENT];
-        d.mMessage.getData().position(d.mBaseOffset + DataHeader.HEADER_SIZE);
-        d.mMessage.getData().get(bytes);
-        boolean[] result = new boolean[si.elementsOrVersion];
-        for (int i = 0; i < bytes.length; ++i) {
-            for (int j = 0; j < BindingsHelper.ALIGNMENT; ++j) {
-                int booleanIndex = i * BindingsHelper.ALIGNMENT + j;
-                if (booleanIndex < result.length) {
-                    result[booleanIndex] = (bytes[i] & (1 << j)) != 0;
-                }
-            }
-        }
-        return result;
-    }
-
-    /**
-     * Deserializes an array of bytes at the given offset.
-     */
-    public byte[] readBytes(int offset, int arrayNullability, int expectedLength) {
-        Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
-        if (d == null) {
-            return null;
-        }
-        DataHeader si = d.readDataHeaderForArray(1, expectedLength);
-        byte[] result = new byte[si.elementsOrVersion];
-        d.mMessage.getData().position(d.mBaseOffset + DataHeader.HEADER_SIZE);
-        d.mMessage.getData().get(result);
-        return result;
-    }
-
-    /**
-     * Deserializes an array of shorts at the given offset.
-     */
-    public short[] readShorts(int offset, int arrayNullability, int expectedLength) {
-        Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
-        if (d == null) {
-            return null;
-        }
-        DataHeader si = d.readDataHeaderForArray(2, expectedLength);
-        short[] result = new short[si.elementsOrVersion];
-        d.mMessage.getData().position(d.mBaseOffset + DataHeader.HEADER_SIZE);
-        d.mMessage.getData().asShortBuffer().get(result);
-        return result;
-    }
-
-    /**
-     * Deserializes an array of ints at the given offset.
-     */
-    public int[] readInts(int offset, int arrayNullability, int expectedLength) {
-        Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
-        if (d == null) {
-            return null;
-        }
-        DataHeader si = d.readDataHeaderForArray(4, expectedLength);
-        int[] result = new int[si.elementsOrVersion];
-        d.mMessage.getData().position(d.mBaseOffset + DataHeader.HEADER_SIZE);
-        d.mMessage.getData().asIntBuffer().get(result);
-        return result;
-    }
-
-    /**
-     * Deserializes an array of floats at the given offset.
-     */
-    public float[] readFloats(int offset, int arrayNullability, int expectedLength) {
-        Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
-        if (d == null) {
-            return null;
-        }
-        DataHeader si = d.readDataHeaderForArray(4, expectedLength);
-        float[] result = new float[si.elementsOrVersion];
-        d.mMessage.getData().position(d.mBaseOffset + DataHeader.HEADER_SIZE);
-        d.mMessage.getData().asFloatBuffer().get(result);
-        return result;
-    }
-
-    /**
-     * Deserializes an array of longs at the given offset.
-     */
-    public long[] readLongs(int offset, int arrayNullability, int expectedLength) {
-        Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
-        if (d == null) {
-            return null;
-        }
-        DataHeader si = d.readDataHeaderForArray(8, expectedLength);
-        long[] result = new long[si.elementsOrVersion];
-        d.mMessage.getData().position(d.mBaseOffset + DataHeader.HEADER_SIZE);
-        d.mMessage.getData().asLongBuffer().get(result);
-        return result;
-    }
-
-    /**
-     * Deserializes an array of doubles at the given offset.
-     */
-    public double[] readDoubles(int offset, int arrayNullability, int expectedLength) {
-        Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
-        if (d == null) {
-            return null;
-        }
-        DataHeader si = d.readDataHeaderForArray(8, expectedLength);
-        double[] result = new double[si.elementsOrVersion];
-        d.mMessage.getData().position(d.mBaseOffset + DataHeader.HEADER_SIZE);
-        d.mMessage.getData().asDoubleBuffer().get(result);
-        return result;
-    }
-
-    /**
-     * Deserializes an |Handle| at the given offset.
-     */
-    public Handle readHandle(int offset, boolean nullable) {
-        int index = readInt(offset);
-        if (index == -1) {
-            if (!nullable) {
-                throw new DeserializationException(
-                        "Trying to decode an invalid handle for a non-nullable type.");
-            }
-            return InvalidHandle.INSTANCE;
-        }
-        mValidator.claimHandle(index);
-        return mMessage.getHandles().get(index);
-    }
-
-    /**
-     * Deserializes an |UntypedHandle| at the given offset.
-     */
-    public UntypedHandle readUntypedHandle(int offset, boolean nullable) {
-        return readHandle(offset, nullable).toUntypedHandle();
-    }
-
-    /**
-     * Deserializes a |ConsumerHandle| at the given offset.
-     */
-    public DataPipe.ConsumerHandle readConsumerHandle(int offset, boolean nullable) {
-        return readUntypedHandle(offset, nullable).toDataPipeConsumerHandle();
-    }
-
-    /**
-     * Deserializes a |ProducerHandle| at the given offset.
-     */
-    public DataPipe.ProducerHandle readProducerHandle(int offset, boolean nullable) {
-        return readUntypedHandle(offset, nullable).toDataPipeProducerHandle();
-    }
-
-    /**
-     * Deserializes a |MessagePipeHandle| at the given offset.
-     */
-    public MessagePipeHandle readMessagePipeHandle(int offset, boolean nullable) {
-        return readUntypedHandle(offset, nullable).toMessagePipeHandle();
-    }
-
-    /**
-     * Deserializes a |SharedBufferHandle| at the given offset.
-     */
-    public SharedBufferHandle readSharedBufferHandle(int offset, boolean nullable) {
-        return readUntypedHandle(offset, nullable).toSharedBufferHandle();
-    }
-
-    /**
-     * Deserializes an interface at the given offset.
-     *
-     * @return a proxy to the service.
-     */
-    public <P extends Proxy> P readServiceInterface(int offset, boolean nullable,
-            Interface.Manager<?, P> manager) {
-        MessagePipeHandle handle = readMessagePipeHandle(offset, nullable);
-        if (!handle.isValid()) {
-            return null;
-        }
-        int version = readInt(offset + BindingsHelper.SERIALIZED_HANDLE_SIZE);
-        return manager.attachProxy(handle, version);
-    }
-
-    /**
-     * Deserializes a |InterfaceRequest| at the given offset.
-     */
-    public <I extends Interface> InterfaceRequest<I> readInterfaceRequest(int offset,
-            boolean nullable) {
-        MessagePipeHandle handle = readMessagePipeHandle(offset, nullable);
-        if (handle == null) {
-            return null;
-        }
-        return new InterfaceRequest<I>(handle);
-    }
-
-    /**
-     * Deserializes an associated interface at the given offset. Not yet supported.
-     */
-    public AssociatedInterfaceNotSupported readAssociatedServiceInterfaceNotSupported(int offset,
-            boolean nullable) {
-        return null;
-    }
-
-    /**
-     * Deserializes an associated interface request at the given offset. Not yet supported.
-     */
-    public AssociatedInterfaceRequestNotSupported readAssociatedInterfaceRequestNotSupported(
-            int offset, boolean nullable) {
-        return null;
-    }
-
-    /**
-     * Deserializes a string at the given offset.
-     */
-    public String readString(int offset, boolean nullable) {
-        final int arrayNullability = nullable ? BindingsHelper.ARRAY_NULLABLE : 0;
-        byte[] bytes = readBytes(offset, arrayNullability, BindingsHelper.UNSPECIFIED_ARRAY_LENGTH);
-        if (bytes == null) {
-            return null;
-        }
-        return new String(bytes, Charset.forName("utf8"));
-    }
-
-    /**
-     * Deserializes an array of |Handle| at the given offset.
-     */
-    public Handle[] readHandles(int offset, int arrayNullability, int expectedLength) {
-        Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
-        if (d == null) {
-            return null;
-        }
-        DataHeader si = d.readDataHeaderForArray(4, expectedLength);
-        Handle[] result = new Handle[si.elementsOrVersion];
-        for (int i = 0; i < result.length; ++i) {
-            result[i] = d.readHandle(
-                    DataHeader.HEADER_SIZE + BindingsHelper.SERIALIZED_HANDLE_SIZE * i,
-                    BindingsHelper.isElementNullable(arrayNullability));
-        }
-        return result;
-    }
-
-    /**
-     * Deserializes an array of |UntypedHandle| at the given offset.
-     */
-    public UntypedHandle[] readUntypedHandles(
-            int offset, int arrayNullability, int expectedLength) {
-        Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
-        if (d == null) {
-            return null;
-        }
-        DataHeader si = d.readDataHeaderForArray(4, expectedLength);
-        UntypedHandle[] result = new UntypedHandle[si.elementsOrVersion];
-        for (int i = 0; i < result.length; ++i) {
-            result[i] = d.readUntypedHandle(
-                    DataHeader.HEADER_SIZE + BindingsHelper.SERIALIZED_HANDLE_SIZE * i,
-                    BindingsHelper.isElementNullable(arrayNullability));
-        }
-        return result;
-    }
-
-    /**
-     * Deserializes an array of |ConsumerHandle| at the given offset.
-     */
-    public DataPipe.ConsumerHandle[] readConsumerHandles(
-            int offset, int arrayNullability, int expectedLength) {
-        Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
-        if (d == null) {
-            return null;
-        }
-        DataHeader si = d.readDataHeaderForArray(4, expectedLength);
-        DataPipe.ConsumerHandle[] result = new DataPipe.ConsumerHandle[si.elementsOrVersion];
-        for (int i = 0; i < result.length; ++i) {
-            result[i] = d.readConsumerHandle(
-                    DataHeader.HEADER_SIZE + BindingsHelper.SERIALIZED_HANDLE_SIZE * i,
-                    BindingsHelper.isElementNullable(arrayNullability));
-        }
-        return result;
-    }
-
-    /**
-     * Deserializes an array of |ProducerHandle| at the given offset.
-     */
-    public DataPipe.ProducerHandle[] readProducerHandles(
-            int offset, int arrayNullability, int expectedLength) {
-        Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
-        if (d == null) {
-            return null;
-        }
-        DataHeader si = d.readDataHeaderForArray(4, expectedLength);
-        DataPipe.ProducerHandle[] result = new DataPipe.ProducerHandle[si.elementsOrVersion];
-        for (int i = 0; i < result.length; ++i) {
-            result[i] = d.readProducerHandle(
-                    DataHeader.HEADER_SIZE + BindingsHelper.SERIALIZED_HANDLE_SIZE * i,
-                    BindingsHelper.isElementNullable(arrayNullability));
-        }
-        return result;
-
-    }
-
-    /**
-     * Deserializes an array of |MessagePipeHandle| at the given offset.
-     */
-    public MessagePipeHandle[] readMessagePipeHandles(
-            int offset, int arrayNullability, int expectedLength) {
-        Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
-        if (d == null) {
-            return null;
-        }
-        DataHeader si = d.readDataHeaderForArray(4, expectedLength);
-        MessagePipeHandle[] result = new MessagePipeHandle[si.elementsOrVersion];
-        for (int i = 0; i < result.length; ++i) {
-            result[i] = d.readMessagePipeHandle(
-                    DataHeader.HEADER_SIZE + BindingsHelper.SERIALIZED_HANDLE_SIZE * i,
-                    BindingsHelper.isElementNullable(arrayNullability));
-        }
-        return result;
-
-    }
-
-    /**
-     * Deserializes an array of |SharedBufferHandle| at the given offset.
-     */
-    public SharedBufferHandle[] readSharedBufferHandles(
-            int offset, int arrayNullability, int expectedLength) {
-        Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
-        if (d == null) {
-            return null;
-        }
-        DataHeader si = d.readDataHeaderForArray(4, expectedLength);
-        SharedBufferHandle[] result = new SharedBufferHandle[si.elementsOrVersion];
-        for (int i = 0; i < result.length; ++i) {
-            result[i] = d.readSharedBufferHandle(
-                    DataHeader.HEADER_SIZE + BindingsHelper.SERIALIZED_HANDLE_SIZE * i,
-                    BindingsHelper.isElementNullable(arrayNullability));
-        }
-        return result;
-
-    }
-
-    /**
-     * Deserializes an array of |ServiceHandle| at the given offset.
-     */
-    public <S extends Interface, P extends Proxy> S[] readServiceInterfaces(
-            int offset, int arrayNullability, int expectedLength, Interface.Manager<S, P> manager) {
-        Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
-        if (d == null) {
-            return null;
-        }
-        DataHeader si =
-                d.readDataHeaderForArray(BindingsHelper.SERIALIZED_INTERFACE_SIZE, expectedLength);
-        S[] result = manager.buildArray(si.elementsOrVersion);
-        for (int i = 0; i < result.length; ++i) {
-            // This cast is necessary because java 6 doesn't handle wildcard correctly when using
-            // Manager<S, ? extends S>
-            @SuppressWarnings("unchecked")
-            S value = (S) d.readServiceInterface(
-                    DataHeader.HEADER_SIZE + BindingsHelper.SERIALIZED_INTERFACE_SIZE * i,
-                    BindingsHelper.isElementNullable(arrayNullability), manager);
-            result[i] = value;
-        }
-        return result;
-    }
-
-    /**
-     * Deserializes an array of |InterfaceRequest| at the given offset.
-     */
-    public <I extends Interface> InterfaceRequest<I>[] readInterfaceRequests(
-            int offset, int arrayNullability, int expectedLength) {
-        Decoder d = readPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
-        if (d == null) {
-            return null;
-        }
-        DataHeader si = d.readDataHeaderForArray(4, expectedLength);
-        @SuppressWarnings("unchecked")
-        InterfaceRequest<I>[] result = new InterfaceRequest[si.elementsOrVersion];
-        for (int i = 0; i < result.length; ++i) {
-            result[i] = d.readInterfaceRequest(
-                    DataHeader.HEADER_SIZE + BindingsHelper.SERIALIZED_HANDLE_SIZE * i,
-                    BindingsHelper.isElementNullable(arrayNullability));
-        }
-        return result;
-    }
-
-    /**
-     * Deserializes an array of associated interfaces at the given offset. Not yet supported.
-     */
-    public AssociatedInterfaceNotSupported[] readAssociatedServiceInterfaceNotSupporteds(
-            int offset, int arrayNullability, int expectedLength) {
-        return null;
-    }
-
-    /**
-     * Deserializes an array of associated interface requests at the given offset. Not yet
-     * supported.
-     */
-    public AssociatedInterfaceRequestNotSupported[] readAssociatedInterfaceRequestNotSupporteds(
-            int offset, int arrayNullability, int expectedLength) {
-        return null;
-    }
-
-    /**
-     * Returns a view of this decoder at the offset |offset|.
-     */
-    private Decoder getDecoderAtPosition(int offset) {
-        return new Decoder(mMessage, mValidator, offset);
-    }
-
-    /**
-     * Deserializes a {@link DataHeader} at the given offset and checks if it is correct for an
-     * array of booleans.
-     */
-    private DataHeader readDataHeaderForBooleanArray(int expectedLength) {
-        DataHeader dataHeader = readDataHeader();
-        if (dataHeader.size < DataHeader.HEADER_SIZE + (dataHeader.elementsOrVersion + 7) / 8) {
-            throw new DeserializationException("Array header is incorrect.");
-        }
-        if (expectedLength != BindingsHelper.UNSPECIFIED_ARRAY_LENGTH
-                && dataHeader.elementsOrVersion != expectedLength) {
-            throw new DeserializationException("Incorrect array length. Expected: " + expectedLength
-                    + ", but got: " + dataHeader.elementsOrVersion + ".");
-        }
-        return dataHeader;
-    }
-
-    /**
-     * Deserializes a {@link DataHeader} of an array at the given offset.
-     */
-    private DataHeader readDataHeaderForArray(long elementSize, int expectedLength) {
-        DataHeader dataHeader = readDataHeader();
-        if (dataHeader.size
-                < (DataHeader.HEADER_SIZE + elementSize * dataHeader.elementsOrVersion)) {
-            throw new DeserializationException("Array header is incorrect.");
-        }
-        if (expectedLength != BindingsHelper.UNSPECIFIED_ARRAY_LENGTH
-                && dataHeader.elementsOrVersion != expectedLength) {
-            throw new DeserializationException("Incorrect array length. Expected: " + expectedLength
-                    + ", but got: " + dataHeader.elementsOrVersion + ".");
-        }
-        return dataHeader;
-    }
-
-    private void validateBufferSize(int offset, int size) {
-        if (mMessage.getData().limit() < offset + size) {
-            throw new DeserializationException("Buffer is smaller than expected.");
-        }
-    }
-
-    public void increaseStackDepth() {
-        mValidator.increaseStackDepth();
-    }
-
-    public void decreaseStackDepth() {
-        mValidator.decreaseStackDepth();
-    }
-}
diff --git a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/DelegatingConnectionErrorHandler.java b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/DelegatingConnectionErrorHandler.java
deleted file mode 100644
index 2ee2ae7..0000000
--- a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/DelegatingConnectionErrorHandler.java
+++ /dev/null
@@ -1,49 +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.
-
-package org.chromium.mojo.bindings;
-
-import org.chromium.mojo.system.MojoException;
-
-import java.util.Collections;
-import java.util.Set;
-import java.util.WeakHashMap;
-
-/**
- * A {@link ConnectionErrorHandler} that delegate the errors to a list of registered handlers. This
- * class will use weak pointers to prevent keeping references to any handlers it delegates to.
- */
-public class DelegatingConnectionErrorHandler implements ConnectionErrorHandler {
-
-    /**
-     * The registered handlers. This uses a {@link WeakHashMap} so that it doesn't prevent the
-     * handler from being garbage collected.
-     */
-    private final Set<ConnectionErrorHandler> mHandlers =
-            Collections.newSetFromMap(new WeakHashMap<ConnectionErrorHandler, Boolean>());
-
-    /**
-     * @see ConnectionErrorHandler#onConnectionError(MojoException)
-     */
-    @Override
-    public void onConnectionError(MojoException e) {
-        for (ConnectionErrorHandler handler : mHandlers) {
-            handler.onConnectionError(e);
-        }
-    }
-
-    /**
-     * Add a handler that will be notified of any error this object receives.
-     */
-    public void addConnectionErrorHandler(ConnectionErrorHandler handler) {
-        mHandlers.add(handler);
-    }
-
-    /**
-     * Remove a previously registered handler.
-     */
-    public void removeConnectionErrorHandler(ConnectionErrorHandler handler) {
-        mHandlers.remove(handler);
-    }
-}
diff --git a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/DeserializationException.java b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/DeserializationException.java
deleted file mode 100644
index eeb511c..0000000
--- a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/DeserializationException.java
+++ /dev/null
@@ -1,26 +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.
-
-package org.chromium.mojo.bindings;
-
-/**
- * Error when deserializing a mojo message.
- */
-public class DeserializationException extends RuntimeException {
-
-    /**
-     * Constructs a new deserialization exception with the specified detail message.
-     */
-    public DeserializationException(String message) {
-        super(message);
-    }
-
-    /**
-     * Constructs a new deserialization exception with the specified cause.
-     */
-    public DeserializationException(Exception cause) {
-        super(cause);
-    }
-
-}
diff --git a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Encoder.java b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Encoder.java
deleted file mode 100644
index 3c86a8d..0000000
--- a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Encoder.java
+++ /dev/null
@@ -1,587 +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.
-
-package org.chromium.mojo.bindings;
-
-import org.chromium.mojo.bindings.Interface.Proxy.Handler;
-import org.chromium.mojo.system.Core;
-import org.chromium.mojo.system.Handle;
-import org.chromium.mojo.system.MessagePipeHandle;
-import org.chromium.mojo.system.Pair;
-
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import java.nio.charset.Charset;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Helper class to encode a mojo struct. It keeps track of the output buffer, resizing it as needed.
- * It also keeps track of the associated handles, and the offset of the current data section.
- */
-public class Encoder {
-
-    /**
-     * Container class for all state that must be shared between the main encoder and any used sub
-     * encoder.
-     */
-    private static class EncoderState {
-
-        /**
-         * The core used to encode interfaces.
-         */
-        public final Core core;
-
-        /**
-         * The ByteBuffer to which the message will be encoded.
-         */
-        public ByteBuffer byteBuffer;
-
-        /**
-         * The list of encountered handles.
-         */
-        public final List<Handle> handles = new ArrayList<Handle>();
-
-        /**
-         * The current absolute position for the next data section.
-         */
-        public int dataEnd;
-
-        /**
-         * @param core the |Core| implementation used to generate handles. Only used if the data
-         *            structure being encoded contains interfaces, can be |null| otherwise.
-         * @param bufferSize A hint on the size of the message. Used to build the initial byte
-         *            buffer.
-         */
-        private EncoderState(Core core, int bufferSize) {
-            assert bufferSize % BindingsHelper.ALIGNMENT == 0;
-            this.core = core;
-            byteBuffer = ByteBuffer.allocateDirect(
-                    bufferSize > 0 ? bufferSize : INITIAL_BUFFER_SIZE);
-            byteBuffer.order(ByteOrder.LITTLE_ENDIAN);
-            dataEnd = 0;
-        }
-
-        /**
-         * Claim the given amount of memory at the end of the buffer, resizing it if needed.
-         */
-        public void claimMemory(int size) {
-            dataEnd += size;
-            growIfNeeded();
-        }
-
-        /**
-         * Grow the associated ByteBuffer if needed.
-         */
-        private void growIfNeeded() {
-            if (byteBuffer.capacity() >= dataEnd) {
-                return;
-            }
-            int targetSize = byteBuffer.capacity() * 2;
-            while (targetSize < dataEnd) {
-                targetSize *= 2;
-            }
-            ByteBuffer newBuffer = ByteBuffer.allocateDirect(targetSize);
-            newBuffer.order(ByteOrder.nativeOrder());
-            byteBuffer.position(0);
-            byteBuffer.limit(byteBuffer.capacity());
-            newBuffer.put(byteBuffer);
-            byteBuffer = newBuffer;
-        }
-    }
-
-    /**
-     * Default initial size of the data buffer. This must be a multiple of 8 bytes.
-     */
-    private static final int INITIAL_BUFFER_SIZE = 1024;
-
-    /**
-     * Base offset in the byte buffer for writing.
-     */
-    private int mBaseOffset;
-
-    /**
-     * The encoder state shared by the main encoder and all its sub-encoder.
-     */
-    private final EncoderState mEncoderState;
-
-    /**
-     * Returns the result message.
-     */
-    public Message getMessage() {
-        mEncoderState.byteBuffer.position(0);
-        mEncoderState.byteBuffer.limit(mEncoderState.dataEnd);
-        return new Message(mEncoderState.byteBuffer, mEncoderState.handles);
-    }
-
-    /**
-     * Constructor.
-     *
-     * @param core the |Core| implementation used to generate handles. Only used if the data
-     *            structure being encoded contains interfaces, can be |null| otherwise.
-     * @param sizeHint A hint on the size of the message. Used to build the initial byte buffer.
-     */
-    public Encoder(Core core, int sizeHint) {
-        this(new EncoderState(core, sizeHint));
-    }
-
-    /**
-     * Private constructor for sub-encoders.
-     */
-    private Encoder(EncoderState bufferInformation) {
-        mEncoderState = bufferInformation;
-        mBaseOffset = bufferInformation.dataEnd;
-    }
-
-    /**
-     * Returns a new encoder that will append to the current buffer.
-     */
-    public Encoder getEncoderAtDataOffset(DataHeader dataHeader) {
-        Encoder result = new Encoder(mEncoderState);
-        result.encode(dataHeader);
-        return result;
-    }
-
-    /**
-     * Encode a {@link DataHeader} and claim the amount of memory required for the data section
-     * (resizing the buffer if required).
-     */
-    public void encode(DataHeader s) {
-        mEncoderState.claimMemory(BindingsHelper.align(s.size));
-        encode(s.size, DataHeader.SIZE_OFFSET);
-        encode(s.elementsOrVersion, DataHeader.ELEMENTS_OR_VERSION_OFFSET);
-    }
-
-    /**
-     * Encode a byte at the given offset.
-     */
-    public void encode(byte v, int offset) {
-        mEncoderState.byteBuffer.put(mBaseOffset + offset, v);
-    }
-
-    /**
-     * Encode a boolean at the given offset.
-     */
-    public void encode(boolean v, int offset, int bit) {
-        if (v) {
-            byte encodedValue = mEncoderState.byteBuffer.get(mBaseOffset + offset);
-            encodedValue |= (byte) (1 << bit);
-            mEncoderState.byteBuffer.put(mBaseOffset + offset, encodedValue);
-        }
-    }
-
-    /**
-     * Encode a short at the given offset.
-     */
-    public void encode(short v, int offset) {
-        mEncoderState.byteBuffer.putShort(mBaseOffset + offset, v);
-    }
-
-    /**
-     * Encode an int at the given offset.
-     */
-    public void encode(int v, int offset) {
-        mEncoderState.byteBuffer.putInt(mBaseOffset + offset, v);
-    }
-
-    /**
-     * Encode a float at the given offset.
-     */
-    public void encode(float v, int offset) {
-        mEncoderState.byteBuffer.putFloat(mBaseOffset + offset, v);
-    }
-
-    /**
-     * Encode a long at the given offset.
-     */
-    public void encode(long v, int offset) {
-        mEncoderState.byteBuffer.putLong(mBaseOffset + offset, v);
-    }
-
-    /**
-     * Encode a double at the given offset.
-     */
-    public void encode(double v, int offset) {
-        mEncoderState.byteBuffer.putDouble(mBaseOffset + offset, v);
-    }
-
-    /**
-     * Encode a {@link Struct} at the given offset.
-     */
-    public void encode(Struct v, int offset, boolean nullable) {
-        if (v == null) {
-            encodeNullPointer(offset, nullable);
-            return;
-        }
-        encodePointerToNextUnclaimedData(offset);
-        v.encode(this);
-    }
-
-    /**
-     * Encode a {@link Union} at the given offset.
-     */
-    public void encode(Union v, int offset, boolean nullable) {
-        if (v == null && !nullable) {
-            throw new SerializationException(
-                    "Trying to encode a null pointer for a non-nullable type.");
-        }
-        if (v == null) {
-            encode(0L, offset);
-            encode(0L, offset + DataHeader.HEADER_SIZE);
-            return;
-        }
-        v.encode(this, offset);
-    }
-
-    /**
-     * Encodes a String.
-     */
-    public void encode(String v, int offset, boolean nullable) {
-        if (v == null) {
-            encodeNullPointer(offset, nullable);
-            return;
-        }
-        final int arrayNullability = nullable
-                ? BindingsHelper.ARRAY_NULLABLE : BindingsHelper.NOTHING_NULLABLE;
-        encode(v.getBytes(Charset.forName("utf8")), offset, arrayNullability,
-                BindingsHelper.UNSPECIFIED_ARRAY_LENGTH);
-    }
-
-    /**
-     * Encodes a {@link Handle}.
-     */
-    public void encode(Handle v, int offset, boolean nullable) {
-        if (v == null || !v.isValid()) {
-            encodeInvalidHandle(offset, nullable);
-        } else {
-            encode(mEncoderState.handles.size(), offset);
-            mEncoderState.handles.add(v);
-        }
-    }
-
-    /**
-     * Encode an {@link Interface}.
-     */
-    public <T extends Interface> void encode(T v, int offset, boolean nullable,
-            Interface.Manager<T, ?> manager) {
-        if (v == null) {
-            encodeInvalidHandle(offset, nullable);
-            encode(0, offset + BindingsHelper.SERIALIZED_HANDLE_SIZE);
-            return;
-        }
-        if (mEncoderState.core == null) {
-            throw new UnsupportedOperationException(
-                    "The encoder has been created without a Core. It can't encode an interface.");
-        }
-        // If the instance is a proxy, pass the proxy's handle instead of creating a new stub.
-        if (v instanceof Interface.Proxy) {
-            Handler handler = ((Interface.Proxy) v).getProxyHandler();
-            encode(handler.passHandle(), offset, nullable);
-            encode(handler.getVersion(), offset + BindingsHelper.SERIALIZED_HANDLE_SIZE);
-            return;
-        }
-        Pair<MessagePipeHandle, MessagePipeHandle> handles =
-                mEncoderState.core.createMessagePipe(null);
-        manager.bind(v, handles.first);
-        encode(handles.second, offset, nullable);
-        encode(manager.getVersion(), offset + BindingsHelper.SERIALIZED_HANDLE_SIZE);
-    }
-
-    /**
-     * Encode an {@link InterfaceRequest}.
-     */
-    public <I extends Interface> void encode(InterfaceRequest<I> v, int offset, boolean nullable) {
-        if (v == null) {
-            encodeInvalidHandle(offset, nullable);
-            return;
-        }
-        if (mEncoderState.core == null) {
-            throw new UnsupportedOperationException(
-                    "The encoder has been created without a Core. It can't encode an interface.");
-        }
-        encode(v.passHandle(), offset, nullable);
-    }
-
-    /**
-     * Encode an associated interface. Not yet supported.
-     */
-    public void encode(AssociatedInterfaceNotSupported v, int offset, boolean nullable) {
-    }
-
-    /**
-     * Encode an associated interface request. Not yet supported.
-     */
-    public void encode(AssociatedInterfaceRequestNotSupported v, int offset, boolean nullable) {
-    }
-
-    /**
-     * Returns an {@link Encoder} suitable for encoding an array of pointer of the given length.
-     */
-    public Encoder encodePointerArray(int length, int offset, int expectedLength) {
-        return encoderForArray(BindingsHelper.POINTER_SIZE, length, offset, expectedLength);
-    }
-
-    /**
-     * Returns an {@link Encoder} suitable for encoding an array of union of the given length.
-     */
-    public Encoder encodeUnionArray(int length, int offset, int expectedLength) {
-        return encoderForArray(BindingsHelper.UNION_SIZE, length, offset, expectedLength);
-    }
-
-    /**
-     * Encodes an array of booleans.
-     */
-    public void encode(boolean[] v, int offset, int arrayNullability, int expectedLength) {
-        if (v == null) {
-            encodeNullPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
-            return;
-        }
-        if (expectedLength != BindingsHelper.UNSPECIFIED_ARRAY_LENGTH
-                && expectedLength != v.length) {
-            throw new SerializationException("Trying to encode a fixed array of incorrect length.");
-        }
-        byte[] bytes = new byte[(v.length + 7) / BindingsHelper.ALIGNMENT];
-        for (int i = 0; i < bytes.length; ++i) {
-            for (int j = 0; j < BindingsHelper.ALIGNMENT; ++j) {
-                int booleanIndex = BindingsHelper.ALIGNMENT * i + j;
-                if (booleanIndex < v.length && v[booleanIndex]) {
-                    bytes[i] |= (byte) (1 << j);
-                }
-            }
-        }
-        encodeByteArray(bytes, v.length, offset);
-    }
-
-    /**
-     * Encodes an array of bytes.
-     */
-    public void encode(byte[] v, int offset, int arrayNullability, int expectedLength) {
-        if (v == null) {
-            encodeNullPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
-            return;
-        }
-        if (expectedLength != BindingsHelper.UNSPECIFIED_ARRAY_LENGTH
-                && expectedLength != v.length) {
-            throw new SerializationException("Trying to encode a fixed array of incorrect length.");
-        }
-        encodeByteArray(v, v.length, offset);
-    }
-
-    /**
-     * Encodes an array of shorts.
-     */
-    public void encode(short[] v, int offset, int arrayNullability, int expectedLength) {
-        if (v == null) {
-            encodeNullPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
-            return;
-        }
-        encoderForArray(2, v.length, offset, expectedLength).append(v);
-    }
-
-    /**
-     * Encodes an array of ints.
-     */
-    public void encode(int[] v, int offset, int arrayNullability, int expectedLength) {
-        if (v == null) {
-            encodeNullPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
-            return;
-        }
-        encoderForArray(4, v.length, offset, expectedLength).append(v);
-    }
-
-    /**
-     * Encodes an array of floats.
-     */
-    public void encode(float[] v, int offset, int arrayNullability, int expectedLength) {
-        if (v == null) {
-            encodeNullPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
-            return;
-        }
-        encoderForArray(4, v.length, offset, expectedLength).append(v);
-    }
-
-    /**
-     * Encodes an array of longs.
-     */
-    public void encode(long[] v, int offset, int arrayNullability, int expectedLength) {
-        if (v == null) {
-            encodeNullPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
-            return;
-        }
-        encoderForArray(8, v.length, offset, expectedLength).append(v);
-    }
-
-    /**
-     * Encodes an array of doubles.
-     */
-    public void encode(double[] v, int offset, int arrayNullability, int expectedLength) {
-        if (v == null) {
-            encodeNullPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
-            return;
-        }
-        encoderForArray(8, v.length, offset, expectedLength).append(v);
-    }
-
-    /**
-     * Encodes an array of {@link Handle}.
-     */
-    public void encode(Handle[] v, int offset, int arrayNullability, int expectedLength) {
-        if (v == null) {
-            encodeNullPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
-            return;
-        }
-        Encoder e = encoderForArray(
-                BindingsHelper.SERIALIZED_HANDLE_SIZE, v.length, offset, expectedLength);
-        for (int i = 0; i < v.length; ++i) {
-            e.encode(v[i], DataHeader.HEADER_SIZE + BindingsHelper.SERIALIZED_HANDLE_SIZE * i,
-                    BindingsHelper.isElementNullable(arrayNullability));
-        }
-    }
-
-    /**
-     * Encodes an array of {@link Interface}.
-     */
-    public <T extends Interface> void encode(T[] v, int offset, int arrayNullability,
-            int expectedLength, Interface.Manager<T, ?> manager) {
-        if (v == null) {
-            encodeNullPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
-            return;
-        }
-        Encoder e = encoderForArray(
-                BindingsHelper.SERIALIZED_INTERFACE_SIZE, v.length, offset, expectedLength);
-        for (int i = 0; i < v.length; ++i) {
-            e.encode(v[i], DataHeader.HEADER_SIZE + BindingsHelper.SERIALIZED_INTERFACE_SIZE * i,
-                    BindingsHelper.isElementNullable(arrayNullability), manager);
-        }
-    }
-
-    public Encoder encoderForMap(int offset) {
-        encodePointerToNextUnclaimedData(offset);
-        return getEncoderAtDataOffset(BindingsHelper.MAP_STRUCT_HEADER);
-    }
-
-    /**
-     * Encodes a pointer to the next unclaimed memory and returns an encoder suitable to encode an
-     * union at this location.
-     */
-    public Encoder encoderForUnionPointer(int offset) {
-        encodePointerToNextUnclaimedData(offset);
-        Encoder result = new Encoder(mEncoderState);
-        result.mEncoderState.claimMemory(16);
-        return result;
-    }
-
-    /**
-     * Encodes an array of {@link InterfaceRequest}.
-     */
-    public <I extends Interface> void encode(InterfaceRequest<I>[] v, int offset,
-            int arrayNullability, int expectedLength) {
-        if (v == null) {
-            encodeNullPointer(offset, BindingsHelper.isArrayNullable(arrayNullability));
-            return;
-        }
-        Encoder e = encoderForArray(
-                BindingsHelper.SERIALIZED_HANDLE_SIZE, v.length, offset, expectedLength);
-        for (int i = 0; i < v.length; ++i) {
-            e.encode(v[i], DataHeader.HEADER_SIZE + BindingsHelper.SERIALIZED_HANDLE_SIZE * i,
-                    BindingsHelper.isElementNullable(arrayNullability));
-        }
-    }
-
-    /**
-     * Encodes an array of associated interfaces. Not yet supported.
-     */
-    public void encode(AssociatedInterfaceNotSupported[] v, int offset, int arrayNullability,
-            int expectedLength) {}
-
-    /**
-     * Encodes an array of associated interface requests. Not yet supported.
-     */
-    public void encode(AssociatedInterfaceRequestNotSupported[] v, int offset, int arrayNullability,
-            int expectedLength) {}
-
-    /**
-     * Encodes a <code>null</code> pointer iff the object is nullable, raises an exception
-     * otherwise.
-     */
-    public void encodeNullPointer(int offset, boolean nullable) {
-        if (!nullable) {
-            throw new SerializationException(
-                    "Trying to encode a null pointer for a non-nullable type.");
-        }
-        mEncoderState.byteBuffer.putLong(mBaseOffset + offset, 0);
-    }
-
-    /**
-     * Encodes an invalid handle iff the object is nullable, raises an exception otherwise.
-     */
-    public void encodeInvalidHandle(int offset, boolean nullable) {
-        if (!nullable) {
-            throw new SerializationException(
-                    "Trying to encode an invalid handle for a non-nullable type.");
-        }
-        mEncoderState.byteBuffer.putInt(mBaseOffset + offset, -1);
-    }
-
-    /**
-     * Claim the given amount of memory at the end of the buffer, resizing it if needed.
-     */
-    void claimMemory(int size) {
-        mEncoderState.claimMemory(BindingsHelper.align(size));
-    }
-
-    private void encodePointerToNextUnclaimedData(int offset) {
-        encode((long) mEncoderState.dataEnd - (mBaseOffset + offset), offset);
-    }
-
-    private Encoder encoderForArray(
-            int elementSizeInByte, int length, int offset, int expectedLength) {
-        if (expectedLength != BindingsHelper.UNSPECIFIED_ARRAY_LENGTH
-                && expectedLength != length) {
-            throw new SerializationException("Trying to encode a fixed array of incorrect length.");
-        }
-        return encoderForArrayByTotalSize(length * elementSizeInByte, length, offset);
-    }
-
-    private Encoder encoderForArrayByTotalSize(int byteSize, int length, int offset) {
-        encodePointerToNextUnclaimedData(offset);
-        return getEncoderAtDataOffset(
-                new DataHeader(DataHeader.HEADER_SIZE + byteSize, length));
-    }
-
-    private void encodeByteArray(byte[] bytes, int length, int offset) {
-        encoderForArrayByTotalSize(bytes.length, length, offset).append(bytes);
-    }
-
-    private void append(byte[] v) {
-        mEncoderState.byteBuffer.position(mBaseOffset + DataHeader.HEADER_SIZE);
-        mEncoderState.byteBuffer.put(v);
-    }
-
-    private void append(short[] v) {
-        mEncoderState.byteBuffer.position(mBaseOffset + DataHeader.HEADER_SIZE);
-        mEncoderState.byteBuffer.asShortBuffer().put(v);
-    }
-
-    private void append(int[] v) {
-        mEncoderState.byteBuffer.position(mBaseOffset + DataHeader.HEADER_SIZE);
-        mEncoderState.byteBuffer.asIntBuffer().put(v);
-    }
-
-    private void append(float[] v) {
-        mEncoderState.byteBuffer.position(mBaseOffset + DataHeader.HEADER_SIZE);
-        mEncoderState.byteBuffer.asFloatBuffer().put(v);
-    }
-
-    private void append(double[] v) {
-        mEncoderState.byteBuffer.position(mBaseOffset + DataHeader.HEADER_SIZE);
-        mEncoderState.byteBuffer.asDoubleBuffer().put(v);
-    }
-
-    private void append(long[] v) {
-        mEncoderState.byteBuffer.position(mBaseOffset + DataHeader.HEADER_SIZE);
-        mEncoderState.byteBuffer.asLongBuffer().put(v);
-    }
-
-}
diff --git a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/ExecutorFactory.java b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/ExecutorFactory.java
deleted file mode 100644
index bb49cbc..0000000
--- a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/ExecutorFactory.java
+++ /dev/null
@@ -1,169 +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.
-
-package org.chromium.mojo.bindings;
-
-import org.chromium.mojo.system.Core;
-import org.chromium.mojo.system.MessagePipeHandle;
-import org.chromium.mojo.system.MessagePipeHandle.ReadMessageResult;
-import org.chromium.mojo.system.MojoException;
-import org.chromium.mojo.system.MojoResult;
-import org.chromium.mojo.system.Pair;
-import org.chromium.mojo.system.ResultAnd;
-import org.chromium.mojo.system.Watcher;
-import org.chromium.mojo.system.Watcher.Callback;
-
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.Executor;
-
-/**
- * A factory which provides per-thread executors, which enable execution on the thread from which
- * they were obtained.
- */
-class ExecutorFactory {
-
-    /**
-     * A null buffer which is used to send messages without any data on the PipedExecutor's
-     * signaling handles.
-     */
-    private static final ByteBuffer NOTIFY_BUFFER = null;
-
-    /**
-     * Implementation of the executor which uses a pair of {@link MessagePipeHandle} for signaling.
-     * The executor will wait asynchronously on one end of a {@link MessagePipeHandle} on the thread
-     * on which it was created. Other threads can call execute with a {@link Runnable}, and the
-     * executor will queue the {@link Runnable} and write a message on the other end of the handle.
-     * This will wake up the executor which is waiting on the handle, which will then dequeue the
-     * {@link Runnable} and execute it on the original thread.
-     */
-    private static class PipedExecutor implements Executor, Callback {
-
-        /**
-         * The handle which is written to. Access to this object must be protected with |mLock|.
-         */
-        private final MessagePipeHandle mWriteHandle;
-        /**
-         * The handle which is read from.
-         */
-        private final MessagePipeHandle mReadHandle;
-        /**
-         * The list of actions left to be run. Access to this object must be protected with |mLock|.
-         */
-        private final List<Runnable> mPendingActions;
-        /**
-         * Lock protecting access to |mWriteHandle| and |mPendingActions|.
-         */
-        private final Object mLock;
-        /**
-         * The {@link Watcher} to get notified of new message availability on |mReadHandle|.
-         */
-        private final Watcher mWatcher;
-
-        /**
-         * Constructor.
-         */
-        public PipedExecutor(Core core) {
-            mWatcher = core.getWatcher();
-            assert mWatcher != null;
-            mLock = new Object();
-            Pair<MessagePipeHandle, MessagePipeHandle> handles = core.createMessagePipe(
-                    new MessagePipeHandle.CreateOptions());
-            mReadHandle = handles.first;
-            mWriteHandle = handles.second;
-            mPendingActions = new ArrayList<Runnable>();
-            mWatcher.start(mReadHandle, Core.HandleSignals.READABLE, this);
-        }
-
-        /**
-         * @see Callback#onResult(int)
-         */
-        @Override
-        public void onResult(int result) {
-            if (result == MojoResult.OK && readNotifyBufferMessage()) {
-                runNextAction();
-            } else {
-                close();
-            }
-        }
-
-        /**
-         * Close the handles. Should only be called on the executor thread.
-         */
-        private void close() {
-            synchronized (mLock) {
-                mWriteHandle.close();
-                mPendingActions.clear();
-            }
-            mWatcher.cancel();
-            mWatcher.destroy();
-            mReadHandle.close();
-        }
-
-        /**
-         * Read the next message on |mReadHandle|, and return |true| if successful, |false|
-         * otherwise.
-         */
-        private boolean readNotifyBufferMessage() {
-            try {
-                ResultAnd<ReadMessageResult> readMessageResult =
-                        mReadHandle.readMessage(NOTIFY_BUFFER, 0, MessagePipeHandle.ReadFlags.NONE);
-                if (readMessageResult.getMojoResult() == MojoResult.OK) {
-                    return true;
-                }
-            } catch (MojoException e) {
-                // Will be closed by the fall back at the end of this method.
-            }
-            return false;
-        }
-
-        /**
-         * Run the next action in the |mPendingActions| queue.
-         */
-        private void runNextAction() {
-            Runnable toRun = null;
-            synchronized (mLock) {
-                toRun = mPendingActions.remove(0);
-            }
-            toRun.run();
-        }
-
-        /**
-         * Execute the given |command| in the executor thread. This can be called on any thread.
-         *
-         * @see Executor#execute(Runnable)
-         */
-        @Override
-        public void execute(Runnable command) {
-            // Accessing the write handle must be protected by the lock, because it can be closed
-            // from the executor's thread.
-            synchronized (mLock) {
-                if (!mWriteHandle.isValid()) {
-                    throw new IllegalStateException(
-                            "Trying to execute an action on a closed executor.");
-                }
-                mPendingActions.add(command);
-                mWriteHandle.writeMessage(NOTIFY_BUFFER, null, MessagePipeHandle.WriteFlags.NONE);
-            }
-        }
-    }
-
-    /**
-     * Keep one executor per executor thread.
-     */
-    private static final ThreadLocal<Executor> EXECUTORS = new ThreadLocal<Executor>();
-
-    /**
-     * Returns an {@link Executor} that will run all of its actions in the current thread.
-     */
-    public static Executor getExecutorForCurrentThread(Core core) {
-        Executor executor = EXECUTORS.get();
-        if (executor == null) {
-            executor = new PipedExecutor(core);
-            EXECUTORS.set(executor);
-        }
-        return executor;
-    }
-}
diff --git a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/HandleOwner.java b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/HandleOwner.java
deleted file mode 100644
index 60fc33b..0000000
--- a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/HandleOwner.java
+++ /dev/null
@@ -1,29 +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.
-
-package org.chromium.mojo.bindings;
-
-import org.chromium.mojo.system.Handle;
-
-import java.io.Closeable;
-
-/**
- * Describes a class that owns a handle.
- *
- * @param <H> The type of the owned handle.
- */
-public interface HandleOwner<H extends Handle> extends Closeable {
-
-    /**
-     * Pass the handle owned by this class.
-     */
-    public H passHandle();
-
-    /**
-     * @see java.io.Closeable#close()
-     */
-    @Override
-    public void close();
-
-}
diff --git a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Interface.java b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Interface.java
deleted file mode 100644
index 2699ab8..0000000
--- a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Interface.java
+++ /dev/null
@@ -1,425 +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.
-
-package org.chromium.mojo.bindings;
-
-import org.chromium.mojo.bindings.Callbacks.Callback1;
-import org.chromium.mojo.bindings.Interface.AbstractProxy.HandlerImpl;
-import org.chromium.mojo.bindings.interfacecontrol.QueryVersion;
-import org.chromium.mojo.bindings.interfacecontrol.RequireVersion;
-import org.chromium.mojo.bindings.interfacecontrol.RunInput;
-import org.chromium.mojo.bindings.interfacecontrol.RunMessageParams;
-import org.chromium.mojo.bindings.interfacecontrol.RunOrClosePipeInput;
-import org.chromium.mojo.bindings.interfacecontrol.RunOrClosePipeMessageParams;
-import org.chromium.mojo.bindings.interfacecontrol.RunOutput;
-import org.chromium.mojo.bindings.interfacecontrol.RunResponseMessageParams;
-import org.chromium.mojo.system.Core;
-import org.chromium.mojo.system.MessagePipeHandle;
-import org.chromium.mojo.system.MojoException;
-import org.chromium.mojo.system.Pair;
-
-import java.io.Closeable;
-
-/**
- * Base class for mojo generated interfaces.
- */
-public interface Interface extends ConnectionErrorHandler, Closeable {
-
-    /**
-     * The close method is called when the connection to the interface is closed.
-     *
-     * @see java.io.Closeable#close()
-     */
-    @Override
-    public void close();
-
-    /**
-     * A proxy to a mojo interface. This is base class for all generated proxies. It implements the
-     * Interface and each time a method is called, the parameters are serialized and sent to the
-     * {@link MessageReceiverWithResponder}, along with the response callback if needed.
-     */
-    public interface Proxy extends Interface {
-        /**
-         * Class allowing to interact with the proxy itself.
-         */
-        public interface Handler extends Closeable {
-            /**
-             * Sets the {@link ConnectionErrorHandler} that will be notified of errors.
-             */
-            public void setErrorHandler(ConnectionErrorHandler errorHandler);
-
-            /**
-             * Unbinds the proxy and passes the handle. Can return null if the proxy is not bound or
-             * if the proxy is not over a message pipe.
-             */
-            public MessagePipeHandle passHandle();
-
-            /**
-             * Returns the version number of the interface that the remote side supports.
-             */
-            public int getVersion();
-
-            /**
-             * Queries the max version that the remote side supports. On completion, the result will
-             * be returned as the input of |callback|. The version number of this interface pointer
-             * will also be updated.
-             */
-            public void queryVersion(Callback1<Integer> callback);
-
-            /**
-             * If the remote side doesn't support the specified version, it will close its end of
-             * the message pipe asynchronously. The call does nothing if |version| is no greater
-             * than getVersion().
-             * <p>
-             * If you make a call to requireVersion() with a version number X which is not supported
-             * by the remote side, it is guaranteed that all calls to the interface methods after
-             * requireVersion(X) will be ignored.
-             */
-            public void requireVersion(int version);
-        }
-
-        /**
-         * Returns the {@link Handler} object allowing to interact with the proxy itself.
-         */
-        public Handler getProxyHandler();
-    }
-
-    /**
-     * Base implementation of {@link Proxy}.
-     */
-    abstract class AbstractProxy implements Proxy {
-        /**
-         * Implementation of {@link Handler}.
-         */
-        protected static class HandlerImpl implements Proxy.Handler, ConnectionErrorHandler {
-            /**
-             * The {@link Core} implementation to use.
-             */
-            private final Core mCore;
-
-            /**
-             * The {@link MessageReceiverWithResponder} that will receive a serialized message for
-             * each method call.
-             */
-            private final MessageReceiverWithResponder mMessageReceiver;
-
-            /**
-             * The {@link ConnectionErrorHandler} that will be notified of errors.
-             */
-            private ConnectionErrorHandler mErrorHandler;
-
-            /**
-             * The currently known version of the interface.
-             */
-            private int mVersion;
-
-            /**
-             * Constructor.
-             *
-             * @param core the Core implementation used to create pipes and access the async waiter.
-             * @param messageReceiver the message receiver to send message to.
-             */
-            protected HandlerImpl(Core core, MessageReceiverWithResponder messageReceiver) {
-                this.mCore = core;
-                this.mMessageReceiver = messageReceiver;
-            }
-
-            void setVersion(int version) {
-                mVersion = version;
-            }
-
-            /**
-             * Returns the message receiver to send message to.
-             */
-            public MessageReceiverWithResponder getMessageReceiver() {
-                return mMessageReceiver;
-            }
-
-            /**
-             * Returns the Core implementation.
-             */
-            public Core getCore() {
-                return mCore;
-            }
-
-            /**
-             * Sets the {@link ConnectionErrorHandler} that will be notified of errors.
-             */
-            @Override
-            public void setErrorHandler(ConnectionErrorHandler errorHandler) {
-                this.mErrorHandler = errorHandler;
-            }
-
-            /**
-             * @see ConnectionErrorHandler#onConnectionError(MojoException)
-             */
-            @Override
-            public void onConnectionError(MojoException e) {
-                if (mErrorHandler != null) {
-                    mErrorHandler.onConnectionError(e);
-                }
-            }
-
-            /**
-             * @see Closeable#close()
-             */
-            @Override
-            public void close() {
-                mMessageReceiver.close();
-            }
-
-            /**
-             * @see Interface.Proxy.Handler#passHandle()
-             */
-            @Override
-            public MessagePipeHandle passHandle() {
-                @SuppressWarnings("unchecked")
-                HandleOwner<MessagePipeHandle> handleOwner =
-                        (HandleOwner<MessagePipeHandle>) mMessageReceiver;
-                return handleOwner.passHandle();
-            }
-
-            /**
-             * @see Handler#getVersion()
-             */
-            @Override
-            public int getVersion() {
-                return mVersion;
-            }
-
-            /**
-             * @see Handler#queryVersion(org.chromium.mojo.bindings.Callbacks.Callback1)
-             */
-            @Override
-            public void queryVersion(final Callback1<Integer> callback) {
-                RunMessageParams message = new RunMessageParams();
-                message.input = new RunInput();
-                message.input.setQueryVersion(new QueryVersion());
-
-                InterfaceControlMessagesHelper.sendRunMessage(getCore(), mMessageReceiver, message,
-                        new Callback1<RunResponseMessageParams>() {
-                            @Override
-                            public void call(RunResponseMessageParams response) {
-                                if (response.output != null
-                                        && response.output.which()
-                                                == RunOutput.Tag.QueryVersionResult) {
-                                    mVersion = response.output.getQueryVersionResult().version;
-                                }
-                                try {
-                                    callback.call(mVersion);
-                                } catch (RuntimeException e) {
-                                    // TODO(lhchavez): Remove this hack. See b/28986534 for details.
-                                    android.util.Log.wtf("org.chromium.mojo.bindings.Interface",
-                                            "Uncaught runtime exception", e);
-                                }
-                            }
-                        });
-            }
-
-            /**
-             * @see Handler#requireVersion(int)
-             */
-            @Override
-            public void requireVersion(int version) {
-                if (mVersion >= version) {
-                    return;
-                }
-                mVersion = version;
-                RunOrClosePipeMessageParams message = new RunOrClosePipeMessageParams();
-                message.input = new RunOrClosePipeInput();
-                message.input.setRequireVersion(new RequireVersion());
-                message.input.getRequireVersion().version = version;
-                InterfaceControlMessagesHelper.sendRunOrClosePipeMessage(
-                        getCore(), mMessageReceiver, message);
-            }
-        }
-
-        /**
-         * The handler associated with this proxy.
-         */
-        private final HandlerImpl mHandler;
-
-        protected AbstractProxy(Core core, MessageReceiverWithResponder messageReceiver) {
-            mHandler = new HandlerImpl(core, messageReceiver);
-        }
-
-        /**
-         * @see Interface#close()
-         */
-        @Override
-        public void close() {
-            mHandler.close();
-        }
-
-        /**
-         * @see Proxy#getProxyHandler()
-         */
-        @Override
-        public HandlerImpl getProxyHandler() {
-            return mHandler;
-        }
-
-        /**
-         * @see ConnectionErrorHandler#onConnectionError(org.chromium.mojo.system.MojoException)
-         */
-        @Override
-        public void onConnectionError(MojoException e) {
-            mHandler.onConnectionError(e);
-        }
-    }
-
-    /**
-     * Base implementation of Stub. Stubs are message receivers that deserialize the payload and
-     * call the appropriate method in the implementation. If the method returns result, the stub
-     * serializes the response and sends it back.
-     *
-     * @param <I> the type of the interface to delegate calls to.
-     */
-    abstract class Stub<I extends Interface> implements MessageReceiverWithResponder {
-
-        /**
-         * The {@link Core} implementation to use.
-         */
-        private final Core mCore;
-
-        /**
-         * The implementation to delegate calls to.
-         */
-        private final I mImpl;
-
-        /**
-         * Constructor.
-         *
-         * @param core the {@link Core} implementation to use.
-         * @param impl the implementation to delegate calls to.
-         */
-        public Stub(Core core, I impl) {
-            mCore = core;
-            mImpl = impl;
-        }
-
-        /**
-         * Returns the Core implementation.
-         */
-        protected Core getCore() {
-            return mCore;
-        }
-
-        /**
-         * Returns the implementation to delegate calls to.
-         */
-        protected I getImpl() {
-            return mImpl;
-        }
-
-        /**
-         * @see org.chromium.mojo.bindings.MessageReceiver#close()
-         */
-        @Override
-        public void close() {
-            mImpl.close();
-        }
-
-    }
-
-    /**
-     * The |Manager| object enables building of proxies and stubs for a given interface.
-     *
-     * @param <I> the type of the interface the manager can handle.
-     * @param <P> the type of the proxy the manager can handle. To be noted, P always extends I.
-     */
-    abstract class Manager<I extends Interface, P extends Proxy> {
-
-        /**
-         * Returns the name of the interface. This is an opaque (but human readable) identifier used
-         * by the service provider to identify services.
-         */
-        public abstract String getName();
-
-        /**
-         * Returns the version of the managed interface.
-         */
-        public abstract int getVersion();
-
-        /**
-         * Binds the given implementation to the handle.
-         */
-        public void bind(I impl, MessagePipeHandle handle) {
-            // The router (and by consequence the handle) is intentionally leaked. It will close
-            // itself when the connected handle is closed and the proxy receives the connection
-            // error.
-            Router router = new RouterImpl(handle);
-            bind(handle.getCore(), impl, router);
-            router.start();
-        }
-
-        /**
-         * Binds the given implementation to the InterfaceRequest.
-         */
-        public final void bind(I impl, InterfaceRequest<I> request) {
-            bind(impl, request.passHandle());
-        }
-
-        /**
-         * Returns a Proxy that will send messages to the given |handle|. This implies that the
-         * other end of the handle must be bound to an implementation of the interface.
-         */
-        public final P attachProxy(MessagePipeHandle handle, int version) {
-            RouterImpl router = new RouterImpl(handle);
-            P proxy = attachProxy(handle.getCore(), router);
-            DelegatingConnectionErrorHandler handlers = new DelegatingConnectionErrorHandler();
-            handlers.addConnectionErrorHandler(proxy);
-            router.setErrorHandler(handlers);
-            router.start();
-            ((HandlerImpl) proxy.getProxyHandler()).setVersion(version);
-            return proxy;
-        }
-
-        /**
-         * Constructs a new |InterfaceRequest| for the interface. This method returns a Pair where
-         * the first element is a proxy, and the second element is the request. The proxy can be
-         * used immediately.
-         */
-        public final Pair<P, InterfaceRequest<I>> getInterfaceRequest(Core core) {
-            Pair<MessagePipeHandle, MessagePipeHandle> handles = core.createMessagePipe(null);
-            P proxy = attachProxy(handles.first, 0);
-            return Pair.create(proxy, new InterfaceRequest<I>(handles.second));
-        }
-
-        public final InterfaceRequest<I> asInterfaceRequest(MessagePipeHandle handle) {
-            return new InterfaceRequest<I>(handle);
-        }
-
-        /**
-         * Binds the implementation to the given |router|.
-         */
-        final void bind(Core core, I impl, Router router) {
-            router.setErrorHandler(impl);
-            router.setIncomingMessageReceiver(buildStub(core, impl));
-        }
-
-        /**
-         * Returns a Proxy that will send messages to the given |router|.
-         */
-        final P attachProxy(Core core, Router router) {
-            return buildProxy(core, new AutoCloseableRouter(core, router));
-        }
-
-        /**
-         * Creates a new array of the given |size|.
-         */
-        protected abstract I[] buildArray(int size);
-
-        /**
-         * Constructs a Stub delegating to the given implementation.
-         */
-        protected abstract Stub<I> buildStub(Core core, I impl);
-
-        /**
-         * Constructs a Proxy forwarding the calls to the given message receiver.
-         */
-        protected abstract P buildProxy(Core core, MessageReceiverWithResponder messageReceiver);
-
-    }
-}
diff --git a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/InterfaceControlMessagesHelper.java b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/InterfaceControlMessagesHelper.java
deleted file mode 100644
index 51f543d..0000000
--- a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/InterfaceControlMessagesHelper.java
+++ /dev/null
@@ -1,105 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.bindings;
-
-import org.chromium.mojo.bindings.Callbacks.Callback1;
-import org.chromium.mojo.bindings.Interface.Manager;
-import org.chromium.mojo.bindings.Interface.Proxy;
-import org.chromium.mojo.bindings.interfacecontrol.InterfaceControlMessagesConstants;
-import org.chromium.mojo.bindings.interfacecontrol.QueryVersionResult;
-import org.chromium.mojo.bindings.interfacecontrol.RunInput;
-import org.chromium.mojo.bindings.interfacecontrol.RunMessageParams;
-import org.chromium.mojo.bindings.interfacecontrol.RunOrClosePipeInput;
-import org.chromium.mojo.bindings.interfacecontrol.RunOrClosePipeMessageParams;
-import org.chromium.mojo.bindings.interfacecontrol.RunOutput;
-import org.chromium.mojo.bindings.interfacecontrol.RunResponseMessageParams;
-import org.chromium.mojo.system.Core;
-
-/**
- * Helper class to handle interface control messages. See
- * mojo/public/interfaces/bindings/interface_control_messages.mojom.
- */
-public class InterfaceControlMessagesHelper {
-    /**
-     * MessageReceiver that forwards a message containing a {@link RunResponseMessageParams} to a
-     * callback.
-     */
-    private static class RunResponseForwardToCallback
-            extends SideEffectFreeCloseable implements MessageReceiver {
-        private final Callback1<RunResponseMessageParams> mCallback;
-
-        RunResponseForwardToCallback(Callback1<RunResponseMessageParams> callback) {
-            mCallback = callback;
-        }
-
-        /**
-         * @see MessageReceiver#accept(Message)
-         */
-        @Override
-        public boolean accept(Message message) {
-            RunResponseMessageParams response =
-                    RunResponseMessageParams.deserialize(message.asServiceMessage().getPayload());
-            mCallback.call(response);
-            return true;
-        }
-    }
-
-    /**
-     * Sends the given run message through the receiver, registering the callback.
-     */
-    public static void sendRunMessage(Core core, MessageReceiverWithResponder receiver,
-            RunMessageParams params, Callback1<RunResponseMessageParams> callback) {
-        Message message = params.serializeWithHeader(
-                core, new MessageHeader(InterfaceControlMessagesConstants.RUN_MESSAGE_ID,
-                        MessageHeader.MESSAGE_EXPECTS_RESPONSE_FLAG, 0));
-        receiver.acceptWithResponder(message, new RunResponseForwardToCallback(callback));
-    }
-
-    /**
-     * Sends the given run or close pipe message through the receiver.
-     */
-    public static void sendRunOrClosePipeMessage(
-            Core core, MessageReceiverWithResponder receiver, RunOrClosePipeMessageParams params) {
-        Message message = params.serializeWithHeader(core,
-                new MessageHeader(InterfaceControlMessagesConstants.RUN_OR_CLOSE_PIPE_MESSAGE_ID));
-        receiver.accept(message);
-    }
-
-    /**
-     * Handles a received run message.
-     */
-    public static <I extends Interface, P extends Proxy> boolean handleRun(
-            Core core, Manager<I, P> manager, ServiceMessage message, MessageReceiver responder) {
-        Message payload = message.getPayload();
-        RunMessageParams query = RunMessageParams.deserialize(payload);
-        RunResponseMessageParams response = new RunResponseMessageParams();
-        response.output = new RunOutput();
-        if (query.input.which() == RunInput.Tag.QueryVersion) {
-            response.output.setQueryVersionResult(new QueryVersionResult());
-            response.output.getQueryVersionResult().version = manager.getVersion();
-        } else {
-            response.output = null;
-        }
-
-        return responder.accept(response.serializeWithHeader(
-                core, new MessageHeader(InterfaceControlMessagesConstants.RUN_MESSAGE_ID,
-                        MessageHeader.MESSAGE_IS_RESPONSE_FLAG,
-                        message.getHeader().getRequestId())));
-    }
-
-    /**
-     * Handles a received run or close pipe message. Closing the pipe is handled by returning
-     * |false|.
-     */
-    public static <I extends Interface, P extends Proxy> boolean handleRunOrClosePipe(
-            Manager<I, P> manager, ServiceMessage message) {
-        Message payload = message.getPayload();
-        RunOrClosePipeMessageParams query = RunOrClosePipeMessageParams.deserialize(payload);
-        if (query.input.which() == RunOrClosePipeInput.Tag.RequireVersion) {
-            return query.input.getRequireVersion().version <= manager.getVersion();
-        }
-        return false;
-    }
-}
diff --git a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/InterfaceRequest.java b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/InterfaceRequest.java
deleted file mode 100644
index 61899b4..0000000
--- a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/InterfaceRequest.java
+++ /dev/null
@@ -1,58 +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.
-
-package org.chromium.mojo.bindings;
-
-import org.chromium.mojo.system.MessagePipeHandle;
-
-/**
- * One end of the message pipe representing a request to create an implementation to be bound to it.
- * The other end of the pipe is bound to a proxy, which can be used immediately, while the
- * InterfaceRequest is being sent.
- * <p>
- * InterfaceRequest are built using |Interface.Manager|.
- *
- * @param <P> the type of the remote interface proxy.
- */
-public class InterfaceRequest<P extends Interface> implements HandleOwner<MessagePipeHandle> {
-
-    /**
-     * The handle which will be sent and will be connected to the implementation.
-     */
-    private final MessagePipeHandle mHandle;
-
-    /**
-     * Constructor.
-     *
-     * @param handle the handle which will be sent and will be connected to the implementation.
-     */
-    InterfaceRequest(MessagePipeHandle handle) {
-        mHandle = handle;
-    }
-
-    /**
-     * @see HandleOwner#passHandle()
-     */
-    @Override
-    public MessagePipeHandle passHandle() {
-        return mHandle.pass();
-    }
-
-    /**
-     * @see java.io.Closeable#close()
-     */
-    @Override
-    public void close() {
-        mHandle.close();
-    }
-
-    /**
-     * Returns an {@link InterfaceRequest} that wraps the given handle. This method is not type safe
-     * and should be avoided unless absolutely necessary.
-     */
-    @SuppressWarnings("rawtypes")
-    public static InterfaceRequest asInterfaceRequestUnsafe(MessagePipeHandle handle) {
-        return new InterfaceRequest(handle);
-    }
-}
diff --git a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Message.java b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Message.java
deleted file mode 100644
index 996c457..0000000
--- a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Message.java
+++ /dev/null
@@ -1,69 +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.
-
-package org.chromium.mojo.bindings;
-
-import org.chromium.mojo.system.Handle;
-import org.chromium.mojo.system.MessagePipeHandle;
-
-import java.nio.ByteBuffer;
-import java.util.List;
-
-/**
- * A raw message to be sent/received from a {@link MessagePipeHandle}. Note that this can contain
- * any data, not necessarily a Mojo message with a proper header. See also {@link ServiceMessage}.
- */
-public class Message {
-
-    /**
-     * The data of the message.
-     */
-    private final ByteBuffer mBuffer;
-
-    /**
-     * The handles of the message.
-     */
-    private final List<? extends Handle> mHandle;
-
-    /**
-     * This message interpreted as a message for a mojo service with an appropriate header.
-     */
-    private ServiceMessage mWithHeader;
-
-    /**
-     * Constructor.
-     *
-     * @param buffer The buffer containing the bytes to send. This must be a direct buffer.
-     * @param handles The list of handles to send.
-     */
-    public Message(ByteBuffer buffer, List<? extends Handle> handles) {
-        assert buffer.isDirect();
-        mBuffer = buffer;
-        mHandle = handles;
-    }
-
-    /**
-     * The data of the message.
-     */
-    public ByteBuffer getData() {
-        return mBuffer;
-    }
-
-    /**
-     * The handles of the message.
-     */
-    public List<? extends Handle> getHandles() {
-        return mHandle;
-    }
-
-    /**
-     * Returns the message interpreted as a message for a mojo service.
-     */
-    public ServiceMessage asServiceMessage() {
-        if (mWithHeader == null) {
-            mWithHeader = new ServiceMessage(this);
-        }
-        return mWithHeader;
-    }
-}
diff --git a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/MessageHeader.java b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/MessageHeader.java
deleted file mode 100644
index 771d22b..0000000
--- a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/MessageHeader.java
+++ /dev/null
@@ -1,248 +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.
-
-package org.chromium.mojo.bindings;
-
-import java.nio.ByteBuffer;
-
-/**
- * Header information for a message.
- */
-public class MessageHeader {
-
-    private static final int SIMPLE_MESSAGE_SIZE = 24;
-    private static final int SIMPLE_MESSAGE_VERSION = 0;
-    private static final DataHeader SIMPLE_MESSAGE_STRUCT_INFO =
-            new DataHeader(SIMPLE_MESSAGE_SIZE, SIMPLE_MESSAGE_VERSION);
-
-    private static final int MESSAGE_WITH_REQUEST_ID_SIZE = 32;
-    private static final int MESSAGE_WITH_REQUEST_ID_VERSION = 1;
-    private static final DataHeader MESSAGE_WITH_REQUEST_ID_STRUCT_INFO =
-            new DataHeader(MESSAGE_WITH_REQUEST_ID_SIZE, MESSAGE_WITH_REQUEST_ID_VERSION);
-
-    private static final int INTERFACE_ID_OFFSET = 8;
-    private static final int TYPE_OFFSET = 12;
-    private static final int FLAGS_OFFSET = 16;
-    private static final int REQUEST_ID_OFFSET = 24;
-
-    /**
-     * Flag for a header of a simple message.
-     */
-    public static final int NO_FLAG = 0;
-
-    /**
-     * Flag for a header of a message that expected a response.
-     */
-    public static final int MESSAGE_EXPECTS_RESPONSE_FLAG = 1 << 0;
-
-    /**
-     * Flag for a header of a message that is a response.
-     */
-    public static final int MESSAGE_IS_RESPONSE_FLAG = 1 << 1;
-
-    private final DataHeader mDataHeader;
-    private final int mType;
-    private final int mFlags;
-    private long mRequestId;
-
-    /**
-     * Constructor for the header of a message which does not have a response.
-     */
-    public MessageHeader(int type) {
-        mDataHeader = SIMPLE_MESSAGE_STRUCT_INFO;
-        mType = type;
-        mFlags = 0;
-        mRequestId = 0;
-    }
-
-    /**
-     * Constructor for the header of a message which have a response or being itself a response.
-     */
-    public MessageHeader(int type, int flags, long requestId) {
-        assert mustHaveRequestId(flags);
-        mDataHeader = MESSAGE_WITH_REQUEST_ID_STRUCT_INFO;
-        mType = type;
-        mFlags = flags;
-        mRequestId = requestId;
-    }
-
-    /**
-     * Constructor, parsing the header from a message. Should only be used by {@link Message}
-     * itself.
-     */
-    MessageHeader(Message message) {
-        Decoder decoder = new Decoder(message);
-        mDataHeader = decoder.readDataHeader();
-        validateDataHeader(mDataHeader);
-
-        // Currently associated interfaces are not supported.
-        int interfaceId = decoder.readInt(INTERFACE_ID_OFFSET);
-        if (interfaceId != 0) {
-          throw new DeserializationException("Non-zero interface ID, expecting zero since "
-                  + "associated interfaces are not yet supported.");
-        }
-
-        mType = decoder.readInt(TYPE_OFFSET);
-        mFlags = decoder.readInt(FLAGS_OFFSET);
-        if (mustHaveRequestId(mFlags)) {
-            if (mDataHeader.size < MESSAGE_WITH_REQUEST_ID_SIZE) {
-                throw new DeserializationException("Incorrect message size, expecting at least "
-                        + MESSAGE_WITH_REQUEST_ID_SIZE
-                        + " for a message with a request identifier, but got: " + mDataHeader.size);
-
-            }
-            mRequestId = decoder.readLong(REQUEST_ID_OFFSET);
-        } else {
-            mRequestId = 0;
-        }
-    }
-
-    /**
-     * Returns the size in bytes of the serialization of the header.
-     */
-    public int getSize() {
-        return mDataHeader.size;
-    }
-
-    /**
-     * Returns the type of the message.
-     */
-    public int getType() {
-        return mType;
-    }
-
-    /**
-     * Returns the flags associated to the message.
-     */
-    public int getFlags() {
-        return mFlags;
-    }
-
-    /**
-     * Returns if the message has the given flag.
-     */
-    public boolean hasFlag(int flag) {
-        return (mFlags & flag) == flag;
-    }
-
-    /**
-     * Returns if the message has a request id.
-     */
-    public boolean hasRequestId() {
-        return mustHaveRequestId(mFlags);
-    }
-
-    /**
-     * Return the request id for the message. Must only be called if the message has a request id.
-     */
-    public long getRequestId() {
-        assert hasRequestId();
-        return mRequestId;
-    }
-
-    /**
-     * Encode the header.
-     */
-    public void encode(Encoder encoder) {
-        encoder.encode(mDataHeader);
-        // Set the interface ID field to 0.
-        encoder.encode(0, INTERFACE_ID_OFFSET);
-        encoder.encode(getType(), TYPE_OFFSET);
-        encoder.encode(getFlags(), FLAGS_OFFSET);
-        if (hasRequestId()) {
-            encoder.encode(getRequestId(), REQUEST_ID_OFFSET);
-        }
-    }
-
-    /**
-     * Returns true if the header has the expected flags. Only considers flags this class knows
-     * about in order to allow this class to work with future version of the header format.
-     */
-    public boolean validateHeader(int expectedFlags) {
-        int knownFlags = getFlags() & (MESSAGE_EXPECTS_RESPONSE_FLAG | MESSAGE_IS_RESPONSE_FLAG);
-        return knownFlags == expectedFlags;
-    }
-
-    /**
-     * Returns true if the header has the expected type and flags. Only consider flags this class
-     * knows about in order to allow this class to work with future version of the header format.
-     */
-    public boolean validateHeader(int expectedType, int expectedFlags) {
-        return getType() == expectedType && validateHeader(expectedFlags);
-    }
-
-    /**
-     * @see Object#hashCode()
-     */
-    @Override
-    public int hashCode() {
-        final int prime = 31;
-        int result = 1;
-        result = prime * result + ((mDataHeader == null) ? 0 : mDataHeader.hashCode());
-        result = prime * result + mFlags;
-        result = prime * result + (int) (mRequestId ^ (mRequestId >>> 32));
-        result = prime * result + mType;
-        return result;
-    }
-
-    /**
-     * @see Object#equals(Object)
-     */
-    @Override
-    public boolean equals(Object object) {
-        if (object == this) return true;
-        if (object == null) return false;
-        if (getClass() != object.getClass()) return false;
-
-        MessageHeader other = (MessageHeader) object;
-        return (BindingsHelper.equals(mDataHeader, other.mDataHeader)
-                && mFlags == other.mFlags
-                && mRequestId == other.mRequestId
-                && mType == other.mType);
-    }
-
-    /**
-     * Set the request id on the message contained in the given buffer.
-     */
-    void setRequestId(ByteBuffer buffer, long requestId) {
-        assert mustHaveRequestId(buffer.getInt(FLAGS_OFFSET));
-        buffer.putLong(REQUEST_ID_OFFSET, requestId);
-        mRequestId = requestId;
-    }
-
-    /**
-     * Returns whether a message with the given flags must have a request Id.
-     */
-    private static boolean mustHaveRequestId(int flags) {
-        return (flags & (MESSAGE_EXPECTS_RESPONSE_FLAG | MESSAGE_IS_RESPONSE_FLAG)) != 0;
-    }
-
-    /**
-     * Validate that the given {@link DataHeader} can be the data header of a message header.
-     */
-    private static void validateDataHeader(DataHeader dataHeader) {
-        if (dataHeader.elementsOrVersion < SIMPLE_MESSAGE_VERSION) {
-            throw new DeserializationException("Incorrect number of fields, expecting at least "
-                    + SIMPLE_MESSAGE_VERSION + ", but got: " + dataHeader.elementsOrVersion);
-        }
-        if (dataHeader.size < SIMPLE_MESSAGE_SIZE) {
-            throw new DeserializationException(
-                    "Incorrect message size, expecting at least " + SIMPLE_MESSAGE_SIZE
-                    + ", but got: " + dataHeader.size);
-        }
-        if (dataHeader.elementsOrVersion == SIMPLE_MESSAGE_VERSION
-                && dataHeader.size != SIMPLE_MESSAGE_SIZE) {
-            throw new DeserializationException("Incorrect message size for a message with "
-                    + SIMPLE_MESSAGE_VERSION + " fields, expecting " + SIMPLE_MESSAGE_SIZE
-                    + ", but got: " + dataHeader.size);
-        }
-        if (dataHeader.elementsOrVersion == MESSAGE_WITH_REQUEST_ID_VERSION
-                && dataHeader.size != MESSAGE_WITH_REQUEST_ID_SIZE) {
-            throw new DeserializationException("Incorrect message size for a message with "
-                    + MESSAGE_WITH_REQUEST_ID_VERSION + " fields, expecting "
-                    + MESSAGE_WITH_REQUEST_ID_SIZE + ", but got: " + dataHeader.size);
-        }
-    }
-
-}
diff --git a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/MessageReceiver.java b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/MessageReceiver.java
deleted file mode 100644
index 4223297..0000000
--- a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/MessageReceiver.java
+++ /dev/null
@@ -1,25 +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.
-
-package org.chromium.mojo.bindings;
-
-import java.io.Closeable;
-
-/**
- * A class which implements this interface can receive {@link Message} objects.
- */
-public interface MessageReceiver extends Closeable {
-
-    /**
-     * Receive a {@link Message}. The {@link MessageReceiver} is allowed to mutate the message.
-     * Returns |true| if the message has been handled, |false| otherwise.
-     */
-    boolean accept(Message message);
-
-    /**
-     * @see java.io.Closeable#close()
-     */
-    @Override
-    public void close();
-}
diff --git a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/MessageReceiverWithResponder.java b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/MessageReceiverWithResponder.java
deleted file mode 100644
index e24a558..0000000
--- a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/MessageReceiverWithResponder.java
+++ /dev/null
@@ -1,21 +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.
-
-package org.chromium.mojo.bindings;
-
-/**
- * A {@link MessageReceiver} that can also handle the handle the response message generated from the
- * given message.
- */
-public interface MessageReceiverWithResponder extends MessageReceiver {
-
-    /**
-     * A variant on {@link #accept(Message)} that registers a {@link MessageReceiver}
-     * (known as the responder) to handle the response message generated from the given message. The
-     * responder's {@link #accept(Message)} method may be called as part of the call to
-     * {@link #acceptWithResponder(Message, MessageReceiver)}, or some time after its
-     * return.
-     */
-    boolean acceptWithResponder(Message message, MessageReceiver responder);
-}
diff --git a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Router.java b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Router.java
deleted file mode 100644
index ba19ae5..0000000
--- a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Router.java
+++ /dev/null
@@ -1,31 +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.
-
-package org.chromium.mojo.bindings;
-
-import org.chromium.mojo.system.MessagePipeHandle;
-
-/**
- * A {@link Router} will handle mojo message and forward those to a {@link Connector}. It deals with
- * parsing of headers and adding of request ids in order to be able to match a response to a
- * request.
- */
-public interface Router extends MessageReceiverWithResponder, HandleOwner<MessagePipeHandle> {
-
-    /**
-     * Start listening for incoming messages.
-     */
-    public void start();
-
-    /**
-     * Set the {@link MessageReceiverWithResponder} that will deserialize and use the message
-     * received from the pipe.
-     */
-    public void setIncomingMessageReceiver(MessageReceiverWithResponder incomingMessageReceiver);
-
-    /**
-     * Set the handle that will be notified of errors on the message pipe.
-     */
-    public void setErrorHandler(ConnectionErrorHandler errorHandler);
-}
diff --git a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/RouterImpl.java b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/RouterImpl.java
deleted file mode 100644
index aebc9e2..0000000
--- a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/RouterImpl.java
+++ /dev/null
@@ -1,274 +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.
-
-package org.chromium.mojo.bindings;
-
-import android.annotation.SuppressLint;
-
-import org.chromium.mojo.system.Core;
-import org.chromium.mojo.system.MessagePipeHandle;
-import org.chromium.mojo.system.Watcher;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.Executor;
-
-/**
- * Implementation of {@link Router}.
- */
-@SuppressLint("UseSparseArrays")  // https://crbug.com/600699
-public class RouterImpl implements Router {
-
-    /**
-     * {@link MessageReceiver} used as the {@link Connector} callback.
-     */
-    private class HandleIncomingMessageThunk implements MessageReceiver {
-
-        /**
-         * @see MessageReceiver#accept(Message)
-         */
-        @Override
-        public boolean accept(Message message) {
-            return handleIncomingMessage(message);
-        }
-
-        /**
-         * @see MessageReceiver#close()
-         */
-        @Override
-        public void close() {
-            handleConnectorClose();
-        }
-
-    }
-
-    /**
-     *
-     * {@link MessageReceiver} used to return responses to the caller.
-     */
-    class ResponderThunk implements MessageReceiver {
-        private boolean mAcceptWasInvoked;
-
-        /**
-         * @see
-         * MessageReceiver#accept(Message)
-         */
-        @Override
-        public boolean accept(Message message) {
-            mAcceptWasInvoked = true;
-            return RouterImpl.this.accept(message);
-        }
-
-        /**
-         * @see MessageReceiver#close()
-         */
-        @Override
-        public void close() {
-            RouterImpl.this.close();
-        }
-
-        @Override
-        protected void finalize() throws Throwable {
-            if (!mAcceptWasInvoked) {
-                // We close the pipe here as a way of signaling to the calling application that an
-                // error condition occurred. Without this the calling application would have no
-                // way of knowing it should stop waiting for a response.
-                RouterImpl.this.closeOnHandleThread();
-            }
-            super.finalize();
-        }
-    }
-
-    /**
-     * The {@link Connector} which is connected to the handle.
-     */
-    private final Connector mConnector;
-
-    /**
-     * The {@link MessageReceiverWithResponder} that will consume the messages received from the
-     * pipe.
-     */
-    private MessageReceiverWithResponder mIncomingMessageReceiver;
-
-    /**
-     * The next id to use for a request id which needs a response. It is auto-incremented.
-     */
-    private long mNextRequestId = 1;
-
-    /**
-     * The map from request ids to {@link MessageReceiver} of request currently in flight.
-     */
-    private Map<Long, MessageReceiver> mResponders = new HashMap<Long, MessageReceiver>();
-
-    /**
-     * An Executor that will run on the thread associated with the MessagePipe to which
-     * this Router is bound. This may be {@code Null} if the MessagePipeHandle passed
-     * in to the constructor is not valid.
-     */
-    private final Executor mExecutor;
-
-    /**
-     * Constructor that will use the default {@link Watcher}.
-     *
-     * @param messagePipeHandle The {@link MessagePipeHandle} to route message for.
-     */
-    public RouterImpl(MessagePipeHandle messagePipeHandle) {
-        this(messagePipeHandle, BindingsHelper.getWatcherForHandle(messagePipeHandle));
-    }
-
-    /**
-     * Constructor.
-     *
-     * @param messagePipeHandle The {@link MessagePipeHandle} to route message for.
-     * @param watcher the {@link Watcher} to use to get notification of new messages on the
-     *            handle.
-     */
-    public RouterImpl(MessagePipeHandle messagePipeHandle, Watcher watcher) {
-        mConnector = new Connector(messagePipeHandle, watcher);
-        mConnector.setIncomingMessageReceiver(new HandleIncomingMessageThunk());
-        Core core = messagePipeHandle.getCore();
-        if (core != null) {
-            mExecutor = ExecutorFactory.getExecutorForCurrentThread(core);
-        } else {
-            mExecutor = null;
-        }
-    }
-
-    /**
-     * @see org.chromium.mojo.bindings.Router#start()
-     */
-    @Override
-    public void start() {
-        mConnector.start();
-    }
-
-    /**
-     * @see Router#setIncomingMessageReceiver(MessageReceiverWithResponder)
-     */
-    @Override
-    public void setIncomingMessageReceiver(MessageReceiverWithResponder incomingMessageReceiver) {
-        this.mIncomingMessageReceiver = incomingMessageReceiver;
-    }
-
-    /**
-     * @see MessageReceiver#accept(Message)
-     */
-    @Override
-    public boolean accept(Message message) {
-        // A message without responder is directly forwarded to the connector.
-        return mConnector.accept(message);
-    }
-
-    /**
-     * @see MessageReceiverWithResponder#acceptWithResponder(Message, MessageReceiver)
-     */
-    @Override
-    public boolean acceptWithResponder(Message message, MessageReceiver responder) {
-        // The message must have a header.
-        ServiceMessage messageWithHeader = message.asServiceMessage();
-        // Checking the message expects a response.
-        assert messageWithHeader.getHeader().hasFlag(MessageHeader.MESSAGE_EXPECTS_RESPONSE_FLAG);
-
-        // Compute a request id for being able to route the response.
-        // TODO(lhchavez): Remove this hack. See b/28986534 for details.
-        synchronized (mResponders) {
-            long requestId = mNextRequestId++;
-            // Reserve 0 in case we want it to convey special meaning in the future.
-            if (requestId == 0) {
-                requestId = mNextRequestId++;
-            }
-            if (mResponders.containsKey(requestId)) {
-                throw new IllegalStateException("Unable to find a new request identifier.");
-            }
-            messageWithHeader.setRequestId(requestId);
-            if (!mConnector.accept(messageWithHeader)) {
-                return false;
-            }
-            // Only keep the responder is the message has been accepted.
-            mResponders.put(requestId, responder);
-        }
-        return true;
-    }
-
-    /**
-     * @see org.chromium.mojo.bindings.HandleOwner#passHandle()
-     */
-    @Override
-    public MessagePipeHandle passHandle() {
-        return mConnector.passHandle();
-    }
-
-    /**
-     * @see java.io.Closeable#close()
-     */
-    @Override
-    public void close() {
-        mConnector.close();
-    }
-
-    /**
-     * @see Router#setErrorHandler(ConnectionErrorHandler)
-     */
-    @Override
-    public void setErrorHandler(ConnectionErrorHandler errorHandler) {
-        mConnector.setErrorHandler(errorHandler);
-    }
-
-    /**
-     * Receive a message from the connector. Returns |true| if the message has been handled.
-     */
-    private boolean handleIncomingMessage(Message message) {
-        MessageHeader header = message.asServiceMessage().getHeader();
-        if (header.hasFlag(MessageHeader.MESSAGE_EXPECTS_RESPONSE_FLAG)) {
-            if (mIncomingMessageReceiver != null) {
-                return mIncomingMessageReceiver.acceptWithResponder(message, new ResponderThunk());
-            }
-            // If we receive a request expecting a response when the client is not
-            // listening, then we have no choice but to tear down the pipe.
-            close();
-            return false;
-        } else if (header.hasFlag(MessageHeader.MESSAGE_IS_RESPONSE_FLAG)) {
-            long requestId = header.getRequestId();
-            MessageReceiver responder;
-            // TODO(lhchavez): Remove this hack. See b/28986534 for details.
-            synchronized (mResponders) {
-                responder = mResponders.get(requestId);
-                if (responder == null) {
-                    return false;
-                }
-                mResponders.remove(requestId);
-            }
-            return responder.accept(message);
-        } else {
-            if (mIncomingMessageReceiver != null) {
-                return mIncomingMessageReceiver.accept(message);
-            }
-            // OK to drop the message.
-        }
-        return false;
-    }
-
-    private void handleConnectorClose() {
-        if (mIncomingMessageReceiver != null) {
-            mIncomingMessageReceiver.close();
-        }
-    }
-
-    /**
-     * Invokes {@link #close()} asynchronously on the thread associated with
-     * this Router's Handle. If this Router was constructed with an invalid
-     * handle then this method does nothing.
-     */
-    private void closeOnHandleThread() {
-        if (mExecutor != null) {
-            mExecutor.execute(new Runnable() {
-
-                @Override
-                public void run() {
-                    close();
-                }
-            });
-        }
-    }
-}
diff --git a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/SerializationException.java b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/SerializationException.java
deleted file mode 100644
index d4f5502..0000000
--- a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/SerializationException.java
+++ /dev/null
@@ -1,26 +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.
-
-package org.chromium.mojo.bindings;
-
-/**
- * Error that can be thrown when serializing a mojo message.
- */
-public class SerializationException extends RuntimeException {
-
-    /**
-     * Constructs a new serialization exception with the specified detail message.
-     */
-    public SerializationException(String message) {
-        super(message);
-    }
-
-    /**
-     * Constructs a new serialization exception with the specified cause.
-     */
-    public SerializationException(Exception cause) {
-        super(cause);
-    }
-
-}
diff --git a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/ServiceMessage.java b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/ServiceMessage.java
deleted file mode 100644
index 313dc6a..0000000
--- a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/ServiceMessage.java
+++ /dev/null
@@ -1,73 +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.
-
-package org.chromium.mojo.bindings;
-
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-
-/**
- * Represents a {@link Message} which contains a {@link MessageHeader}. Deals with parsing the
- * {@link MessageHeader} for a message.
- */
-public class ServiceMessage extends Message {
-
-    private final MessageHeader mHeader;
-    private Message mPayload;
-
-    /**
-     * Reinterpret the given |message| as a message with the given |header|. The |message| must
-     * contain the |header| as the start of its raw data.
-     */
-    public ServiceMessage(Message baseMessage, MessageHeader header) {
-        super(baseMessage.getData(), baseMessage.getHandles());
-        assert header.equals(new org.chromium.mojo.bindings.MessageHeader(baseMessage));
-        this.mHeader = header;
-    }
-
-    /**
-     * Reinterpret the given |message| as a message with a header. The |message| must contain a
-     * header as the start of it's raw data, which will be parsed by this constructor.
-     */
-    ServiceMessage(Message baseMessage) {
-        this(baseMessage, new org.chromium.mojo.bindings.MessageHeader(baseMessage));
-    }
-
-    /**
-     * @see Message#asServiceMessage()
-     */
-    @Override
-    public ServiceMessage asServiceMessage() {
-        return this;
-    }
-
-    /**
-     * Returns the header of the given message. This will throw a {@link DeserializationException}
-     * if the start of the message is not a valid header.
-     */
-    public MessageHeader getHeader() {
-        return mHeader;
-    }
-
-    /**
-     * Returns the payload of the message.
-     */
-    public Message getPayload() {
-        if (mPayload == null) {
-            ByteBuffer truncatedBuffer =
-                    ((ByteBuffer) getData().position(getHeader().getSize())).slice();
-            truncatedBuffer.order(ByteOrder.LITTLE_ENDIAN);
-            mPayload = new Message(truncatedBuffer, getHandles());
-        }
-        return mPayload;
-    }
-
-    /**
-     * Set the request identifier on the message.
-     */
-    void setRequestId(long requestId) {
-        mHeader.setRequestId(getData(), requestId);
-    }
-
-}
diff --git a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/SideEffectFreeCloseable.java b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/SideEffectFreeCloseable.java
deleted file mode 100644
index 118c991..0000000
--- a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/SideEffectFreeCloseable.java
+++ /dev/null
@@ -1,21 +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.
-
-package org.chromium.mojo.bindings;
-
-import java.io.Closeable;
-
-/**
- * An implementation of closeable that doesn't do anything.
- */
-public class SideEffectFreeCloseable implements Closeable {
-
-    /**
-     * @see java.io.Closeable#close()
-     */
-    @Override
-    public void close() {
-    }
-
-}
diff --git a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Struct.java b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Struct.java
deleted file mode 100644
index 14f4e1e..0000000
--- a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Struct.java
+++ /dev/null
@@ -1,88 +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.
-
-package org.chromium.mojo.bindings;
-
-import org.chromium.mojo.system.Core;
-
-import java.nio.ByteBuffer;
-
-/**
- * Base class for all mojo structs.
- */
-public abstract class Struct {
-    /**
-     * The base size of the encoded struct.
-     */
-    private final int mEncodedBaseSize;
-
-    /**
-     * The version of the struct.
-     */
-    private final int mVersion;
-
-    /**
-     * Constructor.
-     */
-    protected Struct(int encodedBaseSize, int version) {
-        mEncodedBaseSize = encodedBaseSize;
-        mVersion = version;
-    }
-
-    /**
-     * Returns the version of the struct. It is the max version of the struct in the mojom if it has
-     * been created locally, and the version of the received struct if it has been deserialized.
-     */
-    public int getVersion() {
-        return mVersion;
-    }
-
-    /**
-     * Returns the serialization of the struct. This method can close Handles.
-     *
-     * @param core the |Core| implementation used to generate handles. Only used if the data
-     *            structure being encoded contains interfaces, can be |null| otherwise.
-     */
-    public Message serialize(Core core) {
-        Encoder encoder = new Encoder(core, mEncodedBaseSize);
-        encode(encoder);
-        return encoder.getMessage();
-    }
-
-    /**
-     * Similar to the method above, but returns the serialization result as |ByteBuffer|.
-     *
-     * @throws UnsupportedOperationException if the struct contains interfaces or handles.
-     * @throws SerializationException on serialization failure.
-     */
-    public ByteBuffer serialize() {
-        // If the struct contains interfaces which require a non-null |Core| instance, it will throw
-        // UnsupportedOperationException.
-        Message message = serialize(null);
-
-        if (!message.getHandles().isEmpty())
-            throw new UnsupportedOperationException("Handles are discarded.");
-
-        return message.getData();
-    }
-
-    /**
-     * Returns the serialization of the struct prepended with the given header.
-     *
-     * @param header the header to prepend to the returned message.
-     * @param core the |Core| implementation used to generate handles. Only used if the |Struct|
-     *            being encoded contains interfaces, can be |null| otherwise.
-     */
-    public ServiceMessage serializeWithHeader(Core core, MessageHeader header) {
-        Encoder encoder = new Encoder(core, mEncodedBaseSize + header.getSize());
-        header.encode(encoder);
-        encode(encoder);
-        return new ServiceMessage(encoder.getMessage(), header);
-    }
-
-    /**
-     * Use the given encoder to serialize this data structure.
-     */
-    protected abstract void encode(Encoder encoder);
-}
diff --git a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Union.java b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Union.java
deleted file mode 100644
index 90b40ea..0000000
--- a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Union.java
+++ /dev/null
@@ -1,30 +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.
-
-package org.chromium.mojo.bindings;
-
-import org.chromium.mojo.system.Core;
-
-/**
- * Base class for all mojo unions.
- */
-public abstract class Union {
-    /**
-     * Returns the serialization of the union. This method can close Handles.
-     *
-     * @param core the |Core| implementation used to generate handles. Only used if the data
-     *            structure being encoded contains interfaces, can be |null| otherwise.
-     */
-    public Message serialize(Core core) {
-        Encoder encoder = new Encoder(core, BindingsHelper.UNION_SIZE);
-        encoder.claimMemory(16);
-        encode(encoder, 0);
-        return encoder.getMessage();
-    }
-
-    /**
-     * Serializes this data structure using the given encoder.
-     */
-    protected abstract void encode(Encoder encoder, int offset);
-}
diff --git a/mojo/public/java/system/README.md b/mojo/public/java/system/README.md
deleted file mode 100644
index 3213e4c..0000000
--- a/mojo/public/java/system/README.md
+++ /dev/null
@@ -1,25 +0,0 @@
-# ![Mojo Graphic](https://goo.gl/6CdlbH) Mojo Java System API
-This document is a subset of the [Mojo documentation](/mojo).
-
-[TOC]
-
-## Overview
-
-This document provides a brief guide to Java Mojo bindings usage with example
-code snippets.
-
-For a detailed API references please consult the class definitions in
-[this directory](https://cs.chromium.org/chromium/src/mojo/public/java/system/src/org/chromium/mojo/system/).
-
-*TODO: Make the contents of this document less non-existent.*
-
-## Message Pipes
-
-## Data Pipes
-
-## Shared Buffers
-
-## Native Platform Handles (File Descriptors, Windows Handles, *etc.*)
-
-## Watchers
-
diff --git a/mojo/public/java/system/src/org/chromium/mojo/system/Core.java b/mojo/public/java/system/src/org/chromium/mojo/system/Core.java
deleted file mode 100644
index 40e4be3..0000000
--- a/mojo/public/java/system/src/org/chromium/mojo/system/Core.java
+++ /dev/null
@@ -1,183 +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.
-
-package org.chromium.mojo.system;
-
-/**
- * Core mojo interface giving access to the base operations. See |src/mojo/public/c/system/core.h|
- * for the underlying api.
- */
-public interface Core {
-
-    /**
-     * Used to indicate an infinite deadline (timeout).
-     */
-    public static final long DEADLINE_INFINITE = -1;
-
-    /**
-     * Signals for the wait operations on handles.
-     */
-    public static class HandleSignals extends Flags<HandleSignals> {
-        /**
-         * Constructor.
-         *
-         * @param signals the serialized signals.
-         */
-        public HandleSignals(int signals) {
-            super(signals);
-        }
-
-        private static final int FLAG_NONE = 0;
-        private static final int FLAG_READABLE = 1 << 0;
-        private static final int FLAG_WRITABLE = 1 << 1;
-        private static final int FLAG_PEER_CLOSED = 1 << 2;
-
-        /**
-         * Immutable signals.
-         */
-        public static final HandleSignals NONE = HandleSignals.none().immutable();
-        public static final HandleSignals READABLE =
-                HandleSignals.none().setReadable(true).immutable();
-        public static final HandleSignals WRITABLE =
-                HandleSignals.none().setWritable(true).immutable();
-
-        /**
-         * Change the readable bit of this signal.
-         *
-         * @param readable the new value of the readable bit.
-         * @return this.
-         */
-        public HandleSignals setReadable(boolean readable) {
-            return setFlag(FLAG_READABLE, readable);
-        }
-
-        /**
-         * Change the writable bit of this signal.
-         *
-         * @param writable the new value of the writable bit.
-         * @return this.
-         */
-        public HandleSignals setWritable(boolean writable) {
-            return setFlag(FLAG_WRITABLE, writable);
-        }
-
-        /**
-         * Change the peer closed bit of this signal.
-         *
-         * @param peerClosed the new value of the peer closed bit.
-         * @return this.
-         */
-        public HandleSignals setPeerClosed(boolean peerClosed) {
-            return setFlag(FLAG_PEER_CLOSED, peerClosed);
-        }
-
-        /**
-         * Returns a signal with no bit set.
-         */
-        public static HandleSignals none() {
-            return new HandleSignals(FLAG_NONE);
-        }
-
-    }
-
-    /**
-     * Returns a platform-dependent monotonically increasing tick count representing "right now."
-     */
-    public long getTimeTicksNow();
-
-    /**
-     * Returned by wait functions to indicate the signaling state of handles.
-     */
-    public static class HandleSignalsState {
-        /**
-         * Signals that were satisfied at some time // before the call returned.
-         */
-        private final HandleSignals mSatisfiedSignals;
-
-        /**
-         * Signals that are possible to satisfy. For example, if the return value was
-         * |MOJO_RESULT_FAILED_PRECONDITION|, you can use this field to determine which, if any, of
-         * the signals can still be satisfied.
-         */
-        private final HandleSignals mSatisfiableSignals;
-
-        /**
-         * Constructor.
-         */
-        public HandleSignalsState(
-                HandleSignals satisfiedSignals, HandleSignals satisfiableSignals) {
-            mSatisfiedSignals = satisfiedSignals;
-            mSatisfiableSignals = satisfiableSignals;
-        }
-
-        /**
-         * Returns the satisfiedSignals.
-         */
-        public HandleSignals getSatisfiedSignals() {
-            return mSatisfiedSignals;
-        }
-
-        /**
-         * Returns the satisfiableSignals.
-         */
-        public HandleSignals getSatisfiableSignals() {
-            return mSatisfiableSignals;
-        }
-    }
-
-    /**
-     * Creates a message pipe, which is a bidirectional communication channel for framed data (i.e.,
-     * messages), with the given options. Messages can contain plain data and/or Mojo handles.
-     *
-     * @return the set of handles for the two endpoints (ports) of the message pipe.
-     */
-    public Pair<MessagePipeHandle, MessagePipeHandle> createMessagePipe(
-            MessagePipeHandle.CreateOptions options);
-
-    /**
-     * Creates a data pipe, which is a unidirectional communication channel for unframed data, with
-     * the given options. Data is unframed, but must come as (multiples of) discrete elements, of
-     * the size given in |options|. See |DataPipe.CreateOptions| for a description of the different
-     * options available for data pipes. |options| may be set to null for a data pipe with the
-     * default options (which will have an element size of one byte and have some system-dependent
-     * capacity).
-     *
-     * @return the set of handles for the two endpoints of the data pipe.
-     */
-    public Pair<DataPipe.ProducerHandle, DataPipe.ConsumerHandle> createDataPipe(
-            DataPipe.CreateOptions options);
-
-    /**
-     * Creates a buffer that can be shared between applications (by duplicating the handle -- see
-     * |SharedBufferHandle.duplicate()| -- and passing it over a message pipe). To access the
-     * buffer, one must call |SharedBufferHandle.map|.
-     *
-     * @return the new |SharedBufferHandle|.
-     */
-    public SharedBufferHandle createSharedBuffer(SharedBufferHandle.CreateOptions options,
-            long numBytes);
-
-    /**
-     * Acquires a handle from the native side. The handle will be owned by the returned object and
-     * must not be closed outside of it.
-     *
-     * @return a new {@link UntypedHandle} representing the native handle.
-     */
-    public UntypedHandle acquireNativeHandle(int handle);
-
-    /**
-     * Returns an implementation of {@link Watcher}.
-     */
-    public Watcher getWatcher();
-
-    /**
-     * Returns a new run loop.
-     */
-    public RunLoop createDefaultRunLoop();
-
-    /**
-     * Returns the current run loop if it exists.
-     */
-    public RunLoop getCurrentRunLoop();
-}
diff --git a/mojo/public/java/system/src/org/chromium/mojo/system/DataPipe.java b/mojo/public/java/system/src/org/chromium/mojo/system/DataPipe.java
deleted file mode 100644
index 4deaf09..0000000
--- a/mojo/public/java/system/src/org/chromium/mojo/system/DataPipe.java
+++ /dev/null
@@ -1,334 +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.
-
-package org.chromium.mojo.system;
-
-import java.nio.ByteBuffer;
-
-/**
- * Interface for data pipes. A data pipe is a unidirectional communication channel for unframed
- * data. Data is unframed, but must come as (multiples of) discrete elements, of the size given at
- * creation time.
- */
-public interface DataPipe {
-
-    /**
-     * Flags for the data pipe creation operation.
-     */
-    public static class CreateFlags extends Flags<CreateFlags> {
-        private static final int FLAG_NONE = 0;
-
-        /**
-         * Immutable flag with not bit set.
-         */
-        public static final CreateFlags NONE = CreateFlags.none().immutable();
-
-        /**
-         * Dedicated constructor.
-         *
-         * @param flags initial value of the flags.
-         */
-        protected CreateFlags(int flags) {
-            super(flags);
-        }
-
-        /**
-         * @return flags with no bit set.
-         */
-        public static CreateFlags none() {
-            return new CreateFlags(FLAG_NONE);
-        }
-
-    }
-
-    /**
-     * Used to specify creation parameters for a data pipe to |Core.createDataPipe()|.
-     */
-    public static class CreateOptions {
-
-        /**
-         * Used to specify different modes of operation, see |DataPipe.CreateFlags|.
-         */
-        private CreateFlags mFlags = CreateFlags.none();
-        /**
-         * The size of an element, in bytes. All transactions and buffers will consist of an
-         * integral number of elements. Must be nonzero.
-         */
-        private int mElementNumBytes;
-        /**
-         * The capacity of the data pipe, in number of bytes; must be a multiple of
-         * |element_num_bytes|. The data pipe will always be able to queue AT LEAST this much data.
-         * Set to zero to opt for a system-dependent automatically-calculated capacity (which will
-         * always be at least one element).
-         */
-        private int mCapacityNumBytes;
-
-        /**
-         * @return the flags
-         */
-        public CreateFlags getFlags() {
-            return mFlags;
-        }
-
-        /**
-         * @return the elementNumBytes
-         */
-        public int getElementNumBytes() {
-            return mElementNumBytes;
-        }
-
-        /**
-         * @param elementNumBytes the elementNumBytes to set
-         */
-        public void setElementNumBytes(int elementNumBytes) {
-            mElementNumBytes = elementNumBytes;
-        }
-
-        /**
-         * @return the capacityNumBytes
-         */
-        public int getCapacityNumBytes() {
-            return mCapacityNumBytes;
-        }
-
-        /**
-         * @param capacityNumBytes the capacityNumBytes to set
-         */
-        public void setCapacityNumBytes(int capacityNumBytes) {
-            mCapacityNumBytes = capacityNumBytes;
-        }
-
-    }
-
-    /**
-     * Flags for the write operations on MessagePipeHandle .
-     */
-    public static class WriteFlags extends Flags<WriteFlags> {
-        private static final int FLAG_NONE = 0;
-        private static final int FLAG_ALL_OR_NONE = 1 << 0;
-
-        /**
-         * Immutable flag with not bit set.
-         */
-        public static final WriteFlags NONE = WriteFlags.none().immutable();
-
-        /**
-         * Dedicated constructor.
-         *
-         * @param flags initial value of the flags.
-         */
-        private WriteFlags(int flags) {
-            super(flags);
-        }
-
-        /**
-         * Change the all-or-none bit of those flags. If set, write either all the elements
-         * requested or none of them.
-         *
-         * @param allOrNone the new value of all-or-none bit.
-         * @return this.
-         */
-        public WriteFlags setAllOrNone(boolean allOrNone) {
-            return setFlag(FLAG_ALL_OR_NONE, allOrNone);
-        }
-
-        /**
-         * @return a flag with no bit set.
-         */
-        public static WriteFlags none() {
-            return new WriteFlags(FLAG_NONE);
-        }
-    }
-
-    /**
-     * Flags for the read operations on MessagePipeHandle.
-     */
-    public static class ReadFlags extends Flags<ReadFlags> {
-        private static final int FLAG_NONE = 0;
-        private static final int FLAG_ALL_OR_NONE = 1 << 0;
-        private static final int FLAG_QUERY = 1 << 2;
-        private static final int FLAG_PEEK = 1 << 3;
-
-        /**
-         * Immutable flag with not bit set.
-         */
-        public static final ReadFlags NONE = ReadFlags.none().immutable();
-
-        /**
-         * Dedicated constructor.
-         *
-         * @param flags initial value of the flag.
-         */
-        private ReadFlags(int flags) {
-            super(flags);
-        }
-
-        /**
-         * Change the all-or-none bit of this flag. If set, read (or discard) either the requested
-         * number of elements or none.
-         *
-         * @param allOrNone the new value of the all-or-none bit.
-         * @return this.
-         */
-        public ReadFlags setAllOrNone(boolean allOrNone) {
-            return setFlag(FLAG_ALL_OR_NONE, allOrNone);
-        }
-
-        /**
-         * Change the query bit of this flag. If set query the number of elements available to read.
-         * Mutually exclusive with |discard| and |allOrNone| is ignored if this flag is set.
-         *
-         * @param query the new value of the query bit.
-         * @return this.
-         */
-        public ReadFlags query(boolean query) {
-            return setFlag(FLAG_QUERY, query);
-        }
-
-        /**
-         * Change the peek bit of this flag. If set, read the requested number of elements, and
-         * leave those elements in the pipe. A later read will return the same data.
-         * Mutually exclusive with |discard| and |query|.
-         *
-         * @param peek the new value of the peek bit.
-         * @return this.
-         */
-        public ReadFlags peek(boolean peek) {
-            return setFlag(FLAG_PEEK, peek);
-        }
-
-        /**
-         * @return a flag with no bit set.
-         */
-        public static ReadFlags none() {
-            return new ReadFlags(FLAG_NONE);
-        }
-
-    }
-
-    /**
-     * Handle for the producer part of a data pipe.
-     */
-    public static interface ProducerHandle extends Handle {
-
-        /**
-         * @see org.chromium.mojo.system.Handle#pass()
-         */
-        @Override
-        public ProducerHandle pass();
-
-        /**
-         * Writes the given data to the data pipe producer. |elements| points to data; the buffer
-         * must be a direct ByteBuffer and the limit should be a multiple of the data pipe's element
-         * size. If |allOrNone| is set in |flags|, either all the data will be written or none is.
-         * <p>
-         * On success, returns the amount of data that was actually written.
-         * <p>
-         * Note: If the data pipe has the "may discard" option flag (specified on creation), this
-         * will discard as much data as required to write the given data, starting with the earliest
-         * written data that has not been consumed. However, even with "may discard", if the buffer
-         * limit is greater than the data pipe's capacity (and |allOrNone| is not set), this will
-         * write the maximum amount possible (namely, the data pipe's capacity) and return that
-         * amount. It will *not* discard data from |elements|.
-         *
-         * @return number of written bytes.
-         */
-        public ResultAnd<Integer> writeData(ByteBuffer elements, WriteFlags flags);
-
-        /**
-         * Begins a two-phase write to the data pipe producer . On success, returns a |ByteBuffer|
-         * to which the caller can write. If flags has |allOrNone| set, then the buffer capacity
-         * will be at least as large as |numBytes|, which must also be a multiple of the element
-         * size (if |allOrNone| is not set, |numBytes| is ignored and the caller must check the
-         * capacity of the buffer).
-         * <p>
-         * During a two-phase write, this handle is *not* writable. E.g., if another thread tries to
-         * write to it, it will throw a |MojoException| with code |MojoResult.BUSY|; that thread can
-         * then wait for this handle to become writable again.
-         * <p>
-         * Once the caller has finished writing data to the buffer, it should call |endWriteData()|
-         * to specify the amount written and to complete the two-phase write.
-         * <p>
-         * Note: If the data pipe has the "may discard" option flag (specified on creation) and
-         * |flags| has |allOrNone| set, this may discard some data.
-         *
-         * @return The buffer to write to.
-         */
-        public ByteBuffer beginWriteData(int numBytes, WriteFlags flags);
-
-        /**
-         * Ends a two-phase write to the data pipe producer that was begun by a call to
-         * |beginWriteData()| on the same handle. |numBytesWritten| should indicate the amount of
-         * data actually written; it must be less than or equal to the capacity of the buffer
-         * returned by |beginWriteData()| and must be a multiple of the element size. The buffer
-         * returned from |beginWriteData()| must have been filled with exactly |numBytesWritten|
-         * bytes of data.
-         * <p>
-         * On failure, the two-phase write (if any) is ended (so the handle may become writable
-         * again, if there's space available) but no data written to the buffer is "put into" the
-         * data pipe.
-         */
-        public void endWriteData(int numBytesWritten);
-    }
-
-    /**
-     * Handle for the consumer part of a data pipe.
-     */
-    public static interface ConsumerHandle extends Handle {
-        /**
-         * @see org.chromium.mojo.system.Handle#pass()
-         */
-        @Override
-        public ConsumerHandle pass();
-
-       /**
-         * Discards data on the data pie consumer. This method discards up to |numBytes| (which
-         * again be a multiple of the element size) bytes of data, returning the amount actually
-         * discarded. if |flags| has |allOrNone|, it will either discard exactly |numBytes| bytes of
-         * data or none. In this case, |query| must not be set.
-         */
-        public int discardData(int numBytes, ReadFlags flags);
-
-        /**
-         * Reads data from the data pipe consumer. May also be used to query the amount of data
-         * available. If |flags| has not |query| set, this tries to read up to |elements| capacity
-         * (which must be a multiple of the data pipe's element size) bytes of data to |elements|
-         * and returns the amount actually read. |elements| must be a direct ByteBuffer. If flags
-         * has |allOrNone| set, it will either read exactly |elements| capacity bytes of data or
-         * none.
-         * <p>
-         * If flags has |query| set, it queries the amount of data available, returning the number
-         * of bytes available. In this case |allOrNone| is ignored, as are |elements|.
-         */
-        public ResultAnd<Integer> readData(ByteBuffer elements, ReadFlags flags);
-
-        /**
-         * Begins a two-phase read from the data pipe consumer. On success, returns a |ByteBuffer|
-         * from which the caller can read up to its limit bytes of data. If flags has |allOrNone|
-         * set, then the limit will be at least as large as |numBytes|, which must also be a
-         * multiple of the element size (if |allOrNone| is not set, |numBytes| is ignored). |flags|
-         * must not have |query| set.
-         * <p>
-         * During a two-phase read, this handle is *not* readable. E.g., if another thread tries to
-         * read from it, it will throw a |MojoException| with code |MojoResult.BUSY|; that thread
-         * can then wait for this handle to become readable again.
-         * <p>
-         * Once the caller has finished reading data from the buffer, it should call |endReadData()|
-         * to specify the amount read and to complete the two-phase read.
-         */
-        public ByteBuffer beginReadData(int numBytes, ReadFlags flags);
-
-        /**
-         * Ends a two-phase read from the data pipe consumer that was begun by a call to
-         * |beginReadData()| on the same handle. |numBytesRead| should indicate the amount of data
-         * actually read; it must be less than or equal to the limit of the buffer returned by
-         * |beginReadData()| and must be a multiple of the element size.
-         * <p>
-         * On failure, the two-phase read (if any) is ended (so the handle may become readable
-         * again) but no data is "removed" from the data pipe.
-         */
-        public void endReadData(int numBytesRead);
-    }
-
-}
diff --git a/mojo/public/java/system/src/org/chromium/mojo/system/Flags.java b/mojo/public/java/system/src/org/chromium/mojo/system/Flags.java
deleted file mode 100644
index 30ff07f..0000000
--- a/mojo/public/java/system/src/org/chromium/mojo/system/Flags.java
+++ /dev/null
@@ -1,83 +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.
-
-package org.chromium.mojo.system;
-
-/**
- * Base class for bit field used as flags.
- *
- * @param <F> the type of the flags.
- */
-public abstract class Flags<F extends Flags<F>> {
-    private int mFlags;
-    private boolean mImmutable;
-
-    /**
-     * Dedicated constructor.
-     *
-     * @param flags initial value of the flag.
-     */
-    protected Flags(int flags) {
-        mImmutable = false;
-        mFlags = flags;
-    }
-
-    /**
-     * @return the computed flag.
-     */
-    public int getFlags() {
-        return mFlags;
-    }
-
-    /**
-     * Change the given bit of this flag.
-     *
-     * @param value the new value of given bit.
-     * @return this.
-     */
-    protected F setFlag(int flag, boolean value) {
-        if (mImmutable) {
-            throw new UnsupportedOperationException("Flags is immutable.");
-        }
-        if (value) {
-            mFlags |= flag;
-        } else {
-            mFlags &= ~flag;
-        }
-        @SuppressWarnings("unchecked")
-        F f = (F) this;
-        return f;
-    }
-
-    /**
-     * Makes this flag immutable. This is a non-reversable operation.
-     */
-    protected F immutable() {
-        mImmutable = true;
-        @SuppressWarnings("unchecked")
-        F f = (F) this;
-        return f;
-    }
-
-    /**
-     * @see Object#hashCode()
-     */
-    @Override
-    public int hashCode() {
-        return mFlags;
-    }
-
-    /**
-     * @see Object#equals(Object)
-     */
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) return true;
-        if (obj == null) return false;
-        if (getClass() != obj.getClass()) return false;
-        Flags<?> other = (Flags<?>) obj;
-        if (mFlags != other.mFlags) return false;
-        return true;
-    }
-}
diff --git a/mojo/public/java/system/src/org/chromium/mojo/system/Handle.java b/mojo/public/java/system/src/org/chromium/mojo/system/Handle.java
deleted file mode 100644
index 903f36d..0000000
--- a/mojo/public/java/system/src/org/chromium/mojo/system/Handle.java
+++ /dev/null
@@ -1,61 +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.
-
-package org.chromium.mojo.system;
-
-import org.chromium.mojo.system.Core.HandleSignalsState;
-
-import java.io.Closeable;
-
-/**
- * A generic mojo handle.
- */
-public interface Handle extends Closeable {
-
-    /**
-     * Closes the given |handle|.
-     * <p>
-     * Concurrent operations on |handle| may succeed (or fail as usual) if they happen before the
-     * close, be cancelled with result |MojoResult.CANCELLED| if they properly overlap (this is
-     * likely the case with |wait()|, etc.), or fail with |MojoResult.INVALID_ARGUMENT| if they
-     * happen after.
-     */
-    @Override
-    public void close();
-
-    /**
-     * @return the last known signaling state of the handle.
-     */
-    public HandleSignalsState querySignalsState();
-
-    /**
-     * @return whether the handle is valid. A handle is valid until it has been explicitly closed or
-     *         send through a message pipe via |MessagePipeHandle.writeMessage|.
-     */
-    public boolean isValid();
-
-    /**
-     * Converts this handle into an {@link UntypedHandle}, invalidating this handle.
-     */
-    public UntypedHandle toUntypedHandle();
-
-    /**
-     * Returns the {@link Core} implementation for this handle. Can be null if this handle is
-     * invalid.
-     */
-    public Core getCore();
-
-    /**
-     * Passes ownership of the handle from this handle to the newly created Handle object,
-     * invalidating this handle object in the process.
-     */
-    public Handle pass();
-
-    /**
-     * Releases the native handle backed by this {@link Handle}. The caller owns the handle and must
-     * close it.
-     */
-    public int releaseNativeHandle();
-
-}
diff --git a/mojo/public/java/system/src/org/chromium/mojo/system/InvalidHandle.java b/mojo/public/java/system/src/org/chromium/mojo/system/InvalidHandle.java
deleted file mode 100644
index f8b99c6..0000000
--- a/mojo/public/java/system/src/org/chromium/mojo/system/InvalidHandle.java
+++ /dev/null
@@ -1,219 +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.
-
-package org.chromium.mojo.system;
-
-import org.chromium.mojo.system.Core.HandleSignalsState;
-import org.chromium.mojo.system.DataPipe.ConsumerHandle;
-import org.chromium.mojo.system.DataPipe.ProducerHandle;
-
-import java.nio.ByteBuffer;
-import java.util.List;
-
-/**
- * A handle that will always be invalid.
- */
-public class InvalidHandle implements UntypedHandle, MessagePipeHandle, ConsumerHandle,
-        ProducerHandle, SharedBufferHandle {
-
-    /**
-     * Instance singleton.
-     */
-    public static final InvalidHandle INSTANCE = new InvalidHandle();
-
-    /**
-     * Private constructor.
-     */
-    private InvalidHandle() {
-    }
-
-    /**
-     * @see Handle#close()
-     */
-    @Override
-    public void close() {
-        // Do nothing.
-    }
-
-    /**
-     * @see Handle#querySignalsState()
-     */
-    @Override
-    public HandleSignalsState querySignalsState() {
-        throw new MojoException(MojoResult.INVALID_ARGUMENT);
-    }
-
-    /**
-     * @see Handle#isValid()
-     */
-    @Override
-    public boolean isValid() {
-        return false;
-    }
-
-    /**
-     * @see Handle#getCore()
-     */
-    @Override
-    public Core getCore() {
-        return null;
-    }
-
-    /**
-     * @see org.chromium.mojo.system.Handle#pass()
-     */
-    @Override
-    public InvalidHandle pass() {
-        return this;
-    }
-
-    /**
-     * @see Handle#toUntypedHandle()
-     */
-    @Override
-    public UntypedHandle toUntypedHandle() {
-        return this;
-    }
-
-    /**
-     * @see Handle#releaseNativeHandle()
-     */
-    @Override
-    public int releaseNativeHandle() {
-        return 0;
-    }
-
-    /**
-     * @see UntypedHandle#toMessagePipeHandle()
-     */
-    @Override
-    public MessagePipeHandle toMessagePipeHandle() {
-        return this;
-    }
-
-    /**
-     * @see UntypedHandle#toDataPipeConsumerHandle()
-     */
-    @Override
-    public ConsumerHandle toDataPipeConsumerHandle() {
-        return this;
-    }
-
-    /**
-     * @see UntypedHandle#toDataPipeProducerHandle()
-     */
-    @Override
-    public ProducerHandle toDataPipeProducerHandle() {
-        return this;
-    }
-
-    /**
-     * @see UntypedHandle#toSharedBufferHandle()
-     */
-    @Override
-    public SharedBufferHandle toSharedBufferHandle() {
-        return this;
-    }
-
-    /**
-     * @see SharedBufferHandle#duplicate(SharedBufferHandle.DuplicateOptions)
-     */
-    @Override
-    public SharedBufferHandle duplicate(DuplicateOptions options) {
-        throw new MojoException(MojoResult.INVALID_ARGUMENT);
-    }
-
-    /**
-     * @see SharedBufferHandle#map(long, long, SharedBufferHandle.MapFlags)
-     */
-    @Override
-    public ByteBuffer map(long offset, long numBytes, MapFlags flags) {
-        throw new MojoException(MojoResult.INVALID_ARGUMENT);
-    }
-
-    /**
-     * @see SharedBufferHandle#unmap(java.nio.ByteBuffer)
-     */
-    @Override
-    public void unmap(ByteBuffer buffer) {
-        throw new MojoException(MojoResult.INVALID_ARGUMENT);
-    }
-
-    /**
-     * @see DataPipe.ProducerHandle#writeData(java.nio.ByteBuffer, DataPipe.WriteFlags)
-     */
-    @Override
-    public ResultAnd<Integer> writeData(ByteBuffer elements, DataPipe.WriteFlags flags) {
-        throw new MojoException(MojoResult.INVALID_ARGUMENT);
-    }
-
-    /**
-     * @see DataPipe.ProducerHandle#beginWriteData(int, DataPipe.WriteFlags)
-     */
-    @Override
-    public ByteBuffer beginWriteData(int numBytes,
-            DataPipe.WriteFlags flags) {
-        throw new MojoException(MojoResult.INVALID_ARGUMENT);
-    }
-
-    /**
-     * @see DataPipe.ProducerHandle#endWriteData(int)
-     */
-    @Override
-    public void endWriteData(int numBytesWritten) {
-        throw new MojoException(MojoResult.INVALID_ARGUMENT);
-    }
-
-    /**
-     * @see DataPipe.ConsumerHandle#discardData(int, DataPipe.ReadFlags)
-     */
-    @Override
-    public int discardData(int numBytes, DataPipe.ReadFlags flags) {
-        throw new MojoException(MojoResult.INVALID_ARGUMENT);
-    }
-
-    /**
-     * @see DataPipe.ConsumerHandle#readData(java.nio.ByteBuffer, DataPipe.ReadFlags)
-     */
-    @Override
-    public ResultAnd<Integer> readData(ByteBuffer elements, DataPipe.ReadFlags flags) {
-        throw new MojoException(MojoResult.INVALID_ARGUMENT);
-    }
-
-    /**
-     * @see DataPipe.ConsumerHandle#beginReadData(int, DataPipe.ReadFlags)
-     */
-    @Override
-    public ByteBuffer beginReadData(int numBytes,
-            DataPipe.ReadFlags flags) {
-        throw new MojoException(MojoResult.INVALID_ARGUMENT);
-    }
-
-    /**
-     * @see DataPipe.ConsumerHandle#endReadData(int)
-     */
-    @Override
-    public void endReadData(int numBytesRead) {
-        throw new MojoException(MojoResult.INVALID_ARGUMENT);
-    }
-
-    /**
-     * @see MessagePipeHandle#writeMessage(java.nio.ByteBuffer, java.util.List,
-     *      MessagePipeHandle.WriteFlags)
-     */
-    @Override
-    public void writeMessage(ByteBuffer bytes, List<? extends Handle> handles, WriteFlags flags) {
-        throw new MojoException(MojoResult.INVALID_ARGUMENT);
-    }
-
-    /**
-     * @see MessagePipeHandle#readMessage(java.nio.ByteBuffer, int, MessagePipeHandle.ReadFlags)
-     */
-    @Override
-    public ResultAnd<ReadMessageResult> readMessage(
-            ByteBuffer bytes, int maxNumberOfHandles, ReadFlags flags) {
-        throw new MojoException(MojoResult.INVALID_ARGUMENT);
-    }
-
-}
diff --git a/mojo/public/java/system/src/org/chromium/mojo/system/MessagePipeHandle.java b/mojo/public/java/system/src/org/chromium/mojo/system/MessagePipeHandle.java
deleted file mode 100644
index deb6ac0..0000000
--- a/mojo/public/java/system/src/org/chromium/mojo/system/MessagePipeHandle.java
+++ /dev/null
@@ -1,224 +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.
-
-package org.chromium.mojo.system;
-
-import java.nio.ByteBuffer;
-import java.util.List;
-
-/**
- * Message pipes are bidirectional communication channel for framed data (i.e., messages). Messages
- * can contain plain data and/or Mojo handles.
- */
-public interface MessagePipeHandle extends Handle {
-
-    /**
-     * Flags for the message pipe creation operation.
-     */
-    public static class CreateFlags extends Flags<CreateFlags> {
-        private static final int FLAG_NONE = 0;
-
-        /**
-         * Immutable flag with not bit set.
-         */
-        public static final CreateFlags NONE = CreateFlags.none().immutable();
-
-        /**
-         * Dedicated constructor.
-         *
-         * @param flags initial value of the flags.
-         */
-        protected CreateFlags(int flags) {
-            super(flags);
-        }
-
-        /**
-         * @return flags with no bit set.
-         */
-        public static CreateFlags none() {
-            return new CreateFlags(FLAG_NONE);
-        }
-
-    }
-
-    /**
-     * Used to specify creation parameters for a message pipe to |Core#createMessagePipe()|.
-     */
-    public static class CreateOptions {
-        private CreateFlags mFlags = CreateFlags.NONE;
-
-        /**
-         * @return the flags
-         */
-        public CreateFlags getFlags() {
-            return mFlags;
-        }
-
-    }
-
-    /**
-     * Flags for the write operations on MessagePipeHandle .
-     */
-    public static class WriteFlags extends Flags<WriteFlags> {
-        private static final int FLAG_NONE = 0;
-
-        /**
-         * Immutable flag with no bit set.
-         */
-        public static final WriteFlags NONE = WriteFlags.none().immutable();
-
-        /**
-         * Dedicated constructor.
-         *
-         * @param flags initial value of the flag.
-         */
-        private WriteFlags(int flags) {
-            super(flags);
-        }
-
-        /**
-         * @return a flag with no bit set.
-         */
-        public static WriteFlags none() {
-            return new WriteFlags(FLAG_NONE);
-        }
-    }
-
-    /**
-     * Flags for the read operations on MessagePipeHandle.
-     */
-    public static class ReadFlags extends Flags<ReadFlags> {
-        private static final int FLAG_NONE = 0;
-        private static final int FLAG_MAY_DISCARD = 1 << 0;
-
-        /**
-         * Immutable flag with no bit set.
-         */
-        public static final ReadFlags NONE = ReadFlags.none().immutable();
-
-        /**
-         * Dedicated constructor.
-         *
-         * @param flags initial value of the flag.
-         */
-        private ReadFlags(int flags) {
-            super(flags);
-        }
-
-        /**
-         * Change the may-discard bit of this flag. If set, if the message is unable to be read for
-         * whatever reason (e.g., the caller-supplied buffer is too small), discard the message
-         * (i.e., simply dequeue it).
-         *
-         * @param mayDiscard the new value of the may-discard bit.
-         * @return this.
-         */
-        public ReadFlags setMayDiscard(boolean mayDiscard) {
-            return setFlag(FLAG_MAY_DISCARD, mayDiscard);
-        }
-
-        /**
-         * @return a flag with no bit set.
-         */
-        public static ReadFlags none() {
-            return new ReadFlags(FLAG_NONE);
-        }
-
-    }
-
-    /**
-     * Result of the |readMessage| method.
-     */
-    public static class ReadMessageResult {
-        /**
-         * If a message was read, the size in bytes of the message, otherwise the size in bytes of
-         * the next message.
-         */
-        private int mMessageSize;
-        /**
-         * If a message was read, the number of handles contained in the message, otherwise the
-         * number of handles contained in the next message.
-         */
-        private int mHandlesCount;
-        /**
-         * If a message was read, the handles contained in the message, undefined otherwise.
-         */
-        private List<UntypedHandle> mHandles;
-
-        /**
-         * @return the messageSize
-         */
-        public int getMessageSize() {
-            return mMessageSize;
-        }
-
-        /**
-         * @param messageSize the messageSize to set
-         */
-        public void setMessageSize(int messageSize) {
-            mMessageSize = messageSize;
-        }
-
-        /**
-         * @return the handlesCount
-         */
-        public int getHandlesCount() {
-            return mHandlesCount;
-        }
-
-        /**
-         * @param handlesCount the handlesCount to set
-         */
-        public void setHandlesCount(int handlesCount) {
-            mHandlesCount = handlesCount;
-        }
-
-        /**
-         * @return the handles
-         */
-        public List<UntypedHandle> getHandles() {
-            return mHandles;
-        }
-
-        /**
-         * @param handles the handles to set
-         */
-        public void setHandles(List<UntypedHandle> handles) {
-            mHandles = handles;
-        }
-    }
-
-    /**
-     * @see org.chromium.mojo.system.Handle#pass()
-     */
-    @Override
-    public MessagePipeHandle pass();
-
-    /**
-     * Writes a message to the message pipe endpoint, with message data specified by |bytes| and
-     * attached handles specified by |handles|, and options specified by |flags|. If there is no
-     * message data, |bytes| may be null, otherwise it must be a direct ByteBuffer. If there are no
-     * attached handles, |handles| may be null.
-     * <p>
-     * If handles are attached, on success the handles will no longer be valid (the receiver will
-     * receive equivalent, but logically different, handles). Handles to be sent should not be in
-     * simultaneous use (e.g., on another thread).
-     */
-    void writeMessage(ByteBuffer bytes, List<? extends Handle> handles, WriteFlags flags);
-
-    /**
-     * Reads a message from the message pipe endpoint; also usable to query the size of the next
-     * message or discard the next message. |bytes| indicate the buffer/buffer size to receive the
-     * message data (if any) and |maxNumberOfHandles| indicate the maximum handle count to receive
-     * the attached handles (if any). |bytes| is optional. If null, |maxNumberOfHandles| must be
-     * zero, and the return value will indicate the size of the next message. If non-null, it must
-     * be a direct ByteBuffer and the return value will indicate if the message was read or not. If
-     * the message was read its content will be in |bytes|, and the attached handles will be in the
-     * return value. Partial reads are NEVER done. Either a full read is done and |wasMessageRead|
-     * will be true, or the read is NOT done and |wasMessageRead| will be false (if |mayDiscard| was
-     * set, the message is also discarded in this case).
-     */
-    ResultAnd<ReadMessageResult> readMessage(
-            ByteBuffer bytes, int maxNumberOfHandles, ReadFlags flags);
-}
diff --git a/mojo/public/java/system/src/org/chromium/mojo/system/MojoException.java b/mojo/public/java/system/src/org/chromium/mojo/system/MojoException.java
deleted file mode 100644
index 4e0e3e9..0000000
--- a/mojo/public/java/system/src/org/chromium/mojo/system/MojoException.java
+++ /dev/null
@@ -1,44 +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.
-
-package org.chromium.mojo.system;
-
-/**
- * Exception for the core mojo API.
- */
-public class MojoException extends RuntimeException {
-
-    private final int mCode;
-
-    /**
-     * Constructor.
-     */
-    public MojoException(int code) {
-        mCode = code;
-    }
-
-    /**
-     * Constructor.
-     */
-    public MojoException(Throwable cause) {
-        super(cause);
-        mCode = MojoResult.UNKNOWN;
-    }
-
-    /**
-     * The mojo result code associated with this exception. See {@link MojoResult} for possible
-     * values.
-     */
-    public int getMojoResult() {
-        return mCode;
-    }
-
-    /**
-     * @see Object#toString()
-     */
-    @Override
-    public String toString() {
-        return "MojoResult(" + mCode + "): " + MojoResult.describe(mCode);
-    }
-}
diff --git a/mojo/public/java/system/src/org/chromium/mojo/system/MojoResult.java b/mojo/public/java/system/src/org/chromium/mojo/system/MojoResult.java
deleted file mode 100644
index 2602cb5..0000000
--- a/mojo/public/java/system/src/org/chromium/mojo/system/MojoResult.java
+++ /dev/null
@@ -1,82 +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.
-
-package org.chromium.mojo.system;
-
-/**
- * The different mojo result codes.
- */
-public final class MojoResult {
-    public static final int OK = 0;
-    public static final int CANCELLED = 1;
-    public static final int UNKNOWN = 2;
-    public static final int INVALID_ARGUMENT = 3;
-    public static final int DEADLINE_EXCEEDED = 4;
-    public static final int NOT_FOUND = 5;
-    public static final int ALREADY_EXISTS = 6;
-    public static final int PERMISSION_DENIED = 7;
-    public static final int RESOURCE_EXHAUSTED = 8;
-    public static final int FAILED_PRECONDITION = 9;
-    public static final int ABORTED = 10;
-    public static final int OUT_OF_RANGE = 11;
-    public static final int UNIMPLEMENTED = 12;
-    public static final int INTERNAL = 13;
-    public static final int UNAVAILABLE = 14;
-    public static final int DATA_LOSS = 15;
-    public static final int BUSY = 16;
-    public static final int SHOULD_WAIT = 17;
-
-    /**
-     * never instantiate.
-     */
-    private MojoResult() {
-    }
-
-    /**
-     * Describes the given result code.
-     */
-    public static String describe(int mCode) {
-        switch (mCode) {
-            case OK:
-                return "OK";
-            case CANCELLED:
-                return "CANCELLED";
-            case UNKNOWN:
-                return "UNKNOWN";
-            case INVALID_ARGUMENT:
-                return "INVALID_ARGUMENT";
-            case DEADLINE_EXCEEDED:
-                return "DEADLINE_EXCEEDED";
-            case NOT_FOUND:
-                return "NOT_FOUND";
-            case ALREADY_EXISTS:
-                return "ALREADY_EXISTS";
-            case PERMISSION_DENIED:
-                return "PERMISSION_DENIED";
-            case RESOURCE_EXHAUSTED:
-                return "RESOURCE_EXHAUSTED";
-            case FAILED_PRECONDITION:
-                return "FAILED_PRECONDITION";
-            case ABORTED:
-                return "ABORTED";
-            case OUT_OF_RANGE:
-                return "OUT_OF_RANGE";
-            case UNIMPLEMENTED:
-                return "UNIMPLEMENTED";
-            case INTERNAL:
-                return "INTERNAL";
-            case UNAVAILABLE:
-                return "UNAVAILABLE";
-            case DATA_LOSS:
-                return "DATA_LOSS";
-            case BUSY:
-                return "BUSY";
-            case SHOULD_WAIT:
-                return "SHOULD_WAIT";
-            default:
-                return "UNKNOWN";
-        }
-
-    }
-}
diff --git a/mojo/public/java/system/src/org/chromium/mojo/system/Pair.java b/mojo/public/java/system/src/org/chromium/mojo/system/Pair.java
deleted file mode 100644
index 2ead020..0000000
--- a/mojo/public/java/system/src/org/chromium/mojo/system/Pair.java
+++ /dev/null
@@ -1,67 +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.
-
-package org.chromium.mojo.system;
-
-
-/**
- * A pair of object.
- *
- * @param <F> Type of the first element.
- * @param <S> Type of the second element.
- */
-public class Pair<F, S> {
-
-    public final F first;
-    public final S second;
-
-    /**
-     * Dedicated constructor.
-     *
-     * @param first the first element of the pair.
-     * @param second the second element of the pair.
-     */
-    public Pair(F first, S second) {
-        this.first = first;
-        this.second = second;
-    }
-
-    /**
-     * equals() that handles null values.
-     */
-    private boolean equals(Object o1, Object o2) {
-        return o1 == null ? o2 == null : o1.equals(o2);
-    }
-
-    /**
-     * @see Object#equals(Object)
-     */
-    @Override
-    public boolean equals(Object o) {
-        if (!(o instanceof Pair)) {
-            return false;
-        }
-        Pair<?, ?> p = (Pair<?, ?>) o;
-        return equals(first, p.first) && equals(second, p.second);
-    }
-
-    /**
-     * @see Object#hashCode()
-     */
-    @Override
-    public int hashCode() {
-        return (first == null ? 0 : first.hashCode()) ^ (second == null ? 0 : second.hashCode());
-    }
-
-    /**
-     * Helper method for creating a pair.
-     *
-     * @param a the first element of the pair.
-     * @param b the second element of the pair.
-     * @return the pair containing a and b.
-     */
-    public static <A, B> Pair<A, B> create(A a, B b) {
-        return new Pair<A, B>(a, b);
-    }
-}
diff --git a/mojo/public/java/system/src/org/chromium/mojo/system/ResultAnd.java b/mojo/public/java/system/src/org/chromium/mojo/system/ResultAnd.java
deleted file mode 100644
index 656d0d6..0000000
--- a/mojo/public/java/system/src/org/chromium/mojo/system/ResultAnd.java
+++ /dev/null
@@ -1,34 +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.
-
-package org.chromium.mojo.system;
-
-/**
- * Container that contains a mojo result and a value.
- *
- * @param <A> the type of the value.
- */
-public class ResultAnd<A> {
-    private final int mMojoResult;
-    private final A mValue;
-
-    public ResultAnd(int result, A value) {
-        this.mMojoResult = result;
-        this.mValue = value;
-    }
-
-    /**
-     * Returns the mojo result.
-     */
-    public int getMojoResult() {
-        return mMojoResult;
-    }
-
-    /**
-     * Returns the value.
-     */
-    public A getValue() {
-        return mValue;
-    }
-}
diff --git a/mojo/public/java/system/src/org/chromium/mojo/system/RunLoop.java b/mojo/public/java/system/src/org/chromium/mojo/system/RunLoop.java
deleted file mode 100644
index 4038b29..0000000
--- a/mojo/public/java/system/src/org/chromium/mojo/system/RunLoop.java
+++ /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.
-
-package org.chromium.mojo.system;
-
-import java.io.Closeable;
-
-/**
- * Definition of a run loop.
- */
-public interface RunLoop extends Closeable {
-    /**
-     * Start the run loop. It will continue until quit() is called.
-     */
-    public void run();
-
-    /**
-     * Start the run loop and stop it as soon as no task is present in the work queue.
-     */
-    public void runUntilIdle();
-
-    /*
-     * Quit the currently running run loop.
-     */
-    public void quit();
-
-    /**
-     * Add a runnable to the queue of tasks.
-     * @param runnable Callback to be executed by the run loop.
-     * @param delay Delay, in MojoTimeTicks (microseconds) before the callback should
-     * be executed.
-     */
-    public void postDelayedTask(Runnable runnable, long delay);
-
-    /**
-     * Destroy the run loop and deregister it from Core.
-     */
-    @Override
-    public abstract void close();
-}
diff --git a/mojo/public/java/system/src/org/chromium/mojo/system/SharedBufferHandle.java b/mojo/public/java/system/src/org/chromium/mojo/system/SharedBufferHandle.java
deleted file mode 100644
index df317d1..0000000
--- a/mojo/public/java/system/src/org/chromium/mojo/system/SharedBufferHandle.java
+++ /dev/null
@@ -1,160 +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.
-
-package org.chromium.mojo.system;
-
-import java.nio.ByteBuffer;
-
-/**
- * A buffer that can be shared between applications.
- */
-public interface SharedBufferHandle extends Handle {
-
-    /**
-     * Flags for the shared buffer creation operation.
-     */
-    public static class CreateFlags extends Flags<CreateFlags> {
-        private static final int FLAG_NONE = 0;
-
-        /**
-         * Immutable flag with not bit set.
-         */
-        public static final CreateFlags NONE = CreateFlags.none().immutable();
-
-        /**
-         * Dedicated constructor.
-         *
-         * @param flags initial value of the flags.
-         */
-        protected CreateFlags(int flags) {
-            super(flags);
-        }
-
-        /**
-         * @return flags with no bit set.
-         */
-        public static CreateFlags none() {
-            return new CreateFlags(FLAG_NONE);
-        }
-
-    }
-
-    /**
-     * Used to specify creation parameters for a shared buffer to |Core#createSharedBuffer()|.
-     */
-    public static class CreateOptions {
-        private CreateFlags mFlags = CreateFlags.NONE;
-
-        /**
-         * @return the flags
-         */
-        public CreateFlags getFlags() {
-            return mFlags;
-        }
-
-    }
-
-    /**
-     * Flags for the shared buffer duplication operation.
-     */
-    public static class DuplicateFlags extends Flags<DuplicateFlags> {
-        private static final int FLAG_NONE = 0;
-
-        /**
-         * Immutable flag with not bit set.
-         */
-        public static final DuplicateFlags NONE = DuplicateFlags.none().immutable();
-
-        /**
-         * Dedicated constructor.
-         *
-         * @param flags initial value of the flags.
-         */
-        protected DuplicateFlags(int flags) {
-            super(flags);
-        }
-
-        /**
-         * @return flags with no bit set.
-         */
-        public static DuplicateFlags none() {
-            return new DuplicateFlags(FLAG_NONE);
-        }
-
-    }
-
-    /**
-     * Used to specify parameters in duplicating access to a shared buffer to
-     * |SharedBufferHandle#duplicate|
-     */
-    public static class DuplicateOptions {
-        private DuplicateFlags mFlags = DuplicateFlags.NONE;
-
-        /**
-         * @return the flags
-         */
-        public DuplicateFlags getFlags() {
-            return mFlags;
-        }
-
-    }
-
-    /**
-     * Flags for the shared buffer map operation.
-     */
-    public static class MapFlags extends Flags<MapFlags> {
-        private static final int FLAG_NONE = 0;
-
-        /**
-         * Immutable flag with not bit set.
-         */
-        public static final MapFlags NONE = MapFlags.none().immutable();
-
-        /**
-         * Dedicated constructor.
-         *
-         * @param flags initial value of the flags.
-         */
-        protected MapFlags(int flags) {
-            super(flags);
-        }
-
-        /**
-         * @return flags with no bit set.
-         */
-        public static MapFlags none() {
-            return new MapFlags(FLAG_NONE);
-        }
-
-    }
-
-    /**
-     * @see org.chromium.mojo.system.Handle#pass()
-     */
-    @Override
-    public SharedBufferHandle pass();
-
-    /**
-     * Duplicates the handle. This creates another handle (returned on success), which can then be
-     * sent to another application over a message pipe, while retaining access to this handle (and
-     * any mappings that it may have).
-     */
-    public SharedBufferHandle duplicate(DuplicateOptions options);
-
-    /**
-     * Map the part (at offset |offset| of length |numBytes|) of the buffer given by this handle
-     * into memory. |offset + numBytes| must be less than or equal to the size of the buffer. On
-     * success, the returned buffer points to memory with the requested part of the buffer. A single
-     * buffer handle may have multiple active mappings (possibly depending on the buffer type). The
-     * permissions (e.g., writable or executable) of the returned memory may depend on the
-     * properties of the buffer and properties attached to the buffer handle as well as |flags|.
-     */
-    public ByteBuffer map(long offset, long numBytes, MapFlags flags);
-
-    /**
-     * Unmap a buffer pointer that was mapped by |map()|.
-     */
-    public void unmap(ByteBuffer buffer);
-
-}
diff --git a/mojo/public/java/system/src/org/chromium/mojo/system/UntypedHandle.java b/mojo/public/java/system/src/org/chromium/mojo/system/UntypedHandle.java
deleted file mode 100644
index 199b0a1..0000000
--- a/mojo/public/java/system/src/org/chromium/mojo/system/UntypedHandle.java
+++ /dev/null
@@ -1,45 +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.
-
-package org.chromium.mojo.system;
-
-import org.chromium.mojo.system.DataPipe.ConsumerHandle;
-import org.chromium.mojo.system.DataPipe.ProducerHandle;
-
-/**
- * A mojo handle of unknown type. This handle can be typed by using one of its methods, which will
- * return a handle of the requested type and invalidate this object. No validation is made when the
- * conversion operation is called.
- */
-public interface UntypedHandle extends Handle {
-
-    /**
-     * @see org.chromium.mojo.system.Handle#pass()
-     */
-    @Override
-    public UntypedHandle pass();
-
-    /**
-     * Returns the underlying handle, as a {@link MessagePipeHandle}, invalidating this
-     * representation.
-     */
-    public MessagePipeHandle toMessagePipeHandle();
-
-    /**
-     * Returns the underlying handle, as a {@link ConsumerHandle}, invalidating this representation.
-     */
-    public ConsumerHandle toDataPipeConsumerHandle();
-
-    /**
-     * Returns the underlying handle, as a {@link ProducerHandle}, invalidating this representation.
-     */
-    public ProducerHandle toDataPipeProducerHandle();
-
-    /**
-     * Returns the underlying handle, as a {@link SharedBufferHandle}, invalidating this
-     * representation.
-     */
-    public SharedBufferHandle toSharedBufferHandle();
-
-}
diff --git a/mojo/public/java/system/src/org/chromium/mojo/system/Watcher.java b/mojo/public/java/system/src/org/chromium/mojo/system/Watcher.java
deleted file mode 100644
index 9c70161..0000000
--- a/mojo/public/java/system/src/org/chromium/mojo/system/Watcher.java
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.mojo.system;
-
-import org.chromium.mojo.system.Core.HandleSignals;
-
-/**
- * Watches a handle for signals being satisfied.
- */
-public interface Watcher {
-    /**
-     * Callback passed to {@link Watcher#start}.
-     */
-    public interface Callback {
-        /**
-         * Called when the handle is ready.
-         */
-        public void onResult(int result);
-    }
-
-    /**
-     * Starts watching a handle.
-     */
-    int start(Handle handle, HandleSignals signals, Callback callback);
-
-    /**
-     * Cancels an already-started watch.
-     */
-    void cancel();
-
-    /**
-     * Destroys the underlying implementation. Other methods will fail after destroy has been
-     * called.
-     */
-    void destroy();
-}
diff --git a/mojo/public/js/BUILD.gn b/mojo/public/js/BUILD.gn
deleted file mode 100644
index 5ed57a1..0000000
--- a/mojo/public/js/BUILD.gn
+++ /dev/null
@@ -1,93 +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.
-
-interfaces_bindings_gen_dir = "$root_gen_dir/mojo/public/interfaces/bindings"
-
-source_set("js") {
-  sources = [
-    "constants.cc",
-    "constants.h",
-  ]
-}
-
-group("bindings") {
-  data = [
-    "$interfaces_bindings_gen_dir/interface_control_messages.mojom.js",
-    "$interfaces_bindings_gen_dir/pipe_control_messages.mojom.js",
-    "bindings.js",
-    "buffer.js",
-    "codec.js",
-    "connector.js",
-    "core.js",
-    "interface_types.js",
-    "lib/control_message_handler.js",
-    "lib/control_message_proxy.js",
-    "lib/interface_endpoint_client.js",
-    "lib/interface_endpoint_handle.js",
-    "lib/pipe_control_message_handler.js",
-    "lib/pipe_control_message_proxy.js",
-    "router.js",
-    "support.js",
-    "threading.js",
-    "unicode.js",
-    "validator.js",
-  ]
-
-  deps = [
-    ":new_bindings",
-    "//mojo/public/interfaces/bindings:bindings__generator",
-  ]
-}
-
-action("new_bindings") {
-  new_bindings_js_files = [
-    # This must be the first file in the list, because it initializes global
-    # variable |mojoBindings| that the others need to refer to.
-    "new_bindings/base.js",
-
-    "$interfaces_bindings_gen_dir/new_bindings/interface_control_messages.mojom.js",
-    "new_bindings/bindings.js",
-    "new_bindings/buffer.js",
-    "new_bindings/codec.js",
-    "new_bindings/connector.js",
-    "new_bindings/interface_types.js",
-    "new_bindings/lib/control_message_handler.js",
-    "new_bindings/lib/control_message_proxy.js",
-    "new_bindings/router.js",
-    "new_bindings/unicode.js",
-    "new_bindings/validator.js",
-  ]
-  compiled_file = "$target_gen_dir/mojo_bindings.js"
-
-  # TODO(yzshen): Eventually we would like to use Closure Compiler to minify the
-  # bindings instead of simply concatenating the files.
-  script = "//v8/tools/concatenate-files.py"
-
-  sources = new_bindings_js_files
-  outputs = [
-    compiled_file,
-  ]
-
-  args = rebase_path(new_bindings_js_files)
-  args += [ rebase_path(compiled_file) ]
-
-  deps = [
-    "//mojo/public/interfaces/bindings:new_bindings__generator",
-  ]
-}
-
-group("tests") {
-  testonly = true
-
-  data = [
-    "//mojo/public/interfaces/bindings/tests/data/validation/",
-    "tests/core_unittest.js",
-    "tests/validation_test_input_parser.js",
-    "tests/validation_unittest.js",
-  ]
-
-  public_deps = [
-    ":bindings",
-  ]
-}
diff --git a/mojo/public/js/README.md b/mojo/public/js/README.md
deleted file mode 100644
index b6eafe9..0000000
--- a/mojo/public/js/README.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# ![Mojo Graphic](https://goo.gl/6CdlbH) Mojo JavaScript System and Bindings APIs
-This document is a subset of the [Mojo documentation](/mojo).
-
-**NOTE:** The JavaScript APIs are currently in flux and will stabilize soon.
-More info forthcoming ASAP!
-
-TODO: Make the contents of this document less non-existent.
diff --git a/mojo/public/js/bindings.js b/mojo/public/js/bindings.js
deleted file mode 100644
index a944e2f..0000000
--- a/mojo/public/js/bindings.js
+++ /dev/null
@@ -1,322 +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.
-
-define("mojo/public/js/bindings", [
-  "mojo/public/js/core",
-  "mojo/public/js/interface_types",
-  "mojo/public/js/lib/interface_endpoint_client",
-  "mojo/public/js/router",
-], function(core, types, interfaceEndpointClient, router) {
-
-  var InterfaceEndpointClient = interfaceEndpointClient.InterfaceEndpointClient;
-
-  // ---------------------------------------------------------------------------
-
-  function makeRequest(interfacePtr) {
-    var pipe = core.createMessagePipe();
-    interfacePtr.ptr.bind(new types.InterfacePtrInfo(pipe.handle0, 0));
-    return new types.InterfaceRequest(pipe.handle1);
-  }
-
-  // ---------------------------------------------------------------------------
-
-  // Operations used to setup/configure an interface pointer. Exposed as the
-  // |ptr| field of generated interface pointer classes.
-  // |ptrInfoOrHandle| could be omitted and passed into bind() later.
-  function InterfacePtrController(interfaceType, ptrInfoOrHandle) {
-    this.version = 0;
-
-    this.interfaceType_ = interfaceType;
-    this.router_ = null;
-    this.interfaceEndpointClient_ = null;
-    this.proxy_ = null;
-
-    // |router_| and |interfaceEndpointClient_| are lazily initialized.
-    // |handle_| is valid between bind() and
-    // the initialization of |router_| and |interfaceEndpointClient_|.
-    this.handle_ = null;
-
-    if (ptrInfoOrHandle)
-      this.bind(ptrInfoOrHandle);
-  }
-
-  InterfacePtrController.prototype.bind = function(ptrInfoOrHandle) {
-    this.reset();
-
-    if (ptrInfoOrHandle instanceof types.InterfacePtrInfo) {
-      this.version = ptrInfoOrHandle.version;
-      this.handle_ = ptrInfoOrHandle.handle;
-    } else {
-      this.handle_ = ptrInfoOrHandle;
-    }
-  };
-
-  InterfacePtrController.prototype.isBound = function() {
-    return this.router_ !== null || this.handle_ !== null;
-  };
-
-  // Although users could just discard the object, reset() closes the pipe
-  // immediately.
-  InterfacePtrController.prototype.reset = function() {
-    this.version = 0;
-    if (this.interfaceEndpointClient_) {
-      this.interfaceEndpointClient_.close();
-      this.interfaceEndpointClient_ = null;
-    }
-    if (this.router_) {
-      this.router_.close();
-      this.router_ = null;
-
-      this.proxy_ = null;
-    }
-    if (this.handle_) {
-      core.close(this.handle_);
-      this.handle_ = null;
-    }
-  };
-
-  InterfacePtrController.prototype.resetWithReason = function(reason) {
-    this.configureProxyIfNecessary_();
-    this.interfaceEndpointClient_.close(reason);
-    this.interfaceEndpointClient_ = null;
-    this.reset();
-  };
-
-  InterfacePtrController.prototype.setConnectionErrorHandler = function(
-      callback) {
-    if (!this.isBound())
-      throw new Error("Cannot set connection error handler if not bound.");
-
-    this.configureProxyIfNecessary_();
-    this.interfaceEndpointClient_.setConnectionErrorHandler(callback);
-  };
-
-  InterfacePtrController.prototype.passInterface = function() {
-    var result;
-    if (this.router_) {
-      // TODO(yzshen): Fix Router interface to support extracting handle.
-      result = new types.InterfacePtrInfo(
-          this.router_.connector_.handle_, this.version);
-      this.router_.connector_.handle_ = null;
-    } else {
-      // This also handles the case when this object is not bound.
-      result = new types.InterfacePtrInfo(this.handle_, this.version);
-      this.handle_ = null;
-    }
-
-    this.reset();
-    return result;
-  };
-
-  InterfacePtrController.prototype.getProxy = function() {
-    this.configureProxyIfNecessary_();
-    return this.proxy_;
-  };
-
-  InterfacePtrController.prototype.waitForNextMessageForTesting = function() {
-    this.configureProxyIfNecessary_();
-    this.router_.waitForNextMessageForTesting();
-  };
-
-  InterfacePtrController.prototype.configureProxyIfNecessary_ = function() {
-    if (!this.handle_)
-      return;
-
-    this.router_ = new router.Router(this.handle_);
-    this.handle_ = null;
-
-    this.interfaceEndpointClient_ = new InterfaceEndpointClient(
-        this.router_.createLocalEndpointHandle(types.kMasterInterfaceId),
-        this.router_);
-
-    this.interfaceEndpointClient_ .setPayloadValidators([
-        this.interfaceType_.validateResponse]);
-    this.proxy_ = new this.interfaceType_.proxyClass(
-        this.interfaceEndpointClient_);
-  };
-
-  InterfacePtrController.prototype.queryVersion = function() {
-    function onQueryVersion(version) {
-      this.version = version;
-      return version;
-    }
-
-    this.configureProxyIfNecessary_();
-    return this.interfaceEndpointClient_.queryVersion().then(
-      onQueryVersion.bind(this));
-  };
-
-  InterfacePtrController.prototype.requireVersion = function(version) {
-    this.configureProxyIfNecessary_();
-
-    if (this.version >= version) {
-      return;
-    }
-    this.version = version;
-    this.interfaceEndpointClient_.requireVersion(version);
-  };
-
-  // ---------------------------------------------------------------------------
-
-  // |request| could be omitted and passed into bind() later.
-  //
-  // Example:
-  //
-  //    // FooImpl implements mojom.Foo.
-  //    function FooImpl() { ... }
-  //    FooImpl.prototype.fooMethod1 = function() { ... }
-  //    FooImpl.prototype.fooMethod2 = function() { ... }
-  //
-  //    var fooPtr = new mojom.FooPtr();
-  //    var request = makeRequest(fooPtr);
-  //    var binding = new Binding(mojom.Foo, new FooImpl(), request);
-  //    fooPtr.fooMethod1();
-  function Binding(interfaceType, impl, requestOrHandle) {
-    this.interfaceType_ = interfaceType;
-    this.impl_ = impl;
-    this.router_ = null;
-    this.interfaceEndpointClient_ = null;
-    this.stub_ = null;
-
-    if (requestOrHandle)
-      this.bind(requestOrHandle);
-  }
-
-  Binding.prototype.isBound = function() {
-    return this.router_ !== null;
-  };
-
-  Binding.prototype.createInterfacePtrAndBind = function() {
-    var ptr = new this.interfaceType_.ptrClass();
-    // TODO(yzshen): Set the version of the interface pointer.
-    this.bind(makeRequest(ptr));
-    return ptr;
-  };
-
-  Binding.prototype.bind = function(requestOrHandle) {
-    this.close();
-
-    var handle = requestOrHandle instanceof types.InterfaceRequest ?
-        requestOrHandle.handle : requestOrHandle;
-    if (!core.isHandle(handle))
-      return;
-
-    this.router_ = new router.Router(handle);
-
-    this.stub_ = new this.interfaceType_.stubClass(this.impl_);
-    this.interfaceEndpointClient_ = new InterfaceEndpointClient(
-        this.router_.createLocalEndpointHandle(types.kMasterInterfaceId),
-        this.router_, this.interfaceType_.kVersion);
-    this.interfaceEndpointClient_.setIncomingReceiver(this.stub_);
-    this.interfaceEndpointClient_ .setPayloadValidators([
-        this.interfaceType_.validateRequest]);
-  };
-
-  Binding.prototype.close = function() {
-    if (!this.isBound())
-      return;
-
-    if (this.interfaceEndpointClient_) {
-      this.interfaceEndpointClient_.close();
-      this.interfaceEndpointClient_ = null;
-    }
-
-    this.router_.close();
-    this.router_ = null;
-    this.stub_ = null;
-  };
-
-  Binding.prototype.closeWithReason = function(reason) {
-    if (this.interfaceEndpointClient_) {
-      this.interfaceEndpointClient_.close(reason);
-      this.interfaceEndpointClient_ = null;
-    }
-    this.close();
-  };
-
-  Binding.prototype.setConnectionErrorHandler
-      = function(callback) {
-    if (!this.isBound()) {
-      throw new Error("Cannot set connection error handler if not bound.");
-    }
-    this.interfaceEndpointClient_.setConnectionErrorHandler(callback);
-  };
-
-  Binding.prototype.unbind = function() {
-    if (!this.isBound())
-      return new types.InterfaceRequest(null);
-
-    var result = new types.InterfaceRequest(this.router_.connector_.handle_);
-    this.router_.connector_.handle_ = null;
-    this.close();
-    return result;
-  };
-
-  Binding.prototype.waitForNextMessageForTesting = function() {
-    this.router_.waitForNextMessageForTesting();
-  };
-
-  // ---------------------------------------------------------------------------
-
-  function BindingSetEntry(bindingSet, interfaceType, impl, requestOrHandle,
-                           bindingId) {
-    this.bindingSet_ = bindingSet;
-    this.bindingId_ = bindingId;
-    this.binding_ = new Binding(interfaceType, impl, requestOrHandle);
-
-    this.binding_.setConnectionErrorHandler(function() {
-      this.bindingSet_.onConnectionError(bindingId);
-    }.bind(this));
-  }
-
-  BindingSetEntry.prototype.close = function() {
-    this.binding_.close();
-  };
-
-  function BindingSet(interfaceType) {
-    this.interfaceType_ = interfaceType;
-    this.nextBindingId_ = 0;
-    this.bindings_ = new Map();
-    this.errorHandler_ = null;
-  }
-
-  BindingSet.prototype.isEmpty = function() {
-    return this.bindings_.size == 0;
-  };
-
-  BindingSet.prototype.addBinding = function(impl, requestOrHandle) {
-    this.bindings_.set(
-        this.nextBindingId_,
-        new BindingSetEntry(this, this.interfaceType_, impl, requestOrHandle,
-                            this.nextBindingId_));
-    ++this.nextBindingId_;
-  };
-
-  BindingSet.prototype.closeAllBindings = function() {
-    for (var entry of this.bindings_.values())
-      entry.close();
-    this.bindings_.clear();
-  };
-
-  BindingSet.prototype.setConnectionErrorHandler = function(callback) {
-    this.errorHandler_ = callback;
-  };
-
-  BindingSet.prototype.onConnectionError = function(bindingId) {
-    this.bindings_.delete(bindingId);
-
-    if (this.errorHandler_)
-      this.errorHandler_();
-  };
-
-  var exports = {};
-  exports.InterfacePtrInfo = types.InterfacePtrInfo;
-  exports.InterfaceRequest = types.InterfaceRequest;
-  exports.makeRequest = makeRequest;
-  exports.InterfacePtrController = InterfacePtrController;
-  exports.Binding = Binding;
-  exports.BindingSet = BindingSet;
-
-  return exports;
-});
diff --git a/mojo/public/js/buffer.js b/mojo/public/js/buffer.js
deleted file mode 100644
index e35f695..0000000
--- a/mojo/public/js/buffer.js
+++ /dev/null
@@ -1,156 +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.
-
-define("mojo/public/js/buffer", function() {
-
-  var kHostIsLittleEndian = (function () {
-    var endianArrayBuffer = new ArrayBuffer(2);
-    var endianUint8Array = new Uint8Array(endianArrayBuffer);
-    var endianUint16Array = new Uint16Array(endianArrayBuffer);
-    endianUint16Array[0] = 1;
-    return endianUint8Array[0] == 1;
-  })();
-
-  var kHighWordMultiplier = 0x100000000;
-
-  function Buffer(sizeOrArrayBuffer) {
-    if (sizeOrArrayBuffer instanceof ArrayBuffer)
-      this.arrayBuffer = sizeOrArrayBuffer;
-    else
-      this.arrayBuffer = new ArrayBuffer(sizeOrArrayBuffer);
-
-    this.dataView = new DataView(this.arrayBuffer);
-    this.next = 0;
-  }
-
-  Object.defineProperty(Buffer.prototype, "byteLength", {
-    get: function() { return this.arrayBuffer.byteLength; }
-  });
-
-  Buffer.prototype.alloc = function(size) {
-    var pointer = this.next;
-    this.next += size;
-    if (this.next > this.byteLength) {
-      var newSize = (1.5 * (this.byteLength + size)) | 0;
-      this.grow(newSize);
-    }
-    return pointer;
-  };
-
-  function copyArrayBuffer(dstArrayBuffer, srcArrayBuffer) {
-    (new Uint8Array(dstArrayBuffer)).set(new Uint8Array(srcArrayBuffer));
-  }
-
-  Buffer.prototype.grow = function(size) {
-    var newArrayBuffer = new ArrayBuffer(size);
-    copyArrayBuffer(newArrayBuffer, this.arrayBuffer);
-    this.arrayBuffer = newArrayBuffer;
-    this.dataView = new DataView(this.arrayBuffer);
-  };
-
-  Buffer.prototype.trim = function() {
-    this.arrayBuffer = this.arrayBuffer.slice(0, this.next);
-    this.dataView = new DataView(this.arrayBuffer);
-  };
-
-  Buffer.prototype.getUint8 = function(offset) {
-    return this.dataView.getUint8(offset);
-  }
-  Buffer.prototype.getUint16 = function(offset) {
-    return this.dataView.getUint16(offset, kHostIsLittleEndian);
-  }
-  Buffer.prototype.getUint32 = function(offset) {
-    return this.dataView.getUint32(offset, kHostIsLittleEndian);
-  }
-  Buffer.prototype.getUint64 = function(offset) {
-    var lo, hi;
-    if (kHostIsLittleEndian) {
-      lo = this.dataView.getUint32(offset, kHostIsLittleEndian);
-      hi = this.dataView.getUint32(offset + 4, kHostIsLittleEndian);
-    } else {
-      hi = this.dataView.getUint32(offset, kHostIsLittleEndian);
-      lo = this.dataView.getUint32(offset + 4, kHostIsLittleEndian);
-    }
-    return lo + hi * kHighWordMultiplier;
-  }
-
-  Buffer.prototype.getInt8 = function(offset) {
-    return this.dataView.getInt8(offset);
-  }
-  Buffer.prototype.getInt16 = function(offset) {
-    return this.dataView.getInt16(offset, kHostIsLittleEndian);
-  }
-  Buffer.prototype.getInt32 = function(offset) {
-    return this.dataView.getInt32(offset, kHostIsLittleEndian);
-  }
-  Buffer.prototype.getInt64 = function(offset) {
-    var lo, hi;
-    if (kHostIsLittleEndian) {
-      lo = this.dataView.getUint32(offset, kHostIsLittleEndian);
-      hi = this.dataView.getInt32(offset + 4, kHostIsLittleEndian);
-    } else {
-      hi = this.dataView.getInt32(offset, kHostIsLittleEndian);
-      lo = this.dataView.getUint32(offset + 4, kHostIsLittleEndian);
-    }
-    return lo + hi * kHighWordMultiplier;
-  }
-
-  Buffer.prototype.getFloat32 = function(offset) {
-    return this.dataView.getFloat32(offset, kHostIsLittleEndian);
-  }
-  Buffer.prototype.getFloat64 = function(offset) {
-    return this.dataView.getFloat64(offset, kHostIsLittleEndian);
-  }
-
-  Buffer.prototype.setUint8 = function(offset, value) {
-    this.dataView.setUint8(offset, value);
-  }
-  Buffer.prototype.setUint16 = function(offset, value) {
-    this.dataView.setUint16(offset, value, kHostIsLittleEndian);
-  }
-  Buffer.prototype.setUint32 = function(offset, value) {
-    this.dataView.setUint32(offset, value, kHostIsLittleEndian);
-  }
-  Buffer.prototype.setUint64 = function(offset, value) {
-    var hi = (value / kHighWordMultiplier) | 0;
-    if (kHostIsLittleEndian) {
-      this.dataView.setInt32(offset, value, kHostIsLittleEndian);
-      this.dataView.setInt32(offset + 4, hi, kHostIsLittleEndian);
-    } else {
-      this.dataView.setInt32(offset, hi, kHostIsLittleEndian);
-      this.dataView.setInt32(offset + 4, value, kHostIsLittleEndian);
-    }
-  }
-
-  Buffer.prototype.setInt8 = function(offset, value) {
-    this.dataView.setInt8(offset, value);
-  }
-  Buffer.prototype.setInt16 = function(offset, value) {
-    this.dataView.setInt16(offset, value, kHostIsLittleEndian);
-  }
-  Buffer.prototype.setInt32 = function(offset, value) {
-    this.dataView.setInt32(offset, value, kHostIsLittleEndian);
-  }
-  Buffer.prototype.setInt64 = function(offset, value) {
-    var hi = Math.floor(value / kHighWordMultiplier);
-    if (kHostIsLittleEndian) {
-      this.dataView.setInt32(offset, value, kHostIsLittleEndian);
-      this.dataView.setInt32(offset + 4, hi, kHostIsLittleEndian);
-    } else {
-      this.dataView.setInt32(offset, hi, kHostIsLittleEndian);
-      this.dataView.setInt32(offset + 4, value, kHostIsLittleEndian);
-    }
-  }
-
-  Buffer.prototype.setFloat32 = function(offset, value) {
-    this.dataView.setFloat32(offset, value, kHostIsLittleEndian);
-  }
-  Buffer.prototype.setFloat64 = function(offset, value) {
-    this.dataView.setFloat64(offset, value, kHostIsLittleEndian);
-  }
-
-  var exports = {};
-  exports.Buffer = Buffer;
-  return exports;
-});
diff --git a/mojo/public/js/codec.js b/mojo/public/js/codec.js
deleted file mode 100644
index ce58a8c..0000000
--- a/mojo/public/js/codec.js
+++ /dev/null
@@ -1,926 +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.
-
-define("mojo/public/js/codec", [
-  "mojo/public/js/buffer",
-  "mojo/public/js/interface_types",
-  "mojo/public/js/unicode",
-], function(buffer, types, unicode) {
-
-  var kErrorUnsigned = "Passing negative value to unsigned";
-  var kErrorArray = "Passing non Array for array type";
-  var kErrorString = "Passing non String for string type";
-  var kErrorMap = "Passing non Map for map type";
-
-  // Memory -------------------------------------------------------------------
-
-  var kAlignment = 8;
-
-  function align(size) {
-    return size + (kAlignment - (size % kAlignment)) % kAlignment;
-  }
-
-  function isAligned(offset) {
-    return offset >= 0 && (offset % kAlignment) === 0;
-  }
-
-  // Constants ----------------------------------------------------------------
-
-  var kArrayHeaderSize = 8;
-  var kStructHeaderSize = 8;
-  var kMessageHeaderSize = 24;
-  var kMessageWithRequestIDHeaderSize = 32;
-  var kMapStructPayloadSize = 16;
-
-  var kStructHeaderNumBytesOffset = 0;
-  var kStructHeaderVersionOffset = 4;
-
-  var kEncodedInvalidHandleValue = 0xFFFFFFFF;
-
-  // Decoder ------------------------------------------------------------------
-
-  function Decoder(buffer, handles, base) {
-    this.buffer = buffer;
-    this.handles = handles;
-    this.base = base;
-    this.next = base;
-  }
-
-  Decoder.prototype.align = function() {
-    this.next = align(this.next);
-  };
-
-  Decoder.prototype.skip = function(offset) {
-    this.next += offset;
-  };
-
-  Decoder.prototype.readInt8 = function() {
-    var result = this.buffer.getInt8(this.next);
-    this.next += 1;
-    return result;
-  };
-
-  Decoder.prototype.readUint8 = function() {
-    var result = this.buffer.getUint8(this.next);
-    this.next += 1;
-    return result;
-  };
-
-  Decoder.prototype.readInt16 = function() {
-    var result = this.buffer.getInt16(this.next);
-    this.next += 2;
-    return result;
-  };
-
-  Decoder.prototype.readUint16 = function() {
-    var result = this.buffer.getUint16(this.next);
-    this.next += 2;
-    return result;
-  };
-
-  Decoder.prototype.readInt32 = function() {
-    var result = this.buffer.getInt32(this.next);
-    this.next += 4;
-    return result;
-  };
-
-  Decoder.prototype.readUint32 = function() {
-    var result = this.buffer.getUint32(this.next);
-    this.next += 4;
-    return result;
-  };
-
-  Decoder.prototype.readInt64 = function() {
-    var result = this.buffer.getInt64(this.next);
-    this.next += 8;
-    return result;
-  };
-
-  Decoder.prototype.readUint64 = function() {
-    var result = this.buffer.getUint64(this.next);
-    this.next += 8;
-    return result;
-  };
-
-  Decoder.prototype.readFloat = function() {
-    var result = this.buffer.getFloat32(this.next);
-    this.next += 4;
-    return result;
-  };
-
-  Decoder.prototype.readDouble = function() {
-    var result = this.buffer.getFloat64(this.next);
-    this.next += 8;
-    return result;
-  };
-
-  Decoder.prototype.decodePointer = function() {
-    // TODO(abarth): To correctly decode a pointer, we need to know the real
-    // base address of the array buffer.
-    var offsetPointer = this.next;
-    var offset = this.readUint64();
-    if (!offset)
-      return 0;
-    return offsetPointer + offset;
-  };
-
-  Decoder.prototype.decodeAndCreateDecoder = function(pointer) {
-    return new Decoder(this.buffer, this.handles, pointer);
-  };
-
-  Decoder.prototype.decodeHandle = function() {
-    return this.handles[this.readUint32()] || null;
-  };
-
-  Decoder.prototype.decodeString = function() {
-    var numberOfBytes = this.readUint32();
-    var numberOfElements = this.readUint32();
-    var base = this.next;
-    this.next += numberOfElements;
-    return unicode.decodeUtf8String(
-        new Uint8Array(this.buffer.arrayBuffer, base, numberOfElements));
-  };
-
-  Decoder.prototype.decodeArray = function(cls) {
-    var numberOfBytes = this.readUint32();
-    var numberOfElements = this.readUint32();
-    var val = new Array(numberOfElements);
-    if (cls === PackedBool) {
-      var byte;
-      for (var i = 0; i < numberOfElements; ++i) {
-        if (i % 8 === 0)
-          byte = this.readUint8();
-        val[i] = (byte & (1 << i % 8)) ? true : false;
-      }
-    } else {
-      for (var i = 0; i < numberOfElements; ++i) {
-        val[i] = cls.decode(this);
-      }
-    }
-    return val;
-  };
-
-  Decoder.prototype.decodeStruct = function(cls) {
-    return cls.decode(this);
-  };
-
-  Decoder.prototype.decodeStructPointer = function(cls) {
-    var pointer = this.decodePointer();
-    if (!pointer) {
-      return null;
-    }
-    return cls.decode(this.decodeAndCreateDecoder(pointer));
-  };
-
-  Decoder.prototype.decodeArrayPointer = function(cls) {
-    var pointer = this.decodePointer();
-    if (!pointer) {
-      return null;
-    }
-    return this.decodeAndCreateDecoder(pointer).decodeArray(cls);
-  };
-
-  Decoder.prototype.decodeStringPointer = function() {
-    var pointer = this.decodePointer();
-    if (!pointer) {
-      return null;
-    }
-    return this.decodeAndCreateDecoder(pointer).decodeString();
-  };
-
-  Decoder.prototype.decodeMap = function(keyClass, valueClass) {
-    this.skip(4); // numberOfBytes
-    this.skip(4); // version
-    var keys = this.decodeArrayPointer(keyClass);
-    var values = this.decodeArrayPointer(valueClass);
-    var val = new Map();
-    for (var i = 0; i < keys.length; i++)
-      val.set(keys[i], values[i]);
-    return val;
-  };
-
-  Decoder.prototype.decodeMapPointer = function(keyClass, valueClass) {
-    var pointer = this.decodePointer();
-    if (!pointer) {
-      return null;
-    }
-    var decoder = this.decodeAndCreateDecoder(pointer);
-    return decoder.decodeMap(keyClass, valueClass);
-  };
-
-  // Encoder ------------------------------------------------------------------
-
-  function Encoder(buffer, handles, base) {
-    this.buffer = buffer;
-    this.handles = handles;
-    this.base = base;
-    this.next = base;
-  }
-
-  Encoder.prototype.align = function() {
-    this.next = align(this.next);
-  };
-
-  Encoder.prototype.skip = function(offset) {
-    this.next += offset;
-  };
-
-  Encoder.prototype.writeInt8 = function(val) {
-    this.buffer.setInt8(this.next, val);
-    this.next += 1;
-  };
-
-  Encoder.prototype.writeUint8 = function(val) {
-    if (val < 0) {
-      throw new Error(kErrorUnsigned);
-    }
-    this.buffer.setUint8(this.next, val);
-    this.next += 1;
-  };
-
-  Encoder.prototype.writeInt16 = function(val) {
-    this.buffer.setInt16(this.next, val);
-    this.next += 2;
-  };
-
-  Encoder.prototype.writeUint16 = function(val) {
-    if (val < 0) {
-      throw new Error(kErrorUnsigned);
-    }
-    this.buffer.setUint16(this.next, val);
-    this.next += 2;
-  };
-
-  Encoder.prototype.writeInt32 = function(val) {
-    this.buffer.setInt32(this.next, val);
-    this.next += 4;
-  };
-
-  Encoder.prototype.writeUint32 = function(val) {
-    if (val < 0) {
-      throw new Error(kErrorUnsigned);
-    }
-    this.buffer.setUint32(this.next, val);
-    this.next += 4;
-  };
-
-  Encoder.prototype.writeInt64 = function(val) {
-    this.buffer.setInt64(this.next, val);
-    this.next += 8;
-  };
-
-  Encoder.prototype.writeUint64 = function(val) {
-    if (val < 0) {
-      throw new Error(kErrorUnsigned);
-    }
-    this.buffer.setUint64(this.next, val);
-    this.next += 8;
-  };
-
-  Encoder.prototype.writeFloat = function(val) {
-    this.buffer.setFloat32(this.next, val);
-    this.next += 4;
-  };
-
-  Encoder.prototype.writeDouble = function(val) {
-    this.buffer.setFloat64(this.next, val);
-    this.next += 8;
-  };
-
-  Encoder.prototype.encodePointer = function(pointer) {
-    if (!pointer)
-      return this.writeUint64(0);
-    // TODO(abarth): To correctly encode a pointer, we need to know the real
-    // base address of the array buffer.
-    var offset = pointer - this.next;
-    this.writeUint64(offset);
-  };
-
-  Encoder.prototype.createAndEncodeEncoder = function(size) {
-    var pointer = this.buffer.alloc(align(size));
-    this.encodePointer(pointer);
-    return new Encoder(this.buffer, this.handles, pointer);
-  };
-
-  Encoder.prototype.encodeHandle = function(handle) {
-    if (handle) {
-      this.handles.push(handle);
-      this.writeUint32(this.handles.length - 1);
-    } else {
-      this.writeUint32(kEncodedInvalidHandleValue);
-    }
-  };
-
-  Encoder.prototype.encodeString = function(val) {
-    var base = this.next + kArrayHeaderSize;
-    var numberOfElements = unicode.encodeUtf8String(
-        val, new Uint8Array(this.buffer.arrayBuffer, base));
-    var numberOfBytes = kArrayHeaderSize + numberOfElements;
-    this.writeUint32(numberOfBytes);
-    this.writeUint32(numberOfElements);
-    this.next += numberOfElements;
-  };
-
-  Encoder.prototype.encodeArray =
-      function(cls, val, numberOfElements, encodedSize) {
-    if (numberOfElements === undefined)
-      numberOfElements = val.length;
-    if (encodedSize === undefined)
-      encodedSize = kArrayHeaderSize + cls.encodedSize * numberOfElements;
-
-    this.writeUint32(encodedSize);
-    this.writeUint32(numberOfElements);
-
-    if (cls === PackedBool) {
-      var byte = 0;
-      for (i = 0; i < numberOfElements; ++i) {
-        if (val[i])
-          byte |= (1 << i % 8);
-        if (i % 8 === 7 || i == numberOfElements - 1) {
-          Uint8.encode(this, byte);
-          byte = 0;
-        }
-      }
-    } else {
-      for (var i = 0; i < numberOfElements; ++i)
-        cls.encode(this, val[i]);
-    }
-  };
-
-  Encoder.prototype.encodeStruct = function(cls, val) {
-    return cls.encode(this, val);
-  };
-
-  Encoder.prototype.encodeStructPointer = function(cls, val) {
-    if (val == null) {
-      // Also handles undefined, since undefined == null.
-      this.encodePointer(val);
-      return;
-    }
-    var encoder = this.createAndEncodeEncoder(cls.encodedSize);
-    cls.encode(encoder, val);
-  };
-
-  Encoder.prototype.encodeArrayPointer = function(cls, val) {
-    if (val == null) {
-      // Also handles undefined, since undefined == null.
-      this.encodePointer(val);
-      return;
-    }
-
-    var numberOfElements = val.length;
-    if (!Number.isSafeInteger(numberOfElements) || numberOfElements < 0)
-      throw new Error(kErrorArray);
-
-    var encodedSize = kArrayHeaderSize + ((cls === PackedBool) ?
-        Math.ceil(numberOfElements / 8) : cls.encodedSize * numberOfElements);
-    var encoder = this.createAndEncodeEncoder(encodedSize);
-    encoder.encodeArray(cls, val, numberOfElements, encodedSize);
-  };
-
-  Encoder.prototype.encodeStringPointer = function(val) {
-    if (val == null) {
-      // Also handles undefined, since undefined == null.
-      this.encodePointer(val);
-      return;
-    }
-    // Only accepts string primivites, not String Objects like new String("foo")
-    if (typeof(val) !== "string") {
-      throw new Error(kErrorString);
-    }
-    var encodedSize = kArrayHeaderSize + unicode.utf8Length(val);
-    var encoder = this.createAndEncodeEncoder(encodedSize);
-    encoder.encodeString(val);
-  };
-
-  Encoder.prototype.encodeMap = function(keyClass, valueClass, val) {
-    var keys = new Array(val.size);
-    var values = new Array(val.size);
-    var i = 0;
-    val.forEach(function(value, key) {
-      values[i] = value;
-      keys[i++] = key;
-    });
-    this.writeUint32(kStructHeaderSize + kMapStructPayloadSize);
-    this.writeUint32(0);  // version
-    this.encodeArrayPointer(keyClass, keys);
-    this.encodeArrayPointer(valueClass, values);
-  }
-
-  Encoder.prototype.encodeMapPointer = function(keyClass, valueClass, val) {
-    if (val == null) {
-      // Also handles undefined, since undefined == null.
-      this.encodePointer(val);
-      return;
-    }
-    if (!(val instanceof Map)) {
-      throw new Error(kErrorMap);
-    }
-    var encodedSize = kStructHeaderSize + kMapStructPayloadSize;
-    var encoder = this.createAndEncodeEncoder(encodedSize);
-    encoder.encodeMap(keyClass, valueClass, val);
-  };
-
-  // Message ------------------------------------------------------------------
-
-  var kMessageInterfaceIdOffset = kStructHeaderSize;
-  var kMessageNameOffset = kMessageInterfaceIdOffset + 4;
-  var kMessageFlagsOffset = kMessageNameOffset + 4;
-  var kMessageRequestIDOffset = kMessageFlagsOffset + 8;
-
-  var kMessageExpectsResponse = 1 << 0;
-  var kMessageIsResponse      = 1 << 1;
-
-  function Message(buffer, handles) {
-    this.buffer = buffer;
-    this.handles = handles;
-  }
-
-  Message.prototype.getHeaderNumBytes = function() {
-    return this.buffer.getUint32(kStructHeaderNumBytesOffset);
-  };
-
-  Message.prototype.getHeaderVersion = function() {
-    return this.buffer.getUint32(kStructHeaderVersionOffset);
-  };
-
-  Message.prototype.getName = function() {
-    return this.buffer.getUint32(kMessageNameOffset);
-  };
-
-  Message.prototype.getFlags = function() {
-    return this.buffer.getUint32(kMessageFlagsOffset);
-  };
-
-  Message.prototype.getInterfaceId = function() {
-    return this.buffer.getUint32(kMessageInterfaceIdOffset);
-  };
-
-  Message.prototype.isResponse = function() {
-    return (this.getFlags() & kMessageIsResponse) != 0;
-  };
-
-  Message.prototype.expectsResponse = function() {
-    return (this.getFlags() & kMessageExpectsResponse) != 0;
-  };
-
-  Message.prototype.setRequestID = function(requestID) {
-    // TODO(darin): Verify that space was reserved for this field!
-    this.buffer.setUint64(kMessageRequestIDOffset, requestID);
-  };
-
-  Message.prototype.setInterfaceId = function(interfaceId) {
-    this.buffer.setUint32(kMessageInterfaceIdOffset, interfaceId);
-  };
-
-
-  // MessageBuilder -----------------------------------------------------------
-
-  function MessageBuilder(messageName, payloadSize) {
-    // Currently, we don't compute the payload size correctly ahead of time.
-    // Instead, we resize the buffer at the end.
-    var numberOfBytes = kMessageHeaderSize + payloadSize;
-    this.buffer = new buffer.Buffer(numberOfBytes);
-    this.handles = [];
-    var encoder = this.createEncoder(kMessageHeaderSize);
-    encoder.writeUint32(kMessageHeaderSize);
-    encoder.writeUint32(0);  // version.
-    encoder.writeUint32(0);  // interface ID.
-    encoder.writeUint32(messageName);
-    encoder.writeUint32(0);  // flags.
-    encoder.writeUint32(0);  // padding.
-  }
-
-  MessageBuilder.prototype.createEncoder = function(size) {
-    var pointer = this.buffer.alloc(size);
-    return new Encoder(this.buffer, this.handles, pointer);
-  };
-
-  MessageBuilder.prototype.encodeStruct = function(cls, val) {
-    cls.encode(this.createEncoder(cls.encodedSize), val);
-  };
-
-  MessageBuilder.prototype.finish = function() {
-    // TODO(abarth): Rather than resizing the buffer at the end, we could
-    // compute the size we need ahead of time, like we do in C++.
-    this.buffer.trim();
-    var message = new Message(this.buffer, this.handles);
-    this.buffer = null;
-    this.handles = null;
-    this.encoder = null;
-    return message;
-  };
-
-  // MessageWithRequestIDBuilder -----------------------------------------------
-
-  function MessageWithRequestIDBuilder(messageName, payloadSize, flags,
-                                       requestID) {
-    // Currently, we don't compute the payload size correctly ahead of time.
-    // Instead, we resize the buffer at the end.
-    var numberOfBytes = kMessageWithRequestIDHeaderSize + payloadSize;
-    this.buffer = new buffer.Buffer(numberOfBytes);
-    this.handles = [];
-    var encoder = this.createEncoder(kMessageWithRequestIDHeaderSize);
-    encoder.writeUint32(kMessageWithRequestIDHeaderSize);
-    encoder.writeUint32(1);  // version.
-    encoder.writeUint32(0);  // interface ID.
-    encoder.writeUint32(messageName);
-    encoder.writeUint32(flags);
-    encoder.writeUint32(0);  // padding.
-    encoder.writeUint64(requestID);
-  }
-
-  MessageWithRequestIDBuilder.prototype =
-      Object.create(MessageBuilder.prototype);
-
-  MessageWithRequestIDBuilder.prototype.constructor =
-      MessageWithRequestIDBuilder;
-
-  // MessageReader ------------------------------------------------------------
-
-  function MessageReader(message) {
-    this.decoder = new Decoder(message.buffer, message.handles, 0);
-    var messageHeaderSize = this.decoder.readUint32();
-    this.payloadSize = message.buffer.byteLength - messageHeaderSize;
-    var version = this.decoder.readUint32();
-    var interface_id = this.decoder.readUint32();
-    this.messageName = this.decoder.readUint32();
-    this.flags = this.decoder.readUint32();
-    // Skip the padding.
-    this.decoder.skip(4);
-    if (version >= 1)
-      this.requestID = this.decoder.readUint64();
-    this.decoder.skip(messageHeaderSize - this.decoder.next);
-  }
-
-  MessageReader.prototype.decodeStruct = function(cls) {
-    return cls.decode(this.decoder);
-  };
-
-  // Built-in types -----------------------------------------------------------
-
-  // This type is only used with ArrayOf(PackedBool).
-  function PackedBool() {
-  }
-
-  function Int8() {
-  }
-
-  Int8.encodedSize = 1;
-
-  Int8.decode = function(decoder) {
-    return decoder.readInt8();
-  };
-
-  Int8.encode = function(encoder, val) {
-    encoder.writeInt8(val);
-  };
-
-  Uint8.encode = function(encoder, val) {
-    encoder.writeUint8(val);
-  };
-
-  function Uint8() {
-  }
-
-  Uint8.encodedSize = 1;
-
-  Uint8.decode = function(decoder) {
-    return decoder.readUint8();
-  };
-
-  Uint8.encode = function(encoder, val) {
-    encoder.writeUint8(val);
-  };
-
-  function Int16() {
-  }
-
-  Int16.encodedSize = 2;
-
-  Int16.decode = function(decoder) {
-    return decoder.readInt16();
-  };
-
-  Int16.encode = function(encoder, val) {
-    encoder.writeInt16(val);
-  };
-
-  function Uint16() {
-  }
-
-  Uint16.encodedSize = 2;
-
-  Uint16.decode = function(decoder) {
-    return decoder.readUint16();
-  };
-
-  Uint16.encode = function(encoder, val) {
-    encoder.writeUint16(val);
-  };
-
-  function Int32() {
-  }
-
-  Int32.encodedSize = 4;
-
-  Int32.decode = function(decoder) {
-    return decoder.readInt32();
-  };
-
-  Int32.encode = function(encoder, val) {
-    encoder.writeInt32(val);
-  };
-
-  function Uint32() {
-  }
-
-  Uint32.encodedSize = 4;
-
-  Uint32.decode = function(decoder) {
-    return decoder.readUint32();
-  };
-
-  Uint32.encode = function(encoder, val) {
-    encoder.writeUint32(val);
-  };
-
-  function Int64() {
-  }
-
-  Int64.encodedSize = 8;
-
-  Int64.decode = function(decoder) {
-    return decoder.readInt64();
-  };
-
-  Int64.encode = function(encoder, val) {
-    encoder.writeInt64(val);
-  };
-
-  function Uint64() {
-  }
-
-  Uint64.encodedSize = 8;
-
-  Uint64.decode = function(decoder) {
-    return decoder.readUint64();
-  };
-
-  Uint64.encode = function(encoder, val) {
-    encoder.writeUint64(val);
-  };
-
-  function String() {
-  };
-
-  String.encodedSize = 8;
-
-  String.decode = function(decoder) {
-    return decoder.decodeStringPointer();
-  };
-
-  String.encode = function(encoder, val) {
-    encoder.encodeStringPointer(val);
-  };
-
-  function NullableString() {
-  }
-
-  NullableString.encodedSize = String.encodedSize;
-
-  NullableString.decode = String.decode;
-
-  NullableString.encode = String.encode;
-
-  function Float() {
-  }
-
-  Float.encodedSize = 4;
-
-  Float.decode = function(decoder) {
-    return decoder.readFloat();
-  };
-
-  Float.encode = function(encoder, val) {
-    encoder.writeFloat(val);
-  };
-
-  function Double() {
-  }
-
-  Double.encodedSize = 8;
-
-  Double.decode = function(decoder) {
-    return decoder.readDouble();
-  };
-
-  Double.encode = function(encoder, val) {
-    encoder.writeDouble(val);
-  };
-
-  function Enum(cls) {
-    this.cls = cls;
-  }
-
-  Enum.prototype.encodedSize = 4;
-
-  Enum.prototype.decode = function(decoder) {
-    return decoder.readInt32();
-  };
-
-  Enum.prototype.encode = function(encoder, val) {
-    encoder.writeInt32(val);
-  };
-
-  function PointerTo(cls) {
-    this.cls = cls;
-  }
-
-  PointerTo.prototype.encodedSize = 8;
-
-  PointerTo.prototype.decode = function(decoder) {
-    var pointer = decoder.decodePointer();
-    if (!pointer) {
-      return null;
-    }
-    return this.cls.decode(decoder.decodeAndCreateDecoder(pointer));
-  };
-
-  PointerTo.prototype.encode = function(encoder, val) {
-    if (!val) {
-      encoder.encodePointer(val);
-      return;
-    }
-    var objectEncoder = encoder.createAndEncodeEncoder(this.cls.encodedSize);
-    this.cls.encode(objectEncoder, val);
-  };
-
-  function NullablePointerTo(cls) {
-    PointerTo.call(this, cls);
-  }
-
-  NullablePointerTo.prototype = Object.create(PointerTo.prototype);
-
-  function ArrayOf(cls, length) {
-    this.cls = cls;
-    this.length = length || 0;
-  }
-
-  ArrayOf.prototype.encodedSize = 8;
-
-  ArrayOf.prototype.dimensions = function() {
-    return [this.length].concat(
-      (this.cls instanceof ArrayOf) ? this.cls.dimensions() : []);
-  }
-
-  ArrayOf.prototype.decode = function(decoder) {
-    return decoder.decodeArrayPointer(this.cls);
-  };
-
-  ArrayOf.prototype.encode = function(encoder, val) {
-    encoder.encodeArrayPointer(this.cls, val);
-  };
-
-  function NullableArrayOf(cls) {
-    ArrayOf.call(this, cls);
-  }
-
-  NullableArrayOf.prototype = Object.create(ArrayOf.prototype);
-
-  function Handle() {
-  }
-
-  Handle.encodedSize = 4;
-
-  Handle.decode = function(decoder) {
-    return decoder.decodeHandle();
-  };
-
-  Handle.encode = function(encoder, val) {
-    encoder.encodeHandle(val);
-  };
-
-  function NullableHandle() {
-  }
-
-  NullableHandle.encodedSize = Handle.encodedSize;
-
-  NullableHandle.decode = Handle.decode;
-
-  NullableHandle.encode = Handle.encode;
-
-  function Interface(cls) {
-    this.cls = cls;
-  }
-
-  Interface.prototype.encodedSize = 8;
-
-  Interface.prototype.decode = function(decoder) {
-    var interfacePtrInfo = new types.InterfacePtrInfo(
-        decoder.decodeHandle(), decoder.readUint32());
-    var interfacePtr = new this.cls();
-    interfacePtr.ptr.bind(interfacePtrInfo);
-    return interfacePtr;
-  };
-
-  Interface.prototype.encode = function(encoder, val) {
-    var interfacePtrInfo =
-        val ? val.ptr.passInterface() : new types.InterfacePtrInfo(null, 0);
-    encoder.encodeHandle(interfacePtrInfo.handle);
-    encoder.writeUint32(interfacePtrInfo.version);
-  };
-
-  function NullableInterface(cls) {
-    Interface.call(this, cls);
-  }
-
-  NullableInterface.prototype = Object.create(Interface.prototype);
-
-  function InterfaceRequest() {
-  }
-
-  InterfaceRequest.encodedSize = 4;
-
-  InterfaceRequest.decode = function(decoder) {
-    return new types.InterfaceRequest(decoder.decodeHandle());
-  };
-
-  InterfaceRequest.encode = function(encoder, val) {
-    encoder.encodeHandle(val ? val.handle : null);
-  };
-
-  function NullableInterfaceRequest() {
-  }
-
-  NullableInterfaceRequest.encodedSize = InterfaceRequest.encodedSize;
-
-  NullableInterfaceRequest.decode = InterfaceRequest.decode;
-
-  NullableInterfaceRequest.encode = InterfaceRequest.encode;
-
-  function MapOf(keyClass, valueClass) {
-    this.keyClass = keyClass;
-    this.valueClass = valueClass;
-  }
-
-  MapOf.prototype.encodedSize = 8;
-
-  MapOf.prototype.decode = function(decoder) {
-    return decoder.decodeMapPointer(this.keyClass, this.valueClass);
-  };
-
-  MapOf.prototype.encode = function(encoder, val) {
-    encoder.encodeMapPointer(this.keyClass, this.valueClass, val);
-  };
-
-  function NullableMapOf(keyClass, valueClass) {
-    MapOf.call(this, keyClass, valueClass);
-  }
-
-  NullableMapOf.prototype = Object.create(MapOf.prototype);
-
-  var exports = {};
-  exports.align = align;
-  exports.isAligned = isAligned;
-  exports.Message = Message;
-  exports.MessageBuilder = MessageBuilder;
-  exports.MessageWithRequestIDBuilder = MessageWithRequestIDBuilder;
-  exports.MessageReader = MessageReader;
-  exports.kArrayHeaderSize = kArrayHeaderSize;
-  exports.kMapStructPayloadSize = kMapStructPayloadSize;
-  exports.kStructHeaderSize = kStructHeaderSize;
-  exports.kEncodedInvalidHandleValue = kEncodedInvalidHandleValue;
-  exports.kMessageHeaderSize = kMessageHeaderSize;
-  exports.kMessageWithRequestIDHeaderSize = kMessageWithRequestIDHeaderSize;
-  exports.kMessageExpectsResponse = kMessageExpectsResponse;
-  exports.kMessageIsResponse = kMessageIsResponse;
-  exports.Int8 = Int8;
-  exports.Uint8 = Uint8;
-  exports.Int16 = Int16;
-  exports.Uint16 = Uint16;
-  exports.Int32 = Int32;
-  exports.Uint32 = Uint32;
-  exports.Int64 = Int64;
-  exports.Uint64 = Uint64;
-  exports.Float = Float;
-  exports.Double = Double;
-  exports.String = String;
-  exports.Enum = Enum;
-  exports.NullableString = NullableString;
-  exports.PointerTo = PointerTo;
-  exports.NullablePointerTo = NullablePointerTo;
-  exports.ArrayOf = ArrayOf;
-  exports.NullableArrayOf = NullableArrayOf;
-  exports.PackedBool = PackedBool;
-  exports.Handle = Handle;
-  exports.NullableHandle = NullableHandle;
-  exports.Interface = Interface;
-  exports.NullableInterface = NullableInterface;
-  exports.InterfaceRequest = InterfaceRequest;
-  exports.NullableInterfaceRequest = NullableInterfaceRequest;
-  exports.MapOf = MapOf;
-  exports.NullableMapOf = NullableMapOf;
-  return exports;
-});
diff --git a/mojo/public/js/connector.js b/mojo/public/js/connector.js
deleted file mode 100644
index 012e3c7..0000000
--- a/mojo/public/js/connector.js
+++ /dev/null
@@ -1,113 +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.
-
-define("mojo/public/js/connector", [
-  "mojo/public/js/buffer",
-  "mojo/public/js/codec",
-  "mojo/public/js/core",
-  "mojo/public/js/support",
-], function(buffer, codec, core, support) {
-
-  function Connector(handle) {
-    if (!core.isHandle(handle))
-      throw new Error("Connector: not a handle " + handle);
-    this.handle_ = handle;
-    this.dropWrites_ = false;
-    this.error_ = false;
-    this.incomingReceiver_ = null;
-    this.readWatcher_ = null;
-    this.errorHandler_ = null;
-
-    if (handle) {
-      this.readWatcher_ = support.watch(handle,
-                                        core.HANDLE_SIGNAL_READABLE,
-                                        this.readMore_.bind(this));
-    }
-  }
-
-  Connector.prototype.close = function() {
-    if (this.readWatcher_) {
-      support.cancelWatch(this.readWatcher_);
-      this.readWatcher_ = null;
-    }
-    if (this.handle_ != null) {
-      core.close(this.handle_);
-      this.handle_ = null;
-    }
-  };
-
-  Connector.prototype.accept = function(message) {
-    if (this.error_)
-      return false;
-
-    if (this.dropWrites_)
-      return true;
-
-    var result = core.writeMessage(this.handle_,
-                                   new Uint8Array(message.buffer.arrayBuffer),
-                                   message.handles,
-                                   core.WRITE_MESSAGE_FLAG_NONE);
-    switch (result) {
-      case core.RESULT_OK:
-        // The handles were successfully transferred, so we don't own them
-        // anymore.
-        message.handles = [];
-        break;
-      case core.RESULT_FAILED_PRECONDITION:
-        // There's no point in continuing to write to this pipe since the other
-        // end is gone. Avoid writing any future messages. Hide write failures
-        // from the caller since we'd like them to continue consuming any
-        // backlog of incoming messages before regarding the message pipe as
-        // closed.
-        this.dropWrites_ = true;
-        break;
-      default:
-        // This particular write was rejected, presumably because of bad input.
-        // The pipe is not necessarily in a bad state.
-        return false;
-    }
-    return true;
-  };
-
-  Connector.prototype.setIncomingReceiver = function(receiver) {
-    this.incomingReceiver_ = receiver;
-  };
-
-  Connector.prototype.setErrorHandler = function(handler) {
-    this.errorHandler_ = handler;
-  };
-
-  Connector.prototype.waitForNextMessageForTesting = function() {
-    var wait = core.wait(this.handle_, core.HANDLE_SIGNAL_READABLE);
-    this.readMore_(wait.result);
-  };
-
-  Connector.prototype.readMore_ = function(result) {
-    for (;;) {
-      var read = core.readMessage(this.handle_,
-                                  core.READ_MESSAGE_FLAG_NONE);
-      if (this.handle_ == null) // The connector has been closed.
-        return;
-      if (read.result == core.RESULT_SHOULD_WAIT)
-        return;
-      if (read.result != core.RESULT_OK) {
-        // TODO(wangjimmy): Add a handleError method to swap the handle to be
-        // closed with a dummy handle in the case when
-        // read.result != MOJO_RESULT_FAILED_PRECONDITION
-        this.error_ = true;
-        if (this.errorHandler_)
-          this.errorHandler_.onError();
-        return;
-      }
-      var messageBuffer = new buffer.Buffer(read.buffer);
-      var message = new codec.Message(messageBuffer, read.handles);
-      if (this.incomingReceiver_)
-        this.incomingReceiver_.accept(message);
-    }
-  };
-
-  var exports = {};
-  exports.Connector = Connector;
-  return exports;
-});
diff --git a/mojo/public/js/constants.cc b/mojo/public/js/constants.cc
deleted file mode 100644
index a0ce7d4..0000000
--- a/mojo/public/js/constants.cc
+++ /dev/null
@@ -1,33 +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 "mojo/public/js/constants.h"
-
-namespace mojo {
-
-const char kBindingsModuleName[] = "mojo/public/js/bindings";
-const char kBufferModuleName[] = "mojo/public/js/buffer";
-const char kCodecModuleName[] = "mojo/public/js/codec";
-const char kConnectorModuleName[] = "mojo/public/js/connector";
-const char kControlMessageHandlerModuleName[] =
-    "mojo/public/js/lib/control_message_handler";
-const char kControlMessageProxyModuleName[] =
-    "mojo/public/js/lib/control_message_proxy";
-const char kInterfaceControlMessagesMojom[] =
-    "mojo/public/interfaces/bindings/interface_control_messages.mojom";
-const char kInterfaceEndpointClientModuleName[] =
-    "mojo/public/js/lib/interface_endpoint_client";
-const char kInterfaceEndpointHandleModuleName[] =
-    "mojo/public/js/lib/interface_endpoint_handle";
-const char kInterfaceTypesModuleName[] = "mojo/public/js/interface_types";
-const char kPipeControlMessageHandlerModuleName[] =
-    "mojo/public/js/lib/pipe_control_message_handler";
-const char kPipeControlMessageProxyModuleName[] =
-    "mojo/public/js/lib/pipe_control_message_proxy";
-const char kPipeControlMessagesMojom[] =
-    "mojo/public/interfaces/bindings/pipe_control_messages.mojom";
-const char kRouterModuleName[] = "mojo/public/js/router";
-const char kUnicodeModuleName[] = "mojo/public/js/unicode";
-const char kValidatorModuleName[] = "mojo/public/js/validator";
-}  // namespace mojo
diff --git a/mojo/public/js/constants.h b/mojo/public/js/constants.h
deleted file mode 100644
index f561d73..0000000
--- a/mojo/public/js/constants.h
+++ /dev/null
@@ -1,30 +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 MOJO_PUBLIC_JS_BINDINGS_CONSTANTS_H_
-#define MOJO_PUBLIC_JS_BINDINGS_CONSTANTS_H_
-
-namespace mojo {
-
-// JavaScript module names:
-extern const char kBindingsModuleName[];
-extern const char kBufferModuleName[];
-extern const char kCodecModuleName[];
-extern const char kConnectorModuleName[];
-extern const char kControlMessageHandlerModuleName[];
-extern const char kControlMessageProxyModuleName[];
-extern const char kInterfaceControlMessagesMojom[];
-extern const char kInterfaceEndpointClientModuleName[];
-extern const char kInterfaceEndpointHandleModuleName[];
-extern const char kInterfaceTypesModuleName[];
-extern const char kPipeControlMessageHandlerModuleName[];
-extern const char kPipeControlMessageProxyModuleName[];
-extern const char kPipeControlMessagesMojom[];
-extern const char kRouterModuleName[];
-extern const char kUnicodeModuleName[];
-extern const char kValidatorModuleName[];
-
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_JS_BINDINGS_CONSTANTS_H_
diff --git a/mojo/public/js/core.js b/mojo/public/js/core.js
deleted file mode 100644
index b2c4ee2..0000000
--- a/mojo/public/js/core.js
+++ /dev/null
@@ -1,304 +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.
-
-// Module "mojo/public/js/core"
-//
-// Note: This file is for documentation purposes only. The code here is not
-// actually executed. The real module is implemented natively in Mojo.
-//
-// This module provides the JavaScript bindings for mojo/public/c/system/core.h.
-// Refer to that file for more detailed documentation for equivalent methods.
-
-while (1);
-
-/**
- * MojoHandle: An opaque handles to a Mojo object (e.g. a message pipe).
- */
-var kInvalidHandle;
-
-/**
- * MojoResult {number}: Result codes for Mojo operations.
- * See core.h for more information.
- */
-var RESULT_OK;
-var RESULT_CANCELLED;
-var RESULT_UNKNOWN;
-var RESULT_INVALID_ARGUMENT;
-var RESULT_DEADLINE_EXCEEDED;
-var RESULT_NOT_FOUND;
-var RESULT_ALREADY_EXISTS;
-var RESULT_PERMISSION_DENIED;
-var RESULT_RESOURCE_EXHAUSTED;
-var RESULT_FAILED_PRECONDITION;
-var RESULT_ABORTED;
-var RESULT_OUT_OF_RANGE;
-var RESULT_UNIMPLEMENTED;
-var RESULT_INTERNAL;
-var RESULT_UNAVAILABLE;
-var RESULT_DATA_LOSS;
-var RESULT_BUSY;
-var RESULT_SHOULD_WAIT;
-
-/**
- * MojoHandleSignals: Used to specify signals that can be waited on for a handle
- *(and which can be triggered), e.g., the ability to read or write to
- * the handle.
- * See core.h for more information.
- */
-var HANDLE_SIGNAL_NONE;
-var HANDLE_SIGNAL_READABLE;
-var HANDLE_SIGNAL_WRITABLE;
-var HANDLE_SIGNAL_PEER_CLOSED;
-
-/**
- * MojoCreateDataMessageOptions: Used to specify creation parameters for a data
- * pipe to |createDataMessage()|.
- * See core.h for more information.
- */
-dictionary MojoCreateDataMessageOptions {
-  MojoCreateDataMessageOptionsFlags flags;  // See below.
-};
-
-// MojoCreateDataMessageOptionsFlags
-var CREATE_MESSAGE_PIPE_OPTIONS_FLAG_NONE;
-
-/*
- * MojoWriteMessageFlags: Used to specify different modes to |writeMessage()|.
- * See core.h for more information.
- */
-var WRITE_MESSAGE_FLAG_NONE;
-
-/**
- * MojoReadMessageFlags: Used to specify different modes to |readMessage()|.
- * See core.h for more information.
- */
-var READ_MESSAGE_FLAG_NONE;
-var READ_MESSAGE_FLAG_MAY_DISCARD;
-
-/**
- * MojoCreateDataPipeOptions: Used to specify creation parameters for a data
- * pipe to |createDataPipe()|.
- * See core.h for more information.
- */
-dictionary MojoCreateDataPipeOptions {
-  MojoCreateDataPipeOptionsFlags flags;  // See below.
-  int32 elementNumBytes;  // The size of an element, in bytes.
-  int32 capacityNumBytes;  // The capacity of the data pipe, in bytes.
-};
-
-// MojoCreateDataPipeOptionsFlags
-var CREATE_DATA_PIPE_OPTIONS_FLAG_NONE;
-
-/*
- * MojoWriteDataFlags: Used to specify different modes to |writeData()|.
- * See core.h for more information.
- */
-var WRITE_DATA_FLAG_NONE;
-var WRITE_DATA_FLAG_ALL_OR_NONE;
-
-/**
- * MojoReadDataFlags: Used to specify different modes to |readData()|.
- * See core.h for more information.
- */
-var READ_DATA_FLAG_NONE;
-var READ_DATA_FLAG_ALL_OR_NONE;
-var READ_DATA_FLAG_DISCARD;
-var READ_DATA_FLAG_QUERY;
-var READ_DATA_FLAG_PEEK;
-
-/**
- * MojoCreateSharedBufferOptionsFlags: Used to specify options to
- *   |createSharedBuffer()|.
- * See core.h for more information.
- */
-var CREATE_SHARED_BUFFER_OPTIONS_FLAG_NONE;
-
-/**
- * MojoDuplicateBufferHandleOptionsFlags: Used to specify options to
- *   |duplicateBufferHandle()|.
- * See core.h for more information.
- */
-var DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_NONE;
-var DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_READ_ONLY;
-
-/**
- * MojoMapBufferFlags: Used to specify options to |mapBuffer()|.
- * See core.h for more information.
- */
-var MAP_BUFFER_FLAG_NONE;
-
-/**
- * Closes the given |handle|. See MojoClose for more info.
- * @param {MojoHandle} Handle to close.
- * @return {MojoResult} Result code.
- */
-function close(handle) { [native code] }
-
-/**
- * Queries the last known signaling state of |handle|.
- *
- * @param {MojoHandle} handle Handle to query.
- * @return {object} An object of the form {
- *     result,              // MOJO_RESULT_OK or MOJO_RESULT_INVALID_ARGUMENT
- *     satisfiedSignals,    // MojoHandleSignals (see above)
- *     satisfiableSignals,  // MojoHandleSignals
- * }
- */
-function queryHandleSignalsState(handle) { [native code] }
-
-/**
- * Waits on the given handle until a signal indicated by |signals| is
- * satisfied or an error occurs.
- *
- * @param {MojoHandle} handle Handle to wait on.
- * @param {MojoHandleSignals} signals Specifies the condition to wait for.
- * @return {MojoResult} Result code.
- */
-function wait(handle, signals) { [native code] }
-
-/**
- * Creates a message pipe. This function always succeeds.
- * See MojoCreateMessagePipe for more information on message pipes.
- *
- * @param {MojoCreateMessagePipeOptions} optionsDict Options to control the
- * message pipe parameters. May be null.
- * @return {MessagePipe} An object of the form {
- *     handle0,
- *     handle1,
- *   }
- *   where |handle0| and |handle1| are MojoHandles to each end of the channel.
- */
-function createMessagePipe(optionsDict) { [native code] }
-
-/**
- * Writes a message to the message pipe endpoint given by |handle|. See
- * MojoWriteMessage for more information, including return codes.
- *
- * @param {MojoHandle} handle The endpoint to write to.
- * @param {ArrayBufferView} buffer The message data. May be empty.
- * @param {Array.MojoHandle} handlesArray Any handles to attach. Handles are
- *   transferred on success and will no longer be valid. May be empty.
- * @param {MojoWriteMessageFlags} flags Flags.
- * @return {MojoResult} Result code.
- */
-function writeMessage(handle, buffer, handlesArray, flags) { [native code] }
-
-/**
- * Reads a message from the message pipe endpoint given by |handle|. See
- * MojoReadMessage for more information, including return codes.
- *
- * @param {MojoHandle} handle The endpoint to read from.
- * @param {MojoReadMessageFlags} flags Flags.
- * @return {object} An object of the form {
- *     result,  // |RESULT_OK| on success, error code otherwise.
- *     buffer,  // An ArrayBufferView of the message data (only on success).
- *     handles  // An array of MojoHandles transferred, if any.
- *   }
- */
-function readMessage(handle, flags) { [native code] }
-
-/**
- * Creates a data pipe, which is a unidirectional communication channel for
- * unframed data, with the given options. See MojoCreateDataPipe for more
- * more information, including return codes.
- *
- * @param {MojoCreateDataPipeOptions} optionsDict Options to control the data
- *   pipe parameters. May be null.
- * @return {object} An object of the form {
- *     result,  // |RESULT_OK| on success, error code otherwise.
- *     producerHandle,  // MojoHandle to use with writeData (only on success).
- *     consumerHandle,  // MojoHandle to use with readData (only on success).
- *   }
- */
-function createDataPipe(optionsDict) { [native code] }
-
-/**
- * Writes the given data to the data pipe producer given by |handle|. See
- * MojoWriteData for more information, including return codes.
- *
- * @param {MojoHandle} handle A producerHandle returned by createDataPipe.
- * @param {ArrayBufferView} buffer The data to write.
- * @param {MojoWriteDataFlags} flags Flags.
- * @return {object} An object of the form {
- *     result,  // |RESULT_OK| on success, error code otherwise.
- *     numBytes,  // The number of bytes written.
- *   }
- */
-function writeData(handle, buffer, flags) { [native code] }
-
-/**
- * Reads data from the data pipe consumer given by |handle|. May also
- * be used to discard data. See MojoReadData for more information, including
- * return codes.
- *
- * @param {MojoHandle} handle A consumerHandle returned by createDataPipe.
- * @param {MojoReadDataFlags} flags Flags.
- * @return {object} An object of the form {
- *     result,  // |RESULT_OK| on success, error code otherwise.
- *     buffer,  // An ArrayBufferView of the data read (only on success).
- *   }
- */
-function readData(handle, flags) { [native code] }
-
-/**
- * True if the argument is a message or data pipe handle.
- *
- * @param {value} an arbitrary JS value.
- * @return true or false
- */
-function isHandle(value) { [native code] }
-
-/**
- * Creates shared buffer of specified size |num_bytes|.
- * See MojoCreateSharedBuffer for more information including error codes.
- *
- * @param {number} num_bytes Size of the memory to be allocated for shared
- * @param {MojoCreateSharedBufferOptionsFlags} flags Flags.
- *   buffer.
- * @return {object} An object of the form {
- *     result,  // |RESULT_OK| on success, error code otherwise.
- *     handle,  // An MojoHandle for shared buffer (only on success).
- *   }
- */
-function createSharedBuffer(num_bytes, flags) { [native code] }
-
-/**
- * Duplicates the |buffer_handle| to a shared buffer. Duplicated handle can be
- * sent to another process over message pipe. See MojoDuplicateBufferHandle for
- * more information including error codes.
- *
- * @param {MojoHandle} buffer_handle MojoHandle.
- * @param {MojoCreateSharedBufferOptionsFlags} flags Flags.
- * @return {object} An object of the form {
- *     result,  // |RESULT_OK| on success, error code otherwise.
- *     handle,  // A duplicated MojoHandle for shared buffer (only on success).
- *   }
- */
-function duplicateBufferHandle(buffer_handle, flags) { [native code] }
-
-/**
- * Maps the part (at offset |offset| of length |num_bytes|) of the buffer given
- * by |buffer_handle| into ArrayBuffer memory |buffer|, with options specified
- * by |flags|. See MojoMapBuffer for more information including error codes.
- *
- * @param {MojoHandle} buffer_handle A sharedBufferHandle returned by
- *   createSharedBuffer.
- * @param {number} offset Offset.
- * @param {number} num_bytes Size of the memory to be mapped.
- * @param {MojoMapBufferFlags} flags Flags.
- * @return {object} An object of the form {
- *     result,  // |RESULT_OK| on success, error code otherwise.
- *     buffer,  // An ArrayBuffer (only on success).
- *   }
- */
-function mapBuffer(buffer_handle, offset, num_bytes, flags) { [native code] }
-
-/**
- * Unmaps buffer that was mapped using mapBuffer.
- * See MojoUnmapBuffer for more information including error codes.
- *
- * @param {ArrayBuffer} buffer ArrayBuffer.
- * @return {MojoResult} Result code.
- */
-function unmapBuffer(buffer) { [native code] }
diff --git a/mojo/public/js/interface_types.js b/mojo/public/js/interface_types.js
deleted file mode 100644
index e8ed37a..0000000
--- a/mojo/public/js/interface_types.js
+++ /dev/null
@@ -1,70 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-define("mojo/public/js/interface_types", [
-  "mojo/public/js/core",
-], function(core) {
-
-  // Constants ----------------------------------------------------------------
-  var kInterfaceIdNamespaceMask = 0x80000000;
-  var kMasterInterfaceId = 0x00000000;
-  var kInvalidInterfaceId = 0xFFFFFFFF;
-
-  // ---------------------------------------------------------------------------
-
-  function InterfacePtrInfo(handle, version) {
-    this.handle = handle;
-    this.version = version;
-  }
-
-  InterfacePtrInfo.prototype.isValid = function() {
-    return core.isHandle(this.handle);
-  };
-
-  InterfacePtrInfo.prototype.close = function() {
-    if (!this.isValid())
-      return;
-
-    core.close(this.handle);
-    this.handle = null;
-    this.version = 0;
-  };
-
-  // ---------------------------------------------------------------------------
-
-  function InterfaceRequest(handle) {
-    this.handle = handle;
-  }
-
-  InterfaceRequest.prototype.isValid = function() {
-    return core.isHandle(this.handle);
-  };
-
-  InterfaceRequest.prototype.close = function() {
-    if (!this.isValid())
-      return;
-
-    core.close(this.handle);
-    this.handle = null;
-  };
-
-  function isMasterInterfaceId(interfaceId) {
-    return interfaceId === kMasterInterfaceId;
-  }
-
-  function isValidInterfaceId(interfaceId) {
-    return interfaceId !== kInvalidInterfaceId;
-  }
-
-  var exports = {};
-  exports.InterfacePtrInfo = InterfacePtrInfo;
-  exports.InterfaceRequest = InterfaceRequest;
-  exports.isMasterInterfaceId = isMasterInterfaceId;
-  exports.isValidInterfaceId = isValidInterfaceId;
-  exports.kInvalidInterfaceId = kInvalidInterfaceId;
-  exports.kMasterInterfaceId = kMasterInterfaceId;
-  exports.kInterfaceIdNamespaceMask = kInterfaceIdNamespaceMask;
-
-  return exports;
-});
diff --git a/mojo/public/js/lib/control_message_handler.js b/mojo/public/js/lib/control_message_handler.js
deleted file mode 100644
index 5da306e..0000000
--- a/mojo/public/js/lib/control_message_handler.js
+++ /dev/null
@@ -1,111 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-define("mojo/public/js/lib/control_message_handler", [
-  "mojo/public/interfaces/bindings/interface_control_messages.mojom",
-  "mojo/public/js/codec",
-  "mojo/public/js/validator",
-], function(controlMessages, codec, validator) {
-
-  var Validator = validator.Validator;
-
-  function validateControlRequestWithResponse(message) {
-    var messageValidator = new Validator(message);
-    var error = messageValidator.validateMessageIsRequestExpectingResponse();
-    if (error !== validator.validationError.NONE) {
-      throw error;
-    }
-
-    if (message.getName() != controlMessages.kRunMessageId) {
-      throw new Error("Control message name is not kRunMessageId");
-    }
-
-    // Validate payload.
-    error = controlMessages.RunMessageParams.validate(messageValidator,
-        message.getHeaderNumBytes());
-    if (error != validator.validationError.NONE) {
-      throw error;
-    }
-  }
-
-  function validateControlRequestWithoutResponse(message) {
-    var messageValidator = new Validator(message);
-    var error = messageValidator.validateMessageIsRequestWithoutResponse();
-    if (error != validator.validationError.NONE) {
-      throw error;
-    }
-
-    if (message.getName() != controlMessages.kRunOrClosePipeMessageId) {
-      throw new Error("Control message name is not kRunOrClosePipeMessageId");
-    }
-
-    // Validate payload.
-    error = controlMessages.RunOrClosePipeMessageParams.validate(
-        messageValidator, message.getHeaderNumBytes());
-    if (error != validator.validationError.NONE) {
-      throw error;
-    }
-  }
-
-  function runOrClosePipe(message, interface_version) {
-    var reader = new codec.MessageReader(message);
-    var runOrClosePipeMessageParams = reader.decodeStruct(
-        controlMessages.RunOrClosePipeMessageParams);
-    return interface_version >=
-        runOrClosePipeMessageParams.input.require_version.version;
-  }
-
-  function run(message, responder, interface_version) {
-    var reader = new codec.MessageReader(message);
-    var runMessageParams =
-        reader.decodeStruct(controlMessages.RunMessageParams);
-    var runOutput = null;
-
-    if (runMessageParams.input.query_version) {
-      runOutput = new controlMessages.RunOutput();
-      runOutput.query_version_result = new
-          controlMessages.QueryVersionResult({'version': interface_version});
-    }
-
-    var runResponseMessageParams = new
-        controlMessages.RunResponseMessageParams();
-    runResponseMessageParams.output = runOutput;
-
-    var messageName = controlMessages.kRunMessageId;
-    var payloadSize = controlMessages.RunResponseMessageParams.encodedSize;
-    var requestID = reader.requestID;
-    var builder = new codec.MessageWithRequestIDBuilder(messageName,
-        payloadSize, codec.kMessageIsResponse, requestID);
-    builder.encodeStruct(controlMessages.RunResponseMessageParams,
-                         runResponseMessageParams);
-    responder.accept(builder.finish());
-    return true;
-  }
-
-  function isControlMessage(message) {
-    return message.getName() == controlMessages.kRunMessageId ||
-           message.getName() == controlMessages.kRunOrClosePipeMessageId;
-  }
-
-  function ControlMessageHandler(interface_version) {
-    this.interface_version_ = interface_version;
-  }
-
-  ControlMessageHandler.prototype.accept = function(message) {
-    validateControlRequestWithoutResponse(message);
-    return runOrClosePipe(message, this.interface_version_);
-  };
-
-  ControlMessageHandler.prototype.acceptWithResponder = function(message,
-      responder) {
-    validateControlRequestWithResponse(message);
-    return run(message, responder, this.interface_version_);
-  };
-
-  var exports = {};
-  exports.ControlMessageHandler = ControlMessageHandler;
-  exports.isControlMessage = isControlMessage;
-
-  return exports;
-});
diff --git a/mojo/public/js/lib/control_message_proxy.js b/mojo/public/js/lib/control_message_proxy.js
deleted file mode 100644
index b6f1d3c..0000000
--- a/mojo/public/js/lib/control_message_proxy.js
+++ /dev/null
@@ -1,104 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-define("mojo/public/js/lib/control_message_proxy", [
-  "mojo/public/interfaces/bindings/interface_control_messages.mojom",
-  "mojo/public/js/codec",
-  "mojo/public/js/validator",
-], function(controlMessages, codec, validator) {
-
-  var Validator = validator.Validator;
-
-  function constructRunOrClosePipeMessage(runOrClosePipeInput) {
-    var runOrClosePipeMessageParams = new
-        controlMessages.RunOrClosePipeMessageParams();
-    runOrClosePipeMessageParams.input = runOrClosePipeInput;
-
-    var messageName = controlMessages.kRunOrClosePipeMessageId;
-    var payloadSize = controlMessages.RunOrClosePipeMessageParams.encodedSize;
-    var builder = new codec.MessageBuilder(messageName, payloadSize);
-    builder.encodeStruct(controlMessages.RunOrClosePipeMessageParams,
-                         runOrClosePipeMessageParams);
-    var message = builder.finish();
-    return message;
-  }
-
-  function validateControlResponse(message) {
-    var messageValidator = new Validator(message);
-    var error = messageValidator.validateMessageIsResponse();
-    if (error != validator.validationError.NONE) {
-      throw error;
-    }
-
-    if (message.getName() != controlMessages.kRunMessageId) {
-      throw new Error("Control message name is not kRunMessageId");
-    }
-
-    // Validate payload.
-    error = controlMessages.RunResponseMessageParams.validate(
-        messageValidator, message.getHeaderNumBytes());
-    if (error != validator.validationError.NONE) {
-      throw error;
-    }
-  }
-
-  function acceptRunResponse(message) {
-    validateControlResponse(message);
-
-    var reader = new codec.MessageReader(message);
-    var runResponseMessageParams = reader.decodeStruct(
-        controlMessages.RunResponseMessageParams);
-
-    return Promise.resolve(runResponseMessageParams);
-  }
-
- /**
-  * Sends the given run message through the receiver.
-  * Accepts the response message from the receiver and decodes the message
-  * struct to RunResponseMessageParams.
-  *
-  * @param  {Router} receiver.
-  * @param  {RunMessageParams} runMessageParams to be sent via a message.
-  * @return {Promise} that resolves to a RunResponseMessageParams.
-  */
-  function sendRunMessage(receiver, runMessageParams) {
-    var messageName = controlMessages.kRunMessageId;
-    var payloadSize = controlMessages.RunMessageParams.encodedSize;
-    // |requestID| is set to 0, but is later properly set by Router.
-    var builder = new codec.MessageWithRequestIDBuilder(messageName,
-        payloadSize, codec.kMessageExpectsResponse, 0);
-    builder.encodeStruct(controlMessages.RunMessageParams, runMessageParams);
-    var message = builder.finish();
-
-    return receiver.acceptAndExpectResponse(message).then(acceptRunResponse);
-  }
-
-  function ControlMessageProxy(receiver) {
-    this.receiver_ = receiver;
-  }
-
-  ControlMessageProxy.prototype.queryVersion = function() {
-    var runMessageParams = new controlMessages.RunMessageParams();
-    runMessageParams.input = new controlMessages.RunInput();
-    runMessageParams.input.query_version = new controlMessages.QueryVersion();
-
-    return sendRunMessage(this.receiver_, runMessageParams).then(function(
-        runResponseMessageParams) {
-      return runResponseMessageParams.output.query_version_result.version;
-    });
-  };
-
-  ControlMessageProxy.prototype.requireVersion = function(version) {
-    var runOrClosePipeInput = new controlMessages.RunOrClosePipeInput();
-    runOrClosePipeInput.require_version = new controlMessages.RequireVersion({
-        'version': version});
-    var message = constructRunOrClosePipeMessage(runOrClosePipeInput);
-    this.receiver_.accept(message);
-  };
-
-  var exports = {};
-  exports.ControlMessageProxy = ControlMessageProxy;
-
-  return exports;
-});
diff --git a/mojo/public/js/lib/interface_endpoint_client.js b/mojo/public/js/lib/interface_endpoint_client.js
deleted file mode 100644
index 631c52e..0000000
--- a/mojo/public/js/lib/interface_endpoint_client.js
+++ /dev/null
@@ -1,232 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-define("mojo/public/js/lib/interface_endpoint_client", [
-  "console",
-  "mojo/public/js/codec",
-  "mojo/public/js/lib/control_message_handler",
-  "mojo/public/js/lib/control_message_proxy",
-  "mojo/public/js/lib/interface_endpoint_handle",
-  "mojo/public/js/validator",
-  "timer",
-], function(console,
-            codec,
-            controlMessageHandler,
-            controlMessageProxy,
-            interfaceEndpointHandle,
-            validator,
-            timer) {
-
-  var ControlMessageHandler = controlMessageHandler.ControlMessageHandler;
-  var ControlMessageProxy = controlMessageProxy.ControlMessageProxy;
-  var MessageReader = codec.MessageReader;
-  var Validator = validator.Validator;
-  var InterfaceEndpointHandle = interfaceEndpointHandle.InterfaceEndpointHandle;
-
-  function InterfaceEndpointClient(interfaceEndpointHandle, receiver,
-      interfaceVersion) {
-    this.controller_ = null;
-    this.encounteredError_ = false;
-    this.handle_ = interfaceEndpointHandle;
-    this.incomingReceiver_ = receiver;
-
-    if (interfaceVersion !== undefined) {
-      this.controlMessageHandler_ = new ControlMessageHandler(
-          interfaceVersion);
-    } else {
-      this.controlMessageProxy_ = new ControlMessageProxy(this);
-    }
-
-    this.nextRequestID_ = 0;
-    this.completers_ = new Map();
-    this.payloadValidators_ = [];
-    this.connectionErrorHandler_ = null;
-
-    if (interfaceEndpointHandle.pendingAssociation()) {
-      interfaceEndpointHandle.setAssociationEventHandler(
-          this.onAssociationEvent.bind(this));
-    } else {
-      this.initControllerIfNecessary_();
-    }
-  }
-
-  InterfaceEndpointClient.prototype.initControllerIfNecessary_ = function() {
-    if (this.controller_ || this.handle_.pendingAssociation()) {
-      return;
-    }
-
-    this.controller_ = this.handle_.groupController().attachEndpointClient(
-        this.handle_, this);
-  };
-
-  InterfaceEndpointClient.prototype.onAssociationEvent = function(
-      associationEvent) {
-    if (associationEvent ===
-        InterfaceEndpointHandle.AssociationEvent.ASSOCIATED) {
-      this.initControllerIfNecessary_();
-    } else if (associationEvent ===
-        InterfaceEndpointHandle.AssociationEvent
-                               .PEER_CLOSED_BEFORE_ASSOCIATION) {
-      timer.createOneShot(0, this.notifyError.bind(this,
-          this.handle_.disconnectReason()));
-    }
-  };
-
-  InterfaceEndpointClient.prototype.passHandle = function() {
-    if (!this.handle_.isValid()) {
-      return new InterfaceEndpointHandle();
-    }
-
-    // Used to clear the previously set callback.
-    this.handle_.setAssociationEventHandler(undefined);
-
-    if (this.controller_) {
-      this.controller_ = null;
-      this.handle_.groupController().detachEndpointClient(this.handle_);
-    }
-    var handle = this.handle_;
-    this.handle_ = null;
-    return handle;
-  };
-
-  InterfaceEndpointClient.prototype.close = function(reason) {
-    var handle = this.passHandle();
-    handle.reset(reason);
-  };
-
-  InterfaceEndpointClient.prototype.accept = function(message) {
-    if (this.encounteredError_) {
-      return false;
-    }
-
-    this.initControllerIfNecessary_();
-    return this.controller_.sendMessage(message);
-  };
-
-  InterfaceEndpointClient.prototype.acceptAndExpectResponse = function(
-      message) {
-    if (this.encounteredError_) {
-      return Promise.reject();
-    }
-
-    this.initControllerIfNecessary_();
-
-    // Reserve 0 in case we want it to convey special meaning in the future.
-    var requestID = this.nextRequestID_++;
-    if (requestID === 0)
-      requestID = this.nextRequestID_++;
-
-    message.setRequestID(requestID);
-    var result = this.controller_.sendMessage(message);
-    if (!result)
-      return Promise.reject(Error("Connection error"));
-
-    var completer = {};
-    this.completers_.set(requestID, completer);
-    return new Promise(function(resolve, reject) {
-      completer.resolve = resolve;
-      completer.reject = reject;
-    });
-  };
-
-  InterfaceEndpointClient.prototype.setPayloadValidators = function(
-      payloadValidators) {
-    this.payloadValidators_ = payloadValidators;
-  };
-
-  InterfaceEndpointClient.prototype.setIncomingReceiver = function(receiver) {
-    this.incomingReceiver_ = receiver;
-  };
-
-  InterfaceEndpointClient.prototype.setConnectionErrorHandler = function(
-      handler) {
-    this.connectionErrorHandler_ = handler;
-  };
-
-  InterfaceEndpointClient.prototype.handleIncomingMessage_ = function(
-      message) {
-    var noError = validator.validationError.NONE;
-    var messageValidator = new Validator(message);
-    var err = noError;
-    for (var i = 0; err === noError && i < this.payloadValidators_.length; ++i)
-      err = this.payloadValidators_[i](messageValidator);
-
-    if (err == noError) {
-      return this.handleValidIncomingMessage_(message);
-    } else {
-      validator.reportValidationError(err);
-      return false;
-    }
-  };
-
-  InterfaceEndpointClient.prototype.handleValidIncomingMessage_ = function(
-      message) {
-    if (validator.isTestingMode()) {
-      return true;
-    }
-
-    if (this.encounteredError_) {
-      return false;
-    }
-
-    var ok = false;
-
-    if (message.expectsResponse()) {
-      if (controlMessageHandler.isControlMessage(message) &&
-          this.controlMessageHandler_) {
-        ok = this.controlMessageHandler_.acceptWithResponder(message, this);
-      } else if (this.incomingReceiver_) {
-        ok = this.incomingReceiver_.acceptWithResponder(message, this);
-      }
-    } else if (message.isResponse()) {
-      var reader = new MessageReader(message);
-      var requestID = reader.requestID;
-      var completer = this.completers_.get(requestID);
-      if (completer) {
-        this.completers_.delete(requestID);
-        completer.resolve(message);
-        ok = true;
-      } else {
-        console.log("Unexpected response with request ID: " + requestID);
-      }
-    } else {
-      if (controlMessageHandler.isControlMessage(message) &&
-          this.controlMessageHandler_) {
-        ok = this.controlMessageHandler_.accept(message);
-      } else if (this.incomingReceiver_) {
-        ok = this.incomingReceiver_.accept(message);
-      }
-    }
-    return ok;
-  };
-
-  InterfaceEndpointClient.prototype.notifyError = function(reason) {
-    if (this.encounteredError_) {
-      return;
-    }
-    this.encounteredError_ = true;
-
-    this.completers_.forEach(function(value) {
-      value.reject();
-    });
-    this.completers_.clear();  // Drop any responders.
-
-    if (this.connectionErrorHandler_) {
-      this.connectionErrorHandler_(reason);
-    }
-  };
-
-  InterfaceEndpointClient.prototype.queryVersion = function() {
-    return this.controlMessageProxy_.queryVersion();
-  };
-
-  InterfaceEndpointClient.prototype.requireVersion = function(version) {
-    this.controlMessageProxy_.requireVersion(version);
-  };
-
-  var exports = {};
-  exports.InterfaceEndpointClient = InterfaceEndpointClient;
-
-  return exports;
-});
diff --git a/mojo/public/js/lib/interface_endpoint_handle.js b/mojo/public/js/lib/interface_endpoint_handle.js
deleted file mode 100644
index f48b89b..0000000
--- a/mojo/public/js/lib/interface_endpoint_handle.js
+++ /dev/null
@@ -1,158 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-define("mojo/public/js/lib/interface_endpoint_handle", [
-  "mojo/public/js/interface_types",
-  "timer",
-], function(types, timer) {
-
-  var AssociationEvent = {
-    // The interface has been associated with a message pipe.
-    ASSOCIATED: 'associated',
-    // The peer of this object has been closed before association.
-    PEER_CLOSED_BEFORE_ASSOCIATION: 'peer_closed_before_association'
-  };
-
-  function State(interfaceId, associatedGroupController) {
-    if (interfaceId === undefined) {
-      interfaceId = types.kInvalidInterfaceId;
-    }
-
-    this.interfaceId = interfaceId;
-    this.associatedGroupController = associatedGroupController;
-    this.pendingAssociation = false;
-    this.disconnectReason = null;
-    this.peerState_ = null;
-    this.associationEventHandler_ = null;
-  }
-
-  State.prototype.initPendingState = function(peer) {
-    this.pendingAssociation = true;
-    this.peerState_ = peer;
-  };
-
-  State.prototype.isValid = function() {
-    return this.pendingAssociation ||
-        types.isValidInterfaceId(this.interfaceId);
-  };
-
-  State.prototype.close = function(disconnectReason) {
-    var cachedGroupController;
-    var cachedPeerState;
-    var cachedId = types.kInvalidInterfaceId;
-
-    if (!this.pendingAssociation) {
-      if (types.isValidInterfaceId(this.interfaceId)) {
-        cachedGroupController = this.associatedGroupController;
-        this.associatedGroupController = null;
-        cachedId = this.interfaceId;
-        this.interfaceId = types.kInvalidInterfaceId;
-      }
-    } else {
-      this.pendingAssociation = false;
-      cachedPeerState = this.peerState_;
-      this.peerState_ = null;
-    }
-
-    if (cachedGroupController) {
-      cachedGroupController.closeEndpointHandle(cachedId,
-          disconnectReason);
-    } else if (cachedPeerState) {
-      cachedPeerState.onPeerClosedBeforeAssociation(disconnectReason);
-    }
-  };
-
-  State.prototype.runAssociationEventHandler = function(associationEvent) {
-    if (this.associationEventHandler_) {
-      var handler = this.associationEventHandler_;
-      this.associationEventHandler_ = null;
-      handler(associationEvent);
-    }
-  };
-
-  State.prototype.setAssociationEventHandler = function(handler) {
-    if (!this.pendingAssociation &&
-        !types.isValidInterfaceId(this.interfaceId)) {
-      return;
-    }
-
-    if (!handler) {
-      this.associationEventHandler_ = null;
-      return;
-    }
-
-    this.associationEventHandler_ = handler;
-    if (!this.pendingAssociation) {
-      timer.createOneShot(0, this.runAssociationEventHandler.bind(this,
-          AssociationEvent.ASSOCIATED));
-    } else if (!this.peerState_) {
-      timer.createOneShot(0, this.runAssociationEventHandler.bind(this,
-          AssociationEvent.PEER_CLOSED_BEFORE_ASSOCIATION));
-    }
-  };
-
-  State.prototype.onAssociated = function(interfaceId,
-      associatedGroupController) {
-    if (!this.pendingAssociation) {
-      return;
-    }
-
-    this.pendingAssociation = false;
-    this.peerState_ = null;
-    this.interfaceId = interfaceId;
-    this.associatedGroupController = associatedGroupController;
-    this.runAssociationEventHandler(AssociationEvent.ASSOCIATED);
-  };
-
-  State.prototype.onPeerClosedBeforeAssociation = function(disconnectReason) {
-    if (!this.pendingAssociation) {
-      return;
-    }
-
-    this.peerState_ = null;
-    this.disconnectReason = disconnectReason;
-
-    this.runAssociationEventHandler(
-        AssociationEvent.PEER_CLOSED_BEFORE_ASSOCIATION);
-  };
-
-  function InterfaceEndpointHandle(interfaceId, associatedGroupController) {
-    this.state_ = new State(interfaceId, associatedGroupController);
-  }
-
-  InterfaceEndpointHandle.prototype.isValid = function() {
-    return this.state_.isValid();
-  };
-
-  InterfaceEndpointHandle.prototype.pendingAssociation = function() {
-    return this.state_.pendingAssociation;
-  };
-
-  InterfaceEndpointHandle.prototype.id = function() {
-    return this.state_.interfaceId;
-  };
-
-  InterfaceEndpointHandle.prototype.groupController = function() {
-    return this.state_.associatedGroupController;
-  };
-
-  InterfaceEndpointHandle.prototype.disconnectReason = function() {
-    return this.state_.disconnectReason;
-  };
-
-  InterfaceEndpointHandle.prototype.setAssociationEventHandler = function(
-      handler) {
-    this.state_.setAssociationEventHandler(handler);
-  };
-
-  InterfaceEndpointHandle.prototype.reset = function(reason) {
-    this.state_.close(reason);
-    this.state_ = new State();
-  };
-
-  var exports = {};
-  exports.InterfaceEndpointHandle = InterfaceEndpointHandle;
-
-  return exports;
-});
diff --git a/mojo/public/js/lib/pipe_control_message_handler.js b/mojo/public/js/lib/pipe_control_message_handler.js
deleted file mode 100644
index 2eb45d1..0000000
--- a/mojo/public/js/lib/pipe_control_message_handler.js
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-define("mojo/public/js/lib/pipe_control_message_handler", [
-  "mojo/public/interfaces/bindings/pipe_control_messages.mojom",
-  "mojo/public/js/codec",
-  "mojo/public/js/interface_types",
-  "mojo/public/js/validator",
-], function(pipeControlMessages, codec, types, validator) {
-
-  var Validator = validator.Validator;
-
-  function validateControlRequestWithoutResponse(message) {
-    var messageValidator = new Validator(message);
-    var error = messageValidator.validateMessageIsRequestWithoutResponse();
-    if (error != validator.validationError.NONE) {
-      throw error;
-    }
-
-    if (message.getName() != pipeControlMessages.kRunOrClosePipeMessageId) {
-      throw new Error("Control message name is not kRunOrClosePipeMessageId");
-    }
-
-    // Validate payload.
-    error = pipeControlMessages.RunOrClosePipeMessageParams.validate(
-        messageValidator, message.getHeaderNumBytes());
-    if (error != validator.validationError.NONE) {
-      throw error;
-    }
-  }
-
-  function runOrClosePipe(message, delegate) {
-    var reader = new codec.MessageReader(message);
-    var runOrClosePipeMessageParams = reader.decodeStruct(
-        pipeControlMessages.RunOrClosePipeMessageParams);
-    var event = runOrClosePipeMessageParams.input
-        .peer_associated_endpoint_closed_event;
-    return delegate.onPeerAssociatedEndpointClosed(event.id,
-        event.disconnect_reason);
-  }
-
-  function isPipeControlMessage(message) {
-    return !types.isValidInterfaceId(message.getInterfaceId());
-  }
-
-  function PipeControlMessageHandler(delegate) {
-    this.delegate_ = delegate;
-  }
-
-  PipeControlMessageHandler.prototype.accept = function(message) {
-    validateControlRequestWithoutResponse(message);
-    return runOrClosePipe(message, this.delegate_);
-  };
-
-  var exports = {};
-  exports.PipeControlMessageHandler = PipeControlMessageHandler;
-  exports.isPipeControlMessage = isPipeControlMessage;
-
-  return exports;
-});
diff --git a/mojo/public/js/lib/pipe_control_message_proxy.js b/mojo/public/js/lib/pipe_control_message_proxy.js
deleted file mode 100644
index 4b8e7a2..0000000
--- a/mojo/public/js/lib/pipe_control_message_proxy.js
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-define("mojo/public/js/lib/pipe_control_message_proxy", [
-  "mojo/public/interfaces/bindings/pipe_control_messages.mojom",
-  "mojo/public/js/codec",
-  "mojo/public/js/interface_types",
-], function(pipeControlMessages, codec, types) {
-
-  function constructRunOrClosePipeMessage(runOrClosePipeInput) {
-    var runOrClosePipeMessageParams = new
-        pipeControlMessages.RunOrClosePipeMessageParams();
-    runOrClosePipeMessageParams.input = runOrClosePipeInput;
-
-    var messageName = pipeControlMessages.kRunOrClosePipeMessageId;
-    var payloadSize =
-        pipeControlMessages.RunOrClosePipeMessageParams.encodedSize;
-
-    var builder = new codec.MessageBuilder(messageName, payloadSize);
-    builder.encodeStruct(pipeControlMessages.RunOrClosePipeMessageParams,
-                         runOrClosePipeMessageParams);
-    var message = builder.finish();
-    message.setInterfaceId(types.kInvalidInterfaceId);
-    return message;
-  }
-
-  function PipeControlMessageProxy(receiver) {
-    this.receiver_ = receiver;
-  }
-
-  PipeControlMessageProxy.prototype.notifyPeerEndpointClosed = function(
-      interfaceId, reason) {
-    var message = this.constructPeerEndpointClosedMessage(interfaceId, reason);
-    this.receiver_.accept(message);
-  };
-
-  PipeControlMessageProxy.prototype.constructPeerEndpointClosedMessage =
-      function(interfaceId, reason) {
-    var event = new pipeControlMessages.PeerAssociatedEndpointClosedEvent();
-    event.id = interfaceId;
-    if (reason) {
-      event.disconnect_reason = new pipeControlMessages.DisconnectReason({
-          custom_reason: reason.custom_reason,
-          description: reason.description});
-    }
-    var runOrClosePipeInput = new pipeControlMessages.RunOrClosePipeInput();
-    runOrClosePipeInput.peer_associated_endpoint_closed_event = event;
-    return constructRunOrClosePipeMessage(runOrClosePipeInput);
-  };
-
-  var exports = {};
-  exports.PipeControlMessageProxy = PipeControlMessageProxy;
-
-  return exports;
-});
diff --git a/mojo/public/js/new_bindings/base.js b/mojo/public/js/new_bindings/base.js
deleted file mode 100644
index db72d48..0000000
--- a/mojo/public/js/new_bindings/base.js
+++ /dev/null
@@ -1,111 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-'use strict';
-
-if (mojo && mojo.internal) {
-  throw new Error('The Mojo bindings library has been initialized.');
-}
-
-var mojo = mojo || {};
-mojo.internal = {};
-mojo.internal.global = this;
-mojo.config = {
-  // Whether to automatically load mojom dependencies.
-  // For example, if foo.mojom imports bar.mojom, |autoLoadMojomDeps| set to
-  // true means that loading foo.mojom.js will insert a <script> tag to load
-  // bar.mojom.js, if it hasn't been loaded.
-  //
-  // The URL of bar.mojom.js is determined by the relative path of bar.mojom
-  // (relative to the position of foo.mojom at build time) and the URL of
-  // foo.mojom.js. For exmple, if at build time the two mojom files are
-  // located at:
-  //   a/b/c/foo.mojom
-  //   a/b/d/bar.mojom
-  // and the URL of foo.mojom.js is:
-  //   http://example.org/scripts/b/c/foo.mojom.js
-  // then the URL of bar.mojom.js will be:
-  //   http://example.org/scripts/b/d/bar.mojom.js
-  //
-  // If you would like bar.mojom.js to live at a different location, you need
-  // to turn off |autoLoadMojomDeps| before loading foo.mojom.js, and manually
-  // load bar.mojom.js yourself. Similarly, you need to turn off the option if
-  // you merge bar.mojom.js and foo.mojom.js into a single file.
-  //
-  // Performance tip: Avoid loading the same mojom.js file multiple times.
-  // Assume that |autoLoadMojomDeps| is set to true:
-  // <!-- No duplicate loading; recommended. -->
-  // <script src="http://example.org/scripts/b/c/foo.mojom.js"></script>
-  //
-  // <!-- No duplicate loading, although unnecessary. -->
-  // <script src="http://example.org/scripts/b/d/bar.mojom.js"></script>
-  // <script src="http://example.org/scripts/b/c/foo.mojom.js"></script>
-  //
-  // <!-- Load bar.mojom.js twice; should be avoided. -->
-  // <script src="http://example.org/scripts/b/c/foo.mojom.js"></script>
-  // <script src="http://example.org/scripts/b/d/bar.mojom.js"></script>
-  autoLoadMojomDeps: true
-};
-
-(function() {
-  var internal = mojo.internal;
-
-  var LoadState = {
-    PENDING_LOAD: 1,
-    LOADED: 2
-  };
-
-  var mojomRegistry = new Map();
-
-  function exposeNamespace(namespace) {
-    var current = internal.global;
-    var parts = namespace.split('.');
-
-    for (var part; parts.length && (part = parts.shift());) {
-      if (!current[part]) {
-        current[part] = {};
-      }
-      current = current[part];
-    }
-
-    return current;
-  }
-
-  function isMojomPendingLoad(id) {
-    return mojomRegistry.get(id) === LoadState.PENDING_LOAD;
-  }
-
-  function isMojomLoaded(id) {
-    return mojomRegistry.get(id) === LoadState.LOADED;
-  }
-
-  function markMojomPendingLoad(id) {
-    if (isMojomLoaded(id)) {
-      throw new Error('The following mojom file has been loaded: ' + id);
-    }
-
-    mojomRegistry.set(id, LoadState.PENDING_LOAD);
-  }
-
-  function markMojomLoaded(id) {
-    mojomRegistry.set(id, LoadState.LOADED);
-  }
-
-  function loadMojomIfNecessary(id, url) {
-    if (mojomRegistry.has(id)) {
-      return;
-    }
-
-    markMojomPendingLoad(id);
-    internal.global.document.write('<script type="text/javascript" src="' +
-                                   url + '"></script>');
-  }
-
-  internal.exposeNamespace = exposeNamespace;
-  internal.isMojomPendingLoad = isMojomPendingLoad;
-  internal.isMojomLoaded = isMojomLoaded;
-  internal.markMojomPendingLoad = markMojomPendingLoad;
-  internal.markMojomLoaded = markMojomLoaded;
-  internal.loadMojomIfNecessary = loadMojomIfNecessary;
-})();
diff --git a/mojo/public/js/new_bindings/bindings.js b/mojo/public/js/new_bindings/bindings.js
deleted file mode 100644
index 5b3b66e..0000000
--- a/mojo/public/js/new_bindings/bindings.js
+++ /dev/null
@@ -1,275 +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.
-
-(function() {
-  var internal = mojo.internal;
-  // ---------------------------------------------------------------------------
-
-  function makeRequest(interfacePtr) {
-    var pipe = Mojo.createMessagePipe();
-    interfacePtr.ptr.bind(new mojo.InterfacePtrInfo(pipe.handle0, 0));
-    return new mojo.InterfaceRequest(pipe.handle1);
-  }
-
-  // ---------------------------------------------------------------------------
-
-  // Operations used to setup/configure an interface pointer. Exposed as the
-  // |ptr| field of generated interface pointer classes.
-  // |ptrInfoOrHandle| could be omitted and passed into bind() later.
-  function InterfacePtrController(interfaceType, ptrInfoOrHandle) {
-    this.version = 0;
-
-    this.interfaceType_ = interfaceType;
-    this.router_ = null;
-    this.proxy_ = null;
-
-    // |router_| is lazily initialized. |handle_| is valid between bind() and
-    // the initialization of |router_|.
-    this.handle_ = null;
-    this.controlMessageProxy_ = null;
-
-    if (ptrInfoOrHandle)
-      this.bind(ptrInfoOrHandle);
-  }
-
-  InterfacePtrController.prototype.bind = function(ptrInfoOrHandle) {
-    this.reset();
-
-    if (ptrInfoOrHandle instanceof mojo.InterfacePtrInfo) {
-      this.version = ptrInfoOrHandle.version;
-      this.handle_ = ptrInfoOrHandle.handle;
-    } else {
-      this.handle_ = ptrInfoOrHandle;
-    }
-  };
-
-  InterfacePtrController.prototype.isBound = function() {
-    return this.router_ !== null || this.handle_ !== null;
-  };
-
-  // Although users could just discard the object, reset() closes the pipe
-  // immediately.
-  InterfacePtrController.prototype.reset = function() {
-    this.version = 0;
-    if (this.router_) {
-      this.router_.close();
-      this.router_ = null;
-
-      this.proxy_ = null;
-    }
-    if (this.handle_) {
-      this.handle_.close();
-      this.handle_ = null;
-    }
-  };
-
-  InterfacePtrController.prototype.setConnectionErrorHandler
-      = function(callback) {
-    if (!this.isBound())
-      throw new Error("Cannot set connection error handler if not bound.");
-
-    this.configureProxyIfNecessary_();
-    this.router_.setErrorHandler(callback);
-  };
-
-  InterfacePtrController.prototype.passInterface = function() {
-    var result;
-    if (this.router_) {
-      // TODO(yzshen): Fix Router interface to support extracting handle.
-      result = new mojo.InterfacePtrInfo(
-          this.router_.connector_.handle_, this.version);
-      this.router_.connector_.handle_ = null;
-    } else {
-      // This also handles the case when this object is not bound.
-      result = new mojo.InterfacePtrInfo(this.handle_, this.version);
-      this.handle_ = null;
-    }
-
-    this.reset();
-    return result;
-  };
-
-  InterfacePtrController.prototype.getProxy = function() {
-    this.configureProxyIfNecessary_();
-    return this.proxy_;
-  };
-
-  InterfacePtrController.prototype.enableTestingMode = function() {
-    this.configureProxyIfNecessary_();
-    return this.router_.enableTestingMode();
-  };
-
-  InterfacePtrController.prototype.configureProxyIfNecessary_ = function() {
-    if (!this.handle_)
-      return;
-
-    this.router_ = new internal.Router(this.handle_);
-    this.handle_ = null;
-    this.router_ .setPayloadValidators([this.interfaceType_.validateResponse]);
-
-    this.controlMessageProxy_ = new internal.ControlMessageProxy(this.router_);
-
-    this.proxy_ = new this.interfaceType_.proxyClass(this.router_);
-  };
-
-  InterfacePtrController.prototype.queryVersion = function() {
-    function onQueryVersion(version) {
-      this.version = version;
-      return version;
-    }
-
-    this.configureProxyIfNecessary_();
-    return this.controlMessageProxy_.queryVersion().then(
-      onQueryVersion.bind(this));
-  };
-
-  InterfacePtrController.prototype.requireVersion = function(version) {
-    this.configureProxyIfNecessary_();
-
-    if (this.version >= version) {
-      return;
-    }
-    this.version = version;
-    this.controlMessageProxy_.requireVersion(version);
-  };
-
-  // ---------------------------------------------------------------------------
-
-  // |request| could be omitted and passed into bind() later.
-  //
-  // Example:
-  //
-  //    // FooImpl implements mojom.Foo.
-  //    function FooImpl() { ... }
-  //    FooImpl.prototype.fooMethod1 = function() { ... }
-  //    FooImpl.prototype.fooMethod2 = function() { ... }
-  //
-  //    var fooPtr = new mojom.FooPtr();
-  //    var request = makeRequest(fooPtr);
-  //    var binding = new Binding(mojom.Foo, new FooImpl(), request);
-  //    fooPtr.fooMethod1();
-  function Binding(interfaceType, impl, requestOrHandle) {
-    this.interfaceType_ = interfaceType;
-    this.impl_ = impl;
-    this.router_ = null;
-    this.stub_ = null;
-
-    if (requestOrHandle)
-      this.bind(requestOrHandle);
-  }
-
-  Binding.prototype.isBound = function() {
-    return this.router_ !== null;
-  };
-
-  Binding.prototype.createInterfacePtrAndBind = function() {
-    var ptr = new this.interfaceType_.ptrClass();
-    // TODO(yzshen): Set the version of the interface pointer.
-    this.bind(makeRequest(ptr));
-    return ptr;
-  }
-
-  Binding.prototype.bind = function(requestOrHandle) {
-    this.close();
-
-    var handle = requestOrHandle instanceof mojo.InterfaceRequest ?
-        requestOrHandle.handle : requestOrHandle;
-    if (!(handle instanceof MojoHandle))
-      return;
-
-    this.stub_ = new this.interfaceType_.stubClass(this.impl_);
-    this.router_ = new internal.Router(handle, this.interfaceType_.kVersion);
-    this.router_.setIncomingReceiver(this.stub_);
-    this.router_ .setPayloadValidators([this.interfaceType_.validateRequest]);
-  };
-
-  Binding.prototype.close = function() {
-    if (!this.isBound())
-      return;
-
-    this.router_.close();
-    this.router_ = null;
-    this.stub_ = null;
-  };
-
-  Binding.prototype.setConnectionErrorHandler
-      = function(callback) {
-    if (!this.isBound())
-      throw new Error("Cannot set connection error handler if not bound.");
-    this.router_.setErrorHandler(callback);
-  };
-
-  Binding.prototype.unbind = function() {
-    if (!this.isBound())
-      return new mojo.InterfaceRequest(null);
-
-    var result = new mojo.InterfaceRequest(this.router_.connector_.handle_);
-    this.router_.connector_.handle_ = null;
-    this.close();
-    return result;
-  };
-
-  Binding.prototype.enableTestingMode = function() {
-    return this.router_.enableTestingMode();
-  };
-
-  // ---------------------------------------------------------------------------
-
-  function BindingSetEntry(bindingSet, interfaceType, impl, requestOrHandle,
-                           bindingId) {
-    this.bindingSet_ = bindingSet;
-    this.bindingId_ = bindingId;
-    this.binding_ = new Binding(interfaceType, impl, requestOrHandle);
-
-    this.binding_.setConnectionErrorHandler(function() {
-      this.bindingSet_.onConnectionError(bindingId);
-    }.bind(this));
-  }
-
-  BindingSetEntry.prototype.close = function() {
-    this.binding_.close();
-  };
-
-  function BindingSet(interfaceType) {
-    this.interfaceType_ = interfaceType;
-    this.nextBindingId_ = 0;
-    this.bindings_ = new Map();
-    this.errorHandler_ = null;
-  }
-
-  BindingSet.prototype.isEmpty = function() {
-    return this.bindings_.size == 0;
-  };
-
-  BindingSet.prototype.addBinding = function(impl, requestOrHandle) {
-    this.bindings_.set(
-        this.nextBindingId_,
-        new BindingSetEntry(this, this.interfaceType_, impl, requestOrHandle,
-                            this.nextBindingId_));
-    ++this.nextBindingId_;
-  };
-
-  BindingSet.prototype.closeAllBindings = function() {
-    for (var entry of this.bindings_.values())
-      entry.close();
-    this.bindings_.clear();
-  };
-
-  BindingSet.prototype.setConnectionErrorHandler = function(callback) {
-    this.errorHandler_ = callback;
-  };
-
-  BindingSet.prototype.onConnectionError = function(bindingId) {
-    this.bindings_.delete(bindingId);
-
-    if (this.errorHandler_)
-      this.errorHandler_();
-  };
-
-
-  mojo.makeRequest = makeRequest;
-  mojo.Binding = Binding;
-  mojo.BindingSet = BindingSet;
-  mojo.InterfacePtrController = InterfacePtrController;
-})();
diff --git a/mojo/public/js/new_bindings/buffer.js b/mojo/public/js/new_bindings/buffer.js
deleted file mode 100644
index c44058b..0000000
--- a/mojo/public/js/new_bindings/buffer.js
+++ /dev/null
@@ -1,155 +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.
-
-(function() {
-  var internal = mojo.internal;
-
-  var kHostIsLittleEndian = (function () {
-    var endianArrayBuffer = new ArrayBuffer(2);
-    var endianUint8Array = new Uint8Array(endianArrayBuffer);
-    var endianUint16Array = new Uint16Array(endianArrayBuffer);
-    endianUint16Array[0] = 1;
-    return endianUint8Array[0] == 1;
-  })();
-
-  var kHighWordMultiplier = 0x100000000;
-
-  function Buffer(sizeOrArrayBuffer) {
-    if (sizeOrArrayBuffer instanceof ArrayBuffer)
-      this.arrayBuffer = sizeOrArrayBuffer;
-    else
-      this.arrayBuffer = new ArrayBuffer(sizeOrArrayBuffer);
-
-    this.dataView = new DataView(this.arrayBuffer);
-    this.next = 0;
-  }
-
-  Object.defineProperty(Buffer.prototype, "byteLength", {
-    get: function() { return this.arrayBuffer.byteLength; }
-  });
-
-  Buffer.prototype.alloc = function(size) {
-    var pointer = this.next;
-    this.next += size;
-    if (this.next > this.byteLength) {
-      var newSize = (1.5 * (this.byteLength + size)) | 0;
-      this.grow(newSize);
-    }
-    return pointer;
-  };
-
-  function copyArrayBuffer(dstArrayBuffer, srcArrayBuffer) {
-    (new Uint8Array(dstArrayBuffer)).set(new Uint8Array(srcArrayBuffer));
-  }
-
-  Buffer.prototype.grow = function(size) {
-    var newArrayBuffer = new ArrayBuffer(size);
-    copyArrayBuffer(newArrayBuffer, this.arrayBuffer);
-    this.arrayBuffer = newArrayBuffer;
-    this.dataView = new DataView(this.arrayBuffer);
-  };
-
-  Buffer.prototype.trim = function() {
-    this.arrayBuffer = this.arrayBuffer.slice(0, this.next);
-    this.dataView = new DataView(this.arrayBuffer);
-  };
-
-  Buffer.prototype.getUint8 = function(offset) {
-    return this.dataView.getUint8(offset);
-  }
-  Buffer.prototype.getUint16 = function(offset) {
-    return this.dataView.getUint16(offset, kHostIsLittleEndian);
-  }
-  Buffer.prototype.getUint32 = function(offset) {
-    return this.dataView.getUint32(offset, kHostIsLittleEndian);
-  }
-  Buffer.prototype.getUint64 = function(offset) {
-    var lo, hi;
-    if (kHostIsLittleEndian) {
-      lo = this.dataView.getUint32(offset, kHostIsLittleEndian);
-      hi = this.dataView.getUint32(offset + 4, kHostIsLittleEndian);
-    } else {
-      hi = this.dataView.getUint32(offset, kHostIsLittleEndian);
-      lo = this.dataView.getUint32(offset + 4, kHostIsLittleEndian);
-    }
-    return lo + hi * kHighWordMultiplier;
-  }
-
-  Buffer.prototype.getInt8 = function(offset) {
-    return this.dataView.getInt8(offset);
-  }
-  Buffer.prototype.getInt16 = function(offset) {
-    return this.dataView.getInt16(offset, kHostIsLittleEndian);
-  }
-  Buffer.prototype.getInt32 = function(offset) {
-    return this.dataView.getInt32(offset, kHostIsLittleEndian);
-  }
-  Buffer.prototype.getInt64 = function(offset) {
-    var lo, hi;
-    if (kHostIsLittleEndian) {
-      lo = this.dataView.getUint32(offset, kHostIsLittleEndian);
-      hi = this.dataView.getInt32(offset + 4, kHostIsLittleEndian);
-    } else {
-      hi = this.dataView.getInt32(offset, kHostIsLittleEndian);
-      lo = this.dataView.getUint32(offset + 4, kHostIsLittleEndian);
-    }
-    return lo + hi * kHighWordMultiplier;
-  }
-
-  Buffer.prototype.getFloat32 = function(offset) {
-    return this.dataView.getFloat32(offset, kHostIsLittleEndian);
-  }
-  Buffer.prototype.getFloat64 = function(offset) {
-    return this.dataView.getFloat64(offset, kHostIsLittleEndian);
-  }
-
-  Buffer.prototype.setUint8 = function(offset, value) {
-    this.dataView.setUint8(offset, value);
-  }
-  Buffer.prototype.setUint16 = function(offset, value) {
-    this.dataView.setUint16(offset, value, kHostIsLittleEndian);
-  }
-  Buffer.prototype.setUint32 = function(offset, value) {
-    this.dataView.setUint32(offset, value, kHostIsLittleEndian);
-  }
-  Buffer.prototype.setUint64 = function(offset, value) {
-    var hi = (value / kHighWordMultiplier) | 0;
-    if (kHostIsLittleEndian) {
-      this.dataView.setInt32(offset, value, kHostIsLittleEndian);
-      this.dataView.setInt32(offset + 4, hi, kHostIsLittleEndian);
-    } else {
-      this.dataView.setInt32(offset, hi, kHostIsLittleEndian);
-      this.dataView.setInt32(offset + 4, value, kHostIsLittleEndian);
-    }
-  }
-
-  Buffer.prototype.setInt8 = function(offset, value) {
-    this.dataView.setInt8(offset, value);
-  }
-  Buffer.prototype.setInt16 = function(offset, value) {
-    this.dataView.setInt16(offset, value, kHostIsLittleEndian);
-  }
-  Buffer.prototype.setInt32 = function(offset, value) {
-    this.dataView.setInt32(offset, value, kHostIsLittleEndian);
-  }
-  Buffer.prototype.setInt64 = function(offset, value) {
-    var hi = Math.floor(value / kHighWordMultiplier);
-    if (kHostIsLittleEndian) {
-      this.dataView.setInt32(offset, value, kHostIsLittleEndian);
-      this.dataView.setInt32(offset + 4, hi, kHostIsLittleEndian);
-    } else {
-      this.dataView.setInt32(offset, hi, kHostIsLittleEndian);
-      this.dataView.setInt32(offset + 4, value, kHostIsLittleEndian);
-    }
-  }
-
-  Buffer.prototype.setFloat32 = function(offset, value) {
-    this.dataView.setFloat32(offset, value, kHostIsLittleEndian);
-  }
-  Buffer.prototype.setFloat64 = function(offset, value) {
-    this.dataView.setFloat64(offset, value, kHostIsLittleEndian);
-  }
-
-  internal.Buffer = Buffer;
-})();
diff --git a/mojo/public/js/new_bindings/codec.js b/mojo/public/js/new_bindings/codec.js
deleted file mode 100644
index 339fc16..0000000
--- a/mojo/public/js/new_bindings/codec.js
+++ /dev/null
@@ -1,917 +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.
-
-(function() {
-  var internal = mojo.internal;
-
-  var kErrorUnsigned = "Passing negative value to unsigned";
-  var kErrorArray = "Passing non Array for array type";
-  var kErrorString = "Passing non String for string type";
-  var kErrorMap = "Passing non Map for map type";
-
-  // Memory -------------------------------------------------------------------
-
-  var kAlignment = 8;
-
-  function align(size) {
-    return size + (kAlignment - (size % kAlignment)) % kAlignment;
-  }
-
-  function isAligned(offset) {
-    return offset >= 0 && (offset % kAlignment) === 0;
-  }
-
-  // Constants ----------------------------------------------------------------
-
-  var kArrayHeaderSize = 8;
-  var kStructHeaderSize = 8;
-  var kMessageHeaderSize = 24;
-  var kMessageWithRequestIDHeaderSize = 32;
-  var kMapStructPayloadSize = 16;
-
-  var kStructHeaderNumBytesOffset = 0;
-  var kStructHeaderVersionOffset = 4;
-
-  var kEncodedInvalidHandleValue = 0xFFFFFFFF;
-
-  // Decoder ------------------------------------------------------------------
-
-  function Decoder(buffer, handles, base) {
-    this.buffer = buffer;
-    this.handles = handles;
-    this.base = base;
-    this.next = base;
-  }
-
-  Decoder.prototype.align = function() {
-    this.next = align(this.next);
-  };
-
-  Decoder.prototype.skip = function(offset) {
-    this.next += offset;
-  };
-
-  Decoder.prototype.readInt8 = function() {
-    var result = this.buffer.getInt8(this.next);
-    this.next += 1;
-    return result;
-  };
-
-  Decoder.prototype.readUint8 = function() {
-    var result = this.buffer.getUint8(this.next);
-    this.next += 1;
-    return result;
-  };
-
-  Decoder.prototype.readInt16 = function() {
-    var result = this.buffer.getInt16(this.next);
-    this.next += 2;
-    return result;
-  };
-
-  Decoder.prototype.readUint16 = function() {
-    var result = this.buffer.getUint16(this.next);
-    this.next += 2;
-    return result;
-  };
-
-  Decoder.prototype.readInt32 = function() {
-    var result = this.buffer.getInt32(this.next);
-    this.next += 4;
-    return result;
-  };
-
-  Decoder.prototype.readUint32 = function() {
-    var result = this.buffer.getUint32(this.next);
-    this.next += 4;
-    return result;
-  };
-
-  Decoder.prototype.readInt64 = function() {
-    var result = this.buffer.getInt64(this.next);
-    this.next += 8;
-    return result;
-  };
-
-  Decoder.prototype.readUint64 = function() {
-    var result = this.buffer.getUint64(this.next);
-    this.next += 8;
-    return result;
-  };
-
-  Decoder.prototype.readFloat = function() {
-    var result = this.buffer.getFloat32(this.next);
-    this.next += 4;
-    return result;
-  };
-
-  Decoder.prototype.readDouble = function() {
-    var result = this.buffer.getFloat64(this.next);
-    this.next += 8;
-    return result;
-  };
-
-  Decoder.prototype.decodePointer = function() {
-    // TODO(abarth): To correctly decode a pointer, we need to know the real
-    // base address of the array buffer.
-    var offsetPointer = this.next;
-    var offset = this.readUint64();
-    if (!offset)
-      return 0;
-    return offsetPointer + offset;
-  };
-
-  Decoder.prototype.decodeAndCreateDecoder = function(pointer) {
-    return new Decoder(this.buffer, this.handles, pointer);
-  };
-
-  Decoder.prototype.decodeHandle = function() {
-    return this.handles[this.readUint32()] || null;
-  };
-
-  Decoder.prototype.decodeString = function() {
-    var numberOfBytes = this.readUint32();
-    var numberOfElements = this.readUint32();
-    var base = this.next;
-    this.next += numberOfElements;
-    return internal.decodeUtf8String(
-        new Uint8Array(this.buffer.arrayBuffer, base, numberOfElements));
-  };
-
-  Decoder.prototype.decodeArray = function(cls) {
-    var numberOfBytes = this.readUint32();
-    var numberOfElements = this.readUint32();
-    var val = new Array(numberOfElements);
-    if (cls === PackedBool) {
-      var byte;
-      for (var i = 0; i < numberOfElements; ++i) {
-        if (i % 8 === 0)
-          byte = this.readUint8();
-        val[i] = (byte & (1 << i % 8)) ? true : false;
-      }
-    } else {
-      for (var i = 0; i < numberOfElements; ++i) {
-        val[i] = cls.decode(this);
-      }
-    }
-    return val;
-  };
-
-  Decoder.prototype.decodeStruct = function(cls) {
-    return cls.decode(this);
-  };
-
-  Decoder.prototype.decodeStructPointer = function(cls) {
-    var pointer = this.decodePointer();
-    if (!pointer) {
-      return null;
-    }
-    return cls.decode(this.decodeAndCreateDecoder(pointer));
-  };
-
-  Decoder.prototype.decodeArrayPointer = function(cls) {
-    var pointer = this.decodePointer();
-    if (!pointer) {
-      return null;
-    }
-    return this.decodeAndCreateDecoder(pointer).decodeArray(cls);
-  };
-
-  Decoder.prototype.decodeStringPointer = function() {
-    var pointer = this.decodePointer();
-    if (!pointer) {
-      return null;
-    }
-    return this.decodeAndCreateDecoder(pointer).decodeString();
-  };
-
-  Decoder.prototype.decodeMap = function(keyClass, valueClass) {
-    this.skip(4); // numberOfBytes
-    this.skip(4); // version
-    var keys = this.decodeArrayPointer(keyClass);
-    var values = this.decodeArrayPointer(valueClass);
-    var val = new Map();
-    for (var i = 0; i < keys.length; i++)
-      val.set(keys[i], values[i]);
-    return val;
-  };
-
-  Decoder.prototype.decodeMapPointer = function(keyClass, valueClass) {
-    var pointer = this.decodePointer();
-    if (!pointer) {
-      return null;
-    }
-    var decoder = this.decodeAndCreateDecoder(pointer);
-    return decoder.decodeMap(keyClass, valueClass);
-  };
-
-  // Encoder ------------------------------------------------------------------
-
-  function Encoder(buffer, handles, base) {
-    this.buffer = buffer;
-    this.handles = handles;
-    this.base = base;
-    this.next = base;
-  }
-
-  Encoder.prototype.align = function() {
-    this.next = align(this.next);
-  };
-
-  Encoder.prototype.skip = function(offset) {
-    this.next += offset;
-  };
-
-  Encoder.prototype.writeInt8 = function(val) {
-    this.buffer.setInt8(this.next, val);
-    this.next += 1;
-  };
-
-  Encoder.prototype.writeUint8 = function(val) {
-    if (val < 0) {
-      throw new Error(kErrorUnsigned);
-    }
-    this.buffer.setUint8(this.next, val);
-    this.next += 1;
-  };
-
-  Encoder.prototype.writeInt16 = function(val) {
-    this.buffer.setInt16(this.next, val);
-    this.next += 2;
-  };
-
-  Encoder.prototype.writeUint16 = function(val) {
-    if (val < 0) {
-      throw new Error(kErrorUnsigned);
-    }
-    this.buffer.setUint16(this.next, val);
-    this.next += 2;
-  };
-
-  Encoder.prototype.writeInt32 = function(val) {
-    this.buffer.setInt32(this.next, val);
-    this.next += 4;
-  };
-
-  Encoder.prototype.writeUint32 = function(val) {
-    if (val < 0) {
-      throw new Error(kErrorUnsigned);
-    }
-    this.buffer.setUint32(this.next, val);
-    this.next += 4;
-  };
-
-  Encoder.prototype.writeInt64 = function(val) {
-    this.buffer.setInt64(this.next, val);
-    this.next += 8;
-  };
-
-  Encoder.prototype.writeUint64 = function(val) {
-    if (val < 0) {
-      throw new Error(kErrorUnsigned);
-    }
-    this.buffer.setUint64(this.next, val);
-    this.next += 8;
-  };
-
-  Encoder.prototype.writeFloat = function(val) {
-    this.buffer.setFloat32(this.next, val);
-    this.next += 4;
-  };
-
-  Encoder.prototype.writeDouble = function(val) {
-    this.buffer.setFloat64(this.next, val);
-    this.next += 8;
-  };
-
-  Encoder.prototype.encodePointer = function(pointer) {
-    if (!pointer)
-      return this.writeUint64(0);
-    // TODO(abarth): To correctly encode a pointer, we need to know the real
-    // base address of the array buffer.
-    var offset = pointer - this.next;
-    this.writeUint64(offset);
-  };
-
-  Encoder.prototype.createAndEncodeEncoder = function(size) {
-    var pointer = this.buffer.alloc(align(size));
-    this.encodePointer(pointer);
-    return new Encoder(this.buffer, this.handles, pointer);
-  };
-
-  Encoder.prototype.encodeHandle = function(handle) {
-    if (handle) {
-      this.handles.push(handle);
-      this.writeUint32(this.handles.length - 1);
-    } else {
-      this.writeUint32(kEncodedInvalidHandleValue);
-    }
-  };
-
-  Encoder.prototype.encodeString = function(val) {
-    var base = this.next + kArrayHeaderSize;
-    var numberOfElements = internal.encodeUtf8String(
-        val, new Uint8Array(this.buffer.arrayBuffer, base));
-    var numberOfBytes = kArrayHeaderSize + numberOfElements;
-    this.writeUint32(numberOfBytes);
-    this.writeUint32(numberOfElements);
-    this.next += numberOfElements;
-  };
-
-  Encoder.prototype.encodeArray =
-      function(cls, val, numberOfElements, encodedSize) {
-    if (numberOfElements === undefined)
-      numberOfElements = val.length;
-    if (encodedSize === undefined)
-      encodedSize = kArrayHeaderSize + cls.encodedSize * numberOfElements;
-
-    this.writeUint32(encodedSize);
-    this.writeUint32(numberOfElements);
-
-    if (cls === PackedBool) {
-      var byte = 0;
-      for (i = 0; i < numberOfElements; ++i) {
-        if (val[i])
-          byte |= (1 << i % 8);
-        if (i % 8 === 7 || i == numberOfElements - 1) {
-          Uint8.encode(this, byte);
-          byte = 0;
-        }
-      }
-    } else {
-      for (var i = 0; i < numberOfElements; ++i)
-        cls.encode(this, val[i]);
-    }
-  };
-
-  Encoder.prototype.encodeStruct = function(cls, val) {
-    return cls.encode(this, val);
-  };
-
-  Encoder.prototype.encodeStructPointer = function(cls, val) {
-    if (val == null) {
-      // Also handles undefined, since undefined == null.
-      this.encodePointer(val);
-      return;
-    }
-    var encoder = this.createAndEncodeEncoder(cls.encodedSize);
-    cls.encode(encoder, val);
-  };
-
-  Encoder.prototype.encodeArrayPointer = function(cls, val) {
-    if (val == null) {
-      // Also handles undefined, since undefined == null.
-      this.encodePointer(val);
-      return;
-    }
-
-    var numberOfElements = val.length;
-    if (!Number.isSafeInteger(numberOfElements) || numberOfElements < 0)
-      throw new Error(kErrorArray);
-
-    var encodedSize = kArrayHeaderSize + ((cls === PackedBool) ?
-        Math.ceil(numberOfElements / 8) : cls.encodedSize * numberOfElements);
-    var encoder = this.createAndEncodeEncoder(encodedSize);
-    encoder.encodeArray(cls, val, numberOfElements, encodedSize);
-  };
-
-  Encoder.prototype.encodeStringPointer = function(val) {
-    if (val == null) {
-      // Also handles undefined, since undefined == null.
-      this.encodePointer(val);
-      return;
-    }
-    // Only accepts string primivites, not String Objects like new String("foo")
-    if (typeof(val) !== "string") {
-      throw new Error(kErrorString);
-    }
-    var encodedSize = kArrayHeaderSize + internal.utf8Length(val);
-    var encoder = this.createAndEncodeEncoder(encodedSize);
-    encoder.encodeString(val);
-  };
-
-  Encoder.prototype.encodeMap = function(keyClass, valueClass, val) {
-    var keys = new Array(val.size);
-    var values = new Array(val.size);
-    var i = 0;
-    val.forEach(function(value, key) {
-      values[i] = value;
-      keys[i++] = key;
-    });
-    this.writeUint32(kStructHeaderSize + kMapStructPayloadSize);
-    this.writeUint32(0);  // version
-    this.encodeArrayPointer(keyClass, keys);
-    this.encodeArrayPointer(valueClass, values);
-  }
-
-  Encoder.prototype.encodeMapPointer = function(keyClass, valueClass, val) {
-    if (val == null) {
-      // Also handles undefined, since undefined == null.
-      this.encodePointer(val);
-      return;
-    }
-    if (!(val instanceof Map)) {
-      throw new Error(kErrorMap);
-    }
-    var encodedSize = kStructHeaderSize + kMapStructPayloadSize;
-    var encoder = this.createAndEncodeEncoder(encodedSize);
-    encoder.encodeMap(keyClass, valueClass, val);
-  };
-
-  // Message ------------------------------------------------------------------
-
-  var kMessageInterfaceIdOffset = kStructHeaderSize;
-  var kMessageNameOffset = kMessageInterfaceIdOffset + 4;
-  var kMessageFlagsOffset = kMessageNameOffset + 4;
-  var kMessageRequestIDOffset = kMessageFlagsOffset + 8;
-
-  var kMessageExpectsResponse = 1 << 0;
-  var kMessageIsResponse      = 1 << 1;
-
-  function Message(buffer, handles) {
-    this.buffer = buffer;
-    this.handles = handles;
-  }
-
-  Message.prototype.getHeaderNumBytes = function() {
-    return this.buffer.getUint32(kStructHeaderNumBytesOffset);
-  };
-
-  Message.prototype.getHeaderVersion = function() {
-    return this.buffer.getUint32(kStructHeaderVersionOffset);
-  };
-
-  Message.prototype.getName = function() {
-    return this.buffer.getUint32(kMessageNameOffset);
-  };
-
-  Message.prototype.getFlags = function() {
-    return this.buffer.getUint32(kMessageFlagsOffset);
-  };
-
-  Message.prototype.isResponse = function() {
-    return (this.getFlags() & kMessageIsResponse) != 0;
-  };
-
-  Message.prototype.expectsResponse = function() {
-    return (this.getFlags() & kMessageExpectsResponse) != 0;
-  };
-
-  Message.prototype.setRequestID = function(requestID) {
-    // TODO(darin): Verify that space was reserved for this field!
-    this.buffer.setUint64(kMessageRequestIDOffset, requestID);
-  };
-
-
-  // MessageBuilder -----------------------------------------------------------
-
-  function MessageBuilder(messageName, payloadSize) {
-    // Currently, we don't compute the payload size correctly ahead of time.
-    // Instead, we resize the buffer at the end.
-    var numberOfBytes = kMessageHeaderSize + payloadSize;
-    this.buffer = new internal.Buffer(numberOfBytes);
-    this.handles = [];
-    var encoder = this.createEncoder(kMessageHeaderSize);
-    encoder.writeUint32(kMessageHeaderSize);
-    encoder.writeUint32(0);  // version.
-    encoder.writeUint32(0);  // interface ID.
-    encoder.writeUint32(messageName);
-    encoder.writeUint32(0);  // flags.
-    encoder.writeUint32(0);  // padding.
-  }
-
-  MessageBuilder.prototype.createEncoder = function(size) {
-    var pointer = this.buffer.alloc(size);
-    return new Encoder(this.buffer, this.handles, pointer);
-  };
-
-  MessageBuilder.prototype.encodeStruct = function(cls, val) {
-    cls.encode(this.createEncoder(cls.encodedSize), val);
-  };
-
-  MessageBuilder.prototype.finish = function() {
-    // TODO(abarth): Rather than resizing the buffer at the end, we could
-    // compute the size we need ahead of time, like we do in C++.
-    this.buffer.trim();
-    var message = new Message(this.buffer, this.handles);
-    this.buffer = null;
-    this.handles = null;
-    this.encoder = null;
-    return message;
-  };
-
-  // MessageWithRequestIDBuilder -----------------------------------------------
-
-  function MessageWithRequestIDBuilder(messageName, payloadSize, flags,
-                                       requestID) {
-    // Currently, we don't compute the payload size correctly ahead of time.
-    // Instead, we resize the buffer at the end.
-    var numberOfBytes = kMessageWithRequestIDHeaderSize + payloadSize;
-    this.buffer = new internal.Buffer(numberOfBytes);
-    this.handles = [];
-    var encoder = this.createEncoder(kMessageWithRequestIDHeaderSize);
-    encoder.writeUint32(kMessageWithRequestIDHeaderSize);
-    encoder.writeUint32(1);  // version.
-    encoder.writeUint32(0);  // interface ID.
-    encoder.writeUint32(messageName);
-    encoder.writeUint32(flags);
-    encoder.writeUint32(0);  // padding.
-    encoder.writeUint64(requestID);
-  }
-
-  MessageWithRequestIDBuilder.prototype =
-      Object.create(MessageBuilder.prototype);
-
-  MessageWithRequestIDBuilder.prototype.constructor =
-      MessageWithRequestIDBuilder;
-
-  // MessageReader ------------------------------------------------------------
-
-  function MessageReader(message) {
-    this.decoder = new Decoder(message.buffer, message.handles, 0);
-    var messageHeaderSize = this.decoder.readUint32();
-    this.payloadSize = message.buffer.byteLength - messageHeaderSize;
-    var version = this.decoder.readUint32();
-    var interface_id = this.decoder.readUint32();
-    if (interface_id != 0) {
-      throw new Error("Receiving non-zero interface ID. Associated interfaces " +
-                      "are not yet supported.");
-    }
-    this.messageName = this.decoder.readUint32();
-    this.flags = this.decoder.readUint32();
-    // Skip the padding.
-    this.decoder.skip(4);
-    if (version >= 1)
-      this.requestID = this.decoder.readUint64();
-    this.decoder.skip(messageHeaderSize - this.decoder.next);
-  }
-
-  MessageReader.prototype.decodeStruct = function(cls) {
-    return cls.decode(this.decoder);
-  };
-
-  // Built-in types -----------------------------------------------------------
-
-  // This type is only used with ArrayOf(PackedBool).
-  function PackedBool() {
-  }
-
-  function Int8() {
-  }
-
-  Int8.encodedSize = 1;
-
-  Int8.decode = function(decoder) {
-    return decoder.readInt8();
-  };
-
-  Int8.encode = function(encoder, val) {
-    encoder.writeInt8(val);
-  };
-
-  Uint8.encode = function(encoder, val) {
-    encoder.writeUint8(val);
-  };
-
-  function Uint8() {
-  }
-
-  Uint8.encodedSize = 1;
-
-  Uint8.decode = function(decoder) {
-    return decoder.readUint8();
-  };
-
-  Uint8.encode = function(encoder, val) {
-    encoder.writeUint8(val);
-  };
-
-  function Int16() {
-  }
-
-  Int16.encodedSize = 2;
-
-  Int16.decode = function(decoder) {
-    return decoder.readInt16();
-  };
-
-  Int16.encode = function(encoder, val) {
-    encoder.writeInt16(val);
-  };
-
-  function Uint16() {
-  }
-
-  Uint16.encodedSize = 2;
-
-  Uint16.decode = function(decoder) {
-    return decoder.readUint16();
-  };
-
-  Uint16.encode = function(encoder, val) {
-    encoder.writeUint16(val);
-  };
-
-  function Int32() {
-  }
-
-  Int32.encodedSize = 4;
-
-  Int32.decode = function(decoder) {
-    return decoder.readInt32();
-  };
-
-  Int32.encode = function(encoder, val) {
-    encoder.writeInt32(val);
-  };
-
-  function Uint32() {
-  }
-
-  Uint32.encodedSize = 4;
-
-  Uint32.decode = function(decoder) {
-    return decoder.readUint32();
-  };
-
-  Uint32.encode = function(encoder, val) {
-    encoder.writeUint32(val);
-  };
-
-  function Int64() {
-  }
-
-  Int64.encodedSize = 8;
-
-  Int64.decode = function(decoder) {
-    return decoder.readInt64();
-  };
-
-  Int64.encode = function(encoder, val) {
-    encoder.writeInt64(val);
-  };
-
-  function Uint64() {
-  }
-
-  Uint64.encodedSize = 8;
-
-  Uint64.decode = function(decoder) {
-    return decoder.readUint64();
-  };
-
-  Uint64.encode = function(encoder, val) {
-    encoder.writeUint64(val);
-  };
-
-  function String() {
-  };
-
-  String.encodedSize = 8;
-
-  String.decode = function(decoder) {
-    return decoder.decodeStringPointer();
-  };
-
-  String.encode = function(encoder, val) {
-    encoder.encodeStringPointer(val);
-  };
-
-  function NullableString() {
-  }
-
-  NullableString.encodedSize = String.encodedSize;
-
-  NullableString.decode = String.decode;
-
-  NullableString.encode = String.encode;
-
-  function Float() {
-  }
-
-  Float.encodedSize = 4;
-
-  Float.decode = function(decoder) {
-    return decoder.readFloat();
-  };
-
-  Float.encode = function(encoder, val) {
-    encoder.writeFloat(val);
-  };
-
-  function Double() {
-  }
-
-  Double.encodedSize = 8;
-
-  Double.decode = function(decoder) {
-    return decoder.readDouble();
-  };
-
-  Double.encode = function(encoder, val) {
-    encoder.writeDouble(val);
-  };
-
-  function Enum(cls) {
-    this.cls = cls;
-  }
-
-  Enum.prototype.encodedSize = 4;
-
-  Enum.prototype.decode = function(decoder) {
-    return decoder.readInt32();
-  };
-
-  Enum.prototype.encode = function(encoder, val) {
-    encoder.writeInt32(val);
-  };
-
-  function PointerTo(cls) {
-    this.cls = cls;
-  }
-
-  PointerTo.prototype.encodedSize = 8;
-
-  PointerTo.prototype.decode = function(decoder) {
-    var pointer = decoder.decodePointer();
-    if (!pointer) {
-      return null;
-    }
-    return this.cls.decode(decoder.decodeAndCreateDecoder(pointer));
-  };
-
-  PointerTo.prototype.encode = function(encoder, val) {
-    if (!val) {
-      encoder.encodePointer(val);
-      return;
-    }
-    var objectEncoder = encoder.createAndEncodeEncoder(this.cls.encodedSize);
-    this.cls.encode(objectEncoder, val);
-  };
-
-  function NullablePointerTo(cls) {
-    PointerTo.call(this, cls);
-  }
-
-  NullablePointerTo.prototype = Object.create(PointerTo.prototype);
-
-  function ArrayOf(cls, length) {
-    this.cls = cls;
-    this.length = length || 0;
-  }
-
-  ArrayOf.prototype.encodedSize = 8;
-
-  ArrayOf.prototype.dimensions = function() {
-    return [this.length].concat(
-      (this.cls instanceof ArrayOf) ? this.cls.dimensions() : []);
-  }
-
-  ArrayOf.prototype.decode = function(decoder) {
-    return decoder.decodeArrayPointer(this.cls);
-  };
-
-  ArrayOf.prototype.encode = function(encoder, val) {
-    encoder.encodeArrayPointer(this.cls, val);
-  };
-
-  function NullableArrayOf(cls) {
-    ArrayOf.call(this, cls);
-  }
-
-  NullableArrayOf.prototype = Object.create(ArrayOf.prototype);
-
-  function Handle() {
-  }
-
-  Handle.encodedSize = 4;
-
-  Handle.decode = function(decoder) {
-    return decoder.decodeHandle();
-  };
-
-  Handle.encode = function(encoder, val) {
-    encoder.encodeHandle(val);
-  };
-
-  function NullableHandle() {
-  }
-
-  NullableHandle.encodedSize = Handle.encodedSize;
-
-  NullableHandle.decode = Handle.decode;
-
-  NullableHandle.encode = Handle.encode;
-
-  function Interface(cls) {
-    this.cls = cls;
-  }
-
-  Interface.prototype.encodedSize = 8;
-
-  Interface.prototype.decode = function(decoder) {
-    var interfacePtrInfo = new mojo.InterfacePtrInfo(
-        decoder.decodeHandle(), decoder.readUint32());
-    var interfacePtr = new this.cls();
-    interfacePtr.ptr.bind(interfacePtrInfo);
-    return interfacePtr;
-  };
-
-  Interface.prototype.encode = function(encoder, val) {
-    var interfacePtrInfo =
-        val ? val.ptr.passInterface() : new mojo.InterfacePtrInfo(null, 0);
-    encoder.encodeHandle(interfacePtrInfo.handle);
-    encoder.writeUint32(interfacePtrInfo.version);
-  };
-
-  function NullableInterface(cls) {
-    Interface.call(this, cls);
-  }
-
-  NullableInterface.prototype = Object.create(Interface.prototype);
-
-  function InterfaceRequest() {
-  }
-
-  InterfaceRequest.encodedSize = 4;
-
-  InterfaceRequest.decode = function(decoder) {
-    return new mojo.InterfaceRequest(decoder.decodeHandle());
-  };
-
-  InterfaceRequest.encode = function(encoder, val) {
-    encoder.encodeHandle(val ? val.handle : null);
-  };
-
-  function NullableInterfaceRequest() {
-  }
-
-  NullableInterfaceRequest.encodedSize = InterfaceRequest.encodedSize;
-
-  NullableInterfaceRequest.decode = InterfaceRequest.decode;
-
-  NullableInterfaceRequest.encode = InterfaceRequest.encode;
-
-  function MapOf(keyClass, valueClass) {
-    this.keyClass = keyClass;
-    this.valueClass = valueClass;
-  }
-
-  MapOf.prototype.encodedSize = 8;
-
-  MapOf.prototype.decode = function(decoder) {
-    return decoder.decodeMapPointer(this.keyClass, this.valueClass);
-  };
-
-  MapOf.prototype.encode = function(encoder, val) {
-    encoder.encodeMapPointer(this.keyClass, this.valueClass, val);
-  };
-
-  function NullableMapOf(keyClass, valueClass) {
-    MapOf.call(this, keyClass, valueClass);
-  }
-
-  NullableMapOf.prototype = Object.create(MapOf.prototype);
-
-  internal.align = align;
-  internal.isAligned = isAligned;
-  internal.Message = Message;
-  internal.MessageBuilder = MessageBuilder;
-  internal.MessageWithRequestIDBuilder = MessageWithRequestIDBuilder;
-  internal.MessageReader = MessageReader;
-  internal.kArrayHeaderSize = kArrayHeaderSize;
-  internal.kMapStructPayloadSize = kMapStructPayloadSize;
-  internal.kStructHeaderSize = kStructHeaderSize;
-  internal.kEncodedInvalidHandleValue = kEncodedInvalidHandleValue;
-  internal.kMessageHeaderSize = kMessageHeaderSize;
-  internal.kMessageWithRequestIDHeaderSize = kMessageWithRequestIDHeaderSize;
-  internal.kMessageExpectsResponse = kMessageExpectsResponse;
-  internal.kMessageIsResponse = kMessageIsResponse;
-  internal.Int8 = Int8;
-  internal.Uint8 = Uint8;
-  internal.Int16 = Int16;
-  internal.Uint16 = Uint16;
-  internal.Int32 = Int32;
-  internal.Uint32 = Uint32;
-  internal.Int64 = Int64;
-  internal.Uint64 = Uint64;
-  internal.Float = Float;
-  internal.Double = Double;
-  internal.String = String;
-  internal.Enum = Enum;
-  internal.NullableString = NullableString;
-  internal.PointerTo = PointerTo;
-  internal.NullablePointerTo = NullablePointerTo;
-  internal.ArrayOf = ArrayOf;
-  internal.NullableArrayOf = NullableArrayOf;
-  internal.PackedBool = PackedBool;
-  internal.Handle = Handle;
-  internal.NullableHandle = NullableHandle;
-  internal.Interface = Interface;
-  internal.NullableInterface = NullableInterface;
-  internal.InterfaceRequest = InterfaceRequest;
-  internal.NullableInterfaceRequest = NullableInterfaceRequest;
-  internal.MapOf = MapOf;
-  internal.NullableMapOf = NullableMapOf;
-})();
diff --git a/mojo/public/js/new_bindings/connector.js b/mojo/public/js/new_bindings/connector.js
deleted file mode 100644
index 7fa4822..0000000
--- a/mojo/public/js/new_bindings/connector.js
+++ /dev/null
@@ -1,104 +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.
-
-(function() {
-  var internal = mojo.internal;
-
-  function Connector(handle) {
-    if (!(handle instanceof MojoHandle))
-      throw new Error("Connector: not a handle " + handle);
-    this.handle_ = handle;
-    this.dropWrites_ = false;
-    this.error_ = false;
-    this.incomingReceiver_ = null;
-    this.readWatcher_ = null;
-    this.errorHandler_ = null;
-
-    if (handle) {
-      this.readWatcher_ = handle.watch({readable: true},
-                                       this.readMore_.bind(this));
-    }
-  }
-
-  Connector.prototype.close = function() {
-    if (this.readWatcher_) {
-      this.readWatcher_.cancel();
-      this.readWatcher_ = null;
-    }
-    if (this.handle_ != null) {
-      this.handle_.close();
-      this.handle_ = null;
-    }
-  };
-
-  Connector.prototype.accept = function(message) {
-    if (this.error_)
-      return false;
-
-    if (this.dropWrites_)
-      return true;
-
-    var result = this.handle_.writeMessage(
-        new Uint8Array(message.buffer.arrayBuffer), message.handles);
-    switch (result) {
-      case Mojo.RESULT_OK:
-        // The handles were successfully transferred, so we don't own them
-        // anymore.
-        message.handles = [];
-        break;
-      case Mojo.RESULT_FAILED_PRECONDITION:
-        // There's no point in continuing to write to this pipe since the other
-        // end is gone. Avoid writing any future messages. Hide write failures
-        // from the caller since we'd like them to continue consuming any
-        // backlog of incoming messages before regarding the message pipe as
-        // closed.
-        this.dropWrites_ = true;
-        break;
-      default:
-        // This particular write was rejected, presumably because of bad input.
-        // The pipe is not necessarily in a bad state.
-        return false;
-    }
-    return true;
-  };
-
-  Connector.prototype.setIncomingReceiver = function(receiver) {
-    this.incomingReceiver_ = receiver;
-  };
-
-  Connector.prototype.setErrorHandler = function(handler) {
-    this.errorHandler_ = handler;
-  };
-
-  Connector.prototype.encounteredError = function() {
-    return this.error_;
-  };
-
-  Connector.prototype.waitForNextMessageForTesting = function() {
-    // TODO(yzshen): Change the tests that use this method.
-    throw new Error("Not supported!");
-  };
-
-  Connector.prototype.readMore_ = function(result) {
-    for (;;) {
-      var read = this.handle_.readMessage();
-      if (this.handle_ == null) // The connector has been closed.
-        return;
-      if (read.result == Mojo.RESULT_SHOULD_WAIT)
-        return;
-      if (read.result != Mojo.RESULT_OK) {
-        this.error_ = true;
-        if (this.errorHandler_)
-          this.errorHandler_.onError(read.result);
-        return;
-      }
-      var messageBuffer = new internal.Buffer(read.buffer);
-      var message = new internal.Message(messageBuffer, read.handles);
-      if (this.incomingReceiver_)
-        this.incomingReceiver_.accept(message);
-    }
-  };
-
-  internal.Connector = Connector;
-})();
diff --git a/mojo/public/js/new_bindings/interface_types.js b/mojo/public/js/new_bindings/interface_types.js
deleted file mode 100644
index c52f6c7..0000000
--- a/mojo/public/js/new_bindings/interface_types.js
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-(function() {
-  // ---------------------------------------------------------------------------
-
-  function InterfacePtrInfo(handle, version) {
-    this.handle = handle;
-    this.version = version;
-  }
-
-  InterfacePtrInfo.prototype.isValid = function() {
-    return this.handle instanceof MojoHandle;
-  };
-
-  InterfacePtrInfo.prototype.close = function() {
-    if (!this.isValid())
-      return;
-
-    this.handle.close();
-    this.handle = null;
-    this.version = 0;
-  };
-
-  // ---------------------------------------------------------------------------
-
-  function InterfaceRequest(handle) {
-    this.handle = handle;
-  }
-
-  InterfaceRequest.prototype.isValid = function() {
-    return this.handle instanceof MojoHandle;
-  };
-
-  InterfaceRequest.prototype.close = function() {
-    if (!this.isValid())
-      return;
-
-    this.handle.close();
-    this.handle = null;
-  };
-
-  mojo.InterfacePtrInfo = InterfacePtrInfo;
-  mojo.InterfaceRequest = InterfaceRequest;
-})();
diff --git a/mojo/public/js/new_bindings/lib/control_message_handler.js b/mojo/public/js/new_bindings/lib/control_message_handler.js
deleted file mode 100644
index 3f122fb..0000000
--- a/mojo/public/js/new_bindings/lib/control_message_handler.js
+++ /dev/null
@@ -1,106 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-(function() {
-  var internal = mojo.internal;
-
-  function validateControlRequestWithResponse(message) {
-    var messageValidator = new internal.Validator(message);
-    var error = messageValidator.validateMessageIsRequestExpectingResponse();
-    if (error !== internal.validationError.NONE) {
-      throw error;
-    }
-
-    if (message.getName() != mojo.interface_control2.kRunMessageId) {
-      throw new Error("Control message name is not kRunMessageId");
-    }
-
-    // Validate payload.
-    error = mojo.interface_control2.RunMessageParams.validate(messageValidator,
-        message.getHeaderNumBytes());
-    if (error != internal.validationError.NONE) {
-      throw error;
-    }
-  }
-
-  function validateControlRequestWithoutResponse(message) {
-    var messageValidator = new internal.Validator(message);
-    var error = messageValidator.validateMessageIsRequestWithoutResponse();
-    if (error != internal.validationError.NONE) {
-      throw error;
-    }
-
-    if (message.getName() != mojo.interface_control2.kRunOrClosePipeMessageId) {
-      throw new Error("Control message name is not kRunOrClosePipeMessageId");
-    }
-
-    // Validate payload.
-    error = mojo.interface_control2.RunOrClosePipeMessageParams.validate(
-        messageValidator, message.getHeaderNumBytes());
-    if (error != internal.validationError.NONE) {
-      throw error;
-    }
-  }
-
-  function runOrClosePipe(message, interface_version) {
-    var reader = new internal.MessageReader(message);
-    var runOrClosePipeMessageParams = reader.decodeStruct(
-        mojo.interface_control2.RunOrClosePipeMessageParams);
-    return interface_version >=
-        runOrClosePipeMessageParams.input.require_version.version;
-  }
-
-  function run(message, responder, interface_version) {
-    var reader = new internal.MessageReader(message);
-    var runMessageParams =
-        reader.decodeStruct(mojo.interface_control2.RunMessageParams);
-    var runOutput = null;
-
-    if (runMessageParams.input.query_version) {
-      runOutput = new mojo.interface_control2.RunOutput();
-      runOutput.query_version_result = new
-          mojo.interface_control2.QueryVersionResult(
-              {'version': interface_version});
-    }
-
-    var runResponseMessageParams = new
-        mojo.interface_control2.RunResponseMessageParams();
-    runResponseMessageParams.output = runOutput;
-
-    var messageName = mojo.interface_control2.kRunMessageId;
-    var payloadSize =
-        mojo.interface_control2.RunResponseMessageParams.encodedSize;
-    var requestID = reader.requestID;
-    var builder = new internal.MessageWithRequestIDBuilder(messageName,
-        payloadSize, internal.kMessageIsResponse, requestID);
-    builder.encodeStruct(mojo.interface_control2.RunResponseMessageParams,
-                         runResponseMessageParams);
-    responder.accept(builder.finish());
-    return true;
-  }
-
-  function isInterfaceControlMessage(message) {
-    return message.getName() == mojo.interface_control2.kRunMessageId ||
-           message.getName() ==
-               mojo.interface_control2.kRunOrClosePipeMessageId;
-  }
-
-  function ControlMessageHandler(interface_version) {
-    this.interface_version = interface_version;
-  }
-
-  ControlMessageHandler.prototype.accept = function(message) {
-    validateControlRequestWithoutResponse(message);
-    return runOrClosePipe(message, this.interface_version);
-  };
-
-  ControlMessageHandler.prototype.acceptWithResponder = function(message,
-      responder) {
-    validateControlRequestWithResponse(message);
-    return run(message, responder, this.interface_version);
-  };
-
-  internal.ControlMessageHandler = ControlMessageHandler;
-  internal.isInterfaceControlMessage = isInterfaceControlMessage;
-})();
diff --git a/mojo/public/js/new_bindings/lib/control_message_proxy.js b/mojo/public/js/new_bindings/lib/control_message_proxy.js
deleted file mode 100644
index 1d57557..0000000
--- a/mojo/public/js/new_bindings/lib/control_message_proxy.js
+++ /dev/null
@@ -1,97 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-(function() {
-  var internal = mojo.internal;
-
-  function sendRunOrClosePipeMessage(receiver, runOrClosePipeMessageParams) {
-    var messageName = mojo.interface_control2.kRunOrClosePipeMessageId;
-    var payloadSize =
-        mojo.interface_control2.RunOrClosePipeMessageParams.encodedSize;
-    var builder = new internal.MessageBuilder(messageName, payloadSize);
-    builder.encodeStruct(mojo.interface_control2.RunOrClosePipeMessageParams,
-                         runOrClosePipeMessageParams);
-    var message = builder.finish();
-    receiver.accept(message);
-  }
-
-  function validateControlResponse(message) {
-    var messageValidator = new internal.Validator(message);
-    var error = messageValidator.validateMessageIsResponse();
-    if (error != internal.validationError.NONE) {
-      throw error;
-    }
-
-    if (message.getName() != mojo.interface_control2.kRunMessageId) {
-      throw new Error("Control message name is not kRunMessageId");
-    }
-
-    // Validate payload.
-    error = mojo.interface_control2.RunResponseMessageParams.validate(
-        messageValidator, message.getHeaderNumBytes());
-    if (error != internal.validationError.NONE) {
-      throw error;
-    }
-  }
-
-  function acceptRunResponse(message) {
-    validateControlResponse(message);
-
-    var reader = new internal.MessageReader(message);
-    var runResponseMessageParams = reader.decodeStruct(
-        mojo.interface_control2.RunResponseMessageParams);
-
-    return Promise.resolve(runResponseMessageParams);
-  }
-
- /**
-  * Sends the given run message through the receiver.
-  * Accepts the response message from the receiver and decodes the message
-  * struct to RunResponseMessageParams.
-  *
-  * @param  {Router} receiver.
-  * @param  {RunMessageParams} runMessageParams to be sent via a message.
-  * @return {Promise} that resolves to a RunResponseMessageParams.
-  */
-  function sendRunMessage(receiver, runMessageParams) {
-    var messageName = mojo.interface_control2.kRunMessageId;
-    var payloadSize = mojo.interface_control2.RunMessageParams.encodedSize;
-    // |requestID| is set to 0, but is later properly set by Router.
-    var builder = new internal.MessageWithRequestIDBuilder(messageName,
-        payloadSize, internal.kMessageExpectsResponse, 0);
-    builder.encodeStruct(mojo.interface_control2.RunMessageParams,
-                         runMessageParams);
-    var message = builder.finish();
-
-    return receiver.acceptAndExpectResponse(message).then(acceptRunResponse);
-  }
-
-  function ControlMessageProxy(receiver) {
-    this.receiver = receiver;
-  }
-
-  ControlMessageProxy.prototype.queryVersion = function() {
-    var runMessageParams = new mojo.interface_control2.RunMessageParams();
-    runMessageParams.input = new mojo.interface_control2.RunInput();
-    runMessageParams.input.query_version =
-        new mojo.interface_control2.QueryVersion();
-
-    return sendRunMessage(this.receiver, runMessageParams).then(function(
-        runResponseMessageParams) {
-      return runResponseMessageParams.output.query_version_result.version;
-    });
-  };
-
-  ControlMessageProxy.prototype.requireVersion = function(version) {
-    var runOrClosePipeMessageParams = new
-        mojo.interface_control2.RunOrClosePipeMessageParams();
-    runOrClosePipeMessageParams.input = new
-        mojo.interface_control2.RunOrClosePipeInput();
-    runOrClosePipeMessageParams.input.require_version = new
-        mojo.interface_control2.RequireVersion({'version': version});
-    sendRunOrClosePipeMessage(this.receiver, runOrClosePipeMessageParams);
-  };
-
-  internal.ControlMessageProxy = ControlMessageProxy;
-})();
diff --git a/mojo/public/js/new_bindings/router.js b/mojo/public/js/new_bindings/router.js
deleted file mode 100644
index 1272407..0000000
--- a/mojo/public/js/new_bindings/router.js
+++ /dev/null
@@ -1,190 +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.
-
-(function() {
-  var internal = mojo.internal;
-
-  function Router(handle, interface_version, connectorFactory) {
-    if (!(handle instanceof MojoHandle))
-      throw new Error("Router constructor: Not a handle");
-    if (connectorFactory === undefined)
-      connectorFactory = internal.Connector;
-    this.connector_ = new connectorFactory(handle);
-    this.incomingReceiver_ = null;
-    this.errorHandler_ = null;
-    this.nextRequestID_ = 0;
-    this.completers_ = new Map();
-    this.payloadValidators_ = [];
-    this.testingController_ = null;
-
-    if (interface_version !== undefined) {
-      this.controlMessageHandler_ = new
-          internal.ControlMessageHandler(interface_version);
-    }
-
-    this.connector_.setIncomingReceiver({
-        accept: this.handleIncomingMessage_.bind(this),
-    });
-    this.connector_.setErrorHandler({
-        onError: this.handleConnectionError_.bind(this),
-    });
-  }
-
-  Router.prototype.close = function() {
-    this.completers_.clear();  // Drop any responders.
-    this.connector_.close();
-    this.testingController_ = null;
-  };
-
-  Router.prototype.accept = function(message) {
-    this.connector_.accept(message);
-  };
-
-  Router.prototype.reject = function(message) {
-    // TODO(mpcomplete): no way to trasmit errors over a Connection.
-  };
-
-  Router.prototype.acceptAndExpectResponse = function(message) {
-    // Reserve 0 in case we want it to convey special meaning in the future.
-    var requestID = this.nextRequestID_++;
-    if (requestID == 0)
-      requestID = this.nextRequestID_++;
-
-    message.setRequestID(requestID);
-    var result = this.connector_.accept(message);
-    if (!result)
-      return Promise.reject(Error("Connection error"));
-
-    var completer = {};
-    this.completers_.set(requestID, completer);
-    return new Promise(function(resolve, reject) {
-      completer.resolve = resolve;
-      completer.reject = reject;
-    });
-  };
-
-  Router.prototype.setIncomingReceiver = function(receiver) {
-    this.incomingReceiver_ = receiver;
-  };
-
-  Router.prototype.setPayloadValidators = function(payloadValidators) {
-    this.payloadValidators_ = payloadValidators;
-  };
-
-  Router.prototype.setErrorHandler = function(handler) {
-    this.errorHandler_ = handler;
-  };
-
-  Router.prototype.encounteredError = function() {
-    return this.connector_.encounteredError();
-  };
-
-  Router.prototype.enableTestingMode = function() {
-    this.testingController_ = new RouterTestingController(this.connector_);
-    return this.testingController_;
-  };
-
-  Router.prototype.handleIncomingMessage_ = function(message) {
-    var noError = internal.validationError.NONE;
-    var messageValidator = new internal.Validator(message);
-    var err = messageValidator.validateMessageHeader();
-    for (var i = 0; err === noError && i < this.payloadValidators_.length; ++i)
-      err = this.payloadValidators_[i](messageValidator);
-
-    if (err == noError)
-      this.handleValidIncomingMessage_(message);
-    else
-      this.handleInvalidIncomingMessage_(message, err);
-  };
-
-  Router.prototype.handleValidIncomingMessage_ = function(message) {
-    if (this.testingController_)
-      return;
-
-    if (message.expectsResponse()) {
-      if (internal.isInterfaceControlMessage(message)) {
-        if (this.controlMessageHandler_) {
-          this.controlMessageHandler_.acceptWithResponder(message, this);
-        } else {
-          this.close();
-        }
-      } else if (this.incomingReceiver_) {
-        this.incomingReceiver_.acceptWithResponder(message, this);
-      } else {
-        // If we receive a request expecting a response when the client is not
-        // listening, then we have no choice but to tear down the pipe.
-        this.close();
-      }
-    } else if (message.isResponse()) {
-      var reader = new internal.MessageReader(message);
-      var requestID = reader.requestID;
-      var completer = this.completers_.get(requestID);
-      if (completer) {
-        this.completers_.delete(requestID);
-        completer.resolve(message);
-      } else {
-        console.log("Unexpected response with request ID: " + requestID);
-      }
-    } else {
-      if (internal.isInterfaceControlMessage(message)) {
-        if (this.controlMessageHandler_) {
-          var ok = this.controlMessageHandler_.accept(message);
-          if (ok) return;
-        }
-        this.close();
-      } else if (this.incomingReceiver_) {
-        this.incomingReceiver_.accept(message);
-      }
-    }
-  };
-
-  Router.prototype.handleInvalidIncomingMessage_ = function(message, error) {
-    if (!this.testingController_) {
-      // TODO(yzshen): Consider notifying the embedder.
-      // TODO(yzshen): This should also trigger connection error handler.
-      // Consider making accept() return a boolean and let the connector deal
-      // with this, as the C++ code does.
-      console.log("Invalid message: " + internal.validationError[error]);
-
-      this.close();
-      return;
-    }
-
-    this.testingController_.onInvalidIncomingMessage(error);
-  };
-
-  Router.prototype.handleConnectionError_ = function(result) {
-    this.completers_.forEach(function(value) {
-      value.reject(result);
-    });
-    if (this.errorHandler_)
-      this.errorHandler_();
-    this.close();
-  };
-
-  // The RouterTestingController is used in unit tests. It defeats valid message
-  // handling and delgates invalid message handling.
-
-  function RouterTestingController(connector) {
-    this.connector_ = connector;
-    this.invalidMessageHandler_ = null;
-  }
-
-  RouterTestingController.prototype.waitForNextMessage = function() {
-    this.connector_.waitForNextMessageForTesting();
-  };
-
-  RouterTestingController.prototype.setInvalidIncomingMessageHandler =
-      function(callback) {
-    this.invalidMessageHandler_ = callback;
-  };
-
-  RouterTestingController.prototype.onInvalidIncomingMessage =
-      function(error) {
-    if (this.invalidMessageHandler_)
-      this.invalidMessageHandler_(error);
-  };
-
-  internal.Router = Router;
-})();
diff --git a/mojo/public/js/new_bindings/unicode.js b/mojo/public/js/new_bindings/unicode.js
deleted file mode 100644
index 6ed8839..0000000
--- a/mojo/public/js/new_bindings/unicode.js
+++ /dev/null
@@ -1,51 +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.
-
-/**
- * Defines functions for translating between JavaScript strings and UTF8 strings
- * stored in ArrayBuffers. There is much room for optimization in this code if
- * it proves necessary.
- */
-(function() {
-  var internal = mojo.internal;
-
-  /**
-   * Decodes the UTF8 string from the given buffer.
-   * @param {ArrayBufferView} buffer The buffer containing UTF8 string data.
-   * @return {string} The corresponding JavaScript string.
-   */
-  function decodeUtf8String(buffer) {
-    return decodeURIComponent(escape(String.fromCharCode.apply(null, buffer)));
-  }
-
-  /**
-   * Encodes the given JavaScript string into UTF8.
-   * @param {string} str The string to encode.
-   * @param {ArrayBufferView} outputBuffer The buffer to contain the result.
-   * Should be pre-allocated to hold enough space. Use |utf8Length| to determine
-   * how much space is required.
-   * @return {number} The number of bytes written to |outputBuffer|.
-   */
-  function encodeUtf8String(str, outputBuffer) {
-    var utf8String = unescape(encodeURIComponent(str));
-    if (outputBuffer.length < utf8String.length)
-      throw new Error("Buffer too small for encodeUtf8String");
-    for (var i = 0; i < outputBuffer.length && i < utf8String.length; i++)
-      outputBuffer[i] = utf8String.charCodeAt(i);
-    return i;
-  }
-
-  /**
-   * Returns the number of bytes that a UTF8 encoding of the JavaScript string
-   * |str| would occupy.
-   */
-  function utf8Length(str) {
-    var utf8String = unescape(encodeURIComponent(str));
-    return utf8String.length;
-  }
-
-  internal.decodeUtf8String = decodeUtf8String;
-  internal.encodeUtf8String = encodeUtf8String;
-  internal.utf8Length = utf8Length;
-})();
diff --git a/mojo/public/js/new_bindings/validator.js b/mojo/public/js/new_bindings/validator.js
deleted file mode 100644
index 610112b..0000000
--- a/mojo/public/js/new_bindings/validator.js
+++ /dev/null
@@ -1,511 +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.
-
-(function() {
-  var internal = mojo.internal;
-
-  var validationError = {
-    NONE: 'VALIDATION_ERROR_NONE',
-    MISALIGNED_OBJECT: 'VALIDATION_ERROR_MISALIGNED_OBJECT',
-    ILLEGAL_MEMORY_RANGE: 'VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE',
-    UNEXPECTED_STRUCT_HEADER: 'VALIDATION_ERROR_UNEXPECTED_STRUCT_HEADER',
-    UNEXPECTED_ARRAY_HEADER: 'VALIDATION_ERROR_UNEXPECTED_ARRAY_HEADER',
-    ILLEGAL_HANDLE: 'VALIDATION_ERROR_ILLEGAL_HANDLE',
-    UNEXPECTED_INVALID_HANDLE: 'VALIDATION_ERROR_UNEXPECTED_INVALID_HANDLE',
-    ILLEGAL_POINTER: 'VALIDATION_ERROR_ILLEGAL_POINTER',
-    UNEXPECTED_NULL_POINTER: 'VALIDATION_ERROR_UNEXPECTED_NULL_POINTER',
-    MESSAGE_HEADER_INVALID_FLAGS:
-        'VALIDATION_ERROR_MESSAGE_HEADER_INVALID_FLAGS',
-    MESSAGE_HEADER_MISSING_REQUEST_ID:
-        'VALIDATION_ERROR_MESSAGE_HEADER_MISSING_REQUEST_ID',
-    DIFFERENT_SIZED_ARRAYS_IN_MAP:
-        'VALIDATION_ERROR_DIFFERENT_SIZED_ARRAYS_IN_MAP',
-    INVALID_UNION_SIZE: 'VALIDATION_ERROR_INVALID_UNION_SIZE',
-    UNEXPECTED_NULL_UNION: 'VALIDATION_ERROR_UNEXPECTED_NULL_UNION',
-    UNKNOWN_ENUM_VALUE: 'VALIDATION_ERROR_UNKNOWN_ENUM_VALUE',
-  };
-
-  var NULL_MOJO_POINTER = "NULL_MOJO_POINTER";
-
-  function isEnumClass(cls) {
-    return cls instanceof internal.Enum;
-  }
-
-  function isStringClass(cls) {
-    return cls === internal.String || cls === internal.NullableString;
-  }
-
-  function isHandleClass(cls) {
-    return cls === internal.Handle || cls === internal.NullableHandle;
-  }
-
-  function isInterfaceClass(cls) {
-    return cls instanceof internal.Interface;
-  }
-
-  function isInterfaceRequestClass(cls) {
-    return cls === internal.InterfaceRequest ||
-        cls === internal.NullableInterfaceRequest;
-  }
-
-  function isNullable(type) {
-    return type === internal.NullableString ||
-        type === internal.NullableHandle ||
-        type === internal.NullableInterface ||
-        type === internal.NullableInterfaceRequest ||
-        type instanceof internal.NullableArrayOf ||
-        type instanceof internal.NullablePointerTo;
-  }
-
-  function Validator(message) {
-    this.message = message;
-    this.offset = 0;
-    this.handleIndex = 0;
-  }
-
-  Object.defineProperty(Validator.prototype, "offsetLimit", {
-    get: function() { return this.message.buffer.byteLength; }
-  });
-
-  Object.defineProperty(Validator.prototype, "handleIndexLimit", {
-    get: function() { return this.message.handles.length; }
-  });
-
-  // True if we can safely allocate a block of bytes from start to
-  // to start + numBytes.
-  Validator.prototype.isValidRange = function(start, numBytes) {
-    // Only positive JavaScript integers that are less than 2^53
-    // (Number.MAX_SAFE_INTEGER) can be represented exactly.
-    if (start < this.offset || numBytes <= 0 ||
-        !Number.isSafeInteger(start) ||
-        !Number.isSafeInteger(numBytes))
-      return false;
-
-    var newOffset = start + numBytes;
-    if (!Number.isSafeInteger(newOffset) || newOffset > this.offsetLimit)
-      return false;
-
-    return true;
-  };
-
-  Validator.prototype.claimRange = function(start, numBytes) {
-    if (this.isValidRange(start, numBytes)) {
-      this.offset = start + numBytes;
-      return true;
-    }
-    return false;
-  };
-
-  Validator.prototype.claimHandle = function(index) {
-    if (index === internal.kEncodedInvalidHandleValue)
-      return true;
-
-    if (index < this.handleIndex || index >= this.handleIndexLimit)
-      return false;
-
-    // This is safe because handle indices are uint32.
-    this.handleIndex = index + 1;
-    return true;
-  };
-
-  Validator.prototype.validateEnum = function(offset, enumClass) {
-    // Note: Assumes that enums are always 32 bits! But this matches
-    // mojom::generate::pack::PackedField::GetSizeForKind, so it should be okay.
-    var value = this.message.buffer.getInt32(offset);
-    return enumClass.validate(value);
-  }
-
-  Validator.prototype.validateHandle = function(offset, nullable) {
-    var index = this.message.buffer.getUint32(offset);
-
-    if (index === internal.kEncodedInvalidHandleValue)
-      return nullable ?
-          validationError.NONE : validationError.UNEXPECTED_INVALID_HANDLE;
-
-    if (!this.claimHandle(index))
-      return validationError.ILLEGAL_HANDLE;
-
-    return validationError.NONE;
-  };
-
-  Validator.prototype.validateInterface = function(offset, nullable) {
-    return this.validateHandle(offset, nullable);
-  };
-
-  Validator.prototype.validateInterfaceRequest = function(offset, nullable) {
-    return this.validateHandle(offset, nullable);
-  };
-
-  Validator.prototype.validateStructHeader = function(offset, minNumBytes) {
-    if (!internal.isAligned(offset))
-      return validationError.MISALIGNED_OBJECT;
-
-    if (!this.isValidRange(offset, internal.kStructHeaderSize))
-      return validationError.ILLEGAL_MEMORY_RANGE;
-
-    var numBytes = this.message.buffer.getUint32(offset);
-
-    if (numBytes < minNumBytes)
-      return validationError.UNEXPECTED_STRUCT_HEADER;
-
-    if (!this.claimRange(offset, numBytes))
-      return validationError.ILLEGAL_MEMORY_RANGE;
-
-    return validationError.NONE;
-  };
-
-  Validator.prototype.validateStructVersion = function(offset, versionSizes) {
-    var numBytes = this.message.buffer.getUint32(offset);
-    var version = this.message.buffer.getUint32(offset + 4);
-
-    if (version <= versionSizes[versionSizes.length - 1].version) {
-      // Scan in reverse order to optimize for more recent versionSizes.
-      for (var i = versionSizes.length - 1; i >= 0; --i) {
-        if (version >= versionSizes[i].version) {
-          if (numBytes == versionSizes[i].numBytes)
-            break;
-          return validationError.UNEXPECTED_STRUCT_HEADER;
-        }
-      }
-    } else if (numBytes < versionSizes[versionSizes.length-1].numBytes) {
-      return validationError.UNEXPECTED_STRUCT_HEADER;
-    }
-
-    return validationError.NONE;
-  };
-
-  Validator.prototype.isFieldInStructVersion = function(offset, fieldVersion) {
-    var structVersion = this.message.buffer.getUint32(offset + 4);
-    return fieldVersion <= structVersion;
-  };
-
-  Validator.prototype.validateMessageHeader = function() {
-
-    var err = this.validateStructHeader(0, internal.kMessageHeaderSize);
-    if (err != validationError.NONE)
-      return err;
-
-    var numBytes = this.message.getHeaderNumBytes();
-    var version = this.message.getHeaderVersion();
-
-    var validVersionAndNumBytes =
-        (version == 0 && numBytes == internal.kMessageHeaderSize) ||
-        (version == 1 &&
-         numBytes == internal.kMessageWithRequestIDHeaderSize) ||
-        (version > 1 &&
-         numBytes >= internal.kMessageWithRequestIDHeaderSize);
-    if (!validVersionAndNumBytes)
-      return validationError.UNEXPECTED_STRUCT_HEADER;
-
-    var expectsResponse = this.message.expectsResponse();
-    var isResponse = this.message.isResponse();
-
-    if (version == 0 && (expectsResponse || isResponse))
-      return validationError.MESSAGE_HEADER_MISSING_REQUEST_ID;
-
-    if (isResponse && expectsResponse)
-      return validationError.MESSAGE_HEADER_INVALID_FLAGS;
-
-    return validationError.NONE;
-  };
-
-  Validator.prototype.validateMessageIsRequestWithoutResponse = function() {
-    if (this.message.isResponse() || this.message.expectsResponse()) {
-      return validationError.MESSAGE_HEADER_INVALID_FLAGS;
-    }
-    return validationError.NONE;
-  };
-
-  Validator.prototype.validateMessageIsRequestExpectingResponse = function() {
-    if (this.message.isResponse() || !this.message.expectsResponse()) {
-      return validationError.MESSAGE_HEADER_INVALID_FLAGS;
-    }
-    return validationError.NONE;
-  };
-
-  Validator.prototype.validateMessageIsResponse = function() {
-    if (this.message.expectsResponse() || !this.message.isResponse()) {
-      return validationError.MESSAGE_HEADER_INVALID_FLAGS;
-    }
-    return validationError.NONE;
-  };
-
-  // Returns the message.buffer relative offset this pointer "points to",
-  // NULL_MOJO_POINTER if the pointer represents a null, or JS null if the
-  // pointer's value is not valid.
-  Validator.prototype.decodePointer = function(offset) {
-    var pointerValue = this.message.buffer.getUint64(offset);
-    if (pointerValue === 0)
-      return NULL_MOJO_POINTER;
-    var bufferOffset = offset + pointerValue;
-    return Number.isSafeInteger(bufferOffset) ? bufferOffset : null;
-  };
-
-  Validator.prototype.decodeUnionSize = function(offset) {
-    return this.message.buffer.getUint32(offset);
-  };
-
-  Validator.prototype.decodeUnionTag = function(offset) {
-    return this.message.buffer.getUint32(offset + 4);
-  };
-
-  Validator.prototype.validateArrayPointer = function(
-      offset, elementSize, elementType, nullable, expectedDimensionSizes,
-      currentDimension) {
-    var arrayOffset = this.decodePointer(offset);
-    if (arrayOffset === null)
-      return validationError.ILLEGAL_POINTER;
-
-    if (arrayOffset === NULL_MOJO_POINTER)
-      return nullable ?
-          validationError.NONE : validationError.UNEXPECTED_NULL_POINTER;
-
-    return this.validateArray(arrayOffset, elementSize, elementType,
-                              expectedDimensionSizes, currentDimension);
-  };
-
-  Validator.prototype.validateStructPointer = function(
-      offset, structClass, nullable) {
-    var structOffset = this.decodePointer(offset);
-    if (structOffset === null)
-      return validationError.ILLEGAL_POINTER;
-
-    if (structOffset === NULL_MOJO_POINTER)
-      return nullable ?
-          validationError.NONE : validationError.UNEXPECTED_NULL_POINTER;
-
-    return structClass.validate(this, structOffset);
-  };
-
-  Validator.prototype.validateUnion = function(
-      offset, unionClass, nullable) {
-    var size = this.message.buffer.getUint32(offset);
-    if (size == 0) {
-      return nullable ?
-          validationError.NONE : validationError.UNEXPECTED_NULL_UNION;
-    }
-
-    return unionClass.validate(this, offset);
-  };
-
-  Validator.prototype.validateNestedUnion = function(
-      offset, unionClass, nullable) {
-    var unionOffset = this.decodePointer(offset);
-    if (unionOffset === null)
-      return validationError.ILLEGAL_POINTER;
-
-    if (unionOffset === NULL_MOJO_POINTER)
-      return nullable ?
-          validationError.NONE : validationError.UNEXPECTED_NULL_UNION;
-
-    return this.validateUnion(unionOffset, unionClass, nullable);
-  };
-
-  // This method assumes that the array at arrayPointerOffset has
-  // been validated.
-
-  Validator.prototype.arrayLength = function(arrayPointerOffset) {
-    var arrayOffset = this.decodePointer(arrayPointerOffset);
-    return this.message.buffer.getUint32(arrayOffset + 4);
-  };
-
-  Validator.prototype.validateMapPointer = function(
-      offset, mapIsNullable, keyClass, valueClass, valueIsNullable) {
-    // Validate the implicit map struct:
-    // struct {array<keyClass> keys; array<valueClass> values};
-    var structOffset = this.decodePointer(offset);
-    if (structOffset === null)
-      return validationError.ILLEGAL_POINTER;
-
-    if (structOffset === NULL_MOJO_POINTER)
-      return mapIsNullable ?
-          validationError.NONE : validationError.UNEXPECTED_NULL_POINTER;
-
-    var mapEncodedSize = internal.kStructHeaderSize +
-        internal.kMapStructPayloadSize;
-    var err = this.validateStructHeader(structOffset, mapEncodedSize);
-    if (err !== validationError.NONE)
-        return err;
-
-    // Validate the keys array.
-    var keysArrayPointerOffset = structOffset + internal.kStructHeaderSize;
-    err = this.validateArrayPointer(
-        keysArrayPointerOffset, keyClass.encodedSize, keyClass, false, [0], 0);
-    if (err !== validationError.NONE)
-        return err;
-
-    // Validate the values array.
-    var valuesArrayPointerOffset = keysArrayPointerOffset + 8;
-    var valuesArrayDimensions = [0]; // Validate the actual length below.
-    if (valueClass instanceof internal.ArrayOf)
-      valuesArrayDimensions =
-          valuesArrayDimensions.concat(valueClass.dimensions());
-    var err = this.validateArrayPointer(valuesArrayPointerOffset,
-                                        valueClass.encodedSize,
-                                        valueClass,
-                                        valueIsNullable,
-                                        valuesArrayDimensions,
-                                        0);
-    if (err !== validationError.NONE)
-        return err;
-
-    // Validate the lengths of the keys and values arrays.
-    var keysArrayLength = this.arrayLength(keysArrayPointerOffset);
-    var valuesArrayLength = this.arrayLength(valuesArrayPointerOffset);
-    if (keysArrayLength != valuesArrayLength)
-      return validationError.DIFFERENT_SIZED_ARRAYS_IN_MAP;
-
-    return validationError.NONE;
-  };
-
-  Validator.prototype.validateStringPointer = function(offset, nullable) {
-    return this.validateArrayPointer(
-        offset, internal.Uint8.encodedSize, internal.Uint8, nullable, [0], 0);
-  };
-
-  // Similar to Array_Data<T>::Validate()
-  // mojo/public/cpp/bindings/lib/array_internal.h
-
-  Validator.prototype.validateArray =
-      function (offset, elementSize, elementType, expectedDimensionSizes,
-                currentDimension) {
-    if (!internal.isAligned(offset))
-      return validationError.MISALIGNED_OBJECT;
-
-    if (!this.isValidRange(offset, internal.kArrayHeaderSize))
-      return validationError.ILLEGAL_MEMORY_RANGE;
-
-    var numBytes = this.message.buffer.getUint32(offset);
-    var numElements = this.message.buffer.getUint32(offset + 4);
-
-    // Note: this computation is "safe" because elementSize <= 8 and
-    // numElements is a uint32.
-    var elementsTotalSize = (elementType === internal.PackedBool) ?
-        Math.ceil(numElements / 8) : (elementSize * numElements);
-
-    if (numBytes < internal.kArrayHeaderSize + elementsTotalSize)
-      return validationError.UNEXPECTED_ARRAY_HEADER;
-
-    if (expectedDimensionSizes[currentDimension] != 0 &&
-        numElements != expectedDimensionSizes[currentDimension]) {
-      return validationError.UNEXPECTED_ARRAY_HEADER;
-    }
-
-    if (!this.claimRange(offset, numBytes))
-      return validationError.ILLEGAL_MEMORY_RANGE;
-
-    // Validate the array's elements if they are pointers or handles.
-
-    var elementsOffset = offset + internal.kArrayHeaderSize;
-    var nullable = isNullable(elementType);
-
-    if (isHandleClass(elementType))
-      return this.validateHandleElements(elementsOffset, numElements, nullable);
-    if (isInterfaceClass(elementType))
-      return this.validateInterfaceElements(
-          elementsOffset, numElements, nullable);
-    if (isInterfaceRequestClass(elementType))
-      return this.validateInterfaceRequestElements(
-          elementsOffset, numElements, nullable);
-    if (isStringClass(elementType))
-      return this.validateArrayElements(
-          elementsOffset, numElements, internal.Uint8, nullable, [0], 0);
-    if (elementType instanceof internal.PointerTo)
-      return this.validateStructElements(
-          elementsOffset, numElements, elementType.cls, nullable);
-    if (elementType instanceof internal.ArrayOf)
-      return this.validateArrayElements(
-          elementsOffset, numElements, elementType.cls, nullable,
-          expectedDimensionSizes, currentDimension + 1);
-    if (isEnumClass(elementType))
-      return this.validateEnumElements(elementsOffset, numElements,
-                                       elementType.cls);
-
-    return validationError.NONE;
-  };
-
-  // Note: the |offset + i * elementSize| computation in the validateFooElements
-  // methods below is "safe" because elementSize <= 8, offset and
-  // numElements are uint32, and 0 <= i < numElements.
-
-  Validator.prototype.validateHandleElements =
-      function(offset, numElements, nullable) {
-    var elementSize = internal.Handle.encodedSize;
-    for (var i = 0; i < numElements; i++) {
-      var elementOffset = offset + i * elementSize;
-      var err = this.validateHandle(elementOffset, nullable);
-      if (err != validationError.NONE)
-        return err;
-    }
-    return validationError.NONE;
-  };
-
-  Validator.prototype.validateInterfaceElements =
-      function(offset, numElements, nullable) {
-    var elementSize = internal.Interface.prototype.encodedSize;
-    for (var i = 0; i < numElements; i++) {
-      var elementOffset = offset + i * elementSize;
-      var err = this.validateInterface(elementOffset, nullable);
-      if (err != validationError.NONE)
-        return err;
-    }
-    return validationError.NONE;
-  };
-
-  Validator.prototype.validateInterfaceRequestElements =
-      function(offset, numElements, nullable) {
-    var elementSize = internal.InterfaceRequest.encodedSize;
-    for (var i = 0; i < numElements; i++) {
-      var elementOffset = offset + i * elementSize;
-      var err = this.validateInterfaceRequest(elementOffset, nullable);
-      if (err != validationError.NONE)
-        return err;
-    }
-    return validationError.NONE;
-  };
-
-  // The elementClass parameter is the element type of the element arrays.
-  Validator.prototype.validateArrayElements =
-      function(offset, numElements, elementClass, nullable,
-               expectedDimensionSizes, currentDimension) {
-    var elementSize = internal.PointerTo.prototype.encodedSize;
-    for (var i = 0; i < numElements; i++) {
-      var elementOffset = offset + i * elementSize;
-      var err = this.validateArrayPointer(
-          elementOffset, elementClass.encodedSize, elementClass, nullable,
-          expectedDimensionSizes, currentDimension);
-      if (err != validationError.NONE)
-        return err;
-    }
-    return validationError.NONE;
-  };
-
-  Validator.prototype.validateStructElements =
-      function(offset, numElements, structClass, nullable) {
-    var elementSize = internal.PointerTo.prototype.encodedSize;
-    for (var i = 0; i < numElements; i++) {
-      var elementOffset = offset + i * elementSize;
-      var err =
-          this.validateStructPointer(elementOffset, structClass, nullable);
-      if (err != validationError.NONE)
-        return err;
-    }
-    return validationError.NONE;
-  };
-
-  Validator.prototype.validateEnumElements =
-      function(offset, numElements, enumClass) {
-    var elementSize = internal.Enum.prototype.encodedSize;
-    for (var i = 0; i < numElements; i++) {
-      var elementOffset = offset + i * elementSize;
-      var err = this.validateEnum(elementOffset, enumClass);
-      if (err != validationError.NONE)
-        return err;
-    }
-    return validationError.NONE;
-  };
-
-  internal.validationError = validationError;
-  internal.Validator = Validator;
-})();
diff --git a/mojo/public/js/router.js b/mojo/public/js/router.js
deleted file mode 100644
index 89d9a2f..0000000
--- a/mojo/public/js/router.js
+++ /dev/null
@@ -1,269 +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.
-
-define("mojo/public/js/router", [
-  "mojo/public/js/connector",
-  "mojo/public/js/core",
-  "mojo/public/js/interface_types",
-  "mojo/public/js/lib/interface_endpoint_handle",
-  "mojo/public/js/lib/pipe_control_message_handler",
-  "mojo/public/js/lib/pipe_control_message_proxy",
-  "mojo/public/js/validator",
-  "timer",
-], function(connector, core, types, interfaceEndpointHandle,
-      controlMessageHandler, controlMessageProxy, validator, timer) {
-
-  var Connector = connector.Connector;
-  var PipeControlMessageHandler =
-      controlMessageHandler.PipeControlMessageHandler;
-  var PipeControlMessageProxy = controlMessageProxy.PipeControlMessageProxy;
-  var Validator = validator.Validator;
-  var InterfaceEndpointHandle = interfaceEndpointHandle.InterfaceEndpointHandle;
-
-  /**
-   * The state of |endpoint|. If both the endpoint and its peer have been
-   * closed, removes it from |endpoints_|.
-   * @enum {string}
-   */
-  var EndpointStateUpdateType = {
-    ENDPOINT_CLOSED: 'endpoint_closed',
-    PEER_ENDPOINT_CLOSED: 'peer_endpoint_closed'
-  };
-
-  function check(condition, output) {
-    if (!condition) {
-      // testharness.js does not rethrow errors so the error stack needs to be
-      // included as a string in the error we throw for debugging layout tests.
-      throw new Error((new Error()).stack);
-    }
-  }
-
-  function InterfaceEndpoint(router, interfaceId) {
-    this.router_ = router;
-    this.id = interfaceId;
-    this.closed = false;
-    this.peerClosed = false;
-    this.handleCreated = false;
-    this.disconnectReason = null;
-    this.client = null;
-  }
-
-  InterfaceEndpoint.prototype.sendMessage = function(message) {
-    message.setInterfaceId(this.id);
-    return this.router_.connector_.accept(message);
-  };
-
-  function Router(handle, setInterfaceIdNamespaceBit) {
-    if (!core.isHandle(handle)) {
-      throw new Error("Router constructor: Not a handle");
-    }
-    if (setInterfaceIdNamespaceBit === undefined) {
-      setInterfaceIdNamespaceBit = false;
-    }
-
-    this.connector_ = new Connector(handle);
-
-    this.connector_.setIncomingReceiver({
-        accept: this.accept.bind(this),
-    });
-    this.connector_.setErrorHandler({
-        onError: this.onPipeConnectionError.bind(this),
-    });
-
-    this.setInterfaceIdNamespaceBit_ = setInterfaceIdNamespaceBit;
-    this.controlMessageHandler_ = new PipeControlMessageHandler(this);
-    this.controlMessageProxy_ = new PipeControlMessageProxy(this.connector_);
-    this.nextInterfaceIdValue = 1;
-    this.encounteredError_ = false;
-    this.endpoints_ = new Map();
-  }
-
-  Router.prototype.attachEndpointClient = function(
-      interfaceEndpointHandle, interfaceEndpointClient) {
-    check(types.isValidInterfaceId(interfaceEndpointHandle.id()));
-    check(interfaceEndpointClient);
-
-    var endpoint = this.endpoints_.get(interfaceEndpointHandle.id());
-    check(endpoint);
-    check(!endpoint.client);
-    check(!endpoint.closed);
-    endpoint.client = interfaceEndpointClient;
-
-    if (endpoint.peerClosed) {
-      timer.createOneShot(0,
-          endpoint.client.notifyError.bind(endpoint.client));
-    }
-
-    return endpoint;
-  };
-
-  Router.prototype.detachEndpointClient = function(
-      interfaceEndpointHandle) {
-    check(types.isValidInterfaceId(interfaceEndpointHandle.id()));
-    var endpoint = this.endpoints_.get(interfaceEndpointHandle.id());
-    check(endpoint);
-    check(endpoint.client);
-    check(!endpoint.closed);
-
-    endpoint.client = null;
-  };
-
-  Router.prototype.createLocalEndpointHandle = function(
-      interfaceId) {
-    if (!types.isValidInterfaceId(interfaceId)) {
-      return new InterfaceEndpointHandle();
-    }
-
-    var endpoint = this.endpoints_.get(interfaceId);
-
-    if (!endpoint) {
-      endpoint = new InterfaceEndpoint(this, interfaceId);
-      this.endpoints_.set(interfaceId, endpoint);
-
-      check(!endpoint.handleCreated);
-
-      if (this.encounteredError_) {
-        this.updateEndpointStateMayRemove(endpoint,
-            EndpointStateUpdateType.PEER_ENDPOINT_CLOSED);
-      }
-    } else {
-      // If the endpoint already exist, it is because we have received a
-      // notification that the peer endpoint has closed.
-      check(!endpoint.closed);
-      check(endpoint.peerClosed);
-
-      if (endpoint.handleCreated) {
-        return new InterfaceEndpointHandle();
-      }
-    }
-
-    endpoint.handleCreated = true;
-    return new InterfaceEndpointHandle(interfaceId, this);
-  };
-
-  Router.prototype.accept = function(message) {
-    var messageValidator = new Validator(message);
-    var err = messageValidator.validateMessageHeader();
-
-    var ok = false;
-    if (err !== validator.validationError.NONE) {
-      validator.reportValidationError(err);
-    } else if (controlMessageHandler.isPipeControlMessage(message)) {
-      ok = this.controlMessageHandler_.accept(message);
-    } else {
-      var interfaceId = message.getInterfaceId();
-      var endpoint = this.endpoints_.get(interfaceId);
-      if (!endpoint || endpoint.closed) {
-        return true;
-      }
-
-      if (!endpoint.client) {
-        // We need to wait until a client is attached in order to dispatch
-        // further messages.
-        return false;
-      }
-      ok = endpoint.client.handleIncomingMessage_(message);
-    }
-
-    if (!ok) {
-      this.handleInvalidIncomingMessage_();
-    }
-    return ok;
-  };
-
-  Router.prototype.close = function() {
-    this.connector_.close();
-    // Closing the message pipe won't trigger connection error handler.
-    // Explicitly call onPipeConnectionError() so that associated endpoints
-    // will get notified.
-    this.onPipeConnectionError();
-  };
-
-  Router.prototype.waitForNextMessageForTesting = function() {
-    this.connector_.waitForNextMessageForTesting();
-  };
-
-  Router.prototype.handleInvalidIncomingMessage_ = function(message) {
-    if (!validator.isTestingMode()) {
-      // TODO(yzshen): Consider notifying the embedder.
-      // TODO(yzshen): This should also trigger connection error handler.
-      // Consider making accept() return a boolean and let the connector deal
-      // with this, as the C++ code does.
-      this.close();
-      return;
-    }
-  };
-
-  Router.prototype.onPeerAssociatedEndpointClosed = function(interfaceId,
-      reason) {
-    check(!types.isMasterInterfaceId(interfaceId) || reason);
-
-    var endpoint = this.endpoints_.get(interfaceId);
-    if (!endpoint) {
-      endpoint = new InterfaceEndpoint(this, interfaceId);
-      this.endpoints_.set(interfaceId, endpoint);
-    }
-
-    if (reason) {
-      endpoint.disconnectReason = reason;
-    }
-
-    if (!endpoint.peerClosed) {
-      if (endpoint.client) {
-        timer.createOneShot(0,
-            endpoint.client.notifyError.bind(endpoint.client, reason));
-      }
-      this.updateEndpointStateMayRemove(endpoint,
-          EndpointStateUpdateType.PEER_ENDPOINT_CLOSED);
-    }
-    return true;
-  };
-
-  Router.prototype.onPipeConnectionError = function() {
-    this.encounteredError_ = true;
-
-    for (var endpoint of this.endpoints_.values()) {
-      if (endpoint.client) {
-        timer.createOneShot(0,
-            endpoint.client.notifyError.bind(endpoint.client,
-              endpoint.disconnectReason));
-      }
-      this.updateEndpointStateMayRemove(endpoint,
-          EndpointStateUpdateType.PEER_ENDPOINT_CLOSED);
-    }
-  };
-
-  Router.prototype.closeEndpointHandle = function(interfaceId, reason) {
-    if (!types.isValidInterfaceId(interfaceId)) {
-      return;
-    }
-    var endpoint = this.endpoints_.get(interfaceId);
-    check(endpoint);
-    check(!endpoint.client);
-    check(!endpoint.closed);
-
-    this.updateEndpointStateMayRemove(endpoint,
-        EndpointStateUpdateType.ENDPOINT_CLOSED);
-
-    if (!types.isMasterInterfaceId(interfaceId) || reason) {
-      this.controlMessageProxy_.notifyPeerEndpointClosed(interfaceId, reason);
-    }
-  };
-
-  Router.prototype.updateEndpointStateMayRemove = function(endpoint,
-      endpointStateUpdateType) {
-    if (endpointStateUpdateType === EndpointStateUpdateType.ENDPOINT_CLOSED) {
-      endpoint.closed = true;
-    } else {
-      endpoint.peerClosed = true;
-    }
-    if (endpoint.closed && endpoint.peerClosed) {
-      this.endpoints_.delete(endpoint.id);
-    }
-  };
-
-  var exports = {};
-  exports.Router = Router;
-  return exports;
-});
diff --git a/mojo/public/js/support.js b/mojo/public/js/support.js
deleted file mode 100644
index 7e27504..0000000
--- a/mojo/public/js/support.js
+++ /dev/null
@@ -1,53 +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.
-
-// Module "mojo/public/js/support"
-//
-// Note: This file is for documentation purposes only. The code here is not
-// actually executed. The real module is implemented natively in Mojo.
-
-while (1);
-
-/* @deprecated Please use watch()/cancelWatch() instead of
- *     asyncWait()/cancelWait().
- *
- * Waits on the given handle until the state indicated by |signals| is
- * satisfied.
- *
- * @param {MojoHandle} handle The handle to wait on.
- * @param {MojoHandleSignals} signals Specifies the condition to wait for.
- * @param {function (mojoResult)} callback Called with the result the wait is
- *     complete. See MojoWait for possible result codes.
- *
- * @return {MojoWaitId} A waitId that can be passed to cancelWait to cancel the
- *     wait.
- */
-function asyncWait(handle, signals, callback) { [native code] }
-
-/* @deprecated Please use watch()/cancelWatch() instead of
- *     asyncWait()/cancelWait().
- *
- * Cancels the asyncWait operation specified by the given |waitId|.
- *
- * @param {MojoWaitId} waitId The waitId returned by asyncWait.
- */
-function cancelWait(waitId) { [native code] }
-
-/* Begins watching a handle for |signals| to be satisfied or unsatisfiable.
- *
-  * @param {MojoHandle} handle The handle to watch.
-  * @param {MojoHandleSignals} signals The signals to watch.
-  * @param {function (mojoResult)} calback Called with a result any time
-  *     the watched signals become satisfied or unsatisfiable.
-  *
-  * @param {MojoWatchId} watchId An opaque identifier that identifies this
-  *     watch.
-  */
-function watch(handle, signals, callback) { [native code] }
-
-/* Cancels a handle watch initiated by watch().
- *
- * @param {MojoWatchId} watchId The watch identifier returned by watch().
- */
-function cancelWatch(watchId) { [native code] }
diff --git a/mojo/public/js/tests/core_unittest.js b/mojo/public/js/tests/core_unittest.js
deleted file mode 100644
index 86a997f..0000000
--- a/mojo/public/js/tests/core_unittest.js
+++ /dev/null
@@ -1,223 +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.
-
-define([
-    "gin/test/expect",
-    "mojo/public/js/core",
-    "gc",
-  ], function(expect, core, gc) {
-
-  var HANDLE_SIGNAL_READWRITABLE = core.HANDLE_SIGNAL_WRITABLE |
-                                   core.HANDLE_SIGNAL_READABLE;
-  var HANDLE_SIGNAL_ALL = core.HANDLE_SIGNAL_WRITABLE |
-                          core.HANDLE_SIGNAL_READABLE |
-                          core.HANDLE_SIGNAL_PEER_CLOSED;
-
-  runWithMessagePipe(testNop);
-  runWithMessagePipe(testReadAndWriteMessage);
-  runWithMessagePipeWithOptions(testNop);
-  runWithMessagePipeWithOptions(testReadAndWriteMessage);
-  runWithDataPipe(testNop);
-  runWithDataPipe(testReadAndWriteDataPipe);
-  runWithDataPipeWithOptions(testNop);
-  runWithDataPipeWithOptions(testReadAndWriteDataPipe);
-  runWithMessagePipe(testIsHandleMessagePipe);
-  runWithDataPipe(testIsHandleDataPipe);
-  runWithSharedBuffer(testSharedBuffer);
-  gc.collectGarbage();  // should not crash
-  this.result = "PASS";
-
-  function runWithMessagePipe(test) {
-    var pipe = core.createMessagePipe();
-    expect(pipe.result).toBe(core.RESULT_OK);
-
-    test(pipe);
-
-    expect(core.close(pipe.handle0)).toBe(core.RESULT_OK);
-    expect(core.close(pipe.handle1)).toBe(core.RESULT_OK);
-  }
-
-  function runWithMessagePipeWithOptions(test) {
-    var pipe = core.createMessagePipe({
-        flags: core.CREATE_MESSAGE_PIPE_OPTIONS_FLAG_NONE
-    });
-    expect(pipe.result).toBe(core.RESULT_OK);
-
-    test(pipe);
-
-    expect(core.close(pipe.handle0)).toBe(core.RESULT_OK);
-    expect(core.close(pipe.handle1)).toBe(core.RESULT_OK);
-  }
-
-  function runWithDataPipe(test) {
-    var pipe = core.createDataPipe();
-    expect(pipe.result).toBe(core.RESULT_OK);
-
-    test(pipe);
-
-    expect(core.close(pipe.producerHandle)).toBe(core.RESULT_OK);
-    expect(core.close(pipe.consumerHandle)).toBe(core.RESULT_OK);
-  }
-
-  function runWithDataPipeWithOptions(test) {
-    var pipe = core.createDataPipe({
-        flags: core.CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,
-        elementNumBytes: 1,
-        capacityNumBytes: 64
-        });
-    expect(pipe.result).toBe(core.RESULT_OK);
-
-    test(pipe);
-
-    expect(core.close(pipe.producerHandle)).toBe(core.RESULT_OK);
-    expect(core.close(pipe.consumerHandle)).toBe(core.RESULT_OK);
-  }
-
-  function runWithSharedBuffer(test) {
-    let buffer_size = 32;
-    let sharedBuffer = core.createSharedBuffer(buffer_size,
-        core.CREATE_SHARED_BUFFER_OPTIONS_FLAG_NONE);
-
-    expect(sharedBuffer.result).toBe(core.RESULT_OK);
-    expect(core.isHandle(sharedBuffer.handle)).toBeTruthy();
-
-    test(sharedBuffer, buffer_size);
-  }
-
-  function testNop(pipe) {
-  }
-
-  function testReadAndWriteMessage(pipe) {
-    var state0 = core.queryHandleSignalsState(pipe.handle0);
-    expect(state0.result).toBe(core.RESULT_OK);
-    expect(state0.satisfiedSignals).toBe(core.HANDLE_SIGNAL_WRITABLE);
-    expect(state0.satisfiableSignals).toBe(HANDLE_SIGNAL_ALL);
-
-    var state1 = core.queryHandleSignalsState(pipe.handle1);
-    expect(state1.result).toBe(core.RESULT_OK);
-    expect(state1.satisfiedSignals).toBe(core.HANDLE_SIGNAL_WRITABLE);
-    expect(state1.satisfiableSignals).toBe(HANDLE_SIGNAL_ALL);
-
-    var senderData = new Uint8Array(42);
-    for (var i = 0; i < senderData.length; ++i) {
-      senderData[i] = i * i;
-    }
-
-    var result = core.writeMessage(
-      pipe.handle0, senderData, [],
-      core.WRITE_MESSAGE_FLAG_NONE);
-
-    expect(result).toBe(core.RESULT_OK);
-
-    state0 = core.queryHandleSignalsState(pipe.handle0);
-    expect(state0.result).toBe(core.RESULT_OK);
-    expect(state0.satisfiedSignals).toBe(core.HANDLE_SIGNAL_WRITABLE);
-    expect(state0.satisfiableSignals).toBe(HANDLE_SIGNAL_ALL);
-
-    var wait = core.wait(pipe.handle1, core.HANDLE_SIGNAL_READABLE);
-    expect(wait.result).toBe(core.RESULT_OK);
-    expect(wait.signalsState.satisfiedSignals).toBe(HANDLE_SIGNAL_READWRITABLE);
-    expect(wait.signalsState.satisfiableSignals).toBe(HANDLE_SIGNAL_ALL);
-
-    var read = core.readMessage(pipe.handle1, core.READ_MESSAGE_FLAG_NONE);
-
-    expect(read.result).toBe(core.RESULT_OK);
-    expect(read.buffer.byteLength).toBe(42);
-    expect(read.handles.length).toBe(0);
-
-    var memory = new Uint8Array(read.buffer);
-    for (var i = 0; i < memory.length; ++i)
-      expect(memory[i]).toBe((i * i) & 0xFF);
-  }
-
-  function testReadAndWriteDataPipe(pipe) {
-    var senderData = new Uint8Array(42);
-    for (var i = 0; i < senderData.length; ++i) {
-      senderData[i] = i * i;
-    }
-
-    var write = core.writeData(
-      pipe.producerHandle, senderData,
-      core.WRITE_DATA_FLAG_ALL_OR_NONE);
-
-    expect(write.result).toBe(core.RESULT_OK);
-    expect(write.numBytes).toBe(42);
-
-    var wait = core.wait(pipe.consumerHandle, core.HANDLE_SIGNAL_READABLE);
-    expect(wait.result).toBe(core.RESULT_OK);
-    var peeked = core.readData(
-         pipe.consumerHandle,
-         core.READ_DATA_FLAG_PEEK | core.READ_DATA_FLAG_ALL_OR_NONE);
-    expect(peeked.result).toBe(core.RESULT_OK);
-    expect(peeked.buffer.byteLength).toBe(42);
-
-    var peeked_memory = new Uint8Array(peeked.buffer);
-    for (var i = 0; i < peeked_memory.length; ++i)
-      expect(peeked_memory[i]).toBe((i * i) & 0xFF);
-
-    var read = core.readData(
-      pipe.consumerHandle, core.READ_DATA_FLAG_ALL_OR_NONE);
-
-    expect(read.result).toBe(core.RESULT_OK);
-    expect(read.buffer.byteLength).toBe(42);
-
-    var memory = new Uint8Array(read.buffer);
-    for (var i = 0; i < memory.length; ++i)
-      expect(memory[i]).toBe((i * i) & 0xFF);
-  }
-
-  function testIsHandleMessagePipe(pipe) {
-    expect(core.isHandle(123).toBeFalsy);
-    expect(core.isHandle("123").toBeFalsy);
-    expect(core.isHandle({}).toBeFalsy);
-    expect(core.isHandle([]).toBeFalsy);
-    expect(core.isHandle(undefined).toBeFalsy);
-    expect(core.isHandle(pipe).toBeFalsy);
-    expect(core.isHandle(pipe.handle0)).toBeTruthy();
-    expect(core.isHandle(pipe.handle1)).toBeTruthy();
-    expect(core.isHandle(null)).toBeTruthy();
-  }
-
-  function testIsHandleDataPipe(pipe) {
-    expect(core.isHandle(pipe.consumerHandle)).toBeTruthy();
-    expect(core.isHandle(pipe.producerHandle)).toBeTruthy();
-  }
-
-  function testSharedBuffer(sharedBuffer, buffer_size) {
-    let offset = 0;
-    let mappedBuffer0 = core.mapBuffer(sharedBuffer.handle,
-                                       offset,
-                                       buffer_size,
-                                       core.MAP_BUFFER_FLAG_NONE);
-
-    expect(mappedBuffer0.result).toBe(core.RESULT_OK);
-
-    let dupedBufferHandle = core.duplicateBufferHandle(sharedBuffer.handle,
-        core.DUPLICATE_BUFFER_HANDLE_OPTIONS_FLAG_NONE);
-
-    expect(dupedBufferHandle.result).toBe(core.RESULT_OK);
-    expect(core.isHandle(dupedBufferHandle.handle)).toBeTruthy();
-
-    let mappedBuffer1 = core.mapBuffer(dupedBufferHandle.handle,
-                                       offset,
-                                       buffer_size,
-                                       core.MAP_BUFFER_FLAG_NONE);
-
-    expect(mappedBuffer1.result).toBe(core.RESULT_OK);
-
-    let buffer0 = new Uint8Array(mappedBuffer0.buffer);
-    let buffer1 = new Uint8Array(mappedBuffer1.buffer);
-    for(let i = 0; i < buffer0.length; ++i) {
-      buffer0[i] = i;
-      expect(buffer1[i]).toBe(i);
-    }
-
-    expect(core.unmapBuffer(mappedBuffer0.buffer)).toBe(core.RESULT_OK);
-    expect(core.unmapBuffer(mappedBuffer1.buffer)).toBe(core.RESULT_OK);
-
-    expect(core.close(dupedBufferHandle.handle)).toBe(core.RESULT_OK);
-    expect(core.close(sharedBuffer.handle)).toBe(core.RESULT_OK);
-  }
-
-});
diff --git a/mojo/public/js/tests/validation_test_input_parser.js b/mojo/public/js/tests/validation_test_input_parser.js
deleted file mode 100644
index f5a57f9..0000000
--- a/mojo/public/js/tests/validation_test_input_parser.js
+++ /dev/null
@@ -1,299 +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.
-
-// Support for parsing binary sequences encoded as readable strings
-// or ".data" files. The input format is described here:
-// mojo/public/cpp/bindings/tests/validation_test_input_parser.h
-
-define([
-    "mojo/public/js/buffer"
-  ], function(buffer) {
-
-  // Files and Lines represent the raw text from an input string
-  // or ".data" file.
-
-  function InputError(message, line) {
-    this.message = message;
-    this.line = line;
-  }
-
-  InputError.prototype.toString = function() {
-    var s = 'Error: ' + this.message;
-    if (this.line)
-      s += ', at line ' +
-           (this.line.number + 1) + ': "' + this.line.contents + '"';
-    return s;
-  }
-
-  function File(contents) {
-    this.contents = contents;
-    this.index = 0;
-    this.lineNumber = 0;
-  }
-
-  File.prototype.endReached = function() {
-    return this.index >= this.contents.length;
-  }
-
-  File.prototype.nextLine = function() {
-    if (this.endReached())
-      return null;
-    var start = this.index;
-    var end = this.contents.indexOf('\n', start);
-    if (end == -1)
-      end = this.contents.length;
-    this.index = end + 1;
-    return new Line(this.contents.substring(start, end), this.lineNumber++);
-  }
-
-  function Line(contents, number) {
-    var i = contents.indexOf('//');
-    var s = (i == -1) ? contents.trim() : contents.substring(0, i).trim();
-    this.contents = contents;
-    this.items = (s.length > 0) ? s.split(/\s+/) : [];
-    this.index = 0;
-    this.number = number;
-  }
-
-  Line.prototype.endReached = function() {
-    return this.index >= this.items.length;
-  }
-
-  var ITEM_TYPE_SIZES = {
-    u1: 1, u2: 2, u4: 4, u8: 8, s1: 1, s2: 2, s4: 4, s8: 8, b: 1, f: 4, d: 8,
-    dist4: 4, dist8: 8, anchr: 0, handles: 0
-  };
-
-  function isValidItemType(type) {
-    return ITEM_TYPE_SIZES[type] !== undefined;
-  }
-
-  Line.prototype.nextItem = function() {
-    if (this.endReached())
-      return null;
-
-    var itemString = this.items[this.index++];
-    var type = 'u1';
-    var value = itemString;
-
-    if (itemString.charAt(0) == '[') {
-      var i = itemString.indexOf(']');
-      if (i != -1 && i + 1 < itemString.length) {
-        type = itemString.substring(1, i);
-        value = itemString.substring(i + 1);
-      } else {
-        throw new InputError('invalid item', this);
-      }
-    }
-    if (!isValidItemType(type))
-      throw new InputError('invalid item type', this);
-
-    return new Item(this, type, value);
-  }
-
-  // The text for each whitespace delimited binary data "item" is represented
-  // by an Item.
-
-  function Item(line, type, value) {
-    this.line = line;
-    this.type = type;
-    this.value = value;
-    this.size = ITEM_TYPE_SIZES[type];
-  }
-
-  Item.prototype.isFloat = function() {
-    return this.type == 'f' || this.type == 'd';
-  }
-
-  Item.prototype.isInteger = function() {
-    return ['u1', 'u2', 'u4', 'u8',
-            's1', 's2', 's4', 's8'].indexOf(this.type) != -1;
-  }
-
-  Item.prototype.isNumber = function() {
-    return this.isFloat() || this.isInteger();
-  }
-
-  Item.prototype.isByte = function() {
-    return this.type == 'b';
-  }
-
-  Item.prototype.isDistance = function() {
-    return this.type == 'dist4' || this.type == 'dist8';
-  }
-
-  Item.prototype.isAnchor = function() {
-    return this.type == 'anchr';
-  }
-
-  Item.prototype.isHandles = function() {
-    return this.type == 'handles';
-  }
-
-  // A TestMessage represents the complete binary message loaded from an input
-  // string or ".data" file. The parseTestMessage() function below constructs
-  // a TestMessage from a File.
-
-  function TestMessage(byteLength) {
-    this.index = 0;
-    this.buffer = new buffer.Buffer(byteLength);
-    this.distances = {};
-    this.handleCount = 0;
-  }
-
-  function checkItemNumberValue(item, n, min, max) {
-    if (n < min || n > max)
-      throw new InputError('invalid item value', item.line);
-  }
-
-  TestMessage.prototype.addNumber = function(item) {
-    var n = item.isInteger() ? parseInt(item.value) : parseFloat(item.value);
-    if (Number.isNaN(n))
-      throw new InputError("can't parse item value", item.line);
-
-    switch(item.type) {
-      case 'u1':
-        checkItemNumberValue(item, n, 0, 0xFF);
-        this.buffer.setUint8(this.index, n);
-        break;
-      case 'u2':
-        checkItemNumberValue(item, n, 0, 0xFFFF);
-        this.buffer.setUint16(this.index, n);
-        break;
-      case 'u4':
-        checkItemNumberValue(item, n, 0, 0xFFFFFFFF);
-        this.buffer.setUint32(this.index, n);
-        break;
-      case 'u8':
-        checkItemNumberValue(item, n, 0, Number.MAX_SAFE_INTEGER);
-        this.buffer.setUint64(this.index, n);
-        break;
-      case 's1':
-        checkItemNumberValue(item, n, -128, 127);
-        this.buffer.setInt8(this.index, n);
-        break;
-      case 's2':
-        checkItemNumberValue(item, n, -32768, 32767);
-        this.buffer.setInt16(this.index, n);
-        break;
-      case 's4':
-        checkItemNumberValue(item, n, -2147483648, 2147483647);
-        this.buffer.setInt32(this.index, n);
-        break;
-      case 's8':
-        checkItemNumberValue(item, n,
-                             Number.MIN_SAFE_INTEGER,
-                             Number.MAX_SAFE_INTEGER);
-        this.buffer.setInt64(this.index, n);
-        break;
-      case 'f':
-        this.buffer.setFloat32(this.index, n);
-        break;
-      case 'd':
-        this.buffer.setFloat64(this.index, n);
-        break;
-
-      default:
-        throw new InputError('unrecognized item type', item.line);
-      }
-  }
-
-  TestMessage.prototype.addByte = function(item) {
-    if (!/^[01]{8}$/.test(item.value))
-      throw new InputError('invalid byte item value', item.line);
-    function b(i) {
-      return (item.value.charAt(7 - i) == '1') ? 1 << i : 0;
-    }
-    var n = b(0) | b(1) | b(2) | b(3) | b(4) | b(5) | b(6) | b(7);
-    this.buffer.setUint8(this.index, n);
-  }
-
-  TestMessage.prototype.addDistance = function(item) {
-    if (this.distances[item.value])
-      throw new InputError('duplicate distance item', item.line);
-    this.distances[item.value] = {index: this.index, item: item};
-  }
-
-  TestMessage.prototype.addAnchor = function(item) {
-    var dist = this.distances[item.value];
-    if (!dist)
-      throw new InputError('unmatched anchor item', item.line);
-    delete this.distances[item.value];
-
-    var n = this.index - dist.index;
-    // TODO(hansmuller): validate n
-
-    if (dist.item.type == 'dist4')
-      this.buffer.setUint32(dist.index, n);
-    else if (dist.item.type == 'dist8')
-      this.buffer.setUint64(dist.index, n);
-    else
-      throw new InputError('unrecognzed distance item type', dist.item.line);
-  }
-
-  TestMessage.prototype.addHandles = function(item) {
-    this.handleCount = parseInt(item.value);
-    if (Number.isNaN(this.handleCount))
-      throw new InputError("can't parse handleCount", item.line);
-  }
-
-  TestMessage.prototype.addItem = function(item) {
-    if (item.isNumber())
-      this.addNumber(item);
-    else if (item.isByte())
-      this.addByte(item);
-    else if (item.isDistance())
-      this.addDistance(item);
-    else if (item.isAnchor())
-      this.addAnchor(item);
-    else if (item.isHandles())
-      this.addHandles(item);
-    else
-      throw new InputError('unrecognized item type', item.line);
-
-    this.index += item.size;
-  }
-
-  TestMessage.prototype.unanchoredDistances = function() {
-    var names = null;
-    for (var name in this.distances) {
-      if (this.distances.hasOwnProperty(name))
-        names = (names === null) ? name : names + ' ' + name;
-    }
-    return names;
-  }
-
-  function parseTestMessage(text) {
-    var file = new File(text);
-    var items = [];
-    var messageLength = 0;
-    while(!file.endReached()) {
-      var line = file.nextLine();
-      while (!line.endReached()) {
-        var item = line.nextItem();
-        if (item.isHandles() && items.length > 0)
-          throw new InputError('handles item is not first');
-        messageLength += item.size;
-        items.push(item);
-      }
-    }
-
-    var msg = new TestMessage(messageLength);
-    for (var i = 0; i < items.length; i++)
-      msg.addItem(items[i]);
-
-    if (messageLength != msg.index)
-      throw new InputError('failed to compute message length');
-    var names = msg.unanchoredDistances();
-    if (names)
-      throw new InputError('no anchors for ' + names, 0);
-
-    return msg;
-  }
-
-  var exports = {};
-  exports.parseTestMessage = parseTestMessage;
-  exports.InputError = InputError;
-  return exports;
-});
diff --git a/mojo/public/js/tests/validation_unittest.js b/mojo/public/js/tests/validation_unittest.js
deleted file mode 100644
index 2a07315..0000000
--- a/mojo/public/js/tests/validation_unittest.js
+++ /dev/null
@@ -1,334 +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.
-
-define([
-    "console",
-    "file",
-    "gin/test/expect",
-    "mojo/public/interfaces/bindings/tests/validation_test_interfaces.mojom",
-    "mojo/public/js/bindings",
-    "mojo/public/js/buffer",
-    "mojo/public/js/codec",
-    "mojo/public/js/core",
-    "mojo/public/js/tests/validation_test_input_parser",
-    "mojo/public/js/validator",
-], function(console,
-            file,
-            expect,
-            testInterface,
-            bindings,
-            buffer,
-            codec,
-            core,
-            parser,
-            validator) {
-
-  var noError = validator.validationError.NONE;
-
-  function checkTestMessageParser() {
-    function TestMessageParserFailure(message, input) {
-      this.message = message;
-      this.input = input;
-    }
-
-    TestMessageParserFailure.prototype.toString = function() {
-      return 'Error: ' + this.message + ' for "' + this.input + '"';
-    };
-
-    function checkData(data, expectedData, input) {
-      if (data.byteLength != expectedData.byteLength) {
-        var s = "message length (" + data.byteLength + ") doesn't match " +
-            "expected length: " + expectedData.byteLength;
-        throw new TestMessageParserFailure(s, input);
-      }
-
-      for (var i = 0; i < data.byteLength; i++) {
-        if (data.getUint8(i) != expectedData.getUint8(i)) {
-          var s = 'message data mismatch at byte offset ' + i;
-          throw new TestMessageParserFailure(s, input);
-        }
-      }
-    }
-
-    function testFloatItems() {
-      var input = '[f]+.3e9 [d]-10.03';
-      var msg = parser.parseTestMessage(input);
-      var expectedData = new buffer.Buffer(12);
-      expectedData.setFloat32(0, +.3e9);
-      expectedData.setFloat64(4, -10.03);
-      checkData(msg.buffer, expectedData, input);
-    }
-
-    function testUnsignedIntegerItems() {
-      var input = '[u1]0x10// hello world !! \n\r  \t [u2]65535 \n' +
-          '[u4]65536 [u8]0xFFFFFFFFFFFFF 0 0Xff';
-      var msg = parser.parseTestMessage(input);
-      var expectedData = new buffer.Buffer(17);
-      expectedData.setUint8(0, 0x10);
-      expectedData.setUint16(1, 65535);
-      expectedData.setUint32(3, 65536);
-      expectedData.setUint64(7, 0xFFFFFFFFFFFFF);
-      expectedData.setUint8(15, 0);
-      expectedData.setUint8(16, 0xff);
-      checkData(msg.buffer, expectedData, input);
-    }
-
-    function testSignedIntegerItems() {
-      var input = '[s8]-0x800 [s1]-128\t[s2]+0 [s4]-40';
-      var msg = parser.parseTestMessage(input);
-      var expectedData = new buffer.Buffer(15);
-      expectedData.setInt64(0, -0x800);
-      expectedData.setInt8(8, -128);
-      expectedData.setInt16(9, 0);
-      expectedData.setInt32(11, -40);
-      checkData(msg.buffer, expectedData, input);
-    }
-
-    function testByteItems() {
-      var input = '[b]00001011 [b]10000000  // hello world\n [b]00000000';
-      var msg = parser.parseTestMessage(input);
-      var expectedData = new buffer.Buffer(3);
-      expectedData.setUint8(0, 11);
-      expectedData.setUint8(1, 128);
-      expectedData.setUint8(2, 0);
-      checkData(msg.buffer, expectedData, input);
-    }
-
-    function testAnchors() {
-      var input = '[dist4]foo 0 [dist8]bar 0 [anchr]foo [anchr]bar';
-      var msg = parser.parseTestMessage(input);
-      var expectedData = new buffer.Buffer(14);
-      expectedData.setUint32(0, 14);
-      expectedData.setUint8(4, 0);
-      expectedData.setUint64(5, 9);
-      expectedData.setUint8(13, 0);
-      checkData(msg.buffer, expectedData, input);
-    }
-
-    function testHandles() {
-      var input = '// This message has handles! \n[handles]50 [u8]2';
-      var msg = parser.parseTestMessage(input);
-      var expectedData = new buffer.Buffer(8);
-      expectedData.setUint64(0, 2);
-
-      if (msg.handleCount != 50) {
-        var s = 'wrong handle count (' + msg.handleCount + ')';
-        throw new TestMessageParserFailure(s, input);
-      }
-      checkData(msg.buffer, expectedData, input);
-    }
-
-    function testEmptyInput() {
-      var msg = parser.parseTestMessage('');
-      if (msg.buffer.byteLength != 0)
-        throw new TestMessageParserFailure('expected empty message', '');
-    }
-
-    function testBlankInput() {
-      var input = '    \t  // hello world \n\r \t// the answer is 42   ';
-      var msg = parser.parseTestMessage(input);
-      if (msg.buffer.byteLength != 0)
-        throw new TestMessageParserFailure('expected empty message', input);
-    }
-
-    function testInvalidInput() {
-      function parserShouldFail(input) {
-        try {
-          parser.parseTestMessage(input);
-        } catch (e) {
-          if (e instanceof parser.InputError)
-            return;
-          throw new TestMessageParserFailure(
-            'unexpected exception ' + e.toString(), input);
-        }
-        throw new TestMessageParserFailure("didn't detect invalid input", file);
-      }
-
-      ['/ hello world',
-       '[u1]x',
-       '[u2]-1000',
-       '[u1]0x100',
-       '[s2]-0x8001',
-       '[b]1',
-       '[b]1111111k',
-       '[dist4]unmatched',
-       '[anchr]hello [dist8]hello',
-       '[dist4]a [dist4]a [anchr]a',
-       // '[dist4]a [anchr]a [dist4]a [anchr]a',
-       '0 [handles]50'
-      ].forEach(parserShouldFail);
-    }
-
-    try {
-      testFloatItems();
-      testUnsignedIntegerItems();
-      testSignedIntegerItems();
-      testByteItems();
-      testInvalidInput();
-      testEmptyInput();
-      testBlankInput();
-      testHandles();
-      testAnchors();
-    } catch (e) {
-      return e.toString();
-    }
-    return null;
-  }
-
-  function getMessageTestFiles(prefix) {
-    var sourceRoot = file.getSourceRootDirectory();
-    expect(sourceRoot).not.toBeNull();
-
-    var testDir = sourceRoot +
-      "/mojo/public/interfaces/bindings/tests/data/validation/";
-    var testFiles = file.getFilesInDirectory(testDir);
-    expect(testFiles).not.toBeNull();
-    expect(testFiles.length).toBeGreaterThan(0);
-
-    // The matching ".data" pathnames with the extension removed.
-    return testFiles.filter(function(s) {
-      return s.substr(-5) == ".data" && s.indexOf(prefix) == 0;
-    }).map(function(s) {
-      return testDir + s.slice(0, -5);
-    });
-  }
-
-  function readTestMessage(filename) {
-    var contents = file.readFileToString(filename + ".data");
-    expect(contents).not.toBeNull();
-    return parser.parseTestMessage(contents);
-  }
-
-  function readTestExpected(filename) {
-    var contents = file.readFileToString(filename + ".expected");
-    expect(contents).not.toBeNull();
-    return contents.trim();
-  }
-
-  function checkValidationResult(testFile, err) {
-    var actualResult = (err === noError) ? "PASS" : err;
-    var expectedResult = readTestExpected(testFile);
-    if (actualResult != expectedResult)
-      console.log("[Test message validation failed: " + testFile + " ]");
-    expect(actualResult).toEqual(expectedResult);
-  }
-
-  function testMessageValidation(prefix, filters) {
-    var testFiles = getMessageTestFiles(prefix);
-    expect(testFiles.length).toBeGreaterThan(0);
-
-    for (var i = 0; i < testFiles.length; i++) {
-      // TODO(hansmuller) Temporarily skipping array pointer overflow tests
-      // because JS numbers are limited to 53 bits.
-      // TODO(rudominer): Temporarily skipping 'no-such-method',
-      // 'invalid_request_flags', and 'invalid_response_flags' until additional
-      // logic in *RequestValidator and *ResponseValidator is ported from
-      // cpp to js.
-      // TODO(crbug/640298): Implement max recursion depth for JS.
-      // TODO(crbug/628104): Support struct map keys for JS.
-      if (testFiles[i].indexOf("overflow") != -1 ||
-          testFiles[i].indexOf("conformance_mthd19") != -1 ||
-          testFiles[i].indexOf("conformance_mthd20") != -1 ||
-          testFiles[i].indexOf("no_such_method") != -1 ||
-          testFiles[i].indexOf("invalid_request_flags") != -1 ||
-          testFiles[i].indexOf("invalid_response_flags") != -1) {
-        console.log("[Skipping " + testFiles[i] + "]");
-        continue;
-      }
-
-      var testMessage = readTestMessage(testFiles[i]);
-      var handles = new Array(testMessage.handleCount);
-      var message = new codec.Message(testMessage.buffer, handles);
-      var messageValidator = new validator.Validator(message);
-
-      var err = messageValidator.validateMessageHeader();
-      for (var j = 0; err === noError && j < filters.length; ++j)
-        err = filters[j](messageValidator);
-
-      checkValidationResult(testFiles[i], err);
-    }
-  }
-
-  function testConformanceMessageValidation() {
-    testMessageValidation("conformance_", [
-        testInterface.ConformanceTestInterface.validateRequest]);
-  }
-
-  function testBoundsCheckMessageValidation() {
-    testMessageValidation("boundscheck_", [
-        testInterface.BoundsCheckTestInterface.validateRequest]);
-  }
-
-  function testResponseConformanceMessageValidation() {
-    testMessageValidation("resp_conformance_", [
-        testInterface.ConformanceTestInterface.validateResponse]);
-  }
-
-  function testResponseBoundsCheckMessageValidation() {
-    testMessageValidation("resp_boundscheck_", [
-        testInterface.BoundsCheckTestInterface.validateResponse]);
-  }
-
-  function testIntegratedMessageValidation(testFilesPattern, endpoint) {
-    var testFiles = getMessageTestFiles(testFilesPattern);
-    expect(testFiles.length).toBeGreaterThan(0);
-
-    var testMessagePipe = core.createMessagePipe();
-    expect(testMessagePipe.result).toBe(core.RESULT_OK);
-
-    endpoint.bind(testMessagePipe.handle1);
-    var observer = validator.ValidationErrorObserverForTesting.getInstance();
-
-    for (var i = 0; i < testFiles.length; i++) {
-      var testMessage = readTestMessage(testFiles[i]);
-      var handles = new Array(testMessage.handleCount);
-
-      var writeMessageValue = core.writeMessage(
-          testMessagePipe.handle0,
-          new Uint8Array(testMessage.buffer.arrayBuffer),
-          new Array(testMessage.handleCount),
-          core.WRITE_MESSAGE_FLAG_NONE);
-      expect(writeMessageValue).toBe(core.RESULT_OK);
-
-      endpoint.waitForNextMessageForTesting();
-      checkValidationResult(testFiles[i], observer.lastError);
-      observer.reset();
-    }
-
-    expect(core.close(testMessagePipe.handle0)).toBe(core.RESULT_OK);
-  }
-
-  function testIntegratedMessageHeaderValidation() {
-    testIntegratedMessageValidation(
-        "integration_msghdr",
-        new bindings.Binding(testInterface.IntegrationTestInterface, {}));
-    testIntegratedMessageValidation(
-        "integration_msghdr",
-        new testInterface.IntegrationTestInterfacePtr().ptr);
-  }
-
-  function testIntegratedRequestMessageValidation() {
-    testIntegratedMessageValidation(
-        "integration_intf_rqst",
-        new bindings.Binding(testInterface.IntegrationTestInterface, {}));
-  }
-
-  function testIntegratedResponseMessageValidation() {
-    testIntegratedMessageValidation(
-        "integration_intf_resp",
-        new testInterface.IntegrationTestInterfacePtr().ptr);
-  }
-
-  expect(checkTestMessageParser()).toBeNull();
-  testConformanceMessageValidation();
-  testBoundsCheckMessageValidation();
-  testResponseConformanceMessageValidation();
-  testResponseBoundsCheckMessageValidation();
-  testIntegratedMessageHeaderValidation();
-  testIntegratedResponseMessageValidation();
-  testIntegratedRequestMessageValidation();
-  validator.clearTestingMode();
-
-  this.result = "PASS";
-});
diff --git a/mojo/public/js/threading.js b/mojo/public/js/threading.js
deleted file mode 100644
index 49ab5c9..0000000
--- a/mojo/public/js/threading.js
+++ /dev/null
@@ -1,21 +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.
-
-// Module "mojo/public/js/threading"
-//
-// Note: This file is for documentation purposes only. The code here is not
-// actually executed. The real module is implemented natively in Mojo.
-//
-// This module provides a way for a Service implemented in JS
-// to exit by quitting the current message loop. This module is not
-// intended to be used by Mojo JS application started by the JS
-// content handler.
-
-while (1);
-
-/**
- * Quits the current message loop, esssentially:
- * base::MessageLoop::current()->QuitNow();
-*/
-function quit() { [native code] }
diff --git a/mojo/public/js/unicode.js b/mojo/public/js/unicode.js
deleted file mode 100644
index be2ba0e..0000000
--- a/mojo/public/js/unicode.js
+++ /dev/null
@@ -1,51 +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.
-
-/**
- * Defines functions for translating between JavaScript strings and UTF8 strings
- * stored in ArrayBuffers. There is much room for optimization in this code if
- * it proves necessary.
- */
-define("mojo/public/js/unicode", function() {
-  /**
-   * Decodes the UTF8 string from the given buffer.
-   * @param {ArrayBufferView} buffer The buffer containing UTF8 string data.
-   * @return {string} The corresponding JavaScript string.
-   */
-  function decodeUtf8String(buffer) {
-    return decodeURIComponent(escape(String.fromCharCode.apply(null, buffer)));
-  }
-
-  /**
-   * Encodes the given JavaScript string into UTF8.
-   * @param {string} str The string to encode.
-   * @param {ArrayBufferView} outputBuffer The buffer to contain the result.
-   * Should be pre-allocated to hold enough space. Use |utf8Length| to determine
-   * how much space is required.
-   * @return {number} The number of bytes written to |outputBuffer|.
-   */
-  function encodeUtf8String(str, outputBuffer) {
-    var utf8String = unescape(encodeURIComponent(str));
-    if (outputBuffer.length < utf8String.length)
-      throw new Error("Buffer too small for encodeUtf8String");
-    for (var i = 0; i < outputBuffer.length && i < utf8String.length; i++)
-      outputBuffer[i] = utf8String.charCodeAt(i);
-    return i;
-  }
-
-  /**
-   * Returns the number of bytes that a UTF8 encoding of the JavaScript string
-   * |str| would occupy.
-   */
-  function utf8Length(str) {
-    var utf8String = unescape(encodeURIComponent(str));
-    return utf8String.length;
-  }
-
-  var exports = {};
-  exports.decodeUtf8String = decodeUtf8String;
-  exports.encodeUtf8String = encodeUtf8String;
-  exports.utf8Length = utf8Length;
-  return exports;
-});
diff --git a/mojo/public/js/validator.js b/mojo/public/js/validator.js
deleted file mode 100644
index 283546d..0000000
--- a/mojo/public/js/validator.js
+++ /dev/null
@@ -1,560 +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.
-
-define("mojo/public/js/validator", [
-  "mojo/public/js/codec",
-], function(codec) {
-
-  var validationError = {
-    NONE: 'VALIDATION_ERROR_NONE',
-    MISALIGNED_OBJECT: 'VALIDATION_ERROR_MISALIGNED_OBJECT',
-    ILLEGAL_MEMORY_RANGE: 'VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE',
-    UNEXPECTED_STRUCT_HEADER: 'VALIDATION_ERROR_UNEXPECTED_STRUCT_HEADER',
-    UNEXPECTED_ARRAY_HEADER: 'VALIDATION_ERROR_UNEXPECTED_ARRAY_HEADER',
-    ILLEGAL_HANDLE: 'VALIDATION_ERROR_ILLEGAL_HANDLE',
-    UNEXPECTED_INVALID_HANDLE: 'VALIDATION_ERROR_UNEXPECTED_INVALID_HANDLE',
-    ILLEGAL_POINTER: 'VALIDATION_ERROR_ILLEGAL_POINTER',
-    UNEXPECTED_NULL_POINTER: 'VALIDATION_ERROR_UNEXPECTED_NULL_POINTER',
-    MESSAGE_HEADER_INVALID_FLAGS:
-        'VALIDATION_ERROR_MESSAGE_HEADER_INVALID_FLAGS',
-    MESSAGE_HEADER_MISSING_REQUEST_ID:
-        'VALIDATION_ERROR_MESSAGE_HEADER_MISSING_REQUEST_ID',
-    DIFFERENT_SIZED_ARRAYS_IN_MAP:
-        'VALIDATION_ERROR_DIFFERENT_SIZED_ARRAYS_IN_MAP',
-    INVALID_UNION_SIZE: 'VALIDATION_ERROR_INVALID_UNION_SIZE',
-    UNEXPECTED_NULL_UNION: 'VALIDATION_ERROR_UNEXPECTED_NULL_UNION',
-    UNKNOWN_ENUM_VALUE: 'VALIDATION_ERROR_UNKNOWN_ENUM_VALUE',
-  };
-
-  var NULL_MOJO_POINTER = "NULL_MOJO_POINTER";
-  var gValidationErrorObserver = null;
-
-  function reportValidationError(error) {
-    if (gValidationErrorObserver) {
-      gValidationErrorObserver.setLastError(error);
-    }
-  }
-
-  var ValidationErrorObserverForTesting = (function() {
-    function Observer() {
-      this.lastError = validationError.NONE;
-      this.callback = null;
-    }
-
-    Observer.prototype.setLastError = function(error) {
-      this.lastError = error;
-      if (this.callback) {
-        this.callback(error);
-      }
-    };
-
-    Observer.prototype.reset = function(error) {
-      this.lastError = validationError.NONE;
-      this.callback = null;
-    };
-
-    return {
-      getInstance: function() {
-        if (!gValidationErrorObserver) {
-          gValidationErrorObserver = new Observer();
-        }
-        return gValidationErrorObserver;
-      }
-    };
-  })();
-
-  function isTestingMode() {
-    return Boolean(gValidationErrorObserver);
-  }
-
-  function clearTestingMode() {
-    gValidationErrorObserver = null;
-  }
-
-  function isEnumClass(cls) {
-    return cls instanceof codec.Enum;
-  }
-
-  function isStringClass(cls) {
-    return cls === codec.String || cls === codec.NullableString;
-  }
-
-  function isHandleClass(cls) {
-    return cls === codec.Handle || cls === codec.NullableHandle;
-  }
-
-  function isInterfaceClass(cls) {
-    return cls instanceof codec.Interface;
-  }
-
-  function isInterfaceRequestClass(cls) {
-    return cls === codec.InterfaceRequest ||
-        cls === codec.NullableInterfaceRequest;
-  }
-
-  function isNullable(type) {
-    return type === codec.NullableString || type === codec.NullableHandle ||
-        type === codec.NullableInterface ||
-        type === codec.NullableInterfaceRequest ||
-        type instanceof codec.NullableArrayOf ||
-        type instanceof codec.NullablePointerTo;
-  }
-
-  function Validator(message) {
-    this.message = message;
-    this.offset = 0;
-    this.handleIndex = 0;
-  }
-
-  Object.defineProperty(Validator.prototype, "offsetLimit", {
-    get: function() { return this.message.buffer.byteLength; }
-  });
-
-  Object.defineProperty(Validator.prototype, "handleIndexLimit", {
-    get: function() { return this.message.handles.length; }
-  });
-
-  // True if we can safely allocate a block of bytes from start to
-  // to start + numBytes.
-  Validator.prototype.isValidRange = function(start, numBytes) {
-    // Only positive JavaScript integers that are less than 2^53
-    // (Number.MAX_SAFE_INTEGER) can be represented exactly.
-    if (start < this.offset || numBytes <= 0 ||
-        !Number.isSafeInteger(start) ||
-        !Number.isSafeInteger(numBytes))
-      return false;
-
-    var newOffset = start + numBytes;
-    if (!Number.isSafeInteger(newOffset) || newOffset > this.offsetLimit)
-      return false;
-
-    return true;
-  };
-
-  Validator.prototype.claimRange = function(start, numBytes) {
-    if (this.isValidRange(start, numBytes)) {
-      this.offset = start + numBytes;
-      return true;
-    }
-    return false;
-  };
-
-  Validator.prototype.claimHandle = function(index) {
-    if (index === codec.kEncodedInvalidHandleValue)
-      return true;
-
-    if (index < this.handleIndex || index >= this.handleIndexLimit)
-      return false;
-
-    // This is safe because handle indices are uint32.
-    this.handleIndex = index + 1;
-    return true;
-  };
-
-  Validator.prototype.validateEnum = function(offset, enumClass) {
-    // Note: Assumes that enums are always 32 bits! But this matches
-    // mojom::generate::pack::PackedField::GetSizeForKind, so it should be okay.
-    var value = this.message.buffer.getInt32(offset);
-    return enumClass.validate(value);
-  }
-
-  Validator.prototype.validateHandle = function(offset, nullable) {
-    var index = this.message.buffer.getUint32(offset);
-
-    if (index === codec.kEncodedInvalidHandleValue)
-      return nullable ?
-          validationError.NONE : validationError.UNEXPECTED_INVALID_HANDLE;
-
-    if (!this.claimHandle(index))
-      return validationError.ILLEGAL_HANDLE;
-
-    return validationError.NONE;
-  };
-
-  Validator.prototype.validateInterface = function(offset, nullable) {
-    return this.validateHandle(offset, nullable);
-  };
-
-  Validator.prototype.validateInterfaceRequest = function(offset, nullable) {
-    return this.validateHandle(offset, nullable);
-  };
-
-  Validator.prototype.validateStructHeader = function(offset, minNumBytes) {
-    if (!codec.isAligned(offset))
-      return validationError.MISALIGNED_OBJECT;
-
-    if (!this.isValidRange(offset, codec.kStructHeaderSize))
-      return validationError.ILLEGAL_MEMORY_RANGE;
-
-    var numBytes = this.message.buffer.getUint32(offset);
-
-    if (numBytes < minNumBytes)
-      return validationError.UNEXPECTED_STRUCT_HEADER;
-
-    if (!this.claimRange(offset, numBytes))
-      return validationError.ILLEGAL_MEMORY_RANGE;
-
-    return validationError.NONE;
-  };
-
-  Validator.prototype.validateStructVersion = function(offset, versionSizes) {
-    var numBytes = this.message.buffer.getUint32(offset);
-    var version = this.message.buffer.getUint32(offset + 4);
-
-    if (version <= versionSizes[versionSizes.length - 1].version) {
-      // Scan in reverse order to optimize for more recent versionSizes.
-      for (var i = versionSizes.length - 1; i >= 0; --i) {
-        if (version >= versionSizes[i].version) {
-          if (numBytes == versionSizes[i].numBytes)
-            break;
-          return validationError.UNEXPECTED_STRUCT_HEADER;
-        }
-      }
-    } else if (numBytes < versionSizes[versionSizes.length-1].numBytes) {
-      return validationError.UNEXPECTED_STRUCT_HEADER;
-    }
-
-    return validationError.NONE;
-  };
-
-  Validator.prototype.isFieldInStructVersion = function(offset, fieldVersion) {
-    var structVersion = this.message.buffer.getUint32(offset + 4);
-    return fieldVersion <= structVersion;
-  };
-
-  // TODO(wangjimmy): Add support for v2 messages.
-  Validator.prototype.validateMessageHeader = function() {
-
-    var err = this.validateStructHeader(0, codec.kMessageHeaderSize);
-    if (err != validationError.NONE)
-      return err;
-
-    var numBytes = this.message.getHeaderNumBytes();
-    var version = this.message.getHeaderVersion();
-
-    var validVersionAndNumBytes =
-        (version == 0 && numBytes == codec.kMessageHeaderSize) ||
-        (version == 1 &&
-         numBytes == codec.kMessageWithRequestIDHeaderSize) ||
-        (version > 1 &&
-         numBytes >= codec.kMessageWithRequestIDHeaderSize);
-    if (!validVersionAndNumBytes)
-      return validationError.UNEXPECTED_STRUCT_HEADER;
-
-    var expectsResponse = this.message.expectsResponse();
-    var isResponse = this.message.isResponse();
-
-    if (version == 0 && (expectsResponse || isResponse))
-      return validationError.MESSAGE_HEADER_MISSING_REQUEST_ID;
-
-    if (isResponse && expectsResponse)
-      return validationError.MESSAGE_HEADER_INVALID_FLAGS;
-
-    return validationError.NONE;
-  };
-
-  Validator.prototype.validateMessageIsRequestWithoutResponse = function() {
-    if (this.message.isResponse() || this.message.expectsResponse()) {
-      return validationError.MESSAGE_HEADER_INVALID_FLAGS;
-    }
-    return validationError.NONE;
-  };
-
-  Validator.prototype.validateMessageIsRequestExpectingResponse = function() {
-    if (this.message.isResponse() || !this.message.expectsResponse()) {
-      return validationError.MESSAGE_HEADER_INVALID_FLAGS;
-    }
-    return validationError.NONE;
-  };
-
-  Validator.prototype.validateMessageIsResponse = function() {
-    if (this.message.expectsResponse() || !this.message.isResponse()) {
-      return validationError.MESSAGE_HEADER_INVALID_FLAGS;
-    }
-    return validationError.NONE;
-  };
-
-  // Returns the message.buffer relative offset this pointer "points to",
-  // NULL_MOJO_POINTER if the pointer represents a null, or JS null if the
-  // pointer's value is not valid.
-  Validator.prototype.decodePointer = function(offset) {
-    var pointerValue = this.message.buffer.getUint64(offset);
-    if (pointerValue === 0)
-      return NULL_MOJO_POINTER;
-    var bufferOffset = offset + pointerValue;
-    return Number.isSafeInteger(bufferOffset) ? bufferOffset : null;
-  };
-
-  Validator.prototype.decodeUnionSize = function(offset) {
-    return this.message.buffer.getUint32(offset);
-  };
-
-  Validator.prototype.decodeUnionTag = function(offset) {
-    return this.message.buffer.getUint32(offset + 4);
-  };
-
-  Validator.prototype.validateArrayPointer = function(
-      offset, elementSize, elementType, nullable, expectedDimensionSizes,
-      currentDimension) {
-    var arrayOffset = this.decodePointer(offset);
-    if (arrayOffset === null)
-      return validationError.ILLEGAL_POINTER;
-
-    if (arrayOffset === NULL_MOJO_POINTER)
-      return nullable ?
-          validationError.NONE : validationError.UNEXPECTED_NULL_POINTER;
-
-    return this.validateArray(arrayOffset, elementSize, elementType,
-                              expectedDimensionSizes, currentDimension);
-  };
-
-  Validator.prototype.validateStructPointer = function(
-      offset, structClass, nullable) {
-    var structOffset = this.decodePointer(offset);
-    if (structOffset === null)
-      return validationError.ILLEGAL_POINTER;
-
-    if (structOffset === NULL_MOJO_POINTER)
-      return nullable ?
-          validationError.NONE : validationError.UNEXPECTED_NULL_POINTER;
-
-    return structClass.validate(this, structOffset);
-  };
-
-  Validator.prototype.validateUnion = function(
-      offset, unionClass, nullable) {
-    var size = this.message.buffer.getUint32(offset);
-    if (size == 0) {
-      return nullable ?
-          validationError.NONE : validationError.UNEXPECTED_NULL_UNION;
-    }
-
-    return unionClass.validate(this, offset);
-  };
-
-  Validator.prototype.validateNestedUnion = function(
-      offset, unionClass, nullable) {
-    var unionOffset = this.decodePointer(offset);
-    if (unionOffset === null)
-      return validationError.ILLEGAL_POINTER;
-
-    if (unionOffset === NULL_MOJO_POINTER)
-      return nullable ?
-          validationError.NONE : validationError.UNEXPECTED_NULL_UNION;
-
-    return this.validateUnion(unionOffset, unionClass, nullable);
-  };
-
-  // This method assumes that the array at arrayPointerOffset has
-  // been validated.
-
-  Validator.prototype.arrayLength = function(arrayPointerOffset) {
-    var arrayOffset = this.decodePointer(arrayPointerOffset);
-    return this.message.buffer.getUint32(arrayOffset + 4);
-  };
-
-  Validator.prototype.validateMapPointer = function(
-      offset, mapIsNullable, keyClass, valueClass, valueIsNullable) {
-    // Validate the implicit map struct:
-    // struct {array<keyClass> keys; array<valueClass> values};
-    var structOffset = this.decodePointer(offset);
-    if (structOffset === null)
-      return validationError.ILLEGAL_POINTER;
-
-    if (structOffset === NULL_MOJO_POINTER)
-      return mapIsNullable ?
-          validationError.NONE : validationError.UNEXPECTED_NULL_POINTER;
-
-    var mapEncodedSize = codec.kStructHeaderSize + codec.kMapStructPayloadSize;
-    var err = this.validateStructHeader(structOffset, mapEncodedSize);
-    if (err !== validationError.NONE)
-        return err;
-
-    // Validate the keys array.
-    var keysArrayPointerOffset = structOffset + codec.kStructHeaderSize;
-    err = this.validateArrayPointer(
-        keysArrayPointerOffset, keyClass.encodedSize, keyClass, false, [0], 0);
-    if (err !== validationError.NONE)
-        return err;
-
-    // Validate the values array.
-    var valuesArrayPointerOffset = keysArrayPointerOffset + 8;
-    var valuesArrayDimensions = [0]; // Validate the actual length below.
-    if (valueClass instanceof codec.ArrayOf)
-      valuesArrayDimensions =
-          valuesArrayDimensions.concat(valueClass.dimensions());
-    var err = this.validateArrayPointer(valuesArrayPointerOffset,
-                                        valueClass.encodedSize,
-                                        valueClass,
-                                        valueIsNullable,
-                                        valuesArrayDimensions,
-                                        0);
-    if (err !== validationError.NONE)
-        return err;
-
-    // Validate the lengths of the keys and values arrays.
-    var keysArrayLength = this.arrayLength(keysArrayPointerOffset);
-    var valuesArrayLength = this.arrayLength(valuesArrayPointerOffset);
-    if (keysArrayLength != valuesArrayLength)
-      return validationError.DIFFERENT_SIZED_ARRAYS_IN_MAP;
-
-    return validationError.NONE;
-  };
-
-  Validator.prototype.validateStringPointer = function(offset, nullable) {
-    return this.validateArrayPointer(
-        offset, codec.Uint8.encodedSize, codec.Uint8, nullable, [0], 0);
-  };
-
-  // Similar to Array_Data<T>::Validate()
-  // mojo/public/cpp/bindings/lib/array_internal.h
-
-  Validator.prototype.validateArray =
-      function (offset, elementSize, elementType, expectedDimensionSizes,
-                currentDimension) {
-    if (!codec.isAligned(offset))
-      return validationError.MISALIGNED_OBJECT;
-
-    if (!this.isValidRange(offset, codec.kArrayHeaderSize))
-      return validationError.ILLEGAL_MEMORY_RANGE;
-
-    var numBytes = this.message.buffer.getUint32(offset);
-    var numElements = this.message.buffer.getUint32(offset + 4);
-
-    // Note: this computation is "safe" because elementSize <= 8 and
-    // numElements is a uint32.
-    var elementsTotalSize = (elementType === codec.PackedBool) ?
-        Math.ceil(numElements / 8) : (elementSize * numElements);
-
-    if (numBytes < codec.kArrayHeaderSize + elementsTotalSize)
-      return validationError.UNEXPECTED_ARRAY_HEADER;
-
-    if (expectedDimensionSizes[currentDimension] != 0 &&
-        numElements != expectedDimensionSizes[currentDimension]) {
-      return validationError.UNEXPECTED_ARRAY_HEADER;
-    }
-
-    if (!this.claimRange(offset, numBytes))
-      return validationError.ILLEGAL_MEMORY_RANGE;
-
-    // Validate the array's elements if they are pointers or handles.
-
-    var elementsOffset = offset + codec.kArrayHeaderSize;
-    var nullable = isNullable(elementType);
-
-    if (isHandleClass(elementType))
-      return this.validateHandleElements(elementsOffset, numElements, nullable);
-    if (isInterfaceClass(elementType))
-      return this.validateInterfaceElements(
-          elementsOffset, numElements, nullable);
-    if (isInterfaceRequestClass(elementType))
-      return this.validateInterfaceRequestElements(
-          elementsOffset, numElements, nullable);
-    if (isStringClass(elementType))
-      return this.validateArrayElements(
-          elementsOffset, numElements, codec.Uint8, nullable, [0], 0);
-    if (elementType instanceof codec.PointerTo)
-      return this.validateStructElements(
-          elementsOffset, numElements, elementType.cls, nullable);
-    if (elementType instanceof codec.ArrayOf)
-      return this.validateArrayElements(
-          elementsOffset, numElements, elementType.cls, nullable,
-          expectedDimensionSizes, currentDimension + 1);
-    if (isEnumClass(elementType))
-      return this.validateEnumElements(elementsOffset, numElements,
-                                       elementType.cls);
-
-    return validationError.NONE;
-  };
-
-  // Note: the |offset + i * elementSize| computation in the validateFooElements
-  // methods below is "safe" because elementSize <= 8, offset and
-  // numElements are uint32, and 0 <= i < numElements.
-
-  Validator.prototype.validateHandleElements =
-      function(offset, numElements, nullable) {
-    var elementSize = codec.Handle.encodedSize;
-    for (var i = 0; i < numElements; i++) {
-      var elementOffset = offset + i * elementSize;
-      var err = this.validateHandle(elementOffset, nullable);
-      if (err != validationError.NONE)
-        return err;
-    }
-    return validationError.NONE;
-  };
-
-  Validator.prototype.validateInterfaceElements =
-      function(offset, numElements, nullable) {
-    var elementSize = codec.Interface.prototype.encodedSize;
-    for (var i = 0; i < numElements; i++) {
-      var elementOffset = offset + i * elementSize;
-      var err = this.validateInterface(elementOffset, nullable);
-      if (err != validationError.NONE)
-        return err;
-    }
-    return validationError.NONE;
-  };
-
-  Validator.prototype.validateInterfaceRequestElements =
-      function(offset, numElements, nullable) {
-    var elementSize = codec.InterfaceRequest.encodedSize;
-    for (var i = 0; i < numElements; i++) {
-      var elementOffset = offset + i * elementSize;
-      var err = this.validateInterfaceRequest(elementOffset, nullable);
-      if (err != validationError.NONE)
-        return err;
-    }
-    return validationError.NONE;
-  };
-
-  // The elementClass parameter is the element type of the element arrays.
-  Validator.prototype.validateArrayElements =
-      function(offset, numElements, elementClass, nullable,
-               expectedDimensionSizes, currentDimension) {
-    var elementSize = codec.PointerTo.prototype.encodedSize;
-    for (var i = 0; i < numElements; i++) {
-      var elementOffset = offset + i * elementSize;
-      var err = this.validateArrayPointer(
-          elementOffset, elementClass.encodedSize, elementClass, nullable,
-          expectedDimensionSizes, currentDimension);
-      if (err != validationError.NONE)
-        return err;
-    }
-    return validationError.NONE;
-  };
-
-  Validator.prototype.validateStructElements =
-      function(offset, numElements, structClass, nullable) {
-    var elementSize = codec.PointerTo.prototype.encodedSize;
-    for (var i = 0; i < numElements; i++) {
-      var elementOffset = offset + i * elementSize;
-      var err =
-          this.validateStructPointer(elementOffset, structClass, nullable);
-      if (err != validationError.NONE)
-        return err;
-    }
-    return validationError.NONE;
-  };
-
-  Validator.prototype.validateEnumElements =
-      function(offset, numElements, enumClass) {
-    var elementSize = codec.Enum.prototype.encodedSize;
-    for (var i = 0; i < numElements; i++) {
-      var elementOffset = offset + i * elementSize;
-      var err = this.validateEnum(elementOffset, enumClass);
-      if (err != validationError.NONE)
-        return err;
-    }
-    return validationError.NONE;
-  };
-
-  var exports = {};
-  exports.validationError = validationError;
-  exports.Validator = Validator;
-  exports.ValidationErrorObserverForTesting = ValidationErrorObserverForTesting;
-  exports.reportValidationError = reportValidationError;
-  exports.isTestingMode = isTestingMode;
-  exports.clearTestingMode = clearTestingMode;
-  return exports;
-});
diff --git a/mojo/public/tests/test_support_private.cc b/mojo/public/tests/test_support_private.cc
deleted file mode 100644
index 0081984..0000000
--- a/mojo/public/tests/test_support_private.cc
+++ /dev/null
@@ -1,76 +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 "mojo/public/tests/test_support_private.h"
-
-#include <assert.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-static mojo::test::TestSupport* g_test_support = NULL;
-
-extern "C" {
-
-void MojoTestSupportLogPerfResult(const char* test_name,
-                                  const char* sub_test_name,
-                                  double value,
-                                  const char* units) {
-  if (g_test_support) {
-    g_test_support->LogPerfResult(test_name, sub_test_name, value, units);
-  } else {
-    if (sub_test_name) {
-      printf("[no test runner]\t%s/%s\t%g\t%s\n", test_name, sub_test_name,
-             value, units);
-    } else {
-      printf("[no test runner]\t%s\t%g\t%s\n", test_name, value, units);
-    }
-  }
-}
-
-FILE* MojoTestSupportOpenSourceRootRelativeFile(const char* relative_path) {
-  if (g_test_support)
-    return g_test_support->OpenSourceRootRelativeFile(relative_path);
-  printf("[no test runner]\n");
-  return NULL;
-}
-
-char** MojoTestSupportEnumerateSourceRootRelativeDirectory(
-    const char* relative_path) {
-  if (g_test_support)
-    return g_test_support->EnumerateSourceRootRelativeDirectory(relative_path);
-
-  printf("[no test runner]\n");
-
-  // Return empty list:
-  char** rv = static_cast<char**>(calloc(1, sizeof(char*)));
-  rv[0] = NULL;
-  return rv;
-}
-
-}  // extern "C"
-
-namespace mojo {
-namespace test {
-
-TestSupport::~TestSupport() {
-}
-
-// static
-void TestSupport::Init(TestSupport* test_support) {
-  assert(!g_test_support);
-  g_test_support = test_support;
-}
-
-// static
-TestSupport* TestSupport::Get() {
-  return g_test_support;
-}
-
-// static
-void TestSupport::Reset() {
-  g_test_support = NULL;
-}
-
-}  // namespace test
-}  // namespace mojo
diff --git a/mojo/public/tests/test_support_private.h b/mojo/public/tests/test_support_private.h
deleted file mode 100644
index 2742605..0000000
--- a/mojo/public/tests/test_support_private.h
+++ /dev/null
@@ -1,37 +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 MOJO_PUBLIC_TESTS_TEST_SUPPORT_PRIVATE_H_
-#define MOJO_PUBLIC_TESTS_TEST_SUPPORT_PRIVATE_H_
-
-#include <stdio.h>
-
-#include "mojo/public/c/test_support/test_support.h"
-
-namespace mojo {
-namespace test {
-
-// Implementors of the test support APIs can use this interface to install their
-// implementation into the mojo_test_support dynamic library.
-class TestSupport {
- public:
-  virtual ~TestSupport();
-
-  static void Init(TestSupport* test_support);
-  static TestSupport* Get();
-  static void Reset();
-
-  virtual void LogPerfResult(const char* test_name,
-                             const char* sub_test_name,
-                             double value,
-                             const char* units) = 0;
-  virtual FILE* OpenSourceRootRelativeFile(const char* relative_path) = 0;
-  virtual char** EnumerateSourceRootRelativeDirectory(
-      const char* relative_path) = 0;
-};
-
-}  // namespace test
-}  // namespace mojo
-
-#endif  // MOJO_PUBLIC_TESTS_TEST_SUPPORT_PRIVATE_H_
diff --git a/mojo/public/tools/bindings/BUILD.gn b/mojo/public/tools/bindings/BUILD.gn
deleted file mode 100644
index 153d110..0000000
--- a/mojo/public/tools/bindings/BUILD.gn
+++ /dev/null
@@ -1,77 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//mojo/public/tools/bindings/mojom.gni")
-
-action("precompile_templates") {
-  sources = mojom_generator_sources
-  sources += [
-    "$mojom_generator_root/generators/cpp_templates/enum_macros.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/enum_serialization_declaration.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/interface_declaration.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/interface_definition.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/interface_macros.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/interface_proxy_declaration.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/interface_request_validator_declaration.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/interface_response_validator_declaration.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/interface_stub_declaration.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/module-shared-internal.h.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/module-shared.cc.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/module-shared.h.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/module.cc.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/module.h.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/struct_data_view_declaration.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/struct_data_view_definition.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/struct_declaration.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/struct_definition.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/struct_macros.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/struct_serialization_declaration.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/struct_traits_declaration.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/struct_traits_definition.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/union_data_view_declaration.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/union_data_view_definition.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/union_declaration.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/union_definition.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/union_serialization_declaration.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/union_traits_declaration.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/union_traits_definition.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/validation_macros.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/wrapper_class_declaration.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/wrapper_class_definition.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/wrapper_class_template_definition.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/wrapper_union_class_declaration.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/wrapper_union_class_definition.tmpl",
-    "$mojom_generator_root/generators/cpp_templates/wrapper_union_class_template_definition.tmpl",
-    "$mojom_generator_root/generators/java_templates/constant_definition.tmpl",
-    "$mojom_generator_root/generators/java_templates/constants.java.tmpl",
-    "$mojom_generator_root/generators/java_templates/data_types_definition.tmpl",
-    "$mojom_generator_root/generators/java_templates/enum.java.tmpl",
-    "$mojom_generator_root/generators/java_templates/enum_definition.tmpl",
-    "$mojom_generator_root/generators/java_templates/header.java.tmpl",
-    "$mojom_generator_root/generators/java_templates/interface.java.tmpl",
-    "$mojom_generator_root/generators/java_templates/interface_definition.tmpl",
-    "$mojom_generator_root/generators/java_templates/interface_internal.java.tmpl",
-    "$mojom_generator_root/generators/java_templates/struct.java.tmpl",
-    "$mojom_generator_root/generators/java_templates/union.java.tmpl",
-    "$mojom_generator_root/generators/js_templates/enum_definition.tmpl",
-    "$mojom_generator_root/generators/js_templates/interface_definition.tmpl",
-    "$mojom_generator_root/generators/js_templates/module.amd.tmpl",
-    "$mojom_generator_root/generators/js_templates/module_definition.tmpl",
-    "$mojom_generator_root/generators/js_templates/struct_definition.tmpl",
-    "$mojom_generator_root/generators/js_templates/union_definition.tmpl",
-    "$mojom_generator_root/generators/js_templates/validation_macros.tmpl",
-  ]
-  script = mojom_generator_script
-  outputs = [
-    "$target_gen_dir/cpp_templates.zip",
-    "$target_gen_dir/java_templates.zip",
-    "$target_gen_dir/js_templates.zip",
-  ]
-  args = [
-    "--use_bundled_pylibs",
-    "precompile",
-    "-o",
-    rebase_path(target_gen_dir),
-  ]
-}
diff --git a/mojo/public/tools/bindings/README.md b/mojo/public/tools/bindings/README.md
deleted file mode 100644
index 737c7e6..0000000
--- a/mojo/public/tools/bindings/README.md
+++ /dev/null
@@ -1,749 +0,0 @@
-# ![Mojo Graphic](https://goo.gl/6CdlbH) Mojom IDL and Bindings Generator
-This document is a subset of the [Mojo documentation](/mojo).
-
-[TOC]
-
-## Overview
-
-Mojom is the IDL for Mojo bindings interfaces. Given a `.mojom` file, the
-[bindings generator](https://cs.chromium.org/chromium/src/mojo/public/tools/bindings)
-outputs bindings for all supported languages: **C++**, **JavaScript**, and
-**Java**.
-
-For a trivial example consider the following hypothetical Mojom file we write to
-`//services/widget/public/interfaces/frobinator.mojom`:
-
-```
-module widget.mojom;
-
-interface Frobinator {
-  Frobinate();
-};
-```
-
-This defines a single [interface](#Interfaces) named `Frobinator` in a
-[module](#Modules) named `widget.mojom` (and thus fully qualified in Mojom as
-`widget.mojom.Frobinator`.) Note that many interfaces and/or other types of
-definitions may be included in a single Mojom file.
-
-If we add a corresponding GN target to
-`//services/widget/public/interfaces/BUILD.gn`:
-
-```
-import("mojo/public/tools/bindings/mojom.gni")
-
-mojom("interfaces") {
-  sources = [
-    "frobinator.mojom",
-  ]
-}
-```
-
-and then build this target:
-
-```
-ninja -C out/r services/widget/public/interfaces
-```
-
-we'll find several generated sources in our output directory:
-
-```
-out/r/gen/services/widget/public/interfaces/frobinator.mojom.cc
-out/r/gen/services/widget/public/interfaces/frobinator.mojom.h
-out/r/gen/services/widget/public/interfaces/frobinator.mojom.js
-out/r/gen/services/widget/public/interfaces/frobinator.mojom.srcjar
-...
-```
-
-Each of these generated source modules includes a set of definitions
-representing the Mojom contents within the target language. For more details
-regarding the generated outputs please see
-[documentation for individual target languages](#Generated-Code-For-Target-Languages).
-
-## Mojom Syntax
-
-Mojom IDL allows developers to define **structs**, **unions**, **interfaces**,
-**constants**, and **enums**, all within the context of a **module**. These
-definitions are used to generate code in the supported target languages at build
-time.
-
-Mojom files may **import** other Mojom files in order to reference their
-definitions.
-
-### Primitive Types
-Mojom supports a few basic data types which may be composed into structs or used
-for message parameters.
-
-| Type                          | Description
-|-------------------------------|-------------------------------------------------------|
-| `bool`                        | Boolean type (`true` or `false`.)
-| `int8`, `uint8`               | Signed or unsigned 8-bit integer.
-| `int16`, `uint16`             | Signed or unsigned 16-bit integer.
-| `int32`, `uint32`             | Signed or unsigned 32-bit integer.
-| `int64`, `uint64`             | Signed or unsigned 64-bit integer.
-| `float`, `double`             | 32- or 64-bit floating point number.
-| `string`                      | UTF-8 encoded string.
-| `array<T>`                    | Array of any Mojom type *T*; for example, `array<uint8>` or `array<array<string>>`.
-| `array<T, N>`                 | Fixed-length array of any Mojom type *T*. The parameter *N* must be an integral constant.
-| `map<S, T>`                   | Associated array maping values of type *S* to values of type *T*. *S* may be a `string`, `enum`, or numeric type.
-| `handle`                      | Generic Mojo handle. May be any type of handle, including a wrapped native platform handle.
-| `handle<message_pipe>`        | Generic message pipe handle.
-| `handle<shared_buffer>`       | Shared buffer handle.
-| `handle<data_pipe_producer>`  | Data pipe producer handle.
-| `handle<data_pipe_consumer>`  | Data pipe consumer handle.
-| *`InterfaceType`*             | Any user-defined Mojom interface type. This is sugar for a strongly-typed message pipe handle which should eventually be used to make outgoing calls on the interface.
-| *`InterfaceType&`*            | An interface request for any user-defined Mojom interface type. This is sugar for a more strongly-typed message pipe handle which is expected to receive request messages and should therefore eventually be bound to an implementation of the interface.
-| *`associated InterfaceType`*  | An associated interface handle. See [Associated Interfaces](#Associated-Interfaces)
-| *`associated InterfaceType&`* | An associated interface request. See [Associated Interfaces](#Associated-Interfaces)
-| *T*?                          | An optional (nullable) value. Primitive numeric types (integers, floats, booleans, and enums) are not nullable. All other types are nullable.
-
-### Modules
-
-Every Mojom file may optionally specify a single **module** to which it belongs.
-
-This is used strictly for aggregaging all defined symbols therein within a
-common Mojom namespace. The specific impact this has on generated binidngs code
-varies for each target language. For example, if the following Mojom is used to
-generate bindings:
-
-```
-module business.stuff;
-
-interface MoneyGenerator {
-  GenerateMoney();
-};
-```
-
-Generated C++ bindings will define a class interface `MoneyGenerator` in the
-`business::stuff` namespace, while Java bindings will define an interface
-`MoneyGenerator` in the `org.chromium.business.stuff` package. JavaScript
-bindings at this time are unaffected by module declarations.
-
-**NOTE:** By convention in the Chromium codebase, **all** Mojom files should
-declare a module name with at least (and preferrably exactly) one top-level name
-as well as an inner `mojom` module suffix. *e.g.*, `chrome.mojom`,
-`business.mojom`, *etc.*
-
-This convention makes it easy to tell which symbols are generated by Mojom when
-reading non-Mojom code, and it also avoids namespace collisions in the fairly
-common scenario where you have a real C++ or Java `Foo` along with a
-corresponding Mojom `Foo` for its serialized representation.
-
-### Imports
-
-If your Mojom references definitions from other Mojom files, you must **import**
-those files. Import syntax is as follows:
-
-```
-import "services/widget/public/interfaces/frobinator.mojom";
-```
-
-Import paths are always relative to the top-level directory.
-
-Note that circular imports are **not** supported.
-
-### Structs
-
-Structs are defined using the **struct** keyword, and they provide a way to
-group related fields together:
-
-``` cpp
-struct StringPair {
-  string first;
-  string second;
-};
-```
-
-Struct fields may be comprised of any of the types listed above in the
-[Primitive Types](#Primitive-Types) section.
-
-Default values may be specified as long as they are constant:
-
-``` cpp
-struct Request {
-  int32 id = -1;
-  string details;
-};
-```
-
-What follows is a fairly
-comprehensive example using the supported field types:
-
-``` cpp
-struct StringPair {
-  string first;
-  string second;
-};
-
-enum AnEnum {
-  YES,
-  NO
-};
-
-interface SampleInterface {
-  DoStuff();
-};
-
-struct AllTheThings {
-  // Note that these types can never be marked nullable!
-  bool boolean_value;
-  int8 signed_8bit_value = 42;
-  uint8 unsigned_8bit_value;
-  int16 signed_16bit_value;
-  uint16 unsigned_16bit_value;
-  int32 signed_32bit_value;
-  uint32 unsigned_32bit_value;
-  int64 signed_64bit_value;
-  uint64 unsigned_64bit_value;
-  float float_value_32bit;
-  double float_value_64bit;
-  AnEnum enum_value = AnEnum.YES;
-
-  // Strings may be nullable.
-  string? maybe_a_string_maybe_not;
-
-  // Structs may contain other structs. These may also be nullable.
-  StringPair some_strings;
-  StringPair? maybe_some_more_strings;
-
-  // In fact structs can also be nested, though in practice you must always make
-  // such fields nullable -- otherwise messages would need to be infinitely long
-  // in order to pass validation!
-  AllTheThings? more_things;
-
-  // Arrays may be templated over any Mojom type, and are always nullable:
-  array<int32> numbers;
-  array<int32>? maybe_more_numbers;
-
-  // Arrays of arrays of arrays... are fine.
-  array<array<array<AnEnum>>> this_works_but_really_plz_stop;
-
-  // The element type may be nullable if it's a type which is allowed to be
-  // nullable.
-  array<AllTheThings?> more_maybe_things;
-
-  // Fixed-size arrays get some extra validation on the receiving end to ensure
-  // that the correct number of elements is always received.
-  array<uint64, 2> uuid;
-
-  // Maps follow many of the same rules as arrays. Key types may be any
-  // non-handle, non-collection type, and value types may be any supported
-  // struct field type. Maps may also be nullable.
-  map<string, int32> one_map;
-  map<AnEnum, string>? maybe_another_map;
-  map<StringPair, AllTheThings?>? maybe_a_pretty_weird_but_valid_map;
-  map<StringPair, map<int32, array<map<string, string>?>?>?> ridiculous;
-
-  // And finally, all handle types are valid as struct fields and may be
-  // nullable. Note that interfaces and interface requests (the "Foo" and
-  // "Foo&" type syntax respectively) are just strongly-typed message pipe
-  // handles.
-  handle generic_handle;
-  handle<data_pipe_consumer> reader;
-  handle<data_pipe_producer>? maybe_writer;
-  handle<shared_buffer> dumping_ground;
-  handle<message_pipe> raw_message_pipe;
-  SampleInterface? maybe_a_sample_interface_client_pipe;
-  SampleInterface& non_nullable_sample_interface_request;
-  SampleInterface&? nullable_sample_interface_request;
-  associated SampleInterface associated_interface_client;
-  associated SampleInterface& associated_interface_request;
-  assocaited SampleInterface&? maybe_another_associated_request;
-};
-```
-
-For details on how all of these different types translate to usable generated
-code, see
-[documentation for individual target languages](#Generated-Code-For-Target-Languages).
-
-### Enumeration Types
-
-Enumeration types may be defined using the **enum** keyword either directly
-within a module or within the namespace of some struct or interface:
-
-```
-module business.mojom;
-
-enum Department {
-  SALES = 0,
-  DEV,
-};
-
-struct Employee {
-  enum Type {
-    FULL_TIME,
-    PART_TIME,
-  };
-
-  Type type;
-  // ...
-};
-```
-
-That that similar to C-style enums, individual values may be explicitly assigned
-within an enum definition. By default values are based at zero and incremenet by
-1 sequentially.
-
-The effect of nested definitions on generated bindings varies depending on the
-target language. See [documentation for individual target languages](#Generated-Code-For-Target-Languages)
-
-### Constants
-
-Constants may be defined using the **const** keyword either directly within a
-module or within the namespace of some struct or interface:
-
-```
-module business.mojom;
-
-const string kServiceName = "business";
-
-struct Employee {
-  const uint64 kInvalidId = 0;
-
-  enum Type {
-    FULL_TIME,
-    PART_TIME,
-  };
-
-  uint64 id = kInvalidId;
-  Type type;
-};
-```
-
-The effect of nested definitions on generated bindings varies depending on the
-target language. See [documentation for individual target languages](#Generated-Code-For-Target-Languages)
-
-### Interfaces
-
-An **interface** is a logical bundle of parameterized request messages. Each
-request message may optionally define a parameterized response message. Here's
-syntax to define an interface `Foo` with various kinds of requests:
-
-```
-interface Foo {
-  // A request which takes no arguments and expects no response.
-  MyMessage();
-
-  // A request which has some arguments and expects no response.
-  MyOtherMessage(string name, array<uint8> bytes);
-
-  // A request which expects a single-argument response.
-  MyMessageWithResponse(string command) => (bool success);
-
-  // A request which expects a response with multiple arguments.
-  MyMessageWithMoarResponse(string a, string b) => (int8 c, int8 d);
-};
-```
-
-Anything which is a valid struct field type (see [Structs](#Structs)) is also a
-valid request or response argument type. The type notation is the same for both.
-
-### Attributes
-
-Mojom definitions may have their meaning altered by **attributes**, specified
-with a syntax similar to Java or C# attributes. There are a handle of
-interesting attributes supported today.
-
-**`[Sync]`**
-:   The `Sync` attribute may be specified for any interface method which expects
-    a response. This makes it so that callers of the method can wait
-    synchronously for a response. See
-    [Synchronous Calls](/mojo/public/cpp/bindings#Synchronous-Calls) in the C++
-    bindings documentation. Note that sync calls are not currently supported in
-    other target languages.
-
-**`[Extensible]`**
-:   The `Extensible` attribute may be specified for any enum definition. This
-    essentially disables builtin range validation when receiving values of the
-    enum type in a message, allowing older bindings to tolerate unrecognized
-    values from newer versions of the enum.
-
-**`[Native]`**
-:   The `Native` attribute may be specified for an empty struct declaration to
-    provide a nominal bridge between Mojo IPC and legacy `IPC::ParamTraits` or
-    `IPC_STRUCT_TRAITS*` macros.
-    See [Using Legacy IPC Traits](/ipc#Using-Legacy-IPC-Traits) for more
-    details. Note support for this attribute is strictly limited to C++ bindings
-    generation.
-
-**`[MinVersion=N]`**
-:   The `MinVersion` attribute is used to specify the version at which a given
-    field, enum value, interface method, or method parameter was introduced.
-    See [Versioning](#Versioning) for more details.
-
-## Generated Code For Target Languages
-
-When the bindings generator successfully processes an input Mojom file, it emits
-corresponding code for each supported target language. For more details on how
-Mojom concepts translate to a given target langauge, please refer to the
-bindings API documentation for that language:
-
-* [C++ Bindings](/mojo/public/cpp/bindings)
-* [JavaScript Bindings](/mojo/public/js)
-* [Java Bindings](/mojo/public/java/bindings)
-
-## Message Validation
-
-Regardless of target language, all interface messages are validated during
-deserialization before they are dispatched to a receiving implementation of the
-interface. This helps to ensure consitent validation across interfaces without
-leaving the burden to developers and security reviewers every time a new message
-is added.
-
-If a message fails validation, it is never dispatched. Instead a **connection
-error** is raised on the binding object (see
-[C++ Connection Errors](/mojo/public/cpp/bindings#Connection-Errors),
-[Java Connection Errors](/mojo/public/java/bindings#Connection-Errors), or
-[JavaScript Connection Errors](/mojo/public/js#Connection-Errors) for details.)
-
-Some baseline level of validation is done automatically for primitive Mojom
-types.
-
-### Non-Nullable Objects
-
-Mojom fields or parameter values (*e.g.*, structs, interfaces, arrays, *etc.*)
-may be marked nullable in Mojom definitions (see
-[Primitive Types](#Primitive-Types).) If a field or parameter is **not** marked
-nullable but a message is received with a null value in its place, that message
-will fail validation.
-
-### Enums
-
-Enums declared in Mojom are automatically validated against the range of legal
-values. For example if a Mojom declares the enum:
-
-``` cpp
-enum AdvancedBoolean {
-  TRUE = 0,
-  FALSE = 1,
-  FILE_NOT_FOUND = 2,
-};
-```
-
-and a message is received with the integral value 3 (or anything other than 0,
-1, or 2) in place of some `AdvancedBoolean` field or parameter, the message will
-fail validation.
-
-*** note
-NOTE: It's possible to avoid this type of validation error by explicitly marking
-an enum as [Extensible](#Attributes) if you anticipate your enum being exchanged
-between two different versions of the binding interface. See
-[Versioning](#Versioning).
-***
-
-### Other failures
-
-There are a  host of internal validation errors that may occur when a malformed
-message is received, but developers should not be concerned with these
-specifically; in general they can only result from internal bindings bugs,
-compromised processes, or some remote endpoint making a dubious effort to
-manually encode their own bindings messages.
-
-### Custom Validation
-
-It's also possible for developers to define custom validation logic for specific
-Mojom struct types by exploiting the
-[type mapping](/mojo/public/cpp/bindings#Type-Mapping) system for C++ bindings.
-Messages rejected by custom validation logic trigger the same validation failure
-behavior as the built-in type validation routines.
-
-## Associated Interfaces
-
-As mentioned in the [Primitive Types](#Primitive-Types) section above, interface
-and interface request fields and parameters may be marked as `associated`. This
-essentially means that they are piggy-backed on some other interface's message
-pipe.
-
-Because individual interface message pipes operate independently there can be no
-relative ordering guarantees among them. Associated interfaces are useful when
-one interface needs to guarantee strict FIFO ordering with respect to one or
-more other interfaces, as they allow interfaces to share a single pipe.
-
-Currenly associated interfaces are only supported in generated C++ bindings.
-See the documentation for
-[C++ Associated Interfaces](/mojo/public/cpp/bindings#Associated-Interfaces).
-
-## Versioning
-
-### Overview
-
-*** note
-**NOTE:** You don't need to worry about versioning if you don't care about
-backwards compatibility. Specifically, all parts of Chrome are updated
-atomically today and there is not yet any possibility of any two Chrome
-processes communicating with two different versions of any given Mojom
-interface.
-***
-
-Services extend their interfaces to support new features over time, and clients
-want to use those new features when they are available. If services and clients
-are not updated at the same time, it's important for them to be able to
-communicate with each other using different snapshots (versions) of their
-interfaces.
-
-This document shows how to extend Mojom interfaces in a backwards-compatible
-way. Changing interfaces in a non-backwards-compatible way is not discussed,
-because in that case communication between different interface versions is
-impossible anyway.
-
-### Versioned Structs
-
-You can use the `MinVersion` [attribute](#Attributes) to indicate from which
-version a struct field is introduced. Assume you have the following struct:
-
-``` cpp
-struct Employee {
-  uint64 employee_id;
-  string name;
-};
-```
-
-and you would like to add a birthday field. You can do:
-
-``` cpp
-struct Employee {
-  uint64 employee_id;
-  string name;
-  [MinVersion=1] Date? birthday;
-};
-```
-
-By default, fields belong to version 0. New fields must be appended to the
-struct definition (*i.e*., existing fields must not change **ordinal value**)
-with the `MinVersion` attribute set to a number greater than any previous
-existing versions.
-
-**Ordinal value** refers to the relative positional layout of a struct's fields
-(and an interface's methods) when encoded in a message. Implicitly, ordinal
-numbers are assigned to fields according to lexical position. In the example
-above, `employee_id` has an ordinal value of 0 and `name` has an ordinal value
-of 1.
-
-Ordinal values can be specified explicitly using `**@**` notation, subject to
-the following hard constraints:
-
-* For any given struct or interface, if any field or method explicitly specifies
-    an ordinal value, all fields or methods must explicitly specify an ordinal
-    value.
-* For an *N*-field struct or *N*-method interface, the set of explicitly
-    assigned ordinal values must be limited to the range *[0, N-1]*.
-
-You may reorder fields, but you must ensure that the ordinal values of existing
-fields remain unchanged. For example, the following struct remains
-backwards-compatible:
-
-``` cpp
-struct Employee {
-  uint64 employee_id@0;
-  [MinVersion=1] Date? birthday@2;
-  string name@1;
-};
-```
-
-*** note
-**NOTE:** Newly added fields of Mojo object or handle types MUST be nullable.
-See [Primitive Types](#Primitive-Types).
-***
-
-### Versioned Interfaces
-
-There are two dimensions on which an interface can be extended
-
-**Appending New Parameters To Existing Methods**
-:   Parameter lists are treated as structs internally, so all the rules of
-    versioned structs apply to method parameter lists. The only difference is
-    that the version number is scoped to the whole interface rather than to any
-    individual parameter list.
-
-    Please note that adding a response to a message which did not previously
-    expect a response is a not a backwards-compatible change.
-
-**Appending New Methods**
-:   Similarly, you can reorder methods with explicit ordinal values as long as
-    the ordinal values of existing methods are unchanged.
-
-For example:
-
-``` cpp
-// Old version:
-interface HumanResourceDatabase {
-  AddEmployee(Employee employee) => (bool success);
-  QueryEmployee(uint64 id) => (Employee? employee);
-};
-
-// New version:
-interface HumanResourceDatabase {
-  AddEmployee(Employee employee) => (bool success);
-
-  QueryEmployee(uint64 id, [MinVersion=1] bool retrieve_finger_print)
-      => (Employee? employee,
-          [MinVersion=1] array<uint8>? finger_print);
-
-  [MinVersion=1]
-  AttachFingerPrint(uint64 id, array<uint8> finger_print)
-      => (bool success);
-};
-```
-
-Similar to [versioned structs](#Versioned-Structs), when you pass the parameter
-list of a request or response method to a destination using an older version of
-an interface, unrecognized fields are silently discarded. However, if the method
-call itself is not recognized, it is considered a validation error and the
-receiver will close its end of the interface pipe. For example, if a client on
-version 1 of the above interface sends an `AttachFingerPrint` request to an
-implementation of version 0, the client will be disconnected.
-
-Bindings target languages that support versioning expose means to query or
-assert the remote version from a client handle (*e.g.*, an
-`InterfacePtr<T>` in C++ bindings.)
-
-See
-[C++ Versioning Considerations](/mojo/public/cpp/bindings#Versioning-Considerations)
-and [Java Versioning Considerations](/mojo/public/java/bindings#Versioning-Considerations)
-
-### Versioned Enums
-
-**By default, enums are non-extensible**, which means that generated message
-validation code does not expect to see new values in the future. When an unknown
-value is seen for a non-extensible enum field or parameter, a validation error
-is raised.
-
-If you want an enum to be extensible in the future, you can apply the
-`[Extensible]` [attribute](#Attributes):
-
-``` cpp
-[Extensible]
-enum Department {
-  SALES,
-  DEV,
-};
-```
-
-And later you can extend this enum without breaking backwards compatibility:
-
-``` cpp
-[Extensible]
-enum Department {
-  SALES,
-  DEV,
-  [MinVersion=1] RESEARCH,
-};
-```
-
-*** note
-**NOTE:** For versioned enum definitions, the use of a `[MinVersion]` attribute
-is strictly for documentation purposes. It has no impact on the generated code.
-***
-
-With extensible enums, bound interface implementations may receive unknown enum
-values and will need to deal with them gracefully. See
-[C++ Versioning Considerations](/mojo/public/cpp/bindings#Versioning-Considerations)
-for details.
-
-## Grammar Reference
-
-Below is the (BNF-ish) context-free grammar of the Mojom language:
-
-```
-MojomFile = StatementList
-StatementList = Statement StatementList | Statement
-Statement = ModuleStatement | ImportStatement | Definition
-
-ModuleStatement = AttributeSection "module" Identifier ";"
-ImportStatement = "import" StringLiteral ";"
-Definition = Struct Union Interface Enum Const
-
-AttributeSection = "[" AttributeList "]"
-AttributeList = <empty> | NonEmptyAttributeList
-NonEmptyAttributeList = Attribute
-                      | Attribute "," NonEmptyAttributeList
-Attribute = Name
-          | Name "=" Name
-          | Name "=" Literal
-
-Struct = AttributeSection "struct" Name "{" StructBody "}" ";"
-       | AttributeSection "struct" Name ";"
-StructBody = <empty>
-           | StructBody Const
-           | StructBody Enum
-           | StructBody StructField
-StructField = AttributeSection TypeSpec Name Orginal Default ";"
-
-Union = AttributeSection "union" Name "{" UnionBody "}" ";"
-UnionBody = <empty> | UnionBody UnionField
-UnionField = AttributeSection TypeSpec Name Ordinal ";"
-
-Interface = AttributeSection "interface" Name "{" InterfaceBody "}" ";"
-InterfaceBody = <empty>
-              | InterfaceBody Const
-              | InterfaceBody Enum
-              | InterfaceBody Method
-Method = AttributeSection Name Ordinal "(" ParamterList ")" Response ";"
-ParameterList = <empty> | NonEmptyParameterList
-NonEmptyParameterList = Parameter
-                      | Parameter "," NonEmptyParameterList
-Parameter = AttributeSection TypeSpec Name Ordinal
-Response = <empty> | "=>" "(" ParameterList ")"
-
-TypeSpec = TypeName "?" | TypeName
-TypeName = BasicTypeName
-         | Array
-         | FixedArray
-         | Map
-         | InterfaceRequest
-BasicTypeName = Identifier | "associated" Identifier | HandleType | NumericType
-NumericType = "bool" | "int8" | "uint8" | "int16" | "uint16" | "int32"
-            | "uint32" | "int64" | "uint64" | "float" | "double"
-HandleType = "handle" | "handle" "<" SpecificHandleType ">"
-SpecificHandleType = "message_pipe"
-                   | "shared_buffer"
-                   | "data_pipe_consumer"
-                   | "data_pipe_producer"
-Array = "array" "<" TypeSpec ">"
-FixedArray = "array" "<" TypeSpec "," IntConstDec ">"
-Map = "map" "<" Identifier "," TypeSpec ">"
-InterfaceRequest = Identifier "&" | "associated" Identifier "&"
-
-Ordinal = <empty> | OrdinalValue
-
-Default = <empty> | "=" Constant
-
-Enum = AttributeSection "enum" Name "{" NonEmptyEnumValueList "}" ";"
-     | AttributeSection "enum" Name "{" NonEmptyEnumValueList "," "}" ";"
-NonEmptyEnumValueList = EnumValue | NonEmptyEnumValueList "," EnumValue
-EnumValue = AttributeSection Name
-          | AttributeSection Name "=" Integer
-          | AttributeSection Name "=" Identifier
-
-Const = "const" TypeSpec Name "=" Constant ";"
-
-Constant = Literal | Identifier ";"
-
-Identifier = Name | Name "." Identifier
-
-Literal = Integer | Float | "true" | "false" | "default" | StringLiteral
-
-Integer = IntConst | "+" IntConst | "-" IntConst
-IntConst = IntConstDec | IntConstHex
-
-Float = FloatConst | "+" FloatConst | "-" FloatConst
-
-; The rules below are for tokens matched strictly according to the given regexes
-
-Identifier = /[a-zA-Z_][0-9a-zA-Z_]*/
-IntConstDec = /0|(1-9[0-9]*)/
-IntConstHex = /0[xX][0-9a-fA-F]+/
-OrdinalValue = /@(0|(1-9[0-9]*))/
-FloatConst = ... # Imagine it's close enough to C-style float syntax.
-StringLiteral = ... # Imagine it's close enough to C-style string literals, including escapes.
-```
-
-## Additional Documentation
-
-[Mojom Message Format](https://docs.google.com/document/d/13pv9cFh5YKuBggDBQ1-AL8VReF-IYpFOFpRfvWFrwio/edit)
-:    Describes the wire format used by Mojo bindings interfaces over message
-     pipes.
-
-[Input Format of Mojom Message Validation Tests](https://docs.google.com/document/d/1-y-2IYctyX2NPaLxJjpJfzVNWCC2SR2MJAD9MpIytHQ/edit)
-:    Describes a text format used to facilitate bindings message validation
-     tests.
diff --git a/mojo/public/tools/bindings/blink_bindings_configuration.gni b/mojo/public/tools/bindings/blink_bindings_configuration.gni
deleted file mode 100644
index bb0fc43..0000000
--- a/mojo/public/tools/bindings/blink_bindings_configuration.gni
+++ /dev/null
@@ -1,33 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-variant = "blink"
-
-for_blink = true
-
-_typemap_imports = [
-  "//mojo/public/cpp/bindings/tests/blink_typemaps.gni",
-  "//third_party/WebKit/Source/platform/mojo/blink_typemaps.gni",
-  "//third_party/WebKit/public/blink_typemaps.gni",
-  "//third_party/WebKit/public/public_typemaps.gni",
-]
-_typemaps = []
-
-foreach(typemap_import, _typemap_imports) {
-  # Avoid reassignment error by assigning to empty scope first.
-  _imported = {
-  }
-  _imported = read_file(typemap_import, "scope")
-  _typemaps += _imported.typemaps
-}
-
-typemaps = []
-foreach(typemap, _typemaps) {
-  typemaps += [ {
-        filename = typemap
-        config = read_file(typemap, "scope")
-      } ]
-}
-
-blacklist = []
diff --git a/mojo/public/tools/bindings/chromium_bindings_configuration.gni b/mojo/public/tools/bindings/chromium_bindings_configuration.gni
deleted file mode 100644
index ca36723..0000000
--- a/mojo/public/tools/bindings/chromium_bindings_configuration.gni
+++ /dev/null
@@ -1,83 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-_typemap_imports = [
-  "//ash/public/interfaces/typemaps.gni",
-  "//cc/ipc/typemaps.gni",
-  "//chrome/browser/media/router/mojo/typemaps.gni",
-  "//chrome/common/extensions/typemaps.gni",
-  "//chrome/common/importer/typemaps.gni",
-  "//chrome/typemaps.gni",
-  "//components/arc/common/typemaps.gni",
-  "//components/metrics/public/cpp/typemaps.gni",
-  "//components/typemaps.gni",
-  "//content/common/bluetooth/typemaps.gni",
-  "//content/common/indexed_db/typemaps.gni",
-  "//content/common/presentation/typemaps.gni",
-  "//content/common/typemaps.gni",
-  "//content/public/common/typemaps.gni",
-  "//device/bluetooth/public/interfaces/typemaps.gni",
-  "//device/gamepad/public/interfaces/typemaps.gni",
-  "//device/generic_sensor/public/interfaces/typemaps.gni",
-  "//device/usb/public/interfaces/typemaps.gni",
-  "//extensions/common/typemaps.gni",
-  "//gpu/ipc/common/typemaps.gni",
-  "//media/capture/mojo/typemaps.gni",
-  "//media/mojo/interfaces/typemaps.gni",
-  "//mojo/common/typemaps.gni",
-  "//mojo/public/cpp/bindings/tests/chromium_typemaps.gni",
-  "//net/interfaces/typemaps.gni",
-  "//services/preferences/public/cpp/typemaps.gni",
-  "//services/resource_coordinator/public/cpp/typemaps.gni",
-  "//services/service_manager/public/cpp/typemaps.gni",
-  "//services/ui/gpu/interfaces/typemaps.gni",
-  "//services/ui/public/interfaces/cursor/typemaps.gni",
-  "//services/ui/public/interfaces/ime/typemaps.gni",
-  "//services/video_capture/public/interfaces/typemaps.gni",
-  "//skia/public/interfaces/typemaps.gni",
-  "//third_party/WebKit/public/public_typemaps.gni",
-  "//ui/base/mojo/typemaps.gni",
-  "//ui/display/mojo/typemaps.gni",
-  "//ui/events/devices/mojo/typemaps.gni",
-  "//ui/events/mojo/typemaps.gni",
-  "//ui/gfx/typemaps.gni",
-  "//ui/latency/mojo/typemaps.gni",
-  "//ui/message_center/mojo/typemaps.gni",
-  "//url/mojo/typemaps.gni",
-]
-
-_typemap_imports_mac = [ "//content/common/typemaps_mac.gni" ]
-
-_typemaps = []
-foreach(typemap_import, _typemap_imports) {
-  # Avoid reassignment error by assigning to empty scope first.
-  _imported = {
-  }
-  _imported = read_file(typemap_import, "scope")
-  _typemaps += _imported.typemaps
-}
-
-typemaps = []
-foreach(typemap, _typemaps) {
-  typemaps += [ {
-        filename = typemap
-        config = read_file(typemap, "scope")
-      } ]
-}
-
-_typemaps_mac = []
-foreach(typemap_import, _typemap_imports_mac) {
-  _imported = {
-  }
-  _imported = read_file(typemap_import, "scope")
-  _typemaps_mac += _imported.typemaps
-}
-
-typemaps_mac = []
-foreach(typemap, _typemaps_mac) {
-  typemaps_mac += [ {
-        filename = typemap
-        config = read_file(typemap, "scope")
-      } ]
-}
diff --git a/mojo/public/tools/bindings/format_typemap_generator_args.py b/mojo/public/tools/bindings/format_typemap_generator_args.py
deleted file mode 100755
index 5057d6c..0000000
--- a/mojo/public/tools/bindings/format_typemap_generator_args.py
+++ /dev/null
@@ -1,34 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import sys
-
-# This utility converts mojom dependencies into their corresponding typemap
-# paths and formats them to be consumed by generate_type_mappings.py.
-
-
-def FormatTypemap(typemap_filename):
-  # A simple typemap is valid Python with a minor alteration.
-  with open(typemap_filename) as f:
-    typemap_content = f.read().replace('=\n', '=')
-  typemap = {}
-  exec typemap_content in typemap
-
-  for header in typemap.get('public_headers', []):
-    yield 'public_headers=%s' % header
-  for header in typemap.get('traits_headers', []):
-    yield 'traits_headers=%s' % header
-  for header in typemap.get('type_mappings', []):
-    yield 'type_mappings=%s' % header
-
-
-def main():
-  typemaps = sys.argv[1:]
-  print ' '.join('--start-typemap %s' % ' '.join(FormatTypemap(typemap))
-                 for typemap in typemaps)
-
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/mojo/public/tools/bindings/generate_type_mappings.py b/mojo/public/tools/bindings/generate_type_mappings.py
deleted file mode 100755
index 824f804..0000000
--- a/mojo/public/tools/bindings/generate_type_mappings.py
+++ /dev/null
@@ -1,148 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""Generates a JSON typemap from its command-line arguments and dependencies.
-
-Each typemap should be specified in an command-line argument of the form
-key=value, with an argument of "--start-typemap" preceding each typemap.
-
-For example,
-generate_type_mappings.py --output=foo.typemap --start-typemap \\
-    public_headers=foo.h traits_headers=foo_traits.h \\
-    type_mappings=mojom.Foo=FooImpl
-
-generates a foo.typemap containing
-{
-  "c++": {
-    "mojom.Foo": {
-      "typename": "FooImpl",
-      "traits_headers": [
-        "foo_traits.h"
-      ],
-      "public_headers": [
-        "foo.h"
-      ]
-    }
-  }
-}
-
-Then,
-generate_type_mappings.py --dependency foo.typemap --output=bar.typemap \\
-    --start-typemap public_headers=bar.h traits_headers=bar_traits.h \\
-    type_mappings=mojom.Bar=BarImpl
-
-generates a bar.typemap containing
-{
-  "c++": {
-    "mojom.Bar": {
-      "typename": "BarImpl",
-      "traits_headers": [
-        "bar_traits.h"
-      ],
-      "public_headers": [
-        "bar.h"
-      ]
-    },
-    "mojom.Foo": {
-      "typename": "FooImpl",
-      "traits_headers": [
-        "foo_traits.h"
-      ],
-      "public_headers": [
-        "foo.h"
-      ]
-    }
-  }
-}
-"""
-
-import argparse
-import json
-import os
-import re
-
-
-def ReadTypemap(path):
-  with open(path) as f:
-    return json.load(f)['c++']
-
-
-def ParseTypemapArgs(args):
-  typemaps = [s for s in '\n'.join(args).split('--start-typemap\n') if s]
-  result = {}
-  for typemap in typemaps:
-    result.update(ParseTypemap(typemap))
-  return result
-
-
-def ParseTypemap(typemap):
-  values = {'type_mappings': [], 'public_headers': [], 'traits_headers': []}
-  for line in typemap.split('\n'):
-    if not line:
-      continue
-    key, _, value = line.partition('=')
-    values[key].append(value.lstrip('/'))
-  result = {}
-  mapping_pattern = \
-      re.compile(r"""^([^=]+)           # mojom type
-                     =
-                     ([^[]+)            # native type
-                     (?:\[([^]]+)\])?$  # optional attribute in square brackets
-                 """, re.X)
-  for typename in values['type_mappings']:
-    match_result = mapping_pattern.match(typename)
-    assert match_result, (
-        "Cannot parse entry in the \"type_mappings\" section: %s" % typename)
-
-    mojom_type = match_result.group(1)
-    native_type = match_result.group(2)
-    attributes = []
-    if match_result.group(3):
-      attributes = match_result.group(3).split(',')
-
-    assert mojom_type not in result, (
-        "Cannot map multiple native types (%s, %s) to the same mojom type: %s" %
-        (result[mojom_type]['typename'], native_type, mojom_type))
-
-    result[mojom_type] = {
-        'typename': native_type,
-        'non_copyable_non_movable': 'non_copyable_non_movable' in attributes,
-        'move_only': 'move_only' in attributes,
-        'copyable_pass_by_value': 'copyable_pass_by_value' in attributes,
-        'nullable_is_same_type': 'nullable_is_same_type' in attributes,
-        'hashable': 'hashable' in attributes,
-        'public_headers': values['public_headers'],
-        'traits_headers': values['traits_headers'],
-    }
-  return result
-
-
-def main():
-  parser = argparse.ArgumentParser(
-      description=__doc__,
-      formatter_class=argparse.RawDescriptionHelpFormatter)
-  parser.add_argument(
-      '--dependency',
-      type=str,
-      action='append',
-      default=[],
-      help=('A path to another JSON typemap to merge into the output. '
-            'This may be repeated to merge multiple typemaps.'))
-  parser.add_argument('--output',
-                      type=str,
-                      required=True,
-                      help='The path to which to write the generated JSON.')
-  params, typemap_params = parser.parse_known_args()
-  typemaps = ParseTypemapArgs(typemap_params)
-  missing = [path for path in params.dependency if not os.path.exists(path)]
-  if missing:
-    raise IOError('Missing dependencies: %s' % ', '.join(missing))
-  for path in params.dependency:
-    typemaps.update(ReadTypemap(path))
-  with open(params.output, 'w') as f:
-    json.dump({'c++': typemaps}, f, indent=2)
-
-
-if __name__ == '__main__':
-  main()
diff --git a/mojo/public/tools/bindings/generators/__init__.py b/mojo/public/tools/bindings/generators/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/mojo/public/tools/bindings/generators/__init__.py
+++ /dev/null
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/enum_macros.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/enum_macros.tmpl
deleted file mode 100644
index f0d503e..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/enum_macros.tmpl
+++ /dev/null
@@ -1,131 +0,0 @@
-{#---
-  Macro for enum definition, and the declaration of associated functions.
----#}
-
-{%- macro enum_decl(enum) %}
-{%-   set enum_name = enum|get_name_for_kind(flatten_nested_kind=True) %}
-enum class {{enum_name}} : int32_t {
-{%-   for field in enum.fields %}
-{%-     if field.value %}
-  {{field.name}} = {{field.value|expression_to_text}},
-{%-     else %}
-  {{field.name}},
-{%-     endif %}
-{%-   endfor %}
-};
-
-inline std::ostream& operator<<(std::ostream& os, {{enum_name}} value) {
-{%- if enum.fields %}
-  switch(value) {
-{%-   for _, values in enum.fields|groupby('numeric_value') %}
-    case {{enum_name}}::{{values[0].name}}:
-      return os << "{{enum_name}}::
-{%-     if values|length > 1 -%}
-      {{'{'}}
-{%-     endif -%}
-      {{values|map(attribute='name')|join(', ')}}
-{%-     if values|length > 1 -%}
-      {{'}'}}
-{%-     endif -%}
-      ";
-{%-   endfor %}
-    default:
-      return os << "Unknown {{enum_name}} value: " << static_cast<int32_t>(value);
-  }
-{%- else %}
-  return os << "Unknown {{enum_name}} value: " << static_cast<int32_t>(value);
-{%- endif %}
-}
-
-{#-   Returns true if the given enum value exists in this version of enum. #}
-inline bool IsKnownEnumValue({{enum_name}} value) {
-  return {{enum|get_name_for_kind(internal=True,
-                                  flatten_nested_kind=True)}}::IsKnownValue(
-      static_cast<int32_t>(value));
-}
-{%- endmacro %}
-
-{%- macro enum_data_decl(enum) %}
-{%-   set enum_name = enum|get_name_for_kind(flatten_nested_kind=True) %}
-struct {{enum_name}}_Data {
- public:
-  static bool constexpr kIsExtensible = {% if enum.extensible %}true{% else %}false{% endif %};
-
-  static bool IsKnownValue(int32_t value) {
-{%- if enum.fields %}
-    switch (value) {
-{%-   for enum_field in enum.fields|groupby('numeric_value') %}
-      case {{enum_field[0]}}:
-{%-   endfor %}
-        return true;
-    }
-{%- endif %}
-    return false;
-  }
-
-  static bool Validate(int32_t value,
-                       mojo::internal::ValidationContext* validation_context) {
-    if (kIsExtensible || IsKnownValue(value))
-      return true;
-
-    ReportValidationError(validation_context,
-                          mojo::internal::VALIDATION_ERROR_UNKNOWN_ENUM_VALUE);
-    return false;
-  }
-};
-{%- endmacro %}
-
-{%- macro enum_hash(enum) %}
-{%-   set enum_name = enum|get_qualified_name_for_kind(
-          flatten_nested_kind=True) %}
-template <>
-struct hash<{{enum_name}}>
-    : public mojo::internal::EnumHashImpl<{{enum_name}}> {};
-{%- endmacro %}
-
-{%- macro enum_hash_blink(enum) %}
-{%-   set enum_name = enum|get_qualified_name_for_kind(
-          flatten_nested_kind=True, include_variant=False) %}
-{%-   set hash_fn_name = enum|wtf_hash_fn_name_for_enum %}
-{#    We need two unused enum values: #}
-{%-   set empty_value = -1000000 %}
-{%-   set deleted_value = -1000001 %}
-{%-   set empty_value_unused = "false" if empty_value in enum|all_enum_values else "true" %}
-{%-   set deleted_value_unused = "false" if empty_value in enum|all_enum_values else "true" %}
-namespace WTF {
-struct {{hash_fn_name}} {
-  static unsigned hash(const {{enum_name}}& value) {
-    typedef base::underlying_type<{{enum_name}}>::type utype;
-    return DefaultHash<utype>::Hash().hash(static_cast<utype>(value));
-  }
-  static bool equal(const {{enum_name}}& left, const {{enum_name}}& right) {
-    return left == right;
-  }
-  static const bool safeToCompareToEmptyOrDeleted = true;
-};
-
-template <>
-struct DefaultHash<{{enum_name}}> {
-  using Hash = {{hash_fn_name}};
-};
-
-template <>
-struct HashTraits<{{enum_name}}>
-    : public GenericHashTraits<{{enum_name}}> {
-  static_assert({{empty_value_unused}},
-                "{{empty_value}} is a reserved enum value");
-  static_assert({{deleted_value_unused}},
-                "{{deleted_value}} is a reserved enum value");
-  static const bool hasIsEmptyValueFunction = true;
-  static bool isEmptyValue(const {{enum_name}}& value) {
-    return value == static_cast<{{enum_name}}>({{empty_value}});
-  }
-  static void constructDeletedValue({{enum_name}}& slot, bool) {
-    slot = static_cast<{{enum_name}}>({{deleted_value}});
-  }
-  static bool isDeletedValue(const {{enum_name}}& value) {
-    return value == static_cast<{{enum_name}}>({{deleted_value}});
-  }
-};
-}  // namespace WTF
-{%- endmacro %}
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/enum_serialization_declaration.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/enum_serialization_declaration.tmpl
deleted file mode 100644
index d7d0e5d..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/enum_serialization_declaration.tmpl
+++ /dev/null
@@ -1,29 +0,0 @@
-{%- set mojom_type = enum|get_qualified_name_for_kind(
-        flatten_nested_kind=True) %}
-
-template <>
-struct EnumTraits<{{mojom_type}}, {{mojom_type}}> {
-  static {{mojom_type}} ToMojom({{mojom_type}} input) { return input; }
-  static bool FromMojom({{mojom_type}} input, {{mojom_type}}* output) {
-    *output = input;
-    return true;
-  }
-};
-
-namespace internal {
-
-template <typename MaybeConstUserType>
-struct Serializer<{{mojom_type}}, MaybeConstUserType> {
-  using UserType = typename std::remove_const<MaybeConstUserType>::type;
-  using Traits = EnumTraits<{{mojom_type}}, UserType>;
-
-  static void Serialize(UserType input, int32_t* output) {
-    *output = static_cast<int32_t>(Traits::ToMojom(input));
-  }
-
-  static bool Deserialize(int32_t input, UserType* output) {
-    return Traits::FromMojom(static_cast<{{mojom_type}}>(input), output);
-  }
-};
-
-}  // namespace internal
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/interface_declaration.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/interface_declaration.tmpl
deleted file mode 100644
index 7f64974..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/interface_declaration.tmpl
+++ /dev/null
@@ -1,65 +0,0 @@
-{%- import "interface_macros.tmpl" as interface_macros %}
-class {{interface.name}}Proxy;
-
-template <typename ImplRefTraits>
-class {{interface.name}}Stub;
-
-class {{interface.name}}RequestValidator;
-{%- if interface|has_callbacks %}
-class {{interface.name}}ResponseValidator;
-{%- endif %}
-
-class {{export_attribute}} {{interface.name}}
-    : public {{interface.name}}InterfaceBase {
- public:
-  static const char Name_[];
-  static constexpr uint32_t Version_ = {{interface.version}};
-  static constexpr bool PassesAssociatedKinds_ = {% if interface|passes_associated_kinds %}true{% else %}false{% endif %};
-  static constexpr bool HasSyncMethods_ = {% if interface|has_sync_methods %}true{% else %}false{% endif %};
-
-  using Proxy_ = {{interface.name}}Proxy;
-
-  template <typename ImplRefTraits>
-  using Stub_ = {{interface.name}}Stub<ImplRefTraits>;
-
-  using RequestValidator_ = {{interface.name}}RequestValidator;
-{%- if interface|has_callbacks %}
-  using ResponseValidator_ = {{interface.name}}ResponseValidator;
-{%- else %}
-  using ResponseValidator_ = mojo::PassThroughFilter;
-{%- endif %}
-
-{#--- Metadata #}
-  enum MethodMinVersions : uint32_t {
-{%- for method in interface.methods %}
-    k{{method.name}}MinVersion = {{method.min_version|default(0, true)}},
-{%- endfor %}
-  };
-
-{#--- Enums #}
-{%- for enum in interface.enums %}
-  using {{enum.name}} = {{enum|get_name_for_kind(flatten_nested_kind=True)}};
-{%- endfor %}
-
-{#--- Constants #}
-{%- for constant in interface.constants %}
-  static {{constant|format_constant_declaration(nested=True)}};
-{%- endfor %}
-
-{#--- Methods #}
-  virtual ~{{interface.name}}() {}
-
-{%- for method in interface.methods %}
-{%    if method.response_parameters != None %}
-{%-     if method.sync %}
-  // Sync method. This signature is used by the client side; the service side
-  // should implement the signature with callback below.
-  virtual bool {{method.name}}({{interface_macros.declare_sync_method_params("", method)}});
-{%-     endif %}
-
-  using {{method.name}}Callback = {{interface_macros.declare_callback(method,
-      for_blink, use_once_callback)}};
-{%-   endif %}
-  virtual void {{method.name}}({{interface_macros.declare_request_params("", method, use_once_callback)}}) = 0;
-{%- endfor %}
-};
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl
deleted file mode 100644
index aba1838..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl
+++ /dev/null
@@ -1,448 +0,0 @@
-{%- import "interface_macros.tmpl" as interface_macros %}
-{%- import "struct_macros.tmpl" as struct_macros %}
-
-{%- set class_name = interface.name %}
-{%- set proxy_name = interface.name ~ "Proxy" %}
-{%- set namespace_as_string = "%s"|format(namespace|replace(".","::")) %}
-
-{%- macro alloc_params(struct, params, message, description) %}
-  mojo::internal::SerializationContext serialization_context;
-  serialization_context.handles.Swap(({{message}})->mutable_handles());
-  serialization_context.associated_endpoint_handles.swap(
-      *({{message}})->mutable_associated_endpoint_handles());
-  bool success = true;
-{%-   for param in struct.packed.packed_fields_in_ordinal_order %}
-  {{param.field.kind|cpp_wrapper_type}} p_{{param.field.name}}{};
-{%-   endfor %}
-  {{struct.name}}DataView input_data_view({{params}}, &serialization_context);
-  {{struct_macros.deserialize(struct, "input_data_view", "p_%s", "success")}}
-  if (!success) {
-    ReportValidationErrorForMessage(
-        {{message}},
-        mojo::internal::VALIDATION_ERROR_DESERIALIZATION_FAILED,
-        "{{description}} deserializer");
-    return false;
-  }
-{%- endmacro %}
-
-{%- macro pass_params(parameters) %}
-{%-   for param in parameters %}
-std::move(p_{{param.name}})
-{%-     if not loop.last %}, {% endif %}
-{%-   endfor %}
-{%- endmacro %}
-
-{%- macro build_message(struct, input_pattern, struct_display_name,
-                        serialization_context) -%}
-  {{struct_macros.serialize(struct, struct_display_name, input_pattern,
-                            "params", "builder.buffer()",
-                            serialization_context)}}
-  ({{serialization_context}})->handles.Swap(
-      builder.message()->mutable_handles());
-  ({{serialization_context}})->associated_endpoint_handles.swap(
-      *builder.message()->mutable_associated_endpoint_handles());
-{%- endmacro %}
-
-{#--- Begin #}
-const char {{class_name}}::Name_[] = "{{namespace_as_string}}::{{class_name}}";
-
-{#--- Constants #}
-{%-  for constant in interface.constants %}
-{%-   if constant.kind|is_string_kind %}
-const char {{interface.name}}::{{constant.name}}[] = {{constant|constant_value}};
-{%-   endif %}
-{%- endfor %}
-
-
-{%- for method in interface.methods %}
-{%-   if method.sync %}
-bool {{class_name}}::{{method.name}}({{interface_macros.declare_sync_method_params("", method)}}) {
-  NOTREACHED();
-  return false;
-}
-{%-   endif %}
-{%- endfor %}
-
-{#--- ForwardToCallback definition #}
-{%- for method in interface.methods -%}
-{%-   if method.response_parameters != None %}
-{%-     if method.sync %}
-class {{class_name}}_{{method.name}}_HandleSyncResponse
-    : public mojo::MessageReceiver {
- public:
-  {{class_name}}_{{method.name}}_HandleSyncResponse(
-      bool* result
-{%-       for param in method.response_parameters -%}
-      , {{param.kind|cpp_wrapper_type}}* out_{{param.name}}
-{%-       endfor %})
-      : result_(result)
-{%-       for param in method.response_parameters -%}
-        , out_{{param.name}}_(out_{{param.name}})
-{%-       endfor %} {
-    DCHECK(!*result_);
-  }
-  bool Accept(mojo::Message* message) override;
- private:
-  bool* result_;
-{%-       for param in method.response_parameters %}
-  {{param.kind|cpp_wrapper_type}}* out_{{param.name}}_;
-{%-       endfor -%}
-  DISALLOW_COPY_AND_ASSIGN({{class_name}}_{{method.name}}_HandleSyncResponse);
-};
-bool {{class_name}}_{{method.name}}_HandleSyncResponse::Accept(
-    mojo::Message* message) {
-  internal::{{class_name}}_{{method.name}}_ResponseParams_Data* params =
-      reinterpret_cast<internal::{{class_name}}_{{method.name}}_ResponseParams_Data*>(
-          message->mutable_payload());
-
-{%-       set desc = class_name~"::"~method.name~" response" %}
-  {{alloc_params(method.response_param_struct, "params", "message", desc)}}
-
-{%-       for param in method.response_parameters %}
-  *out_{{param.name}}_ = std::move(p_{{param.name}});
-{%-       endfor %}
-  mojo::internal::SyncMessageResponseSetup::SetCurrentSyncResponseMessage(
-      message);
-  *result_ = true;
-  return true;
-}
-{%-     endif %}
-
-class {{class_name}}_{{method.name}}_ForwardToCallback
-    : public mojo::MessageReceiver {
- public:
-  {{class_name}}_{{method.name}}_ForwardToCallback(
-{%-     if use_once_callback %}
-      {{class_name}}::{{method.name}}Callback callback
-{%-     else %}
-      const {{class_name}}::{{method.name}}Callback& callback
-{%-     endif %}
-      ) : callback_(std::move(callback)) {
-  }
-  bool Accept(mojo::Message* message) override;
- private:
-  {{class_name}}::{{method.name}}Callback callback_;
-  DISALLOW_COPY_AND_ASSIGN({{class_name}}_{{method.name}}_ForwardToCallback);
-};
-bool {{class_name}}_{{method.name}}_ForwardToCallback::Accept(
-    mojo::Message* message) {
-  internal::{{class_name}}_{{method.name}}_ResponseParams_Data* params =
-      reinterpret_cast<internal::{{class_name}}_{{method.name}}_ResponseParams_Data*>(
-          message->mutable_payload());
-
-{%-     set desc = class_name~"::"~method.name~" response" %}
-  {{alloc_params(method.response_param_struct, "params", "message", desc)}}
-  if (!callback_.is_null()) {
-    mojo::internal::MessageDispatchContext context(message);
-    std::move(callback_).Run({{pass_params(method.response_parameters)}});
-  }
-  return true;
-}
-{%-   endif %}
-{%- endfor %}
-
-{{proxy_name}}::{{proxy_name}}(mojo::MessageReceiverWithResponder* receiver)
-    : receiver_(receiver) {
-}
-
-{#--- Proxy definitions #}
-
-{%- for method in interface.methods %}
-{%-   set message_name =
-          "internal::k%s_%s_Name"|format(interface.name, method.name) %}
-{%-   set params_struct = method.param_struct %}
-{%-   set params_description =
-          "%s.%s request"|format(interface.name, method.name) %}
-{%-   if method.sync %}
-bool {{proxy_name}}::{{method.name}}(
-    {{interface_macros.declare_sync_method_params("param_", method)}}) {
-  mojo::internal::SerializationContext serialization_context;
-  {{struct_macros.get_serialized_size(params_struct, "param_%s",
-                                      "&serialization_context")}}
-
-  mojo::internal::MessageBuilder builder(
-      {{message_name}},
-      mojo::Message::kFlagIsSync | mojo::Message::kFlagExpectsResponse,
-      size, serialization_context.associated_endpoint_count);
-
-  {{build_message(params_struct, "param_%s", params_description,
-                  "&serialization_context")}}
-
-  bool result = false;
-  std::unique_ptr<mojo::MessageReceiver> responder(
-      new {{class_name}}_{{method.name}}_HandleSyncResponse(
-          &result
-{%-     for param in method.response_parameters -%}
-          , param_{{param.name}}
-{%-     endfor %}));
-  ignore_result(receiver_->AcceptWithResponder(builder.message(),
-                                               std::move(responder)));
-  return result;
-}
-{%-   endif %}
-
-void {{proxy_name}}::{{method.name}}(
-    {{interface_macros.declare_request_params("in_", method, use_once_callback)}}) {
-  mojo::internal::SerializationContext serialization_context;
-  {{struct_macros.get_serialized_size(params_struct, "in_%s",
-                                      "&serialization_context")}}
-
-{%- if method.response_parameters != None %}
-  constexpr uint32_t kFlags = mojo::Message::kFlagExpectsResponse;
-{%- else %}
-  constexpr uint32_t kFlags = 0;
-{%- endif %}
-  mojo::internal::MessageBuilder builder(
-      {{message_name}}, kFlags, size,
-      serialization_context.associated_endpoint_count);
-
-  {{build_message(params_struct, "in_%s", params_description,
-                  "&serialization_context")}}
-
-{%- if method.response_parameters != None %}
-  std::unique_ptr<mojo::MessageReceiver> responder(
-      new {{class_name}}_{{method.name}}_ForwardToCallback(
-          std::move(callback)));
-  ignore_result(receiver_->AcceptWithResponder(builder.message(),
-                                               std::move(responder)));
-{%- else %}
-  // This return value may be ignored as false implies the Connector has
-  // encountered an error, which will be visible through other means.
-  ignore_result(receiver_->Accept(builder.message()));
-{%- endif %}
-}
-{%- endfor %}
-
-{#--- ProxyToResponder definition #}
-{%- for method in interface.methods -%}
-{%-   if method.response_parameters != None %}
-{%-     set message_name =
-            "internal::k%s_%s_Name"|format(interface.name, method.name) %}
-{%-     set response_params_struct = method.response_param_struct %}
-{%-     set params_description =
-            "%s.%s response"|format(interface.name, method.name) %}
-class {{class_name}}_{{method.name}}_ProxyToResponder {
- public:
-  static {{class_name}}::{{method.name}}Callback CreateCallback(
-      uint64_t request_id,
-      bool is_sync,
-      std::unique_ptr<mojo::MessageReceiverWithStatus> responder) {
-    std::unique_ptr<{{class_name}}_{{method.name}}_ProxyToResponder> proxy(
-        new {{class_name}}_{{method.name}}_ProxyToResponder(
-            request_id, is_sync, std::move(responder)));
-    return base::Bind(&{{class_name}}_{{method.name}}_ProxyToResponder::Run,
-                      base::Passed(&proxy));
-  }
-
-  ~{{class_name}}_{{method.name}}_ProxyToResponder() {
-#if DCHECK_IS_ON()
-    if (responder_) {
-      // Is the Service destroying the callback without running it
-      // and without first closing the pipe?
-      responder_->DCheckInvalid("The callback passed to "
-          "{{class_name}}::{{method.name}}() was never run.");
-    }
-#endif
-    // If the Callback was dropped then deleting the responder will close
-    // the pipe so the calling application knows to stop waiting for a reply.
-    responder_ = nullptr;
-  }
-
- private:
-  {{class_name}}_{{method.name}}_ProxyToResponder(
-      uint64_t request_id,
-      bool is_sync,
-      std::unique_ptr<mojo::MessageReceiverWithStatus> responder)
-      : request_id_(request_id),
-        is_sync_(is_sync),
-        responder_(std::move(responder)) {
-  }
-
-  void Run(
-      {{interface_macros.declare_responder_params(
-          "in_", method.response_parameters, for_blink)}});
-
-  uint64_t request_id_;
-  bool is_sync_;
-  std::unique_ptr<mojo::MessageReceiverWithStatus> responder_;
-
-  DISALLOW_COPY_AND_ASSIGN({{class_name}}_{{method.name}}_ProxyToResponder);
-};
-
-void {{class_name}}_{{method.name}}_ProxyToResponder::Run(
-    {{interface_macros.declare_responder_params(
-        "in_", method.response_parameters, for_blink)}}) {
-  mojo::internal::SerializationContext serialization_context;
-  {{struct_macros.get_serialized_size(response_params_struct, "in_%s",
-                                      "&serialization_context")}}
-
-  uint32_t flags = (is_sync_ ? mojo::Message::kFlagIsSync : 0) |
-                   mojo::Message::kFlagIsResponse;
-  mojo::internal::MessageBuilder builder(
-      {{message_name}}, flags, size,
-      serialization_context.associated_endpoint_count);
-  builder.message()->set_request_id(request_id_);
-
-  {{build_message(response_params_struct, "in_%s", params_description,
-                  "&serialization_context")}}
-  ignore_result(responder_->Accept(builder.message()));
-  // TODO(darin): Accept() returning false indicates a malformed message, and
-  // that may be good reason to close the connection. However, we don't have a
-  // way to do that from here. We should add a way.
-  responder_ = nullptr;
-}
-{%-   endif -%}
-{%- endfor %}
-
-{#--- StubDispatch definition #}
-
-// static
-bool {{class_name}}StubDispatch::Accept(
-    {{interface.name}}* impl,
-    mojo::Message* message) {
-{%- if interface.methods %}
-  switch (message->header()->name) {
-{%-   for method in interface.methods %}
-    case internal::k{{class_name}}_{{method.name}}_Name: {
-{%-     if method.response_parameters == None %}
-      internal::{{class_name}}_{{method.name}}_Params_Data* params =
-          reinterpret_cast<internal::{{class_name}}_{{method.name}}_Params_Data*>(
-              message->mutable_payload());
-
-{%-       set desc = class_name~"::"~method.name %}
-      {{alloc_params(method.param_struct, "params", "message", desc)|
-          indent(4)}}
-      // A null |impl| means no implementation was bound.
-      assert(impl);
-      TRACE_EVENT0("mojom", "{{class_name}}::{{method.name}}");
-      mojo::internal::MessageDispatchContext context(message);
-      impl->{{method.name}}({{pass_params(method.parameters)}});
-      return true;
-{%-     else %}
-      break;
-{%-     endif %}
-    }
-{%-   endfor %}
-  }
-{%- endif %}
-  return false;
-}
-
-// static
-bool {{class_name}}StubDispatch::AcceptWithResponder(
-    {{interface.name}}* impl,
-    mojo::Message* message,
-    std::unique_ptr<mojo::MessageReceiverWithStatus> responder) {
-{%- if interface.methods %}
-  switch (message->header()->name) {
-{%-   for method in interface.methods %}
-    case internal::k{{class_name}}_{{method.name}}_Name: {
-{%-     if method.response_parameters != None %}
-      internal::{{class_name}}_{{method.name}}_Params_Data* params =
-          reinterpret_cast<internal::{{class_name}}_{{method.name}}_Params_Data*>(
-              message->mutable_payload());
-
-{%-       set desc = class_name~"::"~method.name %}
-      {{alloc_params(method.param_struct, "params", "message", desc)|
-          indent(4)}}
-      {{class_name}}::{{method.name}}Callback callback =
-          {{class_name}}_{{method.name}}_ProxyToResponder::CreateCallback(
-              message->request_id(),
-              message->has_flag(mojo::Message::kFlagIsSync),
-              std::move(responder));
-      // A null |impl| means no implementation was bound.
-      assert(impl);
-      TRACE_EVENT0("mojom", "{{class_name}}::{{method.name}}");
-      mojo::internal::MessageDispatchContext context(message);
-      impl->{{method.name}}(
-{%- if method.parameters -%}{{pass_params(method.parameters)}}, {% endif -%}std::move(callback));
-      return true;
-{%-     else %}
-      break;
-{%-     endif %}
-    }
-{%-   endfor %}
-  }
-{%- endif %}
-  return false;
-}
-
-{#--- Request validator definitions #}
-
-bool {{class_name}}RequestValidator::Accept(mojo::Message* message) {
-  if (mojo::internal::ControlMessageHandler::IsControlMessage(message))
-    return true;
-
-  mojo::internal::ValidationContext validation_context(
-    message->payload(), message->payload_num_bytes(),
-    message->handles()->size(), message->payload_num_interface_ids(), message,
-    "{{class_name}} RequestValidator");
-
-  switch (message->header()->name) {
-{%- for method in interface.methods %}
-    case internal::k{{class_name}}_{{method.name}}_Name: {
-{%-   if method.response_parameters != None %}
-      if (!mojo::internal::ValidateMessageIsRequestExpectingResponse(
-              message, &validation_context)) {
-        return false;
-      }
-{%-   else %}
-      if (!mojo::internal::ValidateMessageIsRequestWithoutResponse(
-              message, &validation_context)) {
-        return false;
-      }
-{%-   endif %}
-      if (!mojo::internal::ValidateMessagePayload<
-               internal::{{class_name}}_{{method.name}}_Params_Data>(
-                  message, &validation_context)) {
-        return false;
-      }
-      return true;
-    }
-{%- endfor %}
-    default:
-      break;
-  }
-
-  // Unrecognized message.
-  ReportValidationError(
-      &validation_context,
-      mojo::internal::VALIDATION_ERROR_MESSAGE_HEADER_UNKNOWN_METHOD);
-  return false;
-}
-
-{#--- Response validator definitions #}
-{% if interface|has_callbacks %}
-bool {{class_name}}ResponseValidator::Accept(mojo::Message* message) {
-  if (mojo::internal::ControlMessageHandler::IsControlMessage(message))
-    return true;
-
-  mojo::internal::ValidationContext validation_context(
-    message->payload(), message->payload_num_bytes(),
-    message->handles()->size(), message->payload_num_interface_ids(), message,
-    "{{class_name}} ResponseValidator");
-
-  if (!mojo::internal::ValidateMessageIsResponse(message, &validation_context))
-    return false;
-  switch (message->header()->name) {
-{%- for method in interface.methods if method.response_parameters != None %}
-    case internal::k{{class_name}}_{{method.name}}_Name: {
-      if (!mojo::internal::ValidateMessagePayload<
-               internal::{{class_name}}_{{method.name}}_ResponseParams_Data>(
-                    message, &validation_context)) {
-        return false;
-      }
-      return true;
-    }
-{%- endfor %}
-    default:
-      break;
-  }
-
-  // Unrecognized message.
-  ReportValidationError(
-      &validation_context,
-      mojo::internal::VALIDATION_ERROR_MESSAGE_HEADER_UNKNOWN_METHOD);
-  return false;
-}
-{%- endif -%}
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/interface_macros.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/interface_macros.tmpl
deleted file mode 100644
index 8649273..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/interface_macros.tmpl
+++ /dev/null
@@ -1,49 +0,0 @@
-{%- macro declare_params(prefix, parameters) %}
-{%-   for param in parameters -%}
-{{param.kind|cpp_wrapper_param_type}} {{prefix}}{{param.name}}
-{%- if not loop.last %}, {% endif %}
-{%-   endfor %}
-{%- endmacro %}
-
-{%- macro declare_responder_params(prefix, parameters, for_blink) %}
-{%-   for param in parameters -%}
-{{param.kind|cpp_wrapper_param_type}} {{prefix}}{{param.name}}
-{%- if not loop.last %}, {% endif %}
-{%-   endfor %}
-{%- endmacro %}
-
-{%- macro declare_callback(method, for_blink, use_once_callback) -%}
-{%-   if use_once_callback -%}
-base::OnceCallback<void(
-{%-   else -%}
-base::Callback<void(
-{%-   endif -%}
-{%-   for param in method.response_parameters -%}
-{{param.kind|cpp_wrapper_param_type}}
-{%-     if not loop.last %}, {% endif %}
-{%-   endfor -%}
-)>
-{%- endmacro -%}
-
-{%- macro declare_request_params(prefix, method, use_once_callback) -%}
-{{declare_params(prefix, method.parameters)}}
-{%-   if method.response_parameters != None -%}
-{%-     if method.parameters %}, {% endif -%}
-{%-     if use_once_callback -%}
-{{method.name}}Callback callback
-{%-     else -%}
-const {{method.name}}Callback& callback
-{%-     endif -%}
-{%-   endif -%}
-{%- endmacro -%}
-
-{%- macro declare_sync_method_params(prefix, method) -%}
-{{declare_params(prefix, method.parameters)}}
-{%-   if method.response_parameters %}
-{%-     if method.parameters %}, {% endif %}
-{%-     for param in method.response_parameters -%}
-{{param.kind|cpp_wrapper_type}}* {{prefix}}{{param.name}}
-{%-       if not loop.last %}, {% endif %}
-{%-     endfor %}
-{%-   endif -%}
-{%- endmacro -%}
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/interface_proxy_declaration.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/interface_proxy_declaration.tmpl
deleted file mode 100644
index 0a158ec..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/interface_proxy_declaration.tmpl
+++ /dev/null
@@ -1,16 +0,0 @@
-{%- import "interface_macros.tmpl" as interface_macros %}
-class {{export_attribute}} {{interface.name}}Proxy
-    : public {{interface.name}} {
- public:
-  explicit {{interface.name}}Proxy(mojo::MessageReceiverWithResponder* receiver);
-
-{%- for method in interface.methods %}
-{%-   if method.sync %}
-  bool {{method.name}}({{interface_macros.declare_sync_method_params("", method)}}) override;
-{%-   endif %}
-  void {{method.name}}({{interface_macros.declare_request_params("", method, use_once_callback)}}) override;
-{%- endfor %}
-
- private:
-  mojo::MessageReceiverWithResponder* receiver_;
-};
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/interface_request_validator_declaration.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/interface_request_validator_declaration.tmpl
deleted file mode 100644
index a00d148..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/interface_request_validator_declaration.tmpl
+++ /dev/null
@@ -1,4 +0,0 @@
-class {{export_attribute}} {{interface.name}}RequestValidator : public NON_EXPORTED_BASE(mojo::MessageReceiver) {
- public:
-  bool Accept(mojo::Message* message) override;
-};
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/interface_response_validator_declaration.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/interface_response_validator_declaration.tmpl
deleted file mode 100644
index e2caa02..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/interface_response_validator_declaration.tmpl
+++ /dev/null
@@ -1,4 +0,0 @@
-class {{export_attribute}} {{interface.name}}ResponseValidator : public NON_EXPORTED_BASE(mojo::MessageReceiver) {
- public:
-  bool Accept(mojo::Message* message) override;
-};
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/interface_stub_declaration.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/interface_stub_declaration.tmpl
deleted file mode 100644
index 79ab46f..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/interface_stub_declaration.tmpl
+++ /dev/null
@@ -1,41 +0,0 @@
-class {{export_attribute}} {{interface.name}}StubDispatch {
- public:
-  static bool Accept({{interface.name}}* impl, mojo::Message* message);
-  static bool AcceptWithResponder(
-      {{interface.name}}* impl,
-      mojo::Message* message,
-      std::unique_ptr<mojo::MessageReceiverWithStatus> responder);
-};
-
-template <typename ImplRefTraits =
-              mojo::RawPtrImplRefTraits<{{interface.name}}>>
-class {{interface.name}}Stub
-    : public NON_EXPORTED_BASE(mojo::MessageReceiverWithResponderStatus) {
- public:
-  using ImplPointerType = typename ImplRefTraits::PointerType;
-
-  {{interface.name}}Stub() {}
-  ~{{interface.name}}Stub() override {}
-
-  void set_sink(ImplPointerType sink) { sink_ = std::move(sink); }
-  ImplPointerType& sink() { return sink_; }
-
-  bool Accept(mojo::Message* message) override {
-    if (ImplRefTraits::IsNull(sink_))
-      return false;
-    return {{interface.name}}StubDispatch::Accept(
-        ImplRefTraits::GetRawPointer(&sink_), message);
-  }
-
-  bool AcceptWithResponder(
-      mojo::Message* message,
-      std::unique_ptr<mojo::MessageReceiverWithStatus> responder) override {
-    if (ImplRefTraits::IsNull(sink_))
-      return false;
-    return {{interface.name}}StubDispatch::AcceptWithResponder(
-        ImplRefTraits::GetRawPointer(&sink_), message, std::move(responder));
-  }
-
- private:
-  ImplPointerType sink_;
-};
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/module-shared-internal.h.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/module-shared-internal.h.tmpl
deleted file mode 100644
index 964b254..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/module-shared-internal.h.tmpl
+++ /dev/null
@@ -1,96 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-{%- set header_guard = "%s_SHARED_INTERNAL_H_"|format(
-        module.path|upper|replace("/","_")|replace(".","_")|
-            replace("-", "_")) %}
-
-#ifndef {{header_guard}}
-#define {{header_guard}}
-
-#include <stdint.h>
-
-#include "mojo/public/cpp/bindings/lib/array_internal.h"
-#include "mojo/public/cpp/bindings/lib/bindings_internal.h"
-#include "mojo/public/cpp/bindings/lib/map_data_internal.h"
-#include "mojo/public/cpp/bindings/lib/native_enum_data.h"
-#include "mojo/public/cpp/bindings/lib/native_struct_data.h"
-#include "mojo/public/cpp/bindings/lib/buffer.h"
-
-{%- for import in imports %}
-#include "{{import.module.path}}-shared-internal.h"
-{%- endfor %}
-
-namespace mojo {
-namespace internal {
-class ValidationContext;
-}
-}
-
-{%- for namespace in namespaces_as_array %}
-namespace {{namespace}} {
-{%- endfor %}
-namespace internal {
-
-{#--- Internal forward declarations #}
-{%- for struct in structs %}
-{%-   if struct|is_native_only_kind %}
-using {{struct.name}}_Data = mojo::internal::NativeStruct_Data;
-{%-   else %}
-class {{struct.name}}_Data;
-{%-   endif %}
-{%- endfor %}
-
-{%- for union in unions %}
-class {{union.name}}_Data;
-{%- endfor %}
-
-{#--- Enums #}
-{%- from "enum_macros.tmpl" import enum_data_decl -%}
-{%- for enum in all_enums %}
-{%-   if enum|is_native_only_kind %}
-using {{enum|get_name_for_kind(flatten_nested_kind=True)}}_Data =
-    mojo::internal::NativeEnum_Data;
-{%-   else %}
-{{enum_data_decl(enum)}}
-{%-   endif %}
-{%- endfor %}
-
-#pragma pack(push, 1)
-
-{#--- Unions must be declared first because they can be members of structs #}
-{#--- Union class declarations #}
-{%- for union in unions %}
-{%    include "union_declaration.tmpl" %}
-{%- endfor %}
-
-{#--- Struct class declarations #}
-{%- for struct in structs %}
-{%-   if not struct|is_native_only_kind %}
-{%      include "struct_declaration.tmpl" %}
-{%-   endif %}
-{%- endfor %}
-
-{#--- Interface parameter definitions #}
-{%- for interface in interfaces %}
-{%-   for method in interface.methods %}
-{%-     set method_name = "k%s_%s_Name"|format(interface.name, method.name) %}
-constexpr uint32_t {{method_name}} = {{method.ordinal}};
-{%-     set struct = method.param_struct %}
-{%      include "struct_declaration.tmpl" %}
-{%-     if method.response_parameters != None %}
-{%-       set struct = method.response_param_struct %}
-{%        include "struct_declaration.tmpl" %}
-{%-     endif %}
-{%-   endfor %}
-{%- endfor %}
-
-#pragma pack(pop)
-
-}  // namespace internal
-{%- for namespace in namespaces_as_array|reverse %}
-}  // namespace {{namespace}}
-{%- endfor %}
-
-#endif  // {{header_guard}}
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/module-shared.cc.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/module-shared.cc.tmpl
deleted file mode 100644
index 645bb69..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/module-shared.cc.tmpl
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#if defined(_MSC_VER)
-#pragma warning(push)
-#pragma warning(disable:4065)
-#endif
-
-#include "{{module.path}}-shared.h"
-
-#include <utility>
-
-#include "base/logging.h"
-#include "mojo/public/cpp/bindings/lib/validate_params.h"
-#include "mojo/public/cpp/bindings/lib/validation_context.h"
-#include "mojo/public/cpp/bindings/lib/validation_errors.h"
-#include "mojo/public/cpp/bindings/lib/validation_util.h"
-
-{%- for header in extra_traits_headers %}
-#include "{{header}}"
-{%- endfor %}
-
-{%- for namespace in namespaces_as_array %}
-namespace {{namespace}} {
-{%- endfor %}
-
-namespace internal {
-
-{#--- Union definitions #}
-{%- for union in unions %}
-{%    include "union_definition.tmpl" %}
-{%- endfor %}
-
-{#--- Struct definitions #}
-{%- for struct in structs %}
-{%-   if not struct|is_native_only_kind %}
-{%      include "struct_definition.tmpl" %}
-{%-   endif %}
-{%- endfor %}
-
-{#--- Interface parameter definitions #}
-{%- for interface in interfaces %}
-{%-   for method in interface.methods %}
-{%-     set method_name = "k%s_%s_Name"|format(interface.name, method.name) %}
-{%-     set struct = method.param_struct %}
-{%      include "struct_definition.tmpl" %}
-{%-     if method.response_parameters != None %}
-{%-       set struct = method.response_param_struct %}
-{%        include "struct_definition.tmpl" %}
-{%-     endif %}
-{%-   endfor %}
-{%- endfor %}
-
-}  // namespace internal
-
-{%- for namespace in namespaces_as_array|reverse %}
-}  // namespace {{namespace}}
-{%- endfor %}
-
-#if defined(_MSC_VER)
-#pragma warning(pop)
-#endif
-
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/module-shared.h.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/module-shared.h.tmpl
deleted file mode 100644
index dd13466..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/module-shared.h.tmpl
+++ /dev/null
@@ -1,212 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-{%- set header_guard = "%s_SHARED_H_"|format(
-        module.path|upper|replace("/","_")|replace(".","_")|
-            replace("-", "_")) %}
-
-{%- macro mojom_type_traits(kind) %}
-template <>
-struct MojomTypeTraits<{{kind|get_qualified_name_for_kind}}DataView> {
-  using Data = {{kind|get_qualified_name_for_kind(internal=True)}};
-{%-  if kind|is_union_kind %}
-  using DataAsArrayElement = Data;
-  static constexpr MojomTypeCategory category = MojomTypeCategory::UNION;
-{%-  else %}
-  using DataAsArrayElement = Pointer<Data>;
-  static constexpr MojomTypeCategory category = MojomTypeCategory::STRUCT;
-{%-  endif %}
-};
-{%- endmacro %}
-
-{%- macro namespace_begin() %}
-{%-   for namespace in namespaces_as_array %}
-namespace {{namespace}} {
-{%-   endfor %}
-{%- endmacro %}
-
-{%- macro namespace_end() %}
-{%-   for namespace in namespaces_as_array|reverse %}
-}  // namespace {{namespace}}
-{%-   endfor %}
-{%- endmacro %}
-
-#ifndef {{header_guard}}
-#define {{header_guard}}
-
-#include <stdint.h>
-
-#include <functional>
-#include <ostream>
-#include <type_traits>
-#include <utility>
-
-#include "base/compiler_specific.h"
-#include "mojo/public/cpp/bindings/array_data_view.h"
-#include "mojo/public/cpp/bindings/enum_traits.h"
-#include "mojo/public/cpp/bindings/interface_data_view.h"
-#include "mojo/public/cpp/bindings/lib/bindings_internal.h"
-#include "mojo/public/cpp/bindings/lib/serialization.h"
-#include "mojo/public/cpp/bindings/map_data_view.h"
-#include "mojo/public/cpp/bindings/native_enum.h"
-#include "mojo/public/cpp/bindings/native_struct_data_view.h"
-#include "mojo/public/cpp/bindings/string_data_view.h"
-#include "{{module.path}}-shared-internal.h"
-{%- for import in imports %}
-#include "{{import.module.path}}-shared.h"
-{%- endfor %}
-
-{{namespace_begin()}}
-
-{#--- Struct Forward Declarations -#}
-{%- for struct in structs %}
-{%-   if struct|is_native_only_kind %}
-using {{struct.name}}DataView = mojo::NativeStructDataView;
-{%-   else %}
-class {{struct.name}}DataView;
-{%-   endif %}
-{%  endfor %}
-
-{#--- Union Forward Declarations -#}
-{%- for union in unions %}
-class {{union.name}}DataView;
-{%- endfor %}
-
-{{namespace_end()}}
-
-namespace mojo {
-namespace internal {
-
-{%- for struct in structs %}
-{%-   if not struct|is_native_only_kind %}
-{{mojom_type_traits(struct)}}
-{%-   endif %}
-{%- endfor %}
-
-{%- for union in unions %}
-{{mojom_type_traits(union)}}
-{%- endfor %}
-
-}  // namespace internal
-}  // namespace mojo
-
-{{namespace_begin()}}
-
-{#--- Enums #}
-{%- from "enum_macros.tmpl" import enum_decl%}
-{%- for enum in all_enums %}
-{%-   if enum|is_native_only_kind %}
-using {{enum|get_name_for_kind(flatten_nested_kind=True)}} = mojo::NativeEnum;
-{%-   else %}
-{{enum_decl(enum)}}
-{%-   endif %}
-{%- endfor %}
-
-{#--- Interfaces #}
-{%- if interfaces %}
-// Interface base classes. They are used for type safety check.
-{%- endif %}
-{%- for interface in interfaces %}
-class {{interface.name}}InterfaceBase {};
-
-using {{interface.name}}PtrDataView =
-    mojo::InterfacePtrDataView<{{interface.name}}InterfaceBase>;
-using {{interface.name}}RequestDataView =
-    mojo::InterfaceRequestDataView<{{interface.name}}InterfaceBase>;
-using {{interface.name}}AssociatedPtrInfoDataView =
-    mojo::AssociatedInterfacePtrInfoDataView<{{interface.name}}InterfaceBase>;
-using {{interface.name}}AssociatedRequestDataView =
-    mojo::AssociatedInterfaceRequestDataView<{{interface.name}}InterfaceBase>;
-
-{%- endfor %}
-
-{#--- Structs #}
-{%- for struct in structs %}
-{%-   if not struct|is_native_only_kind %}
-{%      include "struct_data_view_declaration.tmpl" %}
-{%-   endif %}
-{%- endfor %}
-
-{#--- Interface parameter definitions #}
-{%- for interface in interfaces %}
-{%-   for method in interface.methods %}
-{%-     set struct = method.param_struct %}
-{%      include "struct_data_view_declaration.tmpl" %}
-{%-     if method.response_parameters != None %}
-{%-       set struct = method.response_param_struct %}
-{%        include "struct_data_view_declaration.tmpl" %}
-{%-     endif %}
-{%-   endfor %}
-{%- endfor %}
-
-{#--- Unions #}
-{%- for union in unions %}
-{%    include "union_data_view_declaration.tmpl" %}
-{%- endfor %}
-
-{{namespace_end()}}
-
-namespace std {
-
-{%- from "enum_macros.tmpl" import enum_hash %}
-{%- for enum in all_enums %}
-{%-   if not enum|is_native_only_kind %}
-{{enum_hash(enum)}}
-{%-   endif %}
-{%- endfor %}
-
-}  // namespace std
-
-namespace mojo {
-
-{#--- Enum Serialization Helpers -#}
-{%- for enum in all_enums %}
-{%-   if not enum|is_native_only_kind %}
-{%      include "enum_serialization_declaration.tmpl" %}
-{%-   endif %}
-{%- endfor %}
-
-{#--- Struct Serialization Helpers -#}
-{%  for struct in structs %}
-{%-   if not struct|is_native_only_kind %}
-{%      include "struct_serialization_declaration.tmpl" %}
-{%-   endif %}
-{%- endfor %}
-
-{#--- Union Serialization Helpers -#}
-{%  if unions %}
-{%-   for union in unions %}
-{%      include "union_serialization_declaration.tmpl" %}
-{%-   endfor %}
-{%- endif %}
-
-}  // namespace mojo
-
-{{namespace_begin()}}
-
-{%- for struct in structs %}
-{%-   if not struct|is_native_only_kind %}
-{%      include "struct_data_view_definition.tmpl" %}
-{%-   endif %}
-{%- endfor %}
-
-{%- for interface in interfaces %}
-{%-   for method in interface.methods %}
-{%-     set struct = method.param_struct %}
-{%      include "struct_data_view_definition.tmpl" %}
-{%-     if method.response_parameters != None %}
-{%-       set struct = method.response_param_struct %}
-{%        include "struct_data_view_definition.tmpl" %}
-{%-     endif %}
-{%-   endfor %}
-{%- endfor %}
-
-{%- for union in unions %}
-{%    include "union_data_view_definition.tmpl" %}
-{%- endfor %}
-
-{{namespace_end()}}
-
-#endif  // {{header_guard}}
-
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/module.cc.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/module.cc.tmpl
deleted file mode 100644
index 2c66a85..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/module.cc.tmpl
+++ /dev/null
@@ -1,111 +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.
-
-{%- if variant -%}
-{%-   set variant_path = "%s-%s"|format(module.path, variant) -%}
-{%- else -%}
-{%-   set variant_path = module.path -%}
-{%- endif %}
-
-#if defined(__clang__)
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wunused-private-field"
-#elif defined(_MSC_VER)
-#pragma warning(push)
-#pragma warning(disable:4056)
-#pragma warning(disable:4065)
-#pragma warning(disable:4756)
-#endif
-
-#include "{{variant_path}}.h"
-
-#include <math.h>
-#include <stdint.h>
-#include <utility>
-
-#include "base/logging.h"
-#include "base/trace_event/trace_event.h"
-#include "mojo/public/cpp/bindings/lib/message_builder.h"
-#include "mojo/public/cpp/bindings/lib/serialization_util.h"
-#include "mojo/public/cpp/bindings/lib/validate_params.h"
-#include "mojo/public/cpp/bindings/lib/validation_context.h"
-#include "mojo/public/cpp/bindings/lib/validation_errors.h"
-#include "mojo/public/interfaces/bindings/interface_control_messages.mojom.h"
-
-{%- if for_blink %}
-#include "mojo/public/cpp/bindings/lib/wtf_serialization.h"
-{%- endif %}
-
-{%- for header in extra_traits_headers %}
-#include "{{header}}"
-{%- endfor %}
-
-{%- for namespace in namespaces_as_array %}
-namespace {{namespace}} {
-{%- endfor %}
-{%- if variant %}
-namespace {{variant}} {
-{%- endif %}
-
-{#--- Constants #}
-{%- for constant in module.constants %}
-{%-   if constant.kind|is_string_kind %}
-const char {{constant.name}}[] = {{constant|constant_value}};
-{%-   endif %}
-{%- endfor %}
-
-{#--- Struct Constants #}
-{%- for struct in structs %}
-{%-   for constant in struct.constants %}
-{%-     if constant.kind|is_string_kind %}
-const char {{struct.name}}::{{constant.name}}[] = {{constant|constant_value}};
-{%-     endif %}
-{%-   endfor %}
-{%- endfor %}
-
-{#--- Struct builder definitions #}
-{%- for struct in structs %}
-{%-   if not struct|is_native_only_kind %}
-{%-     include "wrapper_class_definition.tmpl" %}
-{%-   endif %}
-{%- endfor %}
-
-{#--- Union builder definitions #}
-{%- for union in unions %}
-{%-   include "wrapper_union_class_definition.tmpl" %}
-{%- endfor %}
-
-{#--- Interface definitions #}
-{%- for interface in interfaces %}
-{%-   include "interface_definition.tmpl" %}
-{%- endfor %}
-
-{%- if variant %}
-}  // namespace {{variant}}
-{%- endif %}
-{%- for namespace in namespaces_as_array|reverse %}
-}  // namespace {{namespace}}
-{%- endfor %}
-
-namespace mojo {
-
-{#--- Struct Serialization Helpers -#}
-{%  for struct in structs %}
-{%-   if not struct|is_native_only_kind %}
-{%      include "struct_traits_definition.tmpl" %}
-{%-   endif %}
-{%- endfor %}
-
-{#--- Union Serialization Helpers #}
-{%- for union in unions %}
-{%-   include "union_traits_definition.tmpl" %}
-{%- endfor %}
-
-}  // namespace mojo
-
-#if defined(__clang__)
-#pragma clang diagnostic pop
-#elif defined(_MSC_VER)
-#pragma warning(pop)
-#endif
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/module.h.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/module.h.tmpl
deleted file mode 100644
index 804a46b..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/module.h.tmpl
+++ /dev/null
@@ -1,236 +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.
-
-{%- if variant -%}
-{%-   set variant_path = "%s-%s"|format(module.path, variant) -%}
-{%- else -%}
-{%-   set variant_path = module.path -%}
-{%- endif -%}
-
-{%- set header_guard = "%s_H_"|format(
-        variant_path|upper|replace("/","_")|replace(".","_")|
-            replace("-", "_")) %}
-
-{%- macro namespace_begin() %}
-{%-   for namespace in namespaces_as_array %}
-namespace {{namespace}} {
-{%-   endfor %}
-{%-   if variant %}
-namespace {{variant}} {
-{%-   endif %}
-{%- endmacro %}
-
-{%- macro namespace_end() %}
-{%-   if variant %}
-}  // namespace {{variant}}
-{%-   endif %}
-{%-   for namespace in namespaces_as_array|reverse %}
-}  // namespace {{namespace}}
-{%-   endfor %}
-{%- endmacro %}
-
-#ifndef {{header_guard}}
-#define {{header_guard}}
-
-#include <stdint.h>
-
-#include <limits>
-#include <type_traits>
-#include <utility>
-
-#include "base/callback.h"
-#include "base/macros.h"
-#include "base/optional.h"
-#include "mojo/public/cpp/bindings/associated_interface_ptr.h"
-#include "mojo/public/cpp/bindings/associated_interface_ptr_info.h"
-#include "mojo/public/cpp/bindings/associated_interface_request.h"
-#include "mojo/public/cpp/bindings/clone_traits.h"
-#include "mojo/public/cpp/bindings/interface_ptr.h"
-#include "mojo/public/cpp/bindings/interface_request.h"
-#include "mojo/public/cpp/bindings/lib/equals_traits.h"
-#include "mojo/public/cpp/bindings/lib/control_message_handler.h"
-#include "mojo/public/cpp/bindings/lib/control_message_proxy.h"
-#include "mojo/public/cpp/bindings/lib/serialization.h"
-#include "mojo/public/cpp/bindings/lib/union_accessor.h"
-#include "mojo/public/cpp/bindings/native_struct.h"
-#include "mojo/public/cpp/bindings/raw_ptr_impl_ref_traits.h"
-#include "mojo/public/cpp/bindings/struct_ptr.h"
-#include "mojo/public/cpp/bindings/struct_traits.h"
-#include "mojo/public/cpp/bindings/thread_safe_interface_ptr.h"
-#include "mojo/public/cpp/bindings/union_traits.h"
-#include "{{module.path}}-shared.h"
-{%- for import in imports %}
-{%-   if variant %}
-#include "{{"%s-%s.h"|format(import.module.path, variant)}}"
-{%-   else %}
-#include "{{import.module.path}}.h"
-{%-   endif %}
-{%- endfor %}
-{%- if not for_blink %}
-#include <string>
-#include <vector>
-{%- else %}
-{# hash_util.h includes template specializations that should be present for
-   every use of {Inlined}StructPtr. #}
-#include "mojo/public/cpp/bindings/lib/wtf_hash_util.h"
-#include "third_party/WebKit/Source/wtf/HashFunctions.h"
-#include "third_party/WebKit/Source/wtf/Optional.h"
-#include "third_party/WebKit/Source/wtf/text/WTFString.h"
-{%- endif %}
-
-{%- for header in extra_public_headers %}
-#include "{{header}}"
-{%- endfor %}
-
-{%- if export_header %}
-#include "{{export_header}}"
-{%- endif %}
-
-{#--- WTF enum hashing #}
-{%- from "enum_macros.tmpl" import enum_hash_blink%}
-{%- if for_blink %}
-{%-   for enum in all_enums %}
-{%-     if not enum|is_native_only_kind %}
-{{enum_hash_blink(enum)}}
-{%-     endif %}
-{%-   endfor %}
-{%- endif %}
-
-{{namespace_begin()}}
-
-{#--- Enums #}
-{%- if variant %}
-{%-   for enum in enums %}
-using {{enum.name}} = {{enum.name}};  // Alias for definition in the parent namespace.
-{%-   endfor %}
-{%- endif %}
-
-{#--- Constants #}
-{%- for constant in module.constants %}
-{{constant|format_constant_declaration}};
-{%- endfor %}
-
-{#--- Interface Forward Declarations -#}
-{%  for interface in interfaces %}
-class {{interface.name}};
-using {{interface.name}}Ptr = mojo::InterfacePtr<{{interface.name}}>;
-using {{interface.name}}PtrInfo = mojo::InterfacePtrInfo<{{interface.name}}>;
-using ThreadSafe{{interface.name}}Ptr =
-    mojo::ThreadSafeInterfacePtr<{{interface.name}}>;
-using {{interface.name}}Request = mojo::InterfaceRequest<{{interface.name}}>;
-using {{interface.name}}AssociatedPtr =
-    mojo::AssociatedInterfacePtr<{{interface.name}}>;
-using ThreadSafe{{interface.name}}AssociatedPtr =
-    mojo::ThreadSafeAssociatedInterfacePtr<{{interface.name}}>;
-using {{interface.name}}AssociatedPtrInfo =
-    mojo::AssociatedInterfacePtrInfo<{{interface.name}}>;
-using {{interface.name}}AssociatedRequest =
-    mojo::AssociatedInterfaceRequest<{{interface.name}}>;
-{%  endfor %}
-
-{#--- Struct Forward Declarations -#}
-{%  for struct in structs %}
-{%-   if struct|is_native_only_kind %}
-using {{struct.name}} = mojo::NativeStruct;
-using {{struct.name}}Ptr = mojo::NativeStructPtr;
-{%-   else %}
-class {{struct.name}};
-{%-     if struct|should_inline %}
-using {{struct.name}}Ptr = mojo::InlinedStructPtr<{{struct.name}}>;
-{%-     else %}
-using {{struct.name}}Ptr = mojo::StructPtr<{{struct.name}}>;
-{%-     endif %}
-{%-   endif %}
-{%  endfor %}
-
-{#--- Union Forward Declarations -#}
-{%  for union in unions %}
-class {{union.name}};
-{%    if union|should_inline_union %}
-typedef mojo::InlinedStructPtr<{{union.name}}> {{union.name}}Ptr;
-{%    else %}
-typedef mojo::StructPtr<{{union.name}}> {{union.name}}Ptr;
-{%    endif %}
-{%- endfor %}
-
-{#--- Interfaces -#}
-{%  for interface in interfaces %}
-{%    include "interface_declaration.tmpl" %}
-{%- endfor %}
-
-{#--- Interface Proxies -#}
-{%  for interface in interfaces %}
-{%    include "interface_proxy_declaration.tmpl" %}
-{%- endfor %}
-
-{#--- Interface Stubs -#}
-{%  for interface in interfaces %}
-{%    include "interface_stub_declaration.tmpl" %}
-{%- endfor %}
-
-{#--- Interface Request Validators -#}
-{%  for interface in interfaces %}
-{%    include "interface_request_validator_declaration.tmpl" %}
-{%- endfor %}
-
-{#--- Interface Response Validators -#}
-{%  for interface in interfaces if interface|has_callbacks %}
-{%    include "interface_response_validator_declaration.tmpl" %}
-{%- endfor %}
-
-{#--- NOTE: Unions and non-inlined structs may have pointers to inlined structs,
-      so we need to fully define inlined structs ahead of the others. #}
-
-{#--- Inlined structs #}
-{%  for struct in structs %}
-{%    if struct|should_inline and not struct|is_native_only_kind %}
-{%      include "wrapper_class_declaration.tmpl" %}
-{%    endif %}
-{%- endfor %}
-
-{#--- Unions must be declared before non-inlined structs because they can be
-      members of structs. #}
-{#--- Unions #}
-{%  for union in unions %}
-{%    include "wrapper_union_class_declaration.tmpl" %}
-{%- endfor %}
-
-{#--- Non-inlined structs #}
-{%  for struct in structs %}
-{%    if not struct|should_inline and not struct|is_native_only_kind %}
-{%      include "wrapper_class_declaration.tmpl" %}
-{%    endif %}
-{%- endfor %}
-
-{%- for union in unions %}
-{%    include "wrapper_union_class_template_definition.tmpl" %}
-{%- endfor %}
-
-{%- for struct in structs %}
-{%-   if not struct|is_native_only_kind %}
-{%      include "wrapper_class_template_definition.tmpl" %}
-{%-   endif %}
-{%- endfor %}
-
-{{namespace_end()}}
-
-namespace mojo {
-
-{#--- Struct Serialization Helpers -#}
-{%  for struct in structs %}
-{%-   if not struct|is_native_only_kind %}
-{%      include "struct_traits_declaration.tmpl" %}
-{%-   endif %}
-{%- endfor %}
-
-{#--- Union Serialization Helpers -#}
-{%  if unions %}
-{%-   for union in unions %}
-{%      include "union_traits_declaration.tmpl" %}
-{%-   endfor %}
-{%- endif %}
-
-}  // namespace mojo
-
-#endif  // {{header_guard}}
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/struct_data_view_declaration.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/struct_data_view_declaration.tmpl
deleted file mode 100644
index 96e0d61..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/struct_data_view_declaration.tmpl
+++ /dev/null
@@ -1,118 +0,0 @@
-class {{struct.name}}DataView {
- public:
-  {{struct.name}}DataView() {}
-
-  {{struct.name}}DataView(
-      internal::{{struct.name}}_Data* data,
-      mojo::internal::SerializationContext* context)
-{%- if struct|requires_context_for_data_view %}
-      : data_(data), context_(context) {}
-{%- else %}
-      : data_(data) {}
-{%- endif %}
-
-  bool is_null() const { return !data_; }
-
-{%- for pf in struct.packed.packed_fields_in_ordinal_order %}
-{%-   set kind = pf.field.kind %}
-{%-   set name = pf.field.name %}
-{%-   if kind|is_union_kind %}
-  inline void Get{{name|under_to_camel}}DataView(
-      {{kind|cpp_data_view_type}}* output);
-
-  template <typename UserType>
-  WARN_UNUSED_RESULT bool Read{{name|under_to_camel}}(UserType* output) {
-{%-     if pf.min_version != 0 %}
-    auto* pointer = data_->header_.version >= {{pf.min_version}}
-                    ? &data_->{{name}} : nullptr;
-{%-     else %}
-    auto* pointer = &data_->{{name}};
-{%-     endif %}
-    return mojo::internal::Deserialize<{{kind|unmapped_type_for_serializer}}>(
-        pointer, output, context_);
-  }
-
-{%-   elif kind|is_object_kind %}
-  inline void Get{{name|under_to_camel}}DataView(
-      {{kind|cpp_data_view_type}}* output);
-
-  template <typename UserType>
-  WARN_UNUSED_RESULT bool Read{{name|under_to_camel}}(UserType* output) {
-{%-     if pf.min_version != 0 %}
-    auto* pointer = data_->header_.version >= {{pf.min_version}}
-                    ? data_->{{name}}.Get() : nullptr;
-{%-     else %}
-    auto* pointer = data_->{{name}}.Get();
-{%-     endif %}
-    return mojo::internal::Deserialize<{{kind|unmapped_type_for_serializer}}>(
-        pointer, output, context_);
-  }
-
-{%-   elif kind|is_enum_kind %}
-  template <typename UserType>
-  WARN_UNUSED_RESULT bool Read{{name|under_to_camel}}(UserType* output) const {
-{%-     if pf.min_version != 0 %}
-    auto data_value = data_->header_.version >= {{pf.min_version}}
-                      ? data_->{{name}} : 0;
-{%-     else %}
-    auto data_value = data_->{{name}};
-{%-     endif %}
-    return mojo::internal::Deserialize<{{kind|unmapped_type_for_serializer}}>(
-        data_value, output);
-  }
-
-  {{kind|cpp_data_view_type}} {{name}}() const {
-{%-     if pf.min_version != 0 %}
-    if (data_->header_.version < {{pf.min_version}})
-      return {{kind|get_qualified_name_for_kind}}{};
-{%-     endif %}
-    return static_cast<{{kind|cpp_data_view_type}}>(data_->{{name}});
-  }
-
-{%-   elif kind|is_any_handle_kind %}
-  {{kind|cpp_data_view_type}} Take{{name|under_to_camel}}() {
-    {{kind|cpp_data_view_type}} result;
-{%-     if pf.min_version != 0 %}
-    if (data_->header_.version < {{pf.min_version}})
-      return result;
-{%-     endif %}
-    bool ret =
-        mojo::internal::Deserialize<{{kind|unmapped_type_for_serializer}}>(
-            &data_->{{name}}, &result, context_);
-    DCHECK(ret);
-    return result;
-  }
-
-{%-   elif kind|is_any_interface_kind %}
-  template <typename UserType>
-  UserType Take{{name|under_to_camel}}() {
-    UserType result;
-{%-     if pf.min_version != 0 %}
-    if (data_->header_.version < {{pf.min_version}})
-      return result;
-{%-     endif %}
-    bool ret =
-        mojo::internal::Deserialize<{{kind|unmapped_type_for_serializer}}>(
-            &data_->{{name}}, &result, context_);
-    DCHECK(ret);
-    return result;
-  }
-
-{%-   else %}
-  {{kind|cpp_data_view_type}} {{name}}() const {
-{%-     if pf.min_version != 0 %}
-    if (data_->header_.version < {{pf.min_version}})
-      return {{kind|cpp_data_view_type}}{};
-{%-     endif %}
-    return data_->{{name}};
-  }
-
-{%-   endif %}
-{%- endfor %}
- private:
-  internal::{{struct.name}}_Data* data_ = nullptr;
-{%- if struct|requires_context_for_data_view %}
-  mojo::internal::SerializationContext* context_ = nullptr;
-{%- endif %}
-};
-
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/struct_data_view_definition.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/struct_data_view_definition.tmpl
deleted file mode 100644
index 95311dc..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/struct_data_view_definition.tmpl
+++ /dev/null
@@ -1,30 +0,0 @@
-{%- for pf in struct.packed.packed_fields_in_ordinal_order %}
-{%-   set kind = pf.field.kind %}
-{%-   set name = pf.field.name %}
-
-{%-   if kind|is_union_kind %}
-inline void {{struct.name}}DataView::Get{{name|under_to_camel}}DataView(
-    {{kind|cpp_data_view_type}}* output) {
-{%-     if pf.min_version != 0 %}
-  auto pointer = data_->header_.version >= {{pf.min_version}}
-                 ? &data_->{{name}} : nullptr;
-{%-     else %}
-  auto pointer = &data_->{{name}};
-{%-     endif %}
-  *output = {{kind|cpp_data_view_type}}(pointer, context_);
-}
-
-{%-   elif kind|is_object_kind %}
-inline void {{struct.name}}DataView::Get{{name|under_to_camel}}DataView(
-    {{kind|cpp_data_view_type}}* output) {
-{%-     if pf.min_version != 0 %}
-  auto pointer = data_->header_.version >= {{pf.min_version}}
-                 ? data_->{{name}}.Get() : nullptr;
-{%-     else %}
-  auto pointer = data_->{{name}}.Get();
-{%-     endif %}
-  *output = {{kind|cpp_data_view_type}}(pointer, context_);
-}
-{%-   endif %}
-{%- endfor %}
-
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/struct_declaration.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/struct_declaration.tmpl
deleted file mode 100644
index 156f774..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/struct_declaration.tmpl
+++ /dev/null
@@ -1,46 +0,0 @@
-{%- set class_name = struct.name ~ "_Data" -%}
-
-class {{class_name}} {
- public:
-  static {{class_name}}* New(mojo::internal::Buffer* buf) {
-    return new (buf->Allocate(sizeof({{class_name}}))) {{class_name}}();
-  }
-
-  static bool Validate(const void* data,
-                       mojo::internal::ValidationContext* validation_context);
-
-  mojo::internal::StructHeader header_;
-{%- for packed_field in struct.packed.packed_fields %}
-{%-   set name = packed_field.field.name %}
-{%-   set kind = packed_field.field.kind %}
-{%-   if kind.spec == 'b' %}
-  uint8_t {{name}} : 1;
-{%-   else %}
-  {{kind|cpp_field_type}} {{name}};
-{%-   endif %}
-{%-   if not loop.last %}
-{%-     set next_pf = struct.packed.packed_fields[loop.index0 + 1] %}
-{%-     set pad = next_pf.offset - (packed_field.offset + packed_field.size) %}
-{%-     if pad > 0 %}
-  uint8_t pad{{loop.index0}}_[{{pad}}];
-{%-     endif %}
-{%-   endif %}
-{%- endfor %}
-
-{%- set num_fields = struct.versions[-1].num_fields %}
-{%- if num_fields > 0 %}
-{%-   set last_field = struct.packed.packed_fields[num_fields - 1] %}
-{%-   set offset = last_field.offset + last_field.size %}
-{%-   set pad = offset|get_pad(8) %}
-{%-   if pad > 0 %}
-  uint8_t padfinal_[{{pad}}];
-{%-   endif %}
-{%- endif %}
-
- private:
-  {{class_name}}() : header_({sizeof(*this), {{struct.versions[-1].version}}}) {
-  }
-  ~{{class_name}}() = delete;
-};
-static_assert(sizeof({{class_name}}) == {{struct.versions[-1].num_bytes}},
-              "Bad sizeof({{class_name}})");
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/struct_definition.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/struct_definition.tmpl
deleted file mode 100644
index 60dca40..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/struct_definition.tmpl
+++ /dev/null
@@ -1,70 +0,0 @@
-{%- import "validation_macros.tmpl" as validation_macros %}
-{%- set class_name = struct.name ~ "_Data" %}
-
-// static
-bool {{class_name}}::Validate(
-    const void* data,
-    mojo::internal::ValidationContext* validation_context) {
-  if (!data)
-    return true;
-
-  if (!ValidateStructHeaderAndClaimMemory(data, validation_context))
-    return false;
-
-  // NOTE: The memory backing |object| may be smaller than |sizeof(*object)| if
-  // the message comes from an older version.
-  const {{class_name}}* object = static_cast<const {{class_name}}*>(data);
-
-  static constexpr struct {
-    uint32_t version;
-    uint32_t num_bytes;
-  } kVersionSizes[] = {
-{%- for version in struct.versions -%}
-    { {{version.version}}, {{version.num_bytes}} }{% if not loop.last %}, {% endif -%}
-{%- endfor -%}
-  };
-
-  if (object->header_.version <=
-          kVersionSizes[arraysize(kVersionSizes) - 1].version) {
-    // Scan in reverse order to optimize for more recent versions.
-    for (int i = arraysize(kVersionSizes) - 1; i >= 0; --i) {
-      if (object->header_.version >= kVersionSizes[i].version) {
-        if (object->header_.num_bytes == kVersionSizes[i].num_bytes)
-          break;
-
-        ReportValidationError(
-            validation_context,
-            mojo::internal::VALIDATION_ERROR_UNEXPECTED_STRUCT_HEADER);
-        return false;
-      }
-    }
-  } else if (object->header_.num_bytes <
-                 kVersionSizes[arraysize(kVersionSizes) - 1].num_bytes) {
-    ReportValidationError(
-        validation_context,
-        mojo::internal::VALIDATION_ERROR_UNEXPECTED_STRUCT_HEADER);
-    return false;
-  }
-
-{#- Before validating fields introduced at a certain version, we need to add
-    a version check, which makes sure we skip further validation if |object|
-    is from an earlier version. |last_checked_version| records the last
-    version that we have added such version check. #}
-{%- set last_checked_version = 0 %}
-{%- for packed_field in struct.packed.packed_fields_in_ordinal_order %}
-{%-   set kind = packed_field.field.kind %}
-{%-   if kind|is_object_kind or kind|is_any_handle_or_interface_kind or
-         kind|is_enum_kind %}
-{%-     if packed_field.min_version > last_checked_version %}
-{%-       set last_checked_version = packed_field.min_version %}
-  if (object->header_.version < {{packed_field.min_version}})
-    return true;
-{%-     endif %}
-{%-     set field_expr = "object->" ~ packed_field.field.name %}
-{{validation_macros.validate_field(packed_field.field, field_expr, struct.name, true)}}
-{%-   endif %}
-{%- endfor %}
-
-  return true;
-}
-
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/struct_macros.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/struct_macros.tmpl
deleted file mode 100644
index bb5fb9c..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/struct_macros.tmpl
+++ /dev/null
@@ -1,161 +0,0 @@
-{#  TODO(yzshen): Make these templates more readable. #}
-
-{#  Computes the serialized size for the specified struct.
-    |struct| is the struct definition.
-    |input_field_pattern| should be a pattern that contains one string
-    placeholder, for example, "input->%s", "p_%s". The placeholder will be
-    substituted with struct field names to refer to the input fields.
-    |context| is the name of the serialization context.
-    |input_may_be_temp| indicates whether any input may be temporary obejcts.
-    We need to assign temporary objects to local variables before passing it to
-    Serializer, because it is illegal to pass temporary objects as non-const
-    references.
-    This macro is expanded to compute seriailized size for both:
-    - user-defined structs: the input is an instance of the corresponding struct
-      wrapper class.
-    - method parameters/response parameters: the input is a list of
-      arguments.
-    It declares |size| of type size_t to store the resulting size. #}
-{%- macro get_serialized_size(struct, input_field_pattern, context,
-                              input_may_be_temp=False) -%}
-  size_t size = sizeof({{struct|get_qualified_name_for_kind(internal=True)}});
-{%-   for pf in struct.packed.packed_fields_in_ordinal_order
-          if pf.field.kind|is_object_kind or pf.field.kind|is_associated_kind %}
-{%-     set name = pf.field.name -%}
-{%-     set kind = pf.field.kind -%}
-{%-     set original_input_field = input_field_pattern|format(name) %}
-{%-     set input_field = "in_%s"|format(name) if input_may_be_temp
-                                               else original_input_field %}
-{%-     if input_may_be_temp %}
-  decltype({{original_input_field}}) in_{{name}} = {{original_input_field}};
-{%-     endif %}
-
-{%-     set serializer_type = kind|unmapped_type_for_serializer %}
-{%-     if kind|is_union_kind %}
-  size += mojo::internal::PrepareToSerialize<{{serializer_type}}>(
-      {{input_field}}, true, {{context}});
-{%-     else %}
-  size += mojo::internal::PrepareToSerialize<{{serializer_type}}>(
-      {{input_field}}, {{context}});
-{%-     endif %}
-{%-   endfor %}
-{%- endmacro -%}
-
-{#  Serializes the specified struct.
-    |struct| is the struct definition.
-    |struct_display_name| is the display name for the struct that can be showed
-    in error/log messages, for example, "FooStruct", "FooMethod request".
-    |input_field_pattern| should be a pattern that contains one string
-    placeholder, for example, "input->%s", "p_%s". The placeholder will be
-    substituted with struct field names to refer to the input fields.
-    |output| is the name of the output struct instance.
-    |buffer| is the name of the Buffer instance used.
-    |context| is the name of the serialization context.
-    |input_may_be_temp|: please see the comments of get_serialized_size.
-    This macro is expanded to do serialization for both:
-    - user-defined structs: the input is an instance of the corresponding struct
-      wrapper class.
-    - method parameters/response parameters: the input is a list of
-      arguments. #}
-{%- macro serialize(struct, struct_display_name, input_field_pattern, output,
-                    buffer, context, input_may_be_temp=False) -%}
-  auto {{output}} =
-      {{struct|get_qualified_name_for_kind(internal=True)}}::New({{buffer}});
-  ALLOW_UNUSED_LOCAL({{output}});
-{%- for pf in struct.packed.packed_fields_in_ordinal_order %}
-{%-   set input_field = input_field_pattern|format(pf.field.name) %}
-{%-   set name = pf.field.name %}
-{%-   set kind = pf.field.kind %}
-{%-   set serializer_type = kind|unmapped_type_for_serializer %}
-
-{%-   if kind|is_object_kind or kind|is_any_handle_or_interface_kind %}
-{%-     set original_input_field = input_field_pattern|format(name) %}
-{%-     set input_field = "in_%s"|format(name) if input_may_be_temp
-                                               else original_input_field %}
-{%-     if input_may_be_temp %}
-  decltype({{original_input_field}}) in_{{name}} = {{original_input_field}};
-{%-     endif %}
-{%-   endif %}
-
-{%-   if kind|is_object_kind %}
-{%-     if kind|is_array_kind or kind|is_map_kind %}
-  typename decltype({{output}}->{{name}})::BaseType* {{name}}_ptr;
-  const mojo::internal::ContainerValidateParams {{name}}_validate_params(
-      {{kind|get_container_validate_params_ctor_args|indent(10)}});
-  mojo::internal::Serialize<{{serializer_type}}>(
-      {{input_field}}, {{buffer}}, &{{name}}_ptr, &{{name}}_validate_params,
-      {{context}});
-  {{output}}->{{name}}.Set({{name}}_ptr);
-{%-     elif kind|is_union_kind %}
-  auto {{name}}_ptr = &{{output}}->{{name}};
-  mojo::internal::Serialize<{{serializer_type}}>(
-      {{input_field}}, {{buffer}}, &{{name}}_ptr, true, {{context}});
-{%-     else %}
-  typename decltype({{output}}->{{name}})::BaseType* {{name}}_ptr;
-  mojo::internal::Serialize<{{serializer_type}}>(
-      {{input_field}}, {{buffer}}, &{{name}}_ptr, {{context}});
-  {{output}}->{{name}}.Set({{name}}_ptr);
-{%-     endif %}
-{%-     if not kind|is_nullable_kind %}
-  MOJO_INTERNAL_DLOG_SERIALIZATION_WARNING(
-      {{output}}->{{name}}.is_null(),
-      mojo::internal::VALIDATION_ERROR_UNEXPECTED_NULL_POINTER,
-      "null {{name}} in {{struct_display_name}}");
-{%-     endif %}
-
-{%-   elif kind|is_any_handle_or_interface_kind %}
-  mojo::internal::Serialize<{{serializer_type}}>(
-      {{input_field}}, &{{output}}->{{name}}, {{context}});
-{%-     if not kind|is_nullable_kind %}
-  MOJO_INTERNAL_DLOG_SERIALIZATION_WARNING(
-      !mojo::internal::IsHandleOrInterfaceValid({{output}}->{{name}}),
-{%-       if kind|is_associated_kind %}
-      mojo::internal::VALIDATION_ERROR_UNEXPECTED_INVALID_INTERFACE_ID,
-{%-       else %}
-      mojo::internal::VALIDATION_ERROR_UNEXPECTED_INVALID_HANDLE,
-{%-       endif %}
-      "invalid {{name}} in {{struct_display_name}}");
-{%-     endif %}
-
-{%-   elif kind|is_enum_kind %}
-  mojo::internal::Serialize<{{serializer_type}}>(
-      {{input_field}}, &{{output}}->{{name}});
-
-{%-   else %}
-  {{output}}->{{name}} = {{input_field}};
-{%-   endif %}
-{%- endfor %}
-{%- endmacro -%}
-
-{#  Deserializes the specified struct.
-    |struct| is the struct definition.
-    |input| is the name of the input struct data view. It is expected to be
-    non-null.
-    |output_field_pattern| should be a pattern that contains one string
-    placeholder, for example, "result->%s", "p_%s". The placeholder will be
-    substituted with struct field names to refer to the output fields.
-    |context| is the name of the serialization context.
-    |success| is the name of a bool variable to track success of the operation.
-    This macro is expanded to do deserialization for both:
-    - user-defined structs: the output is an instance of the corresponding
-      struct wrapper class.
-    - method parameters/response parameters: the output is a list of
-      arguments. #}
-{%- macro deserialize(struct, input, output_field_pattern, success) -%}
-{%-   for pf in struct.packed.packed_fields_in_ordinal_order %}
-{%-     set output_field = output_field_pattern|format(pf.field.name) %}
-{%-     set name = pf.field.name %}
-{%-     set kind = pf.field.kind %}
-{%-     if kind|is_object_kind or kind|is_enum_kind %}
-  if (!{{input}}.Read{{name|under_to_camel}}(&{{output_field}}))
-    {{success}} = false;
-{%-     elif kind|is_any_handle_kind %}
-  {{output_field}} = {{input}}.Take{{name|under_to_camel}}();
-{%-     elif kind|is_any_interface_kind %}
-  {{output_field}} =
-      {{input}}.Take{{name|under_to_camel}}<decltype({{output_field}})>();
-{%-     else %}
-  {{output_field}} = {{input}}.{{name}}();
-{%-     endif %}
-{%-   endfor %}
-{%- endmacro %}
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/struct_serialization_declaration.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/struct_serialization_declaration.tmpl
deleted file mode 100644
index 835178b..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/struct_serialization_declaration.tmpl
+++ /dev/null
@@ -1,57 +0,0 @@
-{%- import "struct_macros.tmpl" as struct_macros %}
-{%- set data_view = struct|get_qualified_name_for_kind ~ "DataView" %}
-{%- set data_type = struct|get_qualified_name_for_kind(internal=True) %}
-
-namespace internal {
-
-template <typename MaybeConstUserType>
-struct Serializer<{{data_view}}, MaybeConstUserType> {
-  using UserType = typename std::remove_const<MaybeConstUserType>::type;
-  using Traits = StructTraits<{{data_view}}, UserType>;
-
-  static size_t PrepareToSerialize(MaybeConstUserType& input,
-                                   SerializationContext* context) {
-    if (CallIsNullIfExists<Traits>(input))
-      return 0;
-
-    void* custom_context = CustomContextHelper<Traits>::SetUp(input, context);
-    ALLOW_UNUSED_LOCAL(custom_context);
-
-    {{struct_macros.get_serialized_size(
-          struct, "CallWithContext(Traits::%s, input, custom_context)",
-          "context", True)|indent(2)}}
-    return size;
-  }
-
-  static void Serialize(MaybeConstUserType& input,
-                        Buffer* buffer,
-                        {{data_type}}** output,
-                        SerializationContext* context) {
-    if (CallIsNullIfExists<Traits>(input)) {
-      *output = nullptr;
-      return;
-    }
-
-    void* custom_context = CustomContextHelper<Traits>::GetNext(context);
-
-    {{struct_macros.serialize(
-          struct, struct.name ~ " struct",
-          "CallWithContext(Traits::%s, input, custom_context)", "result",
-          "buffer", "context", True)|indent(2)}}
-    *output = result;
-
-    CustomContextHelper<Traits>::TearDown(input, custom_context);
-  }
-
-  static bool Deserialize({{data_type}}* input,
-                          UserType* output,
-                          SerializationContext* context) {
-    if (!input)
-      return CallSetToNullIfExists<Traits>(output);
-
-    {{data_view}} data_view(input, context);
-    return Traits::Read(data_view, output);
-  }
-};
-
-}  // namespace internal
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/struct_traits_declaration.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/struct_traits_declaration.tmpl
deleted file mode 100644
index 1b7cf89..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/struct_traits_declaration.tmpl
+++ /dev/null
@@ -1,32 +0,0 @@
-{%- set mojom_type = struct|get_qualified_name_for_kind %}
-
-template <>
-struct {{export_attribute}} StructTraits<{{mojom_type}}::DataView,
-                                         {{mojom_type}}Ptr> {
-  static bool IsNull(const {{mojom_type}}Ptr& input) { return !input; }
-  static void SetToNull({{mojom_type}}Ptr* output) { output->reset(); }
-
-{%- for field in struct.fields %}
-{%-   set return_ref = field.kind|is_object_kind or
-  field.kind|is_any_handle_or_interface_kind %}
-{#    We want the field accessor to be const whenever possible to allow
-      structs to be used as map keys.
-      TODO(tibell): Make this check more precise to deal with e.g.
-          custom types which don't contain handles but require non-const
-          reference for serialization. #}
-{%-   set maybe_const = "" if field.kind|contains_handles_or_interfaces else "const" %}
-{%-   if return_ref %}
-  static {{maybe_const}} decltype({{mojom_type}}::{{field.name}})& {{field.name}}(
-      {{maybe_const}} {{mojom_type}}Ptr& input) {
-    return input->{{field.name}};
-  }
-{%-   else %}
-  static decltype({{mojom_type}}::{{field.name}}) {{field.name}}(
-      const {{mojom_type}}Ptr& input) {
-    return input->{{field.name}};
-  }
-{%-   endif %}
-{%- endfor %}
-
-  static bool Read({{mojom_type}}::DataView input, {{mojom_type}}Ptr* output);
-};
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/struct_traits_definition.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/struct_traits_definition.tmpl
deleted file mode 100644
index f84337f..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/struct_traits_definition.tmpl
+++ /dev/null
@@ -1,14 +0,0 @@
-{%- import "struct_macros.tmpl" as struct_macros %}
-{%- set mojom_type = struct|get_qualified_name_for_kind %}
-
-// static
-bool StructTraits<{{mojom_type}}::DataView, {{mojom_type}}Ptr>::Read(
-    {{mojom_type}}::DataView input,
-    {{mojom_type}}Ptr* output) {
-  bool success = true;
-  {{mojom_type}}Ptr result({{mojom_type}}::New());
-  {{struct_macros.deserialize(struct, "input", "result->%s",
-                              "success")|indent(4)}}
-  *output = std::move(result);
-  return success;
-}
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/union_data_view_declaration.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/union_data_view_declaration.tmpl
deleted file mode 100644
index 5973ba2..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/union_data_view_declaration.tmpl
+++ /dev/null
@@ -1,92 +0,0 @@
-class {{union.name}}DataView {
- public:
-  using Tag = internal::{{union.name}}_Data::{{union.name}}_Tag;
-
-  {{union.name}}DataView() {}
-
-  {{union.name}}DataView(
-      internal::{{union.name}}_Data* data,
-      mojo::internal::SerializationContext* context)
-{%- if union|requires_context_for_data_view %}
-      : data_(data), context_(context) {}
-{%- else %}
-      : data_(data) {}
-{%- endif %}
-
-  bool is_null() const {
-    // For inlined unions, |data_| is always non-null. In that case we need to
-    // check |data_->is_null()|.
-    return !data_ || data_->is_null();
-  }
-
-  Tag tag() const { return data_->tag; }
-
-{%- for field in union.fields %}
-{%-   set kind = field.kind %}
-{%-   set name = field.name %}
-  bool is_{{name}}() const { return data_->tag == Tag::{{name|upper}}; }
-
-{%-   if kind|is_object_kind %}
-  inline void Get{{name|under_to_camel}}DataView(
-      {{kind|cpp_data_view_type}}* output);
-
-  template <typename UserType>
-  WARN_UNUSED_RESULT bool Read{{name|under_to_camel}}(UserType* output) {
-    DCHECK(is_{{name}}());
-    return mojo::internal::Deserialize<{{kind|unmapped_type_for_serializer}}>(
-        data_->data.f_{{name}}.Get(), output, context_);
-  }
-
-{%-   elif kind|is_enum_kind %}
-  template <typename UserType>
-  WARN_UNUSED_RESULT bool Read{{name|under_to_camel}}(UserType* output) const {
-    DCHECK(is_{{name}}());
-    return mojo::internal::Deserialize<{{kind|unmapped_type_for_serializer}}>(
-        data_->data.f_{{name}}, output);
-  }
-
-  {{kind|cpp_data_view_type}} {{name}}() const {
-    DCHECK(is_{{name}}());
-    return static_cast<{{kind|cpp_data_view_type}}>(
-        data_->data.f_{{name}});
-  }
-
-{%-   elif kind|is_any_handle_kind %}
-  {{kind|cpp_data_view_type}} Take{{name|under_to_camel}}() {
-    DCHECK(is_{{name}}());
-    {{kind|cpp_data_view_type}} result;
-    bool ret =
-        mojo::internal::Deserialize<{{kind|unmapped_type_for_serializer}}>(
-            &data_->data.f_{{name}}, &result, context_);
-    DCHECK(ret);
-    return result;
-  }
-
-{%-   elif kind|is_any_interface_kind %}
-  template <typename UserType>
-  UserType Take{{name|under_to_camel}}() {
-    DCHECK(is_{{name}}());
-    UserType result;
-    bool ret =
-        mojo::internal::Deserialize<{{kind|unmapped_type_for_serializer}}>(
-            &data_->data.f_{{name}}, &result, context_);
-    DCHECK(ret);
-    return result;
-  }
-
-{%-   else %}
-  {{kind|cpp_data_view_type}} {{name}}() const {
-    DCHECK(is_{{name}}());
-    return data_->data.f_{{name}};
-  }
-
-{%-   endif %}
-{%- endfor %}
-
- private:
-  internal::{{union.name}}_Data* data_ = nullptr;
-{%- if union|requires_context_for_data_view %}
-  mojo::internal::SerializationContext* context_ = nullptr;
-{%- endif %}
-};
-
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/union_data_view_definition.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/union_data_view_definition.tmpl
deleted file mode 100644
index 6da9280..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/union_data_view_definition.tmpl
+++ /dev/null
@@ -1,12 +0,0 @@
-{%- for field in union.fields %}
-{%-   set kind = field.kind %}
-{%-   set name = field.name %}
-
-{%-   if kind|is_object_kind %}
-inline void {{union.name}}DataView::Get{{name|under_to_camel}}DataView(
-    {{kind|cpp_data_view_type}}* output) {
-  DCHECK(is_{{name}}());
-  *output = {{kind|cpp_data_view_type}}(data_->data.f_{{name}}.Get(), context_);
-}
-{%-   endif %}
-{%- endfor %}
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/union_declaration.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/union_declaration.tmpl
deleted file mode 100644
index 005ba76..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/union_declaration.tmpl
+++ /dev/null
@@ -1,56 +0,0 @@
-{%- set class_name = union.name ~ "_Data" -%}
-{%- set enum_name = union.name ~ "_Tag" -%}
-{%- import "struct_macros.tmpl" as struct_macros %}
-
-class {{class_name}} {
- public:
-  // Used to identify Mojom Union Data Classes.
-  typedef void MojomUnionDataType;
-
-  {{class_name}}() {}
-  // Do nothing in the destructor since it won't be called when it is a
-  // non-inlined union.
-  ~{{class_name}}() {}
-
-  static {{class_name}}* New(mojo::internal::Buffer* buf) {
-    return new (buf->Allocate(sizeof({{class_name}}))) {{class_name}}();
-  }
-
-  static bool Validate(const void* data,
-                       mojo::internal::ValidationContext* validation_context,
-                       bool inlined);
-
-  bool is_null() const { return size == 0; }
-
-  void set_null() {
-    size = 0U;
-    tag = static_cast<{{enum_name}}>(0);
-    data.unknown = 0U;
-  }
-
-  enum class {{enum_name}} : uint32_t {
-{%  for field in union.fields %}
-    {{field.name|upper}},
-{%- endfor %}
-  };
-
-  // A note on layout:
-  // "Each non-static data member is allocated as if it were the sole member of
-  // a struct." - Section 9.5.2 ISO/IEC 14882:2011 (The C++ Spec)
-  union MOJO_ALIGNAS(8) Union_ {
-{%- for field in union.fields %}
-{%-   if field.kind.spec == 'b' %}
-    uint8_t f_{{field.name}} : 1;
-{%-   else %}
-    {{field.kind|cpp_union_field_type}} f_{{field.name}};
-{%-   endif %}
-{%- endfor %}
-    uint64_t unknown;
-  };
-
-  uint32_t size;
-  {{enum_name}} tag;
-  Union_ data;
-};
-static_assert(sizeof({{class_name}}) == mojo::internal::kUnionDataSize,
-              "Bad sizeof({{class_name}})");
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/union_definition.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/union_definition.tmpl
deleted file mode 100644
index af5ea9f..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/union_definition.tmpl
+++ /dev/null
@@ -1,47 +0,0 @@
-{%- import "validation_macros.tmpl" as validation_macros %}
-{%- set class_name = union.name ~ "_Data" %}
-{%- set enum_name = union.name ~ "_Tag" -%}
-
-// static
-bool {{class_name}}::Validate(
-    const void* data,
-    mojo::internal::ValidationContext* validation_context,
-    bool inlined) {
-  if (!data) {
-    DCHECK(!inlined);
-    return true;
-  }
-
-  // If it is inlined, the alignment is already enforced by its enclosing
-  // object. We don't have to validate that.
-  DCHECK(!inlined || mojo::internal::IsAligned(data));
-
-  if (!inlined &&
-      !mojo::internal::ValidateNonInlinedUnionHeaderAndClaimMemory(
-          data, validation_context)) {
-    return false;
-  }
-
-  const {{class_name}}* object = static_cast<const {{class_name}}*>(data);
-  ALLOW_UNUSED_LOCAL(object);
-
-  if (inlined && object->is_null())
-    return true;
-
-  switch (object->tag) {
-{%  for field in union.fields %}
-    case {{enum_name}}::{{field.name|upper}}: {
-{%-   set field_expr = "object->data.f_" ~ field.name %}
-{{validation_macros.validate_field(field, field_expr, union.name, false)|indent(4)}}
-      return true;
-    }
-{%- endfor %}
-    default: {
-      ReportValidationError(
-          validation_context,
-          mojo::internal::VALIDATION_ERROR_UNKNOWN_UNION_TAG,
-          "unknown tag in {{union.name}}");
-      return false;
-    }
-  }
-}
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/union_serialization_declaration.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/union_serialization_declaration.tmpl
deleted file mode 100644
index b589ae9..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/union_serialization_declaration.tmpl
+++ /dev/null
@@ -1,141 +0,0 @@
-{%- set data_view = union|get_qualified_name_for_kind ~ "DataView" %}
-{%- set data_type = union|get_qualified_name_for_kind(internal=True) %}
-
-namespace internal {
-
-template <typename MaybeConstUserType>
-struct Serializer<{{data_view}}, MaybeConstUserType> {
-  using UserType = typename std::remove_const<MaybeConstUserType>::type;
-  using Traits = UnionTraits<{{data_view}}, UserType>;
-
-  static size_t PrepareToSerialize(MaybeConstUserType& input,
-                                   bool inlined,
-                                   SerializationContext* context) {
-    size_t size = inlined ? 0 : sizeof({{data_type}});
-
-    if (CallIsNullIfExists<Traits>(input))
-      return size;
-
-    void* custom_context = CustomContextHelper<Traits>::SetUp(input, context);
-    ALLOW_UNUSED_LOCAL(custom_context);
-
-    switch (CallWithContext(Traits::GetTag, input, custom_context)) {
-{%- for field in union.fields %}
-{%-   set name = field.name %}
-      case {{data_view}}::Tag::{{name|upper}}: {
-{%-   if field.kind|is_object_kind or field.kind|is_associated_kind %}
-{%-     set kind = field.kind %}
-{%-     set serializer_type = kind|unmapped_type_for_serializer %}
-        decltype(CallWithContext(Traits::{{name}}, input, custom_context))
-            in_{{name}} = CallWithContext(Traits::{{name}}, input,
-                                          custom_context);
-{%-     if kind|is_union_kind %}
-        size += mojo::internal::PrepareToSerialize<{{serializer_type}}>(
-            in_{{name}}, false, context);
-{%-     else %}
-        size += mojo::internal::PrepareToSerialize<{{serializer_type}}>(
-            in_{{name}}, context);
-{%-     endif %}
-{%-   endif %}
-        break;
-      }
-{%- endfor %}
-    }
-    return size;
-  }
-
-  static void Serialize(MaybeConstUserType& input,
-                        Buffer* buffer,
-                        {{data_type}}** output,
-                        bool inlined,
-                        SerializationContext* context) {
-    if (CallIsNullIfExists<Traits>(input)) {
-      if (inlined)
-        (*output)->set_null();
-      else
-        *output = nullptr;
-      return;
-    }
-
-    void* custom_context = CustomContextHelper<Traits>::GetNext(context);
-
-    if (!inlined)
-      *output = {{data_type}}::New(buffer);
-
-    {{data_type}}* result = *output;
-    ALLOW_UNUSED_LOCAL(result);
-    // TODO(azani): Handle unknown and objects.
-    // Set the not-null flag.
-    result->size = kUnionDataSize;
-    result->tag = CallWithContext(Traits::GetTag, input, custom_context);
-    switch (result->tag) {
-{%- for field in union.fields %}
-{%-   set name = field.name %}
-{%-   set kind = field.kind %}
-{%-   set serializer_type = kind|unmapped_type_for_serializer %}
-      case {{data_view}}::Tag::{{field.name|upper}}: {
-        decltype(CallWithContext(Traits::{{name}}, input, custom_context))
-            in_{{name}} = CallWithContext(Traits::{{name}}, input,
-                                          custom_context);
-{%-   if kind|is_object_kind %}
-        typename decltype(result->data.f_{{name}})::BaseType* ptr;
-{%-     if kind|is_union_kind %}
-        mojo::internal::Serialize<{{serializer_type}}>(
-            in_{{name}}, buffer, &ptr, false, context);
-{%-     elif kind|is_array_kind or kind|is_map_kind %}
-        const ContainerValidateParams {{name}}_validate_params(
-            {{kind|get_container_validate_params_ctor_args|indent(16)}});
-        mojo::internal::Serialize<{{serializer_type}}>(
-            in_{{name}}, buffer, &ptr, &{{name}}_validate_params, context);
-{%-     else %}
-        mojo::internal::Serialize<{{serializer_type}}>(
-            in_{{name}}, buffer, &ptr, context);
-{%-     endif %}
-        result->data.f_{{name}}.Set(ptr);
-{%-     if not kind|is_nullable_kind %}
-        MOJO_INTERNAL_DLOG_SERIALIZATION_WARNING(
-            !ptr, mojo::internal::VALIDATION_ERROR_UNEXPECTED_NULL_POINTER,
-            "null {{name}} in {{union.name}} union");
-{%-     endif %}
-
-{%-   elif kind|is_any_handle_or_interface_kind %}
-        mojo::internal::Serialize<{{serializer_type}}>(
-            in_{{name}}, &result->data.f_{{name}}, context);
-{%-     if not kind|is_nullable_kind %}
-        MOJO_INTERNAL_DLOG_SERIALIZATION_WARNING(
-            !mojo::internal::IsHandleOrInterfaceValid(result->data.f_{{name}}),
-{%-       if kind|is_associated_kind %}
-            mojo::internal::VALIDATION_ERROR_UNEXPECTED_INVALID_INTERFACE_ID,
-{%-       else %}
-            mojo::internal::VALIDATION_ERROR_UNEXPECTED_INVALID_HANDLE,
-{%-       endif %}
-            "invalid {{name}} in {{union.name}} union");
-{%-     endif %}
-
-{%-   elif kind|is_enum_kind %}
-        mojo::internal::Serialize<{{serializer_type}}>(
-            in_{{name}}, &result->data.f_{{name}});
-
-{%-   else %}
-        result->data.f_{{name}} = in_{{name}};
-{%-   endif %}
-        break;
-      }
-{%- endfor %}
-    }
-
-    CustomContextHelper<Traits>::TearDown(input, custom_context);
-  }
-
-  static bool Deserialize({{data_type}}* input,
-                          UserType* output,
-                          SerializationContext* context) {
-    if (!input || input->is_null())
-      return CallSetToNullIfExists<Traits>(output);
-
-    {{data_view}} data_view(input, context);
-    return Traits::Read(data_view, output);
-  }
-};
-
-}  // namespace internal
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/union_traits_declaration.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/union_traits_declaration.tmpl
deleted file mode 100644
index 4933e57..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/union_traits_declaration.tmpl
+++ /dev/null
@@ -1,24 +0,0 @@
-{%- set mojom_type = union|get_qualified_name_for_kind %}
-
-template <>
-struct {{export_attribute}} UnionTraits<{{mojom_type}}::DataView,
-                                        {{mojom_type}}Ptr> {
-  static bool IsNull(const {{mojom_type}}Ptr& input) { return !input; }
-  static void SetToNull({{mojom_type}}Ptr* output) { output->reset(); }
-
-  static {{mojom_type}}::Tag GetTag(const {{mojom_type}}Ptr& input) {
-    return input->which();
-  }
-
-{%- for field in union.fields %}
-{%-   set maybe_const_in = "" if field.kind|contains_handles_or_interfaces else "const" %}
-{%-   set maybe_const_out = "" if field.kind|contains_handles_or_interfaces or not field.kind|is_reference_kind else "const" %}
-{#    We want the field accessor to be const whenever possible to allow
-      structs to be used as map keys. #}
-  static {{maybe_const_out}} {{field.kind|cpp_union_trait_getter_return_type}} {{field.name}}({{maybe_const_in}} {{mojom_type}}Ptr& input) {
-    return input->get_{{field.name}}();
-  }
-{%- endfor %}
-
-  static bool Read({{mojom_type}}::DataView input, {{mojom_type}}Ptr* output);
-};
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/union_traits_definition.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/union_traits_definition.tmpl
deleted file mode 100644
index cde3f95..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/union_traits_definition.tmpl
+++ /dev/null
@@ -1,47 +0,0 @@
-{%- set mojom_type = union|get_qualified_name_for_kind %}
-
-// static
-bool UnionTraits<{{mojom_type}}::DataView, {{mojom_type}}Ptr>::Read(
-    {{mojom_type}}::DataView input,
-    {{mojom_type}}Ptr* output) {
-  *output = {{mojom_type}}::New();
-  {{mojom_type}}Ptr& result = *output;
-
-  internal::UnionAccessor<{{mojom_type}}> result_acc(result.get());
-  switch (input.tag()) {
-{%- for field in union.fields %}
-    case {{mojom_type}}::Tag::{{field.name|upper}}: {
-{%-   set name = field.name %}
-{%-   set kind = field.kind %}
-{%-   set serializer_type = kind|unmapped_type_for_serializer %}
-{%-   if kind|is_object_kind %}
-      result_acc.SwitchActive({{mojom_type}}::Tag::{{name|upper}});
-      if (!input.Read{{name|under_to_camel}}(result_acc.data()->{{name}}))
-        return false;
-
-{%-   elif kind|is_any_handle_kind %}
-      auto result_{{name}} = input.Take{{name|under_to_camel}}();
-      result->set_{{name}}(std::move(result_{{name}}));
-
-{%-   elif kind|is_any_interface_kind %}
-      auto result_{{name}} =
-          input.Take{{name|under_to_camel}}<typename std::remove_reference<decltype(result->get_{{name}}())>::type>();
-      result->set_{{name}}(std::move(result_{{name}}));
-
-{%-   elif kind|is_enum_kind %}
-      decltype(result->get_{{name}}()) result_{{name}};
-      if (!input.Read{{name|under_to_camel}}(&result_{{name}}))
-        return false;
-      result->set_{{name}}(result_{{name}});
-
-{%-   else %}
-      result->set_{{name}}(input.{{name}}());
-{%-   endif %}
-      break;
-    }
-{%- endfor %}
-    default:
-      return false;
-  }
-  return true;
-}
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/validation_macros.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/validation_macros.tmpl
deleted file mode 100644
index a50a585..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/validation_macros.tmpl
+++ /dev/null
@@ -1,82 +0,0 @@
-{#- Validates the specified field, which is supposed to be an object
-    (struct/array/string/map/union). If it is a union, |union_is_inlined|
-    indicates whether the union is inlined. (Nested unions are not inlined.)
-    This macro is expanded by the Validate() method. #}
-{%- macro validate_object(field, field_expr, object_name, union_is_inlined) %}
-{%-   set name = field.name %}
-{%-   set kind = field.kind %}
-{%-   if not kind|is_nullable_kind %}
-{%-     if kind|is_union_kind and union_is_inlined %}
-  if (!mojo::internal::ValidateInlinedUnionNonNullable(
-          {{field_expr}}, "null {{name}} field in {{object_name}}",
-          validation_context)) {
-    return false;
-  }
-{%-     else %}
-  if (!mojo::internal::ValidatePointerNonNullable(
-          {{field_expr}}, "null {{name}} field in {{object_name}}",
-          validation_context)) {
-    return false;
-  }
-{%-     endif %}
-{%-   endif %}
-{%-   if kind|is_array_kind or kind|is_string_kind or kind|is_map_kind %}
-  const mojo::internal::ContainerValidateParams {{name}}_validate_params(
-      {{kind|get_container_validate_params_ctor_args|indent(6)}});
-  if (!mojo::internal::ValidateContainer({{field_expr}}, validation_context,
-                                         &{{name}}_validate_params)) {
-    return false;
-  }
-{%-   elif kind|is_struct_kind %}
-  if (!mojo::internal::ValidateStruct({{field_expr}}, validation_context))
-    return false;
-{%-   elif kind|is_union_kind %}
-{%-     if union_is_inlined %}
-  if (!mojo::internal::ValidateInlinedUnion({{field_expr}}, validation_context))
-    return false;
-{%-     else %}
-  if (!mojo::internal::ValidateNonInlinedUnion({{field_expr}},
-                                               validation_context))
-    return false;
-{%-     endif %}
-{%-   else %}
-#error Not reached!
-{%-   endif %}
-{%- endmacro %}
-
-{#- Validates the specified field, which is supposed to be a handle,
-    an interface, an associated interface or an associated interface request.
-    This macro is expanded by the Validate() method. #}
-{%- macro validate_handle_or_interface(field, field_expr, object_name) %}
-{%-   set name = field.name %}
-{%-   set kind = field.kind %}
-{%-   if not kind|is_nullable_kind %}
-  if (!mojo::internal::ValidateHandleOrInterfaceNonNullable(
-          {{field_expr}},
-          "invalid {{name}} field in {{object_name}}", validation_context)) {
-    return false;
-  }
-{%-   endif %}
-  if (!mojo::internal::ValidateHandleOrInterface({{field_expr}},
-                                                 validation_context)) {
-    return false;
-  }
-{%- endmacro %}
-
-{#- Validates the specified field, which is supposed to be an enum.
-    This macro is expanded by the Validate() method. #}
-{%- macro validate_enum(field, field_expr) %}
-  if (!{{field.kind|get_qualified_name_for_kind(internal=True,flatten_nested_kind=True)}}
-        ::Validate({{field_expr}}, validation_context))
-    return false;
-{%- endmacro %}
-
-{%- macro validate_field(field, field_expr, object_name, union_is_inlined) %}
-{%-   if field.kind|is_object_kind -%}
-{{validate_object(field, field_expr, object_name, union_is_inlined)}}
-{%-   elif field.kind|is_any_handle_or_interface_kind -%}
-{{validate_handle_or_interface(field, field_expr, object_name)}}
-{%-   elif field.kind|is_enum_kind %}
-{{validate_enum(field, field_expr)}}
-{%-   endif %}
-{%- endmacro %}
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/wrapper_class_declaration.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/wrapper_class_declaration.tmpl
deleted file mode 100644
index 7ad9b4e..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/wrapper_class_declaration.tmpl
+++ /dev/null
@@ -1,94 +0,0 @@
-class {{export_attribute}} {{struct.name}} {
- public:
-  using DataView = {{struct.name}}DataView;
-  using Data_ = internal::{{struct.name}}_Data;
-
-{#--- Enums #}
-{%- for enum in struct.enums -%}
-  using {{enum.name}} = {{enum|get_name_for_kind(flatten_nested_kind=True)}};
-{%- endfor %}
-
-{#--- Constants #}
-{%- for constant in struct.constants %}
-  static {{constant|format_constant_declaration(nested=True)}};
-{%- endfor %}
-
-  template <typename... Args>
-  static {{struct.name}}Ptr New(Args&&... args) {
-    return {{struct.name}}Ptr(
-        base::in_place,
-        std::forward<Args>(args)...);
-  }
-
-  template <typename U>
-  static {{struct.name}}Ptr From(const U& u) {
-    return mojo::TypeConverter<{{struct.name}}Ptr, U>::Convert(u);
-  }
-
-  template <typename U>
-  U To() const {
-    return mojo::TypeConverter<U, {{struct.name}}>::Convert(*this);
-  }
-
-{% for constructor in struct|struct_constructors %}
-  {% if constructor.params|length == 1 %}explicit {% endif %}{{struct.name}}(
-{%-   for field in constructor.params %}
-{%-     set type = field.kind|cpp_wrapper_param_type %}
-{%-     set name = field.name %}
-      {{type}} {{name}}
-{%-     if not loop.last -%},{%- endif %}
-{%-   endfor %});
-{% endfor %}
-  ~{{struct.name}}();
-
-  // Clone() is a template so it is only instantiated if it is used. Thus, the
-  // bindings generator does not need to know whether Clone() or copy
-  // constructor/assignment are available for members.
-  template <typename StructPtrType = {{struct.name}}Ptr>
-  {{struct.name}}Ptr Clone() const;
-
-  // Equals() is a template so it is only instantiated if it is used. Thus, the
-  // bindings generator does not need to know whether Equals() or == operator
-  // are available for members.
-  template <typename T,
-            typename std::enable_if<std::is_same<
-                T, {{struct.name}}>::value>::type* = nullptr>
-  bool Equals(const T& other) const;
-
-{%- if struct|is_hashable %}
-  size_t Hash(size_t seed) const;
-{%- endif %}
-
-{%- set serialization_result_type = "WTF::Vector<uint8_t>"
-        if for_blink else "std::vector<uint8_t>" %}
-
-  template <typename UserType>
-  static {{serialization_result_type}} Serialize(UserType* input) {
-    return mojo::internal::StructSerializeImpl<
-        {{struct.name}}::DataView, {{serialization_result_type}}>(input);
-  }
-
-  template <typename UserType>
-  static bool Deserialize(const {{serialization_result_type}}& input,
-                          UserType* output) {
-    return mojo::internal::StructDeserializeImpl<
-        {{struct.name}}::DataView, {{serialization_result_type}}>(
-            input, output, Validate);
-  }
-
-{#--- Struct members #}
-{%  for field in struct.fields %}
-{%-   set type = field.kind|cpp_wrapper_type %}
-{%-   set name = field.name %}
-  {{type}} {{name}};
-{%- endfor %}
-
- private:
-  static bool Validate(const void* data,
-                       mojo::internal::ValidationContext* validation_context);
-
-{%- if struct|contains_move_only_members %}
-  DISALLOW_COPY_AND_ASSIGN({{struct.name}});
-{%- endif %}
-};
-
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/wrapper_class_definition.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/wrapper_class_definition.tmpl
deleted file mode 100644
index ab8c22d..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/wrapper_class_definition.tmpl
+++ /dev/null
@@ -1,39 +0,0 @@
-{% for constructor in struct|struct_constructors %}
-{{struct.name}}::{{struct.name}}(
-{%-  for field in constructor.params  %}
-{%-    set type = field.kind|cpp_wrapper_param_type %}
-{%-    set name = field.name %}
-    {{type}} {{name}}_in
-{%-    if not loop.last -%},{%- endif %}
-{%-  endfor %})
-{%-  for field, is_parameter in constructor.fields %}
-{%-    set name = field.name %}
-    {% if loop.first %}:{% else %} {% endif %} {{name}}(
-{%-    if is_parameter -%}
-std::move({{name}}_in)
-{%-    else -%}
-{{ field|default_value }}
-{%-    endif -%}
-){%  if not loop.last %},{% endif %}
-{%-  endfor %} {}
-{% endfor %}
-{{struct.name}}::~{{struct.name}}() = default;
-
-{%- if struct|is_hashable %}
-size_t {{struct.name}}::Hash(size_t seed) const {
-{%-   for field in struct.fields %}
-{%-     if for_blink %}
-  seed = mojo::internal::WTFHash(seed, this->{{field.name}});
-{%-     else %}
-  seed = mojo::internal::Hash(seed, this->{{field.name}});
-{%-     endif %}
-{%-   endfor %}
-  return seed;
-}
-{%- endif %}
-
-bool {{struct.name}}::Validate(
-    const void* data,
-    mojo::internal::ValidationContext* validation_context) {
-  return Data_::Validate(data, validation_context);
-}
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/wrapper_class_template_definition.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/wrapper_class_template_definition.tmpl
deleted file mode 100644
index feb8615..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/wrapper_class_template_definition.tmpl
+++ /dev/null
@@ -1,20 +0,0 @@
-template <typename StructPtrType>
-{{struct.name}}Ptr {{struct.name}}::Clone() const {
-  return New(
-{%- for field in struct.fields %}
-      mojo::Clone({{field.name}})
-{%-   if not loop.last -%},{%- endif %}
-{%- endfor %}
-  );
-}
-
-template <typename T,
-          typename std::enable_if<std::is_same<
-              T, {{struct.name}}>::value>::type*>
-bool {{struct.name}}::Equals(const T& other) const {
-{%- for field in struct.fields %}
-  if (!mojo::internal::Equals(this->{{field.name}}, other.{{field.name}}))
-    return false;
-{%- endfor %}
-  return true;
-}
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/wrapper_union_class_declaration.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/wrapper_union_class_declaration.tmpl
deleted file mode 100644
index 8b7cf9e..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/wrapper_union_class_declaration.tmpl
+++ /dev/null
@@ -1,80 +0,0 @@
-class {{export_attribute}} {{union.name}} {
- public:
-  using DataView = {{union.name}}DataView;
-  using Data_ = internal::{{union.name}}_Data;
-  using Tag = Data_::{{union.name}}_Tag;
-
-  static {{union.name}}Ptr New();
-
-  template <typename U>
-  static {{union.name}}Ptr From(const U& u) {
-    return mojo::TypeConverter<{{union.name}}Ptr, U>::Convert(u);
-  }
-
-  template <typename U>
-  U To() const {
-    return mojo::TypeConverter<U, {{union.name}}>::Convert(*this);
-  }
-
-  {{union.name}}();
-  ~{{union.name}}();
-
-  // Clone() is a template so it is only instantiated if it is used. Thus, the
-  // bindings generator does not need to know whether Clone() or copy
-  // constructor/assignment are available for members.
-  template <typename UnionPtrType = {{union.name}}Ptr>
-  {{union.name}}Ptr Clone() const;
-
-  // Equals() is a template so it is only instantiated if it is used. Thus, the
-  // bindings generator does not need to know whether Equals() or == operator
-  // are available for members.
-  template <typename T,
-            typename std::enable_if<std::is_same<
-                T, {{union.name}}>::value>::type* = nullptr>
-  bool Equals(const T& other) const;
-
-{%- if union|is_hashable %}
-  size_t Hash(size_t seed) const;
-{%- endif %}
-
-  Tag which() const {
-    return tag_;
-  }
-
-{%  for field in union.fields %}
-  bool is_{{field.name}}() const { return tag_ == Tag::{{field.name|upper}}; }
-
-  {{field.kind|cpp_union_getter_return_type}} get_{{field.name}}() const {
-    DCHECK(tag_ == Tag::{{field.name|upper}});
-{%-   if field.kind|is_object_kind or
-         field.kind|is_any_handle_or_interface_kind %}
-    return *(data_.{{field.name}});
-{%-   else %}
-    return data_.{{field.name}};
-{%-   endif %}
-  }
-
-  void set_{{field.name}}({{field.kind|cpp_wrapper_param_type}} {{field.name}});
-{%- endfor %}
-
- private:
-  friend class mojo::internal::UnionAccessor<{{union.name}}>;
-  union Union_ {
-    Union_() {}
-    ~Union_() {}
-
-{%- for field in union.fields %}
-{%-   if field.kind|is_object_kind or
-         field.kind|is_any_handle_or_interface_kind %}
-    {{field.kind|cpp_wrapper_type}}* {{field.name}};
-{%-   else %}
-    {{field.kind|cpp_wrapper_type}} {{field.name}};
-{%-   endif %}
-{%- endfor %}
-  };
-  void SwitchActive(Tag new_active);
-  void SetActive(Tag new_active);
-  void DestroyActive();
-  Tag tag_;
-  Union_ data_;
-};
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/wrapper_union_class_definition.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/wrapper_union_class_definition.tmpl
deleted file mode 100644
index b9e416a..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/wrapper_union_class_definition.tmpl
+++ /dev/null
@@ -1,85 +0,0 @@
-// static
-{{union.name}}Ptr {{union.name}}::New() {
-  return {{union.name}}Ptr(base::in_place);
-}
-
-{{union.name}}::{{union.name}}() {
-  // TODO(azani): Implement default values here when/if we support them.
-  // TODO(azani): Set to UNKNOWN when unknown is implemented.
-  SetActive(static_cast<Tag>(0));
-}
-
-{{union.name}}::~{{union.name}}() {
-  DestroyActive();
-}
-
-{%  for field in union.fields %}
-void {{union.name}}::set_{{field.name}}({{field.kind|cpp_wrapper_param_type}} {{field.name}}) {
-  SwitchActive(Tag::{{field.name|upper}});
-{%    if field.kind|is_string_kind %}
-  *(data_.{{field.name}}) = {{field.name}};
-{%    elif field.kind|is_object_kind or
-           field.kind|is_any_handle_or_interface_kind %}
-  *(data_.{{field.name}}) = std::move({{field.name}});
-{%-   else %}
-  data_.{{field.name}} = {{field.name}};
-{%-   endif %}
-}
-{%- endfor %}
-
-void {{union.name}}::SwitchActive(Tag new_active) {
-  if (new_active == tag_) {
-    return;
-  }
-
-  DestroyActive();
-  SetActive(new_active);
-}
-
-void {{union.name}}::SetActive(Tag new_active) {
-  switch (new_active) {
-{%  for field in union.fields %}
-    case Tag::{{field.name|upper}}:
-{%    if field.kind|is_object_kind or
-         field.kind|is_any_handle_or_interface_kind %}
-      data_.{{field.name}} = new {{field.kind|cpp_wrapper_type}}();
-{%-   endif %}
-      break;
-{%- endfor %}
-  }
-
-  tag_ = new_active;
-}
-
-void {{union.name}}::DestroyActive() {
-  switch (tag_) {
-{%  for field in union.fields %}
-    case Tag::{{field.name|upper}}:
-{%    if field.kind|is_object_kind or
-         field.kind|is_any_handle_or_interface_kind %}
-      delete data_.{{field.name}};
-{%-   endif %}
-      break;
-{%- endfor %}
-  }
-}
-
-{%- if union|is_hashable %}
-size_t {{union.name}}::Hash(size_t seed) const {
-  seed = mojo::internal::HashCombine(seed, static_cast<uint32_t>(tag_));
-  switch (tag_) {
-{%  for field in union.fields %}
-    case Tag::{{field.name|upper}}:
-{%-   if for_blink %}
-      return mojo::internal::WTFHash(seed, data_.{{field.name}});
-{%-   else %}
-      return mojo::internal::Hash(seed, data_.{{field.name}});
-{%-   endif %}
-{%- endfor %}
-    default:
-      NOTREACHED();
-      return seed;
-  }
-}
-
-{%- endif %}
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/wrapper_union_class_template_definition.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/wrapper_union_class_template_definition.tmpl
deleted file mode 100644
index 4c4851f..0000000
--- a/mojo/public/tools/bindings/generators/cpp_templates/wrapper_union_class_template_definition.tmpl
+++ /dev/null
@@ -1,41 +0,0 @@
-template <typename UnionPtrType>
-{{union.name}}Ptr {{union.name}}::Clone() const {
-  // Use UnionPtrType to prevent the compiler from trying to compile this
-  // without being asked.
-  UnionPtrType rv(New());
-  switch (tag_) {
-{%- for field in union.fields %}
-    case Tag::{{field.name|upper}}:
-{%-   if field.kind|is_object_kind or
-         field.kind|is_any_handle_or_interface_kind %}
-      rv->set_{{field.name}}(mojo::Clone(*data_.{{field.name}}));
-{%-   else %}
-      rv->set_{{field.name}}(mojo::Clone(data_.{{field.name}}));
-{%-   endif %}
-      break;
-{%- endfor %}
-  };
-  return rv;
-}
-
-template <typename T,
-          typename std::enable_if<std::is_same<
-              T, {{union.name}}>::value>::type*>
-bool {{union.name}}::Equals(const T& other) const {
-  if (tag_ != other.which())
-    return false;
-
-  switch (tag_) {
-{%- for field in union.fields %}
-    case Tag::{{field.name|upper}}:
-{%-   if field.kind|is_object_kind or
-         field.kind|is_any_handle_or_interface_kind %}
-      return mojo::internal::Equals(*(data_.{{field.name}}), *(other.data_.{{field.name}}));
-{%-   else %}
-      return mojo::internal::Equals(data_.{{field.name}}, other.data_.{{field.name}});
-{%-   endif %}
-{%- endfor %}
-  };
-
-  return false;
-}
diff --git a/mojo/public/tools/bindings/generators/java_templates/constant_definition.tmpl b/mojo/public/tools/bindings/generators/java_templates/constant_definition.tmpl
deleted file mode 100644
index db193e2..0000000
--- a/mojo/public/tools/bindings/generators/java_templates/constant_definition.tmpl
+++ /dev/null
@@ -1,3 +0,0 @@
-{% macro constant_def(constant) %}
-public static final {{constant.kind|java_type}} {{constant|name}} = {{constant|constant_value}};
-{% endmacro %}
diff --git a/mojo/public/tools/bindings/generators/java_templates/constants.java.tmpl b/mojo/public/tools/bindings/generators/java_templates/constants.java.tmpl
deleted file mode 100644
index 0a4e299..0000000
--- a/mojo/public/tools/bindings/generators/java_templates/constants.java.tmpl
+++ /dev/null
@@ -1,12 +0,0 @@
-{% from "constant_definition.tmpl" import constant_def %}
-{% include "header.java.tmpl" %}
-
-public final class {{main_entity}} {
-{%  for constant in constants %}
-
-    {{constant_def(constant)|indent(4)}}
-{%  endfor %}
-
-    private {{main_entity}}() {}
-
-}
diff --git a/mojo/public/tools/bindings/generators/java_templates/data_types_definition.tmpl b/mojo/public/tools/bindings/generators/java_templates/data_types_definition.tmpl
deleted file mode 100644
index 4c0823c..0000000
--- a/mojo/public/tools/bindings/generators/java_templates/data_types_definition.tmpl
+++ /dev/null
@@ -1,418 +0,0 @@
-{%- from "constant_definition.tmpl" import constant_def %}
-{%- from "enum_definition.tmpl" import enum_def %}
-
-{%- macro equality(kind, v1, v2, ne=False) -%}
-{%-   if kind|is_reference_kind -%}
-{%-     if kind|is_array_kind -%}
-{%-       if kind.kind|is_reference_kind -%}
-{%- if ne %}!{%- endif %}java.util.Arrays.deepEquals({{v1}}, {{v2}})
-{%-       else -%}
-{%- if ne %}!{%- endif %}java.util.Arrays.equals({{v1}}, {{v2}})
-{%-       endif -%}
-{%-     else -%}
-{%- if ne %}!{%- endif %}org.chromium.mojo.bindings.BindingsHelper.equals({{v1}}, {{v2}})
-{%-     endif -%}
-{%-   else -%}
-{{v1}} {%- if ne %}!={%- else %}=={%- endif %} {{v2}}
-{%-   endif -%}
-{%- endmacro -%}
-
-{%- macro hash(kind, v) -%}
-{%-   if kind|is_array_kind -%}
-{%-     if kind.kind|is_reference_kind -%}
-java.util.Arrays.deepHashCode({{v}})
-{%-     else -%}
-java.util.Arrays.hashCode({{v}})
-{%-     endif -%}
-{%-   else -%}
-org.chromium.mojo.bindings.BindingsHelper.hashCode({{v}})
-{%-   endif -%}
-{%- endmacro -%}
-
-{%- macro array_element_size(kind) -%}
-{%-  if kind|is_union_kind %}
-org.chromium.mojo.bindings.BindingsHelper.UNION_SIZE
-{%-  else -%}
-org.chromium.mojo.bindings.BindingsHelper.POINTER_SIZE
-{%-  endif -%}
-{%- endmacro -%}
-
-{%- macro encode(variable, kind, offset, bit, level=0, check_for_null=True) %}
-{%- if kind|is_pointer_array_kind or kind|is_union_array_kind %}
-{%- set sub_kind = kind.kind %}
-{%-   if check_for_null %}
-if ({{variable}} == null) {
-    encoder{{level}}.encodeNullPointer({{offset}}, {{kind|is_nullable_kind|java_true_false}});
-} else {
-{%-   else %}
-{
-{%-   endif %}
-{%-   if kind|is_pointer_array_kind %}
-{%-     set encodePointer = 'encodePointerArray' %}
-{%-   else %}
-{%-     set encodePointer = 'encodeUnionArray' %}
-{%-   endif %}
-    org.chromium.mojo.bindings.Encoder encoder{{level + 1}} = encoder{{level}}.{{encodePointer}}({{variable}}.length, {{offset}}, {{kind|array_expected_length}});
-    for (int i{{level}} = 0; i{{level}} < {{variable}}.length; ++i{{level}}) {
-        {{encode(variable~'[i'~level~']', sub_kind, 'org.chromium.mojo.bindings.DataHeader.HEADER_SIZE + ' ~ array_element_size(sub_kind) ~ ' * i'~level, 0, level+1)|indent(8)}}
-    }
-}
-{%- elif kind|is_map_kind %}
-if ({{variable}} == null) {
-    encoder{{level}}.encodeNullPointer({{offset}}, {{kind|is_nullable_kind|java_true_false}});
-} else {
-    org.chromium.mojo.bindings.Encoder encoder{{level + 1}} = encoder{{level}}.encoderForMap({{offset}});
-    int size{{level}} = {{variable}}.size();
-    {{kind.key_kind|java_type}}[] keys{{level}} = {{kind.key_kind|array|new_array('size'~level)}};
-    {{kind.value_kind|java_type}}[] values{{level}} = {{kind.value_kind|array|new_array('size'~level)}};
-    int index{{level}} = 0;
-    for (java.util.Map.Entry<{{kind.key_kind|java_type(true)}}, {{kind.value_kind|java_type(true)}}> entry{{level}} : {{variable}}.entrySet()) {
-        keys{{level}}[index{{level}}] = entry{{level}}.getKey();
-        values{{level}}[index{{level}}] = entry{{level}}.getValue();
-        ++index{{level}};
-    }
-    {{encode('keys'~level, kind.key_kind|array, 'org.chromium.mojo.bindings.DataHeader.HEADER_SIZE', 0, level+1, False)|indent(4)}}
-    {{encode('values'~level, kind.value_kind|array, 'org.chromium.mojo.bindings.DataHeader.HEADER_SIZE + org.chromium.mojo.bindings.BindingsHelper.POINTER_SIZE', 0, level+1, False)|indent(4)}}
-}
-{%- else %}
-encoder{{level}}.{{kind|encode_method(variable, offset, bit)}};
-{%- endif %}
-{%- endmacro %}
-
-{%- macro decode(variable, kind, offset, bit, level=0) %}
-{%- if kind|is_struct_kind or
-      kind|is_pointer_array_kind or
-      kind|is_union_array_kind or
-      kind|is_map_kind %}
-org.chromium.mojo.bindings.Decoder decoder{{level+1}} = decoder{{level}}.readPointer({{offset}}, {{kind|is_nullable_kind|java_true_false}});
-{%-   if kind|is_struct_kind %}
-{{variable}} = {{kind|java_type}}.decode(decoder{{level+1}});
-{%-   else %}{# kind|is_pointer_array_kind or is_map_kind #}
-{%-     if kind|is_nullable_kind %}
-if (decoder{{level+1}} == null) {
-    {{variable}} = null;
-} else {
-{%-     else %}
-{
-{%-     endif %}
-{%-     if kind|is_map_kind %}
-    decoder{{level+1}}.readDataHeaderForMap();
-    {{kind.key_kind|java_type}}[] keys{{level}};
-    {{kind.value_kind|java_type}}[] values{{level}};
-    {
-        {{decode('keys'~level, kind.key_kind|array, 'org.chromium.mojo.bindings.DataHeader.HEADER_SIZE', 0, level+1)|indent(8)}}
-    }
-    {
-        {{decode('values'~level, kind.value_kind|array('keys'~level~'.length'), 'org.chromium.mojo.bindings.DataHeader.HEADER_SIZE + org.chromium.mojo.bindings.BindingsHelper.POINTER_SIZE', 0, level+1)|indent(8)}}
-    }
-    {{variable}} = new java.util.HashMap<{{kind.key_kind|java_type(true)}}, {{kind.value_kind|java_type(true)}}>();
-    for (int index{{level}} = 0; index{{level}} < keys{{level}}.length; ++index{{level}}) {
-        {{variable}}.put(keys{{level}}[index{{level}}],  values{{level}}[index{{level}}]);
-    }
-{%-     else %}
-    org.chromium.mojo.bindings.DataHeader si{{level+1}} = decoder{{level+1}}.readDataHeaderForPointerArray({{kind|array_expected_length}});
-    {{variable}} = {{kind|new_array('si'~(level+1)~'.elementsOrVersion')}};
-    for (int i{{level+1}} = 0; i{{level+1}} < si{{level+1}}.elementsOrVersion; ++i{{level+1}}) {
-        {{decode(variable~'[i'~(level+1)~']', kind.kind, 'org.chromium.mojo.bindings.DataHeader.HEADER_SIZE + ' ~ array_element_size(kind.kind) ~' * i'~(level+1), 0, level+1)|indent(8)}}
-    }
-{%-     endif %}
-}
-{%-   endif %}
-{%- elif kind|is_union_kind %}
-{{variable}} = {{kind|java_type}}.decode(decoder{{level}}, {{offset}});
-{%- else %}
-{{variable}} = decoder{{level}}.{{kind|decode_method(offset, bit)}};
-{%-   if kind|is_array_kind and kind.kind|is_enum_kind %}
-{%-     if kind|is_nullable_kind %}
-if ({{variable}} != null) {
-{%-     else %}
-{
-{%-     endif %}
-    for (int i{{level}} = 0; i{{level}} < {{variable}}.length; ++i{{level}}) {
-        {{kind.kind|java_class_for_enum}}.validate({{variable}}[i{{level}}]);
-    }
-}
-{%-   elif kind|is_enum_kind %}
-    {{kind|java_class_for_enum}}.validate({{variable}});
-{%-   endif %}
-{%- endif %}
-{%- endmacro %}
-
-{%- macro struct_def(struct, inner_class=False) %}
-{{'static' if inner_class else 'public'}} final class {{struct|name}} extends org.chromium.mojo.bindings.Struct {
-
-    private static final int STRUCT_SIZE = {{struct.versions[-1].num_bytes}};
-    private static final org.chromium.mojo.bindings.DataHeader[] VERSION_ARRAY = new org.chromium.mojo.bindings.DataHeader[] {
-{%-   for version in struct.versions -%}
-        new org.chromium.mojo.bindings.DataHeader({{version.num_bytes}}, {{version.version}}){%- if not loop.last %}, {%- endif -%}
-{%-   endfor -%}
-    };
-    private static final org.chromium.mojo.bindings.DataHeader DEFAULT_STRUCT_INFO = VERSION_ARRAY[{{struct.versions|length - 1}}];
-{%-  for constant in struct.constants %}
-
-    {{constant_def(constant)|indent(4)}}
-{%-  endfor %}
-{%-  for enum in struct.enums %}
-
-    {{enum_def(enum, false)|indent(4)}}
-{%- endfor %}
-{%- if struct.fields %}
-
-{%-   for field in struct.fields %}
-    public {{field.kind|java_type}} {{field|name}};
-{%-   endfor %}
-{%- endif %}
-
-    private {{struct|name}}(int version) {
-        super(STRUCT_SIZE, version);
-{%- for field in struct.fields %}
-{%-   if field.default %}
-        {{field|name}} = {{field|default_value}};
-{%-   elif field.kind|is_any_handle_kind %}
-        {{field|name}} = org.chromium.mojo.system.InvalidHandle.INSTANCE;
-{%-   endif %}
-{%- endfor %}
-    }
-
-    public {{struct|name}}() {
-        this({{struct.versions[-1].version}});
-    }
-
-    public static {{struct|name}} deserialize(org.chromium.mojo.bindings.Message message) {
-        return decode(new org.chromium.mojo.bindings.Decoder(message));
-    }
-
-    /**
-     * Similar to the method above, but deserializes from a |ByteBuffer| instance.
-     *
-     * @throws org.chromium.mojo.bindings.DeserializationException on deserialization failure.
-     */
-    public static {{struct|name}} deserialize(java.nio.ByteBuffer data) {
-        if (data == null)
-            return null;
-
-        return deserialize(new org.chromium.mojo.bindings.Message(
-                data, new java.util.ArrayList<org.chromium.mojo.system.Handle>()));
-    }
-
-    @SuppressWarnings("unchecked")
-    public static {{struct|name}} decode(org.chromium.mojo.bindings.Decoder decoder0) {
-        if (decoder0 == null) {
-            return null;
-        }
-        decoder0.increaseStackDepth();
-        {{struct|name}} result;
-        try {
-            org.chromium.mojo.bindings.DataHeader mainDataHeader = decoder0.readAndValidateDataHeader(VERSION_ARRAY);
-            result = new {{struct|name}}(mainDataHeader.elementsOrVersion);
-{%- for byte in struct.bytes %}
-{%-   for packed_field in byte.packed_fields %}
-            if (mainDataHeader.elementsOrVersion >= {{packed_field.min_version}}) {
-                {{decode('result.' ~ packed_field.field|name, packed_field.field.kind, 8+packed_field.offset, packed_field.bit)|indent(16)}}
-            }
-{%-   endfor %}
-{%- endfor %}
-        } finally {
-            decoder0.decreaseStackDepth();
-        }
-        return result;
-    }
-
-    @SuppressWarnings("unchecked")
-    @Override
-    protected final void encode(org.chromium.mojo.bindings.Encoder encoder) {
-{%- if not struct.bytes %}
-        encoder.getEncoderAtDataOffset(DEFAULT_STRUCT_INFO);
-{%- else %}
-        org.chromium.mojo.bindings.Encoder encoder0 = encoder.getEncoderAtDataOffset(DEFAULT_STRUCT_INFO);
-{%- endif %}
-{%- for byte in struct.bytes %}
-{%-   for packed_field in byte.packed_fields %}
-        {{encode(packed_field.field|name, packed_field.field.kind, 8+packed_field.offset, packed_field.bit)|indent(8)}}
-{%-   endfor %}
-{%- endfor %}
-    }
-
-    /**
-     * @see Object#equals(Object)
-     */
-    @Override
-    public boolean equals(Object object) {
-        if (object == this)
-            return true;
-        if (object == null)
-            return false;
-        if (getClass() != object.getClass())
-            return false;
-{%- if struct.fields|length %}
-        {{struct|name}} other = ({{struct|name}}) object;
-{%-   for field in struct.fields %}
-        if ({{equality(field.kind, 'this.'~field|name, 'other.'~field|name, True)}})
-            return false;
-{%-   endfor %}
-{%- endif %}
-        return true;
-    }
-
-    /**
-     * @see Object#hashCode()
-     */
-    @Override
-    public int hashCode() {
-        final int prime = 31;
-        int result = prime + getClass().hashCode();
-{%- for field in struct.fields %}
-        result = prime * result + {{hash(field.kind, field|name)}};
-{%- endfor %}
-        return result;
-    }
-}
-{%- endmacro %}
-
-
-{%- macro union_def(union) %}
-public final class {{union|name}} extends org.chromium.mojo.bindings.Union {
-
-    public static final class Tag {
-{%-   for field in union.fields %}
-        public static final int {{field|ucc}} = {{loop.index0}};
-{%-   endfor %}
-    };
-
-    private int mTag_ = -1;
-{%-   for field in union.fields %}
-    private {{field.kind|java_type}} m{{field|ucc}};
-{%-   endfor %}
-
-    public int which() {
-      return mTag_;
-    }
-
-    public boolean isUnknown() {
-      return mTag_ == -1;
-    }
-{%-   for field in union.fields %}
-
-    // TODO(rockot): Fix the findbugs error and remove this suppression.
-    // See http://crbug.com/570386.
-    @SuppressFBWarnings("EI_EXPOSE_REP2")
-    public void set{{field|ucc}}({{field.kind|java_type}} {{field|name}}) {
-        mTag_ = Tag.{{field|ucc}};
-        m{{field|ucc}} = {{field|name}};
-    }
-
-    // TODO(rockot): Fix the findbugs error and remove this suppression.
-    // See http://crbug.com/570386.
-    @SuppressFBWarnings("EI_EXPOSE_REP")
-    public {{field.kind|java_type}} get{{field|ucc}}() {
-        assert mTag_ == Tag.{{field|ucc}};
-        return m{{field|ucc}};
-    }
-{%-   endfor %}
-
-
-    @Override
-    protected final void encode(org.chromium.mojo.bindings.Encoder encoder0, int offset) {
-        encoder0.encode(org.chromium.mojo.bindings.BindingsHelper.UNION_SIZE, offset);
-        encoder0.encode(mTag_, offset + 4);
-        switch (mTag_) {
-{%-   for field in union.fields %}
-            case Tag.{{field|ucc}}: {
-{%-     if field.kind|is_union_kind %}
-                if (m{{field|ucc}} == null) {
-                    encoder0.encodeNullPointer(offset + 8, {{field.kind|is_nullable_kind|java_true_false}});
-                } else {
-                    m{{field|ucc}}.encode(encoder0.encoderForUnionPointer(offset + 8), 0);
-                }
-{%-     else %}
-                {{encode('m' ~ field|ucc, field.kind, 'offset + 8', 0)|indent(16)}}
-{%-     endif %}
-                break;
-            }
-{%-   endfor %}
-            default: {
-                break;
-            }
-        }
-    }
-
-    public static {{union|name}} deserialize(org.chromium.mojo.bindings.Message message) {
-        return decode(new org.chromium.mojo.bindings.Decoder(message).decoderForSerializedUnion(), 0);
-    }
-
-    public static final {{union|name}} decode(org.chromium.mojo.bindings.Decoder decoder0, int offset) {
-        org.chromium.mojo.bindings.DataHeader dataHeader = decoder0.readDataHeaderForUnion(offset);
-        if (dataHeader.size == 0) {
-            return null;
-        }
-        {{union|name}} result = new {{union|name}}();
-        switch (dataHeader.elementsOrVersion) {
-{%-   for field in union.fields %}
-            case Tag.{{field|ucc}}: {
-{%-     if field.kind|is_union_kind %}
-                org.chromium.mojo.bindings.Decoder decoder1 = decoder0.readPointer(offset + org.chromium.mojo.bindings.DataHeader.HEADER_SIZE, {{field.kind|is_nullable_kind|java_true_false}});
-                if (decoder1 != null) {
-                    result.m{{field|ucc}} = {{field.kind|name}}.decode(decoder1, 0);
-                }
-{%-     else %}
-                {{decode('result.m'~field|ucc, field.kind, 'offset + org.chromium.mojo.bindings.DataHeader.HEADER_SIZE', 0)|indent(16)}}
-{%-     endif %}
-                result.mTag_ = Tag.{{field|ucc}};
-                break;
-            }
-{%-   endfor %}
-            default: {
-                break;
-            }
-        }
-        return result;
-    }
-
-    /**
-     * @see Object#equals(Object)
-     */
-    @Override
-    public boolean equals(Object object) {
-        if (object == this)
-            return true;
-        if (object == null)
-            return false;
-        if (getClass() != object.getClass())
-            return false;
-        {{union|name}} other = ({{union|name}}) object;
-        if (mTag_ != other.mTag_)
-            return false;
-        switch (mTag_) {
-{%-   for field in union.fields %}
-            case Tag.{{field|ucc}}:
-                return {{equality(field.kind, 'm'~field|ucc, 'other.m'~field|ucc)}};
-{%-   endfor %}
-            default:
-                break;
-        }
-        return false;
-    }
-
-    /**
-     * @see Object#hashCode()
-     */
-    @Override
-    public int hashCode() {
-        final int prime = 31;
-        int result = prime + getClass().hashCode();
-        result = prime * result + org.chromium.mojo.bindings.BindingsHelper.hashCode(mTag_);
-        switch (mTag_) {
-{%-   for field in union.fields %}
-            case Tag.{{field|ucc}}: {
-                result = prime * result + {{hash(field.kind, 'm'~field|ucc)}};
-                break;
-            }
-{%-   endfor %}
-            default: {
-                break;
-            }
-        }
-        return result;
-    }
-}
-{%- endmacro %}
diff --git a/mojo/public/tools/bindings/generators/java_templates/enum.java.tmpl b/mojo/public/tools/bindings/generators/java_templates/enum.java.tmpl
deleted file mode 100644
index 7096a18..0000000
--- a/mojo/public/tools/bindings/generators/java_templates/enum.java.tmpl
+++ /dev/null
@@ -1,4 +0,0 @@
-{% from "enum_definition.tmpl" import enum_def %}
-{% include "header.java.tmpl" %}
-
-{{enum_def(enum, true)}}
diff --git a/mojo/public/tools/bindings/generators/java_templates/enum_definition.tmpl b/mojo/public/tools/bindings/generators/java_templates/enum_definition.tmpl
deleted file mode 100644
index d37288a..0000000
--- a/mojo/public/tools/bindings/generators/java_templates/enum_definition.tmpl
+++ /dev/null
@@ -1,42 +0,0 @@
-{%- macro enum_value(enum, field, index) -%}
-{%- if field.value -%}
-(int) ({{field.value|expression_to_text('i32')}})
-{%- elif index == 0 -%}
-0
-{%- else -%}
-{{enum.fields[index - 1]|name}} + 1
-{%- endif -%}
-{%- endmacro -%}
-
-{%- macro enum_def(enum, top_level) -%}
-public {{ 'static ' if not top_level }}final class {{enum|name}} {
-
-{% for field in enum.fields %}
-    public static final int {{field|name}} = {{enum_value(enum, field, loop.index0)}};
-{% endfor %}
-
-    private static final boolean IS_EXTENSIBLE = {% if enum.extensible %}true{% else %}false{% endif %};
-
-    public static boolean isKnownValue(int value) {
-{%- if enum.fields %}
-        switch (value) {
-{%-   for enum_field in enum.fields|groupby('numeric_value') %}
-            case {{enum_field[0]}}:
-{%-   endfor %}
-                return true;
-        }
-{%- endif %}
-        return false;
-    }
-
-    public static void validate(int value) {
-        if (IS_EXTENSIBLE || isKnownValue(value))
-            return;
-
-        throw new DeserializationException("Invalid enum value.");
-    }
-
-    private {{enum|name}}() {}
-
-}
-{%- endmacro -%}
diff --git a/mojo/public/tools/bindings/generators/java_templates/header.java.tmpl b/mojo/public/tools/bindings/generators/java_templates/header.java.tmpl
deleted file mode 100644
index 1d67890..0000000
--- a/mojo/public/tools/bindings/generators/java_templates/header.java.tmpl
+++ /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.
-
-// This file is autogenerated by:
-//     mojo/public/tools/bindings/mojom_bindings_generator.py
-// For:
-//     {{module.path}}
-//
-
-package {{package}};
-
-import org.chromium.base.annotations.SuppressFBWarnings;
-import org.chromium.mojo.bindings.DeserializationException;
\ No newline at end of file
diff --git a/mojo/public/tools/bindings/generators/java_templates/interface.java.tmpl b/mojo/public/tools/bindings/generators/java_templates/interface.java.tmpl
deleted file mode 100644
index a13be3e..0000000
--- a/mojo/public/tools/bindings/generators/java_templates/interface.java.tmpl
+++ /dev/null
@@ -1,4 +0,0 @@
-{% from "interface_definition.tmpl" import interface_def %}
-{% include "header.java.tmpl" %}
-
-{{ interface_def(interface) }}
diff --git a/mojo/public/tools/bindings/generators/java_templates/interface_definition.tmpl b/mojo/public/tools/bindings/generators/java_templates/interface_definition.tmpl
deleted file mode 100644
index a723f8c..0000000
--- a/mojo/public/tools/bindings/generators/java_templates/interface_definition.tmpl
+++ /dev/null
@@ -1,297 +0,0 @@
-{% from "constant_definition.tmpl" import constant_def %}
-{% from "enum_definition.tmpl" import enum_def %}
-{% from "data_types_definition.tmpl" import struct_def %}
-
-{%- macro declare_params(parameters, boxed=false) %}
-{%-   for param in parameters -%}
-{{param.kind|java_type(boxed)}} {{param|name}}
-{%- if not loop.last %}, {% endif %}
-{%-   endfor %}
-{%- endmacro %}
-
-{% macro declare_request_params(method) %}
-{{declare_params(method.parameters)}}
-{%-   if method.response_parameters != None -%}
-{%- if method.parameters %}, {% endif %}
-{{method|interface_response_name}} callback
-{%-   endif -%}
-{% endmacro %}
-
-{%- macro declare_callback(method) -%}
-
-interface {{method|interface_response_name}} extends org.chromium.mojo.bindings.Callbacks.Callback{{method.response_parameters|length}}{% if method.response_parameters %}<
-{%-   for param in method.response_parameters -%}
-{{param.kind|java_type(True)}}
-{%- if not loop.last %}, {% endif %}
-{%-   endfor -%}
->{% endif %} { }
-{%- endmacro -%}
-
-{%- macro run_callback(variable, parameters) -%}
-{%-   if parameters -%}
-{%-     for param in parameters -%}
-{{variable}}.{{param|name}}
-{%-   if not loop.last %}, {% endif %}
-{%-     endfor -%}
-{%-   endif -%}
-{%- endmacro -%}
-
-{%- macro flags_for_method(method, is_request) -%}
-{{flags(method.response_parameters != None, is_request)}}
-{%- endmacro -%}
-
-{%- macro flags(use_response_flag, is_request) -%}
-{%-  if not use_response_flag -%}
-org.chromium.mojo.bindings.MessageHeader.NO_FLAG
-{%-   elif is_request: -%}
-org.chromium.mojo.bindings.MessageHeader.MESSAGE_EXPECTS_RESPONSE_FLAG
-{%-   else -%}
-org.chromium.mojo.bindings.MessageHeader.MESSAGE_IS_RESPONSE_FLAG
-{%-   endif -%}
-{%- endmacro -%}
-
-{%- macro manager_class(interface, fully_qualified=False) -%}
-{% if fully_qualified %}org.chromium.mojo.bindings.Interface.{% endif %}Manager<{{interface|name}}, {{interface|name}}.Proxy>
-{%- endmacro -%}
-
-{%- macro manager_def(interface) -%}
-public static final {{manager_class(interface, True)}} MANAGER =
-        new {{manager_class(interface, True)}}() {
-
-    public String getName() {
-        return "{{namespace|replace(".","::")}}::{{interface.name}}";
-    }
-
-    public int getVersion() {
-      return {{interface.version}};
-    }
-
-    public Proxy buildProxy(org.chromium.mojo.system.Core core,
-                            org.chromium.mojo.bindings.MessageReceiverWithResponder messageReceiver) {
-        return new Proxy(core, messageReceiver);
-    }
-
-    public Stub buildStub(org.chromium.mojo.system.Core core, {{interface|name}} impl) {
-        return new Stub(core, impl);
-    }
-
-    public {{interface|name}}[] buildArray(int size) {
-      return new {{interface|name}}[size];
-    }
-};
-{%- endmacro -%}
-
-{%- macro accept_body(interface, with_response) -%}
-try {
-    org.chromium.mojo.bindings.ServiceMessage messageWithHeader =
-            message.asServiceMessage();
-    org.chromium.mojo.bindings.MessageHeader header = messageWithHeader.getHeader();
-    if (!header.validateHeader({{flags(with_response, True)}})) {
-        return false;
-    }
-    switch(header.getType()) {
-{%   if with_response %}
-        case org.chromium.mojo.bindings.interfacecontrol.InterfaceControlMessagesConstants.RUN_MESSAGE_ID:
-            return org.chromium.mojo.bindings.InterfaceControlMessagesHelper.handleRun(
-                    getCore(), {{interface|name}}_Internal.MANAGER, messageWithHeader, receiver);
-{%   else %}
-        case org.chromium.mojo.bindings.interfacecontrol.InterfaceControlMessagesConstants.RUN_OR_CLOSE_PIPE_MESSAGE_ID:
-            return org.chromium.mojo.bindings.InterfaceControlMessagesHelper.handleRunOrClosePipe(
-                    {{interface|name}}_Internal.MANAGER, messageWithHeader);
-{%   endif %}
-{%   for method in interface.methods %}
-{%     if (with_response and method.response_parameters != None) or
-        (not with_response and method.response_parameters == None) %}
-{%       set request_struct = method.param_struct %}
-{%       if with_response %}
-{%         set response_struct = method.response_param_struct %}
-{%       endif %}
-        case {{method|method_ordinal_name}}: {
-{%       if method.parameters %}
-            {{request_struct|name}} data =
-                    {{request_struct|name}}.deserialize(messageWithHeader.getPayload());
-{%       else %}
-            {{request_struct|name}}.deserialize(messageWithHeader.getPayload());
-{%       endif %}
-            try {
-                getImpl().{{method|name}}({{run_callback('data', method.parameters)}}{% if with_response %}{% if method.parameters %}, {% endif %}new {{response_struct|name}}ProxyToResponder(getCore(), receiver, header.getRequestId()){% endif %});
-            } catch (RuntimeException e) {
-                // TODO(lhchavez): Remove this hack. See b/28814913 for details.
-                android.util.Log.wtf("{{namespace}}.{{interface.name}}", "Uncaught runtime exception", e);
-            }
-            return true;
-        }
-{%     endif %}
-{%   endfor %}
-        default:
-            return false;
-    }
-} catch (org.chromium.mojo.bindings.DeserializationException e) {
-    System.err.println(e.toString());
-    return false;
-}
-{%- endmacro -%}
-
-{% macro interface_def(interface) %}
-public interface {{interface|name}} extends org.chromium.mojo.bindings.Interface {
-{%  for constant in interface.constants %}
-
-    {{constant_def(constant)|indent(4)}}
-{%  endfor %}
-{%  for enum in interface.enums %}
-
-    {{enum_def(enum, false)|indent(4)}}
-{% endfor %}
-
-    public interface Proxy extends {{interface|name}}, org.chromium.mojo.bindings.Interface.Proxy {
-    }
-
-    {{manager_class(interface)}} MANAGER = {{interface|name}}_Internal.MANAGER;
-{% for method in interface.methods %}
-
-    void {{method|name}}({{declare_request_params(method)}});
-{%   if method.response_parameters != None %}
-    {{declare_callback(method)|indent(4)}}
-{%   endif %}
-{% endfor %}
-}
-{% endmacro %}
-
-{% macro interface_internal_def(interface) %}
-class {{interface|name}}_Internal {
-
-    {{manager_def(interface)|indent(4)}}
-
-{% for method in interface.methods %}
-    private static final int {{method|method_ordinal_name}} = {{method.ordinal}};
-{% endfor %}
-
-    static final class Proxy extends org.chromium.mojo.bindings.Interface.AbstractProxy implements {{interface|name}}.Proxy {
-
-        Proxy(org.chromium.mojo.system.Core core,
-              org.chromium.mojo.bindings.MessageReceiverWithResponder messageReceiver) {
-            super(core, messageReceiver);
-        }
-{% for method in interface.methods %}
-
-        @Override
-        public void {{method|name}}({{declare_request_params(method)}}) {
-{%   set request_struct = method.param_struct %}
-            {{request_struct|name}} _message = new {{request_struct|name}}();
-{%   for param in method.parameters %}
-            _message.{{param|name}} = {{param|name}};
-{%   endfor %}
-{%   if method.response_parameters != None %}
-            getProxyHandler().getMessageReceiver().acceptWithResponder(
-                    _message.serializeWithHeader(
-                            getProxyHandler().getCore(),
-                            new org.chromium.mojo.bindings.MessageHeader(
-                                    {{method|method_ordinal_name}},
-                                    {{flags_for_method(method, True)}},
-                                    0)),
-                    new {{method.response_param_struct|name}}ForwardToCallback(callback));
-{%   else %}
-            getProxyHandler().getMessageReceiver().accept(
-                    _message.serializeWithHeader(
-                            getProxyHandler().getCore(),
-                            new org.chromium.mojo.bindings.MessageHeader({{method|method_ordinal_name}})));
-{%   endif %}
-        }
-{% endfor %}
-
-    }
-
-    static final class Stub extends org.chromium.mojo.bindings.Interface.Stub<{{interface|name}}> {
-
-        Stub(org.chromium.mojo.system.Core core, {{interface|name}} impl) {
-            super(core, impl);
-        }
-
-        @Override
-        public boolean accept(org.chromium.mojo.bindings.Message message) {
-            {{accept_body(interface, False)|indent(12)}}
-        }
-
-        @Override
-        public boolean acceptWithResponder(org.chromium.mojo.bindings.Message message, org.chromium.mojo.bindings.MessageReceiver receiver) {
-            {{accept_body(interface, True)|indent(12)}}
-        }
-    }
-{% for method in interface.methods %}
-
-    {{ struct_def(method.param_struct, True)|indent(4) }}
-{%   if method.response_parameters != None %}
-{%   set response_struct = method.response_param_struct %}
-
-    {{ struct_def(response_struct, True)|indent(4) }}
-
-    static class {{response_struct|name}}ForwardToCallback extends org.chromium.mojo.bindings.SideEffectFreeCloseable
-            implements org.chromium.mojo.bindings.MessageReceiver {
-        private final {{interface|name}}.{{method|interface_response_name}} mCallback;
-
-        {{response_struct|name}}ForwardToCallback({{interface|name}}.{{method|interface_response_name}} callback) {
-            this.mCallback = callback;
-        }
-
-        @Override
-        public boolean accept(org.chromium.mojo.bindings.Message message) {
-            try {
-                org.chromium.mojo.bindings.ServiceMessage messageWithHeader =
-                        message.asServiceMessage();
-                org.chromium.mojo.bindings.MessageHeader header = messageWithHeader.getHeader();
-                if (!header.validateHeader({{method|method_ordinal_name}},
-                                           {{flags_for_method(method, False)}})) {
-                    return false;
-                }
-{%   if method.response_parameters|length %}
-                {{response_struct|name}} response = {{response_struct|name}}.deserialize(messageWithHeader.getPayload());
-{%   endif %}
-                try {
-                    mCallback.call({{run_callback('response', method.response_parameters)}});
-                } catch (RuntimeException e) {
-                    // TODO(lhchavez): Remove this hack. See b/28814913 for details.
-                    android.util.Log.wtf("{{namespace}}.{{interface.name}}", "Uncaught runtime exception", e);
-                }
-                return true;
-            } catch (org.chromium.mojo.bindings.DeserializationException e) {
-                return false;
-            }
-        }
-    }
-
-    static class {{response_struct|name}}ProxyToResponder implements {{interface|name}}.{{method|interface_response_name}} {
-
-        private final org.chromium.mojo.system.Core mCore;
-        private final org.chromium.mojo.bindings.MessageReceiver mMessageReceiver;
-        private final long mRequestId;
-
-        {{response_struct|name}}ProxyToResponder(
-                org.chromium.mojo.system.Core core,
-                org.chromium.mojo.bindings.MessageReceiver messageReceiver,
-                long requestId) {
-            mCore = core;
-            mMessageReceiver = messageReceiver;
-            mRequestId = requestId;
-        }
-
-        @Override
-        public void call({{declare_params(method.response_parameters, true)}}) {
-            {{response_struct|name}} _response = new {{response_struct|name}}();
-{%   for param in method.response_parameters %}
-            _response.{{param|name}} = {{param|name}};
-{%   endfor %}
-            org.chromium.mojo.bindings.ServiceMessage _message =
-                    _response.serializeWithHeader(
-                            mCore,
-                            new org.chromium.mojo.bindings.MessageHeader(
-                                    {{method|method_ordinal_name}},
-                                    {{flags_for_method(method, False)}},
-                                    mRequestId));
-            mMessageReceiver.accept(_message);
-        }
-    }
-{%   endif %}
-{% endfor %}
-
-}
-{% endmacro %}
diff --git a/mojo/public/tools/bindings/generators/java_templates/interface_internal.java.tmpl b/mojo/public/tools/bindings/generators/java_templates/interface_internal.java.tmpl
deleted file mode 100644
index 50c7a7b..0000000
--- a/mojo/public/tools/bindings/generators/java_templates/interface_internal.java.tmpl
+++ /dev/null
@@ -1,4 +0,0 @@
-{% from "interface_definition.tmpl" import interface_internal_def %}
-{% include "header.java.tmpl" %}
-
-{{ interface_internal_def(interface) }}
diff --git a/mojo/public/tools/bindings/generators/java_templates/struct.java.tmpl b/mojo/public/tools/bindings/generators/java_templates/struct.java.tmpl
deleted file mode 100644
index e28ba19..0000000
--- a/mojo/public/tools/bindings/generators/java_templates/struct.java.tmpl
+++ /dev/null
@@ -1,4 +0,0 @@
-{% from "data_types_definition.tmpl" import struct_def %}
-{% include "header.java.tmpl" %}
-
-{{ struct_def(struct) }}
diff --git a/mojo/public/tools/bindings/generators/java_templates/union.java.tmpl b/mojo/public/tools/bindings/generators/java_templates/union.java.tmpl
deleted file mode 100644
index b8cd4aa..0000000
--- a/mojo/public/tools/bindings/generators/java_templates/union.java.tmpl
+++ /dev/null
@@ -1,4 +0,0 @@
-{% from "data_types_definition.tmpl" import union_def %}
-{% include "header.java.tmpl" %}
-
-{{ union_def(union) }}
diff --git a/mojo/public/tools/bindings/generators/js_templates/enum_definition.tmpl b/mojo/public/tools/bindings/generators/js_templates/enum_definition.tmpl
deleted file mode 100644
index 019b1b6..0000000
--- a/mojo/public/tools/bindings/generators/js_templates/enum_definition.tmpl
+++ /dev/null
@@ -1,33 +0,0 @@
-{%- macro enum_def(enum_name, enum) -%}
-  {{enum_name}} = {};
-{%-   set prev_enum = 0 %}
-{%-   for field in enum.fields %}
-{%-     if field.value %}
-  {{enum_name}}.{{field.name}} = {{field.value|expression_to_text}};
-{%-     elif loop.first %}
-  {{enum_name}}.{{field.name}} = 0;
-{%-     else %}
-  {{enum_name}}.{{field.name}} = {{enum_name}}.{{enum.fields[loop.index0 - 1].name}} + 1;
-{%-     endif %}
-{%-   endfor %}
-
-  {{enum_name}}.isKnownEnumValue = function(value) {
-{%-   if enum.fields %}
-    switch (value) {
-{%-       for enum_field in enum.fields|groupby('numeric_value') %}
-    case {{enum_field[0]}}:
-{%-     endfor %}
-      return true;
-    }
-{%-   endif %}
-    return false;
-  };
-
-  {{enum_name}}.validate = function(enumValue) {
-    var isExtensible = {% if enum.extensible %}true{% else %}false{% endif %};
-    if (isExtensible || this.isKnownEnumValue(enumValue))
-      return validator.validationError.NONE;
-
-    return validator.validationError.UNKNOWN_ENUM_VALUE;
-  };
-{%- endmacro %}
diff --git a/mojo/public/tools/bindings/generators/js_templates/interface_definition.tmpl b/mojo/public/tools/bindings/generators/js_templates/interface_definition.tmpl
deleted file mode 100644
index 11e319c..0000000
--- a/mojo/public/tools/bindings/generators/js_templates/interface_definition.tmpl
+++ /dev/null
@@ -1,198 +0,0 @@
-{%- for method in interface.methods %}
-  var k{{interface.name}}_{{method.name}}_Name = {{method.ordinal}};
-{%- endfor %}
-
-  function {{interface.name}}Ptr(handleOrPtrInfo) {
-    this.ptr = new bindings.InterfacePtrController({{interface.name}},
-                                                   handleOrPtrInfo);
-  }
-
-  function {{interface.name}}Proxy(receiver) {
-    this.receiver_ = receiver;
-  }
-
-{%- for method in interface.methods %}
-  {{interface.name}}Ptr.prototype.{{method.name|stylize_method}} = function() {
-    return {{interface.name}}Proxy.prototype.{{method.name|stylize_method}}
-        .apply(this.ptr.getProxy(), arguments);
-  };
-
-  {{interface.name}}Proxy.prototype.{{method.name|stylize_method}} = function(
-{%- for parameter in method.parameters -%}
-{{parameter.name}}{% if not loop.last %}, {% endif %}
-{%- endfor -%}
-) {
-    var params = new {{interface.name}}_{{method.name}}_Params();
-{%- for parameter in method.parameters %}
-    params.{{parameter.name}} = {{parameter.name}};
-{%- endfor %}
-
-{%- if method.response_parameters == None %}
-    var builder = new codec.MessageBuilder(
-        k{{interface.name}}_{{method.name}}_Name,
-        codec.align({{interface.name}}_{{method.name}}_Params.encodedSize));
-    builder.encodeStruct({{interface.name}}_{{method.name}}_Params, params);
-    var message = builder.finish();
-    this.receiver_.accept(message);
-{%- else %}
-    return new Promise(function(resolve, reject) {
-      var builder = new codec.MessageWithRequestIDBuilder(
-          k{{interface.name}}_{{method.name}}_Name,
-          codec.align({{interface.name}}_{{method.name}}_Params.encodedSize),
-          codec.kMessageExpectsResponse, 0);
-      builder.encodeStruct({{interface.name}}_{{method.name}}_Params, params);
-      var message = builder.finish();
-      this.receiver_.acceptAndExpectResponse(message).then(function(message) {
-        var reader = new codec.MessageReader(message);
-        var responseParams =
-            reader.decodeStruct({{interface.name}}_{{method.name}}_ResponseParams);
-        resolve(responseParams);
-      }).catch(function(result) {
-        reject(Error("Connection error: " + result));
-      });
-    }.bind(this));
-{%- endif %}
-  };
-{%- endfor %}
-
-  function {{interface.name}}Stub(delegate) {
-    this.delegate_ = delegate;
-  }
-
-{%- for method in interface.methods %}
-{%-   set js_method_name = method.name|stylize_method %}
-  {{interface.name}}Stub.prototype.{{js_method_name}} = function({{method.parameters|map(attribute='name')|join(', ')}}) {
-    return this.delegate_ && this.delegate_.{{js_method_name}} && this.delegate_.{{js_method_name}}({{method.parameters|map(attribute='name')|join(', ')}});
-  }
-{%- endfor %}
-
-  {{interface.name}}Stub.prototype.accept = function(message) {
-    var reader = new codec.MessageReader(message);
-    switch (reader.messageName) {
-{%- for method in interface.methods %}
-{%- if method.response_parameters == None %}
-    case k{{interface.name}}_{{method.name}}_Name:
-      var params = reader.decodeStruct({{interface.name}}_{{method.name}}_Params);
-      this.{{method.name|stylize_method}}(
-{%- for parameter in method.parameters -%}
-  params.{{parameter.name}}{% if not loop.last %}, {% endif %}
-{%- endfor %});
-      return true;
-{%- endif %}
-{%- endfor %}
-    default:
-      return false;
-    }
-  };
-
-  {{interface.name}}Stub.prototype.acceptWithResponder =
-      function(message, responder) {
-    var reader = new codec.MessageReader(message);
-    switch (reader.messageName) {
-{%- for method in interface.methods %}
-{%- if method.response_parameters != None %}
-    case k{{interface.name}}_{{method.name}}_Name:
-      var params = reader.decodeStruct({{interface.name}}_{{method.name}}_Params);
-      this.{{method.name|stylize_method}}(
-{%- for parameter in method.parameters -%}
-params.{{parameter.name}}{% if not loop.last %}, {% endif -%}
-{%- endfor %}).then(function(response) {
-        var responseParams =
-            new {{interface.name}}_{{method.name}}_ResponseParams();
-{%-     for parameter in method.response_parameters %}
-        responseParams.{{parameter.name}} = response.{{parameter.name}};
-{%-     endfor %}
-        var builder = new codec.MessageWithRequestIDBuilder(
-            k{{interface.name}}_{{method.name}}_Name,
-            codec.align({{interface.name}}_{{method.name}}_ResponseParams.encodedSize),
-            codec.kMessageIsResponse, reader.requestID);
-        builder.encodeStruct({{interface.name}}_{{method.name}}_ResponseParams,
-                             responseParams);
-        var message = builder.finish();
-        responder.accept(message);
-      });
-      return true;
-{%- endif %}
-{%- endfor %}
-    default:
-      return false;
-    }
-  };
-
-{#--- Validation #}
-
-  function validate{{interface.name}}Request(messageValidator) {
-{%- if not(interface.methods) %}
-    return validator.validationError.NONE;
-{%- else %}
-    var message = messageValidator.message;
-    var paramsClass = null;
-    switch (message.getName()) {
-{%-   for method in interface.methods %}
-      case k{{interface.name}}_{{method.name}}_Name:
-{%-     if method.response_parameters == None %}
-        if (!message.expectsResponse() && !message.isResponse())
-          paramsClass = {{interface.name}}_{{method.name}}_Params;
-{%-     else %}
-        if (message.expectsResponse())
-          paramsClass = {{interface.name}}_{{method.name}}_Params;
-{%-     endif %}
-      break;
-{%-   endfor %}
-    }
-    if (paramsClass === null)
-      return validator.validationError.NONE;
-    return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes());
-{%- endif %}
-  }
-
-  function validate{{interface.name}}Response(messageValidator) {
-{%- if not(interface|has_callbacks) %}
-    return validator.validationError.NONE;
-{%- else %}
-   var message = messageValidator.message;
-   var paramsClass = null;
-   switch (message.getName()) {
-{%-   for method in interface.methods %}
-{%-     if method.response_parameters != None %}
-      case k{{interface.name}}_{{method.name}}_Name:
-        if (message.isResponse())
-          paramsClass = {{interface.name}}_{{method.name}}_ResponseParams;
-        break;
-{%-     endif %}
-{%-   endfor %}
-    }
-    if (paramsClass === null)
-      return validator.validationError.NONE;
-    return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes());
-{%- endif %}
-  }
-
-  var {{interface.name}} = {
-    name: '{{namespace|replace(".","::")}}::{{interface.name}}',
-    kVersion: {{interface.version}},
-    ptrClass: {{interface.name}}Ptr,
-    proxyClass: {{interface.name}}Proxy,
-    stubClass: {{interface.name}}Stub,
-    validateRequest: validate{{interface.name}}Request,
-{%- if interface|has_callbacks %}
-    validateResponse: validate{{interface.name}}Response,
-{%- else %}
-    validateResponse: null,
-{%- endif %}
-  };
-{#--- Interface Constants #}
-{%- for constant in interface.constants %}
-  {{interface.name}}.{{constant.name}} = {{constant.value|expression_to_text}},
-{%-   endfor %}
-{#--- Interface Enums #}
-{%- from "enum_definition.tmpl" import enum_def -%}
-{%- for enum in interface.enums %}
-  {{ enum_def("%s.%s"|format(interface.name, enum.name), enum) }}
-{%-  endfor %}
-  {{interface.name}}Stub.prototype.validator = validate{{interface.name}}Request;
-{%- if interface|has_callbacks %}
-  {{interface.name}}Proxy.prototype.validator = validate{{interface.name}}Response;
-{%- else %}
-  {{interface.name}}Proxy.prototype.validator = null;
-{%- endif %}
diff --git a/mojo/public/tools/bindings/generators/js_templates/module.amd.tmpl b/mojo/public/tools/bindings/generators/js_templates/module.amd.tmpl
deleted file mode 100644
index 3637b19..0000000
--- a/mojo/public/tools/bindings/generators/js_templates/module.amd.tmpl
+++ /dev/null
@@ -1,70 +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.
-
-{%- if use_new_js_bindings %}
-
-'use strict';
-
-(function() {
-  var mojomId = '{{module.path}}';
-  if (mojo.internal.isMojomLoaded(mojomId)) {
-    console.warn('The following mojom is loaded multiple times: ' + mojomId);
-    return;
-  }
-  mojo.internal.markMojomLoaded(mojomId);
-
-  // TODO(yzshen): Define these aliases to minimize the differences between the
-  // old/new modes. Remove them when the old mode goes away.
-  var bindings = mojo;
-  var codec = mojo.internal;
-  var validator = mojo.internal;
-
-{%-   for import in imports %}
-  var {{import.unique_name}} =
-      mojo.internal.exposeNamespace('{{import.module.namespace}}');
-  if (mojo.config.autoLoadMojomDeps) {
-    mojo.internal.loadMojomIfNecessary(
-        '{{import.module.path}}',
-        new URL(
-            '{{import.module|get_relative_path(module)}}.js',
-            document.currentScript.src).href);
-  }
-{%-   endfor %}
-
-{% include "module_definition.tmpl" %}
-})();
-
-{%- else %}
-
-define("{{module.path}}", [
-{%- if module.path !=
-         "mojo/public/interfaces/bindings/interface_control_messages.mojom" and
-       module.path !=
-         "mojo/public/interfaces/bindings/pipe_control_messages.mojom" %}
-    "mojo/public/js/bindings",
-{%-   endif %}
-    "mojo/public/js/codec",
-    "mojo/public/js/core",
-    "mojo/public/js/validator",
-{%-   for import in imports %}
-    "{{import.module.path}}",
-{%-   endfor %}
-], function(
-{%- if module.path !=
-         "mojo/public/interfaces/bindings/interface_control_messages.mojom" and
-       module.path !=
-         "mojo/public/interfaces/bindings/pipe_control_messages.mojom" -%}
-bindings, {% endif -%}
-codec, core, validator
-{%-   for import in imports -%}
-    , {{import.unique_name}}
-{%-   endfor -%}
-) {
-
-{%- include "module_definition.tmpl" %}
-
-  return exports;
-});
-
-{%- endif %}
diff --git a/mojo/public/tools/bindings/generators/js_templates/module_definition.tmpl b/mojo/public/tools/bindings/generators/js_templates/module_definition.tmpl
deleted file mode 100644
index a119ee9..0000000
--- a/mojo/public/tools/bindings/generators/js_templates/module_definition.tmpl
+++ /dev/null
@@ -1,49 +0,0 @@
-{#--- Constants #}
-{%- for constant in module.constants %}
-  var {{constant.name}} = {{constant.value|expression_to_text}};
-{%- endfor %}
-
-{#--- Enums #}
-{%- from "enum_definition.tmpl" import enum_def %}
-{%- for enum in enums %}
-  var {{ enum_def(enum.name, enum) }}
-{%-  endfor %}
-
-{#--- Struct definitions #}
-{%  for struct in structs %}
-{%-   include "struct_definition.tmpl" %}
-{%- endfor -%}
-
-{#--- Union definitions #}
-{%- from "union_definition.tmpl" import union_def %}
-{%- for union in unions %}
-{{union_def(union)|indent(2)}}
-{%- endfor %}
-
-{#--- Interface definitions #}
-{%- for interface in interfaces -%}
-{%-   include "interface_definition.tmpl" %}
-{%- endfor %}
-
-{%- if use_new_js_bindings %}
-  var exports = mojo.internal.exposeNamespace("{{module.namespace}}");
-{%- else %}
-  var exports = {};
-{%- endif %}
-
-{%- for constant in module.constants %}
-  exports.{{constant.name}} = {{constant.name}};
-{%- endfor %}
-{%- for enum in enums %}
-  exports.{{enum.name}} = {{enum.name}};
-{%- endfor %}
-{%- for struct in structs if struct.exported %}
-  exports.{{struct.name}} = {{struct.name}};
-{%- endfor %}
-{%- for union in unions %}
-  exports.{{union.name}} = {{union.name}};
-{%- endfor %}
-{%- for interface in interfaces %}
-  exports.{{interface.name}} = {{interface.name}};
-  exports.{{interface.name}}Ptr = {{interface.name}}Ptr;
-{%- endfor %}
diff --git a/mojo/public/tools/bindings/generators/js_templates/struct_definition.tmpl b/mojo/public/tools/bindings/generators/js_templates/struct_definition.tmpl
deleted file mode 100644
index e823e46..0000000
--- a/mojo/public/tools/bindings/generators/js_templates/struct_definition.tmpl
+++ /dev/null
@@ -1,126 +0,0 @@
-{#--- Begin #}
-  function {{struct.name}}(values) {
-    this.initDefaults_();
-    this.initFields_(values);
-  }
-
-{#--- Enums #}
-{%- from "enum_definition.tmpl" import enum_def %}
-{%  for enum in struct.enums %}
-  {{enum_def("%s.%s"|format(struct.name, enum.name), enum)}}
-{%-  endfor %}
-
-{#--- Constants #}
-{%  for constant in struct.constants %}
-  {{struct.name}}.{{constant.name}} = {{constant.value|expression_to_text}};
-{%-  endfor %}
-
-{#--- initDefaults() #}
-  {{struct.name}}.prototype.initDefaults_ = function() {
-{%- for packed_field in struct.packed.packed_fields %}
-    this.{{packed_field.field.name}} = {{packed_field.field|default_value}};
-{%- endfor %}
-  };
-
-{#--- initFields() #}
-  {{struct.name}}.prototype.initFields_ = function(fields) {
-    for(var field in fields) {
-        if (this.hasOwnProperty(field))
-          this[field] = fields[field];
-    }
-  };
-
-{#--- Validation #}
-
-  {{struct.name}}.validate = function(messageValidator, offset) {
-    var err;
-    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
-    if (err !== validator.validationError.NONE)
-        return err;
-
-    var kVersionSizes = [
-{%- for version in struct.versions %}
-      {version: {{version.version}}, numBytes: {{version.num_bytes}}}{% if not loop.last %},
-      {%- endif -%}
-{%  endfor %}
-    ];
-    err = messageValidator.validateStructVersion(offset, kVersionSizes);
-    if (err !== validator.validationError.NONE)
-        return err;
-
-{#- Before validating fields introduced at a certain version, we need to add
-    a version check, which makes sure we skip further validation if |object|
-    is from an earlier version. |last_checked_version| records the last
-    version that we have added such version check. #}
-{%- from "validation_macros.tmpl" import validate_struct_field %}
-{%- set last_checked_version = 0 %}
-{%- for packed_field in struct.packed.packed_fields_in_ordinal_order %}
-{%-   set offset = packed_field|field_offset %}
-{%-   set field = packed_field.field %}
-{%-   set name = struct.name ~ '.' ~ field.name %}
-{%    if field|is_object_field or field|is_any_handle_or_interface_field or
-          field|is_enum_field %}
-{%      if packed_field.min_version > last_checked_version %}
-{%        set last_checked_version = packed_field.min_version %}
-    // version check {{name}}
-    if (!messageValidator.isFieldInStructVersion(offset, {{packed_field.min_version}}))
-      return validator.validationError.NONE;
-{%-     endif -%}
-{{validate_struct_field(field, offset, name)|indent(4)}}
-{%-   endif %}
-{%- endfor %}
-
-    return validator.validationError.NONE;
-  };
-
-{#--- Encoding and decoding #}
-
-  {{struct.name}}.encodedSize = codec.kStructHeaderSize + {{struct.packed|payload_size}};
-
-  {{struct.name}}.decode = function(decoder) {
-    var packed;
-    var val = new {{struct.name}}();
-    var numberOfBytes = decoder.readUint32();
-    var version = decoder.readUint32();
-{%- for byte in struct.bytes %}
-{%-   if byte.packed_fields|length >= 1 and
-         byte.packed_fields[0].field|is_bool_field %}
-    packed = decoder.readUint8();
-{%-     for packed_field in byte.packed_fields %}
-    val.{{packed_field.field.name}} = (packed >> {{packed_field.bit}}) & 1 ? true : false;
-{%-     endfor %}
-{%-   else %}
-{%-     for packed_field in byte.packed_fields %}
-    val.{{packed_field.field.name}} = decoder.{{packed_field.field.kind|decode_snippet}};
-{%-     endfor %}
-{%-   endif %}
-{%-   if byte.is_padding %}
-    decoder.skip(1);
-{%-   endif %}
-{%- endfor %}
-    return val;
-  };
-
-  {{struct.name}}.encode = function(encoder, val) {
-    var packed;
-    encoder.writeUint32({{struct.name}}.encodedSize);
-    encoder.writeUint32({{struct.versions[-1].version}});
-
-{%- for byte in struct.bytes %}
-{%-   if byte.packed_fields|length >= 1 and
-         byte.packed_fields[0].field|is_bool_field %}
-    packed = 0;
-{%-     for packed_field in byte.packed_fields %}
-    packed |= (val.{{packed_field.field.name}} & 1) << {{packed_field.bit}}
-{%-     endfor %}
-    encoder.writeUint8(packed);
-{%-   else %}
-{%-     for packed_field in byte.packed_fields %}
-    encoder.{{packed_field.field.kind|encode_snippet}}val.{{packed_field.field.name}});
-{%-     endfor %}
-{%-   endif %}
-{%-   if byte.is_padding %}
-    encoder.skip(1);
-{%-   endif %}
-{%- endfor %}
-  };
diff --git a/mojo/public/tools/bindings/generators/js_templates/union_definition.tmpl b/mojo/public/tools/bindings/generators/js_templates/union_definition.tmpl
deleted file mode 100644
index 4823feb..0000000
--- a/mojo/public/tools/bindings/generators/js_templates/union_definition.tmpl
+++ /dev/null
@@ -1,154 +0,0 @@
-{%- macro union_def(union) %}
-function {{union.name}}(value) {
-  this.initDefault_();
-  this.initValue_(value);
-}
-
-{{tags(union)}}
-
-{{union.name}}.prototype.initDefault_ = function() {
-  this.$data = null;
-  this.$tag = undefined;
-}
-
-{{union.name}}.prototype.initValue_ = function(value) {
-  if (value == undefined) {
-    return;
-  }
-
-  var keys = Object.keys(value);
-  if (keys.length == 0) {
-    return;
-  }
-
-  if (keys.length > 1) {
-    throw new TypeError("You may set only one member on a union.");
-  }
-
-  var fields = [
-{%-   for field in union.fields %}
-      "{{field.name}}",
-{%-   endfor %}
-  ];
-
-  if (fields.indexOf(keys[0]) < 0) {
-    throw new ReferenceError(keys[0] + " is not a {{union.name}} member.");
-
-  }
-
-  this[keys[0]] = value[keys[0]];
-}
-
-{%-   for field in union.fields %}
-Object.defineProperty({{union.name}}.prototype, "{{field.name}}", {
-  get: function() {
-    if (this.$tag != {{union.name}}.Tags.{{field.name}}) {
-      throw new ReferenceError(
-          "{{union.name}}.{{field.name}} is not currently set.");
-    }
-    return this.$data;
-  },
-
-  set: function(value) {
-    this.$tag = {{union.name}}.Tags.{{field.name}};
-    this.$data = value;
-  }
-});
-{%-   endfor %}
-
-{{encode(union)|indent(2)}}
-
-{{decode(union)|indent(2)}}
-
-{{validate(union)|indent(2)}}
-
-{{union.name}}.encodedSize = 16;
-{%- endmacro %}
-
-{%- macro tags(union) %}
-{{union.name}}.Tags = {
-{%-   for field in union.fields %}
-  {{field.name}}: {{field.ordinal}},
-{%-   endfor %}
-};
-{%- endmacro %}
-
-{%- macro encode(union) %}
-{{union.name}}.encode = function(encoder, val) {
-  if (val == null) {
-    encoder.writeUint64(0);
-    encoder.writeUint64(0);
-    return;
-  }
-  if (val.$tag == undefined) {
-    throw new TypeError("Cannot encode unions with an unknown member set.");
-  }
-
-  encoder.writeUint32(16);
-  encoder.writeUint32(val.$tag);
-  switch (val.$tag) {
-{%-   for field in union.fields %}
-    case {{union.name}}.Tags.{{field.name}}:
-{%-     if field|is_bool_field %}
-      encoder.writeUint8(val.{{field.name}} ? 1 : 0);
-{%-     else %}
-      encoder.{{field.kind|union_encode_snippet}}val.{{field.name}});
-{%-     endif %}
-      break;
-{%-   endfor %}
-  }
-  encoder.align();
-};
-{%- endmacro %}
-
-{%- macro decode(union) %}
-{{union.name}}.decode = function(decoder) {
-  var size = decoder.readUint32();
-  if (size == 0) {
-    decoder.readUint32();
-    decoder.readUint64();
-    return null;
-  }
-
-  var result = new {{union.name}}();
-  var tag = decoder.readUint32();
-  switch (tag) {
-{%-   for field in union.fields %}
-    case {{union.name}}.Tags.{{field.name}}:
-{%-     if field|is_bool_field %}
-      result.{{field.name}} = decoder.readUint8() ? true : false;
-{%-     else %}
-      result.{{field.name}} = decoder.{{field.kind|union_decode_snippet}};
-{%-     endif %}
-      break;
-{%-   endfor %}
-  }
-  decoder.align();
-
-  return result;
-};
-{%- endmacro %}
-
-{%- from "validation_macros.tmpl" import validate_union_field %}
-{%- macro validate(union) %}
-{{union.name}}.validate = function(messageValidator, offset) {
-  var size = messageValidator.decodeUnionSize(offset);
-  if (size != 16) {
-    return validator.validationError.INVALID_UNION_SIZE;
-  }
-
-  var tag = messageValidator.decodeUnionTag(offset);
-  var data_offset = offset + 8;
-  var err;
-  switch (tag) {
-{%-   for field in union.fields %}
-{%-     set name = union.name ~ '.' ~ field.name %}
-    case {{union.name}}.Tags.{{field.name}}:
-      {{validate_union_field(field, "data_offset", name)}}
-      break;
-{%-   endfor %}
-  }
-
-  return validator.validationError.NONE;
-};
-{%- endmacro %}
diff --git a/mojo/public/tools/bindings/generators/js_templates/validation_macros.tmpl b/mojo/public/tools/bindings/generators/js_templates/validation_macros.tmpl
deleted file mode 100644
index d4e15a7..0000000
--- a/mojo/public/tools/bindings/generators/js_templates/validation_macros.tmpl
+++ /dev/null
@@ -1,60 +0,0 @@
-{% macro _check_err() -%}
-if (err !== validator.validationError.NONE)
-    return err;
-{%- endmacro %}
-
-{%- macro _validate_field(field, offset, name) %}
-{%-   if field|is_string_pointer_field %}
-// validate {{name}}
-err = messageValidator.validateStringPointer({{offset}}, {{field|validate_nullable_params}})
-{{_check_err()}}
-{%-   elif field|is_array_pointer_field %}
-// validate {{name}}
-err = messageValidator.validateArrayPointer({{offset}}, {{field|validate_array_params}});
-{{_check_err()}}
-{%-   elif field|is_struct_pointer_field %}
-// validate {{name}}
-err = messageValidator.validateStructPointer({{offset}}, {{field|validate_struct_params}});
-{{_check_err()}}
-{%-   elif field|is_map_pointer_field %}
-// validate {{name}}
-err = messageValidator.validateMapPointer({{offset}}, {{field|validate_map_params}});
-{{_check_err()}}
-{%-   elif field|is_interface_field %}
-// validate {{name}}
-err = messageValidator.validateInterface({{offset}}, {{field|validate_nullable_params}});
-{{_check_err()}}
-{%-   elif field|is_interface_request_field %}
-// validate {{name}}
-err = messageValidator.validateInterfaceRequest({{offset}}, {{field|validate_nullable_params}})
-{{_check_err()}}
-{%-   elif field|is_handle_field %}
-// validate {{name}}
-err = messageValidator.validateHandle({{offset}}, {{field|validate_nullable_params}})
-{{_check_err()}}
-{%-   elif field|is_enum_field %}
-// validate {{name}}
-err = messageValidator.validateEnum({{offset}}, {{field|validate_enum_params}});
-{{_check_err()}}
-{%-   endif %}
-{%- endmacro %}
-
-{%- macro validate_struct_field(field, offset, name) %}
-{%-   if field|is_union_field %}
-// validate {{name}}
-err = messageValidator.validateUnion({{offset}}, {{field|validate_union_params}});
-{{_check_err()}}
-{%-   else %}
-{{_validate_field(field, offset, name)}}
-{%-   endif %}
-{%- endmacro %}
-
-{%- macro validate_union_field(field, offset, name) %}
-{%-   if field|is_union_field %}
-// validate {{name}}
-err = messageValidator.validateNestedUnion({{offset}}, {{field|validate_union_params}});
-{{_check_err()}}
-{%-   else %}
-{{_validate_field(field, offset, name)}}
-{%-   endif %}
-{%- endmacro %}
diff --git a/mojo/public/tools/bindings/generators/mojom_cpp_generator.py b/mojo/public/tools/bindings/generators/mojom_cpp_generator.py
deleted file mode 100644
index 38d222b..0000000
--- a/mojo/public/tools/bindings/generators/mojom_cpp_generator.py
+++ /dev/null
@@ -1,818 +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.
-
-"""Generates C++ source files from a mojom.Module."""
-
-import mojom.generate.generator as generator
-import mojom.generate.module as mojom
-import mojom.generate.pack as pack
-from mojom.generate.template_expander import UseJinja
-
-
-_kind_to_cpp_type = {
-  mojom.BOOL:                  "bool",
-  mojom.INT8:                  "int8_t",
-  mojom.UINT8:                 "uint8_t",
-  mojom.INT16:                 "int16_t",
-  mojom.UINT16:                "uint16_t",
-  mojom.INT32:                 "int32_t",
-  mojom.UINT32:                "uint32_t",
-  mojom.FLOAT:                 "float",
-  mojom.INT64:                 "int64_t",
-  mojom.UINT64:                "uint64_t",
-  mojom.DOUBLE:                "double",
-}
-
-_kind_to_cpp_literal_suffix = {
-  mojom.UINT8:        "U",
-  mojom.UINT16:       "U",
-  mojom.UINT32:       "U",
-  mojom.FLOAT:        "f",
-  mojom.UINT64:       "ULL",
-}
-
-# TODO(rockot): Get rid of these globals. This requires some refactoring of the
-# generator library code so that filters can use the generator as context.
-_current_typemap = {}
-_for_blink = False
-# TODO(rockot, yzshen): The variant handling is kind of a hack currently. Make
-# it right.
-_variant = None
-_export_attribute = None
-
-
-class _NameFormatter(object):
-  """A formatter for the names of kinds or values."""
-
-  def __init__(self, token, variant):
-    self._token = token
-    self._variant = variant
-
-  def Format(self, separator, prefixed=False, internal=False,
-             include_variant=False, add_same_module_namespaces=False,
-             flatten_nested_kind=False):
-    """Formats the name according to the given configuration.
-
-    Args:
-      separator: Separator between different parts of the name.
-      prefixed: Whether a leading separator should be added.
-      internal: Returns the name in the "internal" namespace.
-      include_variant: Whether to include variant as namespace. If |internal| is
-          True, then this flag is ignored and variant is not included.
-      add_same_module_namespaces: Includes all namespaces even if the token is
-          from the same module as the current mojom file.
-      flatten_nested_kind: It is allowed to define enums inside structs and
-          interfaces. If this flag is set to True, this method concatenates the
-          parent kind and the nested kind with '_', instead of treating the
-          parent kind as a scope."""
-
-    parts = []
-    if self._ShouldIncludeNamespace(add_same_module_namespaces):
-      if prefixed:
-        parts.append("")
-      parts.extend(self._GetNamespace())
-      if include_variant and self._variant and not internal:
-        parts.append(self._variant)
-    parts.extend(self._GetName(internal, flatten_nested_kind))
-    return separator.join(parts)
-
-  def FormatForCpp(self, add_same_module_namespaces=False, internal=False,
-                   flatten_nested_kind=False):
-    return self.Format(
-        "::", prefixed=True,
-        add_same_module_namespaces=add_same_module_namespaces,
-        internal=internal, include_variant=True,
-        flatten_nested_kind=flatten_nested_kind)
-
-  def FormatForMojom(self):
-    return self.Format(".", add_same_module_namespaces=True)
-
-  def _MapKindName(self, token, internal):
-    if not internal:
-      return token.name
-    if (mojom.IsStructKind(token) or mojom.IsUnionKind(token) or
-        mojom.IsEnumKind(token)):
-      return token.name + "_Data"
-    return token.name
-
-  def _GetName(self, internal, flatten_nested_kind):
-    if isinstance(self._token, mojom.EnumValue):
-      name_parts = _NameFormatter(self._token.enum, self._variant)._GetName(
-          internal, flatten_nested_kind)
-      name_parts.append(self._token.name)
-      return name_parts
-
-    name_parts = []
-    if internal:
-      name_parts.append("internal")
-
-    if (flatten_nested_kind and mojom.IsEnumKind(self._token) and
-        self._token.parent_kind):
-      name = "%s_%s" % (self._token.parent_kind.name,
-                        self._MapKindName(self._token, internal))
-      name_parts.append(name)
-      return name_parts
-
-    if self._token.parent_kind:
-      name_parts.append(self._MapKindName(self._token.parent_kind, internal))
-    name_parts.append(self._MapKindName(self._token, internal))
-    return name_parts
-
-  def _ShouldIncludeNamespace(self, add_same_module_namespaces):
-    return add_same_module_namespaces or self._token.imported_from
-
-  def _GetNamespace(self):
-    if self._token.imported_from:
-      return NamespaceToArray(self._token.imported_from["namespace"])
-    elif hasattr(self._token, "module"):
-      return NamespaceToArray(self._token.module.namespace)
-    return []
-
-
-def ConstantValue(constant):
-  return ExpressionToText(constant.value, kind=constant.kind)
-
-# TODO(yzshen): Revisit the default value feature. It was designed prior to
-# custom type mapping.
-def DefaultValue(field):
-  if field.default:
-    if mojom.IsStructKind(field.kind):
-      assert field.default == "default"
-      if not IsTypemappedKind(field.kind):
-        return "%s::New()" % GetNameForKind(field.kind)
-    return ExpressionToText(field.default, kind=field.kind)
-  return ""
-
-def NamespaceToArray(namespace):
-  return namespace.split(".") if namespace else []
-
-def GetNameForKind(kind, internal=False, flatten_nested_kind=False,
-                   add_same_module_namespaces=False):
-  return _NameFormatter(kind, _variant).FormatForCpp(
-      internal=internal, flatten_nested_kind=flatten_nested_kind,
-      add_same_module_namespaces=add_same_module_namespaces)
-
-def GetQualifiedNameForKind(kind, internal=False, flatten_nested_kind=False,
-                            include_variant=True):
-  return _NameFormatter(
-      kind, _variant if include_variant else None).FormatForCpp(
-          internal=internal, add_same_module_namespaces=True,
-          flatten_nested_kind=flatten_nested_kind)
-
-
-def GetWtfHashFnNameForEnum(enum):
-  return _NameFormatter(
-      enum, None).Format("_", internal=True, add_same_module_namespaces=True,
-                         flatten_nested_kind=True) + "HashFn"
-
-
-def GetFullMojomNameForKind(kind):
-  return _NameFormatter(kind, _variant).FormatForMojom()
-
-def IsTypemappedKind(kind):
-  return hasattr(kind, "name") and \
-      GetFullMojomNameForKind(kind) in _current_typemap
-
-def IsNativeOnlyKind(kind):
-  return (mojom.IsStructKind(kind) or mojom.IsEnumKind(kind)) and \
-      kind.native_only
-
-
-def IsHashableKind(kind):
-  """Check if the kind can be hashed.
-
-  Args:
-    kind: {Kind} The kind to check.
-
-  Returns:
-    {bool} True if a value of this kind can be hashed.
-  """
-  checked = set()
-  def Check(kind):
-    if kind.spec in checked:
-      return True
-    checked.add(kind.spec)
-    if mojom.IsNullableKind(kind):
-      return False
-    elif mojom.IsStructKind(kind):
-      if (IsTypemappedKind(kind) and
-          not _current_typemap[GetFullMojomNameForKind(kind)]["hashable"]):
-        return False
-      return all(Check(field.kind) for field in kind.fields)
-    elif mojom.IsEnumKind(kind):
-      return not IsTypemappedKind(kind) or _current_typemap[
-          GetFullMojomNameForKind(kind)]["hashable"]
-    elif mojom.IsUnionKind(kind):
-      return all(Check(field.kind) for field in kind.fields)
-    elif mojom.IsAnyHandleKind(kind):
-      return False
-    elif mojom.IsAnyInterfaceKind(kind):
-      return False
-    # TODO(tibell): Arrays and maps could be made hashable. We just don't have a
-    # use case yet.
-    elif mojom.IsArrayKind(kind):
-      return False
-    elif mojom.IsMapKind(kind):
-      return False
-    else:
-      return True
-  return Check(kind)
-
-
-def AllEnumValues(enum):
-  """Return all enum values associated with an enum.
-
-  Args:
-    enum: {mojom.Enum} The enum type.
-
-  Returns:
-   {Set[int]} The values.
-  """
-  return set(field.numeric_value for field in enum.fields)
-
-
-def GetNativeTypeName(typemapped_kind):
-  return _current_typemap[GetFullMojomNameForKind(typemapped_kind)]["typename"]
-
-def GetCppPodType(kind):
-  return _kind_to_cpp_type[kind]
-
-def FormatConstantDeclaration(constant, nested=False):
-  if mojom.IsStringKind(constant.kind):
-    if nested:
-      return "const char %s[]" % constant.name
-    return "%sextern const char %s[]" % \
-        ((_export_attribute + " ") if _export_attribute else "", constant.name)
-  return "constexpr %s %s = %s" % (GetCppPodType(constant.kind), constant.name,
-                                   ConstantValue(constant))
-
-def GetCppWrapperType(kind, add_same_module_namespaces=False):
-  def _AddOptional(type_name):
-    pattern = "WTF::Optional<%s>" if _for_blink else "base::Optional<%s>"
-    return pattern % type_name
-
-  if IsTypemappedKind(kind):
-    type_name = GetNativeTypeName(kind)
-    if (mojom.IsNullableKind(kind) and
-        not _current_typemap[GetFullMojomNameForKind(kind)][
-           "nullable_is_same_type"]):
-      type_name = _AddOptional(type_name)
-    return type_name
-  if mojom.IsEnumKind(kind):
-    return GetNameForKind(
-        kind, add_same_module_namespaces=add_same_module_namespaces)
-  if mojom.IsStructKind(kind) or mojom.IsUnionKind(kind):
-    return "%sPtr" % GetNameForKind(
-        kind, add_same_module_namespaces=add_same_module_namespaces)
-  if mojom.IsArrayKind(kind):
-    pattern = "WTF::Vector<%s>" if _for_blink else "std::vector<%s>"
-    if mojom.IsNullableKind(kind):
-      pattern = _AddOptional(pattern)
-    return pattern % GetCppWrapperType(
-        kind.kind, add_same_module_namespaces=add_same_module_namespaces)
-  if mojom.IsMapKind(kind):
-    pattern = ("WTF::HashMap<%s, %s>" if _for_blink else
-               "std::unordered_map<%s, %s>")
-    if mojom.IsNullableKind(kind):
-      pattern = _AddOptional(pattern)
-    return pattern % (
-        GetCppWrapperType(
-            kind.key_kind,
-            add_same_module_namespaces=add_same_module_namespaces),
-        GetCppWrapperType(
-            kind.value_kind,
-            add_same_module_namespaces=add_same_module_namespaces))
-  if mojom.IsInterfaceKind(kind):
-    return "%sPtr" % GetNameForKind(
-        kind, add_same_module_namespaces=add_same_module_namespaces)
-  if mojom.IsInterfaceRequestKind(kind):
-    return "%sRequest" % GetNameForKind(
-        kind.kind, add_same_module_namespaces=add_same_module_namespaces)
-  if mojom.IsAssociatedInterfaceKind(kind):
-    return "%sAssociatedPtrInfo" % GetNameForKind(
-        kind.kind, add_same_module_namespaces=add_same_module_namespaces)
-  if mojom.IsAssociatedInterfaceRequestKind(kind):
-    return "%sAssociatedRequest" % GetNameForKind(
-        kind.kind, add_same_module_namespaces=add_same_module_namespaces)
-  if mojom.IsStringKind(kind):
-    if _for_blink:
-      return "WTF::String"
-    type_name = "std::string"
-    return _AddOptional(type_name) if mojom.IsNullableKind(kind) else type_name
-  if mojom.IsGenericHandleKind(kind):
-    return "mojo::ScopedHandle"
-  if mojom.IsDataPipeConsumerKind(kind):
-    return "mojo::ScopedDataPipeConsumerHandle"
-  if mojom.IsDataPipeProducerKind(kind):
-    return "mojo::ScopedDataPipeProducerHandle"
-  if mojom.IsMessagePipeKind(kind):
-    return "mojo::ScopedMessagePipeHandle"
-  if mojom.IsSharedBufferKind(kind):
-    return "mojo::ScopedSharedBufferHandle"
-  if not kind in _kind_to_cpp_type:
-    raise Exception("Unrecognized kind %s" % kind.spec)
-  return _kind_to_cpp_type[kind]
-
-def IsMoveOnlyKind(kind):
-  if IsTypemappedKind(kind):
-    if mojom.IsEnumKind(kind):
-      return False
-    return _current_typemap[GetFullMojomNameForKind(kind)]["move_only"]
-  if mojom.IsStructKind(kind) or mojom.IsUnionKind(kind):
-    return True
-  if mojom.IsArrayKind(kind):
-    return IsMoveOnlyKind(kind.kind)
-  if mojom.IsMapKind(kind):
-    return IsMoveOnlyKind(kind.value_kind)
-  if mojom.IsAnyHandleOrInterfaceKind(kind):
-    return True
-  return False
-
-def IsCopyablePassByValue(kind):
-  if not IsTypemappedKind(kind):
-    return False
-  return _current_typemap[GetFullMojomNameForKind(kind)][
-      "copyable_pass_by_value"]
-
-def ShouldPassParamByValue(kind):
-  return ((not mojom.IsReferenceKind(kind)) or IsMoveOnlyKind(kind) or
-      IsCopyablePassByValue(kind))
-
-def GetCppWrapperParamType(kind):
-  cpp_wrapper_type = GetCppWrapperType(kind)
-  return (cpp_wrapper_type if ShouldPassParamByValue(kind)
-                           else "const %s&" % cpp_wrapper_type)
-
-def GetCppFieldType(kind):
-  if mojom.IsStructKind(kind):
-    return ("mojo::internal::Pointer<%s>" %
-        GetNameForKind(kind, internal=True))
-  if mojom.IsUnionKind(kind):
-    return "%s" % GetNameForKind(kind, internal=True)
-  if mojom.IsArrayKind(kind):
-    return ("mojo::internal::Pointer<mojo::internal::Array_Data<%s>>" %
-            GetCppFieldType(kind.kind))
-  if mojom.IsMapKind(kind):
-    return ("mojo::internal::Pointer<mojo::internal::Map_Data<%s, %s>>" %
-            (GetCppFieldType(kind.key_kind), GetCppFieldType(kind.value_kind)))
-  if mojom.IsInterfaceKind(kind):
-    return "mojo::internal::Interface_Data"
-  if mojom.IsInterfaceRequestKind(kind):
-    return "mojo::internal::Handle_Data"
-  if mojom.IsAssociatedInterfaceKind(kind):
-    return "mojo::internal::AssociatedInterface_Data"
-  if mojom.IsAssociatedInterfaceRequestKind(kind):
-    return "mojo::internal::AssociatedEndpointHandle_Data"
-  if mojom.IsEnumKind(kind):
-    return "int32_t"
-  if mojom.IsStringKind(kind):
-    return "mojo::internal::Pointer<mojo::internal::String_Data>"
-  if mojom.IsAnyHandleKind(kind):
-    return "mojo::internal::Handle_Data"
-  return _kind_to_cpp_type[kind]
-
-def GetCppUnionFieldType(kind):
-  if mojom.IsUnionKind(kind):
-    return ("mojo::internal::Pointer<%s>" % GetNameForKind(kind, internal=True))
-  return GetCppFieldType(kind)
-
-def GetUnionGetterReturnType(kind):
-  if mojom.IsReferenceKind(kind):
-    return "%s&" % GetCppWrapperType(kind)
-  return GetCppWrapperType(kind)
-
-def GetUnionTraitGetterReturnType(kind):
-  """Get field type used in UnionTraits template specialization.
-
-  The type may be qualified as UnionTraits specializations live outside the
-  namespace where e.g. structs are defined.
-
-  Args:
-    kind: {Kind} The type of the field.
-
-  Returns:
-    {str} The C++ type to use for the field.
-  """
-  if mojom.IsReferenceKind(kind):
-    return "%s&" % GetCppWrapperType(kind, add_same_module_namespaces=True)
-  return GetCppWrapperType(kind, add_same_module_namespaces=True)
-
-def GetCppDataViewType(kind, qualified=False):
-  def _GetName(input_kind):
-    return _NameFormatter(input_kind, None).FormatForCpp(
-        add_same_module_namespaces=qualified, flatten_nested_kind=True)
-
-  if mojom.IsEnumKind(kind):
-    return _GetName(kind)
-  if mojom.IsStructKind(kind) or mojom.IsUnionKind(kind):
-    return "%sDataView" % _GetName(kind)
-  if mojom.IsArrayKind(kind):
-    return "mojo::ArrayDataView<%s>" % GetCppDataViewType(kind.kind, qualified)
-  if mojom.IsMapKind(kind):
-    return ("mojo::MapDataView<%s, %s>" % (
-        GetCppDataViewType(kind.key_kind, qualified),
-        GetCppDataViewType(kind.value_kind, qualified)))
-  if mojom.IsStringKind(kind):
-    return "mojo::StringDataView"
-  if mojom.IsInterfaceKind(kind):
-    return "%sPtrDataView" % _GetName(kind)
-  if mojom.IsInterfaceRequestKind(kind):
-    return "%sRequestDataView" % _GetName(kind.kind)
-  if mojom.IsAssociatedInterfaceKind(kind):
-    return "%sAssociatedPtrInfoDataView" % _GetName(kind.kind)
-  if mojom.IsAssociatedInterfaceRequestKind(kind):
-    return "%sAssociatedRequestDataView" % _GetName(kind.kind)
-  if mojom.IsGenericHandleKind(kind):
-    return "mojo::ScopedHandle"
-  if mojom.IsDataPipeConsumerKind(kind):
-    return "mojo::ScopedDataPipeConsumerHandle"
-  if mojom.IsDataPipeProducerKind(kind):
-    return "mojo::ScopedDataPipeProducerHandle"
-  if mojom.IsMessagePipeKind(kind):
-    return "mojo::ScopedMessagePipeHandle"
-  if mojom.IsSharedBufferKind(kind):
-    return "mojo::ScopedSharedBufferHandle"
-  return _kind_to_cpp_type[kind]
-
-def GetUnmappedTypeForSerializer(kind):
-  return GetCppDataViewType(kind, qualified=True)
-
-def TranslateConstants(token, kind):
-  if isinstance(token, mojom.NamedValue):
-    return GetNameForKind(token, flatten_nested_kind=True)
-
-  if isinstance(token, mojom.BuiltinValue):
-    if token.value == "double.INFINITY":
-      return "std::numeric_limits<double>::infinity()"
-    if token.value == "float.INFINITY":
-      return "std::numeric_limits<float>::infinity()"
-    if token.value == "double.NEGATIVE_INFINITY":
-      return "-std::numeric_limits<double>::infinity()"
-    if token.value == "float.NEGATIVE_INFINITY":
-      return "-std::numeric_limits<float>::infinity()"
-    if token.value == "double.NAN":
-      return "std::numeric_limits<double>::quiet_NaN()"
-    if token.value == "float.NAN":
-      return "std::numeric_limits<float>::quiet_NaN()"
-
-  if (kind is not None and mojom.IsFloatKind(kind)):
-      return token if token.isdigit() else token + "f";
-
-  # Per C++11, 2.14.2, the type of an integer literal is the first of the
-  # corresponding list in Table 6 in which its value can be represented. In this
-  # case, the list for decimal constants with no suffix is:
-  #   int, long int, long long int
-  # The standard considers a program ill-formed if it contains an integer
-  # literal that cannot be represented by any of the allowed types.
-  #
-  # As it turns out, MSVC doesn't bother trying to fall back to long long int,
-  # so the integral constant -2147483648 causes it grief: it decides to
-  # represent 2147483648 as an unsigned integer, and then warns that the unary
-  # minus operator doesn't make sense on unsigned types. Doh!
-  if kind == mojom.INT32 and token == "-2147483648":
-    return "(-%d - 1) /* %s */" % (
-        2**31 - 1, "Workaround for MSVC bug; see https://crbug.com/445618")
-
-  return "%s%s" % (token, _kind_to_cpp_literal_suffix.get(kind, ""))
-
-def ExpressionToText(value, kind=None):
-  return TranslateConstants(value, kind)
-
-def RequiresContextForDataView(kind):
-  for field in kind.fields:
-    if mojom.IsReferenceKind(field.kind):
-      return True
-  return False
-
-def ShouldInlineStruct(struct):
-  # TODO(darin): Base this on the size of the wrapper class.
-  if len(struct.fields) > 4:
-    return False
-  for field in struct.fields:
-    if mojom.IsReferenceKind(field.kind) and not mojom.IsStringKind(field.kind):
-      return False
-  return True
-
-def ContainsMoveOnlyMembers(struct):
-  for field in struct.fields:
-    if IsMoveOnlyKind(field.kind):
-      return True
-  return False
-
-def ShouldInlineUnion(union):
-  return not any(
-      mojom.IsReferenceKind(field.kind) and not mojom.IsStringKind(field.kind)
-           for field in union.fields)
-
-
-class StructConstructor(object):
-  """Represents a constructor for a generated struct.
-
-  Fields:
-    fields: {[Field]} All struct fields in order.
-    params: {[Field]} The fields that are passed as params.
-  """
-
-  def __init__(self, fields, params):
-    self._fields = fields
-    self._params = set(params)
-
-  @property
-  def params(self):
-    return [field for field in self._fields if field in self._params]
-
-  @property
-  def fields(self):
-    for field in self._fields:
-      yield (field, field in self._params)
-
-
-def GetStructConstructors(struct):
-  """Returns a list of constructors for a struct.
-
-  Params:
-    struct: {Struct} The struct to return constructors for.
-
-  Returns:
-    {[StructConstructor]} A list of StructConstructors that should be generated
-    for |struct|.
-  """
-  if not mojom.IsStructKind(struct):
-    raise TypeError
-  # Types that are neither copyable nor movable can't be passed to a struct
-  # constructor so only generate a default constructor.
-  if any(IsTypemappedKind(field.kind) and _current_typemap[
-      GetFullMojomNameForKind(field.kind)]["non_copyable_non_movable"]
-         for field in struct.fields):
-    return [StructConstructor(struct.fields, [])]
-
-  param_counts = [0]
-  for version in struct.versions:
-    if param_counts[-1] != version.num_fields:
-      param_counts.append(version.num_fields)
-
-  ordinal_fields = sorted(struct.fields, key=lambda field: field.ordinal)
-  return (StructConstructor(struct.fields, ordinal_fields[:param_count])
-          for param_count in param_counts)
-
-
-def GetContainerValidateParamsCtorArgs(kind):
-  if mojom.IsStringKind(kind):
-    expected_num_elements = 0
-    element_is_nullable = False
-    key_validate_params = "nullptr"
-    element_validate_params = "nullptr"
-    enum_validate_func = "nullptr"
-  elif mojom.IsMapKind(kind):
-    expected_num_elements = 0
-    element_is_nullable = False
-    key_validate_params = GetNewContainerValidateParams(mojom.Array(
-        kind=kind.key_kind))
-    element_validate_params = GetNewContainerValidateParams(mojom.Array(
-        kind=kind.value_kind))
-    enum_validate_func = "nullptr"
-  else:  # mojom.IsArrayKind(kind)
-    expected_num_elements = generator.ExpectedArraySize(kind) or 0
-    element_is_nullable = mojom.IsNullableKind(kind.kind)
-    key_validate_params = "nullptr"
-    element_validate_params = GetNewContainerValidateParams(kind.kind)
-    if mojom.IsEnumKind(kind.kind):
-      enum_validate_func = ("%s::Validate" %
-                            GetQualifiedNameForKind(kind.kind, internal=True,
-                                                    flatten_nested_kind=True))
-    else:
-      enum_validate_func = "nullptr"
-
-  if enum_validate_func == "nullptr":
-    if key_validate_params == "nullptr":
-      return "%d, %s, %s" % (expected_num_elements,
-                             "true" if element_is_nullable else "false",
-                             element_validate_params)
-    else:
-      return "%s, %s" % (key_validate_params, element_validate_params)
-  else:
-    return "%d, %s" % (expected_num_elements, enum_validate_func)
-
-def GetNewContainerValidateParams(kind):
-  if (not mojom.IsArrayKind(kind) and not mojom.IsMapKind(kind) and
-      not mojom.IsStringKind(kind)):
-    return "nullptr"
-
-  return "new mojo::internal::ContainerValidateParams(%s)" % (
-      GetContainerValidateParamsCtorArgs(kind))
-
-class Generator(generator.Generator):
-
-  cpp_filters = {
-    "all_enum_values": AllEnumValues,
-    "constant_value": ConstantValue,
-    "contains_handles_or_interfaces": mojom.ContainsHandlesOrInterfaces,
-    "contains_move_only_members": ContainsMoveOnlyMembers,
-    "cpp_wrapper_param_type": GetCppWrapperParamType,
-    "cpp_data_view_type": GetCppDataViewType,
-    "cpp_field_type": GetCppFieldType,
-    "cpp_union_field_type": GetCppUnionFieldType,
-    "cpp_pod_type": GetCppPodType,
-    "cpp_union_getter_return_type": GetUnionGetterReturnType,
-    "cpp_union_trait_getter_return_type": GetUnionTraitGetterReturnType,
-    "cpp_wrapper_type": GetCppWrapperType,
-    "default_value": DefaultValue,
-    "expression_to_text": ExpressionToText,
-    "format_constant_declaration": FormatConstantDeclaration,
-    "get_container_validate_params_ctor_args":
-        GetContainerValidateParamsCtorArgs,
-    "get_name_for_kind": GetNameForKind,
-    "get_pad": pack.GetPad,
-    "get_qualified_name_for_kind": GetQualifiedNameForKind,
-    "has_callbacks": mojom.HasCallbacks,
-    "has_sync_methods": mojom.HasSyncMethods,
-    "requires_context_for_data_view": RequiresContextForDataView,
-    "should_inline": ShouldInlineStruct,
-    "should_inline_union": ShouldInlineUnion,
-    "is_array_kind": mojom.IsArrayKind,
-    "is_enum_kind": mojom.IsEnumKind,
-    "is_integral_kind": mojom.IsIntegralKind,
-    "is_native_only_kind": IsNativeOnlyKind,
-    "is_any_handle_kind": mojom.IsAnyHandleKind,
-    "is_any_interface_kind": mojom.IsAnyInterfaceKind,
-    "is_any_handle_or_interface_kind": mojom.IsAnyHandleOrInterfaceKind,
-    "is_associated_kind": mojom.IsAssociatedKind,
-    "is_hashable": IsHashableKind,
-    "is_map_kind": mojom.IsMapKind,
-    "is_nullable_kind": mojom.IsNullableKind,
-    "is_object_kind": mojom.IsObjectKind,
-    "is_reference_kind": mojom.IsReferenceKind,
-    "is_string_kind": mojom.IsStringKind,
-    "is_struct_kind": mojom.IsStructKind,
-    "is_typemapped_kind": IsTypemappedKind,
-    "is_union_kind": mojom.IsUnionKind,
-    "passes_associated_kinds": mojom.PassesAssociatedKinds,
-    "struct_constructors": GetStructConstructors,
-    "stylize_method": generator.StudlyCapsToCamel,
-    "under_to_camel": generator.UnderToCamel,
-    "unmapped_type_for_serializer": GetUnmappedTypeForSerializer,
-    "wtf_hash_fn_name_for_enum": GetWtfHashFnNameForEnum,
-  }
-
-  def GetExtraTraitsHeaders(self):
-    extra_headers = set()
-    for typemap in self._GetAllUsedTypemaps():
-      extra_headers.update(typemap.get("traits_headers", []))
-    return sorted(extra_headers)
-
-  def _GetAllUsedTypemaps(self):
-    """Returns the typemaps for types needed for serialization in this module.
-
-    A type is needed for serialization if it is contained by a struct or union
-    defined in this module, is a parameter of a message in an interface in
-    this module or is contained within another type needed for serialization.
-    """
-    used_typemaps = []
-    seen_types = set()
-    def AddKind(kind):
-      if (mojom.IsIntegralKind(kind) or mojom.IsStringKind(kind) or
-          mojom.IsDoubleKind(kind) or mojom.IsFloatKind(kind) or
-          mojom.IsAnyHandleKind(kind) or
-          mojom.IsInterfaceKind(kind) or
-          mojom.IsInterfaceRequestKind(kind) or
-          mojom.IsAssociatedKind(kind)):
-        pass
-      elif mojom.IsArrayKind(kind):
-        AddKind(kind.kind)
-      elif mojom.IsMapKind(kind):
-        AddKind(kind.key_kind)
-        AddKind(kind.value_kind)
-      else:
-        name = GetFullMojomNameForKind(kind)
-        if name in seen_types:
-          return
-        seen_types.add(name)
-
-        typemap = _current_typemap.get(name, None)
-        if typemap:
-          used_typemaps.append(typemap)
-        if mojom.IsStructKind(kind) or mojom.IsUnionKind(kind):
-          for field in kind.fields:
-            AddKind(field.kind)
-
-    for kind in self.module.structs + self.module.unions:
-      for field in kind.fields:
-        AddKind(field.kind)
-
-    for interface in self.module.interfaces:
-      for method in interface.methods:
-        for parameter in method.parameters + (method.response_parameters or []):
-          AddKind(parameter.kind)
-
-    return used_typemaps
-
-  def GetExtraPublicHeaders(self):
-    all_enums = list(self.module.enums)
-    for struct in self.module.structs:
-      all_enums.extend(struct.enums)
-    for interface in self.module.interfaces:
-      all_enums.extend(interface.enums)
-
-    types = set(GetFullMojomNameForKind(typename)
-                for typename in
-                self.module.structs + all_enums + self.module.unions)
-    headers = set()
-    for typename, typemap in self.typemap.iteritems():
-      if typename in types:
-        headers.update(typemap.get("public_headers", []))
-    return sorted(headers)
-
-  def _GetDirectlyUsedKinds(self):
-    for struct in self.module.structs + self.module.unions:
-      for field in struct.fields:
-        yield field.kind
-
-    for interface in self.module.interfaces:
-      for method in interface.methods:
-        for param in method.parameters + (method.response_parameters or []):
-          yield param.kind
-
-  def GetJinjaExports(self):
-    structs = self.GetStructs()
-    interfaces = self.GetInterfaces()
-    all_enums = list(self.module.enums)
-    for struct in structs:
-      all_enums.extend(struct.enums)
-    for interface in interfaces:
-      all_enums.extend(interface.enums)
-
-    return {
-      "module": self.module,
-      "namespace": self.module.namespace,
-      "namespaces_as_array": NamespaceToArray(self.module.namespace),
-      "imports": self.module.imports,
-      "kinds": self.module.kinds,
-      "enums": self.module.enums,
-      "all_enums": all_enums,
-      "structs": structs,
-      "unions": self.GetUnions(),
-      "interfaces": interfaces,
-      "variant": self.variant,
-      "extra_traits_headers": self.GetExtraTraitsHeaders(),
-      "extra_public_headers": self.GetExtraPublicHeaders(),
-      "for_blink": self.for_blink,
-      "use_once_callback": self.use_once_callback,
-      "export_attribute": self.export_attribute,
-      "export_header": self.export_header,
-    }
-
-  @staticmethod
-  def GetTemplatePrefix():
-    return "cpp_templates"
-
-  @classmethod
-  def GetFilters(cls):
-    return cls.cpp_filters
-
-  @UseJinja("module.h.tmpl")
-  def GenerateModuleHeader(self):
-    return self.GetJinjaExports()
-
-  @UseJinja("module.cc.tmpl")
-  def GenerateModuleSource(self):
-    return self.GetJinjaExports()
-
-  @UseJinja("module-shared.h.tmpl")
-  def GenerateModuleSharedHeader(self):
-    return self.GetJinjaExports()
-
-  @UseJinja("module-shared-internal.h.tmpl")
-  def GenerateModuleSharedInternalHeader(self):
-    return self.GetJinjaExports()
-
-  @UseJinja("module-shared.cc.tmpl")
-  def GenerateModuleSharedSource(self):
-    return self.GetJinjaExports()
-
-  def GenerateFiles(self, args):
-    if self.generate_non_variant_code:
-      self.Write(self.GenerateModuleSharedHeader(),
-                 self.MatchMojomFilePath("%s-shared.h" % self.module.name))
-      self.Write(
-          self.GenerateModuleSharedInternalHeader(),
-          self.MatchMojomFilePath("%s-shared-internal.h" % self.module.name))
-      self.Write(self.GenerateModuleSharedSource(),
-                 self.MatchMojomFilePath("%s-shared.cc" % self.module.name))
-    else:
-      global _current_typemap
-      _current_typemap = self.typemap
-      global _for_blink
-      _for_blink = self.for_blink
-      global _use_once_callback
-      _use_once_callback = self.use_once_callback
-      global _variant
-      _variant = self.variant
-      global _export_attribute
-      _export_attribute = self.export_attribute
-      suffix = "-%s" % self.variant if self.variant else ""
-      self.Write(self.GenerateModuleHeader(),
-                 self.MatchMojomFilePath("%s%s.h" % (self.module.name, suffix)))
-      self.Write(
-          self.GenerateModuleSource(),
-          self.MatchMojomFilePath("%s%s.cc" % (self.module.name, suffix)))
diff --git a/mojo/public/tools/bindings/generators/mojom_java_generator.py b/mojo/public/tools/bindings/generators/mojom_java_generator.py
deleted file mode 100644
index c7657ff..0000000
--- a/mojo/public/tools/bindings/generators/mojom_java_generator.py
+++ /dev/null
@@ -1,550 +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.
-
-"""Generates java source files from a mojom.Module."""
-
-import argparse
-import ast
-import contextlib
-import os
-import re
-import shutil
-import sys
-import tempfile
-
-from jinja2 import contextfilter
-
-import mojom.fileutil as fileutil
-import mojom.generate.generator as generator
-import mojom.generate.module as mojom
-from mojom.generate.template_expander import UseJinja
-
-sys.path.append(os.path.join(os.path.dirname(__file__), os.pardir,
-                             os.pardir, os.pardir, os.pardir, os.pardir,
-                             'build', 'android', 'gyp'))
-from util import build_utils
-
-
-GENERATOR_PREFIX = 'java'
-
-_spec_to_java_type = {
-  mojom.BOOL.spec: 'boolean',
-  mojom.DCPIPE.spec: 'org.chromium.mojo.system.DataPipe.ConsumerHandle',
-  mojom.DOUBLE.spec: 'double',
-  mojom.DPPIPE.spec: 'org.chromium.mojo.system.DataPipe.ProducerHandle',
-  mojom.FLOAT.spec: 'float',
-  mojom.HANDLE.spec: 'org.chromium.mojo.system.UntypedHandle',
-  mojom.INT16.spec: 'short',
-  mojom.INT32.spec: 'int',
-  mojom.INT64.spec: 'long',
-  mojom.INT8.spec: 'byte',
-  mojom.MSGPIPE.spec: 'org.chromium.mojo.system.MessagePipeHandle',
-  mojom.NULLABLE_DCPIPE.spec:
-      'org.chromium.mojo.system.DataPipe.ConsumerHandle',
-  mojom.NULLABLE_DPPIPE.spec:
-      'org.chromium.mojo.system.DataPipe.ProducerHandle',
-  mojom.NULLABLE_HANDLE.spec: 'org.chromium.mojo.system.UntypedHandle',
-  mojom.NULLABLE_MSGPIPE.spec: 'org.chromium.mojo.system.MessagePipeHandle',
-  mojom.NULLABLE_SHAREDBUFFER.spec:
-      'org.chromium.mojo.system.SharedBufferHandle',
-  mojom.NULLABLE_STRING.spec: 'String',
-  mojom.SHAREDBUFFER.spec: 'org.chromium.mojo.system.SharedBufferHandle',
-  mojom.STRING.spec: 'String',
-  mojom.UINT16.spec: 'short',
-  mojom.UINT32.spec: 'int',
-  mojom.UINT64.spec: 'long',
-  mojom.UINT8.spec: 'byte',
-}
-
-_spec_to_decode_method = {
-  mojom.BOOL.spec:                  'readBoolean',
-  mojom.DCPIPE.spec:                'readConsumerHandle',
-  mojom.DOUBLE.spec:                'readDouble',
-  mojom.DPPIPE.spec:                'readProducerHandle',
-  mojom.FLOAT.spec:                 'readFloat',
-  mojom.HANDLE.spec:                'readUntypedHandle',
-  mojom.INT16.spec:                 'readShort',
-  mojom.INT32.spec:                 'readInt',
-  mojom.INT64.spec:                 'readLong',
-  mojom.INT8.spec:                  'readByte',
-  mojom.MSGPIPE.spec:               'readMessagePipeHandle',
-  mojom.NULLABLE_DCPIPE.spec:       'readConsumerHandle',
-  mojom.NULLABLE_DPPIPE.spec:       'readProducerHandle',
-  mojom.NULLABLE_HANDLE.spec:       'readUntypedHandle',
-  mojom.NULLABLE_MSGPIPE.spec:      'readMessagePipeHandle',
-  mojom.NULLABLE_SHAREDBUFFER.spec: 'readSharedBufferHandle',
-  mojom.NULLABLE_STRING.spec:       'readString',
-  mojom.SHAREDBUFFER.spec:          'readSharedBufferHandle',
-  mojom.STRING.spec:                'readString',
-  mojom.UINT16.spec:                'readShort',
-  mojom.UINT32.spec:                'readInt',
-  mojom.UINT64.spec:                'readLong',
-  mojom.UINT8.spec:                 'readByte',
-}
-
-_java_primitive_to_boxed_type = {
-  'boolean': 'Boolean',
-  'byte':    'Byte',
-  'double':  'Double',
-  'float':   'Float',
-  'int':     'Integer',
-  'long':    'Long',
-  'short':   'Short',
-}
-
-
-def NameToComponent(name):
-  # insert '_' between anything and a Title name (e.g, HTTPEntry2FooBar ->
-  # HTTP_Entry2_FooBar)
-  name = re.sub('([^_])([A-Z][^A-Z_]+)', r'\1_\2', name)
-  # insert '_' between non upper and start of upper blocks (e.g.,
-  # HTTP_Entry2_FooBar -> HTTP_Entry2_Foo_Bar)
-  name = re.sub('([^A-Z_])([A-Z])', r'\1_\2', name)
-  return [x.lower() for x in name.split('_')]
-
-def UpperCamelCase(name):
-  return ''.join([x.capitalize() for x in NameToComponent(name)])
-
-def CamelCase(name):
-  uccc = UpperCamelCase(name)
-  return uccc[0].lower() + uccc[1:]
-
-def ConstantStyle(name):
-  components = NameToComponent(name)
-  if components[0] == 'k' and len(components) > 1:
-    components = components[1:]
-  # variable cannot starts with a digit.
-  if components[0][0].isdigit():
-    components[0] = '_' + components[0]
-  return '_'.join([x.upper() for x in components])
-
-def GetNameForElement(element):
-  if (mojom.IsEnumKind(element) or mojom.IsInterfaceKind(element) or
-      mojom.IsStructKind(element) or mojom.IsUnionKind(element)):
-    return UpperCamelCase(element.name)
-  if mojom.IsInterfaceRequestKind(element) or mojom.IsAssociatedKind(element):
-    return GetNameForElement(element.kind)
-  if isinstance(element, (mojom.Method,
-                          mojom.Parameter,
-                          mojom.Field)):
-    return CamelCase(element.name)
-  if isinstance(element,  mojom.EnumValue):
-    return (GetNameForElement(element.enum) + '.' +
-            ConstantStyle(element.name))
-  if isinstance(element, (mojom.NamedValue,
-                          mojom.Constant,
-                          mojom.EnumField)):
-    return ConstantStyle(element.name)
-  raise Exception('Unexpected element: %s' % element)
-
-def GetInterfaceResponseName(method):
-  return UpperCamelCase(method.name + 'Response')
-
-def ParseStringAttribute(attribute):
-  assert isinstance(attribute, basestring)
-  return attribute
-
-def GetJavaTrueFalse(value):
-  return 'true' if value else 'false'
-
-def GetArrayNullabilityFlags(kind):
-    """Returns nullability flags for an array type, see Decoder.java.
-
-    As we have dedicated decoding functions for arrays, we have to pass
-    nullability information about both the array itself, as well as the array
-    element type there.
-    """
-    assert mojom.IsArrayKind(kind)
-    ARRAY_NULLABLE   = \
-        'org.chromium.mojo.bindings.BindingsHelper.ARRAY_NULLABLE'
-    ELEMENT_NULLABLE = \
-        'org.chromium.mojo.bindings.BindingsHelper.ELEMENT_NULLABLE'
-    NOTHING_NULLABLE = \
-        'org.chromium.mojo.bindings.BindingsHelper.NOTHING_NULLABLE'
-
-    flags_to_set = []
-    if mojom.IsNullableKind(kind):
-        flags_to_set.append(ARRAY_NULLABLE)
-    if mojom.IsNullableKind(kind.kind):
-        flags_to_set.append(ELEMENT_NULLABLE)
-
-    if not flags_to_set:
-        flags_to_set = [NOTHING_NULLABLE]
-    return ' | '.join(flags_to_set)
-
-
-def AppendEncodeDecodeParams(initial_params, context, kind, bit):
-  """ Appends standard parameters shared between encode and decode calls. """
-  params = list(initial_params)
-  if (kind == mojom.BOOL):
-    params.append(str(bit))
-  if mojom.IsReferenceKind(kind):
-    if mojom.IsArrayKind(kind):
-      params.append(GetArrayNullabilityFlags(kind))
-    else:
-      params.append(GetJavaTrueFalse(mojom.IsNullableKind(kind)))
-  if mojom.IsArrayKind(kind):
-    params.append(GetArrayExpectedLength(kind))
-  if mojom.IsInterfaceKind(kind):
-    params.append('%s.MANAGER' % GetJavaType(context, kind))
-  if mojom.IsArrayKind(kind) and mojom.IsInterfaceKind(kind.kind):
-    params.append('%s.MANAGER' % GetJavaType(context, kind.kind))
-  return params
-
-
-@contextfilter
-def DecodeMethod(context, kind, offset, bit):
-  def _DecodeMethodName(kind):
-    if mojom.IsArrayKind(kind):
-      return _DecodeMethodName(kind.kind) + 's'
-    if mojom.IsEnumKind(kind):
-      return _DecodeMethodName(mojom.INT32)
-    if mojom.IsInterfaceRequestKind(kind):
-      return 'readInterfaceRequest'
-    if mojom.IsInterfaceKind(kind):
-      return 'readServiceInterface'
-    if mojom.IsAssociatedInterfaceRequestKind(kind):
-      return 'readAssociatedInterfaceRequestNotSupported'
-    if mojom.IsAssociatedInterfaceKind(kind):
-      return 'readAssociatedServiceInterfaceNotSupported'
-    return _spec_to_decode_method[kind.spec]
-  methodName = _DecodeMethodName(kind)
-  params = AppendEncodeDecodeParams([ str(offset) ], context, kind, bit)
-  return '%s(%s)' % (methodName, ', '.join(params))
-
-@contextfilter
-def EncodeMethod(context, kind, variable, offset, bit):
-  params = AppendEncodeDecodeParams(
-      [ variable, str(offset) ], context, kind, bit)
-  return 'encode(%s)' % ', '.join(params)
-
-def GetPackage(module):
-  if module.attributes and 'JavaPackage' in module.attributes:
-    return ParseStringAttribute(module.attributes['JavaPackage'])
-  # Default package.
-  if module.namespace:
-    return 'org.chromium.' + module.namespace
-  return 'org.chromium'
-
-def GetNameForKind(context, kind):
-  def _GetNameHierachy(kind):
-    hierachy = []
-    if kind.parent_kind:
-      hierachy = _GetNameHierachy(kind.parent_kind)
-    hierachy.append(GetNameForElement(kind))
-    return hierachy
-
-  module = context.resolve('module')
-  elements = []
-  if GetPackage(module) != GetPackage(kind.module):
-    elements += [GetPackage(kind.module)]
-  elements += _GetNameHierachy(kind)
-  return '.'.join(elements)
-
-@contextfilter
-def GetJavaClassForEnum(context, kind):
-  return GetNameForKind(context, kind)
-
-def GetBoxedJavaType(context, kind, with_generics=True):
-  unboxed_type = GetJavaType(context, kind, False, with_generics)
-  if unboxed_type in _java_primitive_to_boxed_type:
-    return _java_primitive_to_boxed_type[unboxed_type]
-  return unboxed_type
-
-@contextfilter
-def GetJavaType(context, kind, boxed=False, with_generics=True):
-  if boxed:
-    return GetBoxedJavaType(context, kind)
-  if (mojom.IsStructKind(kind) or
-      mojom.IsInterfaceKind(kind) or
-      mojom.IsUnionKind(kind)):
-    return GetNameForKind(context, kind)
-  if mojom.IsInterfaceRequestKind(kind):
-    return ('org.chromium.mojo.bindings.InterfaceRequest<%s>' %
-            GetNameForKind(context, kind.kind))
-  if mojom.IsAssociatedInterfaceKind(kind):
-    return 'org.chromium.mojo.bindings.AssociatedInterfaceNotSupported'
-  if mojom.IsAssociatedInterfaceRequestKind(kind):
-    return 'org.chromium.mojo.bindings.AssociatedInterfaceRequestNotSupported'
-  if mojom.IsMapKind(kind):
-    if with_generics:
-      return 'java.util.Map<%s, %s>' % (
-          GetBoxedJavaType(context, kind.key_kind),
-          GetBoxedJavaType(context, kind.value_kind))
-    else:
-      return 'java.util.Map'
-  if mojom.IsArrayKind(kind):
-    return '%s[]' % GetJavaType(context, kind.kind, boxed, with_generics)
-  if mojom.IsEnumKind(kind):
-    return 'int'
-  return _spec_to_java_type[kind.spec]
-
-@contextfilter
-def DefaultValue(context, field):
-  assert field.default
-  if isinstance(field.kind, mojom.Struct):
-    assert field.default == 'default'
-    return 'new %s()' % GetJavaType(context, field.kind)
-  return '(%s) %s' % (
-      GetJavaType(context, field.kind),
-      ExpressionToText(context, field.default, kind_spec=field.kind.spec))
-
-@contextfilter
-def ConstantValue(context, constant):
-  return '(%s) %s' % (
-      GetJavaType(context, constant.kind),
-      ExpressionToText(context, constant.value, kind_spec=constant.kind.spec))
-
-@contextfilter
-def NewArray(context, kind, size):
-  if mojom.IsArrayKind(kind.kind):
-    return NewArray(context, kind.kind, size) + '[]'
-  return 'new %s[%s]' % (
-      GetJavaType(context, kind.kind, boxed=False, with_generics=False), size)
-
-@contextfilter
-def ExpressionToText(context, token, kind_spec=''):
-  def _TranslateNamedValue(named_value):
-    entity_name = GetNameForElement(named_value)
-    if named_value.parent_kind:
-      return GetJavaType(context, named_value.parent_kind) + '.' + entity_name
-    # Handle the case where named_value is a module level constant:
-    if not isinstance(named_value, mojom.EnumValue):
-      entity_name = (GetConstantsMainEntityName(named_value.module) + '.' +
-                      entity_name)
-    if GetPackage(named_value.module) == GetPackage(context.resolve('module')):
-      return entity_name
-    return GetPackage(named_value.module) + '.' + entity_name
-
-  if isinstance(token, mojom.NamedValue):
-    return _TranslateNamedValue(token)
-  if kind_spec.startswith('i') or kind_spec.startswith('u'):
-    # Add Long suffix to all integer literals.
-    number = ast.literal_eval(token.lstrip('+ '))
-    if not isinstance(number, (int, long)):
-      raise ValueError('got unexpected type %r for int literal %r' % (
-          type(number), token))
-    # If the literal is too large to fit a signed long, convert it to the
-    # equivalent signed long.
-    if number >= 2 ** 63:
-      number -= 2 ** 64
-    return '%dL' % number
-  if isinstance(token, mojom.BuiltinValue):
-    if token.value == 'double.INFINITY':
-      return 'java.lang.Double.POSITIVE_INFINITY'
-    if token.value == 'double.NEGATIVE_INFINITY':
-      return 'java.lang.Double.NEGATIVE_INFINITY'
-    if token.value == 'double.NAN':
-      return 'java.lang.Double.NaN'
-    if token.value == 'float.INFINITY':
-      return 'java.lang.Float.POSITIVE_INFINITY'
-    if token.value == 'float.NEGATIVE_INFINITY':
-      return 'java.lang.Float.NEGATIVE_INFINITY'
-    if token.value == 'float.NAN':
-      return 'java.lang.Float.NaN'
-  return token
-
-def GetArrayKind(kind, size = None):
-  if size is None:
-    return mojom.Array(kind)
-  else:
-    array = mojom.Array(kind, 0)
-    array.java_map_size = size
-    return array
-
-def GetArrayExpectedLength(kind):
-  if mojom.IsArrayKind(kind) and kind.length is not None:
-    return getattr(kind, 'java_map_size', str(kind.length))
-  else:
-    return 'org.chromium.mojo.bindings.BindingsHelper.UNSPECIFIED_ARRAY_LENGTH'
-
-def IsPointerArrayKind(kind):
-  if not mojom.IsArrayKind(kind):
-    return False
-  sub_kind = kind.kind
-  return mojom.IsObjectKind(sub_kind) and not mojom.IsUnionKind(sub_kind)
-
-def IsUnionArrayKind(kind):
-  if not mojom.IsArrayKind(kind):
-    return False
-  sub_kind = kind.kind
-  return mojom.IsUnionKind(sub_kind)
-
-def GetConstantsMainEntityName(module):
-  if module.attributes and 'JavaConstantsClassName' in module.attributes:
-    return ParseStringAttribute(module.attributes['JavaConstantsClassName'])
-  # This constructs the name of the embedding classes for module level constants
-  # by extracting the mojom's filename and prepending it to Constants.
-  return (UpperCamelCase(module.path.split('/')[-1].rsplit('.', 1)[0]) +
-          'Constants')
-
-def GetMethodOrdinalName(method):
-  return ConstantStyle(method.name) + '_ORDINAL'
-
-def HasMethodWithResponse(interface):
-  for method in interface.methods:
-    if method.response_parameters is not None:
-      return True
-  return False
-
-def HasMethodWithoutResponse(interface):
-  for method in interface.methods:
-    if method.response_parameters is None:
-      return True
-  return False
-
-@contextlib.contextmanager
-def TempDir():
-  dirname = tempfile.mkdtemp()
-  try:
-    yield dirname
-  finally:
-    shutil.rmtree(dirname)
-
-class Generator(generator.Generator):
-
-  java_filters = {
-    'array_expected_length': GetArrayExpectedLength,
-    'array': GetArrayKind,
-    'constant_value': ConstantValue,
-    'decode_method': DecodeMethod,
-    'default_value': DefaultValue,
-    'encode_method': EncodeMethod,
-    'expression_to_text': ExpressionToText,
-    'has_method_without_response': HasMethodWithoutResponse,
-    'has_method_with_response': HasMethodWithResponse,
-    'interface_response_name': GetInterfaceResponseName,
-    'is_array_kind': mojom.IsArrayKind,
-    'is_any_handle_kind': mojom.IsAnyHandleKind,
-    "is_enum_kind": mojom.IsEnumKind,
-    'is_interface_request_kind': mojom.IsInterfaceRequestKind,
-    'is_map_kind': mojom.IsMapKind,
-    'is_nullable_kind': mojom.IsNullableKind,
-    'is_pointer_array_kind': IsPointerArrayKind,
-    'is_reference_kind': mojom.IsReferenceKind,
-    'is_struct_kind': mojom.IsStructKind,
-    'is_union_array_kind': IsUnionArrayKind,
-    'is_union_kind': mojom.IsUnionKind,
-    'java_class_for_enum': GetJavaClassForEnum,
-    'java_true_false': GetJavaTrueFalse,
-    'java_type': GetJavaType,
-    'method_ordinal_name': GetMethodOrdinalName,
-    'name': GetNameForElement,
-    'new_array': NewArray,
-    'ucc': lambda x: UpperCamelCase(x.name),
-  }
-
-  def GetJinjaExports(self):
-    return {
-      'package': GetPackage(self.module),
-    }
-
-  @staticmethod
-  def GetTemplatePrefix():
-    return "java_templates"
-
-  @classmethod
-  def GetFilters(cls):
-    return cls.java_filters
-
-  def GetJinjaExportsForInterface(self, interface):
-    exports = self.GetJinjaExports()
-    exports.update({'interface': interface})
-    return exports
-
-  @UseJinja('enum.java.tmpl')
-  def GenerateEnumSource(self, enum):
-    exports = self.GetJinjaExports()
-    exports.update({'enum': enum})
-    return exports
-
-  @UseJinja('struct.java.tmpl')
-  def GenerateStructSource(self, struct):
-    exports = self.GetJinjaExports()
-    exports.update({'struct': struct})
-    return exports
-
-  @UseJinja('union.java.tmpl')
-  def GenerateUnionSource(self, union):
-    exports = self.GetJinjaExports()
-    exports.update({'union': union})
-    return exports
-
-  @UseJinja('interface.java.tmpl')
-  def GenerateInterfaceSource(self, interface):
-    return self.GetJinjaExportsForInterface(interface)
-
-  @UseJinja('interface_internal.java.tmpl')
-  def GenerateInterfaceInternalSource(self, interface):
-    return self.GetJinjaExportsForInterface(interface)
-
-  @UseJinja('constants.java.tmpl')
-  def GenerateConstantsSource(self, module):
-    exports = self.GetJinjaExports()
-    exports.update({'main_entity': GetConstantsMainEntityName(module),
-                    'constants': module.constants})
-    return exports
-
-  def DoGenerateFiles(self):
-    fileutil.EnsureDirectoryExists(self.output_dir)
-
-    # Keep this above the others as .GetStructs() changes the state of the
-    # module, annotating structs with required information.
-    for struct in self.GetStructs():
-      self.Write(self.GenerateStructSource(struct),
-                 '%s.java' % GetNameForElement(struct))
-
-    for union in self.module.unions:
-      self.Write(self.GenerateUnionSource(union),
-                 '%s.java' % GetNameForElement(union))
-
-    for enum in self.module.enums:
-      self.Write(self.GenerateEnumSource(enum),
-                 '%s.java' % GetNameForElement(enum))
-
-    for interface in self.GetInterfaces():
-      self.Write(self.GenerateInterfaceSource(interface),
-                 '%s.java' % GetNameForElement(interface))
-      self.Write(self.GenerateInterfaceInternalSource(interface),
-                 '%s_Internal.java' % GetNameForElement(interface))
-
-    if self.module.constants:
-      self.Write(self.GenerateConstantsSource(self.module),
-                 '%s.java' % GetConstantsMainEntityName(self.module))
-
-  def GenerateFiles(self, unparsed_args):
-    # TODO(rockot): Support variant output for Java.
-    if self.variant:
-      raise Exception("Variants not supported in Java bindings.")
-
-    parser = argparse.ArgumentParser()
-    parser.add_argument('--java_output_directory', dest='java_output_directory')
-    args = parser.parse_args(unparsed_args)
-    package_path = GetPackage(self.module).replace('.', '/')
-
-    # Generate the java files in a temporary directory and place a single
-    # srcjar in the output directory.
-    basename = self.MatchMojomFilePath("%s.srcjar" % self.module.name)
-    zip_filename = os.path.join(self.output_dir, basename)
-    with TempDir() as temp_java_root:
-      self.output_dir = os.path.join(temp_java_root, package_path)
-      self.DoGenerateFiles();
-      build_utils.ZipDir(zip_filename, temp_java_root)
-
-    if args.java_output_directory:
-      # If requested, generate the java files directly into indicated directory.
-      self.output_dir = os.path.join(args.java_output_directory, package_path)
-      self.DoGenerateFiles();
-
-  def GetJinjaParameters(self):
-    return {
-      'lstrip_blocks': True,
-      'trim_blocks': True,
-    }
-
-  def GetGlobals(self):
-    return {
-      'namespace': self.module.namespace,
-      'module': self.module,
-    }
diff --git a/mojo/public/tools/bindings/generators/mojom_js_generator.py b/mojo/public/tools/bindings/generators/mojom_js_generator.py
deleted file mode 100644
index ab9635e..0000000
--- a/mojo/public/tools/bindings/generators/mojom_js_generator.py
+++ /dev/null
@@ -1,425 +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.
-
-"""Generates JavaScript source files from a mojom.Module."""
-
-import mojom.generate.generator as generator
-import mojom.generate.module as mojom
-import mojom.generate.pack as pack
-import os
-from mojom.generate.template_expander import UseJinja
-
-_kind_to_javascript_default_value = {
-  mojom.BOOL:                  "false",
-  mojom.INT8:                  "0",
-  mojom.UINT8:                 "0",
-  mojom.INT16:                 "0",
-  mojom.UINT16:                "0",
-  mojom.INT32:                 "0",
-  mojom.UINT32:                "0",
-  mojom.FLOAT:                 "0",
-  mojom.HANDLE:                "null",
-  mojom.DCPIPE:                "null",
-  mojom.DPPIPE:                "null",
-  mojom.MSGPIPE:               "null",
-  mojom.SHAREDBUFFER:          "null",
-  mojom.NULLABLE_HANDLE:       "null",
-  mojom.NULLABLE_DCPIPE:       "null",
-  mojom.NULLABLE_DPPIPE:       "null",
-  mojom.NULLABLE_MSGPIPE:      "null",
-  mojom.NULLABLE_SHAREDBUFFER: "null",
-  mojom.INT64:                 "0",
-  mojom.UINT64:                "0",
-  mojom.DOUBLE:                "0",
-  mojom.STRING:                "null",
-  mojom.NULLABLE_STRING:       "null"
-}
-
-
-def JavaScriptType(kind):
-  name = []
-  if kind.imported_from:
-    name.append(kind.imported_from["unique_name"])
-  if kind.parent_kind:
-    name.append(kind.parent_kind.name)
-  name.append(kind.name)
-  return ".".join(name)
-
-
-def JavaScriptDefaultValue(field):
-  if field.default:
-    if mojom.IsStructKind(field.kind):
-      assert field.default == "default"
-      return "new %s()" % JavaScriptType(field.kind)
-    return ExpressionToText(field.default)
-  if field.kind in mojom.PRIMITIVES:
-    return _kind_to_javascript_default_value[field.kind]
-  if mojom.IsStructKind(field.kind):
-    return "null"
-  if mojom.IsUnionKind(field.kind):
-    return "null"
-  if mojom.IsArrayKind(field.kind):
-    return "null"
-  if mojom.IsMapKind(field.kind):
-    return "null"
-  if mojom.IsInterfaceKind(field.kind):
-    return "new %sPtr()" % JavaScriptType(field.kind)
-  if mojom.IsInterfaceRequestKind(field.kind):
-    return "new bindings.InterfaceRequest()"
-  if mojom.IsAssociatedKind(field.kind):
-    return "null"
-  if mojom.IsEnumKind(field.kind):
-    return "0"
-  raise Exception("No valid default: %s" % field)
-
-
-def JavaScriptPayloadSize(packed):
-  packed_fields = packed.packed_fields
-  if not packed_fields:
-    return 0
-  last_field = packed_fields[-1]
-  offset = last_field.offset + last_field.size
-  pad = pack.GetPad(offset, 8)
-  return offset + pad
-
-
-_kind_to_codec_type = {
-  mojom.BOOL:                  "codec.Uint8",
-  mojom.INT8:                  "codec.Int8",
-  mojom.UINT8:                 "codec.Uint8",
-  mojom.INT16:                 "codec.Int16",
-  mojom.UINT16:                "codec.Uint16",
-  mojom.INT32:                 "codec.Int32",
-  mojom.UINT32:                "codec.Uint32",
-  mojom.FLOAT:                 "codec.Float",
-  mojom.HANDLE:                "codec.Handle",
-  mojom.DCPIPE:                "codec.Handle",
-  mojom.DPPIPE:                "codec.Handle",
-  mojom.MSGPIPE:               "codec.Handle",
-  mojom.SHAREDBUFFER:          "codec.Handle",
-  mojom.NULLABLE_HANDLE:       "codec.NullableHandle",
-  mojom.NULLABLE_DCPIPE:       "codec.NullableHandle",
-  mojom.NULLABLE_DPPIPE:       "codec.NullableHandle",
-  mojom.NULLABLE_MSGPIPE:      "codec.NullableHandle",
-  mojom.NULLABLE_SHAREDBUFFER: "codec.NullableHandle",
-  mojom.INT64:                 "codec.Int64",
-  mojom.UINT64:                "codec.Uint64",
-  mojom.DOUBLE:                "codec.Double",
-  mojom.STRING:                "codec.String",
-  mojom.NULLABLE_STRING:       "codec.NullableString",
-}
-
-
-def CodecType(kind):
-  if kind in mojom.PRIMITIVES:
-    return _kind_to_codec_type[kind]
-  if mojom.IsStructKind(kind):
-    pointer_type = "NullablePointerTo" if mojom.IsNullableKind(kind) \
-        else "PointerTo"
-    return "new codec.%s(%s)" % (pointer_type, JavaScriptType(kind))
-  if mojom.IsUnionKind(kind):
-    return JavaScriptType(kind)
-  if mojom.IsArrayKind(kind):
-    array_type = "NullableArrayOf" if mojom.IsNullableKind(kind) else "ArrayOf"
-    array_length = "" if kind.length is None else ", %d" % kind.length
-    element_type = ElementCodecType(kind.kind)
-    return "new codec.%s(%s%s)" % (array_type, element_type, array_length)
-  if mojom.IsInterfaceKind(kind):
-    return "new codec.%s(%sPtr)" % (
-        "NullableInterface" if mojom.IsNullableKind(kind) else "Interface",
-        JavaScriptType(kind))
-  if mojom.IsInterfaceRequestKind(kind):
-    return "codec.%s" % (
-        "NullableInterfaceRequest" if mojom.IsNullableKind(kind)
-                                   else "InterfaceRequest")
-  if mojom.IsAssociatedInterfaceKind(kind):
-    return "codec.AssociatedInterfaceNotSupported"
-  if mojom.IsAssociatedInterfaceRequestKind(kind):
-    return "codec.AssociatedInterfaceRequestNotSupported"
-  if mojom.IsEnumKind(kind):
-    return "new codec.Enum(%s)" % JavaScriptType(kind)
-  if mojom.IsMapKind(kind):
-    map_type = "NullableMapOf" if mojom.IsNullableKind(kind) else "MapOf"
-    key_type = ElementCodecType(kind.key_kind)
-    value_type = ElementCodecType(kind.value_kind)
-    return "new codec.%s(%s, %s)" % (map_type, key_type, value_type)
-  raise Exception("No codec type for %s" % kind)
-
-
-def ElementCodecType(kind):
-  return "codec.PackedBool" if mojom.IsBoolKind(kind) else CodecType(kind)
-
-
-def JavaScriptDecodeSnippet(kind):
-  if (kind in mojom.PRIMITIVES or mojom.IsUnionKind(kind) or
-      mojom.IsAnyInterfaceKind(kind)):
-    return "decodeStruct(%s)" % CodecType(kind)
-  if mojom.IsStructKind(kind):
-    return "decodeStructPointer(%s)" % JavaScriptType(kind)
-  if mojom.IsMapKind(kind):
-    return "decodeMapPointer(%s, %s)" % \
-        (ElementCodecType(kind.key_kind), ElementCodecType(kind.value_kind))
-  if mojom.IsArrayKind(kind) and mojom.IsBoolKind(kind.kind):
-    return "decodeArrayPointer(codec.PackedBool)"
-  if mojom.IsArrayKind(kind):
-    return "decodeArrayPointer(%s)" % CodecType(kind.kind)
-  if mojom.IsUnionKind(kind):
-    return "decodeUnion(%s)" % CodecType(kind)
-  if mojom.IsEnumKind(kind):
-    return JavaScriptDecodeSnippet(mojom.INT32)
-  raise Exception("No decode snippet for %s" % kind)
-
-
-def JavaScriptEncodeSnippet(kind):
-  if (kind in mojom.PRIMITIVES or mojom.IsUnionKind(kind) or
-      mojom.IsAnyInterfaceKind(kind)):
-    return "encodeStruct(%s, " % CodecType(kind)
-  if mojom.IsUnionKind(kind):
-    return "encodeStruct(%s, " % JavaScriptType(kind)
-  if mojom.IsStructKind(kind):
-    return "encodeStructPointer(%s, " % JavaScriptType(kind)
-  if mojom.IsMapKind(kind):
-    return "encodeMapPointer(%s, %s, " % \
-        (ElementCodecType(kind.key_kind), ElementCodecType(kind.value_kind))
-  if mojom.IsArrayKind(kind) and mojom.IsBoolKind(kind.kind):
-    return "encodeArrayPointer(codec.PackedBool, ";
-  if mojom.IsArrayKind(kind):
-    return "encodeArrayPointer(%s, " % CodecType(kind.kind)
-  if mojom.IsEnumKind(kind):
-    return JavaScriptEncodeSnippet(mojom.INT32)
-  raise Exception("No encode snippet for %s" % kind)
-
-
-def JavaScriptUnionDecodeSnippet(kind):
-  if mojom.IsUnionKind(kind):
-    return "decodeStructPointer(%s)" % JavaScriptType(kind)
-  return JavaScriptDecodeSnippet(kind)
-
-
-def JavaScriptUnionEncodeSnippet(kind):
-  if mojom.IsUnionKind(kind):
-    return "encodeStructPointer(%s, " % JavaScriptType(kind)
-  return JavaScriptEncodeSnippet(kind)
-
-
-def JavaScriptFieldOffset(packed_field):
-  return "offset + codec.kStructHeaderSize + %s" % packed_field.offset
-
-
-def JavaScriptNullableParam(field):
-  return "true" if mojom.IsNullableKind(field.kind) else "false"
-
-
-def GetArrayExpectedDimensionSizes(kind):
-  expected_dimension_sizes = []
-  while mojom.IsArrayKind(kind):
-    expected_dimension_sizes.append(generator.ExpectedArraySize(kind) or 0)
-    kind = kind.kind
-  # Strings are serialized as variable-length arrays.
-  if (mojom.IsStringKind(kind)):
-    expected_dimension_sizes.append(0)
-  return expected_dimension_sizes
-
-
-def JavaScriptValidateArrayParams(field):
-  nullable = JavaScriptNullableParam(field)
-  element_kind = field.kind.kind
-  element_size = pack.PackedField.GetSizeForKind(element_kind)
-  expected_dimension_sizes = GetArrayExpectedDimensionSizes(
-      field.kind)
-  element_type = ElementCodecType(element_kind)
-  return "%s, %s, %s, %s, 0" % \
-      (element_size, element_type, nullable,
-       expected_dimension_sizes)
-
-
-def JavaScriptValidateEnumParams(field):
-  return JavaScriptType(field.kind)
-
-def JavaScriptValidateStructParams(field):
-  nullable = JavaScriptNullableParam(field)
-  struct_type = JavaScriptType(field.kind)
-  return "%s, %s" % (struct_type, nullable)
-
-def JavaScriptValidateUnionParams(field):
-  nullable = JavaScriptNullableParam(field)
-  union_type = JavaScriptType(field.kind)
-  return "%s, %s" % (union_type, nullable)
-
-def JavaScriptValidateMapParams(field):
-  nullable = JavaScriptNullableParam(field)
-  keys_type = ElementCodecType(field.kind.key_kind)
-  values_kind = field.kind.value_kind;
-  values_type = ElementCodecType(values_kind)
-  values_nullable = "true" if mojom.IsNullableKind(values_kind) else "false"
-  return "%s, %s, %s, %s" % \
-      (nullable, keys_type, values_type, values_nullable)
-
-
-def TranslateConstants(token):
-  if isinstance(token, (mojom.EnumValue, mojom.NamedValue)):
-    # Both variable and enum constants are constructed like:
-    # NamespaceUid.Struct[.Enum].CONSTANT_NAME
-    name = []
-    if token.imported_from:
-      name.append(token.imported_from["unique_name"])
-    if token.parent_kind:
-      name.append(token.parent_kind.name)
-    if isinstance(token, mojom.EnumValue):
-      name.append(token.enum.name)
-    name.append(token.name)
-    return ".".join(name)
-
-  if isinstance(token, mojom.BuiltinValue):
-    if token.value == "double.INFINITY" or token.value == "float.INFINITY":
-      return "Infinity";
-    if token.value == "double.NEGATIVE_INFINITY" or \
-       token.value == "float.NEGATIVE_INFINITY":
-      return "-Infinity";
-    if token.value == "double.NAN" or token.value == "float.NAN":
-      return "NaN";
-
-  return token
-
-
-def ExpressionToText(value):
-  return TranslateConstants(value)
-
-def IsArrayPointerField(field):
-  return mojom.IsArrayKind(field.kind)
-
-def IsEnumField(field):
-  return mojom.IsEnumKind(field.kind)
-
-def IsStringPointerField(field):
-  return mojom.IsStringKind(field.kind)
-
-def IsStructPointerField(field):
-  return mojom.IsStructKind(field.kind)
-
-def IsMapPointerField(field):
-  return mojom.IsMapKind(field.kind)
-
-def IsHandleField(field):
-  return mojom.IsAnyHandleKind(field.kind)
-
-def IsInterfaceField(field):
-  return mojom.IsInterfaceKind(field.kind)
-
-def IsInterfaceRequestField(field):
-  return mojom.IsInterfaceRequestKind(field.kind)
-
-def IsUnionField(field):
-  return mojom.IsUnionKind(field.kind)
-
-def IsBoolField(field):
-  return mojom.IsBoolKind(field.kind)
-
-def IsObjectField(field):
-  return mojom.IsObjectKind(field.kind)
-
-def IsAnyHandleOrInterfaceField(field):
-  return mojom.IsAnyHandleOrInterfaceKind(field.kind)
-
-def IsEnumField(field):
-  return mojom.IsEnumKind(field.kind)
-
-def GetRelativePath(module, base_module):
-  return os.path.relpath(module.path, os.path.dirname(base_module.path))
-
-
-class Generator(generator.Generator):
-
-  js_filters = {
-    "decode_snippet": JavaScriptDecodeSnippet,
-    "default_value": JavaScriptDefaultValue,
-    "encode_snippet": JavaScriptEncodeSnippet,
-    "expression_to_text": ExpressionToText,
-    "field_offset": JavaScriptFieldOffset,
-    "has_callbacks": mojom.HasCallbacks,
-    "is_any_handle_or_interface_field": IsAnyHandleOrInterfaceField,
-    "is_array_pointer_field": IsArrayPointerField,
-    "is_bool_field": IsBoolField,
-    "is_enum_field": IsEnumField,
-    "is_handle_field": IsHandleField,
-    "is_interface_field": IsInterfaceField,
-    "is_interface_request_field": IsInterfaceRequestField,
-    "is_map_pointer_field": IsMapPointerField,
-    "is_object_field": IsObjectField,
-    "is_string_pointer_field": IsStringPointerField,
-    "is_struct_pointer_field": IsStructPointerField,
-    "is_union_field": IsUnionField,
-    "js_type": JavaScriptType,
-    "payload_size": JavaScriptPayloadSize,
-    "get_relative_path": GetRelativePath,
-    "stylize_method": generator.StudlyCapsToCamel,
-    "union_decode_snippet": JavaScriptUnionDecodeSnippet,
-    "union_encode_snippet": JavaScriptUnionEncodeSnippet,
-    "validate_array_params": JavaScriptValidateArrayParams,
-    "validate_enum_params": JavaScriptValidateEnumParams,
-    "validate_map_params": JavaScriptValidateMapParams,
-    "validate_nullable_params": JavaScriptNullableParam,
-    "validate_struct_params": JavaScriptValidateStructParams,
-    "validate_union_params": JavaScriptValidateUnionParams,
-  }
-
-  def GetParameters(self):
-    return {
-      "namespace": self.module.namespace,
-      "imports": self.GetImports(),
-      "kinds": self.module.kinds,
-      "enums": self.module.enums,
-      "module": self.module,
-      "structs": self.GetStructs() + self.GetStructsFromMethods(),
-      "unions": self.GetUnions(),
-      "use_new_js_bindings": self.use_new_js_bindings,
-      "interfaces": self.GetInterfaces(),
-      "imported_interfaces": self.GetImportedInterfaces(),
-    }
-
-  @staticmethod
-  def GetTemplatePrefix():
-    return "js_templates"
-
-  @classmethod
-  def GetFilters(cls):
-    return cls.js_filters
-
-  @UseJinja("module.amd.tmpl")
-  def GenerateAMDModule(self):
-    return self.GetParameters()
-
-  def GenerateFiles(self, args):
-    if self.variant:
-      raise Exception("Variants not supported in JavaScript bindings.")
-
-    self.Write(self.GenerateAMDModule(),
-        self.MatchMojomFilePath("%s.js" % self.module.name))
-
-  def GetImports(self):
-    used_names = set()
-    for each_import in self.module.imports:
-      simple_name = each_import["module_name"].split(".")[0]
-
-      # Since each import is assigned a variable in JS, they need to have unique
-      # names.
-      unique_name = simple_name
-      counter = 0
-      while unique_name in used_names:
-        counter += 1
-        unique_name = simple_name + str(counter)
-
-      used_names.add(unique_name)
-      each_import["unique_name"] = unique_name + "$"
-      counter += 1
-    return self.module.imports
-
-  def GetImportedInterfaces(self):
-    interface_to_import = {};
-    for each_import in self.module.imports:
-      for each_interface in each_import["module"].interfaces:
-        name = each_interface.name
-        interface_to_import[name] = each_import["unique_name"] + "." + name
-    return interface_to_import;
-
diff --git a/mojo/public/tools/bindings/mojom.gni b/mojo/public/tools/bindings/mojom.gni
deleted file mode 100644
index 4a244fb..0000000
--- a/mojo/public/tools/bindings/mojom.gni
+++ /dev/null
@@ -1,661 +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.
-
-declare_args() {
-  # Indicates whether typemapping should be supported in this build
-  # configuration. This may be disabled when building external projects which
-  # depend on //mojo but which do not need/want all of the Chromium tree
-  # dependencies that come with typemapping.
-  #
-  # Note that (perhaps obviously) a huge amount of Chromium code will not build
-  # with typemapping disabled, so it is never valid to set this to |false| in
-  # any Chromium build configuration.
-  enable_mojom_typemapping = true
-}
-
-mojom_generator_root = "//mojo/public/tools/bindings"
-mojom_generator_script = "$mojom_generator_root/mojom_bindings_generator.py"
-mojom_generator_sources = [
-  "$mojom_generator_root/generators/mojom_cpp_generator.py",
-  "$mojom_generator_root/generators/mojom_js_generator.py",
-  "$mojom_generator_root/generators/mojom_java_generator.py",
-  "$mojom_generator_root/pylib/mojom/__init__.py",
-  "$mojom_generator_root/pylib/mojom/error.py",
-  "$mojom_generator_root/pylib/mojom/generate/__init__.py",
-  "$mojom_generator_root/pylib/mojom/generate/constant_resolver.py",
-  "$mojom_generator_root/pylib/mojom/generate/generator.py",
-  "$mojom_generator_root/pylib/mojom/generate/module.py",
-  "$mojom_generator_root/pylib/mojom/generate/pack.py",
-  "$mojom_generator_root/pylib/mojom/generate/template_expander.py",
-  "$mojom_generator_root/pylib/mojom/generate/translate.py",
-  "$mojom_generator_root/pylib/mojom/parse/__init__.py",
-  "$mojom_generator_root/pylib/mojom/parse/ast.py",
-  "$mojom_generator_root/pylib/mojom/parse/lexer.py",
-  "$mojom_generator_root/pylib/mojom/parse/parser.py",
-  "$mojom_generator_script",
-]
-
-if (enable_mojom_typemapping) {
-  if (!is_ios) {
-    _bindings_configuration_files = [
-      "//mojo/public/tools/bindings/chromium_bindings_configuration.gni",
-      "//mojo/public/tools/bindings/blink_bindings_configuration.gni",
-    ]
-  } else {
-    _bindings_configuration_files =
-        [ "//mojo/public/tools/bindings/chromium_bindings_configuration.gni" ]
-  }
-  _bindings_configurations = []
-  foreach(config_file, _bindings_configuration_files) {
-    _bindings_configurations += [ read_file(config_file, "scope") ]
-  }
-  foreach(configuration, _bindings_configurations) {
-    # Check that the mojom field of each typemap refers to a mojom that exists.
-    foreach(typemap, configuration.typemaps) {
-      _typemap_config = {
-      }
-      _typemap_config = typemap.config
-      read_file(_typemap_config.mojom, "")
-    }
-    if (is_mac && defined(configuration.typemaps_mac)) {
-      foreach(typemap, configuration.typemaps_mac) {
-        _typemap_config = {
-        }
-        _typemap_config = typemap.config
-        read_file(_typemap_config.mojom, "")
-      }
-    }
-  }
-} else {
-  _bindings_configuration_files = []
-  _bindings_configurations = [
-    {
-      typemaps = []
-    },
-    {
-      variant = "blink"
-      for_blink = true
-      typemaps = []
-    },
-  ]
-}
-
-# Generates targets for building C++, JavaScript and Java bindings from mojom
-# files. The output files will go under the generated file directory tree with
-# the same path as each input file.
-#
-# Other targets should depend on one of these generated targets (where "foo"
-# is the target name):
-#
-#   foo
-#       C++ and Javascript bindings. Other mojom targets should also depend on
-#       this target.
-#
-#   foo_blink
-#       C++ bindings using Blink standard types.
-#
-#   foo_java
-#       Java bindings.
-#
-# Parameters:
-#
-#   sources (optional if one of the deps sets listed below is present)
-#       List of source .mojom files to compile.
-#
-#   deps (optional)
-#       Note: this can contain only other mojom targets.
-#
-#       DEPRECATED: This is synonymous with public_deps because all mojom
-#       dependencies must be public by design. Please use public_deps.
-#
-#   public_deps (optional)
-#       Note: this can contain only other mojom targets.
-#
-#   import_dirs (optional)
-#       List of import directories that will get added when processing sources.
-#
-#   testonly (optional)
-#
-#   visibility (optional)
-#
-#   visibility_blink (optional)
-#       The value to use for visibility for the blink variant. If unset,
-#       |visibility| is used.
-#
-#   use_once_callback (optional)
-#       If set to true, generated classes will use base::OnceCallback instead of
-#       base::RepeatingCallback.
-#       Default value is false.
-#       TODO(dcheng):
-#           - Convert everything to use OnceCallback.
-#           - Remove support for the old mode.
-#
-#   cpp_only (optional)
-#       If set to true, only the C++ bindings targets will be generated.
-#
-#   use_new_js_bindings (optional)
-#       If set to true, the generated JS code will use the new module loading
-#       approach and the core API exposed by Web IDL.
-#
-#       TODO(yzshen): Switch all existing users to use_new_js_bindings=true and
-#       remove the old mode.
-#
-# The following parameters are used to support the component build. They are
-# needed so that bindings which are linked with a component can use the same
-# export settings for classes. The first three are for the chromium variant, and
-# the last three are for the blink variant.
-#   export_class_attribute (optional)
-#       The attribute to add to the class declaration. e.g. "CONTENT_EXPORT"
-#   export_define (optional)
-#       A define to be added to the source_set which is needed by the export
-#       header. e.g. "CONTENT_IMPLEMENTATION=1"
-#   export_header (optional)
-#       A header to be added to the generated bindings to support the component
-#       build. e.g. "content/common/content_export.h"
-#   export_class_attribute_blink (optional)
-#   export_define_blink (optional)
-#   export_header_blink (optional)
-#       These three parameters are the blink variants of the previous 3.
-#
-# The following parameters are used to correct component build dependencies.
-# They are needed so mojom-mojom dependencies follow the rule that dependencies
-# on a source set in another component are replaced by a dependency on the
-# containing component. The first two are for the chromium variant; the other
-# two are for the blink variant.
-#   overridden_deps (optional)
-#       The list of mojom deps to be overridden.
-#   component_deps (optional)
-#       The list of component deps to add to replace overridden_deps.
-#   overridden_deps_blink (optional)
-#   component_deps_blink (optional)
-#       These two parameters are the blink variants of the previous two.
-template("mojom") {
-  assert(
-      defined(invoker.sources) || defined(invoker.deps) ||
-          defined(invoker.public_deps),
-      "\"sources\" or \"deps\" must be defined for the $target_name template.")
-  if (defined(invoker.export_class_attribute) ||
-      defined(invoker.export_define) || defined(invoker.export_header)) {
-    assert(defined(invoker.export_class_attribute))
-    assert(defined(invoker.export_define))
-    assert(defined(invoker.export_header))
-  }
-  if (defined(invoker.export_class_attribute_blink) ||
-      defined(invoker.export_define_blink) ||
-      defined(invoker.export_header_blink)) {
-    assert(defined(invoker.export_class_attribute_blink))
-    assert(defined(invoker.export_define_blink))
-    assert(defined(invoker.export_header_blink))
-  }
-  if (defined(invoker.overridden_deps) || defined(invoker.component_deps)) {
-    assert(defined(invoker.overridden_deps))
-    assert(defined(invoker.component_deps))
-  }
-
-  if (defined(invoker.overridden_deps_blink) ||
-      defined(invoker.component_deps_blink)) {
-    assert(defined(invoker.overridden_deps_blink))
-    assert(defined(invoker.component_deps_blink))
-  }
-
-  all_deps = []
-  if (defined(invoker.deps)) {
-    all_deps += invoker.deps
-  }
-  if (defined(invoker.public_deps)) {
-    all_deps += invoker.public_deps
-  }
-
-  group("${target_name}__is_mojom") {
-  }
-
-  # Explicitly ensure that all dependencies (invoker.deps and
-  # invoker.public_deps) are mojom targets.
-  group("${target_name}__check_deps_are_all_mojom") {
-    deps = []
-    foreach(d, all_deps) {
-      name = get_label_info(d, "label_no_toolchain")
-      toolchain = get_label_info(d, "toolchain")
-      deps += [ "${name}__is_mojom(${toolchain})" ]
-    }
-  }
-
-  # Generate code that is shared by different variants.
-  if (defined(invoker.sources)) {
-    common_generator_args = [
-      "--use_bundled_pylibs",
-      "generate",
-      "{{source}}",
-      "-d",
-      rebase_path("//", root_build_dir),
-      "-I",
-      rebase_path("//", root_build_dir),
-      "-o",
-      rebase_path(root_gen_dir),
-      "--bytecode_path",
-      rebase_path("$root_gen_dir/mojo/public/tools/bindings"),
-    ]
-
-    if (defined(invoker.import_dirs)) {
-      foreach(import_dir, invoker.import_dirs) {
-        common_generator_args += [
-          "-I",
-          rebase_path(import_dir, root_build_dir),
-        ]
-      }
-    }
-
-    generator_shared_cpp_outputs = [
-      "{{source_gen_dir}}/{{source_name_part}}.mojom-shared-internal.h",
-      "{{source_gen_dir}}/{{source_name_part}}.mojom-shared.cc",
-      "{{source_gen_dir}}/{{source_name_part}}.mojom-shared.h",
-    ]
-    generator_shared_target_name = "${target_name}_shared__generator"
-    action_foreach(generator_shared_target_name) {
-      script = mojom_generator_script
-      inputs = mojom_generator_sources
-      sources = invoker.sources
-      deps = [
-        "//mojo/public/tools/bindings:precompile_templates",
-      ]
-      outputs = generator_shared_cpp_outputs
-      args = common_generator_args
-      args += [
-        "--generate_non_variant_code",
-        "-g",
-        "c++",
-      ]
-      depfile = "{{source_gen_dir}}/${generator_shared_target_name}_{{source_name_part}}.d"
-      args += [
-        "--depfile",
-        depfile,
-        "--depfile_target",
-        "{{source_gen_dir}}/{{source_name_part}}.mojom-shared-internal.h",
-      ]
-    }
-  }
-
-  shared_cpp_sources_suffix = "shared_cpp_sources"
-  shared_cpp_sources_target_name = "${target_name}_${shared_cpp_sources_suffix}"
-  source_set(shared_cpp_sources_target_name) {
-    if (defined(invoker.testonly)) {
-      testonly = invoker.testonly
-    }
-    deps = []
-    if (defined(invoker.sources)) {
-      sources =
-          process_file_template(invoker.sources, generator_shared_cpp_outputs)
-      deps += [ ":$generator_shared_target_name" ]
-    }
-    public_deps = []
-    foreach(d, all_deps) {
-      # Resolve the name, so that a target //mojo/something becomes
-      # //mojo/something:something and we can append shared_cpp_sources_suffix
-      # to get the cpp dependency name.
-      full_name = get_label_info("$d", "label_no_toolchain")
-      public_deps += [ "${full_name}_${shared_cpp_sources_suffix}" ]
-    }
-  }
-
-  # Generate code for variants.
-  foreach(bindings_configuration, _bindings_configurations) {
-    cpp_only = false
-    if (defined(invoker.cpp_only)) {
-      cpp_only = invoker.cpp_only
-    }
-    variant_suffix = ""
-    if (defined(bindings_configuration.variant)) {
-      variant = bindings_configuration.variant
-      variant_suffix = "_${variant}"
-      cpp_only = true
-    }
-    type_mappings_target_name = "${target_name}${variant_suffix}__type_mappings"
-    type_mappings_path =
-        "$target_gen_dir/${target_name}${variant_suffix}__type_mappings"
-    active_typemaps = []
-    enabled_sources = []
-    if (defined(invoker.sources)) {
-      generator_cpp_outputs = []
-      generator_js_outputs = []
-      generator_java_outputs = []
-      variant_dash_suffix = ""
-      if (defined(variant)) {
-        variant_dash_suffix = "-${variant}"
-      }
-      generator_cpp_outputs += [
-        "{{source_gen_dir}}/{{source_name_part}}.mojom${variant_dash_suffix}.cc",
-        "{{source_gen_dir}}/{{source_name_part}}.mojom${variant_dash_suffix}.h",
-      ]
-      enabled_sources = []
-      if (defined(bindings_configuration.blacklist)) {
-        foreach(source, invoker.sources) {
-          blacklisted = false
-          foreach(blacklisted_source, bindings_configuration.blacklist) {
-            if (get_path_info(source, "abspath") == blacklisted_source) {
-              blacklisted = true
-            }
-          }
-          if (!blacklisted) {
-            enabled_sources += [ source ]
-          }
-        }
-      } else {
-        enabled_sources = invoker.sources
-      }
-      foreach(source, enabled_sources) {
-        # TODO(sammc): Use a map instead of a linear scan when GN supports maps.
-        foreach(typemap, bindings_configuration.typemaps) {
-          _typemap_config = {
-          }
-          _typemap_config = typemap.config
-          if (get_path_info(source, "abspath") == _typemap_config.mojom) {
-            active_typemaps += [ typemap ]
-          }
-        }
-        if (is_mac && defined(bindings_configuration.typemaps_mac)) {
-          foreach(typemap, bindings_configuration.typemaps_mac) {
-            _typemap_config = {
-            }
-            _typemap_config = typemap.config
-            if (get_path_info(source, "abspath") == _typemap_config.mojom) {
-              active_typemaps += [ typemap ]
-            }
-          }
-        }
-      }
-
-      if (!cpp_only) {
-        generator_js_outputs =
-            [ "{{source_gen_dir}}/{{source_name_part}}.mojom.js" ]
-        generator_java_outputs =
-            [ "{{source_gen_dir}}/{{source_name_part}}.mojom.srcjar" ]
-      }
-      generator_target_name = "${target_name}${variant_suffix}__generator"
-      action_foreach(generator_target_name) {
-        script = mojom_generator_script
-        inputs = mojom_generator_sources
-        sources = invoker.sources
-        deps = [
-          ":$type_mappings_target_name",
-          "//mojo/public/tools/bindings:precompile_templates",
-        ]
-        outputs = generator_cpp_outputs + generator_java_outputs +
-                  generator_js_outputs
-        args = common_generator_args
-
-        if (cpp_only) {
-          args += [
-            "-g",
-            "c++",
-          ]
-        } else {
-          args += [
-            "-g",
-            "c++,javascript,java",
-          ]
-        }
-
-        if (defined(bindings_configuration.variant)) {
-          args += [
-            "--variant",
-            bindings_configuration.variant,
-          ]
-        }
-        depfile =
-            "{{source_gen_dir}}/${generator_target_name}_{{source_name_part}}.d"
-        args += [
-          "--depfile",
-          depfile,
-          "--depfile_target",
-          "{{source_gen_dir}}/{{source_name_part}}.mojom${variant_dash_suffix}.cc",
-        ]
-
-        args += [
-          "--typemap",
-          rebase_path(type_mappings_path, root_build_dir),
-        ]
-
-        if (defined(bindings_configuration.for_blink) &&
-            bindings_configuration.for_blink) {
-          args += [ "--for_blink" ]
-          if (defined(invoker.export_class_attribute_blink)) {
-            args += [
-              "--export_attribute",
-              invoker.export_class_attribute_blink,
-              "--export_header",
-              invoker.export_header_blink,
-            ]
-          }
-        } else {
-          if (defined(invoker.export_class_attribute)) {
-            args += [
-              "--export_attribute",
-              invoker.export_class_attribute,
-              "--export_header",
-              invoker.export_header,
-            ]
-          }
-        }
-
-        if (defined(invoker.use_once_callback) && invoker.use_once_callback) {
-          args += [ "--use_once_callback" ]
-        }
-
-        if (defined(invoker.use_new_js_bindings) &&
-            invoker.use_new_js_bindings) {
-          args += [ "--use_new_js_bindings" ]
-        }
-      }
-    }
-
-    action(type_mappings_target_name) {
-      inputs = _bindings_configuration_files
-      outputs = [
-        type_mappings_path,
-      ]
-      script = "$mojom_generator_root/generate_type_mappings.py"
-      deps = []
-      args = [
-        "--output",
-        rebase_path(type_mappings_path, root_build_dir),
-      ]
-
-      foreach(d, all_deps) {
-        name = get_label_info(d, "label_no_toolchain")
-        toolchain = get_label_info(d, "toolchain")
-        dependency_output = "${name}${variant_suffix}__type_mappings"
-        dependency_target = "${dependency_output}(${toolchain})"
-        deps += [ dependency_target ]
-        dependency_output_dir =
-            get_label_info(dependency_output, "target_gen_dir")
-        dependency_name = get_label_info(dependency_output, "name")
-        dependency_path =
-            rebase_path("$dependency_output_dir/${dependency_name}",
-                        root_build_dir)
-        args += [
-          "--dependency",
-          dependency_path,
-        ]
-      }
-
-      if (enabled_sources != []) {
-        # TODO(sammc): Pass the typemap description in a file to avoid command
-        # line length limitations.
-        typemap_description = []
-        foreach(typemap, active_typemaps) {
-          _typemap_config = {
-          }
-          _typemap_config = typemap.config
-          typemap_description += [ "--start-typemap" ]
-          if (defined(_typemap_config.public_headers)) {
-            foreach(value, _typemap_config.public_headers) {
-              typemap_description += [ "public_headers=$value" ]
-            }
-          }
-          if (defined(_typemap_config.traits_headers)) {
-            foreach(value, _typemap_config.traits_headers) {
-              typemap_description += [ "traits_headers=$value" ]
-            }
-          }
-          foreach(value, _typemap_config.type_mappings) {
-            typemap_description += [ "type_mappings=$value" ]
-          }
-
-          # The typemap configuration files are not actually used as inputs here
-          # but this establishes a necessary build dependency to ensure that
-          # typemap changes force a rebuild of affected targets.
-          inputs += [ typemap.filename ]
-        }
-        args += typemap_description
-      }
-    }
-
-    source_set("${target_name}${variant_suffix}") {
-      if (defined(bindings_configuration.for_blink) &&
-          bindings_configuration.for_blink &&
-          defined(invoker.visibility_blink)) {
-        visibility = invoker.visibility_blink
-      } else if (defined(invoker.visibility)) {
-        visibility = invoker.visibility
-      }
-      if (defined(invoker.testonly)) {
-        testonly = invoker.testonly
-      }
-      if (defined(invoker.sources) && !defined(bindings_configuration.variant)) {
-        data = process_file_template(enabled_sources, generator_js_outputs)
-      }
-      defines = []
-      if (defined(invoker.testonly)) {
-        testonly = invoker.testonly
-      }
-      if (defined(invoker.export_define)) {
-        defines += [ invoker.export_define ]
-      }
-      if (defined(invoker.export_define_blink)) {
-        defines += [ invoker.export_define_blink ]
-      }
-      if (enabled_sources != []) {
-        sources = process_file_template(enabled_sources, generator_cpp_outputs)
-      }
-      deps = [
-        "//mojo/public/cpp/bindings:struct_traits",
-        "//mojo/public/interfaces/bindings:bindings__generator",
-        "//mojo/public/interfaces/bindings:bindings_shared__generator",
-      ]
-      public_deps = [
-        ":$shared_cpp_sources_target_name",
-        "//base",
-        "//mojo/public/cpp/bindings",
-      ]
-      if (enabled_sources != []) {
-        public_deps += [ ":$generator_target_name" ]
-      }
-      foreach(d, all_deps) {
-        # Resolve the name, so that a target //mojo/something becomes
-        # //mojo/something:something and we can append variant_suffix to
-        # get the cpp dependency name.
-        full_name = get_label_info("$d", "label_no_toolchain")
-        public_deps += [ "${full_name}${variant_suffix}" ]
-      }
-      if (defined(bindings_configuration.for_blink) &&
-          bindings_configuration.for_blink) {
-        if (defined(invoker.overridden_deps_blink)) {
-          foreach(d, invoker.overridden_deps_blink) {
-            # Resolve the name, so that a target //mojo/something becomes
-            # //mojo/something:something and we can append variant_suffix
-            # to get the cpp dependency name.
-            full_name = get_label_info("$d", "label_no_toolchain")
-            public_deps -= [ "${full_name}${variant_suffix}" ]
-          }
-          public_deps += invoker.component_deps_blink
-        }
-      } else {
-        if (defined(invoker.overridden_deps)) {
-          foreach(d, invoker.overridden_deps) {
-            # Resolve the name, so that a target //mojo/something becomes
-            # //mojo/something:something and we can append variant_suffix
-            # to get the cpp dependency name.
-            full_name = get_label_info("$d", "label_no_toolchain")
-            public_deps -= [ "${full_name}${variant_suffix}" ]
-          }
-          public_deps += invoker.component_deps
-        }
-      }
-      foreach(typemap, active_typemaps) {
-        _typemap_config = {
-        }
-        _typemap_config = typemap.config
-        if (defined(_typemap_config.public_headers)) {
-          sources += _typemap_config.public_headers
-        }
-        if (defined(_typemap_config.traits_headers)) {
-          sources += _typemap_config.traits_headers
-        }
-        if (defined(_typemap_config.sources)) {
-          sources += _typemap_config.sources
-        }
-        if (defined(_typemap_config.public_deps)) {
-          public_deps += _typemap_config.public_deps
-        }
-        if (defined(_typemap_config.deps)) {
-          deps += _typemap_config.deps
-        }
-      }
-      if (defined(bindings_configuration.for_blink) &&
-          bindings_configuration.for_blink) {
-        public_deps += [ "//mojo/public/cpp/bindings:wtf_support" ]
-      }
-    }
-
-    if (!cpp_only && is_android) {
-      import("//build/config/android/rules.gni")
-
-      java_srcjar_target_name = target_name + "_java_sources"
-      action(java_srcjar_target_name) {
-        script = "//mojo/public/tools/gn/zip.py"
-        inputs = []
-        if (enabled_sources != []) {
-          inputs =
-              process_file_template(enabled_sources, generator_java_outputs)
-        }
-        output = "$target_gen_dir/$target_name.srcjar"
-        outputs = [
-          output,
-        ]
-        rebase_inputs = rebase_path(inputs, root_build_dir)
-        rebase_output = rebase_path(output, root_build_dir)
-        args = [
-          "--zip-inputs=$rebase_inputs",
-          "--output=$rebase_output",
-        ]
-        deps = []
-        if (enabled_sources != []) {
-          deps = [
-            ":$generator_target_name",
-          ]
-        }
-      }
-
-      java_target_name = target_name + "_java"
-      android_library(java_target_name) {
-        deps = [
-          "//base:base_java",
-          "//mojo/public/java:bindings_java",
-          "//mojo/public/java:system_java",
-        ]
-
-        foreach(d, all_deps) {
-          # Resolve the name, so that a target //mojo/something becomes
-          # //mojo/something:something and we can append "_java" to get the java
-          # dependency name.
-          full_name = get_label_info(d, "label_no_toolchain")
-          deps += [ "${full_name}_java" ]
-        }
-
-        srcjar_deps = [ ":$java_srcjar_target_name" ]
-        run_findbugs_override = false
-      }
-    }
-  }
-}
diff --git a/mojo/public/tools/bindings/mojom_bindings_generator.py b/mojo/public/tools/bindings/mojom_bindings_generator.py
deleted file mode 100755
index a9650d7..0000000
--- a/mojo/public/tools/bindings/mojom_bindings_generator.py
+++ /dev/null
@@ -1,336 +0,0 @@
-#!/usr/bin/env python
-# 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.
-
-"""The frontend for the Mojo bindings system."""
-
-
-import argparse
-import imp
-import json
-import os
-import pprint
-import re
-import sys
-
-# Disable lint check for finding modules:
-# pylint: disable=F0401
-
-def _GetDirAbove(dirname):
-  """Returns the directory "above" this file containing |dirname| (which must
-  also be "above" this file)."""
-  path = os.path.abspath(__file__)
-  while True:
-    path, tail = os.path.split(path)
-    assert tail
-    if tail == dirname:
-      return path
-
-# Manually check for the command-line flag. (This isn't quite right, since it
-# ignores, e.g., "--", but it's close enough.)
-if "--use_bundled_pylibs" in sys.argv[1:]:
-  sys.path.insert(0, os.path.join(_GetDirAbove("mojo"), "third_party"))
-
-sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)),
-                                "pylib"))
-
-from mojom.error import Error
-import mojom.fileutil as fileutil
-from mojom.generate import translate
-from mojom.generate import template_expander
-from mojom.parse.parser import Parse
-
-
-_BUILTIN_GENERATORS = {
-  "c++": "mojom_cpp_generator.py",
-  "javascript": "mojom_js_generator.py",
-  "java": "mojom_java_generator.py",
-}
-
-
-def LoadGenerators(generators_string):
-  if not generators_string:
-    return []  # No generators.
-
-  script_dir = os.path.dirname(os.path.abspath(__file__))
-  generators = {}
-  for generator_name in [s.strip() for s in generators_string.split(",")]:
-    language = generator_name.lower()
-    if language in _BUILTIN_GENERATORS:
-      generator_name = os.path.join(script_dir, "generators",
-                                    _BUILTIN_GENERATORS[language])
-    else:
-      print "Unknown generator name %s" % generator_name
-      sys.exit(1)
-    generator_module = imp.load_source(os.path.basename(generator_name)[:-3],
-                                       generator_name)
-    generators[language] = generator_module
-  return generators
-
-
-def MakeImportStackMessage(imported_filename_stack):
-  """Make a (human-readable) message listing a chain of imports. (Returned
-  string begins with a newline (if nonempty) and does not end with one.)"""
-  return ''.join(
-      reversed(["\n  %s was imported by %s" % (a, b) for (a, b) in \
-                    zip(imported_filename_stack[1:], imported_filename_stack)]))
-
-
-class RelativePath(object):
-  """Represents a path relative to the source tree."""
-  def __init__(self, path, source_root):
-    self.path = path
-    self.source_root = source_root
-
-  def relative_path(self):
-    return os.path.relpath(os.path.abspath(self.path),
-                           os.path.abspath(self.source_root))
-
-
-def FindImportFile(rel_dir, file_name, search_rel_dirs):
-  """Finds |file_name| in either |rel_dir| or |search_rel_dirs|. Returns a
-  RelativePath with first file found, or an arbitrary non-existent file
-  otherwise."""
-  for rel_search_dir in [rel_dir] + search_rel_dirs:
-    path = os.path.join(rel_search_dir.path, file_name)
-    if os.path.isfile(path):
-      return RelativePath(path, rel_search_dir.source_root)
-  return RelativePath(os.path.join(rel_dir.path, file_name),
-                      rel_dir.source_root)
-
-
-class MojomProcessor(object):
-  """Parses mojom files and creates ASTs for them.
-
-  Attributes:
-    _processed_files: {Dict[str, mojom.generate.module.Module]} Mapping from
-        relative mojom filename paths to the module AST for that mojom file.
-  """
-  def __init__(self, should_generate):
-    self._should_generate = should_generate
-    self._processed_files = {}
-    self._parsed_files = {}
-    self._typemap = {}
-
-  def LoadTypemaps(self, typemaps):
-    # Support some very simple single-line comments in typemap JSON.
-    comment_expr = r"^\s*//.*$"
-    def no_comments(line):
-      return not re.match(comment_expr, line)
-    for filename in typemaps:
-      with open(filename) as f:
-        typemaps = json.loads("".join(filter(no_comments, f.readlines())))
-        for language, typemap in typemaps.iteritems():
-          language_map = self._typemap.get(language, {})
-          language_map.update(typemap)
-          self._typemap[language] = language_map
-
-  def ProcessFile(self, args, remaining_args, generator_modules, filename):
-    self._ParseFileAndImports(RelativePath(filename, args.depth),
-                              args.import_directories, [])
-
-    return self._GenerateModule(args, remaining_args, generator_modules,
-        RelativePath(filename, args.depth))
-
-  def _GenerateModule(self, args, remaining_args, generator_modules,
-                      rel_filename):
-    # Return the already-generated module.
-    if rel_filename.path in self._processed_files:
-      return self._processed_files[rel_filename.path]
-    tree = self._parsed_files[rel_filename.path]
-
-    dirname, name = os.path.split(rel_filename.path)
-
-    # Process all our imports first and collect the module object for each.
-    # We use these to generate proper type info.
-    imports = {}
-    for parsed_imp in tree.import_list:
-      rel_import_file = FindImportFile(
-          RelativePath(dirname, rel_filename.source_root),
-          parsed_imp.import_filename, args.import_directories)
-      imports[parsed_imp.import_filename] = self._GenerateModule(
-          args, remaining_args, generator_modules, rel_import_file)
-
-    module = translate.OrderedModule(tree, name, imports)
-
-    # Set the path as relative to the source root.
-    module.path = rel_filename.relative_path()
-
-    # Normalize to unix-style path here to keep the generators simpler.
-    module.path = module.path.replace('\\', '/')
-
-    if self._should_generate(rel_filename.path):
-      for language, generator_module in generator_modules.iteritems():
-        generator = generator_module.Generator(
-            module, args.output_dir, typemap=self._typemap.get(language, {}),
-            variant=args.variant, bytecode_path=args.bytecode_path,
-            for_blink=args.for_blink,
-            use_once_callback=args.use_once_callback,
-            use_new_js_bindings=args.use_new_js_bindings,
-            export_attribute=args.export_attribute,
-            export_header=args.export_header,
-            generate_non_variant_code=args.generate_non_variant_code)
-        filtered_args = []
-        if hasattr(generator_module, 'GENERATOR_PREFIX'):
-          prefix = '--' + generator_module.GENERATOR_PREFIX + '_'
-          filtered_args = [arg for arg in remaining_args
-                           if arg.startswith(prefix)]
-        generator.GenerateFiles(filtered_args)
-
-    # Save result.
-    self._processed_files[rel_filename.path] = module
-    return module
-
-  def _ParseFileAndImports(self, rel_filename, import_directories,
-      imported_filename_stack):
-    # Ignore already-parsed files.
-    if rel_filename.path in self._parsed_files:
-      return
-
-    if rel_filename.path in imported_filename_stack:
-      print "%s: Error: Circular dependency" % rel_filename.path + \
-          MakeImportStackMessage(imported_filename_stack + [rel_filename.path])
-      sys.exit(1)
-
-    try:
-      with open(rel_filename.path) as f:
-        source = f.read()
-    except IOError as e:
-      print "%s: Error: %s" % (rel_filename.path, e.strerror) + \
-          MakeImportStackMessage(imported_filename_stack + [rel_filename.path])
-      sys.exit(1)
-
-    try:
-      tree = Parse(source, rel_filename.path)
-    except Error as e:
-      full_stack = imported_filename_stack + [rel_filename.path]
-      print str(e) + MakeImportStackMessage(full_stack)
-      sys.exit(1)
-
-    dirname = os.path.split(rel_filename.path)[0]
-    for imp_entry in tree.import_list:
-      import_file_entry = FindImportFile(
-          RelativePath(dirname, rel_filename.source_root),
-          imp_entry.import_filename, import_directories)
-      self._ParseFileAndImports(import_file_entry, import_directories,
-          imported_filename_stack + [rel_filename.path])
-
-    self._parsed_files[rel_filename.path] = tree
-
-
-def _Generate(args, remaining_args):
-  if args.variant == "none":
-    args.variant = None
-
-  for idx, import_dir in enumerate(args.import_directories):
-    tokens = import_dir.split(":")
-    if len(tokens) >= 2:
-      args.import_directories[idx] = RelativePath(tokens[0], tokens[1])
-    else:
-      args.import_directories[idx] = RelativePath(tokens[0], args.depth)
-  generator_modules = LoadGenerators(args.generators_string)
-
-  fileutil.EnsureDirectoryExists(args.output_dir)
-
-  processor = MojomProcessor(lambda filename: filename in args.filename)
-  processor.LoadTypemaps(set(args.typemaps))
-  for filename in args.filename:
-    processor.ProcessFile(args, remaining_args, generator_modules, filename)
-  if args.depfile:
-    assert args.depfile_target
-    with open(args.depfile, 'w') as f:
-      f.write('%s: %s' % (
-          args.depfile_target,
-          ' '.join(processor._parsed_files.keys())))
-
-  return 0
-
-
-def _Precompile(args, _):
-  generator_modules = LoadGenerators(",".join(_BUILTIN_GENERATORS.keys()))
-
-  template_expander.PrecompileTemplates(generator_modules, args.output_dir)
-  return 0
-
-
-
-def main():
-  parser = argparse.ArgumentParser(
-      description="Generate bindings from mojom files.")
-  parser.add_argument("--use_bundled_pylibs", action="store_true",
-                      help="use Python modules bundled in the SDK")
-
-  subparsers = parser.add_subparsers()
-  generate_parser = subparsers.add_parser(
-      "generate", description="Generate bindings from mojom files.")
-  generate_parser.add_argument("filename", nargs="+",
-                               help="mojom input file")
-  generate_parser.add_argument("-d", "--depth", dest="depth", default=".",
-                               help="depth from source root")
-  generate_parser.add_argument("-o", "--output_dir", dest="output_dir",
-                               default=".",
-                               help="output directory for generated files")
-  generate_parser.add_argument("-g", "--generators",
-                               dest="generators_string",
-                               metavar="GENERATORS",
-                               default="c++,javascript,java",
-                               help="comma-separated list of generators")
-  generate_parser.add_argument(
-      "-I", dest="import_directories", action="append", metavar="directory",
-      default=[],
-      help="add a directory to be searched for import files. The depth from "
-           "source root can be specified for each import by appending it after "
-           "a colon")
-  generate_parser.add_argument("--typemap", action="append", metavar="TYPEMAP",
-                               default=[], dest="typemaps",
-                               help="apply TYPEMAP to generated output")
-  generate_parser.add_argument("--variant", dest="variant", default=None,
-                               help="output a named variant of the bindings")
-  generate_parser.add_argument(
-      "--bytecode_path", type=str, required=True, help=(
-          "the path from which to load template bytecode; to generate template "
-          "bytecode, run %s precompile BYTECODE_PATH" % os.path.basename(
-              sys.argv[0])))
-  generate_parser.add_argument("--for_blink", action="store_true",
-                               help="Use WTF types as generated types for mojo "
-                               "string/array/map.")
-  generate_parser.add_argument(
-      "--use_once_callback", action="store_true",
-      help="Use base::OnceCallback instead of base::RepeatingCallback.")
-  generate_parser.add_argument(
-      "--use_new_js_bindings", action="store_true",
-      help="Use the new module loading approach and the core API exposed by "
-      "Web IDL. This option only affects the JavaScript bindings.")
-  generate_parser.add_argument(
-      "--export_attribute", type=str, default="",
-      help="Optional attribute to specify on class declaration to export it "
-      "for the component build.")
-  generate_parser.add_argument(
-      "--export_header", type=str, default="",
-      help="Optional header to include in the generated headers to support the "
-      "component build.")
-  generate_parser.add_argument(
-      "--generate_non_variant_code", action="store_true",
-      help="Generate code that is shared by different variants.")
-  generate_parser.add_argument(
-      "--depfile", type=str,
-      help="A file into which the list of input files will be written.")
-  generate_parser.add_argument(
-      "--depfile_target", type=str,
-      help="The target name to use in the depfile.")
-  generate_parser.set_defaults(func=_Generate)
-
-  precompile_parser = subparsers.add_parser("precompile",
-      description="Precompile templates for the mojom bindings generator.")
-  precompile_parser.add_argument(
-      "-o", "--output_dir", dest="output_dir", default=".",
-      help="output directory for precompiled templates")
-  precompile_parser.set_defaults(func=_Precompile)
-
-  args, remaining_args = parser.parse_known_args()
-  return args.func(args, remaining_args)
-
-
-if __name__ == "__main__":
-  sys.exit(main())
diff --git a/mojo/public/tools/bindings/mojom_bindings_generator_unittest.py b/mojo/public/tools/bindings/mojom_bindings_generator_unittest.py
deleted file mode 100644
index de38856..0000000
--- a/mojo/public/tools/bindings/mojom_bindings_generator_unittest.py
+++ /dev/null
@@ -1,23 +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.
-
-import unittest
-
-from mojom_bindings_generator import MakeImportStackMessage
-
-
-class MojoBindingsGeneratorTest(unittest.TestCase):
-  """Tests mojo_bindings_generator."""
-
-  def testMakeImportStackMessage(self):
-    """Tests MakeImportStackMessage()."""
-    self.assertEquals(MakeImportStackMessage(["x"]), "")
-    self.assertEquals(MakeImportStackMessage(["x", "y"]),
-        "\n  y was imported by x")
-    self.assertEquals(MakeImportStackMessage(["x", "y", "z"]),
-        "\n  z was imported by y\n  y was imported by x")
-
-
-if __name__ == "__main__":
-  unittest.main()
diff --git a/mojo/public/tools/bindings/pylib/mojom/__init__.py b/mojo/public/tools/bindings/pylib/mojom/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/mojo/public/tools/bindings/pylib/mojom/__init__.py
+++ /dev/null
diff --git a/mojo/public/tools/bindings/pylib/mojom/error.py b/mojo/public/tools/bindings/pylib/mojom/error.py
deleted file mode 100644
index 99522b9..0000000
--- a/mojo/public/tools/bindings/pylib/mojom/error.py
+++ /dev/null
@@ -1,27 +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.
-
-class Error(Exception):
-  """Base class for Mojo IDL bindings parser/generator errors."""
-
-  def __init__(self, filename, message, lineno=None, addenda=None, **kwargs):
-    """|filename| is the (primary) file which caused the error, |message| is the
-    error message, |lineno| is the 1-based line number (or |None| if not
-    applicable/available), and |addenda| is a list of additional lines to append
-    to the final error message."""
-    Exception.__init__(self, **kwargs)
-    self.filename = filename
-    self.message = message
-    self.lineno = lineno
-    self.addenda = addenda
-
-  def __str__(self):
-    if self.lineno:
-      s = "%s:%d: Error: %s" % (self.filename, self.lineno, self.message)
-    else:
-      s = "%s: Error: %s" % (self.filename, self.message)
-    return "\n".join([s] + self.addenda) if self.addenda else s
-
-  def __repr__(self):
-    return str(self)
diff --git a/mojo/public/tools/bindings/pylib/mojom/fileutil.py b/mojo/public/tools/bindings/pylib/mojom/fileutil.py
deleted file mode 100644
index b321e9f..0000000
--- a/mojo/public/tools/bindings/pylib/mojom/fileutil.py
+++ /dev/null
@@ -1,18 +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.
-
-import errno
-import os.path
-
-def EnsureDirectoryExists(path, always_try_to_create=False):
-  """A wrapper for os.makedirs that does not error if the directory already
-  exists. A different process could be racing to create this directory."""
-
-  if not os.path.exists(path) or always_try_to_create:
-    try:
-      os.makedirs(path)
-    except OSError as e:
-      # There may have been a race to create this directory.
-      if e.errno != errno.EEXIST:
-        raise
diff --git a/mojo/public/tools/bindings/pylib/mojom/generate/__init__.py b/mojo/public/tools/bindings/pylib/mojom/generate/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/mojo/public/tools/bindings/pylib/mojom/generate/__init__.py
+++ /dev/null
diff --git a/mojo/public/tools/bindings/pylib/mojom/generate/constant_resolver.py b/mojo/public/tools/bindings/pylib/mojom/generate/constant_resolver.py
deleted file mode 100644
index c8b21f2..0000000
--- a/mojo/public/tools/bindings/pylib/mojom/generate/constant_resolver.py
+++ /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.
-
-"""Resolves the values used for constants and enums."""
-
-from itertools import ifilter
-import mojom.generate.module as mojom
-
-def ResolveConstants(module, expression_to_text):
-  in_progress = set()
-  computed = set()
-
-  def GetResolvedValue(named_value):
-    assert isinstance(named_value, (mojom.EnumValue, mojom.ConstantValue))
-    if isinstance(named_value, mojom.EnumValue):
-      field = next(ifilter(lambda field: field.name == named_value.name,
-                           named_value.enum.fields), None)
-      if not field:
-        raise RuntimeError(
-            'Unable to get computed value for field %s of enum %s' %
-            (named_value.name, named_value.enum.name))
-      if field not in computed:
-        ResolveEnum(named_value.enum)
-      return field.resolved_value
-    else:
-      ResolveConstant(named_value.constant)
-      named_value.resolved_value = named_value.constant.resolved_value
-      return named_value.resolved_value
-
-  def ResolveConstant(constant):
-    if constant in computed:
-      return
-    if constant in in_progress:
-      raise RuntimeError('Circular dependency for constant: %s' % constant.name)
-    in_progress.add(constant)
-    if isinstance(constant.value, (mojom.EnumValue, mojom.ConstantValue)):
-      resolved_value = GetResolvedValue(constant.value)
-    else:
-      resolved_value = expression_to_text(constant.value)
-    constant.resolved_value = resolved_value
-    in_progress.remove(constant)
-    computed.add(constant)
-
-  def ResolveEnum(enum):
-    def ResolveEnumField(enum, field, default_value):
-      if field in computed:
-        return
-      if field in in_progress:
-        raise RuntimeError('Circular dependency for enum: %s' % enum.name)
-      in_progress.add(field)
-      if field.value:
-        if isinstance(field.value, mojom.EnumValue):
-          resolved_value = GetResolvedValue(field.value)
-        elif isinstance(field.value, str):
-          resolved_value = int(field.value, 0)
-        else:
-          raise RuntimeError('Unexpected value: %s' % field.value)
-      else:
-        resolved_value = default_value
-      field.resolved_value = resolved_value
-      in_progress.remove(field)
-      computed.add(field)
-
-    current_value = 0
-    for field in enum.fields:
-      ResolveEnumField(enum, field, current_value)
-      current_value = field.resolved_value + 1
-
-  for constant in module.constants:
-    ResolveConstant(constant)
-
-  for enum in module.enums:
-    ResolveEnum(enum)
-
-  for struct in module.structs:
-    for constant in struct.constants:
-      ResolveConstant(constant)
-    for enum in struct.enums:
-      ResolveEnum(enum)
-    for field in struct.fields:
-      if isinstance(field.default, (mojom.ConstantValue, mojom.EnumValue)):
-        field.default.resolved_value = GetResolvedValue(field.default)
-
-  for interface in module.interfaces:
-    for constant in interface.constants:
-      ResolveConstant(constant)
-    for enum in interface.enums:
-      ResolveEnum(enum)
-
-  return module
diff --git a/mojo/public/tools/bindings/pylib/mojom/generate/generator.py b/mojo/public/tools/bindings/pylib/mojom/generate/generator.py
deleted file mode 100644
index 0e64af7..0000000
--- a/mojo/public/tools/bindings/pylib/mojom/generate/generator.py
+++ /dev/null
@@ -1,153 +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.
-
-"""Code shared by the various language-specific code generators."""
-
-from functools import partial
-import os.path
-import re
-
-import module as mojom
-import mojom.fileutil as fileutil
-import pack
-
-def ExpectedArraySize(kind):
-  if mojom.IsArrayKind(kind):
-    return kind.length
-  return None
-
-def StudlyCapsToCamel(studly):
-  return studly[0].lower() + studly[1:]
-
-def UnderToCamel(under):
-  """Converts underscore_separated strings to CamelCase strings."""
-  return ''.join(word.capitalize() for word in under.split('_'))
-
-def WriteFile(contents, full_path):
-  # Make sure the containing directory exists.
-  full_dir = os.path.dirname(full_path)
-  fileutil.EnsureDirectoryExists(full_dir)
-
-  # Dump the data to disk.
-  with open(full_path, "w+") as f:
-    f.write(contents)
-
-class Generator(object):
-  # Pass |output_dir| to emit files to disk. Omit |output_dir| to echo all
-  # files to stdout.
-  def __init__(self, module, output_dir=None, typemap=None, variant=None,
-               bytecode_path=None, for_blink=False, use_once_callback=False,
-               use_new_js_bindings=False, export_attribute=None,
-               export_header=None, generate_non_variant_code=False):
-    self.module = module
-    self.output_dir = output_dir
-    self.typemap = typemap or {}
-    self.variant = variant
-    self.bytecode_path = bytecode_path
-    self.for_blink = for_blink
-    self.use_once_callback = use_once_callback
-    self.use_new_js_bindings = use_new_js_bindings
-    self.export_attribute = export_attribute
-    self.export_header = export_header
-    self.generate_non_variant_code = generate_non_variant_code
-
-  def GetStructsFromMethods(self):
-    result = []
-    for interface in self.module.interfaces:
-      for method in interface.methods:
-        result.append(self._GetStructFromMethod(method))
-        if method.response_parameters != None:
-          result.append(self._GetResponseStructFromMethod(method))
-    return result
-
-  def GetStructs(self):
-    return map(partial(self._AddStructComputedData, True), self.module.structs)
-
-  def GetUnions(self):
-    return map(self._AddUnionComputedData, self.module.unions)
-
-  def GetInterfaces(self):
-    return map(self._AddInterfaceComputedData, self.module.interfaces)
-
-  # Prepend the filename with a directory that matches the directory of the
-  # original .mojom file, relative to the import root.
-  def MatchMojomFilePath(self, filename):
-    return os.path.join(os.path.dirname(self.module.path), filename)
-
-  def Write(self, contents, filename):
-    if self.output_dir is None:
-      print contents
-      return
-    full_path = os.path.join(self.output_dir, filename)
-    WriteFile(contents, full_path)
-
-  def GenerateFiles(self, args):
-    raise NotImplementedError("Subclasses must override/implement this method")
-
-  def GetJinjaParameters(self):
-    """Returns default constructor parameters for the jinja environment."""
-    return {}
-
-  def GetGlobals(self):
-    """Returns global mappings for the template generation."""
-    return {}
-
-  def _AddStructComputedData(self, exported, struct):
-    """Adds computed data to the given struct. The data is computed once and
-    used repeatedly in the generation process."""
-    struct.packed = pack.PackedStruct(struct)
-    struct.bytes = pack.GetByteLayout(struct.packed)
-    struct.versions = pack.GetVersionInfo(struct.packed)
-    struct.exported = exported
-    return struct
-
-  def _AddUnionComputedData(self, union):
-    """Adds computed data to the given union. The data is computed once and
-    used repeatedly in the generation process."""
-    ordinal = 0
-    for field in union.fields:
-      if field.ordinal is not None:
-        ordinal = field.ordinal
-      field.ordinal = ordinal
-      ordinal += 1
-    return union
-
-  def _AddInterfaceComputedData(self, interface):
-    """Adds computed data to the given interface. The data is computed once and
-    used repeatedly in the generation process."""
-    interface.version = 0
-    for method in interface.methods:
-      if method.min_version is not None:
-        interface.version = max(interface.version, method.min_version)
-
-      method.param_struct = self._GetStructFromMethod(method)
-      interface.version = max(interface.version,
-                              method.param_struct.versions[-1].version)
-
-      if method.response_parameters is not None:
-        method.response_param_struct = self._GetResponseStructFromMethod(method)
-        interface.version = max(
-            interface.version,
-            method.response_param_struct.versions[-1].version)
-      else:
-        method.response_param_struct = None
-    return interface
-
-  def _GetStructFromMethod(self, method):
-    """Converts a method's parameters into the fields of a struct."""
-    params_class = "%s_%s_Params" % (method.interface.name, method.name)
-    struct = mojom.Struct(params_class, module=method.interface.module)
-    for param in method.parameters:
-      struct.AddField(param.name, param.kind, param.ordinal,
-                      attributes=param.attributes)
-    return self._AddStructComputedData(False, struct)
-
-  def _GetResponseStructFromMethod(self, method):
-    """Converts a method's response_parameters into the fields of a struct."""
-    params_class = "%s_%s_ResponseParams" % (method.interface.name, method.name)
-    struct = mojom.Struct(params_class, module=method.interface.module)
-    for param in method.response_parameters:
-      struct.AddField(param.name, param.kind, param.ordinal,
-                      attributes=param.attributes)
-    return self._AddStructComputedData(False, struct)
diff --git a/mojo/public/tools/bindings/pylib/mojom/generate/generator_unittest.py b/mojo/public/tools/bindings/pylib/mojom/generate/generator_unittest.py
deleted file mode 100644
index 9966b0b..0000000
--- a/mojo/public/tools/bindings/pylib/mojom/generate/generator_unittest.py
+++ /dev/null
@@ -1,24 +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.
-
-import unittest
-
-import module as mojom
-import generator
-
-class TestGenerator(unittest.TestCase):
-
-  def testGetUnionsAddsOrdinals(self):
-    module = mojom.Module()
-    union = module.AddUnion('a')
-    union.AddField('a', mojom.BOOL)
-    union.AddField('b', mojom.BOOL)
-    union.AddField('c', mojom.BOOL, ordinal=10)
-    union.AddField('d', mojom.BOOL)
-
-    gen = generator.Generator(module)
-    union = gen.GetUnions()[0]
-    ordinals = [field.ordinal for field in union.fields]
-
-    self.assertEquals([0, 1, 10, 11], ordinals)
diff --git a/mojo/public/tools/bindings/pylib/mojom/generate/module.py b/mojo/public/tools/bindings/pylib/mojom/generate/module.py
deleted file mode 100644
index 3a5f188..0000000
--- a/mojo/public/tools/bindings/pylib/mojom/generate/module.py
+++ /dev/null
@@ -1,891 +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.
-
-# This module's classes provide an interface to mojo modules. Modules are
-# collections of interfaces and structs to be used by mojo ipc clients and
-# servers.
-#
-# A simple interface would be created this way:
-# module = mojom.generate.module.Module('Foo')
-# interface = module.AddInterface('Bar')
-# method = interface.AddMethod('Tat', 0)
-# method.AddParameter('baz', 0, mojom.INT32)
-
-
-# We use our own version of __repr__ when displaying the AST, as the
-# AST currently doesn't capture which nodes are reference (e.g. to
-# types) and which nodes are definitions. This allows us to e.g. print
-# the definition of a struct when it's defined inside a module, but
-# only print its name when it's referenced in e.g. a method parameter.
-def Repr(obj, as_ref=True):
-  """A version of __repr__ that can distinguish references.
-
-  Sometimes we like to print an object's full representation
-  (e.g. with its fields) and sometimes we just want to reference an
-  object that was printed in full elsewhere. This function allows us
-  to make that distinction.
-
-  Args:
-    obj: The object whose string representation we compute.
-    as_ref: If True, use the short reference representation.
-
-  Returns:
-    A str representation of |obj|.
-  """
-  if hasattr(obj, 'Repr'):
-    return obj.Repr(as_ref=as_ref)
-  # Since we cannot implement Repr for existing container types, we
-  # handle them here.
-  elif isinstance(obj, list):
-    if not obj:
-      return '[]'
-    else:
-      return ('[\n%s\n]' % (',\n'.join('    %s' % Repr(elem, as_ref).replace(
-          '\n', '\n    ') for elem in obj)))
-  elif isinstance(obj, dict):
-    if not obj:
-      return '{}'
-    else:
-      return ('{\n%s\n}' % (',\n'.join('    %s: %s' % (
-          Repr(key, as_ref).replace('\n', '\n    '),
-          Repr(val, as_ref).replace('\n', '\n    '))
-          for key, val in obj.iteritems())))
-  else:
-    return repr(obj)
-
-
-def GenericRepr(obj, names):
-  """Compute generic Repr for |obj| based on the attributes in |names|.
-
-  Args:
-    obj: The object to compute a Repr for.
-    names: A dict from attribute names to include, to booleans
-        specifying whether those attributes should be shown as
-        references or not.
-
-  Returns:
-    A str representation of |obj|.
-  """
-  def ReprIndent(name, as_ref):
-    return '    %s=%s' % (name, Repr(getattr(obj, name), as_ref).replace(
-        '\n', '\n    '))
-
-  return '%s(\n%s\n)' % (
-      obj.__class__.__name__,
-      ',\n'.join(ReprIndent(name, as_ref)
-                 for (name, as_ref) in names.iteritems()))
-
-
-class Kind(object):
-  """Kind represents a type (e.g. int8, string).
-
-  Attributes:
-    spec: A string uniquely identifying the type. May be None.
-    parent_kind: The enclosing type. For example, a struct defined
-        inside an interface has that interface as its parent. May be None.
-  """
-  def __init__(self, spec=None):
-    self.spec = spec
-    self.parent_kind = None
-
-  def Repr(self, as_ref=True):
-    return '<%s spec=%r>' % (self.__class__.__name__, self.spec)
-
-  def __repr__(self):
-    # Gives us a decent __repr__ for all kinds.
-    return self.Repr()
-
-
-class ReferenceKind(Kind):
-  """ReferenceKind represents pointer and handle types.
-
-  A type is nullable if null (for pointer types) or invalid handle (for handle
-  types) is a legal value for the type.
-
-  Attributes:
-    is_nullable: True if the type is nullable.
-  """
-
-  def __init__(self, spec=None, is_nullable=False):
-    assert spec is None or is_nullable == spec.startswith('?')
-    Kind.__init__(self, spec)
-    self.is_nullable = is_nullable
-    self.shared_definition = {}
-
-  def Repr(self, as_ref=True):
-    return '<%s spec=%r is_nullable=%r>' % (self.__class__.__name__, self.spec,
-                                            self.is_nullable)
-
-  def MakeNullableKind(self):
-    assert not self.is_nullable
-
-    if self == STRING:
-      return NULLABLE_STRING
-    if self == HANDLE:
-      return NULLABLE_HANDLE
-    if self == DCPIPE:
-      return NULLABLE_DCPIPE
-    if self == DPPIPE:
-      return NULLABLE_DPPIPE
-    if self == MSGPIPE:
-      return NULLABLE_MSGPIPE
-    if self == SHAREDBUFFER:
-      return NULLABLE_SHAREDBUFFER
-
-    nullable_kind = type(self)()
-    nullable_kind.shared_definition = self.shared_definition
-    if self.spec is not None:
-      nullable_kind.spec = '?' + self.spec
-    nullable_kind.is_nullable = True
-
-    return nullable_kind
-
-  @classmethod
-  def AddSharedProperty(cls, name):
-    """Adds a property |name| to |cls|, which accesses the corresponding item in
-       |shared_definition|.
-
-       The reason of adding such indirection is to enable sharing definition
-       between a reference kind and its nullable variation. For example:
-         a = Struct('test_struct_1')
-         b = a.MakeNullableKind()
-         a.name = 'test_struct_2'
-         print b.name  # Outputs 'test_struct_2'.
-    """
-    def Get(self):
-      return self.shared_definition[name]
-
-    def Set(self, value):
-      self.shared_definition[name] = value
-
-    setattr(cls, name, property(Get, Set))
-
-
-# Initialize the set of primitive types. These can be accessed by clients.
-BOOL                  = Kind('b')
-INT8                  = Kind('i8')
-INT16                 = Kind('i16')
-INT32                 = Kind('i32')
-INT64                 = Kind('i64')
-UINT8                 = Kind('u8')
-UINT16                = Kind('u16')
-UINT32                = Kind('u32')
-UINT64                = Kind('u64')
-FLOAT                 = Kind('f')
-DOUBLE                = Kind('d')
-STRING                = ReferenceKind('s')
-HANDLE                = ReferenceKind('h')
-DCPIPE                = ReferenceKind('h:d:c')
-DPPIPE                = ReferenceKind('h:d:p')
-MSGPIPE               = ReferenceKind('h:m')
-SHAREDBUFFER          = ReferenceKind('h:s')
-NULLABLE_STRING       = ReferenceKind('?s', True)
-NULLABLE_HANDLE       = ReferenceKind('?h', True)
-NULLABLE_DCPIPE       = ReferenceKind('?h:d:c', True)
-NULLABLE_DPPIPE       = ReferenceKind('?h:d:p', True)
-NULLABLE_MSGPIPE      = ReferenceKind('?h:m', True)
-NULLABLE_SHAREDBUFFER = ReferenceKind('?h:s', True)
-
-
-# Collection of all Primitive types
-PRIMITIVES = (
-  BOOL,
-  INT8,
-  INT16,
-  INT32,
-  INT64,
-  UINT8,
-  UINT16,
-  UINT32,
-  UINT64,
-  FLOAT,
-  DOUBLE,
-  STRING,
-  HANDLE,
-  DCPIPE,
-  DPPIPE,
-  MSGPIPE,
-  SHAREDBUFFER,
-  NULLABLE_STRING,
-  NULLABLE_HANDLE,
-  NULLABLE_DCPIPE,
-  NULLABLE_DPPIPE,
-  NULLABLE_MSGPIPE,
-  NULLABLE_SHAREDBUFFER
-)
-
-
-ATTRIBUTE_MIN_VERSION = 'MinVersion'
-ATTRIBUTE_EXTENSIBLE = 'Extensible'
-ATTRIBUTE_SYNC = 'Sync'
-
-
-class NamedValue(object):
-  def __init__(self, module, parent_kind, name):
-    self.module = module
-    self.namespace = module.namespace
-    self.parent_kind = parent_kind
-    self.name = name
-    self.imported_from = None
-
-  def GetSpec(self):
-    return (self.namespace + '.' +
-        (self.parent_kind and (self.parent_kind.name + '.') or "") +
-        self.name)
-
-
-class BuiltinValue(object):
-  def __init__(self, value):
-    self.value = value
-
-
-class ConstantValue(NamedValue):
-  def __init__(self, module, parent_kind, constant):
-    NamedValue.__init__(self, module, parent_kind, constant.name)
-    self.constant = constant
-
-
-class EnumValue(NamedValue):
-  def __init__(self, module, enum, field):
-    NamedValue.__init__(self, module, enum.parent_kind, field.name)
-    self.enum = enum
-
-  def GetSpec(self):
-    return (self.namespace + '.' +
-        (self.parent_kind and (self.parent_kind.name + '.') or "") +
-        self.enum.name + '.' + self.name)
-
-
-class Constant(object):
-  def __init__(self, name=None, kind=None, value=None, parent_kind=None):
-    self.name = name
-    self.kind = kind
-    self.value = value
-    self.parent_kind = parent_kind
-
-
-class Field(object):
-  def __init__(self, name=None, kind=None, ordinal=None, default=None,
-               attributes=None):
-    if self.__class__.__name__ == 'Field':
-      raise Exception()
-    self.name = name
-    self.kind = kind
-    self.ordinal = ordinal
-    self.default = default
-    self.attributes = attributes
-
-  def Repr(self, as_ref=True):
-    # Fields are only referenced by objects which define them and thus
-    # they are always displayed as non-references.
-    return GenericRepr(self, {'name': False, 'kind': True})
-
-  @property
-  def min_version(self):
-    return self.attributes.get(ATTRIBUTE_MIN_VERSION) \
-        if self.attributes else None
-
-
-class StructField(Field): pass
-
-
-class UnionField(Field): pass
-
-
-class Struct(ReferenceKind):
-  """A struct with typed fields.
-
-  Attributes:
-    name: {str} The name of the struct type.
-    native_only: {bool} Does the struct have a body (i.e. any fields) or is it
-        purely a native struct.
-    module: {Module} The defining module.
-    imported_from: {dict} Information about where this union was
-        imported from.
-    fields: {List[StructField]} The members of the struct.
-    attributes: {dict} Additional information about the struct, such as
-        if it's a native struct.
-  """
-
-  ReferenceKind.AddSharedProperty('name')
-  ReferenceKind.AddSharedProperty('native_only')
-  ReferenceKind.AddSharedProperty('module')
-  ReferenceKind.AddSharedProperty('imported_from')
-  ReferenceKind.AddSharedProperty('fields')
-  ReferenceKind.AddSharedProperty('attributes')
-
-  def __init__(self, name=None, module=None, attributes=None):
-    if name is not None:
-      spec = 'x:' + name
-    else:
-      spec = None
-    ReferenceKind.__init__(self, spec)
-    self.name = name
-    self.native_only = False
-    self.module = module
-    self.imported_from = None
-    self.fields = []
-    self.attributes = attributes
-
-  def Repr(self, as_ref=True):
-    if as_ref:
-      return '<%s name=%r imported_from=%s>' % (
-          self.__class__.__name__, self.name,
-          Repr(self.imported_from, as_ref=True))
-    else:
-      return GenericRepr(self, {'name': False, 'fields': False,
-                                'imported_from': True})
-
-  def AddField(self, name, kind, ordinal=None, default=None, attributes=None):
-    field = StructField(name, kind, ordinal, default, attributes)
-    self.fields.append(field)
-    return field
-
-
-class Union(ReferenceKind):
-  """A union of several kinds.
-
-  Attributes:
-    name: {str} The name of the union type.
-    module: {Module} The defining module.
-    imported_from: {dict} Information about where this union was
-        imported from.
-    fields: {List[UnionField]} The members of the union.
-    attributes: {dict} Additional information about the union, such as
-        which Java class name to use to represent it in the generated
-        bindings.
-  """
-  ReferenceKind.AddSharedProperty('name')
-  ReferenceKind.AddSharedProperty('module')
-  ReferenceKind.AddSharedProperty('imported_from')
-  ReferenceKind.AddSharedProperty('fields')
-  ReferenceKind.AddSharedProperty('attributes')
-
-  def __init__(self, name=None, module=None, attributes=None):
-    if name is not None:
-      spec = 'x:' + name
-    else:
-      spec = None
-    ReferenceKind.__init__(self, spec)
-    self.name = name
-    self.module = module
-    self.imported_from = None
-    self.fields = []
-    self.attributes = attributes
-
-  def Repr(self, as_ref=True):
-    if as_ref:
-      return '<%s spec=%r is_nullable=%r fields=%s>' % (
-          self.__class__.__name__, self.spec, self.is_nullable,
-          Repr(self.fields))
-    else:
-      return GenericRepr(self, {'fields': True, 'is_nullable': False})
-
-  def AddField(self, name, kind, ordinal=None, attributes=None):
-    field = UnionField(name, kind, ordinal, None, attributes)
-    self.fields.append(field)
-    return field
-
-
-class Array(ReferenceKind):
-  """An array.
-
-  Attributes:
-    kind: {Kind} The type of the elements. May be None.
-    length: The number of elements. None if unknown.
-  """
-
-  ReferenceKind.AddSharedProperty('kind')
-  ReferenceKind.AddSharedProperty('length')
-
-  def __init__(self, kind=None, length=None):
-    if kind is not None:
-      if length is not None:
-        spec = 'a%d:%s' % (length, kind.spec)
-      else:
-        spec = 'a:%s' % kind.spec
-
-      ReferenceKind.__init__(self, spec)
-    else:
-      ReferenceKind.__init__(self)
-    self.kind = kind
-    self.length = length
-
-  def Repr(self, as_ref=True):
-    if as_ref:
-      return '<%s spec=%r is_nullable=%r kind=%s length=%r>' % (
-          self.__class__.__name__, self.spec, self.is_nullable, Repr(self.kind),
-          self.length)
-    else:
-      return GenericRepr(self, {'kind': True, 'length': False,
-                                'is_nullable': False})
-
-
-class Map(ReferenceKind):
-  """A map.
-
-  Attributes:
-    key_kind: {Kind} The type of the keys. May be None.
-    value_kind: {Kind} The type of the elements. May be None.
-  """
-  ReferenceKind.AddSharedProperty('key_kind')
-  ReferenceKind.AddSharedProperty('value_kind')
-
-  def __init__(self, key_kind=None, value_kind=None):
-    if (key_kind is not None and value_kind is not None):
-      ReferenceKind.__init__(self,
-                             'm[' + key_kind.spec + '][' + value_kind.spec +
-                             ']')
-      if IsNullableKind(key_kind):
-        raise Exception("Nullable kinds cannot be keys in maps.")
-      if IsAnyHandleKind(key_kind):
-        raise Exception("Handles cannot be keys in maps.")
-      if IsAnyInterfaceKind(key_kind):
-        raise Exception("Interfaces cannot be keys in maps.")
-      if IsArrayKind(key_kind):
-        raise Exception("Arrays cannot be keys in maps.")
-    else:
-      ReferenceKind.__init__(self)
-
-    self.key_kind = key_kind
-    self.value_kind = value_kind
-
-  def Repr(self, as_ref=True):
-    if as_ref:
-      return '<%s spec=%r is_nullable=%r key_kind=%s value_kind=%s>' % (
-          self.__class__.__name__, self.spec, self.is_nullable,
-          Repr(self.key_kind), Repr(self.value_kind))
-    else:
-      return GenericRepr(self, {'key_kind': True, 'value_kind': True})
-
-
-class InterfaceRequest(ReferenceKind):
-  ReferenceKind.AddSharedProperty('kind')
-
-  def __init__(self, kind=None):
-    if kind is not None:
-      if not isinstance(kind, Interface):
-        raise Exception(
-            "Interface request requires %r to be an interface." % kind.spec)
-      ReferenceKind.__init__(self, 'r:' + kind.spec)
-    else:
-      ReferenceKind.__init__(self)
-    self.kind = kind
-
-
-class AssociatedInterfaceRequest(ReferenceKind):
-  ReferenceKind.AddSharedProperty('kind')
-
-  def __init__(self, kind=None):
-    if kind is not None:
-      if not isinstance(kind, InterfaceRequest):
-        raise Exception(
-            "Associated interface request requires %r to be an interface "
-            "request." % kind.spec)
-      assert not kind.is_nullable
-      ReferenceKind.__init__(self, 'asso:' + kind.spec)
-    else:
-      ReferenceKind.__init__(self)
-    self.kind = kind.kind if kind is not None else None
-
-
-class Parameter(object):
-  def __init__(self, name=None, kind=None, ordinal=None, default=None,
-               attributes=None):
-    self.name = name
-    self.ordinal = ordinal
-    self.kind = kind
-    self.default = default
-    self.attributes = attributes
-
-  def Repr(self, as_ref=True):
-    return '<%s name=%r kind=%s>' % (self.__class__.__name__, self.name,
-                                     self.kind.Repr(as_ref=True))
-
-  @property
-  def min_version(self):
-    return self.attributes.get(ATTRIBUTE_MIN_VERSION) \
-        if self.attributes else None
-
-
-class Method(object):
-  def __init__(self, interface, name, ordinal=None, attributes=None):
-    self.interface = interface
-    self.name = name
-    self.ordinal = ordinal
-    self.parameters = []
-    self.response_parameters = None
-    self.attributes = attributes
-
-  def Repr(self, as_ref=True):
-    if as_ref:
-      return '<%s name=%r>' % (self.__class__.__name__, self.name)
-    else:
-      return GenericRepr(self, {'name': False, 'parameters': True,
-                                'response_parameters': True})
-
-  def AddParameter(self, name, kind, ordinal=None, default=None,
-                   attributes=None):
-    parameter = Parameter(name, kind, ordinal, default, attributes)
-    self.parameters.append(parameter)
-    return parameter
-
-  def AddResponseParameter(self, name, kind, ordinal=None, default=None,
-                           attributes=None):
-    if self.response_parameters == None:
-      self.response_parameters = []
-    parameter = Parameter(name, kind, ordinal, default, attributes)
-    self.response_parameters.append(parameter)
-    return parameter
-
-  @property
-  def min_version(self):
-    return self.attributes.get(ATTRIBUTE_MIN_VERSION) \
-        if self.attributes else None
-
-  @property
-  def sync(self):
-    return self.attributes.get(ATTRIBUTE_SYNC) \
-        if self.attributes else None
-
-
-class Interface(ReferenceKind):
-  ReferenceKind.AddSharedProperty('module')
-  ReferenceKind.AddSharedProperty('name')
-  ReferenceKind.AddSharedProperty('imported_from')
-  ReferenceKind.AddSharedProperty('methods')
-  ReferenceKind.AddSharedProperty('attributes')
-
-  def __init__(self, name=None, module=None, attributes=None):
-    if name is not None:
-      spec = 'x:' + name
-    else:
-      spec = None
-    ReferenceKind.__init__(self, spec)
-    self.module = module
-    self.name = name
-    self.imported_from = None
-    self.methods = []
-    self.attributes = attributes
-
-  def Repr(self, as_ref=True):
-    if as_ref:
-      return '<%s name=%r>' % (self.__class__.__name__, self.name)
-    else:
-      return GenericRepr(self, {'name': False, 'attributes': False,
-                                'methods': False})
-
-  def AddMethod(self, name, ordinal=None, attributes=None):
-    method = Method(self, name, ordinal, attributes)
-    self.methods.append(method)
-    return method
-
-  # TODO(451323): Remove when the language backends no longer rely on this.
-  @property
-  def client(self):
-    return None
-
-
-class AssociatedInterface(ReferenceKind):
-  ReferenceKind.AddSharedProperty('kind')
-
-  def __init__(self, kind=None):
-    if kind is not None:
-      if not isinstance(kind, Interface):
-        raise Exception(
-            "Associated interface requires %r to be an interface." % kind.spec)
-      assert not kind.is_nullable
-      ReferenceKind.__init__(self, 'asso:' + kind.spec)
-    else:
-      ReferenceKind.__init__(self)
-    self.kind = kind
-
-
-class EnumField(object):
-  def __init__(self, name=None, value=None, attributes=None,
-               numeric_value=None):
-    self.name = name
-    self.value = value
-    self.attributes = attributes
-    self.numeric_value = numeric_value
-
-  @property
-  def min_version(self):
-    return self.attributes.get(ATTRIBUTE_MIN_VERSION) \
-        if self.attributes else None
-
-
-class Enum(Kind):
-  def __init__(self, name=None, module=None, attributes=None):
-    self.module = module
-    self.name = name
-    self.native_only = False
-    self.imported_from = None
-    if name is not None:
-      spec = 'x:' + name
-    else:
-      spec = None
-    Kind.__init__(self, spec)
-    self.fields = []
-    self.attributes = attributes
-
-  def Repr(self, as_ref=True):
-    if as_ref:
-      return '<%s name=%r>' % (self.__class__.__name__, self.name)
-    else:
-      return GenericRepr(self, {'name': False, 'fields': False})
-
-  @property
-  def extensible(self):
-    return self.attributes.get(ATTRIBUTE_EXTENSIBLE, False) \
-        if self.attributes else False
-
-
-class Module(object):
-  def __init__(self, name=None, namespace=None, attributes=None):
-    self.name = name
-    self.path = name
-    self.namespace = namespace
-    self.structs = []
-    self.unions = []
-    self.interfaces = []
-    self.kinds = {}
-    self.attributes = attributes
-
-  def __repr__(self):
-    # Gives us a decent __repr__ for modules.
-    return self.Repr()
-
-  def Repr(self, as_ref=True):
-    if as_ref:
-      return '<%s name=%r namespace=%r>' % (
-          self.__class__.__name__, self.name, self.namespace)
-    else:
-      return GenericRepr(self, {'name': False, 'namespace': False,
-                                'attributes': False, 'structs': False,
-                                'interfaces': False, 'unions': False})
-
-  def AddInterface(self, name, attributes=None):
-    interface = Interface(name, self, attributes)
-    self.interfaces.append(interface)
-    return interface
-
-  def AddStruct(self, name, attributes=None):
-    struct = Struct(name, self, attributes)
-    self.structs.append(struct)
-    return struct
-
-  def AddUnion(self, name, attributes=None):
-    union = Union(name, self, attributes)
-    self.unions.append(union)
-    return union
-
-
-def IsBoolKind(kind):
-  return kind.spec == BOOL.spec
-
-
-def IsFloatKind(kind):
-  return kind.spec == FLOAT.spec
-
-
-def IsDoubleKind(kind):
-  return kind.spec == DOUBLE.spec
-
-
-def IsIntegralKind(kind):
-  return (kind.spec == BOOL.spec or
-          kind.spec == INT8.spec or
-          kind.spec == INT16.spec or
-          kind.spec == INT32.spec or
-          kind.spec == INT64.spec or
-          kind.spec == UINT8.spec or
-          kind.spec == UINT16.spec or
-          kind.spec == UINT32.spec or
-          kind.spec == UINT64.spec)
-
-
-def IsStringKind(kind):
-  return kind.spec == STRING.spec or kind.spec == NULLABLE_STRING.spec
-
-
-def IsGenericHandleKind(kind):
-  return kind.spec == HANDLE.spec or kind.spec == NULLABLE_HANDLE.spec
-
-
-def IsDataPipeConsumerKind(kind):
-  return kind.spec == DCPIPE.spec or kind.spec == NULLABLE_DCPIPE.spec
-
-
-def IsDataPipeProducerKind(kind):
-  return kind.spec == DPPIPE.spec or kind.spec == NULLABLE_DPPIPE.spec
-
-
-def IsMessagePipeKind(kind):
-  return kind.spec == MSGPIPE.spec or kind.spec == NULLABLE_MSGPIPE.spec
-
-
-def IsSharedBufferKind(kind):
-  return (kind.spec == SHAREDBUFFER.spec or
-          kind.spec == NULLABLE_SHAREDBUFFER.spec)
-
-
-def IsStructKind(kind):
-  return isinstance(kind, Struct)
-
-
-def IsUnionKind(kind):
-  return isinstance(kind, Union)
-
-
-def IsArrayKind(kind):
-  return isinstance(kind, Array)
-
-
-def IsInterfaceKind(kind):
-  return isinstance(kind, Interface)
-
-
-def IsAssociatedInterfaceKind(kind):
-  return isinstance(kind, AssociatedInterface)
-
-
-def IsInterfaceRequestKind(kind):
-  return isinstance(kind, InterfaceRequest)
-
-
-def IsAssociatedInterfaceRequestKind(kind):
-  return isinstance(kind, AssociatedInterfaceRequest)
-
-
-def IsEnumKind(kind):
-  return isinstance(kind, Enum)
-
-
-def IsReferenceKind(kind):
-  return isinstance(kind, ReferenceKind)
-
-
-def IsNullableKind(kind):
-  return IsReferenceKind(kind) and kind.is_nullable
-
-
-def IsMapKind(kind):
-  return isinstance(kind, Map)
-
-
-def IsObjectKind(kind):
-  return IsPointerKind(kind) or IsUnionKind(kind)
-
-
-def IsPointerKind(kind):
-  return (IsStructKind(kind) or IsArrayKind(kind) or IsStringKind(kind) or
-          IsMapKind(kind))
-
-
-# Please note that it doesn't include any interface kind.
-def IsAnyHandleKind(kind):
-  return (IsGenericHandleKind(kind) or
-          IsDataPipeConsumerKind(kind) or
-          IsDataPipeProducerKind(kind) or
-          IsMessagePipeKind(kind) or
-          IsSharedBufferKind(kind))
-
-
-def IsAnyInterfaceKind(kind):
-  return (IsInterfaceKind(kind) or IsInterfaceRequestKind(kind) or
-          IsAssociatedKind(kind))
-
-
-def IsAnyHandleOrInterfaceKind(kind):
-  return IsAnyHandleKind(kind) or IsAnyInterfaceKind(kind)
-
-
-def IsAssociatedKind(kind):
-  return (IsAssociatedInterfaceKind(kind) or
-          IsAssociatedInterfaceRequestKind(kind))
-
-
-def HasCallbacks(interface):
-  for method in interface.methods:
-    if method.response_parameters != None:
-      return True
-  return False
-
-
-# Finds out whether an interface passes associated interfaces and associated
-# interface requests.
-def PassesAssociatedKinds(interface):
-  def _ContainsAssociatedKinds(kind, visited_kinds):
-    if kind in visited_kinds:
-      # No need to examine the kind again.
-      return False
-    visited_kinds.add(kind)
-    if IsAssociatedKind(kind):
-      return True
-    if IsArrayKind(kind):
-      return _ContainsAssociatedKinds(kind.kind, visited_kinds)
-    if IsStructKind(kind) or IsUnionKind(kind):
-      for field in kind.fields:
-        if _ContainsAssociatedKinds(field.kind, visited_kinds):
-          return True
-    if IsMapKind(kind):
-      # No need to examine the key kind, only primitive kinds and non-nullable
-      # string are allowed to be key kinds.
-      return _ContainsAssociatedKinds(kind.value_kind, visited_kinds)
-    return False
-
-  visited_kinds = set()
-  for method in interface.methods:
-    for param in method.parameters:
-      if _ContainsAssociatedKinds(param.kind, visited_kinds):
-        return True
-    if method.response_parameters != None:
-      for param in method.response_parameters:
-        if _ContainsAssociatedKinds(param.kind, visited_kinds):
-          return True
-  return False
-
-
-def HasSyncMethods(interface):
-  for method in interface.methods:
-    if method.sync:
-      return True
-  return False
-
-
-def ContainsHandlesOrInterfaces(kind):
-  """Check if the kind contains any handles.
-
-  This check is recursive so it checks all struct fields, containers elements,
-  etc.
-
-  Args:
-    struct: {Kind} The kind to check.
-
-  Returns:
-    {bool}: True if the kind contains handles.
-  """
-  # We remember the types we already checked to avoid infinite recursion when
-  # checking recursive (or mutually recursive) types:
-  checked = set()
-  def Check(kind):
-    if kind.spec in checked:
-      return False
-    checked.add(kind.spec)
-    if IsStructKind(kind):
-      return any(Check(field.kind) for field in kind.fields)
-    elif IsUnionKind(kind):
-      return any(Check(field.kind) for field in kind.fields)
-    elif IsAnyHandleKind(kind):
-      return True
-    elif IsAnyInterfaceKind(kind):
-      return True
-    elif IsArrayKind(kind):
-      return Check(kind.kind)
-    elif IsMapKind(kind):
-      return Check(kind.key_kind) or Check(kind.value_kind)
-    else:
-      return False
-  return Check(kind)
diff --git a/mojo/public/tools/bindings/pylib/mojom/generate/module_tests.py b/mojo/public/tools/bindings/pylib/mojom/generate/module_tests.py
deleted file mode 100644
index a887686..0000000
--- a/mojo/public/tools/bindings/pylib/mojom/generate/module_tests.py
+++ /dev/null
@@ -1,34 +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.
-
-import sys
-
-import test_support
-
-EXPECT_EQ = test_support.EXPECT_EQ
-EXPECT_TRUE = test_support.EXPECT_TRUE
-RunTest = test_support.RunTest
-ModulesAreEqual = test_support.ModulesAreEqual
-BuildTestModule = test_support.BuildTestModule
-TestTestModule = test_support.TestTestModule
-
-
-def BuildAndTestModule():
-  return TestTestModule(BuildTestModule())
-
-
-def TestModulesEqual():
-  return EXPECT_TRUE(ModulesAreEqual(BuildTestModule(), BuildTestModule()))
-
-
-def Main(args):
-  errors = 0
-  errors += RunTest(BuildAndTestModule)
-  errors += RunTest(TestModulesEqual)
-
-  return errors
-
-
-if __name__ == '__main__':
-  sys.exit(Main(sys.argv[1:]))
diff --git a/mojo/public/tools/bindings/pylib/mojom/generate/pack.py b/mojo/public/tools/bindings/pylib/mojom/generate/pack.py
deleted file mode 100644
index 37dc8f3..0000000
--- a/mojo/public/tools/bindings/pylib/mojom/generate/pack.py
+++ /dev/null
@@ -1,250 +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.
-
-import module as mojom
-
-# This module provides a mechanism for determining the packed order and offsets
-# of a mojom.Struct.
-#
-# ps = pack.PackedStruct(struct)
-# ps.packed_fields will access a list of PackedField objects, each of which
-# will have an offset, a size and a bit (for mojom.BOOLs).
-
-# Size of struct header in bytes: num_bytes [4B] + version [4B].
-HEADER_SIZE = 8
-
-class PackedField(object):
-  kind_to_size = {
-    mojom.BOOL:                  1,
-    mojom.INT8:                  1,
-    mojom.UINT8:                 1,
-    mojom.INT16:                 2,
-    mojom.UINT16:                2,
-    mojom.INT32:                 4,
-    mojom.UINT32:                4,
-    mojom.FLOAT:                 4,
-    mojom.HANDLE:                4,
-    mojom.MSGPIPE:               4,
-    mojom.SHAREDBUFFER:          4,
-    mojom.DCPIPE:                4,
-    mojom.DPPIPE:                4,
-    mojom.NULLABLE_HANDLE:       4,
-    mojom.NULLABLE_MSGPIPE:      4,
-    mojom.NULLABLE_SHAREDBUFFER: 4,
-    mojom.NULLABLE_DCPIPE:       4,
-    mojom.NULLABLE_DPPIPE:       4,
-    mojom.INT64:                 8,
-    mojom.UINT64:                8,
-    mojom.DOUBLE:                8,
-    mojom.STRING:                8,
-    mojom.NULLABLE_STRING:       8
-  }
-
-  @classmethod
-  def GetSizeForKind(cls, kind):
-    if isinstance(kind, (mojom.Array, mojom.Map, mojom.Struct,
-                         mojom.Interface, mojom.AssociatedInterface)):
-      return 8
-    if isinstance(kind, mojom.Union):
-      return 16
-    if isinstance(kind, mojom.InterfaceRequest):
-      kind = mojom.MSGPIPE
-    if isinstance(kind, mojom.AssociatedInterfaceRequest):
-      return 4
-    if isinstance(kind, mojom.Enum):
-      # TODO(mpcomplete): what about big enums?
-      return cls.kind_to_size[mojom.INT32]
-    if not kind in cls.kind_to_size:
-      raise Exception("Invalid kind: %s" % kind.spec)
-    return cls.kind_to_size[kind]
-
-  @classmethod
-  def GetAlignmentForKind(cls, kind):
-    if isinstance(kind, (mojom.Interface, mojom.AssociatedInterface)):
-      return 4
-    if isinstance(kind, mojom.Union):
-      return 8
-    return cls.GetSizeForKind(kind)
-
-  def __init__(self, field, index, ordinal):
-    """
-    Args:
-      field: the original field.
-      index: the position of the original field in the struct.
-      ordinal: the ordinal of the field for serialization.
-    """
-    self.field = field
-    self.index = index
-    self.ordinal = ordinal
-    self.size = self.GetSizeForKind(field.kind)
-    self.alignment = self.GetAlignmentForKind(field.kind)
-    self.offset = None
-    self.bit = None
-    self.min_version = None
-
-
-def GetPad(offset, alignment):
-  """Returns the pad necessary to reserve space so that |offset + pad| equals to
-  some multiple of |alignment|."""
-  return (alignment - (offset % alignment)) % alignment
-
-
-def GetFieldOffset(field, last_field):
-  """Returns a 2-tuple of the field offset and bit (for BOOLs)."""
-  if (field.field.kind == mojom.BOOL and
-      last_field.field.kind == mojom.BOOL and
-      last_field.bit < 7):
-    return (last_field.offset, last_field.bit + 1)
-
-  offset = last_field.offset + last_field.size
-  pad = GetPad(offset, field.alignment)
-  return (offset + pad, 0)
-
-
-def GetPayloadSizeUpToField(field):
-  """Returns the payload size (not including struct header) if |field| is the
-  last field.
-  """
-  if not field:
-    return 0
-  offset = field.offset + field.size
-  pad = GetPad(offset, 8)
-  return offset + pad
-
-
-class PackedStruct(object):
-  def __init__(self, struct):
-    self.struct = struct
-    # |packed_fields| contains all the fields, in increasing offset order.
-    self.packed_fields = []
-    # |packed_fields_in_ordinal_order| refers to the same fields as
-    # |packed_fields|, but in ordinal order.
-    self.packed_fields_in_ordinal_order = []
-
-    # No fields.
-    if (len(struct.fields) == 0):
-      return
-
-    # Start by sorting by ordinal.
-    src_fields = self.packed_fields_in_ordinal_order
-    ordinal = 0
-    for index, field in enumerate(struct.fields):
-      if field.ordinal is not None:
-        ordinal = field.ordinal
-      src_fields.append(PackedField(field, index, ordinal))
-      ordinal += 1
-    src_fields.sort(key=lambda field: field.ordinal)
-
-    # Set |min_version| for each field.
-    next_min_version = 0
-    for packed_field in src_fields:
-      if packed_field.field.min_version is None:
-        assert next_min_version == 0
-      else:
-        assert packed_field.field.min_version >= next_min_version
-        next_min_version = packed_field.field.min_version
-      packed_field.min_version = next_min_version
-
-      if (packed_field.min_version != 0 and
-          mojom.IsReferenceKind(packed_field.field.kind) and
-          not packed_field.field.kind.is_nullable):
-        raise Exception("Non-nullable fields are only allowed in version 0 of "
-                        "a struct. %s.%s is defined with [MinVersion=%d]."
-                            % (self.struct.name, packed_field.field.name,
-                               packed_field.min_version))
-
-    src_field = src_fields[0]
-    src_field.offset = 0
-    src_field.bit = 0
-    dst_fields = self.packed_fields
-    dst_fields.append(src_field)
-
-    # Then find first slot that each field will fit.
-    for src_field in src_fields[1:]:
-      last_field = dst_fields[0]
-      for i in xrange(1, len(dst_fields)):
-        next_field = dst_fields[i]
-        offset, bit = GetFieldOffset(src_field, last_field)
-        if offset + src_field.size <= next_field.offset:
-          # Found hole.
-          src_field.offset = offset
-          src_field.bit = bit
-          dst_fields.insert(i, src_field)
-          break
-        last_field = next_field
-      if src_field.offset is None:
-        # Add to end
-        src_field.offset, src_field.bit = GetFieldOffset(src_field, last_field)
-        dst_fields.append(src_field)
-
-
-class ByteInfo(object):
-  def __init__(self):
-    self.is_padding = False
-    self.packed_fields = []
-
-
-def GetByteLayout(packed_struct):
-  total_payload_size = GetPayloadSizeUpToField(
-      packed_struct.packed_fields[-1] if packed_struct.packed_fields else None)
-  bytes = [ByteInfo() for i in xrange(total_payload_size)]
-
-  limit_of_previous_field = 0
-  for packed_field in packed_struct.packed_fields:
-    for i in xrange(limit_of_previous_field, packed_field.offset):
-      bytes[i].is_padding = True
-    bytes[packed_field.offset].packed_fields.append(packed_field)
-    limit_of_previous_field = packed_field.offset + packed_field.size
-
-  for i in xrange(limit_of_previous_field, len(bytes)):
-    bytes[i].is_padding = True
-
-  for byte in bytes:
-    # A given byte cannot both be padding and have a fields packed into it.
-    assert not (byte.is_padding and byte.packed_fields)
-
-  return bytes
-
-
-class VersionInfo(object):
-  def __init__(self, version, num_fields, num_bytes):
-    self.version = version
-    self.num_fields = num_fields
-    self.num_bytes = num_bytes
-
-
-def GetVersionInfo(packed_struct):
-  """Get version information for a struct.
-
-  Args:
-    packed_struct: A PackedStruct instance.
-
-  Returns:
-    A non-empty list of VersionInfo instances, sorted by version in increasing
-    order.
-    Note: The version numbers may not be consecutive.
-  """
-  versions = []
-  last_version = 0
-  last_num_fields = 0
-  last_payload_size = 0
-
-  for packed_field in packed_struct.packed_fields_in_ordinal_order:
-    if packed_field.min_version != last_version:
-      versions.append(
-          VersionInfo(last_version, last_num_fields,
-                      last_payload_size + HEADER_SIZE))
-      last_version = packed_field.min_version
-
-    last_num_fields += 1
-    # The fields are iterated in ordinal order here. However, the size of a
-    # version is determined by the last field of that version in pack order,
-    # instead of ordinal order. Therefore, we need to calculate the max value.
-    last_payload_size = max(GetPayloadSizeUpToField(packed_field),
-                            last_payload_size)
-
-  assert len(versions) == 0 or last_num_fields != versions[-1].num_fields
-  versions.append(VersionInfo(last_version, last_num_fields,
-                              last_payload_size + HEADER_SIZE))
-  return versions
diff --git a/mojo/public/tools/bindings/pylib/mojom/generate/pack_tests.py b/mojo/public/tools/bindings/pylib/mojom/generate/pack_tests.py
deleted file mode 100644
index 14f699d..0000000
--- a/mojo/public/tools/bindings/pylib/mojom/generate/pack_tests.py
+++ /dev/null
@@ -1,193 +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.
-
-import sys
-
-import module as mojom
-import pack
-import test_support
-
-
-EXPECT_EQ = test_support.EXPECT_EQ
-EXPECT_TRUE = test_support.EXPECT_TRUE
-RunTest = test_support.RunTest
-
-
-def TestOrdinalOrder():
-  errors = 0
-  struct = mojom.Struct('test')
-  struct.AddField('testfield1', mojom.INT32, 2)
-  struct.AddField('testfield2', mojom.INT32, 1)
-  ps = pack.PackedStruct(struct)
-
-  errors += EXPECT_EQ(2, len(ps.packed_fields))
-  errors += EXPECT_EQ('testfield2', ps.packed_fields[0].field.name)
-  errors += EXPECT_EQ('testfield1', ps.packed_fields[1].field.name)
-
-  return errors
-
-def TestZeroFields():
-  errors = 0
-  struct = mojom.Struct('test')
-  ps = pack.PackedStruct(struct)
-  errors += EXPECT_EQ(0, len(ps.packed_fields))
-  return errors
-
-
-def TestOneField():
-  errors = 0
-  struct = mojom.Struct('test')
-  struct.AddField('testfield1', mojom.INT8)
-  ps = pack.PackedStruct(struct)
-  errors += EXPECT_EQ(1, len(ps.packed_fields))
-  return errors
-
-# Pass three tuples.
-# |kinds| is a sequence of mojom.Kinds that specify the fields that are to
-# be created.
-# |fields| is the expected order of the resulting fields, with the integer
-# "1" first.
-# |offsets| is the expected order of offsets, with the integer "0" first.
-def TestSequence(kinds, fields, offsets):
-  errors = 0
-  struct = mojom.Struct('test')
-  index = 1
-  for kind in kinds:
-    struct.AddField("%d" % index, kind)
-    index += 1
-  ps = pack.PackedStruct(struct)
-  num_fields = len(ps.packed_fields)
-  errors += EXPECT_EQ(len(kinds), num_fields)
-  for i in xrange(num_fields):
-    EXPECT_EQ("%d" % fields[i], ps.packed_fields[i].field.name)
-    EXPECT_EQ(offsets[i], ps.packed_fields[i].offset)
-
-  return errors
-
-
-def TestPaddingPackedInOrder():
-  return TestSequence(
-      (mojom.INT8, mojom.UINT8, mojom.INT32),
-      (1, 2, 3),
-      (0, 1, 4))
-
-
-def TestPaddingPackedOutOfOrder():
-  return TestSequence(
-      (mojom.INT8, mojom.INT32, mojom.UINT8),
-      (1, 3, 2),
-      (0, 1, 4))
-
-
-def TestPaddingPackedOverflow():
-  kinds = (mojom.INT8, mojom.INT32, mojom.INT16, mojom.INT8, mojom.INT8)
-  # 2 bytes should be packed together first, followed by short, then by int.
-  fields = (1, 4, 3, 2, 5)
-  offsets = (0, 1, 2, 4, 8)
-  return TestSequence(kinds, fields, offsets)
-
-
-def TestNullableTypes():
-  kinds = (mojom.STRING.MakeNullableKind(),
-           mojom.HANDLE.MakeNullableKind(),
-           mojom.Struct('test_struct').MakeNullableKind(),
-           mojom.DCPIPE.MakeNullableKind(),
-           mojom.Array().MakeNullableKind(),
-           mojom.DPPIPE.MakeNullableKind(),
-           mojom.Array(length=5).MakeNullableKind(),
-           mojom.MSGPIPE.MakeNullableKind(),
-           mojom.Interface('test_inteface').MakeNullableKind(),
-           mojom.SHAREDBUFFER.MakeNullableKind(),
-           mojom.InterfaceRequest().MakeNullableKind())
-  fields = (1, 2, 4, 3, 5, 6, 8, 7, 9, 10, 11)
-  offsets = (0, 8, 12, 16, 24, 32, 36, 40, 48, 52, 56)
-  return TestSequence(kinds, fields, offsets)
-
-
-def TestAllTypes():
-  return TestSequence(
-      (mojom.BOOL, mojom.INT8, mojom.STRING, mojom.UINT8,
-       mojom.INT16, mojom.DOUBLE, mojom.UINT16,
-       mojom.INT32, mojom.UINT32, mojom.INT64,
-       mojom.FLOAT, mojom.STRING, mojom.HANDLE,
-       mojom.UINT64, mojom.Struct('test'), mojom.Array(),
-       mojom.STRING.MakeNullableKind()),
-      (1, 2, 4, 5, 7, 3, 6,  8,  9,  10, 11, 13, 12, 14, 15, 16, 17, 18),
-      (0, 1, 2, 4, 6, 8, 16, 24, 28, 32, 40, 44, 48, 56, 64, 72, 80, 88))
-
-
-def TestPaddingPackedOutOfOrderByOrdinal():
-  errors = 0
-  struct = mojom.Struct('test')
-  struct.AddField('testfield1', mojom.INT8)
-  struct.AddField('testfield3', mojom.UINT8, 3)
-  struct.AddField('testfield2', mojom.INT32, 2)
-  ps = pack.PackedStruct(struct)
-  errors += EXPECT_EQ(3, len(ps.packed_fields))
-
-  # Second byte should be packed in behind first, altering order.
-  errors += EXPECT_EQ('testfield1', ps.packed_fields[0].field.name)
-  errors += EXPECT_EQ('testfield3', ps.packed_fields[1].field.name)
-  errors += EXPECT_EQ('testfield2', ps.packed_fields[2].field.name)
-
-  # Second byte should be packed with first.
-  errors += EXPECT_EQ(0, ps.packed_fields[0].offset)
-  errors += EXPECT_EQ(1, ps.packed_fields[1].offset)
-  errors += EXPECT_EQ(4, ps.packed_fields[2].offset)
-
-  return errors
-
-
-def TestBools():
-  errors = 0
-  struct = mojom.Struct('test')
-  struct.AddField('bit0', mojom.BOOL)
-  struct.AddField('bit1', mojom.BOOL)
-  struct.AddField('int', mojom.INT32)
-  struct.AddField('bit2', mojom.BOOL)
-  struct.AddField('bit3', mojom.BOOL)
-  struct.AddField('bit4', mojom.BOOL)
-  struct.AddField('bit5', mojom.BOOL)
-  struct.AddField('bit6', mojom.BOOL)
-  struct.AddField('bit7', mojom.BOOL)
-  struct.AddField('bit8', mojom.BOOL)
-  ps = pack.PackedStruct(struct)
-  errors += EXPECT_EQ(10, len(ps.packed_fields))
-
-  # First 8 bits packed together.
-  for i in xrange(8):
-    pf = ps.packed_fields[i]
-    errors += EXPECT_EQ(0, pf.offset)
-    errors += EXPECT_EQ("bit%d" % i, pf.field.name)
-    errors += EXPECT_EQ(i, pf.bit)
-
-  # Ninth bit goes into second byte.
-  errors += EXPECT_EQ("bit8", ps.packed_fields[8].field.name)
-  errors += EXPECT_EQ(1, ps.packed_fields[8].offset)
-  errors += EXPECT_EQ(0, ps.packed_fields[8].bit)
-
-  # int comes last.
-  errors += EXPECT_EQ("int", ps.packed_fields[9].field.name)
-  errors += EXPECT_EQ(4, ps.packed_fields[9].offset)
-
-  return errors
-
-
-def Main(args):
-  errors = 0
-  errors += RunTest(TestZeroFields)
-  errors += RunTest(TestOneField)
-  errors += RunTest(TestPaddingPackedInOrder)
-  errors += RunTest(TestPaddingPackedOutOfOrder)
-  errors += RunTest(TestPaddingPackedOverflow)
-  errors += RunTest(TestNullableTypes)
-  errors += RunTest(TestAllTypes)
-  errors += RunTest(TestPaddingPackedOutOfOrderByOrdinal)
-  errors += RunTest(TestBools)
-
-  return errors
-
-
-if __name__ == '__main__':
-  sys.exit(Main(sys.argv[1:]))
diff --git a/mojo/public/tools/bindings/pylib/mojom/generate/run_tests.py b/mojo/public/tools/bindings/pylib/mojom/generate/run_tests.py
deleted file mode 100755
index 41f11a2..0000000
--- a/mojo/public/tools/bindings/pylib/mojom/generate/run_tests.py
+++ /dev/null
@@ -1,35 +0,0 @@
-#!/usr/bin/env python
-# 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.
-
-""" Test runner for Mojom """
-
-import subprocess
-import sys
-
-def TestMojom(testname, args):
-  print '\nRunning unit tests for %s.' % testname
-  try:
-    args = [sys.executable, testname] + args
-    subprocess.check_call(args, stdout=sys.stdout)
-    print 'Succeeded'
-    return 0
-  except subprocess.CalledProcessError as err:
-    print 'Failed with %s.' % str(err)
-    return 1
-
-
-def main(args):
-  errors = 0
-  errors += TestMojom('data_tests.py', ['--test'])
-  errors += TestMojom('module_tests.py', ['--test'])
-  errors += TestMojom('pack_tests.py', ['--test'])
-
-  if errors:
-    print '\nFailed tests.'
-  return min(errors, 127)  # Make sure the return value doesn't "wrap".
-
-
-if __name__ == '__main__':
-  sys.exit(main(sys.argv[1:]))
diff --git a/mojo/public/tools/bindings/pylib/mojom/generate/template_expander.py b/mojo/public/tools/bindings/pylib/mojom/generate/template_expander.py
deleted file mode 100644
index 66f8954..0000000
--- a/mojo/public/tools/bindings/pylib/mojom/generate/template_expander.py
+++ /dev/null
@@ -1,67 +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.
-
-# Based on third_party/WebKit/Source/build/scripts/template_expander.py.
-
-import imp
-import os.path
-import sys
-
-# Disable lint check for finding modules:
-# pylint: disable=F0401
-
-def _GetDirAbove(dirname):
-  """Returns the directory "above" this file containing |dirname| (which must
-  also be "above" this file)."""
-  path = os.path.abspath(__file__)
-  while True:
-    path, tail = os.path.split(path)
-    assert tail
-    if tail == dirname:
-      return path
-
-try:
-  imp.find_module("jinja2")
-except ImportError:
-  sys.path.append(os.path.join(_GetDirAbove("mojo"), "third_party"))
-import jinja2
-
-
-def ApplyTemplate(mojo_generator, path_to_template, params, **kwargs):
-  loader = jinja2.ModuleLoader(os.path.join(
-      mojo_generator.bytecode_path, "%s.zip" % mojo_generator.GetTemplatePrefix(
-      )))
-  final_kwargs = dict(mojo_generator.GetJinjaParameters())
-  final_kwargs.update(kwargs)
-  jinja_env = jinja2.Environment(loader=loader,
-                                 keep_trailing_newline=True,
-                                 **final_kwargs)
-  jinja_env.globals.update(mojo_generator.GetGlobals())
-  jinja_env.filters.update(mojo_generator.GetFilters())
-  template = jinja_env.get_template(path_to_template)
-  return template.render(params)
-
-
-def UseJinja(path_to_template, **kwargs):
-  def RealDecorator(generator):
-    def GeneratorInternal(*args, **kwargs2):
-      parameters = generator(*args, **kwargs2)
-      return ApplyTemplate(args[0], path_to_template, parameters, **kwargs)
-    GeneratorInternal.func_name = generator.func_name
-    return GeneratorInternal
-  return RealDecorator
-
-
-def PrecompileTemplates(generator_modules, output_dir):
-  for module in generator_modules.values():
-    generator = module.Generator(None)
-    jinja_env = jinja2.Environment(loader=jinja2.FileSystemLoader([os.path.join(
-        os.path.dirname(module.__file__), generator.GetTemplatePrefix())]))
-    jinja_env.filters.update(generator.GetFilters())
-    jinja_env.compile_templates(
-        os.path.join(output_dir, "%s.zip" % generator.GetTemplatePrefix()),
-        extensions=["tmpl"],
-        zip="stored",
-        py_compile=True,
-        ignore_errors=False)
diff --git a/mojo/public/tools/bindings/pylib/mojom/generate/test_support.py b/mojo/public/tools/bindings/pylib/mojom/generate/test_support.py
deleted file mode 100644
index eb39461..0000000
--- a/mojo/public/tools/bindings/pylib/mojom/generate/test_support.py
+++ /dev/null
@@ -1,193 +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.
-
-import sys
-import traceback
-
-import module as mojom
-
-# Support for writing mojom test cases.
-# RunTest(fn) will execute fn, catching any exceptions. fn should return
-# the number of errors that are encountered.
-#
-# EXPECT_EQ(a, b) and EXPECT_TRUE(b) will print error information if the
-# expectations are not true and return a non zero value. This allows test cases
-# to be written like this
-#
-# def Foo():
-#   errors = 0
-#   errors += EXPECT_EQ('test', test())
-#   ...
-#   return errors
-#
-# RunTest(foo)
-
-def FieldsAreEqual(field1, field2):
-  if field1 == field2:
-    return True
-  return field1.name == field2.name and \
-      KindsAreEqual(field1.kind, field2.kind) and \
-      field1.ordinal == field2.ordinal and \
-      field1.default == field2.default
-
-
-def KindsAreEqual(kind1, kind2):
-  if kind1 == kind2:
-    return True
-  if kind1.__class__ != kind2.__class__ or kind1.spec != kind2.spec:
-    return False
-  if kind1.__class__ == mojom.Kind:
-    return kind1.spec == kind2.spec
-  if kind1.__class__ == mojom.Struct:
-    if kind1.name != kind2.name or \
-        kind1.spec != kind2.spec or \
-        len(kind1.fields) != len(kind2.fields):
-      return False
-    for i in range(len(kind1.fields)):
-      if not FieldsAreEqual(kind1.fields[i], kind2.fields[i]):
-        return False
-    return True
-  if kind1.__class__ == mojom.Array:
-    return KindsAreEqual(kind1.kind, kind2.kind)
-  print 'Unknown Kind class: ', kind1.__class__.__name__
-  return False
-
-
-def ParametersAreEqual(parameter1, parameter2):
-  if parameter1 == parameter2:
-    return True
-  return parameter1.name == parameter2.name and \
-     parameter1.ordinal == parameter2.ordinal and \
-     parameter1.default == parameter2.default and \
-     KindsAreEqual(parameter1.kind, parameter2.kind)
-
-
-def MethodsAreEqual(method1, method2):
-  if method1 == method2:
-    return True
-  if method1.name != method2.name or \
-      method1.ordinal != method2.ordinal or \
-      len(method1.parameters) != len(method2.parameters):
-    return False
-  for i in range(len(method1.parameters)):
-    if not ParametersAreEqual(method1.parameters[i], method2.parameters[i]):
-      return False
-  return True
-
-
-def InterfacesAreEqual(interface1, interface2):
-  if interface1 == interface2:
-    return True
-  if interface1.name != interface2.name or \
-      len(interface1.methods) != len(interface2.methods):
-    return False
-  for i in range(len(interface1.methods)):
-    if not MethodsAreEqual(interface1.methods[i], interface2.methods[i]):
-      return False
-  return True
-
-
-def ModulesAreEqual(module1, module2):
-  if module1 == module2:
-    return True
-  if module1.name != module2.name or \
-      module1.namespace != module2.namespace or \
-      len(module1.structs) != len(module2.structs) or \
-      len(module1.interfaces) != len(module2.interfaces):
-    return False
-  for i in range(len(module1.structs)):
-    if not KindsAreEqual(module1.structs[i], module2.structs[i]):
-      return False
-  for i in range(len(module1.interfaces)):
-    if not InterfacesAreEqual(module1.interfaces[i], module2.interfaces[i]):
-      return False
-  return True
-
-
-# Builds and returns a Module suitable for testing/
-def BuildTestModule():
-  module = mojom.Module('test', 'testspace')
-  struct = module.AddStruct('teststruct')
-  struct.AddField('testfield1', mojom.INT32)
-  struct.AddField('testfield2', mojom.Array(mojom.INT32), 42)
-
-  interface = module.AddInterface('Server')
-  method = interface.AddMethod('Foo', 42)
-  method.AddParameter('foo', mojom.INT32)
-  method.AddParameter('bar', mojom.Array(struct))
-
-  return module
-
-
-# Tests if |module| is as built by BuildTestModule(). Returns the number of
-# errors
-def TestTestModule(module):
-  errors = 0
-
-  errors += EXPECT_EQ('test', module.name)
-  errors += EXPECT_EQ('testspace', module.namespace)
-  errors += EXPECT_EQ(1, len(module.structs))
-  errors += EXPECT_EQ('teststruct', module.structs[0].name)
-  errors += EXPECT_EQ(2, len(module.structs[0].fields))
-  errors += EXPECT_EQ('testfield1', module.structs[0].fields[0].name)
-  errors += EXPECT_EQ(mojom.INT32, module.structs[0].fields[0].kind)
-  errors += EXPECT_EQ('testfield2', module.structs[0].fields[1].name)
-  errors += EXPECT_EQ(mojom.Array, module.structs[0].fields[1].kind.__class__)
-  errors += EXPECT_EQ(mojom.INT32, module.structs[0].fields[1].kind.kind)
-
-  errors += EXPECT_EQ(1, len(module.interfaces))
-  errors += EXPECT_EQ('Server', module.interfaces[0].name)
-  errors += EXPECT_EQ(1, len(module.interfaces[0].methods))
-  errors += EXPECT_EQ('Foo', module.interfaces[0].methods[0].name)
-  errors += EXPECT_EQ(2, len(module.interfaces[0].methods[0].parameters))
-  errors += EXPECT_EQ('foo', module.interfaces[0].methods[0].parameters[0].name)
-  errors += EXPECT_EQ(mojom.INT32,
-                      module.interfaces[0].methods[0].parameters[0].kind)
-  errors += EXPECT_EQ('bar', module.interfaces[0].methods[0].parameters[1].name)
-  errors += EXPECT_EQ(
-    mojom.Array,
-    module.interfaces[0].methods[0].parameters[1].kind.__class__)
-  errors += EXPECT_EQ(
-    module.structs[0],
-    module.interfaces[0].methods[0].parameters[1].kind.kind)
-  return errors
-
-
-def PrintFailure(string):
-  stack = traceback.extract_stack()
-  frame = stack[len(stack)-3]
-  sys.stderr.write("ERROR at %s:%d, %s\n" % (frame[0], frame[1], string))
-  print "Traceback:"
-  for line in traceback.format_list(stack[:len(stack)-2]):
-    sys.stderr.write(line)
-
-
-def EXPECT_EQ(a, b):
-  if a != b:
-    PrintFailure("%s != %s" % (a, b))
-    return 1
-  return 0
-
-
-def EXPECT_TRUE(a):
-  if not a:
-    PrintFailure('Expecting True')
-    return 1
-  return 0
-
-
-def RunTest(fn):
-  sys.stdout.write('Running %s...' % fn.__name__)
-  try:
-    errors = fn()
-  except:
-    traceback.print_exc(sys.stderr)
-    errors = 1
-  if errors == 0:
-    sys.stdout.write('OK\n')
-  elif errors == 1:
-    sys.stdout.write('1 ERROR\n')
-  else:
-    sys.stdout.write('%d ERRORS\n' % errors)
-  return errors
diff --git a/mojo/public/tools/bindings/pylib/mojom/generate/translate.py b/mojo/public/tools/bindings/pylib/mojom/generate/translate.py
deleted file mode 100644
index ffad744..0000000
--- a/mojo/public/tools/bindings/pylib/mojom/generate/translate.py
+++ /dev/null
@@ -1,639 +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.
-
-"""Convert parse tree to AST.
-
-This module converts the parse tree to the AST we use for code generation. The
-main entry point is OrderedModule, which gets passed the parser
-representation of a mojom file. When called it's assumed that all imports have
-already been parsed and converted to ASTs before.
-"""
-
-import copy
-import re
-
-import module as mojom
-from mojom.parse import ast
-
-def _DuplicateName(values):
-  """Returns the 'name' of the first entry in |values| whose 'name' has already
-     been encountered. If there are no duplicates, returns None."""
-  names = set()
-  for value in values:
-    if value.name in names:
-      return value.name
-    names.add(value.name)
-  return None
-
-def _ElemsOfType(elems, elem_type, scope):
-  """Find all elements of the given type.
-
-  Args:
-    elems: {Sequence[Any]} Sequence of elems.
-    elem_type: {Type[C]} Extract all elems of this type.
-    scope: {str} The name of the surrounding scope (e.g. struct
-        definition). Used in error messages.
-
-  Returns:
-    {List[C]} All elems of matching type.
-  """
-  assert isinstance(elem_type, type)
-  result = [elem for elem in elems if isinstance(elem, elem_type)]
-  duplicate_name = _DuplicateName(result)
-  if duplicate_name:
-    raise Exception('Names in mojom must be unique within a scope. The name '
-                    '"%s" is used more than once within the scope "%s".' %
-                    (duplicate_name, scope))
-  return result
-
-def _MapKind(kind):
-  map_to_kind = {'bool': 'b',
-                 'int8': 'i8',
-                 'int16': 'i16',
-                 'int32': 'i32',
-                 'int64': 'i64',
-                 'uint8': 'u8',
-                 'uint16': 'u16',
-                 'uint32': 'u32',
-                 'uint64': 'u64',
-                 'float': 'f',
-                 'double': 'd',
-                 'string': 's',
-                 'handle': 'h',
-                 'handle<data_pipe_consumer>': 'h:d:c',
-                 'handle<data_pipe_producer>': 'h:d:p',
-                 'handle<message_pipe>': 'h:m',
-                 'handle<shared_buffer>': 'h:s'}
-  if kind.endswith('?'):
-    base_kind = _MapKind(kind[0:-1])
-    # NOTE: This doesn't rule out enum types. Those will be detected later, when
-    # cross-reference is established.
-    reference_kinds = ('m', 's', 'h', 'a', 'r', 'x', 'asso')
-    if re.split('[^a-z]', base_kind, 1)[0] not in reference_kinds:
-      raise Exception(
-          'A type (spec "%s") cannot be made nullable' % base_kind)
-    return '?' + base_kind
-  if kind.endswith('}'):
-    lbracket = kind.rfind('{')
-    value = kind[0:lbracket]
-    return 'm[' + _MapKind(kind[lbracket+1:-1]) + '][' + _MapKind(value) + ']'
-  if kind.endswith(']'):
-    lbracket = kind.rfind('[')
-    typename = kind[0:lbracket]
-    return 'a' + kind[lbracket+1:-1] + ':' + _MapKind(typename)
-  if kind.endswith('&'):
-    return 'r:' + _MapKind(kind[0:-1])
-  if kind.startswith('asso<'):
-    assert kind.endswith('>')
-    return 'asso:' + _MapKind(kind[5:-1])
-  if kind in map_to_kind:
-    return map_to_kind[kind]
-  return 'x:' + kind
-
-def _AttributeListToDict(attribute_list):
-  if attribute_list is None:
-    return None
-  assert isinstance(attribute_list, ast.AttributeList)
-  # TODO(vtl): Check for duplicate keys here.
-  return dict([(attribute.key, attribute.value)
-                   for attribute in attribute_list])
-
-builtin_values = frozenset([
-    "double.INFINITY",
-    "double.NEGATIVE_INFINITY",
-    "double.NAN",
-    "float.INFINITY",
-    "float.NEGATIVE_INFINITY",
-    "float.NAN"])
-
-def _IsBuiltinValue(value):
-  return value in builtin_values
-
-def _LookupKind(kinds, spec, scope):
-  """Tries to find which Kind a spec refers to, given the scope in which its
-  referenced. Starts checking from the narrowest scope to most general. For
-  example, given a struct field like
-    Foo.Bar x;
-  Foo.Bar could refer to the type 'Bar' in the 'Foo' namespace, or an inner
-  type 'Bar' in the struct 'Foo' in the current namespace.
-
-  |scope| is a tuple that looks like (namespace, struct/interface), referring
-  to the location where the type is referenced."""
-  if spec.startswith('x:'):
-    name = spec[2:]
-    for i in xrange(len(scope), -1, -1):
-      test_spec = 'x:'
-      if i > 0:
-        test_spec += '.'.join(scope[:i]) + '.'
-      test_spec += name
-      kind = kinds.get(test_spec)
-      if kind:
-        return kind
-
-  return kinds.get(spec)
-
-def _LookupValue(values, name, scope, kind):
-  """Like LookupKind, but for constant values."""
-  # If the type is an enum, the value can be specified as a qualified name, in
-  # which case the form EnumName.ENUM_VALUE must be used. We use the presence
-  # of a '.' in the requested name to identify this. Otherwise, we prepend the
-  # enum name.
-  if isinstance(kind, mojom.Enum) and '.' not in name:
-    name = '%s.%s' % (kind.spec.split(':', 1)[1], name)
-  for i in reversed(xrange(len(scope) + 1)):
-    test_spec = '.'.join(scope[:i])
-    if test_spec:
-      test_spec += '.'
-    test_spec += name
-    value = values.get(test_spec)
-    if value:
-      return value
-
-  return values.get(name)
-
-def _FixupExpression(module, value, scope, kind):
-  """Translates an IDENTIFIER into a built-in value or structured NamedValue
-     object."""
-  if isinstance(value, tuple) and value[0] == 'IDENTIFIER':
-    # Allow user defined values to shadow builtins.
-    result = _LookupValue(module.values, value[1], scope, kind)
-    if result:
-      if isinstance(result, tuple):
-        raise Exception('Unable to resolve expression: %r' % value[1])
-      return result
-    if _IsBuiltinValue(value[1]):
-      return mojom.BuiltinValue(value[1])
-  return value
-
-def _Kind(kinds, spec, scope):
-  """Convert a type name into a mojom.Kind object.
-
-  As a side-effect this function adds the result to 'kinds'.
-
-  Args:
-    kinds: {Dict[str, mojom.Kind]} All known kinds up to this point, indexed by
-        their names.
-    spec: {str} A name uniquely identifying a type.
-    scope: {Tuple[str, str]} A tuple that looks like (namespace,
-        struct/interface), referring to the location where the type is
-        referenced.
-
-  Returns:
-    {mojom.Kind} The type corresponding to 'spec'.
-  """
-  kind = _LookupKind(kinds, spec, scope)
-  if kind:
-    return kind
-
-  if spec.startswith('?'):
-    kind = _Kind(kinds, spec[1:], scope).MakeNullableKind()
-  elif spec.startswith('a:'):
-    kind = mojom.Array(_Kind(kinds, spec[2:], scope))
-  elif spec.startswith('asso:'):
-    inner_kind = _Kind(kinds, spec[5:], scope)
-    if isinstance(inner_kind, mojom.InterfaceRequest):
-      kind = mojom.AssociatedInterfaceRequest(inner_kind)
-    else:
-      kind = mojom.AssociatedInterface(inner_kind)
-  elif spec.startswith('a'):
-    colon = spec.find(':')
-    length = int(spec[1:colon])
-    kind = mojom.Array(_Kind(kinds, spec[colon+1:], scope), length)
-  elif spec.startswith('r:'):
-    kind = mojom.InterfaceRequest(_Kind(kinds, spec[2:], scope))
-  elif spec.startswith('m['):
-    # Isolate the two types from their brackets.
-
-    # It is not allowed to use map as key, so there shouldn't be nested ']'s
-    # inside the key type spec.
-    key_end = spec.find(']')
-    assert key_end != -1 and key_end < len(spec) - 1
-    assert spec[key_end+1] == '[' and spec[-1] == ']'
-
-    first_kind = spec[2:key_end]
-    second_kind = spec[key_end+2:-1]
-
-    kind = mojom.Map(_Kind(kinds, first_kind, scope),
-                     _Kind(kinds, second_kind, scope))
-  else:
-    kind = mojom.Kind(spec)
-
-  kinds[spec] = kind
-  return kind
-
-def _KindFromImport(original_kind, imported_from):
-  """Used with 'import module' - clones the kind imported from the given
-  module's namespace. Only used with Structs, Unions, Interfaces and Enums."""
-  kind = copy.copy(original_kind)
-  # |shared_definition| is used to store various properties (see
-  # |AddSharedProperty()| in module.py), including |imported_from|. We don't
-  # want the copy to share these with the original, so copy it if necessary.
-  if hasattr(original_kind, 'shared_definition'):
-    kind.shared_definition = copy.copy(original_kind.shared_definition)
-  kind.imported_from = imported_from
-  return kind
-
-def _Import(module, import_module):
-  import_item = {}
-  import_item['module_name'] = import_module.name
-  import_item['namespace'] = import_module.namespace
-  import_item['module'] = import_module
-
-  # Copy the struct kinds from our imports into the current module.
-  importable_kinds = (mojom.Struct, mojom.Union, mojom.Enum, mojom.Interface)
-  for kind in import_module.kinds.itervalues():
-    if (isinstance(kind, importable_kinds) and
-        kind.imported_from is None):
-      kind = _KindFromImport(kind, import_item)
-      module.kinds[kind.spec] = kind
-  # Ditto for values.
-  for value in import_module.values.itervalues():
-    if value.imported_from is None:
-      # Values don't have shared definitions (since they're not nullable), so no
-      # need to do anything special.
-      value = copy.copy(value)
-      value.imported_from = import_item
-      module.values[value.GetSpec()] = value
-
-  return import_item
-
-def _Struct(module, parsed_struct):
-  """
-  Args:
-    module: {mojom.Module} Module currently being constructed.
-    parsed_struct: {ast.Struct} Parsed struct.
-
-  Returns:
-    {mojom.Struct} AST struct.
-  """
-  struct = mojom.Struct(module=module)
-  struct.name = parsed_struct.name
-  struct.native_only = parsed_struct.body is None
-  struct.spec = 'x:' + module.namespace + '.' + struct.name
-  module.kinds[struct.spec] = struct
-  if struct.native_only:
-    struct.enums = []
-    struct.constants = []
-    struct.fields_data = []
-  else:
-    struct.enums = map(
-        lambda enum: _Enum(module, enum, struct),
-        _ElemsOfType(parsed_struct.body, ast.Enum, parsed_struct.name))
-    struct.constants = map(
-        lambda constant: _Constant(module, constant, struct),
-        _ElemsOfType(parsed_struct.body, ast.Const, parsed_struct.name))
-    # Stash fields parsed_struct here temporarily.
-    struct.fields_data = _ElemsOfType(
-        parsed_struct.body, ast.StructField, parsed_struct.name)
-  struct.attributes = _AttributeListToDict(parsed_struct.attribute_list)
-
-  # Enforce that a [Native] attribute is set to make native-only struct
-  # declarations more explicit.
-  if struct.native_only:
-    if not struct.attributes or not struct.attributes.get('Native', False):
-      raise Exception("Native-only struct declarations must include a " +
-                      "Native attribute.")
-
-  return struct
-
-def _Union(module, parsed_union):
-  """
-  Args:
-    module: {mojom.Module} Module currently being constructed.
-    parsed_union: {ast.Union} Parsed union.
-
-  Returns:
-    {mojom.Union} AST union.
-  """
-  union = mojom.Union(module=module)
-  union.name = parsed_union.name
-  union.spec = 'x:' + module.namespace + '.' + union.name
-  module.kinds[union.spec] = union
-  # Stash fields parsed_union here temporarily.
-  union.fields_data = _ElemsOfType(
-      parsed_union.body, ast.UnionField, parsed_union.name)
-  union.attributes = _AttributeListToDict(parsed_union.attribute_list)
-  return union
-
-def _StructField(module, parsed_field, struct):
-  """
-  Args:
-    module: {mojom.Module} Module currently being constructed.
-    parsed_field: {ast.StructField} Parsed struct field.
-    struct: {mojom.Struct} Struct this field belongs to.
-
-  Returns:
-    {mojom.StructField} AST struct field.
-  """
-  field = mojom.StructField()
-  field.name = parsed_field.name
-  field.kind = _Kind(
-      module.kinds, _MapKind(parsed_field.typename),
-      (module.namespace, struct.name))
-  field.ordinal = parsed_field.ordinal.value if parsed_field.ordinal else None
-  field.default = _FixupExpression(
-      module, parsed_field.default_value, (module.namespace, struct.name),
-      field.kind)
-  field.attributes = _AttributeListToDict(parsed_field.attribute_list)
-  return field
-
-def _UnionField(module, parsed_field, union):
-  """
-  Args:
-    module: {mojom.Module} Module currently being constructed.
-    parsed_field: {ast.UnionField} Parsed union field.
-    union: {mojom.Union} Union this fields belong to.
-
-  Returns:
-    {mojom.UnionField} AST union.
-  """
-  field = mojom.UnionField()
-  field.name = parsed_field.name
-  field.kind = _Kind(
-      module.kinds, _MapKind(parsed_field.typename),
-      (module.namespace, union.name))
-  field.ordinal = parsed_field.ordinal.value if parsed_field.ordinal else None
-  field.default = _FixupExpression(
-      module, None, (module.namespace, union.name), field.kind)
-  field.attributes = _AttributeListToDict(parsed_field.attribute_list)
-  return field
-
-def _Parameter(module, parsed_param, interface):
-  """
-  Args:
-    module: {mojom.Module} Module currently being constructed.
-    parsed_param: {ast.Parameter} Parsed parameter.
-    union: {mojom.Interface} Interface this parameter belongs to.
-
-  Returns:
-    {mojom.Parameter} AST parameter.
-  """
-  parameter = mojom.Parameter()
-  parameter.name = parsed_param.name
-  parameter.kind = _Kind(
-      module.kinds, _MapKind(parsed_param.typename),
-      (module.namespace, interface.name))
-  parameter.ordinal = (
-      parsed_param.ordinal.value if parsed_param.ordinal else None)
-  parameter.default = None  # TODO(tibell): We never have these. Remove field?
-  parameter.attributes = _AttributeListToDict(parsed_param.attribute_list)
-  return parameter
-
-def _Method(module, parsed_method, interface):
-  """
-  Args:
-    module: {mojom.Module} Module currently being constructed.
-    parsed_method: {ast.Method} Parsed method.
-    interface: {mojom.Interface} Interface this method belongs to.
-
-  Returns:
-    {mojom.Method} AST method.
-  """
-  method = mojom.Method(
-      interface, parsed_method.name,
-      ordinal=parsed_method.ordinal.value if parsed_method.ordinal else None)
-  method.parameters = map(
-      lambda parameter: _Parameter(module, parameter, interface),
-      parsed_method.parameter_list)
-  if parsed_method.response_parameter_list is not None:
-    method.response_parameters = map(
-        lambda parameter: _Parameter(module, parameter, interface),
-                          parsed_method.response_parameter_list)
-  method.attributes = _AttributeListToDict(parsed_method.attribute_list)
-
-  # Enforce that only methods with response can have a [Sync] attribute.
-  if method.sync and method.response_parameters is None:
-    raise Exception("Only methods with response can include a [Sync] "
-                    "attribute. If no response parameters are needed, you "
-                    "could use an empty response parameter list, i.e., "
-                    "\"=> ()\".")
-
-  return method
-
-def _Interface(module, parsed_iface):
-  """
-  Args:
-    module: {mojom.Module} Module currently being constructed.
-    parsed_iface: {ast.Interface} Parsed interface.
-
-  Returns:
-    {mojom.Interface} AST interface.
-  """
-  interface = mojom.Interface(module=module)
-  interface.name = parsed_iface.name
-  interface.spec = 'x:' + module.namespace + '.' + interface.name
-  module.kinds[interface.spec] = interface
-  interface.enums = map(
-      lambda enum: _Enum(module, enum, interface),
-      _ElemsOfType(parsed_iface.body, ast.Enum, parsed_iface.name))
-  interface.constants = map(
-      lambda constant: _Constant(module, constant, interface),
-      _ElemsOfType(parsed_iface.body, ast.Const, parsed_iface.name))
-  # Stash methods parsed_iface here temporarily.
-  interface.methods_data = _ElemsOfType(
-      parsed_iface.body, ast.Method, parsed_iface.name)
-  interface.attributes = _AttributeListToDict(parsed_iface.attribute_list)
-  return interface
-
-def _EnumField(module, enum, parsed_field, parent_kind):
-  """
-  Args:
-    module: {mojom.Module} Module currently being constructed.
-    enum: {mojom.Enum} Enum this field belongs to.
-    parsed_field: {ast.EnumValue} Parsed enum value.
-    parent_kind: {mojom.Kind} The enclosing type.
-
-  Returns:
-    {mojom.EnumField} AST enum field.
-  """
-  field = mojom.EnumField()
-  field.name = parsed_field.name
-  # TODO(mpcomplete): FixupExpression should be done in the second pass,
-  # so constants and enums can refer to each other.
-  # TODO(mpcomplete): But then, what if constants are initialized to an enum? Or
-  # vice versa?
-  if parent_kind:
-    field.value = _FixupExpression(
-        module, parsed_field.value, (module.namespace, parent_kind.name), enum)
-  else:
-    field.value = _FixupExpression(
-        module, parsed_field.value, (module.namespace, ), enum)
-  field.attributes = _AttributeListToDict(parsed_field.attribute_list)
-  value = mojom.EnumValue(module, enum, field)
-  module.values[value.GetSpec()] = value
-  return field
-
-def _ResolveNumericEnumValues(enum_fields):
-  """
-  Given a reference to a list of mojom.EnumField, resolves and assigns their
-  values to EnumField.numeric_value.
-  """
-
-  # map of <name> -> integral value
-  resolved_enum_values = {}
-  prev_value = -1
-  for field in enum_fields:
-    # This enum value is +1 the previous enum value (e.g: BEGIN).
-    if field.value is None:
-      prev_value += 1
-
-    # Integral value (e.g: BEGIN = -0x1).
-    elif type(field.value) is str:
-      prev_value = int(field.value, 0)
-
-    # Reference to a previous enum value (e.g: INIT = BEGIN).
-    elif type(field.value) is mojom.EnumValue:
-      prev_value = resolved_enum_values[field.value.name]
-    else:
-      raise Exception("Unresolved enum value.")
-
-    resolved_enum_values[field.name] = prev_value
-    field.numeric_value = prev_value
-
-def _Enum(module, parsed_enum, parent_kind):
-  """
-  Args:
-    module: {mojom.Module} Module currently being constructed.
-    parsed_enum: {ast.Enum} Parsed enum.
-
-  Returns:
-    {mojom.Enum} AST enum.
-  """
-  enum = mojom.Enum(module=module)
-  enum.name = parsed_enum.name
-  enum.native_only = parsed_enum.enum_value_list is None
-  name = enum.name
-  if parent_kind:
-    name = parent_kind.name + '.' + name
-  enum.spec = 'x:%s.%s' % (module.namespace, name)
-  enum.parent_kind = parent_kind
-  enum.attributes = _AttributeListToDict(parsed_enum.attribute_list)
-  if enum.native_only:
-    enum.fields = []
-  else:
-    enum.fields = map(
-        lambda field: _EnumField(module, enum, field, parent_kind),
-        parsed_enum.enum_value_list)
-    _ResolveNumericEnumValues(enum.fields)
-
-  module.kinds[enum.spec] = enum
-
-  # Enforce that a [Native] attribute is set to make native-only enum
-  # declarations more explicit.
-  if enum.native_only:
-    if not enum.attributes or not enum.attributes.get('Native', False):
-      raise Exception("Native-only enum declarations must include a " +
-                      "Native attribute.")
-
-  return enum
-
-def _Constant(module, parsed_const, parent_kind):
-  """
-  Args:
-    module: {mojom.Module} Module currently being constructed.
-    parsed_const: {ast.Const} Parsed constant.
-
-  Returns:
-    {mojom.Constant} AST constant.
-  """
-  constant = mojom.Constant()
-  constant.name = parsed_const.name
-  if parent_kind:
-    scope = (module.namespace, parent_kind.name)
-  else:
-    scope = (module.namespace, )
-  # TODO(mpcomplete): maybe we should only support POD kinds.
-  constant.kind = _Kind(module.kinds, _MapKind(parsed_const.typename), scope)
-  constant.parent_kind = parent_kind
-  constant.value = _FixupExpression(module, parsed_const.value, scope, None)
-
-  value = mojom.ConstantValue(module, parent_kind, constant)
-  module.values[value.GetSpec()] = value
-  return constant
-
-def _Module(tree, name, imports):
-  """
-  Args:
-    tree: {ast.Mojom} The parse tree.
-    name: {str} The mojom filename, excluding the path.
-    imports: {Dict[str, mojom.Module]} Mapping from filenames, as they appear in
-        the import list, to already processed modules. Used to process imports.
-
-  Returns:
-    {mojom.Module} An AST for the mojom.
-  """
-  module = mojom.Module()
-  module.kinds = {}
-  for kind in mojom.PRIMITIVES:
-    module.kinds[kind.spec] = kind
-
-  module.values = {}
-
-  module.name = name
-  module.namespace = tree.module.name[1] if tree.module else ''
-  # Imports must come first, because they add to module.kinds which is used
-  # by by the others.
-  module.imports = [
-      _Import(module, imports[imp.import_filename])
-      for imp in tree.import_list]
-  if tree.module and tree.module.attribute_list:
-    assert isinstance(tree.module.attribute_list, ast.AttributeList)
-    # TODO(vtl): Check for duplicate keys here.
-    module.attributes = dict((attribute.key, attribute.value)
-                             for attribute in tree.module.attribute_list)
-
-  # First pass collects kinds.
-  module.enums = map(
-      lambda enum: _Enum(module, enum, None),
-      _ElemsOfType(tree.definition_list, ast.Enum, name))
-  module.structs = map(
-      lambda struct: _Struct(module, struct),
-      _ElemsOfType(tree.definition_list, ast.Struct, name))
-  module.unions = map(
-      lambda union: _Union(module, union),
-      _ElemsOfType(tree.definition_list, ast.Union, name))
-  module.interfaces = map(
-      lambda interface: _Interface(module, interface),
-      _ElemsOfType(tree.definition_list, ast.Interface, name))
-  module.constants = map(
-      lambda constant: _Constant(module, constant, None),
-      _ElemsOfType(tree.definition_list, ast.Const, name))
-
-  # Second pass expands fields and methods. This allows fields and parameters
-  # to refer to kinds defined anywhere in the mojom.
-  for struct in module.structs:
-    struct.fields = map(lambda field:
-        _StructField(module, field, struct), struct.fields_data)
-    del struct.fields_data
-  for union in module.unions:
-    union.fields = map(lambda field:
-        _UnionField(module, field, union), union.fields_data)
-    del union.fields_data
-  for interface in module.interfaces:
-    interface.methods = map(lambda method:
-        _Method(module, method, interface), interface.methods_data)
-    del interface.methods_data
-
-  return module
-
-def OrderedModule(tree, name, imports):
-  """Convert parse tree to AST module.
-
-  Args:
-    tree: {ast.Mojom} The parse tree.
-    name: {str} The mojom filename, excluding the path.
-    imports: {Dict[str, mojom.Module]} Mapping from filenames, as they appear in
-        the import list, to already processed modules. Used to process imports.
-
-  Returns:
-    {mojom.Module} An AST for the mojom.
-  """
-  module = _Module(tree, name, imports)
-  for interface in module.interfaces:
-    next_ordinal = 0
-    for method in interface.methods:
-      if method.ordinal is None:
-        method.ordinal = next_ordinal
-      next_ordinal = method.ordinal + 1
-  return module
diff --git a/mojo/public/tools/bindings/pylib/mojom/parse/__init__.py b/mojo/public/tools/bindings/pylib/mojom/parse/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/mojo/public/tools/bindings/pylib/mojom/parse/__init__.py
+++ /dev/null
diff --git a/mojo/public/tools/bindings/pylib/mojom/parse/ast.py b/mojo/public/tools/bindings/pylib/mojom/parse/ast.py
deleted file mode 100644
index 2c6b5fc..0000000
--- a/mojo/public/tools/bindings/pylib/mojom/parse/ast.py
+++ /dev/null
@@ -1,410 +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.
-
-"""Node classes for the AST for a Mojo IDL file."""
-
-# Note: For convenience of testing, you probably want to define __eq__() methods
-# for all node types; it's okay to be slightly lax (e.g., not compare filename
-# and lineno). You may also define __repr__() to help with analyzing test
-# failures, especially for more complex types.
-
-
-class NodeBase(object):
-  """Base class for nodes in the AST."""
-
-  def __init__(self, filename=None, lineno=None):
-    self.filename = filename
-    self.lineno = lineno
-
-  def __eq__(self, other):
-    return type(self) == type(other)
-
-  # Make != the inverse of ==. (Subclasses shouldn't have to override this.)
-  def __ne__(self, other):
-    return not self == other
-
-
-# TODO(vtl): Some of this is complicated enough that it should be tested.
-class NodeListBase(NodeBase):
-  """Represents a list of other nodes, all having the same type. (This is meant
-  to be subclassed, with subclasses defining _list_item_type to be the class (or
-  classes, in a tuple) of the members of the list.)"""
-
-  def __init__(self, item_or_items=None, **kwargs):
-    super(NodeListBase, self).__init__(**kwargs)
-    self.items = []
-    if item_or_items is None:
-      pass
-    elif isinstance(item_or_items, list):
-      for item in item_or_items:
-        assert isinstance(item, self._list_item_type)
-        self.Append(item)
-    else:
-      assert isinstance(item_or_items, self._list_item_type)
-      self.Append(item_or_items)
-
-  # Support iteration. For everything else, users should just access |items|
-  # directly. (We intentionally do NOT supply |__len__()| or |__nonzero__()|, so
-  # |bool(NodeListBase())| is true.)
-  def __iter__(self):
-    return self.items.__iter__()
-
-  def __eq__(self, other):
-    return super(NodeListBase, self).__eq__(other) and \
-           self.items == other.items
-
-  # Implement this so that on failure, we get slightly more sensible output.
-  def __repr__(self):
-    return self.__class__.__name__ + "([" + \
-           ", ".join([repr(elem) for elem in self.items]) + "])"
-
-  def Insert(self, item):
-    """Inserts item at the front of the list."""
-
-    assert isinstance(item, self._list_item_type)
-    self.items.insert(0, item)
-    self._UpdateFilenameAndLineno()
-
-  def Append(self, item):
-    """Appends item to the end of the list."""
-
-    assert isinstance(item, self._list_item_type)
-    self.items.append(item)
-    self._UpdateFilenameAndLineno()
-
-  def _UpdateFilenameAndLineno(self):
-    if self.items:
-      self.filename = self.items[0].filename
-      self.lineno = self.items[0].lineno
-
-
-class Definition(NodeBase):
-  """Represents a definition of anything that has a global name (e.g., enums,
-  enum values, consts, structs, struct fields, interfaces). (This does not
-  include parameter definitions.) This class is meant to be subclassed."""
-
-  def __init__(self, name, **kwargs):
-    assert isinstance(name, str)
-    NodeBase.__init__(self, **kwargs)
-    self.name = name
-
-
-################################################################################
-
-
-class Attribute(NodeBase):
-  """Represents an attribute."""
-
-  def __init__(self, key, value, **kwargs):
-    assert isinstance(key, str)
-    super(Attribute, self).__init__(**kwargs)
-    self.key = key
-    self.value = value
-
-  def __eq__(self, other):
-    return super(Attribute, self).__eq__(other) and \
-           self.key == other.key and \
-           self.value == other.value
-
-
-class AttributeList(NodeListBase):
-  """Represents a list attributes."""
-
-  _list_item_type = Attribute
-
-
-class Const(Definition):
-  """Represents a const definition."""
-
-  def __init__(self, name, typename, value, **kwargs):
-    # The typename is currently passed through as a string.
-    assert isinstance(typename, str)
-    # The value is either a literal (currently passed through as a string) or a
-    # "wrapped identifier".
-    assert isinstance(value, str) or isinstance(value, tuple)
-    super(Const, self).__init__(name, **kwargs)
-    self.typename = typename
-    self.value = value
-
-  def __eq__(self, other):
-    return super(Const, self).__eq__(other) and \
-           self.typename == other.typename and \
-           self.value == other.value
-
-
-class Enum(Definition):
-  """Represents an enum definition."""
-
-  def __init__(self, name, attribute_list, enum_value_list, **kwargs):
-    assert attribute_list is None or isinstance(attribute_list, AttributeList)
-    assert enum_value_list is None or isinstance(enum_value_list, EnumValueList)
-    super(Enum, self).__init__(name, **kwargs)
-    self.attribute_list = attribute_list
-    self.enum_value_list = enum_value_list
-
-  def __eq__(self, other):
-    return super(Enum, self).__eq__(other) and \
-           self.attribute_list == other.attribute_list and \
-           self.enum_value_list == other.enum_value_list
-
-
-class EnumValue(Definition):
-  """Represents a definition of an enum value."""
-
-  def __init__(self, name, attribute_list, value, **kwargs):
-    # The optional value is either an int (which is current a string) or a
-    # "wrapped identifier".
-    assert attribute_list is None or isinstance(attribute_list, AttributeList)
-    assert value is None or isinstance(value, (str, tuple))
-    super(EnumValue, self).__init__(name, **kwargs)
-    self.attribute_list = attribute_list
-    self.value = value
-
-  def __eq__(self, other):
-    return super(EnumValue, self).__eq__(other) and \
-           self.attribute_list == other.attribute_list and \
-           self.value == other.value
-
-
-class EnumValueList(NodeListBase):
-  """Represents a list of enum value definitions (i.e., the "body" of an enum
-  definition)."""
-
-  _list_item_type = EnumValue
-
-
-class Import(NodeBase):
-  """Represents an import statement."""
-
-  def __init__(self, import_filename, **kwargs):
-    assert isinstance(import_filename, str)
-    super(Import, self).__init__(**kwargs)
-    self.import_filename = import_filename
-
-  def __eq__(self, other):
-    return super(Import, self).__eq__(other) and \
-           self.import_filename == other.import_filename
-
-
-class ImportList(NodeListBase):
-  """Represents a list (i.e., sequence) of import statements."""
-
-  _list_item_type = Import
-
-
-class Interface(Definition):
-  """Represents an interface definition."""
-
-  def __init__(self, name, attribute_list, body, **kwargs):
-    assert attribute_list is None or isinstance(attribute_list, AttributeList)
-    assert isinstance(body, InterfaceBody)
-    super(Interface, self).__init__(name, **kwargs)
-    self.attribute_list = attribute_list
-    self.body = body
-
-  def __eq__(self, other):
-    return super(Interface, self).__eq__(other) and \
-           self.attribute_list == other.attribute_list and \
-           self.body == other.body
-
-
-class Method(Definition):
-  """Represents a method definition."""
-
-  def __init__(self, name, attribute_list, ordinal, parameter_list,
-               response_parameter_list, **kwargs):
-    assert attribute_list is None or isinstance(attribute_list, AttributeList)
-    assert ordinal is None or isinstance(ordinal, Ordinal)
-    assert isinstance(parameter_list, ParameterList)
-    assert response_parameter_list is None or \
-           isinstance(response_parameter_list, ParameterList)
-    super(Method, self).__init__(name, **kwargs)
-    self.attribute_list = attribute_list
-    self.ordinal = ordinal
-    self.parameter_list = parameter_list
-    self.response_parameter_list = response_parameter_list
-
-  def __eq__(self, other):
-    return super(Method, self).__eq__(other) and \
-           self.attribute_list == other.attribute_list and \
-           self.ordinal == other.ordinal and \
-           self.parameter_list == other.parameter_list and \
-           self.response_parameter_list == other.response_parameter_list
-
-
-# This needs to be declared after |Method|.
-class InterfaceBody(NodeListBase):
-  """Represents the body of (i.e., list of definitions inside) an interface."""
-
-  _list_item_type = (Const, Enum, Method)
-
-
-class Module(NodeBase):
-  """Represents a module statement."""
-
-  def __init__(self, name, attribute_list, **kwargs):
-    # |name| is either none or a "wrapped identifier".
-    assert name is None or isinstance(name, tuple)
-    assert attribute_list is None or isinstance(attribute_list, AttributeList)
-    super(Module, self).__init__(**kwargs)
-    self.name = name
-    self.attribute_list = attribute_list
-
-  def __eq__(self, other):
-    return super(Module, self).__eq__(other) and \
-           self.name == other.name and \
-           self.attribute_list == other.attribute_list
-
-
-class Mojom(NodeBase):
-  """Represents an entire .mojom file. (This is the root node.)"""
-
-  def __init__(self, module, import_list, definition_list, **kwargs):
-    assert module is None or isinstance(module, Module)
-    assert isinstance(import_list, ImportList)
-    assert isinstance(definition_list, list)
-    super(Mojom, self).__init__(**kwargs)
-    self.module = module
-    self.import_list = import_list
-    self.definition_list = definition_list
-
-  def __eq__(self, other):
-    return super(Mojom, self).__eq__(other) and \
-           self.module == other.module and \
-           self.import_list == other.import_list and \
-           self.definition_list == other.definition_list
-
-  def __repr__(self):
-    return "%s(%r, %r, %r)" % (self.__class__.__name__, self.module,
-                               self.import_list, self.definition_list)
-
-
-class Ordinal(NodeBase):
-  """Represents an ordinal value labeling, e.g., a struct field."""
-
-  def __init__(self, value, **kwargs):
-    assert isinstance(value, int)
-    super(Ordinal, self).__init__(**kwargs)
-    self.value = value
-
-  def __eq__(self, other):
-    return super(Ordinal, self).__eq__(other) and \
-           self.value == other.value
-
-
-class Parameter(NodeBase):
-  """Represents a method request or response parameter."""
-
-  def __init__(self, name, attribute_list, ordinal, typename, **kwargs):
-    assert isinstance(name, str)
-    assert attribute_list is None or isinstance(attribute_list, AttributeList)
-    assert ordinal is None or isinstance(ordinal, Ordinal)
-    assert isinstance(typename, str)
-    super(Parameter, self).__init__(**kwargs)
-    self.name = name
-    self.attribute_list = attribute_list
-    self.ordinal = ordinal
-    self.typename = typename
-
-  def __eq__(self, other):
-    return super(Parameter, self).__eq__(other) and \
-           self.name == other.name and \
-           self.attribute_list == other.attribute_list and \
-           self.ordinal == other.ordinal and \
-           self.typename == other.typename
-
-
-class ParameterList(NodeListBase):
-  """Represents a list of (method request or response) parameters."""
-
-  _list_item_type = Parameter
-
-
-class Struct(Definition):
-  """Represents a struct definition."""
-
-  def __init__(self, name, attribute_list, body, **kwargs):
-    assert attribute_list is None or isinstance(attribute_list, AttributeList)
-    assert isinstance(body, StructBody) or body is None
-    super(Struct, self).__init__(name, **kwargs)
-    self.attribute_list = attribute_list
-    self.body = body
-
-  def __eq__(self, other):
-    return super(Struct, self).__eq__(other) and \
-           self.attribute_list == other.attribute_list and \
-           self.body == other.body
-
-
-class StructField(Definition):
-  """Represents a struct field definition."""
-
-  def __init__(self, name, attribute_list, ordinal, typename, default_value,
-               **kwargs):
-    assert isinstance(name, str)
-    assert attribute_list is None or isinstance(attribute_list, AttributeList)
-    assert ordinal is None or isinstance(ordinal, Ordinal)
-    assert isinstance(typename, str)
-    # The optional default value is currently either a value as a string or a
-    # "wrapped identifier".
-    assert default_value is None or isinstance(default_value, (str, tuple))
-    super(StructField, self).__init__(name, **kwargs)
-    self.attribute_list = attribute_list
-    self.ordinal = ordinal
-    self.typename = typename
-    self.default_value = default_value
-
-  def __eq__(self, other):
-    return super(StructField, self).__eq__(other) and \
-           self.attribute_list == other.attribute_list and \
-           self.ordinal == other.ordinal and \
-           self.typename == other.typename and \
-           self.default_value == other.default_value
-
-
-# This needs to be declared after |StructField|.
-class StructBody(NodeListBase):
-  """Represents the body of (i.e., list of definitions inside) a struct."""
-
-  _list_item_type = (Const, Enum, StructField)
-
-
-class Union(Definition):
-  """Represents a union definition."""
-
-  def __init__(self, name, attribute_list, body, **kwargs):
-    assert attribute_list is None or isinstance(attribute_list, AttributeList)
-    assert isinstance(body, UnionBody)
-    super(Union, self).__init__(name, **kwargs)
-    self.attribute_list = attribute_list
-    self.body = body
-
-  def __eq__(self, other):
-    return super(Union, self).__eq__(other) and \
-           self.attribute_list == other.attribute_list and \
-           self.body == other.body
-
-
-class UnionField(Definition):
-
-  def __init__(self, name, attribute_list, ordinal, typename, **kwargs):
-    assert isinstance(name, str)
-    assert attribute_list is None or isinstance(attribute_list, AttributeList)
-    assert ordinal is None or isinstance(ordinal, Ordinal)
-    assert isinstance(typename, str)
-    super(UnionField, self).__init__(name, **kwargs)
-    self.attribute_list = attribute_list
-    self.ordinal = ordinal
-    self.typename = typename
-
-  def __eq__(self, other):
-    return super(UnionField, self).__eq__(other) and \
-           self.attribute_list == other.attribute_list and \
-           self.ordinal == other.ordinal and \
-           self.typename == other.typename
-
-
-class UnionBody(NodeListBase):
-
-  _list_item_type = UnionField
diff --git a/mojo/public/tools/bindings/pylib/mojom/parse/lexer.py b/mojo/public/tools/bindings/pylib/mojom/parse/lexer.py
deleted file mode 100644
index 06354b1..0000000
--- a/mojo/public/tools/bindings/pylib/mojom/parse/lexer.py
+++ /dev/null
@@ -1,254 +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.
-
-import imp
-import os.path
-import sys
-
-def _GetDirAbove(dirname):
-  """Returns the directory "above" this file containing |dirname| (which must
-  also be "above" this file)."""
-  path = os.path.abspath(__file__)
-  while True:
-    path, tail = os.path.split(path)
-    assert tail
-    if tail == dirname:
-      return path
-
-try:
-  imp.find_module("ply")
-except ImportError:
-  sys.path.append(os.path.join(_GetDirAbove("mojo"), "third_party"))
-from ply.lex import TOKEN
-
-from ..error import Error
-
-
-class LexError(Error):
-  """Class for errors from the lexer."""
-
-  def __init__(self, filename, message, lineno):
-    Error.__init__(self, filename, message, lineno=lineno)
-
-
-# We have methods which look like they could be functions:
-# pylint: disable=R0201
-class Lexer(object):
-
-  def __init__(self, filename):
-    self.filename = filename
-
-  ######################--   PRIVATE   --######################
-
-  ##
-  ## Internal auxiliary methods
-  ##
-  def _error(self, msg, token):
-    raise LexError(self.filename, msg, token.lineno)
-
-  ##
-  ## Reserved keywords
-  ##
-  keywords = (
-    'HANDLE',
-
-    'IMPORT',
-    'MODULE',
-    'STRUCT',
-    'UNION',
-    'INTERFACE',
-    'ENUM',
-    'CONST',
-    'TRUE',
-    'FALSE',
-    'DEFAULT',
-    'ARRAY',
-    'MAP',
-    'ASSOCIATED'
-  )
-
-  keyword_map = {}
-  for keyword in keywords:
-    keyword_map[keyword.lower()] = keyword
-
-  ##
-  ## All the tokens recognized by the lexer
-  ##
-  tokens = keywords + (
-    # Identifiers
-    'NAME',
-
-    # Constants
-    'ORDINAL',
-    'INT_CONST_DEC', 'INT_CONST_HEX',
-    'FLOAT_CONST',
-
-    # String literals
-    'STRING_LITERAL',
-
-    # Operators
-    'MINUS',
-    'PLUS',
-    'AMP',
-    'QSTN',
-
-    # Assignment
-    'EQUALS',
-
-    # Request / response
-    'RESPONSE',
-
-    # Delimiters
-    'LPAREN', 'RPAREN',         # ( )
-    'LBRACKET', 'RBRACKET',     # [ ]
-    'LBRACE', 'RBRACE',         # { }
-    'LANGLE', 'RANGLE',         # < >
-    'SEMI',                     # ;
-    'COMMA', 'DOT'              # , .
-  )
-
-  ##
-  ## Regexes for use in tokens
-  ##
-
-  # valid C identifiers (K&R2: A.2.3)
-  identifier = r'[a-zA-Z_][0-9a-zA-Z_]*'
-
-  hex_prefix = '0[xX]'
-  hex_digits = '[0-9a-fA-F]+'
-
-  # integer constants (K&R2: A.2.5.1)
-  decimal_constant = '0|([1-9][0-9]*)'
-  hex_constant = hex_prefix+hex_digits
-  # Don't allow octal constants (even invalid octal).
-  octal_constant_disallowed = '0[0-9]+'
-
-  # character constants (K&R2: A.2.5.2)
-  # Note: a-zA-Z and '.-~^_!=&;,' are allowed as escape chars to support #line
-  # directives with Windows paths as filenames (..\..\dir\file)
-  # For the same reason, decimal_escape allows all digit sequences. We want to
-  # parse all correct code, even if it means to sometimes parse incorrect
-  # code.
-  #
-  simple_escape = r"""([a-zA-Z._~!=&\^\-\\?'"])"""
-  decimal_escape = r"""(\d+)"""
-  hex_escape = r"""(x[0-9a-fA-F]+)"""
-  bad_escape = r"""([\\][^a-zA-Z._~^!=&\^\-\\?'"x0-7])"""
-
-  escape_sequence = \
-      r"""(\\("""+simple_escape+'|'+decimal_escape+'|'+hex_escape+'))'
-
-  # string literals (K&R2: A.2.6)
-  string_char = r"""([^"\\\n]|"""+escape_sequence+')'
-  string_literal = '"'+string_char+'*"'
-  bad_string_literal = '"'+string_char+'*'+bad_escape+string_char+'*"'
-
-  # floating constants (K&R2: A.2.5.3)
-  exponent_part = r"""([eE][-+]?[0-9]+)"""
-  fractional_constant = r"""([0-9]*\.[0-9]+)|([0-9]+\.)"""
-  floating_constant = \
-      '(((('+fractional_constant+')'+ \
-      exponent_part+'?)|([0-9]+'+exponent_part+')))'
-
-  # Ordinals
-  ordinal = r'@[0-9]+'
-  missing_ordinal_value = r'@'
-  # Don't allow ordinal values in octal (even invalid octal, like 09) or
-  # hexadecimal.
-  octal_or_hex_ordinal_disallowed = r'@((0[0-9]+)|('+hex_prefix+hex_digits+'))'
-
-  ##
-  ## Rules for the normal state
-  ##
-  t_ignore = ' \t\r'
-
-  # Newlines
-  def t_NEWLINE(self, t):
-    r'\n+'
-    t.lexer.lineno += len(t.value)
-
-  # Operators
-  t_MINUS             = r'-'
-  t_PLUS              = r'\+'
-  t_AMP               = r'&'
-  t_QSTN              = r'\?'
-
-  # =
-  t_EQUALS            = r'='
-
-  # =>
-  t_RESPONSE          = r'=>'
-
-  # Delimiters
-  t_LPAREN            = r'\('
-  t_RPAREN            = r'\)'
-  t_LBRACKET          = r'\['
-  t_RBRACKET          = r'\]'
-  t_LBRACE            = r'\{'
-  t_RBRACE            = r'\}'
-  t_LANGLE            = r'<'
-  t_RANGLE            = r'>'
-  t_COMMA             = r','
-  t_DOT               = r'\.'
-  t_SEMI              = r';'
-
-  t_STRING_LITERAL    = string_literal
-
-  # The following floating and integer constants are defined as
-  # functions to impose a strict order (otherwise, decimal
-  # is placed before the others because its regex is longer,
-  # and this is bad)
-  #
-  @TOKEN(floating_constant)
-  def t_FLOAT_CONST(self, t):
-    return t
-
-  @TOKEN(hex_constant)
-  def t_INT_CONST_HEX(self, t):
-    return t
-
-  @TOKEN(octal_constant_disallowed)
-  def t_OCTAL_CONSTANT_DISALLOWED(self, t):
-    msg = "Octal values not allowed"
-    self._error(msg, t)
-
-  @TOKEN(decimal_constant)
-  def t_INT_CONST_DEC(self, t):
-    return t
-
-  # unmatched string literals are caught by the preprocessor
-
-  @TOKEN(bad_string_literal)
-  def t_BAD_STRING_LITERAL(self, t):
-    msg = "String contains invalid escape code"
-    self._error(msg, t)
-
-  # Handle ordinal-related tokens in the right order:
-  @TOKEN(octal_or_hex_ordinal_disallowed)
-  def t_OCTAL_OR_HEX_ORDINAL_DISALLOWED(self, t):
-    msg = "Octal and hexadecimal ordinal values not allowed"
-    self._error(msg, t)
-
-  @TOKEN(ordinal)
-  def t_ORDINAL(self, t):
-    return t
-
-  @TOKEN(missing_ordinal_value)
-  def t_BAD_ORDINAL(self, t):
-    msg = "Missing ordinal value"
-    self._error(msg, t)
-
-  @TOKEN(identifier)
-  def t_NAME(self, t):
-    t.type = self.keyword_map.get(t.value, "NAME")
-    return t
-
-  # Ignore C and C++ style comments
-  def t_COMMENT(self, t):
-    r'(/\*(.|\n)*?\*/)|(//.*(\n[ \t]*//.*)*)'
-    t.lexer.lineno += t.value.count("\n")
-
-  def t_error(self, t):
-    msg = "Illegal character %s" % repr(t.value[0])
-    self._error(msg, t)
diff --git a/mojo/public/tools/bindings/pylib/mojom/parse/parser.py b/mojo/public/tools/bindings/pylib/mojom/parse/parser.py
deleted file mode 100644
index 868fb45..0000000
--- a/mojo/public/tools/bindings/pylib/mojom/parse/parser.py
+++ /dev/null
@@ -1,461 +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.
-
-"""Generates a syntax tree from a Mojo IDL file."""
-
-import imp
-import os.path
-import sys
-
-def _GetDirAbove(dirname):
-  """Returns the directory "above" this file containing |dirname| (which must
-  also be "above" this file)."""
-  path = os.path.abspath(__file__)
-  while True:
-    path, tail = os.path.split(path)
-    assert tail
-    if tail == dirname:
-      return path
-
-try:
-  imp.find_module("ply")
-except ImportError:
-  sys.path.append(os.path.join(_GetDirAbove("mojo"), "third_party"))
-from ply import lex
-from ply import yacc
-
-from ..error import Error
-from . import ast
-from .lexer import Lexer
-
-
-_MAX_ORDINAL_VALUE = 0xffffffff
-_MAX_ARRAY_SIZE = 0xffffffff
-
-
-class ParseError(Error):
-  """Class for errors from the parser."""
-
-  def __init__(self, filename, message, lineno=None, snippet=None):
-    Error.__init__(self, filename, message, lineno=lineno,
-                   addenda=([snippet] if snippet else None))
-
-
-# We have methods which look like they could be functions:
-# pylint: disable=R0201
-class Parser(object):
-
-  def __init__(self, lexer, source, filename):
-    self.tokens = lexer.tokens
-    self.source = source
-    self.filename = filename
-
-  # Names of functions
-  #
-  # In general, we name functions after the left-hand-side of the rule(s) that
-  # they handle. E.g., |p_foo_bar| for a rule |foo_bar : ...|.
-  #
-  # There may be multiple functions handling rules for the same left-hand-side;
-  # then we name the functions |p_foo_bar_N| (for left-hand-side |foo_bar|),
-  # where N is a number (numbered starting from 1). Note that using multiple
-  # functions is actually more efficient than having single functions handle
-  # multiple rules (and, e.g., distinguishing them by examining |len(p)|).
-  #
-  # It's also possible to have a function handling multiple rules with different
-  # left-hand-sides. We do not do this.
-  #
-  # See http://www.dabeaz.com/ply/ply.html#ply_nn25 for more details.
-
-  # TODO(vtl): Get rid of the braces in the module "statement". (Consider
-  # renaming "module" -> "package".) Then we'll be able to have a single rule
-  # for root (by making module "optional").
-  def p_root_1(self, p):
-    """root : """
-    p[0] = ast.Mojom(None, ast.ImportList(), [])
-
-  def p_root_2(self, p):
-    """root : root module"""
-    if p[1].module is not None:
-      raise ParseError(self.filename,
-                       "Multiple \"module\" statements not allowed:",
-                       p[2].lineno, snippet=self._GetSnippet(p[2].lineno))
-    if p[1].import_list.items or p[1].definition_list:
-      raise ParseError(
-          self.filename,
-          "\"module\" statements must precede imports and definitions:",
-          p[2].lineno, snippet=self._GetSnippet(p[2].lineno))
-    p[0] = p[1]
-    p[0].module = p[2]
-
-  def p_root_3(self, p):
-    """root : root import"""
-    if p[1].definition_list:
-      raise ParseError(self.filename,
-                       "\"import\" statements must precede definitions:",
-                       p[2].lineno, snippet=self._GetSnippet(p[2].lineno))
-    p[0] = p[1]
-    p[0].import_list.Append(p[2])
-
-  def p_root_4(self, p):
-    """root : root definition"""
-    p[0] = p[1]
-    p[0].definition_list.append(p[2])
-
-  def p_import(self, p):
-    """import : IMPORT STRING_LITERAL SEMI"""
-    # 'eval' the literal to strip the quotes.
-    # TODO(vtl): This eval is dubious. We should unquote/unescape ourselves.
-    p[0] = ast.Import(eval(p[2]), filename=self.filename, lineno=p.lineno(2))
-
-  def p_module(self, p):
-    """module : attribute_section MODULE identifier_wrapped SEMI"""
-    p[0] = ast.Module(p[3], p[1], filename=self.filename, lineno=p.lineno(2))
-
-  def p_definition(self, p):
-    """definition : struct
-                  | union
-                  | interface
-                  | enum
-                  | const"""
-    p[0] = p[1]
-
-  def p_attribute_section_1(self, p):
-    """attribute_section : """
-    p[0] = None
-
-  def p_attribute_section_2(self, p):
-    """attribute_section : LBRACKET attribute_list RBRACKET"""
-    p[0] = p[2]
-
-  def p_attribute_list_1(self, p):
-    """attribute_list : """
-    p[0] = ast.AttributeList()
-
-  def p_attribute_list_2(self, p):
-    """attribute_list : nonempty_attribute_list"""
-    p[0] = p[1]
-
-  def p_nonempty_attribute_list_1(self, p):
-    """nonempty_attribute_list : attribute"""
-    p[0] = ast.AttributeList(p[1])
-
-  def p_nonempty_attribute_list_2(self, p):
-    """nonempty_attribute_list : nonempty_attribute_list COMMA attribute"""
-    p[0] = p[1]
-    p[0].Append(p[3])
-
-  def p_attribute_1(self, p):
-    """attribute : NAME EQUALS evaled_literal
-                 | NAME EQUALS NAME"""
-    p[0] = ast.Attribute(p[1], p[3], filename=self.filename, lineno=p.lineno(1))
-
-  def p_attribute_2(self, p):
-    """attribute : NAME"""
-    p[0] = ast.Attribute(p[1], True, filename=self.filename, lineno=p.lineno(1))
-
-  def p_evaled_literal(self, p):
-    """evaled_literal : literal"""
-    # 'eval' the literal to strip the quotes. Handle keywords "true" and "false"
-    # specially since they cannot directly be evaluated to python boolean
-    # values.
-    if p[1] == "true":
-      p[0] = True
-    elif p[1] == "false":
-      p[0] = False
-    else:
-      p[0] = eval(p[1])
-
-  def p_struct_1(self, p):
-    """struct : attribute_section STRUCT NAME LBRACE struct_body RBRACE SEMI"""
-    p[0] = ast.Struct(p[3], p[1], p[5])
-
-  def p_struct_2(self, p):
-    """struct : attribute_section STRUCT NAME SEMI"""
-    p[0] = ast.Struct(p[3], p[1], None)
-
-  def p_struct_body_1(self, p):
-    """struct_body : """
-    p[0] = ast.StructBody()
-
-  def p_struct_body_2(self, p):
-    """struct_body : struct_body const
-                   | struct_body enum
-                   | struct_body struct_field"""
-    p[0] = p[1]
-    p[0].Append(p[2])
-
-  def p_struct_field(self, p):
-    """struct_field : attribute_section typename NAME ordinal default SEMI"""
-    p[0] = ast.StructField(p[3], p[1], p[4], p[2], p[5])
-
-  def p_union(self, p):
-    """union : attribute_section UNION NAME LBRACE union_body RBRACE SEMI"""
-    p[0] = ast.Union(p[3], p[1], p[5])
-
-  def p_union_body_1(self, p):
-    """union_body : """
-    p[0] = ast.UnionBody()
-
-  def p_union_body_2(self, p):
-    """union_body : union_body union_field"""
-    p[0] = p[1]
-    p[1].Append(p[2])
-
-  def p_union_field(self, p):
-    """union_field : attribute_section typename NAME ordinal SEMI"""
-    p[0] = ast.UnionField(p[3], p[1], p[4], p[2])
-
-  def p_default_1(self, p):
-    """default : """
-    p[0] = None
-
-  def p_default_2(self, p):
-    """default : EQUALS constant"""
-    p[0] = p[2]
-
-  def p_interface(self, p):
-    """interface : attribute_section INTERFACE NAME LBRACE interface_body \
-                       RBRACE SEMI"""
-    p[0] = ast.Interface(p[3], p[1], p[5])
-
-  def p_interface_body_1(self, p):
-    """interface_body : """
-    p[0] = ast.InterfaceBody()
-
-  def p_interface_body_2(self, p):
-    """interface_body : interface_body const
-                      | interface_body enum
-                      | interface_body method"""
-    p[0] = p[1]
-    p[0].Append(p[2])
-
-  def p_response_1(self, p):
-    """response : """
-    p[0] = None
-
-  def p_response_2(self, p):
-    """response : RESPONSE LPAREN parameter_list RPAREN"""
-    p[0] = p[3]
-
-  def p_method(self, p):
-    """method : attribute_section NAME ordinal LPAREN parameter_list RPAREN \
-                    response SEMI"""
-    p[0] = ast.Method(p[2], p[1], p[3], p[5], p[7])
-
-  def p_parameter_list_1(self, p):
-    """parameter_list : """
-    p[0] = ast.ParameterList()
-
-  def p_parameter_list_2(self, p):
-    """parameter_list : nonempty_parameter_list"""
-    p[0] = p[1]
-
-  def p_nonempty_parameter_list_1(self, p):
-    """nonempty_parameter_list : parameter"""
-    p[0] = ast.ParameterList(p[1])
-
-  def p_nonempty_parameter_list_2(self, p):
-    """nonempty_parameter_list : nonempty_parameter_list COMMA parameter"""
-    p[0] = p[1]
-    p[0].Append(p[3])
-
-  def p_parameter(self, p):
-    """parameter : attribute_section typename NAME ordinal"""
-    p[0] = ast.Parameter(p[3], p[1], p[4], p[2],
-                         filename=self.filename, lineno=p.lineno(3))
-
-  def p_typename(self, p):
-    """typename : nonnullable_typename QSTN
-                | nonnullable_typename"""
-    if len(p) == 2:
-      p[0] = p[1]
-    else:
-      p[0] = p[1] + "?"
-
-  def p_nonnullable_typename(self, p):
-    """nonnullable_typename : basictypename
-                            | array
-                            | fixed_array
-                            | associative_array
-                            | interfacerequest"""
-    p[0] = p[1]
-
-  def p_basictypename(self, p):
-    """basictypename : identifier
-                     | ASSOCIATED identifier
-                     | handletype"""
-    if len(p) == 2:
-      p[0] = p[1]
-    else:
-      p[0] = "asso<" + p[2] + ">"
-
-  def p_handletype(self, p):
-    """handletype : HANDLE
-                  | HANDLE LANGLE NAME RANGLE"""
-    if len(p) == 2:
-      p[0] = p[1]
-    else:
-      if p[3] not in ('data_pipe_consumer',
-                      'data_pipe_producer',
-                      'message_pipe',
-                      'shared_buffer'):
-        # Note: We don't enable tracking of line numbers for everything, so we
-        # can't use |p.lineno(3)|.
-        raise ParseError(self.filename, "Invalid handle type %r:" % p[3],
-                         lineno=p.lineno(1),
-                         snippet=self._GetSnippet(p.lineno(1)))
-      p[0] = "handle<" + p[3] + ">"
-
-  def p_array(self, p):
-    """array : ARRAY LANGLE typename RANGLE"""
-    p[0] = p[3] + "[]"
-
-  def p_fixed_array(self, p):
-    """fixed_array : ARRAY LANGLE typename COMMA INT_CONST_DEC RANGLE"""
-    value = int(p[5])
-    if value == 0 or value > _MAX_ARRAY_SIZE:
-      raise ParseError(self.filename, "Fixed array size %d invalid:" % value,
-                       lineno=p.lineno(5),
-                       snippet=self._GetSnippet(p.lineno(5)))
-    p[0] = p[3] + "[" + p[5] + "]"
-
-  def p_associative_array(self, p):
-    """associative_array : MAP LANGLE identifier COMMA typename RANGLE"""
-    p[0] = p[5] + "{" + p[3] + "}"
-
-  def p_interfacerequest(self, p):
-    """interfacerequest : identifier AMP
-                        | ASSOCIATED identifier AMP"""
-    if len(p) == 3:
-      p[0] = p[1] + "&"
-    else:
-      p[0] = "asso<" + p[2] + "&>"
-
-  def p_ordinal_1(self, p):
-    """ordinal : """
-    p[0] = None
-
-  def p_ordinal_2(self, p):
-    """ordinal : ORDINAL"""
-    value = int(p[1][1:])
-    if value > _MAX_ORDINAL_VALUE:
-      raise ParseError(self.filename, "Ordinal value %d too large:" % value,
-                       lineno=p.lineno(1),
-                       snippet=self._GetSnippet(p.lineno(1)))
-    p[0] = ast.Ordinal(value, filename=self.filename, lineno=p.lineno(1))
-
-  def p_enum_1(self, p):
-    """enum : attribute_section ENUM NAME LBRACE enum_value_list \
-                  RBRACE SEMI
-            | attribute_section ENUM NAME LBRACE nonempty_enum_value_list \
-                  COMMA RBRACE SEMI"""
-    p[0] = ast.Enum(p[3], p[1], p[5], filename=self.filename,
-                    lineno=p.lineno(2))
-
-  def p_enum_2(self, p):
-    """enum : attribute_section ENUM NAME SEMI"""
-    p[0] = ast.Enum(p[3], p[1], None, filename=self.filename,
-                    lineno=p.lineno(2))
-
-  def p_enum_value_list_1(self, p):
-    """enum_value_list : """
-    p[0] = ast.EnumValueList()
-
-  def p_enum_value_list_2(self, p):
-    """enum_value_list : nonempty_enum_value_list"""
-    p[0] = p[1]
-
-  def p_nonempty_enum_value_list_1(self, p):
-    """nonempty_enum_value_list : enum_value"""
-    p[0] = ast.EnumValueList(p[1])
-
-  def p_nonempty_enum_value_list_2(self, p):
-    """nonempty_enum_value_list : nonempty_enum_value_list COMMA enum_value"""
-    p[0] = p[1]
-    p[0].Append(p[3])
-
-  def p_enum_value(self, p):
-    """enum_value : attribute_section NAME
-                  | attribute_section NAME EQUALS int
-                  | attribute_section NAME EQUALS identifier_wrapped"""
-    p[0] = ast.EnumValue(p[2], p[1], p[4] if len(p) == 5 else None,
-                         filename=self.filename, lineno=p.lineno(2))
-
-  def p_const(self, p):
-    """const : CONST typename NAME EQUALS constant SEMI"""
-    p[0] = ast.Const(p[3], p[2], p[5])
-
-  def p_constant(self, p):
-    """constant : literal
-                | identifier_wrapped"""
-    p[0] = p[1]
-
-  def p_identifier_wrapped(self, p):
-    """identifier_wrapped : identifier"""
-    p[0] = ('IDENTIFIER', p[1])
-
-  # TODO(vtl): Make this produce a "wrapped" identifier (probably as an
-  # |ast.Identifier|, to be added) and get rid of identifier_wrapped.
-  def p_identifier(self, p):
-    """identifier : NAME
-                  | NAME DOT identifier"""
-    p[0] = ''.join(p[1:])
-
-  def p_literal(self, p):
-    """literal : int
-               | float
-               | TRUE
-               | FALSE
-               | DEFAULT
-               | STRING_LITERAL"""
-    p[0] = p[1]
-
-  def p_int(self, p):
-    """int : int_const
-           | PLUS int_const
-           | MINUS int_const"""
-    p[0] = ''.join(p[1:])
-
-  def p_int_const(self, p):
-    """int_const : INT_CONST_DEC
-                 | INT_CONST_HEX"""
-    p[0] = p[1]
-
-  def p_float(self, p):
-    """float : FLOAT_CONST
-             | PLUS FLOAT_CONST
-             | MINUS FLOAT_CONST"""
-    p[0] = ''.join(p[1:])
-
-  def p_error(self, e):
-    if e is None:
-      # Unexpected EOF.
-      # TODO(vtl): Can we figure out what's missing?
-      raise ParseError(self.filename, "Unexpected end of file")
-
-    raise ParseError(self.filename, "Unexpected %r:" % e.value, lineno=e.lineno,
-                     snippet=self._GetSnippet(e.lineno))
-
-  def _GetSnippet(self, lineno):
-    return self.source.split('\n')[lineno - 1]
-
-
-def Parse(source, filename):
-  """Parse source file to AST.
-
-  Args:
-    source: The source text as a str.
-    filename: The filename that |source| originates from.
-
-  Returns:
-    The AST as a mojom.parse.ast.Mojom object.
-  """
-  lexer = Lexer(filename)
-  parser = Parser(lexer, source, filename)
-
-  lex.lex(object=lexer)
-  yacc.yacc(module=parser, debug=0, write_tables=0)
-
-  tree = yacc.parse(source)
-  return tree
diff --git a/mojo/public/tools/bindings/pylib/mojom_tests/__init__.py b/mojo/public/tools/bindings/pylib/mojom_tests/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/mojo/public/tools/bindings/pylib/mojom_tests/__init__.py
+++ /dev/null
diff --git a/mojo/public/tools/bindings/pylib/mojom_tests/fileutil_unittest.py b/mojo/public/tools/bindings/pylib/mojom_tests/fileutil_unittest.py
deleted file mode 100644
index d56faad..0000000
--- a/mojo/public/tools/bindings/pylib/mojom_tests/fileutil_unittest.py
+++ /dev/null
@@ -1,55 +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.
-
-import imp
-import os.path
-import shutil
-import sys
-import tempfile
-import unittest
-
-def _GetDirAbove(dirname):
-  """Returns the directory "above" this file containing |dirname| (which must
-  also be "above" this file)."""
-  path = os.path.abspath(__file__)
-  while True:
-    path, tail = os.path.split(path)
-    assert tail
-    if tail == dirname:
-      return path
-
-try:
-  imp.find_module("mojom")
-except ImportError:
-  sys.path.append(os.path.join(_GetDirAbove("pylib"), "pylib"))
-from mojom import fileutil
-
-
-class FileUtilTest(unittest.TestCase):
-
-  def testEnsureDirectoryExists(self):
-    """Test that EnsureDirectoryExists fuctions correctly."""
-
-    temp_dir = tempfile.mkdtemp()
-    try:
-      self.assertTrue(os.path.exists(temp_dir))
-
-      # Directory does not exist, yet.
-      full = os.path.join(temp_dir, "foo", "bar")
-      self.assertFalse(os.path.exists(full))
-
-      # Create the directory.
-      fileutil.EnsureDirectoryExists(full)
-      self.assertTrue(os.path.exists(full))
-
-      # Trying to create it again does not cause an error.
-      fileutil.EnsureDirectoryExists(full)
-      self.assertTrue(os.path.exists(full))
-
-      # Bypass check for directory existence to tickle error handling that
-      # occurs in response to a race.
-      fileutil.EnsureDirectoryExists(full, always_try_to_create=True)
-      self.assertTrue(os.path.exists(full))
-    finally:
-      shutil.rmtree(temp_dir)
diff --git a/mojo/public/tools/bindings/pylib/mojom_tests/generate/__init__.py b/mojo/public/tools/bindings/pylib/mojom_tests/generate/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/mojo/public/tools/bindings/pylib/mojom_tests/generate/__init__.py
+++ /dev/null
diff --git a/mojo/public/tools/bindings/pylib/mojom_tests/generate/data_unittest.py b/mojo/public/tools/bindings/pylib/mojom_tests/generate/data_unittest.py
deleted file mode 100644
index 70c92a3..0000000
--- a/mojo/public/tools/bindings/pylib/mojom_tests/generate/data_unittest.py
+++ /dev/null
@@ -1,156 +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.
-
-import imp
-import os.path
-import sys
-import unittest
-
-def _GetDirAbove(dirname):
-  """Returns the directory "above" this file containing |dirname| (which must
-  also be "above" this file)."""
-  path = os.path.abspath(__file__)
-  while True:
-    path, tail = os.path.split(path)
-    assert tail
-    if tail == dirname:
-      return path
-
-try:
-  imp.find_module("mojom")
-except ImportError:
-  sys.path.append(os.path.join(_GetDirAbove("pylib"), "pylib"))
-from mojom.generate import data
-from mojom.generate import module as mojom
-
-
-class DataTest(unittest.TestCase):
-
-  def testStructDataConversion(self):
-    """Tests that a struct can be converted from data."""
-    module = mojom.Module('test_module', 'test_namespace')
-    struct_data = {
-        'name': 'SomeStruct',
-        'enums': [],
-        'constants': [],
-        'fields': [
-            {'name': 'field1', 'kind': 'i32'},
-            {'name': 'field2', 'kind': 'i32', 'ordinal': 10},
-            {'name': 'field3', 'kind': 'i32', 'default': 15}]}
-
-    struct = data.StructFromData(module, struct_data)
-    struct.fields = map(lambda field:
-        data.StructFieldFromData(module, field, struct), struct.fields_data)
-    self.assertEquals(struct_data, data.StructToData(struct))
-
-  def testUnionDataConversion(self):
-    """Tests that a union can be converted from data."""
-    module = mojom.Module('test_module', 'test_namespace')
-    union_data = {
-        'name': 'SomeUnion',
-        'fields': [
-            {'name': 'field1', 'kind': 'i32'},
-            {'name': 'field2', 'kind': 'i32', 'ordinal': 10}]}
-
-    union = data.UnionFromData(module, union_data)
-    union.fields = map(lambda field:
-        data.UnionFieldFromData(module, field, union), union.fields_data)
-    self.assertEquals(union_data, data.UnionToData(union))
-
-  def testImportFromDataNoMissingImports(self):
-    """Tests that unions, structs, interfaces and enums are imported."""
-    module = mojom.Module('test_module', 'test_namespace')
-    imported_module = mojom.Module('import_module', 'import_namespace')
-    #TODO(azani): Init values in module.py.
-    #TODO(azani): Test that values are imported.
-    imported_module.values = {}
-    imported_data = {'module' : imported_module}
-
-
-    struct = mojom.Struct('TestStruct', module=module)
-    imported_module.kinds[struct.spec] = struct
-
-    union = mojom.Union('TestUnion', module=module)
-    imported_module.kinds[union.spec] = union
-
-    interface = mojom.Interface('TestInterface', module=module)
-    imported_module.kinds[interface.spec] = interface
-
-    enum = mojom.Enum('TestEnum', module=module)
-    imported_module.kinds[enum.spec] = enum
-
-    data.ImportFromData(module, imported_data)
-
-    # Test that the kind was imported.
-    self.assertIn(struct.spec, module.kinds)
-    self.assertEquals(struct.name, module.kinds[struct.spec].name)
-
-    self.assertIn(union.spec, module.kinds)
-    self.assertEquals(union.name, module.kinds[union.spec].name)
-
-    self.assertIn(interface.spec, module.kinds)
-    self.assertEquals(interface.name, module.kinds[interface.spec].name)
-
-    self.assertIn(enum.spec, module.kinds)
-    self.assertEquals(enum.name, module.kinds[enum.spec].name)
-
-    # Test that the imported kind is a copy and not the original.
-    self.assertIsNot(struct, module.kinds[struct.spec])
-    self.assertIsNot(union, module.kinds[union.spec])
-    self.assertIsNot(interface, module.kinds[interface.spec])
-    self.assertIsNot(enum, module.kinds[enum.spec])
-
-  def testImportFromDataNoExtraneousImports(self):
-    """Tests that arrays, maps and interface requests are not imported."""
-    module = mojom.Module('test_module', 'test_namespace')
-    imported_module = mojom.Module('import_module', 'import_namespace')
-    #TODO(azani): Init values in module.py.
-    imported_module.values = {}
-    imported_data = {'module' : imported_module}
-
-    array = mojom.Array(mojom.INT16, length=20)
-    imported_module.kinds[array.spec] = array
-
-    map_kind = mojom.Map(mojom.INT16, mojom.INT16)
-    imported_module.kinds[map_kind.spec] = map_kind
-
-    interface = mojom.Interface('TestInterface', module=module)
-    imported_module.kinds[interface.spec] = interface
-
-    interface_req = mojom.InterfaceRequest(interface)
-    imported_module.kinds[interface_req.spec] = interface_req
-
-    data.ImportFromData(module, imported_data)
-
-    self.assertNotIn(array.spec, module.kinds)
-    self.assertNotIn(map_kind.spec, module.kinds)
-    self.assertNotIn(interface_req.spec, module.kinds)
-
-  def testNonInterfaceAsInterfaceRequest(self):
-    """Tests that a non-interface cannot be used for interface requests."""
-    module = mojom.Module('test_module', 'test_namespace')
-    interface = mojom.Interface('TestInterface', module=module)
-    method_dict = {
-        'name': 'Foo',
-        'parameters': [{'name': 'foo', 'kind': 'r:i32'}],
-    }
-    with self.assertRaises(Exception) as e:
-      data.MethodFromData(module, method_dict, interface)
-    self.assertEquals(e.exception.__str__(),
-                      'Interface request requires \'i32\' to be an interface.')
-
-  def testNonInterfaceAsAssociatedInterface(self):
-    """Tests that a non-interface type cannot be used for associated
-    interfaces."""
-    module = mojom.Module('test_module', 'test_namespace')
-    interface = mojom.Interface('TestInterface', module=module)
-    method_dict = {
-        'name': 'Foo',
-        'parameters': [{'name': 'foo', 'kind': 'asso:i32'}],
-    }
-    with self.assertRaises(Exception) as e:
-      data.MethodFromData(module, method_dict, interface)
-    self.assertEquals(
-        e.exception.__str__(),
-        'Associated interface requires \'i32\' to be an interface.')
diff --git a/mojo/public/tools/bindings/pylib/mojom_tests/generate/generator_unittest.py b/mojo/public/tools/bindings/pylib/mojom_tests/generate/generator_unittest.py
deleted file mode 100644
index a684773..0000000
--- a/mojo/public/tools/bindings/pylib/mojom_tests/generate/generator_unittest.py
+++ /dev/null
@@ -1,37 +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.
-
-import imp
-import os.path
-import sys
-import unittest
-
-def _GetDirAbove(dirname):
-  """Returns the directory "above" this file containing |dirname| (which must
-  also be "above" this file)."""
-  path = os.path.abspath(__file__)
-  while True:
-    path, tail = os.path.split(path)
-    assert tail
-    if tail == dirname:
-      return path
-
-try:
-  imp.find_module("mojom")
-except ImportError:
-  sys.path.append(os.path.join(_GetDirAbove("pylib"), "pylib"))
-from mojom.generate import generator
-
-
-class StringManipulationTest(unittest.TestCase):
-  """generator contains some string utilities, this tests only those."""
-
-  def testUnderToCamel(self):
-    """Tests UnderToCamel which converts underscore_separated to CamelCase."""
-    self.assertEquals("CamelCase", generator.UnderToCamel("camel_case"))
-    self.assertEquals("CamelCase", generator.UnderToCamel("CAMEL_CASE"))
-
-if __name__ == "__main__":
-  unittest.main()
-
diff --git a/mojo/public/tools/bindings/pylib/mojom_tests/generate/module_unittest.py b/mojo/public/tools/bindings/pylib/mojom_tests/generate/module_unittest.py
deleted file mode 100644
index 75b7cd5..0000000
--- a/mojo/public/tools/bindings/pylib/mojom_tests/generate/module_unittest.py
+++ /dev/null
@@ -1,48 +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.
-
-import imp
-import os.path
-import sys
-import unittest
-
-def _GetDirAbove(dirname):
-  """Returns the directory "above" this file containing |dirname| (which must
-  also be "above" this file)."""
-  path = os.path.abspath(__file__)
-  while True:
-    path, tail = os.path.split(path)
-    assert tail
-    if tail == dirname:
-      return path
-
-try:
-  imp.find_module("mojom")
-except ImportError:
-  sys.path.append(os.path.join(_GetDirAbove("pylib"), "pylib"))
-from mojom.generate import module as mojom
-
-
-class ModuleTest(unittest.TestCase):
-
-  def testNonInterfaceAsInterfaceRequest(self):
-    """Tests that a non-interface cannot be used for interface requests."""
-    module = mojom.Module('test_module', 'test_namespace')
-    struct = mojom.Struct('TestStruct', module=module)
-    with self.assertRaises(Exception) as e:
-      mojom.InterfaceRequest(struct)
-    self.assertEquals(
-        e.exception.__str__(),
-        'Interface request requires \'x:TestStruct\' to be an interface.')
-
-  def testNonInterfaceAsAssociatedInterface(self):
-    """Tests that a non-interface type cannot be used for associated interfaces.
-    """
-    module = mojom.Module('test_module', 'test_namespace')
-    struct = mojom.Struct('TestStruct', module=module)
-    with self.assertRaises(Exception) as e:
-      mojom.AssociatedInterface(struct)
-    self.assertEquals(
-        e.exception.__str__(),
-        'Associated interface requires \'x:TestStruct\' to be an interface.')
diff --git a/mojo/public/tools/bindings/pylib/mojom_tests/generate/pack_unittest.py b/mojo/public/tools/bindings/pylib/mojom_tests/generate/pack_unittest.py
deleted file mode 100644
index 75f6d51..0000000
--- a/mojo/public/tools/bindings/pylib/mojom_tests/generate/pack_unittest.py
+++ /dev/null
@@ -1,136 +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.
-
-import imp
-import os.path
-import sys
-import unittest
-
-
-def _GetDirAbove(dirname):
-  """Returns the directory "above" this file containing |dirname| (which must
-  also be "above" this file)."""
-  path = os.path.abspath(__file__)
-  while True:
-    path, tail = os.path.split(path)
-    assert tail
-    if tail == dirname:
-      return path
-
-
-try:
-  imp.find_module("mojom")
-except ImportError:
-  sys.path.append(os.path.join(_GetDirAbove("pylib"), "pylib"))
-from mojom.generate import pack
-from mojom.generate import module as mojom
-
-
-# TODO(yzshen): Move tests in pack_tests.py here.
-class PackTest(unittest.TestCase):
-  def _CheckPackSequence(self, kinds, fields, offsets):
-    """Checks the pack order and offsets of a sequence of mojom.Kinds.
-
-    Args:
-      kinds: A sequence of mojom.Kinds that specify the fields that are to be
-      created.
-      fields: The expected order of the resulting fields, with the integer "1"
-      first.
-      offsets: The expected order of offsets, with the integer "0" first.
-    """
-    struct = mojom.Struct('test')
-    index = 1
-    for kind in kinds:
-      struct.AddField('%d' % index, kind)
-      index += 1
-    ps = pack.PackedStruct(struct)
-    num_fields = len(ps.packed_fields)
-    self.assertEquals(len(kinds), num_fields)
-    for i in xrange(num_fields):
-      self.assertEquals('%d' % fields[i], ps.packed_fields[i].field.name)
-      self.assertEquals(offsets[i], ps.packed_fields[i].offset)
-
-  def testMinVersion(self):
-    """Tests that |min_version| is properly set for packed fields."""
-    struct = mojom.Struct('test')
-    struct.AddField('field_2', mojom.BOOL, 2)
-    struct.AddField('field_0', mojom.INT32, 0)
-    struct.AddField('field_1', mojom.INT64, 1)
-    ps = pack.PackedStruct(struct)
-
-    self.assertEquals('field_0', ps.packed_fields[0].field.name)
-    self.assertEquals('field_2', ps.packed_fields[1].field.name)
-    self.assertEquals('field_1', ps.packed_fields[2].field.name)
-
-    self.assertEquals(0, ps.packed_fields[0].min_version)
-    self.assertEquals(0, ps.packed_fields[1].min_version)
-    self.assertEquals(0, ps.packed_fields[2].min_version)
-
-    struct.fields[0].attributes = {'MinVersion': 1}
-    ps = pack.PackedStruct(struct)
-
-    self.assertEquals(0, ps.packed_fields[0].min_version)
-    self.assertEquals(1, ps.packed_fields[1].min_version)
-    self.assertEquals(0, ps.packed_fields[2].min_version)
-
-  def testGetVersionInfoEmptyStruct(self):
-    """Tests that pack.GetVersionInfo() never returns an empty list, even for
-    empty structs.
-    """
-    struct = mojom.Struct('test')
-    ps = pack.PackedStruct(struct)
-
-    versions = pack.GetVersionInfo(ps)
-    self.assertEquals(1, len(versions))
-    self.assertEquals(0, versions[0].version)
-    self.assertEquals(0, versions[0].num_fields)
-    self.assertEquals(8, versions[0].num_bytes)
-
-  def testGetVersionInfoComplexOrder(self):
-    """Tests pack.GetVersionInfo() using a struct whose definition order,
-    ordinal order and pack order for fields are all different.
-    """
-    struct = mojom.Struct('test')
-    struct.AddField('field_3', mojom.BOOL, ordinal=3,
-                    attributes={'MinVersion': 3})
-    struct.AddField('field_0', mojom.INT32, ordinal=0)
-    struct.AddField('field_1', mojom.INT64, ordinal=1,
-                    attributes={'MinVersion': 2})
-    struct.AddField('field_2', mojom.INT64, ordinal=2,
-                    attributes={'MinVersion': 3})
-    ps = pack.PackedStruct(struct)
-
-    versions = pack.GetVersionInfo(ps)
-    self.assertEquals(3, len(versions))
-
-    self.assertEquals(0, versions[0].version)
-    self.assertEquals(1, versions[0].num_fields)
-    self.assertEquals(16, versions[0].num_bytes)
-
-    self.assertEquals(2, versions[1].version)
-    self.assertEquals(2, versions[1].num_fields)
-    self.assertEquals(24, versions[1].num_bytes)
-
-    self.assertEquals(3, versions[2].version)
-    self.assertEquals(4, versions[2].num_fields)
-    self.assertEquals(32, versions[2].num_bytes)
-
-  def testInterfaceAlignment(self):
-    """Tests that interfaces are aligned on 4-byte boundaries, although the size
-    of an interface is 8 bytes.
-    """
-    kinds = (mojom.INT32, mojom.Interface('test_interface'))
-    fields = (1, 2)
-    offsets = (0, 4)
-    self._CheckPackSequence(kinds, fields, offsets)
-
-  def testAssociatedInterfaceAlignment(self):
-    """Tests that associated interfaces are aligned on 4-byte boundaries,
-    although the size of an associated interface is 8 bytes.
-    """
-    kinds = (mojom.INT32,
-             mojom.AssociatedInterface(mojom.Interface('test_interface')))
-    fields = (1, 2)
-    offsets = (0, 4)
-    self._CheckPackSequence(kinds, fields, offsets)
diff --git a/mojo/public/tools/bindings/pylib/mojom_tests/parse/__init__.py b/mojo/public/tools/bindings/pylib/mojom_tests/parse/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/mojo/public/tools/bindings/pylib/mojom_tests/parse/__init__.py
+++ /dev/null
diff --git a/mojo/public/tools/bindings/pylib/mojom_tests/parse/ast_unittest.py b/mojo/public/tools/bindings/pylib/mojom_tests/parse/ast_unittest.py
deleted file mode 100644
index dd28cdd..0000000
--- a/mojo/public/tools/bindings/pylib/mojom_tests/parse/ast_unittest.py
+++ /dev/null
@@ -1,135 +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.
-
-import imp
-import os.path
-import sys
-import unittest
-
-def _GetDirAbove(dirname):
-  """Returns the directory "above" this file containing |dirname| (which must
-  also be "above" this file)."""
-  path = os.path.abspath(__file__)
-  while True:
-    path, tail = os.path.split(path)
-    assert tail
-    if tail == dirname:
-      return path
-
-try:
-  imp.find_module("mojom")
-except ImportError:
-  sys.path.append(os.path.join(_GetDirAbove("pylib"), "pylib"))
-import mojom.parse.ast as ast
-
-
-class _TestNode(ast.NodeBase):
-  """Node type for tests."""
-
-  def __init__(self, value, **kwargs):
-    super(_TestNode, self).__init__(**kwargs)
-    self.value = value
-
-  def __eq__(self, other):
-    return super(_TestNode, self).__eq__(other) and self.value == other.value
-
-
-class _TestNodeList(ast.NodeListBase):
-  """Node list type for tests."""
-
-  _list_item_type = _TestNode
-
-
-class ASTTest(unittest.TestCase):
-  """Tests various AST classes."""
-
-  def testNodeBase(self):
-    # Test |__eq__()|; this is only used for testing, where we want to do
-    # comparison by value and ignore filenames/line numbers (for convenience).
-    node1 = ast.NodeBase(filename="hello.mojom", lineno=123)
-    node2 = ast.NodeBase()
-    self.assertEquals(node1, node2)
-    self.assertEquals(node2, node1)
-
-    # Check that |__ne__()| just defers to |__eq__()| properly.
-    self.assertFalse(node1 != node2)
-    self.assertFalse(node2 != node1)
-
-    # Check that |filename| and |lineno| are set properly (and are None by
-    # default).
-    self.assertEquals(node1.filename, "hello.mojom")
-    self.assertEquals(node1.lineno, 123)
-    self.assertIsNone(node2.filename)
-    self.assertIsNone(node2.lineno)
-
-    # |NodeBase|'s |__eq__()| should compare types (and a subclass's |__eq__()|
-    # should first defer to its superclass's).
-    node3 = _TestNode(123)
-    self.assertNotEqual(node1, node3)
-    self.assertNotEqual(node3, node1)
-    # Also test |__eq__()| directly.
-    self.assertFalse(node1 == node3)
-    self.assertFalse(node3 == node1)
-
-    node4 = _TestNode(123, filename="world.mojom", lineno=123)
-    self.assertEquals(node4, node3)
-    node5 = _TestNode(456)
-    self.assertNotEquals(node5, node4)
-
-  def testNodeListBase(self):
-    node1 = _TestNode(1, filename="foo.mojom", lineno=1)
-    # Equal to, but not the same as, |node1|:
-    node1b = _TestNode(1, filename="foo.mojom", lineno=1)
-    node2 = _TestNode(2, filename="foo.mojom", lineno=2)
-
-    nodelist1 = _TestNodeList()  # Contains: (empty).
-    self.assertEquals(nodelist1, nodelist1)
-    self.assertEquals(nodelist1.items, [])
-    self.assertIsNone(nodelist1.filename)
-    self.assertIsNone(nodelist1.lineno)
-
-    nodelist2 = _TestNodeList(node1)  # Contains: 1.
-    self.assertEquals(nodelist2, nodelist2)
-    self.assertEquals(nodelist2.items, [node1])
-    self.assertNotEqual(nodelist2, nodelist1)
-    self.assertEquals(nodelist2.filename, "foo.mojom")
-    self.assertEquals(nodelist2.lineno, 1)
-
-    nodelist3 = _TestNodeList([node2])  # Contains: 2.
-    self.assertEquals(nodelist3.items, [node2])
-    self.assertNotEqual(nodelist3, nodelist1)
-    self.assertNotEqual(nodelist3, nodelist2)
-    self.assertEquals(nodelist3.filename, "foo.mojom")
-    self.assertEquals(nodelist3.lineno, 2)
-
-    nodelist1.Append(node1b)  # Contains: 1.
-    self.assertEquals(nodelist1.items, [node1])
-    self.assertEquals(nodelist1, nodelist2)
-    self.assertNotEqual(nodelist1, nodelist3)
-    self.assertEquals(nodelist1.filename, "foo.mojom")
-    self.assertEquals(nodelist1.lineno, 1)
-
-    nodelist1.Append(node2)  # Contains: 1, 2.
-    self.assertEquals(nodelist1.items, [node1, node2])
-    self.assertNotEqual(nodelist1, nodelist2)
-    self.assertNotEqual(nodelist1, nodelist3)
-    self.assertEquals(nodelist1.lineno, 1)
-
-    nodelist2.Append(node2)  # Contains: 1, 2.
-    self.assertEquals(nodelist2.items, [node1, node2])
-    self.assertEquals(nodelist2, nodelist1)
-    self.assertNotEqual(nodelist2, nodelist3)
-    self.assertEquals(nodelist2.lineno, 1)
-
-    nodelist3.Insert(node1)  # Contains: 1, 2.
-    self.assertEquals(nodelist3.items, [node1, node2])
-    self.assertEquals(nodelist3, nodelist1)
-    self.assertEquals(nodelist3, nodelist2)
-    self.assertEquals(nodelist3.lineno, 1)
-
-    # Test iteration:
-    i = 1
-    for item in nodelist1:
-      self.assertEquals(item.value, i)
-      i += 1
diff --git a/mojo/public/tools/bindings/pylib/mojom_tests/parse/lexer_unittest.py b/mojo/public/tools/bindings/pylib/mojom_tests/parse/lexer_unittest.py
deleted file mode 100644
index 6822cbc..0000000
--- a/mojo/public/tools/bindings/pylib/mojom_tests/parse/lexer_unittest.py
+++ /dev/null
@@ -1,192 +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.
-
-import imp
-import os.path
-import sys
-import unittest
-
-def _GetDirAbove(dirname):
-  """Returns the directory "above" this file containing |dirname| (which must
-  also be "above" this file)."""
-  path = os.path.abspath(__file__)
-  while True:
-    path, tail = os.path.split(path)
-    assert tail
-    if tail == dirname:
-      return path
-
-try:
-  imp.find_module("ply")
-except ImportError:
-  sys.path.append(os.path.join(_GetDirAbove("mojo"), "third_party"))
-from ply import lex
-
-try:
-  imp.find_module("mojom")
-except ImportError:
-  sys.path.append(os.path.join(_GetDirAbove("pylib"), "pylib"))
-import mojom.parse.lexer
-
-
-# This (monkey-patching LexToken to make comparison value-based) is evil, but
-# we'll do it anyway. (I'm pretty sure ply's lexer never cares about comparing
-# for object identity.)
-def _LexTokenEq(self, other):
-  return self.type == other.type and self.value == other.value and \
-         self.lineno == other.lineno and self.lexpos == other.lexpos
-setattr(lex.LexToken, '__eq__', _LexTokenEq)
-
-
-def _MakeLexToken(token_type, value, lineno=1, lexpos=0):
-  """Makes a LexToken with the given parameters. (Note that lineno is 1-based,
-  but lexpos is 0-based.)"""
-  rv = lex.LexToken()
-  rv.type, rv.value, rv.lineno, rv.lexpos = token_type, value, lineno, lexpos
-  return rv
-
-
-def _MakeLexTokenForKeyword(keyword, **kwargs):
-  """Makes a LexToken for the given keyword."""
-  return _MakeLexToken(keyword.upper(), keyword.lower(), **kwargs)
-
-
-class LexerTest(unittest.TestCase):
-  """Tests |mojom.parse.lexer.Lexer|."""
-
-  def __init__(self, *args, **kwargs):
-    unittest.TestCase.__init__(self, *args, **kwargs)
-    # Clone all lexer instances from this one, since making a lexer is slow.
-    self._zygote_lexer = lex.lex(mojom.parse.lexer.Lexer("my_file.mojom"))
-
-  def testValidKeywords(self):
-    """Tests valid keywords."""
-    self.assertEquals(self._SingleTokenForInput("handle"),
-                      _MakeLexTokenForKeyword("handle"))
-    self.assertEquals(self._SingleTokenForInput("import"),
-                      _MakeLexTokenForKeyword("import"))
-    self.assertEquals(self._SingleTokenForInput("module"),
-                      _MakeLexTokenForKeyword("module"))
-    self.assertEquals(self._SingleTokenForInput("struct"),
-                      _MakeLexTokenForKeyword("struct"))
-    self.assertEquals(self._SingleTokenForInput("union"),
-                      _MakeLexTokenForKeyword("union"))
-    self.assertEquals(self._SingleTokenForInput("interface"),
-                      _MakeLexTokenForKeyword("interface"))
-    self.assertEquals(self._SingleTokenForInput("enum"),
-                      _MakeLexTokenForKeyword("enum"))
-    self.assertEquals(self._SingleTokenForInput("const"),
-                      _MakeLexTokenForKeyword("const"))
-    self.assertEquals(self._SingleTokenForInput("true"),
-                      _MakeLexTokenForKeyword("true"))
-    self.assertEquals(self._SingleTokenForInput("false"),
-                      _MakeLexTokenForKeyword("false"))
-    self.assertEquals(self._SingleTokenForInput("default"),
-                      _MakeLexTokenForKeyword("default"))
-    self.assertEquals(self._SingleTokenForInput("array"),
-                      _MakeLexTokenForKeyword("array"))
-    self.assertEquals(self._SingleTokenForInput("map"),
-                      _MakeLexTokenForKeyword("map"))
-    self.assertEquals(self._SingleTokenForInput("associated"),
-                      _MakeLexTokenForKeyword("associated"))
-
-  def testValidIdentifiers(self):
-    """Tests identifiers."""
-    self.assertEquals(self._SingleTokenForInput("abcd"),
-                      _MakeLexToken("NAME", "abcd"))
-    self.assertEquals(self._SingleTokenForInput("AbC_d012_"),
-                      _MakeLexToken("NAME", "AbC_d012_"))
-    self.assertEquals(self._SingleTokenForInput("_0123"),
-                      _MakeLexToken("NAME", "_0123"))
-
-  def testInvalidIdentifiers(self):
-    with self.assertRaisesRegexp(
-        mojom.parse.lexer.LexError,
-        r"^my_file\.mojom:1: Error: Illegal character '\$'$"):
-      self._TokensForInput("$abc")
-    with self.assertRaisesRegexp(
-        mojom.parse.lexer.LexError,
-        r"^my_file\.mojom:1: Error: Illegal character '\$'$"):
-      self._TokensForInput("a$bc")
-
-  def testDecimalIntegerConstants(self):
-    self.assertEquals(self._SingleTokenForInput("0"),
-                      _MakeLexToken("INT_CONST_DEC", "0"))
-    self.assertEquals(self._SingleTokenForInput("1"),
-                      _MakeLexToken("INT_CONST_DEC", "1"))
-    self.assertEquals(self._SingleTokenForInput("123"),
-                      _MakeLexToken("INT_CONST_DEC", "123"))
-    self.assertEquals(self._SingleTokenForInput("10"),
-                      _MakeLexToken("INT_CONST_DEC", "10"))
-
-  def testValidTokens(self):
-    """Tests valid tokens (which aren't tested elsewhere)."""
-    # Keywords tested in |testValidKeywords|.
-    # NAME tested in |testValidIdentifiers|.
-    self.assertEquals(self._SingleTokenForInput("@123"),
-                      _MakeLexToken("ORDINAL", "@123"))
-    self.assertEquals(self._SingleTokenForInput("456"),
-                      _MakeLexToken("INT_CONST_DEC", "456"))
-    self.assertEquals(self._SingleTokenForInput("0x01aB2eF3"),
-                      _MakeLexToken("INT_CONST_HEX", "0x01aB2eF3"))
-    self.assertEquals(self._SingleTokenForInput("123.456"),
-                      _MakeLexToken("FLOAT_CONST", "123.456"))
-    self.assertEquals(self._SingleTokenForInput("\"hello\""),
-                      _MakeLexToken("STRING_LITERAL", "\"hello\""))
-    self.assertEquals(self._SingleTokenForInput("+"),
-                      _MakeLexToken("PLUS", "+"))
-    self.assertEquals(self._SingleTokenForInput("-"),
-                      _MakeLexToken("MINUS", "-"))
-    self.assertEquals(self._SingleTokenForInput("&"),
-                      _MakeLexToken("AMP", "&"))
-    self.assertEquals(self._SingleTokenForInput("?"),
-                      _MakeLexToken("QSTN", "?"))
-    self.assertEquals(self._SingleTokenForInput("="),
-                      _MakeLexToken("EQUALS", "="))
-    self.assertEquals(self._SingleTokenForInput("=>"),
-                      _MakeLexToken("RESPONSE", "=>"))
-    self.assertEquals(self._SingleTokenForInput("("),
-                      _MakeLexToken("LPAREN", "("))
-    self.assertEquals(self._SingleTokenForInput(")"),
-                      _MakeLexToken("RPAREN", ")"))
-    self.assertEquals(self._SingleTokenForInput("["),
-                      _MakeLexToken("LBRACKET", "["))
-    self.assertEquals(self._SingleTokenForInput("]"),
-                      _MakeLexToken("RBRACKET", "]"))
-    self.assertEquals(self._SingleTokenForInput("{"),
-                      _MakeLexToken("LBRACE", "{"))
-    self.assertEquals(self._SingleTokenForInput("}"),
-                      _MakeLexToken("RBRACE", "}"))
-    self.assertEquals(self._SingleTokenForInput("<"),
-                      _MakeLexToken("LANGLE", "<"))
-    self.assertEquals(self._SingleTokenForInput(">"),
-                      _MakeLexToken("RANGLE", ">"))
-    self.assertEquals(self._SingleTokenForInput(";"),
-                      _MakeLexToken("SEMI", ";"))
-    self.assertEquals(self._SingleTokenForInput(","),
-                      _MakeLexToken("COMMA", ","))
-    self.assertEquals(self._SingleTokenForInput("."),
-                      _MakeLexToken("DOT", "."))
-
-  def _TokensForInput(self, input_string):
-    """Gets a list of tokens for the given input string."""
-    lexer = self._zygote_lexer.clone()
-    lexer.input(input_string)
-    rv = []
-    while True:
-      tok = lexer.token()
-      if not tok:
-        return rv
-      rv.append(tok)
-
-  def _SingleTokenForInput(self, input_string):
-    """Gets the single token for the given input string. (Raises an exception if
-    the input string does not result in exactly one token.)"""
-    toks = self._TokensForInput(input_string)
-    assert len(toks) == 1
-    return toks[0]
-
-
-if __name__ == "__main__":
-  unittest.main()
diff --git a/mojo/public/tools/bindings/pylib/mojom_tests/parse/parser_unittest.py b/mojo/public/tools/bindings/pylib/mojom_tests/parse/parser_unittest.py
deleted file mode 100644
index 3f4ca87..0000000
--- a/mojo/public/tools/bindings/pylib/mojom_tests/parse/parser_unittest.py
+++ /dev/null
@@ -1,1497 +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.
-
-import imp
-import os.path
-import sys
-import unittest
-
-def _GetDirAbove(dirname):
-  """Returns the directory "above" this file containing |dirname| (which must
-  also be "above" this file)."""
-  path = os.path.abspath(__file__)
-  while True:
-    path, tail = os.path.split(path)
-    assert tail
-    if tail == dirname:
-      return path
-
-try:
-  imp.find_module("mojom")
-except ImportError:
-  sys.path.append(os.path.join(_GetDirAbove("pylib"), "pylib"))
-import mojom.parse.ast as ast
-import mojom.parse.lexer as lexer
-import mojom.parse.parser as parser
-
-
-class ParserTest(unittest.TestCase):
-  """Tests |parser.Parse()|."""
-
-  def testTrivialValidSource(self):
-    """Tests a trivial, but valid, .mojom source."""
-
-    source = """\
-        // This is a comment.
-
-        module my_module;
-        """
-    expected = ast.Mojom(
-        ast.Module(('IDENTIFIER', 'my_module'), None),
-        ast.ImportList(),
-        [])
-    self.assertEquals(parser.Parse(source, "my_file.mojom"), expected)
-
-  def testSourceWithCrLfs(self):
-    """Tests a .mojom source with CR-LFs instead of LFs."""
-
-    source = "// This is a comment.\r\n\r\nmodule my_module;\r\n"
-    expected = ast.Mojom(
-        ast.Module(('IDENTIFIER', 'my_module'), None),
-        ast.ImportList(),
-        [])
-    self.assertEquals(parser.Parse(source, "my_file.mojom"), expected)
-
-  def testUnexpectedEOF(self):
-    """Tests a "truncated" .mojom source."""
-
-    source = """\
-        // This is a comment.
-
-        module my_module
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom: Error: Unexpected end of file$"):
-      parser.Parse(source, "my_file.mojom")
-
-  def testCommentLineNumbers(self):
-    """Tests that line numbers are correctly tracked when comments are
-    present."""
-
-    source1 = """\
-        // Isolated C++-style comments.
-
-        // Foo.
-        asdf1
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:4: Error: Unexpected 'asdf1':\n *asdf1$"):
-      parser.Parse(source1, "my_file.mojom")
-
-    source2 = """\
-        // Consecutive C++-style comments.
-        // Foo.
-        // Bar.
-
-        struct Yada {  // Baz.
-                       // Quux.
-          int32 x;
-        };
-
-        asdf2
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:10: Error: Unexpected 'asdf2':\n *asdf2$"):
-      parser.Parse(source2, "my_file.mojom")
-
-    source3 = """\
-        /* Single-line C-style comments. */
-        /* Foobar. */
-
-        /* Baz. */
-        asdf3
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:5: Error: Unexpected 'asdf3':\n *asdf3$"):
-      parser.Parse(source3, "my_file.mojom")
-
-    source4 = """\
-        /* Multi-line C-style comments.
-        */
-        /*
-        Foo.
-        Bar.
-        */
-
-        /* Baz
-           Quux. */
-        asdf4
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:10: Error: Unexpected 'asdf4':\n *asdf4$"):
-      parser.Parse(source4, "my_file.mojom")
-
-
-  def testSimpleStruct(self):
-    """Tests a simple .mojom source that just defines a struct."""
-
-    source = """\
-        module my_module;
-
-        struct MyStruct {
-          int32 a;
-          double b;
-        };
-        """
-    expected = ast.Mojom(
-        ast.Module(('IDENTIFIER', 'my_module'), None),
-        ast.ImportList(),
-        [ast.Struct(
-            'MyStruct',
-            None,
-            ast.StructBody(
-                [ast.StructField('a', None, None, 'int32', None),
-                 ast.StructField('b', None, None, 'double', None)]))])
-    self.assertEquals(parser.Parse(source, "my_file.mojom"), expected)
-
-  def testSimpleStructWithoutModule(self):
-    """Tests a simple struct without an explict module statement."""
-
-    source = """\
-        struct MyStruct {
-          int32 a;
-          double b;
-        };
-        """
-    expected = ast.Mojom(
-        None,
-        ast.ImportList(),
-        [ast.Struct(
-            'MyStruct',
-            None,
-            ast.StructBody(
-                [ast.StructField('a', None, None, 'int32', None),
-                 ast.StructField('b', None, None, 'double', None)]))])
-    self.assertEquals(parser.Parse(source, "my_file.mojom"), expected)
-
-  def testValidStructDefinitions(self):
-    """Tests all types of definitions that can occur in a struct."""
-
-    source = """\
-        struct MyStruct {
-          enum MyEnum { VALUE };
-          const double kMyConst = 1.23;
-          int32 a;
-          SomeOtherStruct b;  // Invalidity detected at another stage.
-        };
-        """
-    expected = ast.Mojom(
-        None,
-        ast.ImportList(),
-        [ast.Struct(
-            'MyStruct',
-            None,
-            ast.StructBody(
-                [ast.Enum('MyEnum',
-                          None,
-                          ast.EnumValueList(
-                              ast.EnumValue('VALUE', None, None))),
-                 ast.Const('kMyConst', 'double', '1.23'),
-                 ast.StructField('a', None, None, 'int32', None),
-                 ast.StructField('b', None, None, 'SomeOtherStruct', None)]))])
-    self.assertEquals(parser.Parse(source, "my_file.mojom"), expected)
-
-  def testInvalidStructDefinitions(self):
-    """Tests that definitions that aren't allowed in a struct are correctly
-    detected."""
-
-    source1 = """\
-        struct MyStruct {
-          MyMethod(int32 a);
-        };
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:2: Error: Unexpected '\(':\n"
-            r" *MyMethod\(int32 a\);$"):
-      parser.Parse(source1, "my_file.mojom")
-
-    source2 = """\
-        struct MyStruct {
-          struct MyInnerStruct {
-            int32 a;
-          };
-        };
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:2: Error: Unexpected 'struct':\n"
-            r" *struct MyInnerStruct {$"):
-      parser.Parse(source2, "my_file.mojom")
-
-    source3 = """\
-        struct MyStruct {
-          interface MyInterface {
-            MyMethod(int32 a);
-          };
-        };
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:2: Error: Unexpected 'interface':\n"
-            r" *interface MyInterface {$"):
-      parser.Parse(source3, "my_file.mojom")
-
-  def testMissingModuleName(self):
-    """Tests an (invalid) .mojom with a missing module name."""
-
-    source1 = """\
-        // Missing module name.
-        module ;
-        struct MyStruct {
-          int32 a;
-        };
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:2: Error: Unexpected ';':\n *module ;$"):
-      parser.Parse(source1, "my_file.mojom")
-
-    # Another similar case, but make sure that line-number tracking/reporting
-    # is correct.
-    source2 = """\
-        module
-        // This line intentionally left unblank.
-
-        struct MyStruct {
-          int32 a;
-        };
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:4: Error: Unexpected 'struct':\n"
-            r" *struct MyStruct {$"):
-      parser.Parse(source2, "my_file.mojom")
-
-  def testMultipleModuleStatements(self):
-    """Tests an (invalid) .mojom with multiple module statements."""
-
-    source = """\
-        module foo;
-        module bar;
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:2: Error: Multiple \"module\" statements not "
-            r"allowed:\n *module bar;$"):
-      parser.Parse(source, "my_file.mojom")
-
-  def testModuleStatementAfterImport(self):
-    """Tests an (invalid) .mojom with a module statement after an import."""
-
-    source = """\
-        import "foo.mojom";
-        module foo;
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:2: Error: \"module\" statements must precede imports "
-            r"and definitions:\n *module foo;$"):
-      parser.Parse(source, "my_file.mojom")
-
-  def testModuleStatementAfterDefinition(self):
-    """Tests an (invalid) .mojom with a module statement after a definition."""
-
-    source = """\
-        struct MyStruct {
-          int32 a;
-        };
-        module foo;
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:4: Error: \"module\" statements must precede imports "
-            r"and definitions:\n *module foo;$"):
-      parser.Parse(source, "my_file.mojom")
-
-  def testImportStatementAfterDefinition(self):
-    """Tests an (invalid) .mojom with an import statement after a definition."""
-
-    source = """\
-        struct MyStruct {
-          int32 a;
-        };
-        import "foo.mojom";
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:4: Error: \"import\" statements must precede "
-            r"definitions:\n *import \"foo.mojom\";$"):
-      parser.Parse(source, "my_file.mojom")
-
-  def testEnums(self):
-    """Tests that enum statements are correctly parsed."""
-
-    source = """\
-        module my_module;
-        enum MyEnum1 { VALUE1, VALUE2 };  // No trailing comma.
-        enum MyEnum2 {
-          VALUE1 = -1,
-          VALUE2 = 0,
-          VALUE3 = + 987,  // Check that space is allowed.
-          VALUE4 = 0xAF12,
-          VALUE5 = -0x09bcd,
-          VALUE6 = VALUE5,
-          VALUE7,  // Leave trailing comma.
-        };
-        """
-    expected = ast.Mojom(
-        ast.Module(('IDENTIFIER', 'my_module'), None),
-        ast.ImportList(),
-        [ast.Enum(
-            'MyEnum1',
-            None,
-            ast.EnumValueList([ast.EnumValue('VALUE1', None, None),
-                               ast.EnumValue('VALUE2', None, None)])),
-         ast.Enum(
-            'MyEnum2',
-            None,
-            ast.EnumValueList([ast.EnumValue('VALUE1', None, '-1'),
-                               ast.EnumValue('VALUE2', None, '0'),
-                               ast.EnumValue('VALUE3', None, '+987'),
-                               ast.EnumValue('VALUE4', None, '0xAF12'),
-                               ast.EnumValue('VALUE5', None, '-0x09bcd'),
-                               ast.EnumValue('VALUE6', None, ('IDENTIFIER',
-                                                        'VALUE5')),
-                               ast.EnumValue('VALUE7', None, None)]))])
-    self.assertEquals(parser.Parse(source, "my_file.mojom"), expected)
-
-  def testInvalidEnumInitializers(self):
-    """Tests that invalid enum initializers are correctly detected."""
-
-    # No values.
-    source1 = """\
-        enum MyEnum {
-        };
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:2: Error: Unexpected '}':\n"
-            r" *};$"):
-      parser.Parse(source1, "my_file.mojom")
-
-    # Floating point value.
-    source2 = "enum MyEnum { VALUE = 0.123 };"
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:1: Error: Unexpected '0\.123':\n"
-            r"enum MyEnum { VALUE = 0\.123 };$"):
-      parser.Parse(source2, "my_file.mojom")
-
-    # Boolean value.
-    source2 = "enum MyEnum { VALUE = true };"
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:1: Error: Unexpected 'true':\n"
-            r"enum MyEnum { VALUE = true };$"):
-      parser.Parse(source2, "my_file.mojom")
-
-  def testConsts(self):
-    """Tests some constants and struct members initialized with them."""
-
-    source = """\
-        module my_module;
-
-        struct MyStruct {
-          const int8 kNumber = -1;
-          int8 number@0 = kNumber;
-        };
-        """
-    expected = ast.Mojom(
-        ast.Module(('IDENTIFIER', 'my_module'), None),
-        ast.ImportList(),
-        [ast.Struct(
-            'MyStruct', None,
-            ast.StructBody(
-                [ast.Const('kNumber', 'int8', '-1'),
-                 ast.StructField('number', None, ast.Ordinal(0), 'int8',
-                                 ('IDENTIFIER', 'kNumber'))]))])
-    self.assertEquals(parser.Parse(source, "my_file.mojom"), expected)
-
-  def testNoConditionals(self):
-    """Tests that ?: is not allowed."""
-
-    source = """\
-        module my_module;
-
-        enum MyEnum {
-          MY_ENUM_1 = 1 ? 2 : 3
-        };
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:4: Error: Unexpected '\?':\n"
-            r" *MY_ENUM_1 = 1 \? 2 : 3$"):
-      parser.Parse(source, "my_file.mojom")
-
-  def testSimpleOrdinals(self):
-    """Tests that (valid) ordinal values are scanned correctly."""
-
-    source = """\
-        module my_module;
-
-        // This isn't actually valid .mojom, but the problem (missing ordinals)
-        // should be handled at a different level.
-        struct MyStruct {
-          int32 a0@0;
-          int32 a1@1;
-          int32 a2@2;
-          int32 a9@9;
-          int32 a10 @10;
-          int32 a11 @11;
-          int32 a29 @29;
-          int32 a1234567890 @1234567890;
-        };
-        """
-    expected = ast.Mojom(
-        ast.Module(('IDENTIFIER', 'my_module'), None),
-        ast.ImportList(),
-        [ast.Struct(
-            'MyStruct',
-            None,
-            ast.StructBody(
-                [ast.StructField('a0', None, ast.Ordinal(0), 'int32', None),
-                 ast.StructField('a1', None, ast.Ordinal(1), 'int32', None),
-                 ast.StructField('a2', None, ast.Ordinal(2), 'int32', None),
-                 ast.StructField('a9', None, ast.Ordinal(9), 'int32', None),
-                 ast.StructField('a10', None, ast.Ordinal(10), 'int32', None),
-                 ast.StructField('a11', None, ast.Ordinal(11), 'int32', None),
-                 ast.StructField('a29', None, ast.Ordinal(29), 'int32', None),
-                 ast.StructField('a1234567890', None, ast.Ordinal(1234567890),
-                                 'int32', None)]))])
-    self.assertEquals(parser.Parse(source, "my_file.mojom"), expected)
-
-  def testInvalidOrdinals(self):
-    """Tests that (lexically) invalid ordinals are correctly detected."""
-
-    source1 = """\
-        module my_module;
-
-        struct MyStruct {
-          int32 a_missing@;
-        };
-        """
-    with self.assertRaisesRegexp(
-        lexer.LexError,
-        r"^my_file\.mojom:4: Error: Missing ordinal value$"):
-      parser.Parse(source1, "my_file.mojom")
-
-    source2 = """\
-        module my_module;
-
-        struct MyStruct {
-          int32 a_octal@01;
-        };
-        """
-    with self.assertRaisesRegexp(
-        lexer.LexError,
-        r"^my_file\.mojom:4: Error: "
-            r"Octal and hexadecimal ordinal values not allowed$"):
-      parser.Parse(source2, "my_file.mojom")
-
-    source3 = """\
-        module my_module; struct MyStruct { int32 a_invalid_octal@08; };
-        """
-    with self.assertRaisesRegexp(
-        lexer.LexError,
-        r"^my_file\.mojom:1: Error: "
-            r"Octal and hexadecimal ordinal values not allowed$"):
-      parser.Parse(source3, "my_file.mojom")
-
-    source4 = "module my_module; struct MyStruct { int32 a_hex@0x1aB9; };"
-    with self.assertRaisesRegexp(
-        lexer.LexError,
-        r"^my_file\.mojom:1: Error: "
-            r"Octal and hexadecimal ordinal values not allowed$"):
-      parser.Parse(source4, "my_file.mojom")
-
-    source5 = "module my_module; struct MyStruct { int32 a_hex@0X0; };"
-    with self.assertRaisesRegexp(
-        lexer.LexError,
-        r"^my_file\.mojom:1: Error: "
-            r"Octal and hexadecimal ordinal values not allowed$"):
-      parser.Parse(source5, "my_file.mojom")
-
-    source6 = """\
-        struct MyStruct {
-          int32 a_too_big@999999999999;
-        };
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:2: Error: "
-            r"Ordinal value 999999999999 too large:\n"
-            r" *int32 a_too_big@999999999999;$"):
-      parser.Parse(source6, "my_file.mojom")
-
-  def testNestedNamespace(self):
-    """Tests that "nested" namespaces work."""
-
-    source = """\
-        module my.mod;
-
-        struct MyStruct {
-          int32 a;
-        };
-        """
-    expected = ast.Mojom(
-        ast.Module(('IDENTIFIER', 'my.mod'), None),
-        ast.ImportList(),
-        [ast.Struct(
-            'MyStruct',
-            None,
-            ast.StructBody(ast.StructField('a', None, None, 'int32', None)))])
-    self.assertEquals(parser.Parse(source, "my_file.mojom"), expected)
-
-  def testValidHandleTypes(self):
-    """Tests (valid) handle types."""
-
-    source = """\
-        struct MyStruct {
-          handle a;
-          handle<data_pipe_consumer> b;
-          handle <data_pipe_producer> c;
-          handle < message_pipe > d;
-          handle
-            < shared_buffer
-            > e;
-        };
-        """
-    expected = ast.Mojom(
-        None,
-        ast.ImportList(),
-        [ast.Struct(
-            'MyStruct',
-            None,
-            ast.StructBody(
-                [ast.StructField('a', None, None, 'handle', None),
-                 ast.StructField('b', None, None, 'handle<data_pipe_consumer>',
-                                 None),
-                 ast.StructField('c', None, None, 'handle<data_pipe_producer>',
-                                 None),
-                 ast.StructField('d', None, None, 'handle<message_pipe>', None),
-                 ast.StructField('e', None, None, 'handle<shared_buffer>',
-                                 None)]))])
-    self.assertEquals(parser.Parse(source, "my_file.mojom"), expected)
-
-  def testInvalidHandleType(self):
-    """Tests an invalid (unknown) handle type."""
-
-    source = """\
-        struct MyStruct {
-          handle<wtf_is_this> foo;
-        };
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:2: Error: "
-            r"Invalid handle type 'wtf_is_this':\n"
-            r" *handle<wtf_is_this> foo;$"):
-      parser.Parse(source, "my_file.mojom")
-
-  def testValidDefaultValues(self):
-    """Tests default values that are valid (to the parser)."""
-
-    source = """\
-        struct MyStruct {
-          int16 a0 = 0;
-          uint16 a1 = 0x0;
-          uint16 a2 = 0x00;
-          uint16 a3 = 0x01;
-          uint16 a4 = 0xcd;
-          int32 a5 = 12345;
-          int64 a6 = -12345;
-          int64 a7 = +12345;
-          uint32 a8 = 0x12cd3;
-          uint32 a9 = -0x12cD3;
-          uint32 a10 = +0x12CD3;
-          bool a11 = true;
-          bool a12 = false;
-          float a13 = 1.2345;
-          float a14 = -1.2345;
-          float a15 = +1.2345;
-          float a16 = 123.;
-          float a17 = .123;
-          double a18 = 1.23E10;
-          double a19 = 1.E-10;
-          double a20 = .5E+10;
-          double a21 = -1.23E10;
-          double a22 = +.123E10;
-        };
-        """
-    expected = ast.Mojom(
-        None,
-        ast.ImportList(),
-        [ast.Struct(
-            'MyStruct',
-            None,
-            ast.StructBody(
-                [ast.StructField('a0', None, None, 'int16', '0'),
-                 ast.StructField('a1', None, None, 'uint16', '0x0'),
-                 ast.StructField('a2', None, None, 'uint16', '0x00'),
-                 ast.StructField('a3', None, None, 'uint16', '0x01'),
-                 ast.StructField('a4', None, None, 'uint16', '0xcd'),
-                 ast.StructField('a5' , None, None, 'int32', '12345'),
-                 ast.StructField('a6', None, None, 'int64', '-12345'),
-                 ast.StructField('a7', None, None, 'int64', '+12345'),
-                 ast.StructField('a8', None, None, 'uint32', '0x12cd3'),
-                 ast.StructField('a9', None, None, 'uint32', '-0x12cD3'),
-                 ast.StructField('a10', None, None, 'uint32', '+0x12CD3'),
-                 ast.StructField('a11', None, None, 'bool', 'true'),
-                 ast.StructField('a12', None, None, 'bool', 'false'),
-                 ast.StructField('a13', None, None, 'float', '1.2345'),
-                 ast.StructField('a14', None, None, 'float', '-1.2345'),
-                 ast.StructField('a15', None, None, 'float', '+1.2345'),
-                 ast.StructField('a16', None, None, 'float', '123.'),
-                 ast.StructField('a17', None, None, 'float', '.123'),
-                 ast.StructField('a18', None, None, 'double', '1.23E10'),
-                 ast.StructField('a19', None, None, 'double', '1.E-10'),
-                 ast.StructField('a20', None, None, 'double', '.5E+10'),
-                 ast.StructField('a21', None, None, 'double', '-1.23E10'),
-                 ast.StructField('a22', None, None, 'double', '+.123E10')]))])
-    self.assertEquals(parser.Parse(source, "my_file.mojom"), expected)
-
-  def testValidFixedSizeArray(self):
-    """Tests parsing a fixed size array."""
-
-    source = """\
-        struct MyStruct {
-          array<int32> normal_array;
-          array<int32, 1> fixed_size_array_one_entry;
-          array<int32, 10> fixed_size_array_ten_entries;
-          array<array<array<int32, 1>>, 2> nested_arrays;
-        };
-        """
-    expected = ast.Mojom(
-        None,
-        ast.ImportList(),
-        [ast.Struct(
-            'MyStruct',
-            None,
-            ast.StructBody(
-                [ast.StructField('normal_array', None, None, 'int32[]', None),
-                 ast.StructField('fixed_size_array_one_entry', None, None,
-                                 'int32[1]', None),
-                 ast.StructField('fixed_size_array_ten_entries', None, None,
-                                 'int32[10]', None),
-                 ast.StructField('nested_arrays', None, None,
-                                 'int32[1][][2]', None)]))])
-    self.assertEquals(parser.Parse(source, "my_file.mojom"), expected)
-
-  def testValidNestedArray(self):
-    """Tests parsing a nested array."""
-
-    source = "struct MyStruct { array<array<int32>> nested_array; };"
-    expected = ast.Mojom(
-        None,
-        ast.ImportList(),
-        [ast.Struct(
-            'MyStruct',
-            None,
-            ast.StructBody(
-                ast.StructField('nested_array', None, None, 'int32[][]',
-                                None)))])
-    self.assertEquals(parser.Parse(source, "my_file.mojom"), expected)
-
-  def testInvalidFixedArraySize(self):
-    """Tests that invalid fixed array bounds are correctly detected."""
-
-    source1 = """\
-        struct MyStruct {
-          array<int32, 0> zero_size_array;
-        };
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:2: Error: Fixed array size 0 invalid:\n"
-            r" *array<int32, 0> zero_size_array;$"):
-      parser.Parse(source1, "my_file.mojom")
-
-    source2 = """\
-        struct MyStruct {
-          array<int32, 999999999999> too_big_array;
-        };
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:2: Error: Fixed array size 999999999999 invalid:\n"
-            r" *array<int32, 999999999999> too_big_array;$"):
-      parser.Parse(source2, "my_file.mojom")
-
-    source3 = """\
-        struct MyStruct {
-          array<int32, abcdefg> not_a_number;
-        };
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:2: Error: Unexpected 'abcdefg':\n"
-        r" *array<int32, abcdefg> not_a_number;"):
-      parser.Parse(source3, "my_file.mojom")
-
-  def testValidAssociativeArrays(self):
-    """Tests that we can parse valid associative array structures."""
-
-    source1 = "struct MyStruct { map<string, uint8> data; };"
-    expected1 = ast.Mojom(
-        None,
-        ast.ImportList(),
-        [ast.Struct(
-            'MyStruct',
-            None,
-            ast.StructBody(
-                [ast.StructField('data', None, None, 'uint8{string}', None)]))])
-    self.assertEquals(parser.Parse(source1, "my_file.mojom"), expected1)
-
-    source2 = "interface MyInterface { MyMethod(map<string, uint8> a); };"
-    expected2 = ast.Mojom(
-        None,
-        ast.ImportList(),
-        [ast.Interface(
-            'MyInterface',
-            None,
-            ast.InterfaceBody(
-                ast.Method(
-                    'MyMethod',
-                    None,
-                    None,
-                    ast.ParameterList(
-                        ast.Parameter('a', None, None, 'uint8{string}')),
-                    None)))])
-    self.assertEquals(parser.Parse(source2, "my_file.mojom"), expected2)
-
-    source3 = "struct MyStruct { map<string, array<uint8>> data; };"
-    expected3 = ast.Mojom(
-        None,
-        ast.ImportList(),
-        [ast.Struct(
-            'MyStruct',
-            None,
-            ast.StructBody(
-                [ast.StructField('data', None, None, 'uint8[]{string}',
-                                 None)]))])
-    self.assertEquals(parser.Parse(source3, "my_file.mojom"), expected3)
-
-  def testValidMethod(self):
-    """Tests parsing method declarations."""
-
-    source1 = "interface MyInterface { MyMethod(int32 a); };"
-    expected1 = ast.Mojom(
-        None,
-        ast.ImportList(),
-        [ast.Interface(
-            'MyInterface',
-            None,
-            ast.InterfaceBody(
-                ast.Method(
-                    'MyMethod',
-                    None,
-                    None,
-                    ast.ParameterList(ast.Parameter('a', None, None, 'int32')),
-                    None)))])
-    self.assertEquals(parser.Parse(source1, "my_file.mojom"), expected1)
-
-    source2 = """\
-        interface MyInterface {
-          MyMethod1@0(int32 a@0, int64 b@1);
-          MyMethod2@1() => ();
-        };
-        """
-    expected2 = ast.Mojom(
-        None,
-        ast.ImportList(),
-        [ast.Interface(
-            'MyInterface',
-            None,
-            ast.InterfaceBody(
-                [ast.Method(
-                    'MyMethod1',
-                    None,
-                    ast.Ordinal(0),
-                    ast.ParameterList([ast.Parameter('a', None, ast.Ordinal(0),
-                                                     'int32'),
-                                       ast.Parameter('b', None, ast.Ordinal(1),
-                                                     'int64')]),
-                    None),
-                  ast.Method(
-                    'MyMethod2',
-                    None,
-                    ast.Ordinal(1),
-                    ast.ParameterList(),
-                    ast.ParameterList())]))])
-    self.assertEquals(parser.Parse(source2, "my_file.mojom"), expected2)
-
-    source3 = """\
-        interface MyInterface {
-          MyMethod(string a) => (int32 a, bool b);
-        };
-        """
-    expected3 = ast.Mojom(
-        None,
-        ast.ImportList(),
-        [ast.Interface(
-            'MyInterface',
-            None,
-            ast.InterfaceBody(
-                ast.Method(
-                    'MyMethod',
-                    None,
-                    None,
-                    ast.ParameterList(ast.Parameter('a', None, None, 'string')),
-                    ast.ParameterList([ast.Parameter('a', None, None, 'int32'),
-                                       ast.Parameter('b', None, None,
-                                                     'bool')]))))])
-    self.assertEquals(parser.Parse(source3, "my_file.mojom"), expected3)
-
-  def testInvalidMethods(self):
-    """Tests that invalid method declarations are correctly detected."""
-
-    # No trailing commas.
-    source1 = """\
-        interface MyInterface {
-          MyMethod(string a,);
-        };
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:2: Error: Unexpected '\)':\n"
-            r" *MyMethod\(string a,\);$"):
-      parser.Parse(source1, "my_file.mojom")
-
-    # No leading commas.
-    source2 = """\
-        interface MyInterface {
-          MyMethod(, string a);
-        };
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:2: Error: Unexpected ',':\n"
-            r" *MyMethod\(, string a\);$"):
-      parser.Parse(source2, "my_file.mojom")
-
-  def testValidInterfaceDefinitions(self):
-    """Tests all types of definitions that can occur in an interface."""
-
-    source = """\
-        interface MyInterface {
-          enum MyEnum { VALUE };
-          const int32 kMyConst = 123;
-          MyMethod(int32 x) => (MyEnum y);
-        };
-        """
-    expected = ast.Mojom(
-        None,
-        ast.ImportList(),
-        [ast.Interface(
-            'MyInterface',
-            None,
-            ast.InterfaceBody(
-                [ast.Enum('MyEnum',
-                          None,
-                          ast.EnumValueList(
-                              ast.EnumValue('VALUE', None, None))),
-                 ast.Const('kMyConst', 'int32', '123'),
-                 ast.Method(
-                    'MyMethod',
-                    None,
-                    None,
-                    ast.ParameterList(ast.Parameter('x', None, None, 'int32')),
-                    ast.ParameterList(ast.Parameter('y', None, None,
-                                                    'MyEnum')))]))])
-    self.assertEquals(parser.Parse(source, "my_file.mojom"), expected)
-
-  def testInvalidInterfaceDefinitions(self):
-    """Tests that definitions that aren't allowed in an interface are correctly
-    detected."""
-
-    source1 = """\
-        interface MyInterface {
-          struct MyStruct {
-            int32 a;
-          };
-        };
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:2: Error: Unexpected 'struct':\n"
-            r" *struct MyStruct {$"):
-      parser.Parse(source1, "my_file.mojom")
-
-    source2 = """\
-        interface MyInterface {
-          interface MyInnerInterface {
-            MyMethod(int32 x);
-          };
-        };
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:2: Error: Unexpected 'interface':\n"
-            r" *interface MyInnerInterface {$"):
-      parser.Parse(source2, "my_file.mojom")
-
-    source3 = """\
-        interface MyInterface {
-          int32 my_field;
-        };
-        """
-    # The parser thinks that "int32" is a plausible name for a method, so it's
-    # "my_field" that gives it away.
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:2: Error: Unexpected 'my_field':\n"
-            r" *int32 my_field;$"):
-      parser.Parse(source3, "my_file.mojom")
-
-  def testValidAttributes(self):
-    """Tests parsing attributes (and attribute lists)."""
-
-    # Note: We use structs because they have (optional) attribute lists.
-
-    # Empty attribute list.
-    source1 = "[] struct MyStruct {};"
-    expected1 = ast.Mojom(
-        None,
-        ast.ImportList(),
-        [ast.Struct('MyStruct', ast.AttributeList(), ast.StructBody())])
-    self.assertEquals(parser.Parse(source1, "my_file.mojom"), expected1)
-
-    # One-element attribute list, with name value.
-    source2 = "[MyAttribute=MyName] struct MyStruct {};"
-    expected2 = ast.Mojom(
-        None,
-        ast.ImportList(),
-        [ast.Struct(
-            'MyStruct',
-            ast.AttributeList(ast.Attribute("MyAttribute", "MyName")),
-            ast.StructBody())])
-    self.assertEquals(parser.Parse(source2, "my_file.mojom"), expected2)
-
-    # Two-element attribute list, with one string value and one integer value.
-    source3 = "[MyAttribute1 = \"hello\", MyAttribute2 = 5] struct MyStruct {};"
-    expected3 = ast.Mojom(
-        None,
-        ast.ImportList(),
-        [ast.Struct(
-            'MyStruct',
-            ast.AttributeList([ast.Attribute("MyAttribute1", "hello"),
-                               ast.Attribute("MyAttribute2", 5)]),
-            ast.StructBody())])
-    self.assertEquals(parser.Parse(source3, "my_file.mojom"), expected3)
-
-    # Various places that attribute list is allowed.
-    source4 = """\
-        [Attr0=0] module my_module;
-
-        [Attr1=1] struct MyStruct {
-          [Attr2=2] int32 a;
-        };
-        [Attr3=3] union MyUnion {
-          [Attr4=4] int32 a;
-        };
-        [Attr5=5] enum MyEnum {
-          [Attr6=6] a
-        };
-        [Attr7=7] interface MyInterface {
-          [Attr8=8] MyMethod([Attr9=9] int32 a) => ([Attr10=10] bool b);
-        };
-        """
-    expected4 = ast.Mojom(
-        ast.Module(('IDENTIFIER', 'my_module'),
-                   ast.AttributeList([ast.Attribute("Attr0", 0)])),
-        ast.ImportList(),
-        [ast.Struct(
-             'MyStruct',
-             ast.AttributeList(ast.Attribute("Attr1", 1)),
-             ast.StructBody(
-                 ast.StructField(
-                     'a', ast.AttributeList([ast.Attribute("Attr2", 2)]),
-                     None, 'int32', None))),
-         ast.Union(
-             'MyUnion',
-             ast.AttributeList(ast.Attribute("Attr3", 3)),
-             ast.UnionBody(
-                 ast.UnionField(
-                     'a', ast.AttributeList([ast.Attribute("Attr4", 4)]), None,
-                     'int32'))),
-         ast.Enum(
-             'MyEnum',
-             ast.AttributeList(ast.Attribute("Attr5", 5)),
-             ast.EnumValueList(
-                 ast.EnumValue(
-                     'VALUE', ast.AttributeList([ast.Attribute("Attr6", 6)]),
-                     None))),
-         ast.Interface(
-            'MyInterface',
-            ast.AttributeList(ast.Attribute("Attr7", 7)),
-            ast.InterfaceBody(
-                ast.Method(
-                    'MyMethod',
-                    ast.AttributeList(ast.Attribute("Attr8", 8)),
-                    None,
-                    ast.ParameterList(
-                        ast.Parameter(
-                            'a', ast.AttributeList([ast.Attribute("Attr9", 9)]),
-                            None, 'int32')),
-                    ast.ParameterList(
-                        ast.Parameter(
-                            'b',
-                            ast.AttributeList([ast.Attribute("Attr10", 10)]),
-                            None, 'bool')))))])
-    self.assertEquals(parser.Parse(source4, "my_file.mojom"), expected4)
-
-    # TODO(vtl): Boolean attributes don't work yet. (In fact, we just |eval()|
-    # literal (non-name) values, which is extremely dubious.)
-
-  def testInvalidAttributes(self):
-    """Tests that invalid attributes and attribute lists are correctly
-    detected."""
-
-    # Trailing commas not allowed.
-    source1 = "[MyAttribute=MyName,] struct MyStruct {};"
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:1: Error: Unexpected '\]':\n"
-            r"\[MyAttribute=MyName,\] struct MyStruct {};$"):
-      parser.Parse(source1, "my_file.mojom")
-
-    # Missing value.
-    source2 = "[MyAttribute=] struct MyStruct {};"
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:1: Error: Unexpected '\]':\n"
-            r"\[MyAttribute=\] struct MyStruct {};$"):
-      parser.Parse(source2, "my_file.mojom")
-
-    # Missing key.
-    source3 = "[=MyName] struct MyStruct {};"
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:1: Error: Unexpected '=':\n"
-            r"\[=MyName\] struct MyStruct {};$"):
-      parser.Parse(source3, "my_file.mojom")
-
-  def testValidImports(self):
-    """Tests parsing import statements."""
-
-    # One import (no module statement).
-    source1 = "import \"somedir/my.mojom\";"
-    expected1 = ast.Mojom(
-        None,
-        ast.ImportList(ast.Import("somedir/my.mojom")),
-        [])
-    self.assertEquals(parser.Parse(source1, "my_file.mojom"), expected1)
-
-    # Two imports (no module statement).
-    source2 = """\
-        import "somedir/my1.mojom";
-        import "somedir/my2.mojom";
-        """
-    expected2 = ast.Mojom(
-        None,
-        ast.ImportList([ast.Import("somedir/my1.mojom"),
-                        ast.Import("somedir/my2.mojom")]),
-        [])
-    self.assertEquals(parser.Parse(source2, "my_file.mojom"), expected2)
-
-    # Imports with module statement.
-    source3 = """\
-        module my_module;
-        import "somedir/my1.mojom";
-        import "somedir/my2.mojom";
-        """
-    expected3 = ast.Mojom(
-        ast.Module(('IDENTIFIER', 'my_module'), None),
-        ast.ImportList([ast.Import("somedir/my1.mojom"),
-                        ast.Import("somedir/my2.mojom")]),
-        [])
-    self.assertEquals(parser.Parse(source3, "my_file.mojom"), expected3)
-
-  def testInvalidImports(self):
-    """Tests that invalid import statements are correctly detected."""
-
-    source1 = """\
-        // Make the error occur on line 2.
-        import invalid
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:2: Error: Unexpected 'invalid':\n"
-            r" *import invalid$"):
-      parser.Parse(source1, "my_file.mojom")
-
-    source2 = """\
-        import  // Missing string.
-        struct MyStruct {
-          int32 a;
-        };
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:2: Error: Unexpected 'struct':\n"
-            r" *struct MyStruct {$"):
-      parser.Parse(source2, "my_file.mojom")
-
-    source3 = """\
-        import "foo.mojom"  // Missing semicolon.
-        struct MyStruct {
-          int32 a;
-        };
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:2: Error: Unexpected 'struct':\n"
-            r" *struct MyStruct {$"):
-      parser.Parse(source3, "my_file.mojom")
-
-  def testValidNullableTypes(self):
-    """Tests parsing nullable types."""
-
-    source = """\
-        struct MyStruct {
-          int32? a;  // This is actually invalid, but handled at a different
-                     // level.
-          string? b;
-          array<int32> ? c;
-          array<string ? > ? d;
-          array<array<int32>?>? e;
-          array<int32, 1>? f;
-          array<string?, 1>? g;
-          some_struct? h;
-          handle? i;
-          handle<data_pipe_consumer>? j;
-          handle<data_pipe_producer>? k;
-          handle<message_pipe>? l;
-          handle<shared_buffer>? m;
-          some_interface&? n;
-        };
-        """
-    expected = ast.Mojom(
-        None,
-        ast.ImportList(),
-        [ast.Struct(
-            'MyStruct',
-            None,
-            ast.StructBody(
-                [ast.StructField('a', None, None,'int32?', None),
-                 ast.StructField('b', None, None,'string?', None),
-                 ast.StructField('c', None, None,'int32[]?', None),
-                 ast.StructField('d', None, None,'string?[]?', None),
-                 ast.StructField('e', None, None,'int32[]?[]?', None),
-                 ast.StructField('f', None, None,'int32[1]?', None),
-                 ast.StructField('g', None, None,'string?[1]?', None),
-                 ast.StructField('h', None, None,'some_struct?', None),
-                 ast.StructField('i', None, None,'handle?', None),
-                 ast.StructField('j', None, None,'handle<data_pipe_consumer>?',
-                                 None),
-                 ast.StructField('k', None, None,'handle<data_pipe_producer>?',
-                                 None),
-                 ast.StructField('l', None, None,'handle<message_pipe>?', None),
-                 ast.StructField('m', None, None,'handle<shared_buffer>?',
-                                 None),
-                 ast.StructField('n', None, None,'some_interface&?', None)]))])
-    self.assertEquals(parser.Parse(source, "my_file.mojom"), expected)
-
-  def testInvalidNullableTypes(self):
-    """Tests that invalid nullable types are correctly detected."""
-    source1 = """\
-        struct MyStruct {
-          string?? a;
-        };
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:2: Error: Unexpected '\?':\n"
-            r" *string\?\? a;$"):
-      parser.Parse(source1, "my_file.mojom")
-
-    source2 = """\
-        struct MyStruct {
-          handle?<data_pipe_consumer> a;
-        };
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:2: Error: Unexpected '<':\n"
-            r" *handle\?<data_pipe_consumer> a;$"):
-      parser.Parse(source2, "my_file.mojom")
-
-    source3 = """\
-        struct MyStruct {
-          some_interface?& a;
-        };
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:2: Error: Unexpected '&':\n"
-            r" *some_interface\?& a;$"):
-      parser.Parse(source3, "my_file.mojom")
-
-  def testSimpleUnion(self):
-    """Tests a simple .mojom source that just defines a union."""
-    source = """\
-        module my_module;
-
-        union MyUnion {
-          int32 a;
-          double b;
-        };
-        """
-    expected = ast.Mojom(
-        ast.Module(('IDENTIFIER', 'my_module'), None),
-        ast.ImportList(),
-        [ast.Union(
-          'MyUnion',
-          None,
-          ast.UnionBody([
-            ast.UnionField('a', None, None, 'int32'),
-            ast.UnionField('b', None, None, 'double')
-            ]))])
-    actual = parser.Parse(source, "my_file.mojom")
-    self.assertEquals(actual, expected)
-
-  def testUnionWithOrdinals(self):
-    """Test that ordinals are assigned to fields."""
-    source = """\
-        module my_module;
-
-        union MyUnion {
-          int32 a @10;
-          double b @30;
-        };
-        """
-    expected = ast.Mojom(
-        ast.Module(('IDENTIFIER', 'my_module'), None),
-        ast.ImportList(),
-        [ast.Union(
-          'MyUnion',
-          None,
-          ast.UnionBody([
-            ast.UnionField('a', None, ast.Ordinal(10), 'int32'),
-            ast.UnionField('b', None, ast.Ordinal(30), 'double')
-            ]))])
-    actual = parser.Parse(source, "my_file.mojom")
-    self.assertEquals(actual, expected)
-
-  def testUnionWithStructMembers(self):
-    """Test that struct members are accepted."""
-    source = """\
-        module my_module;
-
-        union MyUnion {
-          SomeStruct s;
-        };
-        """
-    expected = ast.Mojom(
-        ast.Module(('IDENTIFIER', 'my_module'), None),
-        ast.ImportList(),
-        [ast.Union(
-          'MyUnion',
-          None,
-          ast.UnionBody([
-            ast.UnionField('s', None, None, 'SomeStruct')
-            ]))])
-    actual = parser.Parse(source, "my_file.mojom")
-    self.assertEquals(actual, expected)
-
-  def testUnionWithArrayMember(self):
-    """Test that array members are accepted."""
-    source = """\
-        module my_module;
-
-        union MyUnion {
-          array<int32> a;
-        };
-        """
-    expected = ast.Mojom(
-        ast.Module(('IDENTIFIER', 'my_module'), None),
-        ast.ImportList(),
-        [ast.Union(
-          'MyUnion',
-          None,
-          ast.UnionBody([
-            ast.UnionField('a', None, None, 'int32[]')
-            ]))])
-    actual = parser.Parse(source, "my_file.mojom")
-    self.assertEquals(actual, expected)
-
-  def testUnionWithMapMember(self):
-    """Test that map members are accepted."""
-    source = """\
-        module my_module;
-
-        union MyUnion {
-          map<int32, string> m;
-        };
-        """
-    expected = ast.Mojom(
-        ast.Module(('IDENTIFIER', 'my_module'), None),
-        ast.ImportList(),
-        [ast.Union(
-          'MyUnion',
-          None,
-          ast.UnionBody([
-            ast.UnionField('m', None, None, 'string{int32}')
-            ]))])
-    actual = parser.Parse(source, "my_file.mojom")
-    self.assertEquals(actual, expected)
-
-  def testUnionDisallowNestedStruct(self):
-    """Tests that structs cannot be nested in unions."""
-    source = """\
-        module my_module;
-
-        union MyUnion {
-          struct MyStruct {
-            int32 a;
-          };
-        };
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:4: Error: Unexpected 'struct':\n"
-        r" *struct MyStruct {$"):
-      parser.Parse(source, "my_file.mojom")
-
-  def testUnionDisallowNestedInterfaces(self):
-    """Tests that interfaces cannot be nested in unions."""
-    source = """\
-        module my_module;
-
-        union MyUnion {
-          interface MyInterface {
-            MyMethod(int32 a);
-          };
-        };
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:4: Error: Unexpected 'interface':\n"
-        r" *interface MyInterface {$"):
-      parser.Parse(source, "my_file.mojom")
-
-  def testUnionDisallowNestedUnion(self):
-    """Tests that unions cannot be nested in unions."""
-    source = """\
-        module my_module;
-
-        union MyUnion {
-          union MyOtherUnion {
-            int32 a;
-          };
-        };
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:4: Error: Unexpected 'union':\n"
-        r" *union MyOtherUnion {$"):
-      parser.Parse(source, "my_file.mojom")
-
-  def testUnionDisallowNestedEnum(self):
-    """Tests that enums cannot be nested in unions."""
-    source = """\
-        module my_module;
-
-        union MyUnion {
-          enum MyEnum {
-            A,
-          };
-        };
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:4: Error: Unexpected 'enum':\n"
-        r" *enum MyEnum {$"):
-      parser.Parse(source, "my_file.mojom")
-
-  def testValidAssociatedKinds(self):
-    """Tests parsing associated interfaces and requests."""
-    source1 = """\
-        struct MyStruct {
-          associated MyInterface a;
-          associated MyInterface& b;
-          associated MyInterface? c;
-          associated MyInterface&? d;
-        };
-        """
-    expected1 = ast.Mojom(
-        None,
-        ast.ImportList(),
-        [ast.Struct(
-            'MyStruct',
-            None,
-            ast.StructBody(
-                [ast.StructField('a', None, None,'asso<MyInterface>', None),
-                 ast.StructField('b', None, None,'asso<MyInterface&>', None),
-                 ast.StructField('c', None, None,'asso<MyInterface>?', None),
-                 ast.StructField('d', None, None,'asso<MyInterface&>?',
-                                 None)]))])
-    self.assertEquals(parser.Parse(source1, "my_file.mojom"), expected1)
-
-    source2 = """\
-        interface MyInterface {
-          MyMethod(associated A a) =>(associated B& b);
-        };"""
-    expected2 = ast.Mojom(
-        None,
-        ast.ImportList(),
-        [ast.Interface(
-            'MyInterface',
-            None,
-            ast.InterfaceBody(
-                ast.Method(
-                    'MyMethod',
-                    None,
-                    None,
-                    ast.ParameterList(
-                        ast.Parameter('a', None, None, 'asso<A>')),
-                    ast.ParameterList(
-                        ast.Parameter('b', None, None, 'asso<B&>')))))])
-    self.assertEquals(parser.Parse(source2, "my_file.mojom"), expected2)
-
-  def testInvalidAssociatedKinds(self):
-    """Tests that invalid associated interfaces and requests are correctly
-    detected."""
-    source1 = """\
-        struct MyStruct {
-          associated associated SomeInterface a;
-        };
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:2: Error: Unexpected 'associated':\n"
-            r" *associated associated SomeInterface a;$"):
-      parser.Parse(source1, "my_file.mojom")
-
-    source2 = """\
-        struct MyStruct {
-          associated handle a;
-        };
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:2: Error: Unexpected 'handle':\n"
-            r" *associated handle a;$"):
-      parser.Parse(source2, "my_file.mojom")
-
-    source3 = """\
-        struct MyStruct {
-          associated? MyInterface& a;
-        };
-        """
-    with self.assertRaisesRegexp(
-        parser.ParseError,
-        r"^my_file\.mojom:2: Error: Unexpected '\?':\n"
-            r" *associated\? MyInterface& a;$"):
-      parser.Parse(source3, "my_file.mojom")
-
-
-if __name__ == "__main__":
-  unittest.main()
diff --git a/mojo/public/tools/bindings/pylib/mojom_tests/parse/run_parser.py b/mojo/public/tools/bindings/pylib/mojom_tests/parse/run_parser.py
deleted file mode 100755
index b160de6..0000000
--- a/mojo/public/tools/bindings/pylib/mojom_tests/parse/run_parser.py
+++ /dev/null
@@ -1,36 +0,0 @@
-#!/usr/bin/env python
-# 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.
-
-"""Simple testing utility to just run the mojom parser."""
-
-
-import os.path
-import sys
-
-sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)),
-                                os.path.pardir, os.path.pardir))
-
-from mojom.parse.parser import Parse, ParseError
-
-
-def main(argv):
-  if len(argv) < 2:
-    print "usage: %s filename" % argv[0]
-    return 0
-
-  for filename in argv[1:]:
-    with open(filename) as f:
-      print "%s:" % filename
-      try:
-        print Parse(f.read(), filename)
-      except ParseError, e:
-        print e
-        return 1
-
-  return 0
-
-
-if __name__ == '__main__':
-  sys.exit(main(sys.argv))
diff --git a/mojo/public/tools/bindings/pylib/mojom_tests/parse/run_translate.py b/mojo/public/tools/bindings/pylib/mojom_tests/parse/run_translate.py
deleted file mode 100755
index 899d40e..0000000
--- a/mojo/public/tools/bindings/pylib/mojom_tests/parse/run_translate.py
+++ /dev/null
@@ -1,34 +0,0 @@
-#!/usr/bin/env python
-# 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.
-
-"""Simple testing utility to just run the mojom translate stage."""
-
-
-import os.path
-import sys
-
-sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)),
-                                os.path.pardir, os.path.pardir))
-
-from mojom.parse.parser import Parse
-from mojom.parse.translate import Translate
-
-
-def main(argv):
-  if len(argv) < 2:
-    print "usage: %s filename" % sys.argv[0]
-    return 1
-
-  for filename in argv[1:]:
-    with open(filename) as f:
-      print "%s:" % filename
-      print Translate(Parse(f.read(), filename),
-                      os.path.splitext(os.path.basename(filename))[0])
-
-  return 0
-
-
-if __name__ == '__main__':
-  sys.exit(main(sys.argv))
diff --git a/mojo/public/tools/bindings/pylib/mojom_tests/parse/translate_unittest.py b/mojo/public/tools/bindings/pylib/mojom_tests/parse/translate_unittest.py
deleted file mode 100644
index 2520332..0000000
--- a/mojo/public/tools/bindings/pylib/mojom_tests/parse/translate_unittest.py
+++ /dev/null
@@ -1,80 +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.
-
-import imp
-import os.path
-import sys
-import unittest
-
-def _GetDirAbove(dirname):
-  """Returns the directory "above" this file containing |dirname| (which must
-  also be "above" this file)."""
-  path = os.path.abspath(__file__)
-  while True:
-    path, tail = os.path.split(path)
-    assert tail
-    if tail == dirname:
-      return path
-
-try:
-  imp.find_module("mojom")
-except ImportError:
-  sys.path.append(os.path.join(_GetDirAbove("pylib"), "pylib"))
-from mojom.parse import ast
-from mojom.parse import translate
-
-
-class TranslateTest(unittest.TestCase):
-  """Tests |parser.Parse()|."""
-
-  def testSimpleArray(self):
-    """Tests a simple int32[]."""
-    # pylint: disable=W0212
-    self.assertEquals(translate._MapKind("int32[]"), "a:i32")
-
-  def testAssociativeArray(self):
-    """Tests a simple uint8{string}."""
-    # pylint: disable=W0212
-    self.assertEquals(translate._MapKind("uint8{string}"), "m[s][u8]")
-
-  def testLeftToRightAssociativeArray(self):
-    """Makes sure that parsing is done from right to left on the internal kinds
-       in the presence of an associative array."""
-    # pylint: disable=W0212
-    self.assertEquals(translate._MapKind("uint8[]{string}"), "m[s][a:u8]")
-
-  def testTranslateSimpleUnions(self):
-    """Makes sure that a simple union is translated correctly."""
-    tree = ast.Mojom(
-        None,
-        ast.ImportList(),
-        [ast.Union("SomeUnion", None, ast.UnionBody(
-          [ast.UnionField("a", None, None, "int32"),
-           ast.UnionField("b", None, None, "string")]))])
-    expected = [{
-      "name": "SomeUnion",
-      "fields": [{"kind": "i32", "name": "a"},
-                 {"kind": "s", "name": "b"}]}]
-    actual = translate.Translate(tree, "mojom_tree")
-    self.assertEquals(actual["unions"], expected)
-
-  def testMapTreeForTypeRaisesWithDuplicate(self):
-    """Verifies _MapTreeForType() raises when passed two values with the same
-       name."""
-    methods = [ast.Method('dup', None, None, ast.ParameterList(), None),
-               ast.Method('dup', None, None, ast.ParameterList(), None)]
-    self.assertRaises(Exception, translate._MapTreeForType,
-                      (lambda x: x, methods, '', 'scope'))
-
-  def testAssociatedKinds(self):
-    """Tests type spec translation of associated interfaces and requests."""
-    # pylint: disable=W0212
-    self.assertEquals(translate._MapKind("asso<SomeInterface>?"),
-                      "?asso:x:SomeInterface")
-    self.assertEquals(translate._MapKind("asso<SomeInterface&>?"),
-                      "?asso:r:x:SomeInterface")
-
-
-if __name__ == "__main__":
-  unittest.main()
diff --git a/mojo/public/tools/bindings/pylib/mojom_tests/support/__init__.py b/mojo/public/tools/bindings/pylib/mojom_tests/support/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/mojo/public/tools/bindings/pylib/mojom_tests/support/__init__.py
+++ /dev/null
diff --git a/mojo/public/tools/bindings/pylib/mojom_tests/support/find_files.py b/mojo/public/tools/bindings/pylib/mojom_tests/support/find_files.py
deleted file mode 100644
index 2a4b17b..0000000
--- a/mojo/public/tools/bindings/pylib/mojom_tests/support/find_files.py
+++ /dev/null
@@ -1,32 +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.
-
-import fnmatch
-from os import walk
-from os.path import join
-import sys
-
-
-def FindFiles(top, pattern, **kwargs):
-  """Finds files under |top| matching the glob pattern |pattern|, returning a
-  list of paths."""
-  matches = []
-  for dirpath, _, filenames in walk(top, **kwargs):
-    for filename in fnmatch.filter(filenames, pattern):
-      matches.append(join(dirpath, filename))
-  return matches
-
-
-def main(argv):
-  if len(argv) != 3:
-    print "usage: %s path pattern" % argv[0]
-    return 1
-
-  for filename in FindFiles(argv[1], argv[2]):
-    print filename
-  return 0
-
-
-if __name__ == '__main__':
-  sys.exit(main(sys.argv))
diff --git a/mojo/public/tools/bindings/pylib/mojom_tests/support/run_bindings_generator.py b/mojo/public/tools/bindings/pylib/mojom_tests/support/run_bindings_generator.py
deleted file mode 100644
index 20ef461..0000000
--- a/mojo/public/tools/bindings/pylib/mojom_tests/support/run_bindings_generator.py
+++ /dev/null
@@ -1,47 +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.
-
-import os.path
-from subprocess import check_call
-import sys
-
-
-def RunBindingsGenerator(out_dir, root_dir, mojom_file, extra_flags=None):
-  out_dir = os.path.abspath(out_dir)
-  root_dir = os.path.abspath(root_dir)
-  mojom_file = os.path.abspath(mojom_file)
-
-  # The mojom file should be under the root directory somewhere.
-  assert mojom_file.startswith(root_dir)
-  mojom_reldir = os.path.dirname(os.path.relpath(mojom_file, root_dir))
-
-  # TODO(vtl): Abstract out the "main" functions, so that we can just import
-  # the bindings generator (which would be more portable and easier to use in
-  # tests).
-  this_dir = os.path.dirname(os.path.abspath(__file__))
-  # We're in src/mojo/public/tools/bindings/pylib/mojom_tests/support;
-  # mojom_bindings_generator.py is in .../bindings.
-  bindings_generator = os.path.join(this_dir, os.pardir, os.pardir, os.pardir,
-                                    "mojom_bindings_generator.py")
-
-  args = ["python", bindings_generator,
-          "-o", os.path.join(out_dir, mojom_reldir)]
-  if extra_flags:
-    args.extend(extra_flags)
-  args.append(mojom_file)
-
-  check_call(args)
-
-
-def main(argv):
-  if len(argv) < 4:
-    print "usage: %s out_dir root_dir mojom_file [extra_flags]" % argv[0]
-    return 1
-
-  RunBindingsGenerator(argv[1], argv[2], argv[3], extra_flags=argv[4:])
-  return 0
-
-
-if __name__ == '__main__':
-  sys.exit(main(sys.argv))
diff --git a/mojo/public/tools/chrome_ipc/generate_mojom.py b/mojo/public/tools/chrome_ipc/generate_mojom.py
deleted file mode 100755
index 04e933b..0000000
--- a/mojo/public/tools/chrome_ipc/generate_mojom.py
+++ /dev/null
@@ -1,453 +0,0 @@
-#! /usr/bin/env python
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""A generator of mojom interfaces and typemaps from Chrome IPC messages.
-
-For example,
-generate_mojom.py content/common/file_utilities_messages.h
-    --output_mojom=content/common/file_utilities.mojom
-    --output_typemap=content/common/file_utilities.typemap
-"""
-
-import argparse
-import logging
-import os
-import re
-import subprocess
-import sys
-
-_MESSAGE_PATTERN = re.compile(
-    r'(?:\n|^)IPC_(SYNC_)?MESSAGE_(ROUTED|CONTROL)(\d_)?(\d)')
-_VECTOR_PATTERN = re.compile(r'std::(vector|set)<(.*)>')
-_MAP_PATTERN = re.compile(r'std::map<(.*), *(.*)>')
-_NAMESPACE_PATTERN = re.compile(r'([a-z_]*?)::([A-Z].*)')
-
-_unused_arg_count = 0
-
-
-def _git_grep(pattern, paths_pattern):
-  try:
-    args = ['git', 'grep', '-l', '-e', pattern, '--'] + paths_pattern
-    result = subprocess.check_output(args).strip().splitlines()
-    logging.debug('%s => %s', ' '.join(args), result)
-    return result
-  except subprocess.CalledProcessError:
-    logging.debug('%s => []', ' '.join(args))
-    return []
-
-
-def _git_multigrep(patterns, paths):
-  """Find a list of files that match all of the provided patterns."""
-  if isinstance(paths, str):
-    paths = [paths]
-  if isinstance(patterns, str):
-    patterns = [patterns]
-  for pattern in patterns:
-    # Search only the files that matched previous patterns.
-    paths = _git_grep(pattern, paths)
-    if not paths:
-      return []
-  return paths
-
-
-class Typemap(object):
-
-  def __init__(self, typemap_files):
-    self._typemap_files = typemap_files
-    self._custom_mappings = {}
-    self._new_custom_mappings = {}
-    self._imports = set()
-    self._public_includes = set()
-    self._traits_includes = set()
-    self._enums = set()
-
-  def load_typemaps(self):
-    for typemap in self._typemap_files:
-      self.load_typemap(typemap)
-
-  def load_typemap(self, path):
-    typemap = {}
-    with open(path) as f:
-      content = f.read().replace('=\n', '=')
-    exec content in typemap
-    for mapping in typemap['type_mappings']:
-      mojom, native = mapping.split('=')
-      self._custom_mappings[native] = {'name': mojom,
-                                       'mojom': typemap['mojom'].strip('/')}
-
-  def generate_typemap(self, output_mojom, input_filename, namespace):
-    new_mappings = sorted(self._format_new_mappings(namespace))
-    if not new_mappings:
-      return
-    yield """# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""
-    yield 'mojom = "//%s"' % output_mojom
-    yield 'public_headers = [%s\n]' % ''.join(
-        '\n  "//%s",' % include for include in sorted(self._public_includes))
-    yield 'traits_headers = [%s\n]' % ''.join(
-        '\n  "//%s",' % include
-        for include in sorted(self._traits_includes.union([os.path.normpath(
-            input_filename)])))
-    yield 'deps = [ "//ipc" ]'
-    yield 'type_mappings = [\n  %s\n]' % '\n  '.join(new_mappings)
-
-  def _format_new_mappings(self, namespace):
-    for native, mojom in self._new_custom_mappings.iteritems():
-      yield '"%s.%s=::%s",' % (namespace, mojom, native)
-
-  def format_new_types(self):
-    for native_type, typename in self._new_custom_mappings.iteritems():
-      if native_type in self._enums:
-        yield '[Native]\nenum %s;\n' % typename
-      else:
-        yield '[Native]\nstruct %s;\n' % typename
-
-  _BUILTINS = {
-      'bool': 'bool',
-      'int': 'int32',
-      'unsigned': 'uint32',
-      'char': 'uint8',
-      'unsigned char': 'uint8',
-      'short': 'int16',
-      'unsigned short': 'uint16',
-      'int8_t': 'int8',
-      'int16_t': 'int16',
-      'int32_t': 'int32',
-      'int64_t': 'int64',
-      'uint8_t': 'uint8',
-      'uint16_t': 'uint16',
-      'uint32_t': 'uint32',
-      'uint64_t': 'uint64',
-      'float': 'float',
-      'double': 'double',
-      'std::string': 'string',
-      'base::string16': 'string',
-      'base::FilePath::StringType': 'string',
-      'base::SharedMemoryHandle': 'handle<shared_memory>',
-      'IPC::PlatformFileForTransit': 'handle',
-      'base::FileDescriptor': 'handle',
-  }
-
-  def lookup_type(self, typename):
-    try:
-      return self._BUILTINS[typename]
-    except KeyError:
-      pass
-
-    vector_match = _VECTOR_PATTERN.search(typename)
-    if vector_match:
-      return 'array<%s>' % self.lookup_type(vector_match.groups()[1].strip())
-    map_match = _MAP_PATTERN.search(typename)
-    if map_match:
-      return 'map<%s, %s>' % tuple(self.lookup_type(t.strip())
-                                   for t in map_match.groups())
-    try:
-      result = self._custom_mappings[typename]['name']
-      mojom = self._custom_mappings[typename].get('mojom', None)
-      if mojom:
-        self._imports.add(mojom)
-      return result
-    except KeyError:
-      pass
-
-    match = _NAMESPACE_PATTERN.match(typename)
-    if match:
-      namespace, name = match.groups()
-    else:
-      namespace = ''
-      name = typename
-    namespace = namespace.replace('::', '.')
-    cpp_name = name
-    name = name.replace('::', '')
-
-    if name.endswith('Params'):
-      try:
-        _, name = name.rsplit('Msg_')
-      except ValueError:
-        try:
-          _, name = name.split('_', 1)
-        except ValueError:
-          pass
-
-    if namespace.endswith('.mojom'):
-      generated_mojom_name = '%s.%s' % (namespace, name)
-    elif not namespace:
-      generated_mojom_name = 'mojom.%s' % name
-    else:
-      generated_mojom_name = '%s.mojom.%s' % (namespace, name)
-
-    self._new_custom_mappings[typename] = name
-    self._add_includes(namespace, cpp_name, typename)
-    generated_mojom_name = name
-    self._custom_mappings[typename] = {'name': generated_mojom_name}
-    return generated_mojom_name
-
-  def _add_includes(self, namespace, name, fullname):
-    name_components = name.split('::')
-    is_enum = False
-    for i in xrange(len(name_components)):
-      subname = '::'.join(name_components[i:])
-      extra_names = name_components[:i] + [subname]
-      patterns = [r'\(struct\|class\|enum\)[A-Z_ ]* %s {' % s
-                  for s in extra_names]
-      if namespace:
-        patterns.extend(r'namespace %s' % namespace_component
-                        for namespace_component in namespace.split('.'))
-      includes = _git_multigrep(patterns, '*.h')
-      if includes:
-        if _git_grep(r'enum[A-Z_ ]* %s {' % subname, includes):
-          self._enums.add(fullname)
-          is_enum = True
-        logging.info('%s => public_headers = %s', fullname, includes)
-        self._public_includes.update(includes)
-        break
-
-    if is_enum:
-      patterns = ['IPC_ENUM_TRAITS[A-Z_]*(%s' % fullname]
-    else:
-      patterns = [r'\(IPC_STRUCT_TRAITS_BEGIN(\|ParamTraits<\)%s' % fullname]
-    includes = _git_multigrep(
-        patterns,
-        ['*messages.h', '*struct_traits.h', 'ipc/ipc_message_utils.h'])
-    if includes:
-      logging.info('%s => traits_headers = %s', fullname, includes)
-      self._traits_includes.update(includes)
-
-  def format_imports(self):
-    for import_name in sorted(self._imports):
-      yield 'import "%s";' % import_name
-    if self._imports:
-      yield ''
-
-
-class Argument(object):
-
-  def __init__(self, typename, name):
-    self.typename = typename.strip()
-    self.name = name.strip().replace('\n', '').replace(' ', '_').lower()
-    if not self.name:
-      global _unused_arg_count
-      self.name = 'unnamed_arg%d' % _unused_arg_count
-      _unused_arg_count += 1
-
-  def format(self, typemaps):
-    return '%s %s' % (typemaps.lookup_type(self.typename), self.name)
-
-
-class Message(object):
-
-  def __init__(self, match, content):
-    self.sync = bool(match[0])
-    self.routed = match[1] == 'ROUTED'
-    self.args = []
-    self.response_args = []
-    if self.sync:
-      num_expected_args = int(match[2][:-1])
-      num_expected_response_args = int(match[3])
-    else:
-      num_expected_args = int(match[3])
-      num_expected_response_args = 0
-    body = content.split(',')
-    name = body[0].strip()
-    try:
-      self.group, self.name = name.split('Msg_')
-    except ValueError:
-      try:
-        self.group, self.name = name.split('_')
-      except ValueError:
-        self.group = 'UnnamedInterface'
-        self.name = name
-    self.group = '%s%s' % (self.group, match[1].title())
-    args = list(self.parse_args(','.join(body[1:])))
-    if len(args) != num_expected_args + num_expected_response_args:
-      raise Exception('Incorrect number of args parsed for %s' % (name))
-    self.args = args[:num_expected_args]
-    self.response_args = args[num_expected_args:]
-
-  def parse_args(self, args_str):
-    args_str = args_str.strip()
-    if not args_str:
-      return
-    looking_for_type = False
-    type_start = 0
-    comment_start = None
-    comment_end = None
-    type_end = None
-    angle_bracket_nesting = 0
-    i = 0
-    while i < len(args_str):
-      if args_str[i] == ',' and not angle_bracket_nesting:
-        looking_for_type = True
-        if type_end is None:
-          type_end = i
-      elif args_str[i:i + 2] == '/*':
-        if type_end is None:
-          type_end = i
-        comment_start = i + 2
-        comment_end = args_str.index('*/', i + 2)
-        i = comment_end + 1
-      elif args_str[i:i + 2] == '//':
-        if type_end is None:
-          type_end = i
-        comment_start = i + 2
-        comment_end = args_str.index('\n', i + 2)
-        i = comment_end
-      elif args_str[i] == '<':
-        angle_bracket_nesting += 1
-      elif args_str[i] == '>':
-        angle_bracket_nesting -= 1
-      elif looking_for_type and args_str[i].isalpha():
-        if comment_start is not None and comment_end is not None:
-          yield Argument(args_str[type_start:type_end],
-                         args_str[comment_start:comment_end])
-        else:
-          yield Argument(args_str[type_start:type_end], '')
-        type_start = i
-        type_end = None
-        comment_start = None
-        comment_end = None
-        looking_for_type = False
-      i += 1
-    if comment_start is not None and comment_end is not None:
-      yield Argument(args_str[type_start:type_end],
-                     args_str[comment_start:comment_end])
-    else:
-      yield Argument(args_str[type_start:type_end], '')
-
-  def format(self, typemaps):
-    result = '%s(%s)' % (self.name, ','.join('\n      %s' % arg.format(typemaps)
-                                             for arg in self.args))
-    if self.sync:
-      result += ' => (%s)' % (',\n'.join('\n      %s' % arg.format(typemaps)
-                                         for arg in self.response_args))
-      result = '[Sync]\n  %s' % result
-    return '%s;' % result
-
-
-class Generator(object):
-
-  def __init__(self, input_name, output_namespace):
-    self._input_name = input_name
-    with open(input_name) as f:
-      self._content = f.read()
-    self._namespace = output_namespace
-    self._typemaps = Typemap(self._find_typemaps())
-    self._interface_definitions = []
-
-  def _get_messages(self):
-    for m in _MESSAGE_PATTERN.finditer(self._content):
-      i = m.end() + 1
-      while i < len(self._content):
-        if self._content[i:i + 2] == '/*':
-          i = self._content.index('*/', i + 2) + 1
-        elif self._content[i] == ')':
-          yield Message(m.groups(), self._content[m.end() + 1:i])
-          break
-        i += 1
-
-  def _extract_messages(self):
-    grouped_messages = {}
-    for m in self._get_messages():
-      grouped_messages.setdefault(m.group, []).append(m)
-    self._typemaps.load_typemaps()
-    for interface, messages in grouped_messages.iteritems():
-      self._interface_definitions.append(self._format_interface(interface,
-                                                                messages))
-
-  def count(self):
-    grouped_messages = {}
-    for m in self._get_messages():
-      grouped_messages.setdefault(m.group, []).append(m)
-    return sum(len(messages) for messages in grouped_messages.values())
-
-  def generate_mojom(self):
-    self._extract_messages()
-    if not self._interface_definitions:
-      return
-    yield """// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-"""
-    yield 'module %s;\n' % self._namespace
-    for import_statement in self._typemaps.format_imports():
-      yield import_statement
-    for typemap in self._typemaps.format_new_types():
-      yield typemap
-    for interface in self._interface_definitions:
-      yield interface
-      yield ''
-
-  def generate_typemap(self, output_mojom, input_filename):
-    return '\n'.join(self._typemaps.generate_typemap(
-        output_mojom, input_filename, self._namespace)).strip()
-
-  @staticmethod
-  def _find_typemaps():
-    return subprocess.check_output(
-        ['git', 'ls-files', '*.typemap']).strip().split('\n')
-
-  def _format_interface(self, name, messages):
-    return 'interface %s {\n  %s\n};' % (name,
-                                         '\n  '.join(m.format(self._typemaps)
-                                                     for m in messages))
-
-
-def parse_args():
-  parser = argparse.ArgumentParser(description=__doc__)
-  parser.add_argument('input', help='input messages.h file')
-  parser.add_argument(
-      '--output_namespace',
-      default='mojom',
-      help='the mojom module name to use in the generated mojom file '
-      '(default: %(default)s)')
-  parser.add_argument('--output_mojom', help='output mojom path')
-  parser.add_argument('--output_typemap', help='output typemap path')
-  parser.add_argument(
-      '--count',
-      action='store_true',
-      default=False,
-      help='count the number of messages in the input instead of generating '
-      'a mojom file')
-  parser.add_argument('-v',
-                      '--verbose',
-                      action='store_true',
-                      help='enable logging')
-  parser.add_argument('-vv', action='store_true', help='enable debug logging')
-  return parser.parse_args()
-
-
-def main():
-  args = parse_args()
-  if args.vv:
-    logging.basicConfig(level=logging.DEBUG)
-  elif args.verbose:
-    logging.basicConfig(level=logging.INFO)
-  generator = Generator(args.input, args.output_namespace)
-  if args.count:
-    count = generator.count()
-    if count:
-      print '%d %s' % (generator.count(), args.input)
-    return
-  mojom = '\n'.join(generator.generate_mojom()).strip()
-  if not mojom:
-    return
-  typemap = generator.generate_typemap(args.output_mojom, args.input)
-
-  if args.output_mojom:
-    with open(args.output_mojom, 'w') as f:
-      f.write(mojom)
-  else:
-    print mojom
-  if typemap:
-    if args.output_typemap:
-      with open(args.output_typemap, 'w') as f:
-        f.write(typemap)
-    else:
-      print typemap
-
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/mojo/public/tools/gn/zip.py b/mojo/public/tools/gn/zip.py
deleted file mode 100755
index adc9cb1..0000000
--- a/mojo/public/tools/gn/zip.py
+++ /dev/null
@@ -1,86 +0,0 @@
-#!/usr/bin/env python
-#
-# 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.
-
-# TODO(brettw) bug 582594: merge this with build/android/gn/zip.py and update
-# callers to use the existing template rather than invoking this directly.
-
-"""Archives a set of files.
-"""
-
-import optparse
-import os
-import sys
-import zipfile
-
-sys.path.append(os.path.join(os.path.dirname(__file__),
-                             os.pardir, os.pardir, os.pardir, os.pardir,
-                             "build"))
-import gn_helpers
-
-sys.path.append(os.path.join(os.path.dirname(__file__),
-                             os.pardir, os.pardir, os.pardir, os.pardir,
-                             'build', 'android', 'gyp'))
-from util import build_utils
-
-
-def DoZip(inputs, link_inputs, zip_inputs, output, base_dir):
-  files = []
-  with zipfile.ZipFile(output, 'w', zipfile.ZIP_DEFLATED) as outfile:
-    for f in inputs:
-      file_name = os.path.relpath(f, base_dir)
-      files.append(file_name)
-      build_utils.AddToZipHermetic(outfile, file_name, f)
-    for f in link_inputs:
-      realf = os.path.realpath(f)  # Resolve symlinks.
-      file_name = os.path.relpath(realf, base_dir)
-      files.append(file_name)
-      build_utils.AddToZipHermetic(outfile, file_name, realf)
-    for zf_name in zip_inputs:
-      with zipfile.ZipFile(zf_name, 'r') as zf:
-        for f in zf.namelist():
-          if f not in files:
-            files.append(f)
-            build_utils.AddToZipHermetic(outfile, f, data=zf.read(f))
-
-
-def main():
-  parser = optparse.OptionParser()
-
-  parser.add_option('--inputs',
-      help='GN format list of files to archive.')
-  parser.add_option('--link-inputs',
-      help='GN-format list of files to archive. Symbolic links are resolved.')
-  parser.add_option('--zip-inputs',
-      help='GN-format list of zip files to re-archive.')
-  parser.add_option('--output', help='Path to output archive.')
-  parser.add_option('--base-dir',
-                    help='If provided, the paths in the archive will be '
-                    'relative to this directory', default='.')
-
-  options, _ = parser.parse_args()
-
-  inputs = []
-  if (options.inputs):
-    parser = gn_helpers.GNValueParser(options.inputs)
-    inputs = parser.ParseList()
-
-  link_inputs = []
-  if options.link_inputs:
-    parser = gn_helpers.GNValueParser(options.link_inputs)
-    link_inputs = parser.ParseList()
-
-  zip_inputs = []
-  if options.zip_inputs:
-    parser = gn_helpers.GNValueParser(options.zip_inputs)
-    zip_inputs = parser.ParseList()
-
-  output = options.output
-  base_dir = options.base_dir
-
-  DoZip(inputs, link_inputs, zip_inputs, output, base_dir)
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/soong/jni_generator_helper.sh b/soong/jni_generator_helper.sh
deleted file mode 100755
index d610801..0000000
--- a/soong/jni_generator_helper.sh
+++ /dev/null
@@ -1,42 +0,0 @@
-#!/bin/bash
-#
-# Copyright (C) 2017 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-# Generates jni.
-
-set -e
-
-args=()
-files=()
-
-jni_generator=''
-
-for arg in "$@"; do
-  case "${arg}" in
-    --jni_generator=*)
-      jni_generator=${arg#'--jni_generator='}
-      ;;
-    --*)
-      args=("${args[@]}" "${arg}")
-      ;;
-    *)
-      files=("${files[@]}" "${arg}")
-      ;;
-  esac
-done
-
-for file in "${files[@]}"; do
-  "${jni_generator}" "${args[@]}" --input_file="${file}"
-done
diff --git a/soong/mojom_source_generator.sh b/soong/mojom_source_generator.sh
deleted file mode 100755
index 118d513..0000000
--- a/soong/mojom_source_generator.sh
+++ /dev/null
@@ -1,115 +0,0 @@
-#!/bin/bash
-#
-# Copyright (C) 2017 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-# Generates mojo sources given a list of .mojom files and args.
-# Usage: $0 --mojom_bindings_generator=<abs_path> --package=<package_directory>
-#            --output_dir=<output_directory>
-#            [<extra_args_for_bindings_generator>] <list_of_mojom_files>
-
-set -e
-
-args=()
-files=()
-
-mojom_bindings_generator=""
-package=""
-output_dir=""
-generators=""
-private_mojo_root="$(pwd)/external/libmojo"
-
-# Given a path to directory or file, return the absolute path.
-get_abs_path() {
-  if [[ -d $1 ]] ; then
-    cd "$1"
-    filename=""
-  else
-    filepath=$1
-    dir="${filepath%/*}"
-    cd "${dir}"
-    filename="${filepath#${dir}/}"
-  fi
-  absdir=`pwd`
-  cd - > /dev/null
-  echo "${absdir}/${filename}"
-}
-
-for arg in "$@"; do
-  case "${arg}" in
-    --mojom_bindings_generator=*)
-      mojom_bindings_generator="${arg#'--mojom_bindings_generator='}"
-      mojom_bindings_generator="$(get_abs_path ${mojom_bindings_generator})"
-      ;;
-    --package=*)
-      package="${arg#'--package='}"
-      ;;
-    --output_dir=*)
-      output_dir="${arg#'--output_dir='}"
-      output_dir="$(get_abs_path ${output_dir})"
-      ;;
-    --typemap=*)
-      typemap="${arg#'--typemap='}"
-      typemap="$(get_abs_path ${typemap})"
-      args=("${args[@]}" "--typemap=${typemap}")
-      ;;
-    --bytecode_path=*)
-      bytecode_path="${arg#'--bytecode_path='}"
-      bytecode_path="$(get_abs_path ${bytecode_path})"
-      ;;
-    --generators=*)
-      generators="${arg#'--generators='}"
-      ;;
-    --*)
-      args=("${args[@]}" "${arg}")
-      ;;
-    *)
-      files=("${files[@]}" "$(get_abs_path ${arg})")
-      ;;
-  esac
-done
-
-cd "${package}"
-"${mojom_bindings_generator}" --use_bundled_pylibs precompile \
-    -o "${output_dir}"
-
-for file in "${files[@]}"; do
-  # Java source generations depends on zipfile that assumes the output directory
-  # already exists. So, we need to create the directory beforehand.
-  rel_path="${file#`pwd`/}"
-  rel_dir="${rel_path%/*}"
-
-  mkdir -p "${output_dir}/${rel_dir}"
-
-  # The calls to mojom_bindings_generator below uses -I option to include the
-  # libmojo root directory as part of searchable directory for imports. With
-  # this, we can have a mojo file located in some arbitrary directories that
-  # imports a mojo file under external/libmojo.
-  "${mojom_bindings_generator}" --use_bundled_pylibs generate \
-      -o "${output_dir}" "${args[@]}" \
-      --bytecode_path="${bytecode_path}" \
-      -I "${private_mojo_root}:${private_mojo_root}" \
-      --generators=${generators} "${file}"
-  if [[ "${generators}" =~ .*c\+\+.* ]] ; then
-    "${mojom_bindings_generator}" --use_bundled_pylibs generate \
-        -o "${output_dir}" \
-        --generate_non_variant_code "${args[@]}" \
-        -I "${private_mojo_root}:${private_mojo_root}" \
-        --bytecode_path="${bytecode_path}" --generators=${generators} \
-        "${file}"
-  fi
-  if [[ "${generators}" =~ .*java.* ]] ; then
-    unzip -qo -d "${output_dir}"/src "${output_dir}/${rel_path}".srcjar
-  fi
-done
diff --git a/third_party/catapult/LICENSE b/third_party/catapult/LICENSE
deleted file mode 100644
index c992fe4..0000000
--- a/third_party/catapult/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-Copyright 2015 The Chromium Authors. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-* Redistributions of source code must retain the above copyright notice, this
-  list of conditions and the following disclaimer.
-
-* Redistributions in binary form must reproduce the above copyright notice,
-  this list of conditions and the following disclaimer in the documentation
-  and/or other materials provided with the distribution.
-
-* Neither the name of catapult nor the names of its
-  contributors may be used to endorse or promote products derived from
-  this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
diff --git a/third_party/catapult/devil/PRESUBMIT.py b/third_party/catapult/devil/PRESUBMIT.py
deleted file mode 100644
index 289a5c6..0000000
--- a/third_party/catapult/devil/PRESUBMIT.py
+++ /dev/null
@@ -1,81 +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.
-
-"""Presubmit script for devil.
-
-See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts for
-details on the presubmit API built into depot_tools.
-"""
-
-
-def _RunPylint(input_api, output_api):
-  return input_api.RunTests(input_api.canned_checks.RunPylint(
-      input_api, output_api, pylintrc='pylintrc'))
-
-
-def _RunUnitTests(input_api, output_api):
-  def J(*dirs):
-    """Returns a path relative to presubmit directory."""
-    return input_api.os_path.join(
-        input_api.PresubmitLocalPath(), 'devil', *dirs)
-
-  test_env = dict(input_api.environ)
-  test_env.update({
-    'PYTHONDONTWRITEBYTECODE': '1',
-    'PYTHONPATH': ':'.join([J(), J('..')]),
-  })
-
-  message_type = (output_api.PresubmitError if input_api.is_committing
-                  else output_api.PresubmitPromptWarning)
-
-  return input_api.RunTests([
-      input_api.Command(
-          name='devil/bin/run_py_tests',
-          cmd=[
-            input_api.os_path.join(
-                input_api.PresubmitLocalPath(), 'bin', 'run_py_tests')],
-          kwargs={'env': test_env},
-          message=message_type)])
-
-
-def _EnsureNoPylibUse(input_api, output_api):
-  def other_python_files(f):
-    this_presubmit_file = input_api.os_path.join(
-        input_api.PresubmitLocalPath(), 'PRESUBMIT.py')
-    return (f.LocalPath().endswith('.py')
-            and not f.AbsoluteLocalPath() == this_presubmit_file)
-
-  changed_files = input_api.AffectedSourceFiles(other_python_files)
-  import_error_re = input_api.re.compile(
-      r'(from pylib.* import)|(import pylib)')
-
-  errors = []
-  for f in changed_files:
-    errors.extend(
-        '%s:%d' % (f.LocalPath(), line_number)
-        for line_number, line_text in f.ChangedContents()
-        if import_error_re.search(line_text))
-
-  if errors:
-    return [output_api.PresubmitError(
-        'pylib modules should not be imported from devil modules.',
-        items=errors)]
-  return []
-
-
-def CommonChecks(input_api, output_api):
-  output = []
-  output += _RunPylint(input_api, output_api)
-  output += _RunUnitTests(input_api, output_api)
-  output += _EnsureNoPylibUse(input_api, output_api)
-  return output
-
-
-def CheckChangeOnUpload(input_api, output_api):
-  return CommonChecks(input_api, output_api)
-
-
-def CheckChangeOnCommit(input_api, output_api):
-  return CommonChecks(input_api, output_api)
-
diff --git a/third_party/catapult/devil/README.md b/third_party/catapult/devil/README.md
deleted file mode 100644
index 852ac37..0000000
--- a/third_party/catapult/devil/README.md
+++ /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.
--->
-## devil
-
-😈
-
-devil is a library used by the Chromium developers to interact with Android
-devices. It currently supports SDK level 16 and above.
-
-## Interfaces
-
-devil provides python APIs:
-  - [`devil.android.adb_wrapper`](docs/adb_wrapper.md) provides a thin wrapper
-    around the adb binary. Most functions and methods have direct analogues on
-    the adb command-line.
-  - [`devil.android.device_utils`](docs/device_utils.md) provides higher-level
-    functionality built on top of `adb_wrapper`. **This is the primary
-    mechanism through which chromium's scripts interact with devices.**
-
-## Utilities
-
-devil also provides command-line utilities:
- - [`devil/utils/markdown.py`](docs/markdown.md) generated markdown
-   documentation for python modules.
-
-## Constraints and Caveats
-
-devil is used with python 2.7. Its compatibility with python 3 has not been
-tested, and neither achieving nor maintaining said compatibility is currently
-a priority.
-
-## Contributing
-
-Please see the [contributor's guide](https://github.com/catapult-project/catapult/blob/master/CONTRIBUTING.md).
-
diff --git a/third_party/catapult/devil/bin/generate_md_docs b/third_party/catapult/devil/bin/generate_md_docs
deleted file mode 100755
index 634e14a..0000000
--- a/third_party/catapult/devil/bin/generate_md_docs
+++ /dev/null
@@ -1,45 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import os
-import sys
-
-_DEVIL_PATH = os.path.abspath(os.path.join(
-    os.path.dirname(__file__), '..'))
-_DEVIL_URL = (
-    'https://github.com/catapult-project/catapult/blob/master/devil/')
-
-sys.path.append(_DEVIL_PATH)
-from devil.utils import cmd_helper
-
-_FILES_TO_DOC = {
-  'devil/android/sdk/adb_wrapper.py': 'docs/adb_wrapper.md',
-  'devil/android/device_utils.py': 'docs/device_utils.md',
-  'devil/utils/markdown.py': 'docs/markdown.md',
-}
-
-_MARKDOWN_SCRIPT = os.path.join(_DEVIL_PATH, 'devil', 'utils', 'markdown.py')
-
-def main():
-  failed = False
-  for k, v in _FILES_TO_DOC.iteritems():
-    module_path = os.path.join(_DEVIL_PATH, k)
-    module_link = _DEVIL_URL + k
-    doc_path = os.path.join(_DEVIL_PATH, v)
-
-    status, stdout = cmd_helper.GetCmdStatusAndOutput(
-        [sys.executable, _MARKDOWN_SCRIPT, module_path,
-         '--module-link', module_link])
-    if status:
-      logging.error('Failed to update doc for %s' % module_path)
-      failed = True
-    else:
-      with open(doc_path, 'w') as doc_file:
-        doc_file.write(stdout)
-
-  return 1 if failed else 0
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/third_party/catapult/devil/bin/run_py_devicetests b/third_party/catapult/devil/bin/run_py_devicetests
deleted file mode 100755
index 656bedf..0000000
--- a/third_party/catapult/devil/bin/run_py_devicetests
+++ /dev/null
@@ -1,32 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import os
-import sys
-
-_CATAPULT_PATH = os.path.abspath(os.path.join(
-    os.path.dirname(__file__), '..', '..'))
-_DEVIL_PATH = os.path.abspath(os.path.join(
-    os.path.dirname(__file__), '..'))
-_TYP_PATH = os.path.abspath(os.path.join(_CATAPULT_PATH, 'third_party', 'typ'))
-
-sys.path.append(_TYP_PATH)
-import typ
-
-sys.path.append(_DEVIL_PATH)
-from devil.android import device_test_case
-
-
-def main():
-  runner = typ.Runner()
-  runner.setup_fn = device_test_case.PrepareDevices
-  return runner.main(
-      coverage_source=[_DEVIL_PATH],
-      jobs=1,
-      suffixes=['*_devicetest.py'],
-      top_level_dir=_DEVIL_PATH)
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/third_party/catapult/devil/bin/run_py_tests b/third_party/catapult/devil/bin/run_py_tests
deleted file mode 100755
index 44ec61e..0000000
--- a/third_party/catapult/devil/bin/run_py_tests
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import os
-import sys
-
-_CATAPULT_PATH = os.path.abspath(os.path.join(
-    os.path.dirname(__file__), '..', '..'))
-_DEVIL_PATH = os.path.abspath(os.path.join(
-    os.path.dirname(__file__), '..'))
-
-sys.path.append(_CATAPULT_PATH)
-from catapult_build import run_with_typ
-
-
-def main():
-  return run_with_typ.Run(top_level_dir=_DEVIL_PATH)
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/third_party/catapult/devil/devil/__init__.py b/third_party/catapult/devil/devil/__init__.py
deleted file mode 100644
index 7de59c9..0000000
--- a/third_party/catapult/devil/devil/__init__.py
+++ /dev/null
@@ -1,7 +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.
-
-import logging
-
-logging.getLogger('devil').addHandler(logging.NullHandler())
diff --git a/third_party/catapult/devil/devil/android/__init__.py b/third_party/catapult/devil/devil/android/__init__.py
deleted file mode 100644
index 50b23df..0000000
--- a/third_party/catapult/devil/devil/android/__init__.py
+++ /dev/null
@@ -1,3 +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.
diff --git a/third_party/catapult/devil/devil/android/apk_helper.py b/third_party/catapult/devil/devil/android/apk_helper.py
deleted file mode 100644
index 1a9b8c5..0000000
--- a/third_party/catapult/devil/devil/android/apk_helper.py
+++ /dev/null
@@ -1,164 +0,0 @@
-# Copyright (c) 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.
-
-"""Module containing utilities for apk packages."""
-
-import itertools
-import re
-
-from devil import base_error
-from devil.android.sdk import aapt
-
-
-_MANIFEST_ATTRIBUTE_RE = re.compile(
-    r'\s*A: ([^\(\)= ]*)(?:\([^\(\)= ]*\))?='
-    r'(?:"(.*)" \(Raw: .*\)|\(type.*?\)(.*))$')
-_MANIFEST_ELEMENT_RE = re.compile(r'\s*(?:E|N): (\S*) .*$')
-
-
-def GetPackageName(apk_path):
-  """Returns the package name of the apk."""
-  return ApkHelper(apk_path).GetPackageName()
-
-
-# TODO(jbudorick): Deprecate and remove this function once callers have been
-# converted to ApkHelper.GetInstrumentationName
-def GetInstrumentationName(apk_path):
-  """Returns the name of the Instrumentation in the apk."""
-  return ApkHelper(apk_path).GetInstrumentationName()
-
-
-def ToHelper(path_or_helper):
-  """Creates an ApkHelper unless one is already given."""
-  if isinstance(path_or_helper, basestring):
-    return ApkHelper(path_or_helper)
-  return path_or_helper
-
-
-def _ParseManifestFromApk(apk_path):
-  aapt_output = aapt.Dump('xmltree', apk_path, 'AndroidManifest.xml')
-
-  parsed_manifest = {}
-  node_stack = [parsed_manifest]
-  indent = '  '
-
-  for line in aapt_output[1:]:
-    if len(line) == 0:
-      continue
-
-    indent_depth = 0
-    while line[(len(indent) * indent_depth):].startswith(indent):
-      indent_depth += 1
-
-    node_stack = node_stack[:indent_depth]
-    node = node_stack[-1]
-
-    m = _MANIFEST_ELEMENT_RE.match(line[len(indent) * indent_depth:])
-    if m:
-      manifest_key = m.group(1)
-      if manifest_key in node:
-        node[manifest_key] += [{}]
-      else:
-        node[manifest_key] = [{}]
-      node_stack += [node[manifest_key][-1]]
-      continue
-
-    m = _MANIFEST_ATTRIBUTE_RE.match(line[len(indent) * indent_depth:])
-    if m:
-      manifest_key = m.group(1)
-      if manifest_key in node:
-        raise base_error.BaseError(
-            "A single attribute should have one key and one value")
-      else:
-        node[manifest_key] = m.group(2) or m.group(3)
-      continue
-
-  return parsed_manifest
-
-
-class ApkHelper(object):
-
-  def __init__(self, path):
-    self._apk_path = path
-    self._manifest = None
-
-  @property
-  def path(self):
-    return self._apk_path
-
-  def GetActivityName(self):
-    """Returns the name of the Activity in the apk."""
-    manifest_info = self._GetManifest()
-    try:
-      activity = (
-          manifest_info['manifest'][0]['application'][0]['activity'][0]
-              ['android:name'])
-    except KeyError:
-      return None
-    if '.' not in activity:
-      activity = '%s.%s' % (self.GetPackageName(), activity)
-    elif activity.startswith('.'):
-      activity = '%s%s' % (self.GetPackageName(), activity)
-    return activity
-
-  def GetInstrumentationName(
-      self, default='android.test.InstrumentationTestRunner'):
-    """Returns the name of the Instrumentation in the apk."""
-    all_instrumentations = self.GetAllInstrumentations(default=default)
-    if len(all_instrumentations) != 1:
-      raise base_error.BaseError(
-          'There is more than one instrumentation. Expected one.')
-    else:
-      return all_instrumentations[0]['android:name']
-
-  def GetAllInstrumentations(
-      self, default='android.test.InstrumentationTestRunner'):
-    """Returns a list of all Instrumentations in the apk."""
-    try:
-      return self._GetManifest()['manifest'][0]['instrumentation']
-    except KeyError:
-      return [{'android:name': default}]
-
-  def GetPackageName(self):
-    """Returns the package name of the apk."""
-    manifest_info = self._GetManifest()
-    try:
-      return manifest_info['manifest'][0]['package']
-    except KeyError:
-      raise Exception('Failed to determine package name of %s' % self._apk_path)
-
-  def GetPermissions(self):
-    manifest_info = self._GetManifest()
-    try:
-      return [p['android:name'] for
-              p in manifest_info['manifest'][0]['uses-permission']]
-    except KeyError:
-      return []
-
-  def GetSplitName(self):
-    """Returns the name of the split of the apk."""
-    manifest_info = self._GetManifest()
-    try:
-      return manifest_info['manifest'][0]['split']
-    except KeyError:
-      return None
-
-  def HasIsolatedProcesses(self):
-    """Returns whether any services exist that use isolatedProcess=true."""
-    manifest_info = self._GetManifest()
-    try:
-      applications = manifest_info['manifest'][0].get('application', [])
-      services = itertools.chain(
-          *(application.get('service', []) for application in applications))
-      return any(
-          int(s.get('android:isolatedProcess', '0'), 0)
-          for s in services)
-    except KeyError:
-      return False
-
-  def _GetManifest(self):
-    if not self._manifest:
-      self._manifest = _ParseManifestFromApk(self._apk_path)
-    return self._manifest
-
diff --git a/third_party/catapult/devil/devil/android/apk_helper_test.py b/third_party/catapult/devil/devil/android/apk_helper_test.py
deleted file mode 100755
index f7d077d..0000000
--- a/third_party/catapult/devil/devil/android/apk_helper_test.py
+++ /dev/null
@@ -1,169 +0,0 @@
-#! /usr/bin/env python
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-from devil import base_error
-from devil import devil_env
-from devil.android import apk_helper
-from devil.utils import mock_calls
-
-with devil_env.SysPath(devil_env.PYMOCK_PATH):
-  import mock  # pylint: disable=import-error
-
-
-_MANIFEST_DUMP = """N: android=http://schemas.android.com/apk/res/android
-  E: manifest (line=1)
-    A: package="org.chromium.abc" (Raw: "org.chromium.abc")
-    A: split="random_split" (Raw: "random_split")
-    E: uses-permission (line=2)
-      A: android:name(0x01010003)="android.permission.INTERNET" (Raw: "android.permission.INTERNET")
-    E: uses-permission (line=3)
-      A: android:name(0x01010003)="android.permission.READ_EXTERNAL_STORAGE" (Raw: "android.permission.READ_EXTERNAL_STORAGE")
-    E: uses-permission (line=4)
-      A: android:name(0x01010003)="android.permission.ACCESS_FINE_LOCATION" (Raw: "android.permission.ACCESS_FINE_LOCATION")
-    E: application (line=5)
-      E: activity (line=6)
-        A: android:name(0x01010003)="org.chromium.ActivityName" (Raw: "org.chromium.ActivityName")
-        A: android:exported(0x01010010)=(type 0x12)0xffffffff
-      E: service (line=7)
-        A: android:name(0x01010001)="org.chromium.RandomService" (Raw: "org.chromium.RandomService")
-        A: android:isolatedProcess(0x01010888)=(type 0x12)0xffffffff
-    E: instrumentation (line=8)
-      A: android:label(0x01010001)="abc" (Raw: "abc")
-      A: android:name(0x01010003)="org.chromium.RandomJUnit4TestRunner" (Raw: "org.chromium.RandomJUnit4TestRunner")
-      A: android:targetPackage(0x01010021)="org.chromium.random_package" (Raw:"org.chromium.random_pacakge")
-      A: junit4=(type 0x12)0xffffffff (Raw: "true")
-    E: instrumentation (line=9)
-      A: android:label(0x01010001)="abc" (Raw: "abc")
-      A: android:name(0x01010003)="org.chromium.RandomTestRunner" (Raw: "org.chromium.RandomTestRunner")
-      A: android:targetPackage(0x01010021)="org.chromium.random_package" (Raw:"org.chromium.random_pacakge")
-"""
-
-_NO_ISOLATED_SERVICES = """N: android=http://schemas.android.com/apk/res/android
-  E: manifest (line=1)
-    A: package="org.chromium.abc" (Raw: "org.chromium.abc")
-    E: application (line=5)
-      E: activity (line=6)
-        A: android:name(0x01010003)="org.chromium.ActivityName" (Raw: "org.chromium.ActivityName")
-        A: android:exported(0x01010010)=(type 0x12)0xffffffff
-      E: service (line=7)
-        A: android:name(0x01010001)="org.chromium.RandomService" (Raw: "org.chromium.RandomService")
-"""
-
-_NO_SERVICES = """N: android=http://schemas.android.com/apk/res/android
-  E: manifest (line=1)
-    A: package="org.chromium.abc" (Raw: "org.chromium.abc")
-    E: application (line=5)
-      E: activity (line=6)
-        A: android:name(0x01010003)="org.chromium.ActivityName" (Raw: "org.chromium.ActivityName")
-        A: android:exported(0x01010010)=(type 0x12)0xffffffff
-"""
-
-_NO_APPLICATION = """N: android=http://schemas.android.com/apk/res/android
-  E: manifest (line=1)
-    A: package="org.chromium.abc" (Raw: "org.chromium.abc")
-"""
-
-_SINGLE_INSTRUMENTATION_MANIFEST_DUMP = """N: android=http://schemas.android.com/apk/res/android
-  E: manifest (line=1)
-    A: package="org.chromium.xyz" (Raw: "org.chromium.xyz")
-    E: instrumentation (line=8)
-      A: android:label(0x01010001)="xyz" (Raw: "xyz")
-      A: android:name(0x01010003)="org.chromium.RandomTestRunner" (Raw: "org.chromium.RandomTestRunner")
-      A: android:targetPackage(0x01010021)="org.chromium.random_package" (Raw:"org.chromium.random_pacakge")
-"""
-
-_SINGLE_J4_INSTRUMENTATION_MANIFEST_DUMP = """N: android=http://schemas.android.com/apk/res/android
-  E: manifest (line=1)
-    A: package="org.chromium.xyz" (Raw: "org.chromium.xyz")
-    E: instrumentation (line=8)
-      A: android:label(0x01010001)="xyz" (Raw: "xyz")
-      A: android:name(0x01010003)="org.chromium.RandomJ4TestRunner" (Raw: "org.chromium.RandomJ4TestRunner")
-      A: android:targetPackage(0x01010021)="org.chromium.random_package" (Raw:"org.chromium.random_pacakge")
-      A: junit4=(type 0x12)0xffffffff (Raw: "true")
-"""
-
-
-def _MockAaptDump(manifest_dump):
-  return mock.patch(
-      'devil.android.sdk.aapt.Dump',
-      mock.Mock(side_effect=None, return_value=manifest_dump.split('\n')))
-
-class ApkHelperTest(mock_calls.TestCase):
-
-  def testGetInstrumentationName(self):
-    with _MockAaptDump(_MANIFEST_DUMP):
-      helper = apk_helper.ApkHelper("")
-      with self.assertRaises(base_error.BaseError):
-        helper.GetInstrumentationName()
-
-  def testGetActivityName(self):
-    with _MockAaptDump(_MANIFEST_DUMP):
-      helper = apk_helper.ApkHelper("")
-      self.assertEquals(
-          helper.GetActivityName(), 'org.chromium.ActivityName')
-
-  def testGetAllInstrumentations(self):
-    with _MockAaptDump(_MANIFEST_DUMP):
-      helper = apk_helper.ApkHelper("")
-      all_instrumentations = helper.GetAllInstrumentations()
-      self.assertEquals(len(all_instrumentations), 2)
-      self.assertEquals(all_instrumentations[0]['android:name'],
-                        'org.chromium.RandomJUnit4TestRunner')
-      self.assertEquals(all_instrumentations[1]['android:name'],
-                        'org.chromium.RandomTestRunner')
-
-  def testGetPackageName(self):
-    with _MockAaptDump(_MANIFEST_DUMP):
-      helper = apk_helper.ApkHelper("")
-      self.assertEquals(helper.GetPackageName(), 'org.chromium.abc')
-
-  def testGetPermssions(self):
-    with _MockAaptDump(_MANIFEST_DUMP):
-      helper = apk_helper.ApkHelper("")
-      all_permissions = helper.GetPermissions()
-      self.assertEquals(len(all_permissions), 3)
-      self.assertTrue('android.permission.INTERNET' in all_permissions)
-      self.assertTrue(
-          'android.permission.READ_EXTERNAL_STORAGE' in all_permissions)
-      self.assertTrue(
-          'android.permission.ACCESS_FINE_LOCATION' in all_permissions)
-
-  def testGetSplitName(self):
-    with _MockAaptDump(_MANIFEST_DUMP):
-      helper = apk_helper.ApkHelper("")
-      self.assertEquals(helper.GetSplitName(), 'random_split')
-
-  def testHasIsolatedProcesses_noApplication(self):
-    with _MockAaptDump(_NO_APPLICATION):
-      helper = apk_helper.ApkHelper("")
-      self.assertFalse(helper.HasIsolatedProcesses())
-
-  def testHasIsolatedProcesses_noServices(self):
-    with _MockAaptDump(_NO_SERVICES):
-      helper = apk_helper.ApkHelper("")
-      self.assertFalse(helper.HasIsolatedProcesses())
-
-  def testHasIsolatedProcesses_oneNotIsolatedProcess(self):
-    with _MockAaptDump(_NO_ISOLATED_SERVICES):
-      helper = apk_helper.ApkHelper("")
-      self.assertFalse(helper.HasIsolatedProcesses())
-
-  def testHasIsolatedProcesses_oneIsolatedProcess(self):
-    with _MockAaptDump(_MANIFEST_DUMP):
-      helper = apk_helper.ApkHelper("")
-      self.assertTrue(helper.HasIsolatedProcesses())
-
-  def testGetSingleInstrumentationName(self):
-    with _MockAaptDump(_SINGLE_INSTRUMENTATION_MANIFEST_DUMP):
-      helper = apk_helper.ApkHelper("")
-      self.assertEquals('org.chromium.RandomTestRunner',
-                        helper.GetInstrumentationName())
-
-  def testGetSingleJUnit4InstrumentationName(self):
-    with _MockAaptDump(_SINGLE_J4_INSTRUMENTATION_MANIFEST_DUMP):
-      helper = apk_helper.ApkHelper("")
-      self.assertEquals('org.chromium.RandomJ4TestRunner',
-                        helper.GetInstrumentationName())
-
diff --git a/third_party/catapult/devil/devil/android/app_ui.py b/third_party/catapult/devil/devil/android/app_ui.py
deleted file mode 100644
index 2b04e8b..0000000
--- a/third_party/catapult/devil/devil/android/app_ui.py
+++ /dev/null
@@ -1,243 +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.
-
-"""Provides functionality to interact with UI elements of an Android app."""
-
-import collections
-import re
-from xml.etree import ElementTree as element_tree
-
-from devil.android import decorators
-from devil.android import device_temp_file
-from devil.utils import geometry
-from devil.utils import timeout_retry
-
-_DEFAULT_SHORT_TIMEOUT = 10
-_DEFAULT_SHORT_RETRIES = 3
-_DEFAULT_LONG_TIMEOUT = 30
-_DEFAULT_LONG_RETRIES = 0
-
-# Parse rectangle bounds given as: '[left,top][right,bottom]'.
-_RE_BOUNDS = re.compile(
-    r'\[(?P<left>\d+),(?P<top>\d+)\]\[(?P<right>\d+),(?P<bottom>\d+)\]')
-
-
-class _UiNode(object):
-
-  def __init__(self, device, xml_node, package=None):
-    """Object to interact with a UI node from an xml snapshot.
-
-    Note: there is usually no need to call this constructor directly. Instead,
-    use an AppUi object (below) to grab an xml screenshot from a device and
-    find nodes in it.
-
-    Args:
-      device: A device_utils.DeviceUtils instance.
-      xml_node: An ElementTree instance of the node to interact with.
-      package: An optional package name for the app owning this node.
-    """
-    self._device = device
-    self._xml_node = xml_node
-    self._package = package
-
-  def _GetAttribute(self, key):
-    """Get the value of an attribute of this node."""
-    return self._xml_node.attrib.get(key)
-
-  @property
-  def bounds(self):
-    """Get a rectangle with the bounds of this UI node.
-
-    Returns:
-      A geometry.Rectangle instance.
-    """
-    d = _RE_BOUNDS.match(self._GetAttribute('bounds')).groupdict()
-    return geometry.Rectangle.FromDict({k: int(v) for k, v in d.iteritems()})
-
-  def Tap(self, point=None, dp_units=False):
-    """Send a tap event to the UI node.
-
-    Args:
-      point: An optional geometry.Point instance indicating the location to
-        tap, relative to the bounds of the UI node, i.e. (0, 0) taps the
-        top-left corner. If ommited, the center of the node is tapped.
-      dp_units: If True, indicates that the coordinates of the point are given
-        in device-independent pixels; otherwise they are assumed to be "real"
-        pixels. This option has no effect when the point is ommited.
-    """
-    if point is None:
-      point = self.bounds.center
-    else:
-      if dp_units:
-        point = (float(self._device.pixel_density) / 160) * point
-      point += self.bounds.top_left
-
-    x, y = (str(int(v)) for v in point)
-    self._device.RunShellCommand(['input', 'tap', x, y], check_return=True)
-
-  def Dump(self):
-    """Get a brief summary of the child nodes that can be found on this node.
-
-    Returns:
-      A list of lines that can be logged or otherwise printed.
-    """
-    summary = collections.defaultdict(set)
-    for node in self._xml_node.iter():
-      package = node.get('package') or '(no package)'
-      label = node.get('resource-id') or '(no id)'
-      text = node.get('text')
-      if text:
-        label = '%s[%r]' % (label, text)
-      summary[package].add(label)
-    lines = []
-    for package, labels in sorted(summary.iteritems()):
-      lines.append('- %s:' % package)
-      for label in sorted(labels):
-        lines.append('  - %s' % label)
-    return lines
-
-  def __getitem__(self, key):
-    """Retrieve a child of this node by its index.
-
-    Args:
-      key: An integer with the index of the child to retrieve.
-    Returns:
-      A UI node instance of the selected child.
-    Raises:
-      IndexError if the index is out of range.
-    """
-    return type(self)(self._device, self._xml_node[key], package=self._package)
-
-  def _Find(self, **kwargs):
-    """Find the first descendant node that matches a given criteria.
-
-    Note: clients would usually call AppUi.GetUiNode or AppUi.WaitForUiNode
-    instead.
-
-    For example:
-
-      app = app_ui.AppUi(device, package='org.my.app')
-      app.GetUiNode(resource_id='some_element', text='hello')
-
-    would retrieve the first matching node with both of the xml attributes:
-
-      resource-id='org.my.app:id/some_element'
-      text='hello'
-
-    As the example shows, if given and needed, the value of the resource_id key
-    is auto-completed with the package name specified in the AppUi constructor.
-
-    Args:
-      Arguments are specified as key-value pairs, where keys correnspond to
-      attribute names in xml nodes (replacing any '-' with '_' to make them
-      valid identifiers). At least one argument must be supplied, and arguments
-      with a None value are ignored.
-    Returns:
-      A UI node instance of the first descendant node that matches ALL the
-      given key-value criteria; or None if no such node is found.
-    Raises:
-      TypeError if no search arguments are provided.
-    """
-    matches_criteria = self._NodeMatcher(kwargs)
-    for node in self._xml_node.iter():
-      if matches_criteria(node):
-        return type(self)(self._device, node, package=self._package)
-    return None
-
-  def _NodeMatcher(self, kwargs):
-    # Auto-complete resource-id's using the package name if available.
-    resource_id = kwargs.get('resource_id')
-    if (resource_id is not None
-        and self._package is not None
-        and ':id/' not in resource_id):
-      kwargs['resource_id'] = '%s:id/%s' % (self._package, resource_id)
-
-    criteria = [(k.replace('_', '-'), v)
-                for k, v in kwargs.iteritems()
-                if v is not None]
-    if not criteria:
-      raise TypeError('At least one search criteria should be specified')
-    return lambda node: all(node.get(k) == v for k, v in criteria)
-
-
-class AppUi(object):
-  # timeout and retry arguments appear unused, but are handled by decorator.
-  # pylint: disable=unused-argument
-
-  def __init__(self, device, package=None):
-    """Object to interact with the UI of an Android app.
-
-    Args:
-      device: A device_utils.DeviceUtils instance.
-      package: An optional package name for the app.
-    """
-    self._device = device
-    self._package = package
-
-  @property
-  def package(self):
-    return self._package
-
-  @decorators.WithTimeoutAndRetriesDefaults(_DEFAULT_SHORT_TIMEOUT,
-                                            _DEFAULT_SHORT_RETRIES)
-  def _GetRootUiNode(self, timeout=None, retries=None):
-    """Get a node pointing to the root of the UI nodes on screen.
-
-    Note: This is currently implemented via adb calls to uiatomator and it
-    is *slow*, ~2 secs per call. Do not rely on low-level implementation
-    details that may change in the future.
-
-    TODO(crbug.com/567217): Swap to a more efficient implementation.
-
-    Args:
-      timeout: A number of seconds to wait for the uiautomator dump.
-      retries: Number of times to retry if the adb command fails.
-    Returns:
-      A UI node instance pointing to the root of the xml screenshot.
-    """
-    with device_temp_file.DeviceTempFile(self._device.adb) as dtemp:
-      self._device.RunShellCommand(['uiautomator', 'dump', dtemp.name],
-                                  check_return=True)
-      xml_node = element_tree.fromstring(
-          self._device.ReadFile(dtemp.name, force_pull=True))
-    return _UiNode(self._device, xml_node, package=self._package)
-
-  def ScreenDump(self):
-    """Get a brief summary of the nodes that can be found on the screen.
-
-    Returns:
-      A list of lines that can be logged or otherwise printed.
-    """
-    return self._GetRootUiNode().Dump()
-
-  def GetUiNode(self, **kwargs):
-    """Get the first node found matching a specified criteria.
-
-    Args:
-      See _UiNode._Find.
-    Returns:
-      A UI node instance of the node if found, otherwise None.
-    """
-    # pylint: disable=protected-access
-    return self._GetRootUiNode()._Find(**kwargs)
-
-  @decorators.WithTimeoutAndRetriesDefaults(_DEFAULT_LONG_TIMEOUT,
-                                            _DEFAULT_LONG_RETRIES)
-  def WaitForUiNode(self, timeout=None, retries=None, **kwargs):
-    """Wait for a node matching a given criteria to appear on the screen.
-
-    Args:
-      timeout: A number of seconds to wait for the matching node to appear.
-      retries: Number of times to retry in case of adb command errors.
-      For other args, to specify the search criteria, see _UiNode._Find.
-    Returns:
-      The UI node instance found.
-    Raises:
-      device_errors.CommandTimeoutError if the node is not found before the
-      timeout.
-    """
-    def node_found():
-      return self.GetUiNode(**kwargs)
-
-    return timeout_retry.WaitFor(node_found)
diff --git a/third_party/catapult/devil/devil/android/app_ui_test.py b/third_party/catapult/devil/devil/android/app_ui_test.py
deleted file mode 100644
index 3472985..0000000
--- a/third_party/catapult/devil/devil/android/app_ui_test.py
+++ /dev/null
@@ -1,191 +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.
-
-"""Unit tests for the app_ui module."""
-
-import unittest
-from xml.etree import ElementTree as element_tree
-
-from devil import devil_env
-from devil.android import app_ui
-from devil.android import device_errors
-from devil.utils import geometry
-
-with devil_env.SysPath(devil_env.PYMOCK_PATH):
-  import mock  # pylint: disable=import-error
-
-
-MOCK_XML_LOADING = '''
-<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
-<hierarchy rotation="0">
-  <node bounds="[0,50][1536,178]" content-desc="Loading"
-      resource-id="com.example.app:id/spinner"/>
-</hierarchy>
-'''.strip()
-
-
-MOCK_XML_LOADED = '''
-<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
-<hierarchy rotation="0">
-  <node bounds="[0,50][1536,178]" content-desc=""
-      resource-id="com.example.app:id/toolbar">
-    <node bounds="[0,58][112,170]" content-desc="Open navigation drawer"/>
-    <node bounds="[121,50][1536,178]"
-        resource-id="com.example.app:id/actionbar_custom_view">
-      <node bounds="[121,50][1424,178]"
-          resource-id="com.example.app:id/actionbar_title" text="Primary"/>
-      <node bounds="[1424,50][1536,178]" content-desc="Search"
-          resource-id="com.example.app:id/actionbar_search_button"/>
-    </node>
-  </node>
-  <node bounds="[0,178][576,1952]" resource-id="com.example.app:id/drawer">
-    <node bounds="[0,178][144,1952]"
-        resource-id="com.example.app:id/mini_drawer">
-      <node bounds="[40,254][104,318]" resource-id="com.example.app:id/avatar"/>
-      <node bounds="[16,354][128,466]" content-desc="Primary"
-          resource-id="com.example.app:id/image_view"/>
-      <node bounds="[16,466][128,578]" content-desc="Social"
-          resource-id="com.example.app:id/image_view"/>
-      <node bounds="[16,578][128,690]" content-desc="Promotions"
-          resource-id="com.example.app:id/image_view"/>
-    </node>
-  </node>
-</hierarchy>
-'''.strip()
-
-
-class UiAppTest(unittest.TestCase):
-
-  def setUp(self):
-    self.device = mock.Mock()
-    self.device.pixel_density = 320  # Each dp pixel is 2 real pixels.
-    self.app = app_ui.AppUi(self.device, package='com.example.app')
-    self._setMockXmlScreenshots([MOCK_XML_LOADED])
-
-  def _setMockXmlScreenshots(self, xml_docs):
-    """Mock self.app._GetRootUiNode to load nodes from some test xml_docs.
-
-    Each time the method is called it will return a UI node for each string
-    given in |xml_docs|, or rise a time out error when the list is exhausted.
-    """
-    # pylint: disable=protected-access
-    def get_mock_root_ui_node(value):
-      if isinstance(value, Exception):
-        raise value
-      return app_ui._UiNode(
-          self.device, element_tree.fromstring(value), self.app.package)
-
-    xml_docs.append(device_errors.CommandTimeoutError('Timed out!'))
-
-    self.app._GetRootUiNode = mock.Mock(
-        side_effect=(get_mock_root_ui_node(doc) for doc in xml_docs))
-
-  def assertNodeHasAttribs(self, node, attr):
-    # pylint: disable=protected-access
-    for key, value in attr.iteritems():
-      self.assertEquals(node._GetAttribute(key), value)
-
-  def assertTappedOnceAt(self, x, y):
-    self.device.RunShellCommand.assert_called_once_with(
-        ['input', 'tap', str(x), str(y)], check_return=True)
-
-  def testFind_byText(self):
-    node = self.app.GetUiNode(text='Primary')
-    self.assertNodeHasAttribs(node, {
-        'text': 'Primary',
-        'content-desc': None,
-        'resource-id': 'com.example.app:id/actionbar_title',
-    })
-    self.assertEquals(node.bounds, geometry.Rectangle([121, 50], [1424, 178]))
-
-  def testFind_byContentDesc(self):
-    node = self.app.GetUiNode(content_desc='Social')
-    self.assertNodeHasAttribs(node, {
-        'text': None,
-        'content-desc': 'Social',
-        'resource-id': 'com.example.app:id/image_view',
-    })
-    self.assertEquals(node.bounds, geometry.Rectangle([16, 466], [128, 578]))
-
-  def testFind_byResourceId_autocompleted(self):
-    node = self.app.GetUiNode(resource_id='image_view')
-    self.assertNodeHasAttribs(node, {
-        'content-desc': 'Primary',
-        'resource-id': 'com.example.app:id/image_view',
-    })
-
-  def testFind_byResourceId_absolute(self):
-    node = self.app.GetUiNode(resource_id='com.example.app:id/image_view')
-    self.assertNodeHasAttribs(node, {
-        'content-desc': 'Primary',
-        'resource-id': 'com.example.app:id/image_view',
-    })
-
-  def testFind_byMultiple(self):
-    node = self.app.GetUiNode(resource_id='image_view',
-                              content_desc='Promotions')
-    self.assertNodeHasAttribs(node, {
-        'content-desc': 'Promotions',
-        'resource-id': 'com.example.app:id/image_view',
-    })
-    self.assertEquals(node.bounds, geometry.Rectangle([16, 578], [128, 690]))
-
-  def testFind_notFound(self):
-    node = self.app.GetUiNode(resource_id='does_not_exist')
-    self.assertIsNone(node)
-
-  def testFind_noArgsGiven(self):
-    # Same exception given by Python for a function call with not enough args.
-    with self.assertRaises(TypeError):
-      self.app.GetUiNode()
-
-  def testGetChildren(self):
-    node = self.app.GetUiNode(resource_id='mini_drawer')
-    self.assertNodeHasAttribs(
-        node[0], {'resource-id': 'com.example.app:id/avatar'})
-    self.assertNodeHasAttribs(node[1], {'content-desc': 'Primary'})
-    self.assertNodeHasAttribs(node[2], {'content-desc': 'Social'})
-    self.assertNodeHasAttribs(node[3], {'content-desc': 'Promotions'})
-    with self.assertRaises(IndexError):
-      # pylint: disable=pointless-statement
-      node[4]
-
-  def testTap_center(self):
-    node = self.app.GetUiNode(content_desc='Open navigation drawer')
-    node.Tap()
-    self.assertTappedOnceAt(56, 114)
-
-  def testTap_topleft(self):
-    node = self.app.GetUiNode(content_desc='Open navigation drawer')
-    node.Tap(geometry.Point(0, 0))
-    self.assertTappedOnceAt(0, 58)
-
-  def testTap_withOffset(self):
-    node = self.app.GetUiNode(content_desc='Open navigation drawer')
-    node.Tap(geometry.Point(10, 20))
-    self.assertTappedOnceAt(10, 78)
-
-  def testTap_withOffsetInDp(self):
-    node = self.app.GetUiNode(content_desc='Open navigation drawer')
-    node.Tap(geometry.Point(10, 20), dp_units=True)
-    self.assertTappedOnceAt(20, 98)
-
-  def testTap_dpUnitsIgnored(self):
-    node = self.app.GetUiNode(content_desc='Open navigation drawer')
-    node.Tap(dp_units=True)
-    self.assertTappedOnceAt(56, 114)  # Still taps at center.
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testWaitForUiNode_found(self):
-    self._setMockXmlScreenshots(
-        [MOCK_XML_LOADING, MOCK_XML_LOADING, MOCK_XML_LOADED])
-    node = self.app.WaitForUiNode(resource_id='actionbar_title')
-    self.assertNodeHasAttribs(node, {'text': 'Primary'})
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testWaitForUiNode_notFound(self):
-    self._setMockXmlScreenshots(
-        [MOCK_XML_LOADING, MOCK_XML_LOADING, MOCK_XML_LOADING])
-    with self.assertRaises(device_errors.CommandTimeoutError):
-      self.app.WaitForUiNode(resource_id='actionbar_title')
diff --git a/third_party/catapult/devil/devil/android/battery_utils.py b/third_party/catapult/devil/devil/android/battery_utils.py
deleted file mode 100644
index 3b225aa..0000000
--- a/third_party/catapult/devil/devil/android/battery_utils.py
+++ /dev/null
@@ -1,699 +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.
-
-"""Provides a variety of device interactions with power.
-"""
-# pylint: disable=unused-argument
-
-import collections
-import contextlib
-import csv
-import logging
-
-from devil.android import decorators
-from devil.android import device_errors
-from devil.android import device_utils
-from devil.android.sdk import version_codes
-from devil.utils import timeout_retry
-
-logger = logging.getLogger(__name__)
-
-_DEFAULT_TIMEOUT = 30
-_DEFAULT_RETRIES = 3
-
-
-_DEVICE_PROFILES = [
-  {
-    'name': ['Nexus 4'],
-    'enable_command': (
-        'echo 0 > /sys/module/pm8921_charger/parameters/disabled && '
-        'dumpsys battery reset'),
-    'disable_command': (
-        'echo 1 > /sys/module/pm8921_charger/parameters/disabled && '
-        'dumpsys battery set ac 0 && dumpsys battery set usb 0'),
-    'charge_counter': None,
-    'voltage': None,
-    'current': None,
-  },
-  {
-    'name': ['Nexus 5'],
-    # Nexus 5
-    # Setting the HIZ bit of the bq24192 causes the charger to actually ignore
-    # energy coming from USB. Setting the power_supply offline just updates the
-    # Android system to reflect that.
-    'enable_command': (
-        'echo 0x4A > /sys/kernel/debug/bq24192/INPUT_SRC_CONT && '
-        'chmod 644 /sys/class/power_supply/usb/online && '
-        'echo 1 > /sys/class/power_supply/usb/online && '
-        'dumpsys battery reset'),
-    'disable_command': (
-        'echo 0xCA > /sys/kernel/debug/bq24192/INPUT_SRC_CONT && '
-        'chmod 644 /sys/class/power_supply/usb/online && '
-        'echo 0 > /sys/class/power_supply/usb/online && '
-        'dumpsys battery set ac 0 && dumpsys battery set usb 0'),
-    'charge_counter': None,
-    'voltage': None,
-    'current': None,
-  },
-  {
-    'name': ['Nexus 6'],
-    'enable_command': (
-        'echo 1 > /sys/class/power_supply/battery/charging_enabled && '
-        'dumpsys battery reset'),
-    'disable_command': (
-        'echo 0 > /sys/class/power_supply/battery/charging_enabled && '
-        'dumpsys battery set ac 0 && dumpsys battery set usb 0'),
-    'charge_counter': (
-        '/sys/class/power_supply/max170xx_battery/charge_counter_ext'),
-    'voltage': '/sys/class/power_supply/max170xx_battery/voltage_now',
-    'current': '/sys/class/power_supply/max170xx_battery/current_now',
-  },
-  {
-    'name': ['Nexus 9'],
-    'enable_command': (
-        'echo Disconnected > '
-        '/sys/bus/i2c/drivers/bq2419x/0-006b/input_cable_state && '
-        'dumpsys battery reset'),
-    'disable_command': (
-        'echo Connected > '
-        '/sys/bus/i2c/drivers/bq2419x/0-006b/input_cable_state && '
-        'dumpsys battery set ac 0 && dumpsys battery set usb 0'),
-    'charge_counter': '/sys/class/power_supply/battery/charge_counter_ext',
-    'voltage': '/sys/class/power_supply/battery/voltage_now',
-    'current': '/sys/class/power_supply/battery/current_now',
-  },
-  {
-    'name': ['Nexus 10'],
-    'enable_command': None,
-    'disable_command': None,
-    'charge_counter': None,
-    'voltage': '/sys/class/power_supply/ds2784-fuelgauge/voltage_now',
-    'current': '/sys/class/power_supply/ds2784-fuelgauge/current_now',
-
-  },
-  {
-    'name': ['Nexus 5X'],
-    'enable_command': (
-        'echo 1 > /sys/class/power_supply/battery/charging_enabled && '
-        'dumpsys battery reset'),
-    'disable_command': (
-        'echo 0 > /sys/class/power_supply/battery/charging_enabled && '
-        'dumpsys battery set ac 0 && dumpsys battery set usb 0'),
-    'charge_counter': None,
-    'voltage': None,
-    'current': None,
-  },
-  { # Galaxy s5
-    'name': ['SM-G900H'],
-    'enable_command': (
-        'chmod 644 /sys/class/power_supply/battery/test_mode && '
-        'chmod 644 /sys/class/power_supply/sec-charger/current_now && '
-        'echo 0 > /sys/class/power_supply/battery/test_mode && '
-        'echo 9999 > /sys/class/power_supply/sec-charger/current_now &&'
-        'dumpsys battery reset'),
-    'disable_command': (
-        'chmod 644 /sys/class/power_supply/battery/test_mode && '
-        'chmod 644 /sys/class/power_supply/sec-charger/current_now && '
-        'echo 1 > /sys/class/power_supply/battery/test_mode && '
-        'echo 0 > /sys/class/power_supply/sec-charger/current_now && '
-        'dumpsys battery set ac 0 && dumpsys battery set usb 0'),
-    'charge_counter': None,
-    'voltage': '/sys/class/power_supply/sec-fuelgauge/voltage_now',
-    'current': '/sys/class/power_supply/sec-charger/current_now',
-  },
-  { # Galaxy s6, Galaxy s6, Galaxy s6 edge
-    'name': ['SM-G920F', 'SM-G920V', 'SM-G925V'],
-    'enable_command': (
-        'chmod 644 /sys/class/power_supply/battery/test_mode && '
-        'chmod 644 /sys/class/power_supply/max77843-charger/current_now && '
-        'echo 0 > /sys/class/power_supply/battery/test_mode && '
-        'echo 9999 > /sys/class/power_supply/max77843-charger/current_now &&'
-        'dumpsys battery reset'),
-    'disable_command': (
-        'chmod 644 /sys/class/power_supply/battery/test_mode && '
-        'chmod 644 /sys/class/power_supply/max77843-charger/current_now && '
-        'echo 1 > /sys/class/power_supply/battery/test_mode && '
-        'echo 0 > /sys/class/power_supply/max77843-charger/current_now && '
-        'dumpsys battery set ac 0 && dumpsys battery set usb 0'),
-    'charge_counter': None,
-    'voltage': '/sys/class/power_supply/max77843-fuelgauge/voltage_now',
-    'current': '/sys/class/power_supply/max77843-charger/current_now',
-  },
-]
-
-# The list of useful dumpsys columns.
-# Index of the column containing the format version.
-_DUMP_VERSION_INDEX = 0
-# Index of the column containing the type of the row.
-_ROW_TYPE_INDEX = 3
-# Index of the column containing the uid.
-_PACKAGE_UID_INDEX = 4
-# Index of the column containing the application package.
-_PACKAGE_NAME_INDEX = 5
-# The column containing the uid of the power data.
-_PWI_UID_INDEX = 1
-# The column containing the type of consumption. Only consumption since last
-# charge are of interest here.
-_PWI_AGGREGATION_INDEX = 2
-_PWS_AGGREGATION_INDEX = _PWI_AGGREGATION_INDEX
-# The column containing the amount of power used, in mah.
-_PWI_POWER_CONSUMPTION_INDEX = 5
-_PWS_POWER_CONSUMPTION_INDEX = _PWI_POWER_CONSUMPTION_INDEX
-
-_MAX_CHARGE_ERROR = 20
-
-
-class BatteryUtils(object):
-
-  def __init__(self, device, default_timeout=_DEFAULT_TIMEOUT,
-               default_retries=_DEFAULT_RETRIES):
-    """BatteryUtils constructor.
-
-      Args:
-        device: A DeviceUtils instance.
-        default_timeout: An integer containing the default number of seconds to
-                         wait for an operation to complete if no explicit value
-                         is provided.
-        default_retries: An integer containing the default number or times an
-                         operation should be retried on failure if no explicit
-                         value is provided.
-      Raises:
-        TypeError: If it is not passed a DeviceUtils instance.
-    """
-    if not isinstance(device, device_utils.DeviceUtils):
-      raise TypeError('Must be initialized with DeviceUtils object.')
-    self._device = device
-    self._cache = device.GetClientCache(self.__class__.__name__)
-    self._default_timeout = default_timeout
-    self._default_retries = default_retries
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def SupportsFuelGauge(self, timeout=None, retries=None):
-    """Detect if fuel gauge chip is present.
-
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      True if known fuel gauge files are present.
-      False otherwise.
-    """
-    self._DiscoverDeviceProfile()
-    return (self._cache['profile']['enable_command'] != None
-        and self._cache['profile']['charge_counter'] != None)
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def GetFuelGaugeChargeCounter(self, timeout=None, retries=None):
-    """Get value of charge_counter on fuel gauge chip.
-
-    Device must have charging disabled for this, not just battery updates
-    disabled. The only device that this currently works with is the nexus 5.
-
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      value of charge_counter for fuel gauge chip in units of nAh.
-
-    Raises:
-      device_errors.CommandFailedError: If fuel gauge chip not found.
-    """
-    if self.SupportsFuelGauge():
-      return int(self._device.ReadFile(
-          self._cache['profile']['charge_counter']))
-    raise device_errors.CommandFailedError(
-        'Unable to find fuel gauge.')
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def GetNetworkData(self, package, timeout=None, retries=None):
-    """Get network data for specific package.
-
-    Args:
-      package: package name you want network data for.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      Tuple of (sent_data, recieved_data)
-      None if no network data found
-    """
-    # If device_utils clears cache, cache['uids'] doesn't exist
-    if 'uids' not in self._cache:
-      self._cache['uids'] = {}
-    if package not in self._cache['uids']:
-      self.GetPowerData()
-      if package not in self._cache['uids']:
-        logger.warning('No UID found for %s. Can\'t get network data.',
-                       package)
-        return None
-
-    network_data_path = '/proc/uid_stat/%s/' % self._cache['uids'][package]
-    try:
-      send_data = int(self._device.ReadFile(network_data_path + 'tcp_snd'))
-    # If ReadFile throws exception, it means no network data usage file for
-    # package has been recorded. Return 0 sent and 0 received.
-    except device_errors.AdbShellCommandFailedError:
-      logger.warning('No sent data found for package %s', package)
-      send_data = 0
-    try:
-      recv_data = int(self._device.ReadFile(network_data_path + 'tcp_rcv'))
-    except device_errors.AdbShellCommandFailedError:
-      logger.warning('No received data found for package %s', package)
-      recv_data = 0
-    return (send_data, recv_data)
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def GetPowerData(self, timeout=None, retries=None):
-    """Get power data for device.
-
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      Dict containing system power, and a per-package power dict keyed on
-      package names.
-      {
-        'system_total': 23.1,
-        'per_package' : {
-          package_name: {
-            'uid': uid,
-            'data': [1,2,3]
-          },
-        }
-      }
-    """
-    if 'uids' not in self._cache:
-      self._cache['uids'] = {}
-    dumpsys_output = self._device.RunShellCommand(
-        ['dumpsys', 'batterystats', '-c'],
-        check_return=True, large_output=True)
-    csvreader = csv.reader(dumpsys_output)
-    pwi_entries = collections.defaultdict(list)
-    system_total = None
-    for entry in csvreader:
-      if entry[_DUMP_VERSION_INDEX] not in ['8', '9']:
-        # Wrong dumpsys version.
-        raise device_errors.DeviceVersionError(
-            'Dumpsys version must be 8 or 9. "%s" found.'
-            % entry[_DUMP_VERSION_INDEX])
-      if _ROW_TYPE_INDEX < len(entry) and entry[_ROW_TYPE_INDEX] == 'uid':
-        current_package = entry[_PACKAGE_NAME_INDEX]
-        if (self._cache['uids'].get(current_package)
-            and self._cache['uids'].get(current_package)
-            != entry[_PACKAGE_UID_INDEX]):
-          raise device_errors.CommandFailedError(
-              'Package %s found multiple times with different UIDs %s and %s'
-               % (current_package, self._cache['uids'][current_package],
-               entry[_PACKAGE_UID_INDEX]))
-        self._cache['uids'][current_package] = entry[_PACKAGE_UID_INDEX]
-      elif (_PWI_POWER_CONSUMPTION_INDEX < len(entry)
-          and entry[_ROW_TYPE_INDEX] == 'pwi'
-          and entry[_PWI_AGGREGATION_INDEX] == 'l'):
-        pwi_entries[entry[_PWI_UID_INDEX]].append(
-            float(entry[_PWI_POWER_CONSUMPTION_INDEX]))
-      elif (_PWS_POWER_CONSUMPTION_INDEX < len(entry)
-          and entry[_ROW_TYPE_INDEX] == 'pws'
-          and entry[_PWS_AGGREGATION_INDEX] == 'l'):
-        # This entry should only appear once.
-        assert system_total is None
-        system_total = float(entry[_PWS_POWER_CONSUMPTION_INDEX])
-
-    per_package = {p: {'uid': uid, 'data': pwi_entries[uid]}
-                   for p, uid in self._cache['uids'].iteritems()}
-    return {'system_total': system_total, 'per_package': per_package}
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def GetBatteryInfo(self, timeout=None, retries=None):
-    """Gets battery info for the device.
-
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-    Returns:
-      A dict containing various battery information as reported by dumpsys
-      battery.
-    """
-    result = {}
-    # Skip the first line, which is just a header.
-    for line in self._device.RunShellCommand(
-        ['dumpsys', 'battery'], check_return=True)[1:]:
-      # If usb charging has been disabled, an extra line of header exists.
-      if 'UPDATES STOPPED' in line:
-        logger.warning('Dumpsys battery not receiving updates. '
-                       'Run dumpsys battery reset if this is in error.')
-      elif ':' not in line:
-        logger.warning('Unknown line found in dumpsys battery: "%s"', line)
-      else:
-        k, v = line.split(':', 1)
-        result[k.strip()] = v.strip()
-    return result
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def GetCharging(self, timeout=None, retries=None):
-    """Gets the charging state of the device.
-
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-    Returns:
-      True if the device is charging, false otherwise.
-    """
-    battery_info = self.GetBatteryInfo()
-    for k in ('AC powered', 'USB powered', 'Wireless powered'):
-      if (k in battery_info and
-          battery_info[k].lower() in ('true', '1', 'yes')):
-        return True
-    return False
-
-  # TODO(rnephew): Make private when all use cases can use the context manager.
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def DisableBatteryUpdates(self, timeout=None, retries=None):
-    """Resets battery data and makes device appear like it is not
-    charging so that it will collect power data since last charge.
-
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      device_errors.CommandFailedError: When resetting batterystats fails to
-        reset power values.
-      device_errors.DeviceVersionError: If device is not L or higher.
-    """
-    def battery_updates_disabled():
-      return self.GetCharging() is False
-
-    self._ClearPowerData()
-    self._device.RunShellCommand(['dumpsys', 'battery', 'set', 'ac', '0'],
-                                 check_return=True)
-    self._device.RunShellCommand(['dumpsys', 'battery', 'set', 'usb', '0'],
-                                 check_return=True)
-    timeout_retry.WaitFor(battery_updates_disabled, wait_period=1)
-
-  # TODO(rnephew): Make private when all use cases can use the context manager.
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def EnableBatteryUpdates(self, timeout=None, retries=None):
-    """Restarts device charging so that dumpsys no longer collects power data.
-
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      device_errors.DeviceVersionError: If device is not L or higher.
-    """
-    def battery_updates_enabled():
-      return (self.GetCharging()
-              or not bool('UPDATES STOPPED' in self._device.RunShellCommand(
-                  ['dumpsys', 'battery'], check_return=True)))
-
-    self._device.RunShellCommand(['dumpsys', 'battery', 'reset'],
-                                 check_return=True)
-    timeout_retry.WaitFor(battery_updates_enabled, wait_period=1)
-
-  @contextlib.contextmanager
-  def BatteryMeasurement(self, timeout=None, retries=None):
-    """Context manager that enables battery data collection. It makes
-    the device appear to stop charging so that dumpsys will start collecting
-    power data since last charge. Once the with block is exited, charging is
-    resumed and power data since last charge is no longer collected.
-
-    Only for devices L and higher.
-
-    Example usage:
-      with BatteryMeasurement():
-        browser_actions()
-        get_power_data() # report usage within this block
-      after_measurements() # Anything that runs after power
-                           # measurements are collected
-
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      device_errors.DeviceVersionError: If device is not L or higher.
-    """
-    if self._device.build_version_sdk < version_codes.LOLLIPOP:
-      raise device_errors.DeviceVersionError('Device must be L or higher.')
-    try:
-      self.DisableBatteryUpdates(timeout=timeout, retries=retries)
-      yield
-    finally:
-      self.EnableBatteryUpdates(timeout=timeout, retries=retries)
-
-  def _DischargeDevice(self, percent, wait_period=120):
-    """Disables charging and waits for device to discharge given amount
-
-    Args:
-      percent: level of charge to discharge.
-
-    Raises:
-      ValueError: If percent is not between 1 and 99.
-    """
-    battery_level = int(self.GetBatteryInfo().get('level'))
-    if not 0 < percent < 100:
-      raise ValueError('Discharge amount(%s) must be between 1 and 99'
-                       % percent)
-    if battery_level is None:
-      logger.warning('Unable to find current battery level. Cannot discharge.')
-      return
-    # Do not discharge if it would make battery level too low.
-    if percent >= battery_level - 10:
-      logger.warning('Battery is too low or discharge amount requested is too '
-                     'high. Cannot discharge phone %s percent.', percent)
-      return
-
-    self._HardwareSetCharging(False)
-
-    def device_discharged():
-      self._HardwareSetCharging(True)
-      current_level = int(self.GetBatteryInfo().get('level'))
-      logger.info('current battery level: %s', current_level)
-      if battery_level - current_level >= percent:
-        return True
-      self._HardwareSetCharging(False)
-      return False
-
-    timeout_retry.WaitFor(device_discharged, wait_period=wait_period)
-
-  def ChargeDeviceToLevel(self, level, wait_period=60):
-    """Enables charging and waits for device to be charged to given level.
-
-    Args:
-      level: level of charge to wait for.
-      wait_period: time in seconds to wait between checking.
-    Raises:
-      device_errors.DeviceChargingError: If error while charging is detected.
-    """
-    self.SetCharging(True)
-    charge_status = {
-        'charge_failure_count': 0,
-        'last_charge_value': 0
-    }
-    def device_charged():
-      battery_level = self.GetBatteryInfo().get('level')
-      if battery_level is None:
-        logger.warning('Unable to find current battery level.')
-        battery_level = 100
-      else:
-        logger.info('current battery level: %s', battery_level)
-        battery_level = int(battery_level)
-
-      # Use > so that it will not reset if charge is going down.
-      if battery_level > charge_status['last_charge_value']:
-        charge_status['last_charge_value'] = battery_level
-        charge_status['charge_failure_count'] = 0
-      else:
-        charge_status['charge_failure_count'] += 1
-
-      if (not battery_level >= level
-          and charge_status['charge_failure_count'] >= _MAX_CHARGE_ERROR):
-        raise device_errors.DeviceChargingError(
-            'Device not charging properly. Current level:%s Previous level:%s'
-             % (battery_level, charge_status['last_charge_value']))
-      return battery_level >= level
-
-    timeout_retry.WaitFor(device_charged, wait_period=wait_period)
-
-  def LetBatteryCoolToTemperature(self, target_temp, wait_period=180):
-    """Lets device sit to give battery time to cool down
-    Args:
-      temp: maximum temperature to allow in tenths of degrees c.
-      wait_period: time in seconds to wait between checking.
-    """
-    def cool_device():
-      temp = self.GetBatteryInfo().get('temperature')
-      if temp is None:
-        logger.warning('Unable to find current battery temperature.')
-        temp = 0
-      else:
-        logger.info('Current battery temperature: %s', temp)
-      if int(temp) <= target_temp:
-        return True
-      else:
-        if 'Nexus 5' in self._cache['profile']['name']:
-          self._DischargeDevice(1)
-        return False
-
-    self._DiscoverDeviceProfile()
-    self.EnableBatteryUpdates()
-    logger.info('Waiting for the device to cool down to %s (0.1 C)',
-                target_temp)
-    timeout_retry.WaitFor(cool_device, wait_period=wait_period)
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def SetCharging(self, enabled, timeout=None, retries=None):
-    """Enables or disables charging on the device.
-
-    Args:
-      enabled: A boolean indicating whether charging should be enabled or
-        disabled.
-      timeout: timeout in seconds
-      retries: number of retries
-    """
-    if self.GetCharging() == enabled:
-      logger.warning('Device charging already in expected state: %s', enabled)
-      return
-
-    self._DiscoverDeviceProfile()
-    if enabled:
-      if self._cache['profile']['enable_command']:
-        self._HardwareSetCharging(enabled)
-      else:
-        logger.info('Unable to enable charging via hardware. '
-                    'Falling back to software enabling.')
-        self.EnableBatteryUpdates()
-    else:
-      if self._cache['profile']['enable_command']:
-        self._ClearPowerData()
-        self._HardwareSetCharging(enabled)
-      else:
-        logger.info('Unable to disable charging via hardware. '
-                     'Falling back to software disabling.')
-        self.DisableBatteryUpdates()
-
-  def _HardwareSetCharging(self, enabled, timeout=None, retries=None):
-    """Enables or disables charging on the device.
-
-    Args:
-      enabled: A boolean indicating whether charging should be enabled or
-        disabled.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      device_errors.CommandFailedError: If method of disabling charging cannot
-        be determined.
-    """
-    self._DiscoverDeviceProfile()
-    if not self._cache['profile']['enable_command']:
-      raise device_errors.CommandFailedError(
-          'Unable to find charging commands.')
-
-    command = (self._cache['profile']['enable_command'] if enabled
-               else self._cache['profile']['disable_command'])
-
-    def verify_charging():
-      return self.GetCharging() == enabled
-
-    self._device.RunShellCommand(
-        command, check_return=True, as_root=True, large_output=True)
-    timeout_retry.WaitFor(verify_charging, wait_period=1)
-
-  @contextlib.contextmanager
-  def PowerMeasurement(self, timeout=None, retries=None):
-    """Context manager that enables battery power collection.
-
-    Once the with block is exited, charging is resumed. Will attempt to disable
-    charging at the hardware level, and if that fails will fall back to software
-    disabling of battery updates.
-
-    Only for devices L and higher.
-
-    Example usage:
-      with PowerMeasurement():
-        browser_actions()
-        get_power_data() # report usage within this block
-      after_measurements() # Anything that runs after power
-                           # measurements are collected
-
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-    """
-    try:
-      self.SetCharging(False, timeout=timeout, retries=retries)
-      yield
-    finally:
-      self.SetCharging(True, timeout=timeout, retries=retries)
-
-  def _ClearPowerData(self):
-    """Resets battery data and makes device appear like it is not
-    charging so that it will collect power data since last charge.
-
-    Returns:
-      True if power data cleared.
-      False if power data clearing is not supported (pre-L)
-
-    Raises:
-      device_errors.DeviceVersionError: If power clearing is supported,
-        but fails.
-    """
-    if self._device.build_version_sdk < version_codes.LOLLIPOP:
-      logger.warning('Dumpsys power data only available on 5.0 and above. '
-                     'Cannot clear power data.')
-      return False
-
-    self._device.RunShellCommand(
-        ['dumpsys', 'battery', 'set', 'usb', '1'], check_return=True)
-    self._device.RunShellCommand(
-        ['dumpsys', 'battery', 'set', 'ac', '1'], check_return=True)
-
-    def test_if_clear():
-      self._device.RunShellCommand(
-          ['dumpsys', 'batterystats', '--reset'], check_return=True)
-      battery_data = self._device.RunShellCommand(
-          ['dumpsys', 'batterystats', '--charged', '-c'],
-          check_return=True, large_output=True)
-      for line in battery_data:
-        l = line.split(',')
-        if (len(l) > _PWI_POWER_CONSUMPTION_INDEX
-            and l[_ROW_TYPE_INDEX] == 'pwi'
-            and float(l[_PWI_POWER_CONSUMPTION_INDEX]) != 0.0):
-          return False
-      return True
-
-    try:
-      timeout_retry.WaitFor(test_if_clear, wait_period=1)
-      return True
-    finally:
-      self._device.RunShellCommand(
-          ['dumpsys', 'battery', 'reset'], check_return=True)
-
-  def _DiscoverDeviceProfile(self):
-    """Checks and caches device information.
-
-    Returns:
-      True if profile is found, false otherwise.
-    """
-
-    if 'profile' in self._cache:
-      return True
-    for profile in _DEVICE_PROFILES:
-      if self._device.product_model in profile['name']:
-        self._cache['profile'] = profile
-        return True
-    self._cache['profile'] = {
-        'name': [],
-        'enable_command': None,
-        'disable_command': None,
-        'charge_counter': None,
-        'voltage': None,
-        'current': None,
-    }
-    return False
diff --git a/third_party/catapult/devil/devil/android/battery_utils_test.py b/third_party/catapult/devil/devil/android/battery_utils_test.py
deleted file mode 100755
index beaba3b..0000000
--- a/third_party/catapult/devil/devil/android/battery_utils_test.py
+++ /dev/null
@@ -1,694 +0,0 @@
-#!/usr/bin/env python
-# 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.
-
-"""
-Unit tests for the contents of battery_utils.py
-"""
-
-# pylint: disable=protected-access,unused-argument
-
-import logging
-import unittest
-
-from devil import devil_env
-from devil.android import battery_utils
-from devil.android import device_errors
-from devil.android import device_utils
-from devil.android import device_utils_test
-from devil.utils import mock_calls
-
-with devil_env.SysPath(devil_env.PYMOCK_PATH):
-  import mock  # pylint: disable=import-error
-
-_DUMPSYS_OUTPUT = [
-    '9,0,i,uid,1000,test_package1',
-    '9,0,i,uid,1001,test_package2',
-    '9,1000,l,pwi,uid,1',
-    '9,1001,l,pwi,uid,2',
-    '9,0,l,pws,1728,2000,190,207',
-]
-
-
-class BatteryUtilsTest(mock_calls.TestCase):
-
-  _NEXUS_5 = {
-    'name': 'Nexus 5',
-    'witness_file': '/sys/kernel/debug/bq24192/INPUT_SRC_CONT',
-    'enable_command': (
-        'echo 0x4A > /sys/kernel/debug/bq24192/INPUT_SRC_CONT && '
-        'echo 1 > /sys/class/power_supply/usb/online'),
-    'disable_command': (
-        'echo 0xCA > /sys/kernel/debug/bq24192/INPUT_SRC_CONT && '
-        'chmod 644 /sys/class/power_supply/usb/online && '
-        'echo 0 > /sys/class/power_supply/usb/online'),
-    'charge_counter': None,
-    'voltage': None,
-    'current': None,
-  }
-
-  _NEXUS_6 = {
-    'name': 'Nexus 6',
-    'witness_file': None,
-    'enable_command': None,
-    'disable_command': None,
-    'charge_counter': (
-        '/sys/class/power_supply/max170xx_battery/charge_counter_ext'),
-    'voltage': '/sys/class/power_supply/max170xx_battery/voltage_now',
-    'current': '/sys/class/power_supply/max170xx_battery/current_now',
-  }
-
-  _NEXUS_10 = {
-    'name': 'Nexus 10',
-    'witness_file': None,
-    'enable_command': None,
-    'disable_command': None,
-    'charge_counter': (
-        '/sys/class/power_supply/ds2784-fuelgauge/charge_counter_ext'),
-    'voltage': '/sys/class/power_supply/ds2784-fuelgauge/voltage_now',
-    'current': '/sys/class/power_supply/ds2784-fuelgauge/current_now',
-  }
-
-  def ShellError(self, output=None, status=1):
-    def action(cmd, *args, **kwargs):
-      raise device_errors.AdbShellCommandFailedError(
-          cmd, output, status, str(self.device))
-    if output is None:
-      output = 'Permission denied\n'
-    return action
-
-  def setUp(self):
-    self.adb = device_utils_test._AdbWrapperMock('0123456789abcdef')
-    self.device = device_utils.DeviceUtils(
-        self.adb, default_timeout=10, default_retries=0)
-    self.watchMethodCalls(self.call.adb, ignore=['GetDeviceSerial'])
-    self.battery = battery_utils.BatteryUtils(
-        self.device, default_timeout=10, default_retries=0)
-
-
-class BatteryUtilsInitTest(unittest.TestCase):
-
-  def testInitWithDeviceUtil(self):
-    serial = '0fedcba987654321'
-    d = device_utils.DeviceUtils(serial)
-    b = battery_utils.BatteryUtils(d)
-    self.assertEqual(d, b._device)
-
-  def testInitWithMissing_fails(self):
-    with self.assertRaises(TypeError):
-      battery_utils.BatteryUtils(None)
-    with self.assertRaises(TypeError):
-      battery_utils.BatteryUtils('')
-
-
-class BatteryUtilsSetChargingTest(BatteryUtilsTest):
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testHardwareSetCharging_enabled(self):
-    self.battery._cache['profile'] = self._NEXUS_5
-    with self.assertCalls(
-        (self.call.device.RunShellCommand(
-            mock.ANY, check_return=True, as_root=True, large_output=True), []),
-        (self.call.battery.GetCharging(), False),
-        (self.call.battery.GetCharging(), True)):
-      self.battery._HardwareSetCharging(True)
-
-  def testHardwareSetCharging_alreadyEnabled(self):
-    self.battery._cache['profile'] = self._NEXUS_5
-    with self.assertCalls(
-        (self.call.device.RunShellCommand(
-            mock.ANY, check_return=True, as_root=True, large_output=True), []),
-        (self.call.battery.GetCharging(), True)):
-      self.battery._HardwareSetCharging(True)
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testHardwareSetCharging_disabled(self):
-    self.battery._cache['profile'] = self._NEXUS_5
-    with self.assertCalls(
-        (self.call.device.RunShellCommand(
-            mock.ANY, check_return=True, as_root=True, large_output=True), []),
-        (self.call.battery.GetCharging(), True),
-        (self.call.battery.GetCharging(), False)):
-      self.battery._HardwareSetCharging(False)
-
-
-class BatteryUtilsSetBatteryMeasurementTest(BatteryUtilsTest):
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testBatteryMeasurementWifi(self):
-    with self.patch_call(self.call.device.build_version_sdk,
-                         return_value=22):
-      with self.assertCalls(
-          (self.call.battery._ClearPowerData(), True),
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'battery', 'set', 'ac', '0'], check_return=True), []),
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'battery', 'set', 'usb', '0'], check_return=True),
-           []),
-          (self.call.battery.GetCharging(), False),
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'battery', 'reset'], check_return=True), []),
-          (self.call.battery.GetCharging(), False),
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'battery'], check_return=True), ['UPDATES STOPPED']),
-          (self.call.battery.GetCharging(), False),
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'battery'], check_return=True), [])):
-        with self.battery.BatteryMeasurement():
-          pass
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testBatteryMeasurementUsb(self):
-    with self.patch_call(self.call.device.build_version_sdk,
-                         return_value=22):
-      with self.assertCalls(
-          (self.call.battery._ClearPowerData(), True),
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'battery', 'set', 'ac', '0'], check_return=True), []),
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'battery', 'set', 'usb', '0'], check_return=True),
-           []),
-          (self.call.battery.GetCharging(), False),
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'battery', 'reset'], check_return=True), []),
-          (self.call.battery.GetCharging(), False),
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'battery'], check_return=True), ['UPDATES STOPPED']),
-          (self.call.battery.GetCharging(), True)):
-        with self.battery.BatteryMeasurement():
-          pass
-
-
-class BatteryUtilsGetPowerData(BatteryUtilsTest):
-
-  def testGetPowerData(self):
-    with self.assertCalls(
-        (self.call.device.RunShellCommand(
-            ['dumpsys', 'batterystats', '-c'],
-            check_return=True, large_output=True),
-         _DUMPSYS_OUTPUT)):
-      data = self.battery.GetPowerData()
-      check = {
-        'system_total': 2000.0,
-        'per_package': {
-          'test_package1': {'uid': '1000', 'data': [1.0]},
-          'test_package2': {'uid': '1001', 'data': [2.0]}
-        }
-      }
-      self.assertEqual(data, check)
-
-  def testGetPowerData_packageCollisionSame(self):
-    self.battery._cache['uids'] = {'test_package1': '1000'}
-    with self.assertCall(
-        self.call.device.RunShellCommand(
-            ['dumpsys', 'batterystats', '-c'],
-            check_return=True, large_output=True),
-        _DUMPSYS_OUTPUT):
-      data = self.battery.GetPowerData()
-      check = {
-        'system_total': 2000.0,
-        'per_package': {
-          'test_package1': {'uid': '1000', 'data': [1.0]},
-          'test_package2': {'uid': '1001', 'data': [2.0]}
-        }
-      }
-      self.assertEqual(data, check)
-
-  def testGetPowerData_packageCollisionDifferent(self):
-    self.battery._cache['uids'] = {'test_package1': '1'}
-    with self.assertCall(
-        self.call.device.RunShellCommand(
-            ['dumpsys', 'batterystats', '-c'],
-            check_return=True, large_output=True),
-        _DUMPSYS_OUTPUT):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.battery.GetPowerData()
-
-  def testGetPowerData_cacheCleared(self):
-    with self.assertCalls(
-        (self.call.device.RunShellCommand(
-            ['dumpsys', 'batterystats', '-c'],
-            check_return=True, large_output=True),
-         _DUMPSYS_OUTPUT)):
-      self.battery._cache.clear()
-      data = self.battery.GetPowerData()
-      check = {
-        'system_total': 2000.0,
-        'per_package': {
-          'test_package1': {'uid': '1000', 'data': [1.0]},
-          'test_package2': {'uid': '1001', 'data': [2.0]}
-        }
-      }
-      self.assertEqual(data, check)
-
-
-class BatteryUtilsChargeDevice(BatteryUtilsTest):
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testChargeDeviceToLevel_pass(self):
-    with self.assertCalls(
-        (self.call.battery.SetCharging(True)),
-        (self.call.battery.GetBatteryInfo(), {'level': '50'}),
-        (self.call.battery.GetBatteryInfo(), {'level': '100'})):
-      self.battery.ChargeDeviceToLevel(95)
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testChargeDeviceToLevel_failureSame(self):
-    with self.assertCalls(
-        (self.call.battery.SetCharging(True)),
-        (self.call.battery.GetBatteryInfo(), {'level': '50'}),
-        (self.call.battery.GetBatteryInfo(), {'level': '50'}),
-
-        (self.call.battery.GetBatteryInfo(), {'level': '50'})):
-      with self.assertRaises(device_errors.DeviceChargingError):
-        old_max = battery_utils._MAX_CHARGE_ERROR
-        try:
-          battery_utils._MAX_CHARGE_ERROR = 2
-          self.battery.ChargeDeviceToLevel(95)
-        finally:
-          battery_utils._MAX_CHARGE_ERROR = old_max
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testChargeDeviceToLevel_failureDischarge(self):
-    with self.assertCalls(
-        (self.call.battery.SetCharging(True)),
-        (self.call.battery.GetBatteryInfo(), {'level': '50'}),
-        (self.call.battery.GetBatteryInfo(), {'level': '49'}),
-        (self.call.battery.GetBatteryInfo(), {'level': '48'})):
-      with self.assertRaises(device_errors.DeviceChargingError):
-        old_max = battery_utils._MAX_CHARGE_ERROR
-        try:
-          battery_utils._MAX_CHARGE_ERROR = 2
-          self.battery.ChargeDeviceToLevel(95)
-        finally:
-          battery_utils._MAX_CHARGE_ERROR = old_max
-
-
-class BatteryUtilsDischargeDevice(BatteryUtilsTest):
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testDischargeDevice_exact(self):
-    with self.assertCalls(
-        (self.call.battery.GetBatteryInfo(), {'level': '100'}),
-        (self.call.battery._HardwareSetCharging(False)),
-        (self.call.battery._HardwareSetCharging(True)),
-        (self.call.battery.GetBatteryInfo(), {'level': '99'})):
-      self.battery._DischargeDevice(1)
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testDischargeDevice_over(self):
-    with self.assertCalls(
-        (self.call.battery.GetBatteryInfo(), {'level': '100'}),
-        (self.call.battery._HardwareSetCharging(False)),
-        (self.call.battery._HardwareSetCharging(True)),
-        (self.call.battery.GetBatteryInfo(), {'level': '50'})):
-      self.battery._DischargeDevice(1)
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testDischargeDevice_takeslong(self):
-    with self.assertCalls(
-        (self.call.battery.GetBatteryInfo(), {'level': '100'}),
-        (self.call.battery._HardwareSetCharging(False)),
-        (self.call.battery._HardwareSetCharging(True)),
-        (self.call.battery.GetBatteryInfo(), {'level': '100'}),
-        (self.call.battery._HardwareSetCharging(False)),
-        (self.call.battery._HardwareSetCharging(True)),
-        (self.call.battery.GetBatteryInfo(), {'level': '99'}),
-        (self.call.battery._HardwareSetCharging(False)),
-        (self.call.battery._HardwareSetCharging(True)),
-        (self.call.battery.GetBatteryInfo(), {'level': '98'}),
-        (self.call.battery._HardwareSetCharging(False)),
-        (self.call.battery._HardwareSetCharging(True)),
-        (self.call.battery.GetBatteryInfo(), {'level': '97'})):
-      self.battery._DischargeDevice(3)
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testDischargeDevice_dischargeTooClose(self):
-    with self.assertCalls(
-        (self.call.battery.GetBatteryInfo(), {'level': '100'})):
-      self.battery._DischargeDevice(99)
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testDischargeDevice_percentageOutOfBounds(self):
-    with self.assertCalls(
-        (self.call.battery.GetBatteryInfo(), {'level': '100'})):
-      with self.assertRaises(ValueError):
-        self.battery._DischargeDevice(100)
-    with self.assertCalls(
-        (self.call.battery.GetBatteryInfo(), {'level': '100'})):
-      with self.assertRaises(ValueError):
-        self.battery._DischargeDevice(0)
-
-
-class BatteryUtilsGetBatteryInfoTest(BatteryUtilsTest):
-
-  def testGetBatteryInfo_normal(self):
-    with self.assertCalls(
-        (self.call.device.RunShellCommand(
-            ['dumpsys', 'battery'], check_return=True),
-        [
-          'Current Battery Service state:',
-          '  AC powered: false',
-          '  USB powered: true',
-          '  level: 100',
-          '  temperature: 321',
-        ])):
-      self.assertEquals(
-          {
-            'AC powered': 'false',
-            'USB powered': 'true',
-            'level': '100',
-            'temperature': '321',
-          },
-          self.battery.GetBatteryInfo())
-
-  def testGetBatteryInfo_nothing(self):
-    with self.assertCalls(
-        (self.call.device.RunShellCommand(
-            ['dumpsys', 'battery'], check_return=True), [])):
-      self.assertEquals({}, self.battery.GetBatteryInfo())
-
-
-class BatteryUtilsGetChargingTest(BatteryUtilsTest):
-
-  def testGetCharging_usb(self):
-    with self.assertCall(
-        self.call.battery.GetBatteryInfo(), {'USB powered': 'true'}):
-      self.assertTrue(self.battery.GetCharging())
-
-  def testGetCharging_usbFalse(self):
-    with self.assertCall(
-        self.call.battery.GetBatteryInfo(), {'USB powered': 'false'}):
-      self.assertFalse(self.battery.GetCharging())
-
-  def testGetCharging_ac(self):
-    with self.assertCall(
-        self.call.battery.GetBatteryInfo(), {'AC powered': 'true'}):
-      self.assertTrue(self.battery.GetCharging())
-
-  def testGetCharging_wireless(self):
-    with self.assertCall(
-        self.call.battery.GetBatteryInfo(), {'Wireless powered': 'true'}):
-      self.assertTrue(self.battery.GetCharging())
-
-  def testGetCharging_unknown(self):
-    with self.assertCall(
-        self.call.battery.GetBatteryInfo(), {'level': '42'}):
-      self.assertFalse(self.battery.GetCharging())
-
-
-class BatteryUtilsGetNetworkDataTest(BatteryUtilsTest):
-
-  def testGetNetworkData_noDataUsage(self):
-    with self.assertCalls(
-        (self.call.device.RunShellCommand(
-            ['dumpsys', 'batterystats', '-c'],
-            check_return=True, large_output=True),
-         _DUMPSYS_OUTPUT),
-        (self.call.device.ReadFile('/proc/uid_stat/1000/tcp_snd'),
-            self.ShellError()),
-        (self.call.device.ReadFile('/proc/uid_stat/1000/tcp_rcv'),
-            self.ShellError())):
-      self.assertEquals(self.battery.GetNetworkData('test_package1'), (0, 0))
-
-  def testGetNetworkData_badPackage(self):
-    with self.assertCall(
-        self.call.device.RunShellCommand(
-            ['dumpsys', 'batterystats', '-c'],
-            check_return=True, large_output=True),
-        _DUMPSYS_OUTPUT):
-      self.assertEqual(self.battery.GetNetworkData('asdf'), None)
-
-  def testGetNetworkData_packageNotCached(self):
-    with self.assertCalls(
-        (self.call.device.RunShellCommand(
-            ['dumpsys', 'batterystats', '-c'],
-            check_return=True, large_output=True),
-         _DUMPSYS_OUTPUT),
-        (self.call.device.ReadFile('/proc/uid_stat/1000/tcp_snd'), 1),
-        (self.call.device.ReadFile('/proc/uid_stat/1000/tcp_rcv'), 2)):
-      self.assertEqual(self.battery.GetNetworkData('test_package1'), (1, 2))
-
-  def testGetNetworkData_packageCached(self):
-    self.battery._cache['uids'] = {'test_package1': '1000'}
-    with self.assertCalls(
-        (self.call.device.ReadFile('/proc/uid_stat/1000/tcp_snd'), 1),
-        (self.call.device.ReadFile('/proc/uid_stat/1000/tcp_rcv'), 2)):
-      self.assertEqual(self.battery.GetNetworkData('test_package1'), (1, 2))
-
-  def testGetNetworkData_clearedCache(self):
-    with self.assertCalls(
-        (self.call.device.RunShellCommand(
-            ['dumpsys', 'batterystats', '-c'],
-            check_return=True, large_output=True),
-         _DUMPSYS_OUTPUT),
-        (self.call.device.ReadFile('/proc/uid_stat/1000/tcp_snd'), 1),
-        (self.call.device.ReadFile('/proc/uid_stat/1000/tcp_rcv'), 2)):
-      self.battery._cache.clear()
-      self.assertEqual(self.battery.GetNetworkData('test_package1'), (1, 2))
-
-
-class BatteryUtilsLetBatteryCoolToTemperatureTest(BatteryUtilsTest):
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testLetBatteryCoolToTemperature_startUnder(self):
-    self.battery._cache['profile'] = self._NEXUS_6
-    with self.assertCalls(
-        (self.call.battery.EnableBatteryUpdates(), []),
-        (self.call.battery.GetBatteryInfo(), {'temperature': '500'})):
-      self.battery.LetBatteryCoolToTemperature(600)
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testLetBatteryCoolToTemperature_startOver(self):
-    self.battery._cache['profile'] = self._NEXUS_6
-    with self.assertCalls(
-        (self.call.battery.EnableBatteryUpdates(), []),
-        (self.call.battery.GetBatteryInfo(), {'temperature': '500'}),
-        (self.call.battery.GetBatteryInfo(), {'temperature': '400'})):
-      self.battery.LetBatteryCoolToTemperature(400)
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testLetBatteryCoolToTemperature_nexus5Hot(self):
-    self.battery._cache['profile'] = self._NEXUS_5
-    with self.assertCalls(
-        (self.call.battery.EnableBatteryUpdates(), []),
-        (self.call.battery.GetBatteryInfo(), {'temperature': '500'}),
-        (self.call.battery._DischargeDevice(1), []),
-        (self.call.battery.GetBatteryInfo(), {'temperature': '400'})):
-      self.battery.LetBatteryCoolToTemperature(400)
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testLetBatteryCoolToTemperature_nexus5Cool(self):
-    self.battery._cache['profile'] = self._NEXUS_5
-    with self.assertCalls(
-        (self.call.battery.EnableBatteryUpdates(), []),
-        (self.call.battery.GetBatteryInfo(), {'temperature': '400'})):
-      self.battery.LetBatteryCoolToTemperature(400)
-
-
-class BatteryUtilsSupportsFuelGaugeTest(BatteryUtilsTest):
-
-  def testSupportsFuelGauge_false(self):
-    self.battery._cache['profile'] = self._NEXUS_5
-    self.assertFalse(self.battery.SupportsFuelGauge())
-
-  def testSupportsFuelGauge_trueMax(self):
-    self.battery._cache['profile'] = self._NEXUS_6
-    # TODO(rnephew): Change this to assertTrue when we have support for
-    # disabling hardware charging on nexus 6.
-    self.assertFalse(self.battery.SupportsFuelGauge())
-
-  def testSupportsFuelGauge_trueDS(self):
-    self.battery._cache['profile'] = self._NEXUS_10
-    # TODO(rnephew): Change this to assertTrue when we have support for
-    # disabling hardware charging on nexus 10.
-    self.assertFalse(self.battery.SupportsFuelGauge())
-
-
-class BatteryUtilsGetFuelGaugeChargeCounterTest(BatteryUtilsTest):
-
-  def testGetFuelGaugeChargeCounter_noFuelGauge(self):
-    self.battery._cache['profile'] = self._NEXUS_5
-    with self.assertRaises(device_errors.CommandFailedError):
-      self.battery.GetFuelGaugeChargeCounter()
-
-  def testGetFuelGaugeChargeCounter_fuelGaugePresent(self):
-    self.battery._cache['profile'] = self._NEXUS_6
-    with self.assertCalls(
-        (self.call.battery.SupportsFuelGauge(), True),
-        (self.call.device.ReadFile(mock.ANY), '123')):
-      self.assertEqual(self.battery.GetFuelGaugeChargeCounter(), 123)
-
-
-class BatteryUtilsSetCharging(BatteryUtilsTest):
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testSetCharging_softwareSetTrue(self):
-    self.battery._cache['profile'] = self._NEXUS_6
-    with self.assertCalls(
-        (self.call.battery.GetCharging(), False),
-        (self.call.device.RunShellCommand(
-            ['dumpsys', 'battery', 'reset'], check_return=True), []),
-        (self.call.battery.GetCharging(), False),
-        (self.call.device.RunShellCommand(
-            ['dumpsys', 'battery'], check_return=True), ['UPDATES STOPPED']),
-        (self.call.battery.GetCharging(), True)):
-      self.battery.SetCharging(True)
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testSetCharging_softwareSetFalse(self):
-    self.battery._cache['profile'] = self._NEXUS_6
-    with self.assertCalls(
-        (self.call.battery.GetCharging(), True),
-        (self.call.battery._ClearPowerData(), True),
-        (self.call.device.RunShellCommand(
-            ['dumpsys', 'battery', 'set', 'ac', '0'], check_return=True), []),
-        (self.call.device.RunShellCommand(
-            ['dumpsys', 'battery', 'set', 'usb', '0'], check_return=True), []),
-        (self.call.battery.GetCharging(), False)):
-      self.battery.SetCharging(False)
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testSetCharging_hardwareSetTrue(self):
-    self.battery._cache['profile'] = self._NEXUS_5
-    with self.assertCalls(
-        (self.call.battery.GetCharging(), False),
-        (self.call.battery._HardwareSetCharging(True))):
-      self.battery.SetCharging(True)
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testSetCharging_hardwareSetFalse(self):
-    self.battery._cache['profile'] = self._NEXUS_5
-    with self.assertCalls(
-        (self.call.battery.GetCharging(), True),
-        (self.call.battery._ClearPowerData(), True),
-        (self.call.battery._HardwareSetCharging(False))):
-      self.battery.SetCharging(False)
-
-  def testSetCharging_expectedStateAlreadyTrue(self):
-    with self.assertCalls((self.call.battery.GetCharging(), True)):
-      self.battery.SetCharging(True)
-
-  def testSetCharging_expectedStateAlreadyFalse(self):
-    with self.assertCalls((self.call.battery.GetCharging(), False)):
-      self.battery.SetCharging(False)
-
-
-class BatteryUtilsPowerMeasurement(BatteryUtilsTest):
-
-  def testPowerMeasurement_hardware(self):
-    self.battery._cache['profile'] = self._NEXUS_5
-    with self.assertCalls(
-        (self.call.battery.GetCharging(), True),
-        (self.call.battery._ClearPowerData(), True),
-        (self.call.battery._HardwareSetCharging(False)),
-        (self.call.battery.GetCharging(), False),
-        (self.call.battery._HardwareSetCharging(True))):
-      with self.battery.PowerMeasurement():
-        pass
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testPowerMeasurement_software(self):
-    self.battery._cache['profile'] = self._NEXUS_6
-    with self.assertCalls(
-        (self.call.battery.GetCharging(), True),
-        (self.call.battery._ClearPowerData(), True),
-        (self.call.device.RunShellCommand(
-            ['dumpsys', 'battery', 'set', 'ac', '0'], check_return=True), []),
-        (self.call.device.RunShellCommand(
-            ['dumpsys', 'battery', 'set', 'usb', '0'], check_return=True), []),
-        (self.call.battery.GetCharging(), False),
-        (self.call.battery.GetCharging(), False),
-        (self.call.device.RunShellCommand(
-            ['dumpsys', 'battery', 'reset'], check_return=True), []),
-        (self.call.battery.GetCharging(), False),
-        (self.call.device.RunShellCommand(
-            ['dumpsys', 'battery'], check_return=True), ['UPDATES STOPPED']),
-        (self.call.battery.GetCharging(), True)):
-      with self.battery.PowerMeasurement():
-        pass
-
-
-class BatteryUtilsDiscoverDeviceProfile(BatteryUtilsTest):
-
-  def testDiscoverDeviceProfile_known(self):
-    with self.patch_call(self.call.device.product_model,
-                         return_value='Nexus 4'):
-      self.battery._DiscoverDeviceProfile()
-      self.assertListEqual(self.battery._cache['profile']['name'], ["Nexus 4"])
-
-  def testDiscoverDeviceProfile_unknown(self):
-    with self.patch_call(self.call.device.product_model,
-                         return_value='Other'):
-      self.battery._DiscoverDeviceProfile()
-      self.assertListEqual(self.battery._cache['profile']['name'], [])
-
-
-class BatteryUtilsClearPowerData(BatteryUtilsTest):
-
-  def testClearPowerData_preL(self):
-    with self.patch_call(self.call.device.build_version_sdk,
-                         return_value=20):
-      self.assertFalse(self.battery._ClearPowerData())
-
-  def testClearPowerData_clearedL(self):
-    with self.patch_call(self.call.device.build_version_sdk,
-                         return_value=22):
-      with self.assertCalls(
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'battery', 'set', 'usb', '1'], check_return=True),
-           []),
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'battery', 'set', 'ac', '1'], check_return=True), []),
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'batterystats', '--reset'], check_return=True), []),
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'batterystats', '--charged', '-c'],
-              check_return=True, large_output=True), []),
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'battery', 'reset'], check_return=True), [])):
-        self.assertTrue(self.battery._ClearPowerData())
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testClearPowerData_notClearedL(self):
-    with self.patch_call(self.call.device.build_version_sdk,
-                         return_value=22):
-      with self.assertCalls(
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'battery', 'set', 'usb', '1'], check_return=True),
-           []),
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'battery', 'set', 'ac', '1'], check_return=True), []),
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'batterystats', '--reset'], check_return=True), []),
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'batterystats', '--charged', '-c'],
-              check_return=True, large_output=True),
-              ['9,1000,l,pwi,uid,0.0327']),
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'batterystats', '--reset'], check_return=True), []),
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'batterystats', '--charged', '-c'],
-              check_return=True, large_output=True),
-              ['9,1000,l,pwi,uid,0.0327']),
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'batterystats', '--reset'], check_return=True), []),
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'batterystats', '--charged', '-c'],
-              check_return=True, large_output=True),
-              ['9,1000,l,pwi,uid,0.0327']),
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'batterystats', '--reset'], check_return=True), []),
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'batterystats', '--charged', '-c'],
-              check_return=True, large_output=True),
-              ['9,1000,l,pwi,uid,0.0']),
-          (self.call.device.RunShellCommand(
-              ['dumpsys', 'battery', 'reset'], check_return=True), [])):
-        self.battery._ClearPowerData()
-
-
-if __name__ == '__main__':
-  logging.getLogger().setLevel(logging.DEBUG)
-  unittest.main(verbosity=2)
diff --git a/third_party/catapult/devil/devil/android/constants/__init__.py b/third_party/catapult/devil/devil/android/constants/__init__.py
deleted file mode 100644
index 50b23df..0000000
--- a/third_party/catapult/devil/devil/android/constants/__init__.py
+++ /dev/null
@@ -1,3 +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.
diff --git a/third_party/catapult/devil/devil/android/constants/chrome.py b/third_party/catapult/devil/devil/android/constants/chrome.py
deleted file mode 100644
index dca04bd..0000000
--- a/third_party/catapult/devil/devil/android/constants/chrome.py
+++ /dev/null
@@ -1,57 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import collections
-
-PackageInfo = collections.namedtuple(
-    'PackageInfo',
-    ['package', 'activity', 'cmdline_file', 'devtools_socket'])
-
-PACKAGE_INFO = {
-    'chrome_document': PackageInfo(
-        'com.google.android.apps.chrome.document',
-        'com.google.android.apps.chrome.document.ChromeLauncherActivity',
-        'chrome-command-line',
-        'chrome_devtools_remote'),
-    'chrome': PackageInfo(
-        'com.google.android.apps.chrome',
-        'com.google.android.apps.chrome.Main',
-        'chrome-command-line',
-        'chrome_devtools_remote'),
-    'chrome_beta': PackageInfo(
-        'com.chrome.beta',
-        'com.google.android.apps.chrome.Main',
-        'chrome-command-line',
-        'chrome_devtools_remote'),
-    'chrome_stable': PackageInfo(
-        'com.android.chrome',
-        'com.google.android.apps.chrome.Main',
-        'chrome-command-line',
-        'chrome_devtools_remote'),
-    'chrome_dev': PackageInfo(
-        'com.chrome.dev',
-        'com.google.android.apps.chrome.Main',
-        'chrome-command-line',
-        'chrome_devtools_remote'),
-    'chrome_canary': PackageInfo(
-        'com.chrome.canary',
-        'com.google.android.apps.chrome.Main',
-        'chrome-command-line',
-        'chrome_devtools_remote'),
-    'chrome_work': PackageInfo(
-        'com.chrome.work',
-        'com.google.android.apps.chrome.Main',
-        'chrome-command-line',
-        'chrome_devtools_remote'),
-    'chromium': PackageInfo(
-        'org.chromium.chrome',
-        'com.google.android.apps.chrome.Main',
-        'chrome-command-line',
-        'chrome_devtools_remote'),
-    'content_shell': PackageInfo(
-        'org.chromium.content_shell_apk',
-        '.ContentShellActivity',
-        'content-shell-command-line',
-        'content_shell_devtools_remote'),
-}
diff --git a/third_party/catapult/devil/devil/android/constants/file_system.py b/third_party/catapult/devil/devil/android/constants/file_system.py
deleted file mode 100644
index bffec61..0000000
--- a/third_party/catapult/devil/devil/android/constants/file_system.py
+++ /dev/null
@@ -1,5 +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.
-
-TEST_EXECUTABLE_DIR = '/data/local/tmp'
diff --git a/third_party/catapult/devil/devil/android/decorators.py b/third_party/catapult/devil/devil/android/decorators.py
deleted file mode 100644
index 3844b49..0000000
--- a/third_party/catapult/devil/devil/android/decorators.py
+++ /dev/null
@@ -1,176 +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.
-
-"""
-Function/method decorators that provide timeout and retry logic.
-"""
-
-import functools
-import itertools
-import sys
-
-from devil.android import device_errors
-from devil.utils import cmd_helper
-from devil.utils import reraiser_thread
-from devil.utils import timeout_retry
-
-DEFAULT_TIMEOUT_ATTR = '_default_timeout'
-DEFAULT_RETRIES_ATTR = '_default_retries'
-
-
-def _TimeoutRetryWrapper(
-    f, timeout_func, retries_func, retry_if_func=timeout_retry.AlwaysRetry,
-    pass_values=False):
-  """ Wraps a funcion with timeout and retry handling logic.
-
-  Args:
-    f: The function to wrap.
-    timeout_func: A callable that returns the timeout value.
-    retries_func: A callable that returns the retries value.
-    pass_values: If True, passes the values returned by |timeout_func| and
-                 |retries_func| to the wrapped function as 'timeout' and
-                 'retries' kwargs, respectively.
-  Returns:
-    The wrapped function.
-  """
-  @functools.wraps(f)
-  def timeout_retry_wrapper(*args, **kwargs):
-    timeout = timeout_func(*args, **kwargs)
-    retries = retries_func(*args, **kwargs)
-    if pass_values:
-      kwargs['timeout'] = timeout
-      kwargs['retries'] = retries
-
-    @functools.wraps(f)
-    def impl():
-      return f(*args, **kwargs)
-    try:
-      if timeout_retry.CurrentTimeoutThreadGroup():
-        # Don't wrap if there's already an outer timeout thread.
-        return impl()
-      else:
-        desc = '%s(%s)' % (f.__name__, ', '.join(itertools.chain(
-            (str(a) for a in args),
-            ('%s=%s' % (k, str(v)) for k, v in kwargs.iteritems()))))
-        return timeout_retry.Run(impl, timeout, retries, desc=desc,
-                                 retry_if_func=retry_if_func)
-    except reraiser_thread.TimeoutError as e:
-      raise device_errors.CommandTimeoutError(str(e)), None, (
-          sys.exc_info()[2])
-    except cmd_helper.TimeoutError as e:
-      raise device_errors.CommandTimeoutError(str(e)), None, (
-          sys.exc_info()[2])
-  return timeout_retry_wrapper
-
-
-def WithTimeoutAndRetries(f):
-  """A decorator that handles timeouts and retries.
-
-  'timeout' and 'retries' kwargs must be passed to the function.
-
-  Args:
-    f: The function to decorate.
-  Returns:
-    The decorated function.
-  """
-  get_timeout = lambda *a, **kw: kw['timeout']
-  get_retries = lambda *a, **kw: kw['retries']
-  return _TimeoutRetryWrapper(f, get_timeout, get_retries)
-
-
-def WithTimeoutAndConditionalRetries(retry_if_func):
-  """Returns a decorator that handles timeouts and, in some cases, retries.
-
-  'timeout' and 'retries' kwargs must be passed to the function.
-
-  Args:
-    retry_if_func: A unary callable that takes an exception and returns
-      whether failures should be retried.
-  Returns:
-    The actual decorator.
-  """
-  def decorator(f):
-    get_timeout = lambda *a, **kw: kw['timeout']
-    get_retries = lambda *a, **kw: kw['retries']
-    return _TimeoutRetryWrapper(
-        f, get_timeout, get_retries, retry_if_func=retry_if_func)
-  return decorator
-
-
-def WithExplicitTimeoutAndRetries(timeout, retries):
-  """Returns a decorator that handles timeouts and retries.
-
-  The provided |timeout| and |retries| values are always used.
-
-  Args:
-    timeout: The number of seconds to wait for the decorated function to
-             return. Always used.
-    retries: The number of times the decorated function should be retried on
-             failure. Always used.
-  Returns:
-    The actual decorator.
-  """
-  def decorator(f):
-    get_timeout = lambda *a, **kw: timeout
-    get_retries = lambda *a, **kw: retries
-    return _TimeoutRetryWrapper(f, get_timeout, get_retries)
-  return decorator
-
-
-def WithTimeoutAndRetriesDefaults(default_timeout, default_retries):
-  """Returns a decorator that handles timeouts and retries.
-
-  The provided |default_timeout| and |default_retries| values are used only
-  if timeout and retries values are not provided.
-
-  Args:
-    default_timeout: The number of seconds to wait for the decorated function
-                     to return. Only used if a 'timeout' kwarg is not passed
-                     to the decorated function.
-    default_retries: The number of times the decorated function should be
-                     retried on failure. Only used if a 'retries' kwarg is not
-                     passed to the decorated function.
-  Returns:
-    The actual decorator.
-  """
-  def decorator(f):
-    get_timeout = lambda *a, **kw: kw.get('timeout', default_timeout)
-    get_retries = lambda *a, **kw: kw.get('retries', default_retries)
-    return _TimeoutRetryWrapper(f, get_timeout, get_retries, pass_values=True)
-  return decorator
-
-
-def WithTimeoutAndRetriesFromInstance(
-    default_timeout_name=DEFAULT_TIMEOUT_ATTR,
-    default_retries_name=DEFAULT_RETRIES_ATTR,
-    min_default_timeout=None):
-  """Returns a decorator that handles timeouts and retries.
-
-  The provided |default_timeout_name| and |default_retries_name| are used to
-  get the default timeout value and the default retries value from the object
-  instance if timeout and retries values are not provided.
-
-  Note that this should only be used to decorate methods, not functions.
-
-  Args:
-    default_timeout_name: The name of the default timeout attribute of the
-                          instance.
-    default_retries_name: The name of the default retries attribute of the
-                          instance.
-    min_timeout: Miniumum timeout to be used when using instance timeout.
-  Returns:
-    The actual decorator.
-  """
-  def decorator(f):
-    def get_timeout(inst, *_args, **kwargs):
-      ret = getattr(inst, default_timeout_name)
-      if min_default_timeout is not None:
-        ret = max(min_default_timeout, ret)
-      return kwargs.get('timeout', ret)
-
-    def get_retries(inst, *_args, **kwargs):
-      return kwargs.get('retries', getattr(inst, default_retries_name))
-    return _TimeoutRetryWrapper(f, get_timeout, get_retries, pass_values=True)
-  return decorator
-
diff --git a/third_party/catapult/devil/devil/android/decorators_test.py b/third_party/catapult/devil/devil/android/decorators_test.py
deleted file mode 100644
index f60953e..0000000
--- a/third_party/catapult/devil/devil/android/decorators_test.py
+++ /dev/null
@@ -1,332 +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.
-
-"""
-Unit tests for decorators.py.
-"""
-
-# pylint: disable=W0613
-
-import time
-import traceback
-import unittest
-
-from devil.android import decorators
-from devil.android import device_errors
-from devil.utils import reraiser_thread
-
-_DEFAULT_TIMEOUT = 30
-_DEFAULT_RETRIES = 3
-
-
-class DecoratorsTest(unittest.TestCase):
-  _decorated_function_called_count = 0
-
-  def testFunctionDecoratorDoesTimeouts(self):
-    """Tests that the base decorator handles the timeout logic."""
-    DecoratorsTest._decorated_function_called_count = 0
-
-    @decorators.WithTimeoutAndRetries
-    def alwaysTimesOut(timeout=None, retries=None):
-      DecoratorsTest._decorated_function_called_count += 1
-      time.sleep(100)
-
-    start_time = time.time()
-    with self.assertRaises(device_errors.CommandTimeoutError):
-      alwaysTimesOut(timeout=1, retries=0)
-    elapsed_time = time.time() - start_time
-    self.assertTrue(elapsed_time >= 1)
-    self.assertEquals(1, DecoratorsTest._decorated_function_called_count)
-
-  def testFunctionDecoratorDoesRetries(self):
-    """Tests that the base decorator handles the retries logic."""
-    DecoratorsTest._decorated_function_called_count = 0
-
-    @decorators.WithTimeoutAndRetries
-    def alwaysRaisesCommandFailedError(timeout=None, retries=None):
-      DecoratorsTest._decorated_function_called_count += 1
-      raise device_errors.CommandFailedError('testCommand failed')
-
-    with self.assertRaises(device_errors.CommandFailedError):
-      alwaysRaisesCommandFailedError(timeout=30, retries=10)
-    self.assertEquals(11, DecoratorsTest._decorated_function_called_count)
-
-  def testFunctionDecoratorRequiresParams(self):
-    """Tests that the base decorator requires timeout and retries params."""
-    @decorators.WithTimeoutAndRetries
-    def requiresExplicitTimeoutAndRetries(timeout=None, retries=None):
-      return (timeout, retries)
-
-    with self.assertRaises(KeyError):
-      requiresExplicitTimeoutAndRetries()
-    with self.assertRaises(KeyError):
-      requiresExplicitTimeoutAndRetries(timeout=10)
-    with self.assertRaises(KeyError):
-      requiresExplicitTimeoutAndRetries(retries=0)
-    expected_timeout = 10
-    expected_retries = 1
-    (actual_timeout, actual_retries) = (
-        requiresExplicitTimeoutAndRetries(timeout=expected_timeout,
-                                          retries=expected_retries))
-    self.assertEquals(expected_timeout, actual_timeout)
-    self.assertEquals(expected_retries, actual_retries)
-
-  def testFunctionDecoratorTranslatesReraiserExceptions(self):
-    """Tests that the explicit decorator translates reraiser exceptions."""
-    @decorators.WithTimeoutAndRetries
-    def alwaysRaisesProvidedException(exception, timeout=None, retries=None):
-      raise exception
-
-    exception_desc = 'Reraiser thread timeout error'
-    with self.assertRaises(device_errors.CommandTimeoutError) as e:
-      alwaysRaisesProvidedException(
-          reraiser_thread.TimeoutError(exception_desc),
-          timeout=10, retries=1)
-    self.assertEquals(exception_desc, str(e.exception))
-
-  def testConditionalRetriesDecoratorRetries(self):
-    def do_not_retry_no_adb_error(exc):
-      return not isinstance(exc, device_errors.NoAdbError)
-
-    actual_tries = [0]
-
-    @decorators.WithTimeoutAndConditionalRetries(do_not_retry_no_adb_error)
-    def alwaysRaisesCommandFailedError(timeout=None, retries=None):
-      actual_tries[0] += 1
-      raise device_errors.CommandFailedError('Command failed :(')
-
-    with self.assertRaises(device_errors.CommandFailedError):
-      alwaysRaisesCommandFailedError(timeout=10, retries=10)
-    self.assertEquals(11, actual_tries[0])
-
-  def testConditionalRetriesDecoratorDoesntRetry(self):
-    def do_not_retry_no_adb_error(exc):
-      return not isinstance(exc, device_errors.NoAdbError)
-
-    actual_tries = [0]
-
-    @decorators.WithTimeoutAndConditionalRetries(do_not_retry_no_adb_error)
-    def alwaysRaisesNoAdbError(timeout=None, retries=None):
-      actual_tries[0] += 1
-      raise device_errors.NoAdbError()
-
-    with self.assertRaises(device_errors.NoAdbError):
-      alwaysRaisesNoAdbError(timeout=10, retries=10)
-    self.assertEquals(1, actual_tries[0])
-
-  def testDefaultsFunctionDecoratorDoesTimeouts(self):
-    """Tests that the defaults decorator handles timeout logic."""
-    DecoratorsTest._decorated_function_called_count = 0
-
-    @decorators.WithTimeoutAndRetriesDefaults(1, 0)
-    def alwaysTimesOut(timeout=None, retries=None):
-      DecoratorsTest._decorated_function_called_count += 1
-      time.sleep(100)
-
-    start_time = time.time()
-    with self.assertRaises(device_errors.CommandTimeoutError):
-      alwaysTimesOut()
-    elapsed_time = time.time() - start_time
-    self.assertTrue(elapsed_time >= 1)
-    self.assertEquals(1, DecoratorsTest._decorated_function_called_count)
-
-    DecoratorsTest._decorated_function_called_count = 0
-    with self.assertRaises(device_errors.CommandTimeoutError):
-      alwaysTimesOut(timeout=2)
-    elapsed_time = time.time() - start_time
-    self.assertTrue(elapsed_time >= 2)
-    self.assertEquals(1, DecoratorsTest._decorated_function_called_count)
-
-  def testDefaultsFunctionDecoratorDoesRetries(self):
-    """Tests that the defaults decorator handles retries logic."""
-    DecoratorsTest._decorated_function_called_count = 0
-
-    @decorators.WithTimeoutAndRetriesDefaults(30, 10)
-    def alwaysRaisesCommandFailedError(timeout=None, retries=None):
-      DecoratorsTest._decorated_function_called_count += 1
-      raise device_errors.CommandFailedError('testCommand failed')
-
-    with self.assertRaises(device_errors.CommandFailedError):
-      alwaysRaisesCommandFailedError()
-    self.assertEquals(11, DecoratorsTest._decorated_function_called_count)
-
-    DecoratorsTest._decorated_function_called_count = 0
-    with self.assertRaises(device_errors.CommandFailedError):
-      alwaysRaisesCommandFailedError(retries=5)
-    self.assertEquals(6, DecoratorsTest._decorated_function_called_count)
-
-  def testDefaultsFunctionDecoratorPassesValues(self):
-    """Tests that the defaults decorator passes timeout and retries kwargs."""
-    @decorators.WithTimeoutAndRetriesDefaults(30, 10)
-    def alwaysReturnsTimeouts(timeout=None, retries=None):
-      return timeout
-
-    self.assertEquals(30, alwaysReturnsTimeouts())
-    self.assertEquals(120, alwaysReturnsTimeouts(timeout=120))
-
-    @decorators.WithTimeoutAndRetriesDefaults(30, 10)
-    def alwaysReturnsRetries(timeout=None, retries=None):
-      return retries
-
-    self.assertEquals(10, alwaysReturnsRetries())
-    self.assertEquals(1, alwaysReturnsRetries(retries=1))
-
-  def testDefaultsFunctionDecoratorTranslatesReraiserExceptions(self):
-    """Tests that the explicit decorator translates reraiser exceptions."""
-    @decorators.WithTimeoutAndRetriesDefaults(30, 10)
-    def alwaysRaisesProvidedException(exception, timeout=None, retries=None):
-      raise exception
-
-    exception_desc = 'Reraiser thread timeout error'
-    with self.assertRaises(device_errors.CommandTimeoutError) as e:
-      alwaysRaisesProvidedException(
-          reraiser_thread.TimeoutError(exception_desc))
-    self.assertEquals(exception_desc, str(e.exception))
-
-  def testExplicitFunctionDecoratorDoesTimeouts(self):
-    """Tests that the explicit decorator handles timeout logic."""
-    DecoratorsTest._decorated_function_called_count = 0
-
-    @decorators.WithExplicitTimeoutAndRetries(1, 0)
-    def alwaysTimesOut():
-      DecoratorsTest._decorated_function_called_count += 1
-      time.sleep(100)
-
-    start_time = time.time()
-    with self.assertRaises(device_errors.CommandTimeoutError):
-      alwaysTimesOut()
-    elapsed_time = time.time() - start_time
-    self.assertTrue(elapsed_time >= 1)
-    self.assertEquals(1, DecoratorsTest._decorated_function_called_count)
-
-  def testExplicitFunctionDecoratorDoesRetries(self):
-    """Tests that the explicit decorator handles retries logic."""
-    DecoratorsTest._decorated_function_called_count = 0
-
-    @decorators.WithExplicitTimeoutAndRetries(30, 10)
-    def alwaysRaisesCommandFailedError():
-      DecoratorsTest._decorated_function_called_count += 1
-      raise device_errors.CommandFailedError('testCommand failed')
-
-    with self.assertRaises(device_errors.CommandFailedError):
-      alwaysRaisesCommandFailedError()
-    self.assertEquals(11, DecoratorsTest._decorated_function_called_count)
-
-  def testExplicitDecoratorTranslatesReraiserExceptions(self):
-    """Tests that the explicit decorator translates reraiser exceptions."""
-    @decorators.WithExplicitTimeoutAndRetries(30, 10)
-    def alwaysRaisesProvidedException(exception):
-      raise exception
-
-    exception_desc = 'Reraiser thread timeout error'
-    with self.assertRaises(device_errors.CommandTimeoutError) as e:
-      alwaysRaisesProvidedException(
-          reraiser_thread.TimeoutError(exception_desc))
-    self.assertEquals(exception_desc, str(e.exception))
-
-  class _MethodDecoratorTestObject(object):
-    """An object suitable for testing the method decorator."""
-
-    def __init__(self, test_case, default_timeout=_DEFAULT_TIMEOUT,
-                 default_retries=_DEFAULT_RETRIES):
-      self._test_case = test_case
-      self.default_timeout = default_timeout
-      self.default_retries = default_retries
-      self.function_call_counters = {
-          'alwaysRaisesCommandFailedError': 0,
-          'alwaysTimesOut': 0,
-          'requiresExplicitTimeoutAndRetries': 0,
-      }
-
-    @decorators.WithTimeoutAndRetriesFromInstance(
-        'default_timeout', 'default_retries')
-    def alwaysTimesOut(self, timeout=None, retries=None):
-      self.function_call_counters['alwaysTimesOut'] += 1
-      time.sleep(100)
-      self._test_case.assertFalse(True, msg='Failed to time out?')
-
-    @decorators.WithTimeoutAndRetriesFromInstance(
-        'default_timeout', 'default_retries')
-    def alwaysRaisesCommandFailedError(self, timeout=None, retries=None):
-      self.function_call_counters['alwaysRaisesCommandFailedError'] += 1
-      raise device_errors.CommandFailedError('testCommand failed')
-
-    # pylint: disable=no-self-use
-
-    @decorators.WithTimeoutAndRetriesFromInstance(
-        'default_timeout', 'default_retries')
-    def alwaysReturnsTimeout(self, timeout=None, retries=None):
-      return timeout
-
-    @decorators.WithTimeoutAndRetriesFromInstance(
-        'default_timeout', 'default_retries', min_default_timeout=100)
-    def alwaysReturnsTimeoutWithMin(self, timeout=None, retries=None):
-      return timeout
-
-    @decorators.WithTimeoutAndRetriesFromInstance(
-        'default_timeout', 'default_retries')
-    def alwaysReturnsRetries(self, timeout=None, retries=None):
-      return retries
-
-    @decorators.WithTimeoutAndRetriesFromInstance(
-        'default_timeout', 'default_retries')
-    def alwaysRaisesProvidedException(self, exception, timeout=None,
-                                      retries=None):
-      raise exception
-
-    # pylint: enable=no-self-use
-
-  def testMethodDecoratorDoesTimeout(self):
-    """Tests that the method decorator handles timeout logic."""
-    test_obj = self._MethodDecoratorTestObject(self)
-    start_time = time.time()
-    with self.assertRaises(device_errors.CommandTimeoutError):
-      try:
-        test_obj.alwaysTimesOut(timeout=1, retries=0)
-      except:
-        traceback.print_exc()
-        raise
-    elapsed_time = time.time() - start_time
-    self.assertTrue(elapsed_time >= 1)
-    self.assertEquals(1, test_obj.function_call_counters['alwaysTimesOut'])
-
-  def testMethodDecoratorDoesRetries(self):
-    """Tests that the method decorator handles retries logic."""
-    test_obj = self._MethodDecoratorTestObject(self)
-    with self.assertRaises(device_errors.CommandFailedError):
-      try:
-        test_obj.alwaysRaisesCommandFailedError(retries=10)
-      except:
-        traceback.print_exc()
-        raise
-    self.assertEquals(
-        11, test_obj.function_call_counters['alwaysRaisesCommandFailedError'])
-
-  def testMethodDecoratorPassesValues(self):
-    """Tests that the method decorator passes timeout and retries kwargs."""
-    test_obj = self._MethodDecoratorTestObject(
-        self, default_timeout=42, default_retries=31)
-    self.assertEquals(42, test_obj.alwaysReturnsTimeout())
-    self.assertEquals(41, test_obj.alwaysReturnsTimeout(timeout=41))
-    self.assertEquals(31, test_obj.alwaysReturnsRetries())
-    self.assertEquals(32, test_obj.alwaysReturnsRetries(retries=32))
-
-  def testMethodDecoratorUsesMiniumumTimeout(self):
-    test_obj = self._MethodDecoratorTestObject(
-        self, default_timeout=42, default_retries=31)
-    self.assertEquals(100, test_obj.alwaysReturnsTimeoutWithMin())
-    self.assertEquals(41, test_obj.alwaysReturnsTimeoutWithMin(timeout=41))
-
-  def testMethodDecoratorTranslatesReraiserExceptions(self):
-    test_obj = self._MethodDecoratorTestObject(self)
-
-    exception_desc = 'Reraiser thread timeout error'
-    with self.assertRaises(device_errors.CommandTimeoutError) as e:
-      test_obj.alwaysRaisesProvidedException(
-          reraiser_thread.TimeoutError(exception_desc))
-    self.assertEquals(exception_desc, str(e.exception))
-
-if __name__ == '__main__':
-  unittest.main(verbosity=2)
-
diff --git a/third_party/catapult/devil/devil/android/device_blacklist.py b/third_party/catapult/devil/devil/android/device_blacklist.py
deleted file mode 100644
index 010e996..0000000
--- a/third_party/catapult/devil/devil/android/device_blacklist.py
+++ /dev/null
@@ -1,80 +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.
-
-import json
-import logging
-import os
-import threading
-import time
-
-logger = logging.getLogger(__name__)
-
-
-class Blacklist(object):
-
-  def __init__(self, path):
-    self._blacklist_lock = threading.RLock()
-    self._path = path
-
-  def Read(self):
-    """Reads the blacklist from the blacklist file.
-
-    Returns:
-      A dict containing bad devices.
-    """
-    with self._blacklist_lock:
-      blacklist = dict()
-      if not os.path.exists(self._path):
-        return blacklist
-
-      try:
-        with open(self._path, 'r') as f:
-          blacklist = json.load(f)
-      except (IOError, ValueError) as e:
-        logger.warning('Unable to read blacklist: %s', str(e))
-        os.remove(self._path)
-
-      if not isinstance(blacklist, dict):
-        logger.warning('Ignoring %s: %s (a dict was expected instead)',
-                        self._path, blacklist)
-        blacklist = dict()
-
-      return blacklist
-
-  def Write(self, blacklist):
-    """Writes the provided blacklist to the blacklist file.
-
-    Args:
-      blacklist: list of bad devices to write to the blacklist file.
-    """
-    with self._blacklist_lock:
-      with open(self._path, 'w') as f:
-        json.dump(blacklist, f)
-
-  def Extend(self, devices, reason='unknown'):
-    """Adds devices to blacklist file.
-
-    Args:
-      devices: list of bad devices to be added to the blacklist file.
-      reason: string specifying the reason for blacklist (eg: 'unauthorized')
-    """
-    timestamp = time.time()
-    event_info = {
-        'timestamp': timestamp,
-        'reason': reason,
-    }
-    device_dicts = {device: event_info for device in devices}
-    logger.info('Adding %s to blacklist %s for reason: %s',
-                 ','.join(devices), self._path, reason)
-    with self._blacklist_lock:
-      blacklist = self.Read()
-      blacklist.update(device_dicts)
-      self.Write(blacklist)
-
-  def Reset(self):
-    """Erases the blacklist file if it exists."""
-    logger.info('Resetting blacklist %s', self._path)
-    with self._blacklist_lock:
-      if os.path.exists(self._path):
-        os.remove(self._path)
diff --git a/third_party/catapult/devil/devil/android/device_blacklist_test.py b/third_party/catapult/devil/devil/android/device_blacklist_test.py
deleted file mode 100644
index bc44da5..0000000
--- a/third_party/catapult/devil/devil/android/device_blacklist_test.py
+++ /dev/null
@@ -1,38 +0,0 @@
-#! /usr/bin/env python
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import os
-import tempfile
-import unittest
-
-from devil.android import device_blacklist
-
-
-class DeviceBlacklistTest(unittest.TestCase):
-
-  def testBlacklistFileDoesNotExist(self):
-    with tempfile.NamedTemporaryFile() as blacklist_file:
-      # Allow the temporary file to be deleted.
-      pass
-
-    test_blacklist = device_blacklist.Blacklist(blacklist_file.name)
-    self.assertEquals({}, test_blacklist.Read())
-
-  def testBlacklistFileIsEmpty(self):
-    try:
-      with tempfile.NamedTemporaryFile(delete=False) as blacklist_file:
-        # Allow the temporary file to be closed.
-        pass
-
-      test_blacklist = device_blacklist.Blacklist(blacklist_file.name)
-      self.assertEquals({}, test_blacklist.Read())
-
-    finally:
-      if os.path.exists(blacklist_file.name):
-        os.remove(blacklist_file.name)
-
-
-if __name__ == '__main__':
-  unittest.main()
diff --git a/third_party/catapult/devil/devil/android/device_errors.py b/third_party/catapult/devil/devil/android/device_errors.py
deleted file mode 100644
index 568e497..0000000
--- a/third_party/catapult/devil/devil/android/device_errors.py
+++ /dev/null
@@ -1,180 +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.
-
-"""
-Exception classes raised by AdbWrapper and DeviceUtils.
-"""
-
-from devil import base_error
-from devil.utils import cmd_helper
-from devil.utils import parallelizer
-
-
-class CommandFailedError(base_error.BaseError):
-  """Exception for command failures."""
-
-  def __init__(self, message, device_serial=None):
-    device_leader = '(device: %s)' % device_serial
-    if device_serial is not None and not message.startswith(device_leader):
-      message = '%s %s' % (device_leader, message)
-    self.device_serial = device_serial
-    super(CommandFailedError, self).__init__(message)
-
-  def __eq__(self, other):
-    return (super(CommandFailedError, self).__eq__(other)
-            and self.device_serial == other.device_serial)
-
-  def __ne__(self, other):
-    return not self == other
-
-
-class _BaseCommandFailedError(CommandFailedError):
-  """Base Exception for adb and fastboot command failures."""
-
-  def __init__(self, args, output, status=None, device_serial=None,
-               message=None):
-    self.args = args
-    self.output = output
-    self.status = status
-    if not message:
-      adb_cmd = ' '.join(cmd_helper.SingleQuote(arg) for arg in self.args)
-      message = ['adb %s: failed ' % adb_cmd]
-      if status:
-        message.append('with exit status %s ' % self.status)
-      if output:
-        message.append('and output:\n')
-        message.extend('- %s\n' % line for line in output.splitlines())
-      else:
-        message.append('and no output.')
-      message = ''.join(message)
-    super(_BaseCommandFailedError, self).__init__(message, device_serial)
-
-  def __eq__(self, other):
-    return (super(_BaseCommandFailedError, self).__eq__(other)
-            and self.args == other.args
-            and self.output == other.output
-            and self.status == other.status)
-
-  def __ne__(self, other):
-    return not self == other
-
-  def __reduce__(self):
-    """Support pickling."""
-    result = [None, None, None, None, None]
-    super_result = super(_BaseCommandFailedError, self).__reduce__()
-    for i in range(len(super_result)):
-      result[i] = super_result[i]
-
-    # Update the args used to reconstruct this exception.
-    result[1] = (
-        self.args, self.output, self.status, self.device_serial, self.message)
-    return tuple(result)
-
-
-class AdbCommandFailedError(_BaseCommandFailedError):
-  """Exception for adb command failures."""
-
-  def __init__(self, args, output, status=None, device_serial=None,
-               message=None):
-    super(AdbCommandFailedError, self).__init__(
-        args, output, status=status, message=message,
-        device_serial=device_serial)
-
-
-class FastbootCommandFailedError(_BaseCommandFailedError):
-  """Exception for fastboot command failures."""
-
-  def __init__(self, args, output, status=None, device_serial=None,
-               message=None):
-    super(FastbootCommandFailedError, self).__init__(
-        args, output, status=status, message=message,
-        device_serial=device_serial)
-
-
-class DeviceVersionError(CommandFailedError):
-  """Exception for device version failures."""
-
-  def __init__(self, message, device_serial=None):
-    super(DeviceVersionError, self).__init__(message, device_serial)
-
-
-class AdbShellCommandFailedError(AdbCommandFailedError):
-  """Exception for shell command failures run via adb."""
-
-  def __init__(self, command, output, status, device_serial=None):
-    self.command = command
-    message = ['shell command run via adb failed on the device:\n',
-               '  command: %s\n' % command]
-    message.append('  exit status: %s\n' % status)
-    if output:
-      message.append('  output:\n')
-      if isinstance(output, basestring):
-        output_lines = output.splitlines()
-      else:
-        output_lines = output
-      message.extend('  - %s\n' % line for line in output_lines)
-    else:
-      message.append("  output: ''\n")
-    message = ''.join(message)
-    super(AdbShellCommandFailedError, self).__init__(
-      ['shell', command], output, status, device_serial, message)
-
-  def __reduce__(self):
-    """Support pickling."""
-    result = [None, None, None, None, None]
-    super_result = super(AdbShellCommandFailedError, self).__reduce__()
-    for i in range(len(super_result)):
-      result[i] = super_result[i]
-
-    # Update the args used to reconstruct this exception.
-    result[1] = (self.command, self.output, self.status, self.device_serial)
-    return tuple(result)
-
-
-class CommandTimeoutError(base_error.BaseError):
-  """Exception for command timeouts."""
-  pass
-
-
-class DeviceUnreachableError(base_error.BaseError):
-  """Exception for device unreachable failures."""
-  pass
-
-
-class NoDevicesError(base_error.BaseError):
-  """Exception for having no devices attached."""
-
-  def __init__(self, msg=None):
-    super(NoDevicesError, self).__init__(
-        msg or 'No devices attached.', is_infra_error=True)
-
-
-class MultipleDevicesError(base_error.BaseError):
-  """Exception for having multiple attached devices without selecting one."""
-
-  def __init__(self, devices):
-    parallel_devices = parallelizer.Parallelizer(devices)
-    descriptions = parallel_devices.pMap(
-        lambda d: d.build_description).pGet(None)
-    msg = ('More than one device available. Use -d/--device to select a device '
-           'by serial.\n\nAvailable devices:\n')
-    for d, desc in zip(devices, descriptions):
-      msg += '  %s (%s)\n' % (d, desc)
-
-    super(MultipleDevicesError, self).__init__(msg, is_infra_error=True)
-
-
-class NoAdbError(base_error.BaseError):
-  """Exception for being unable to find ADB."""
-
-  def __init__(self, msg=None):
-    super(NoAdbError, self).__init__(
-        msg or 'Unable to find adb.', is_infra_error=True)
-
-
-class DeviceChargingError(CommandFailedError):
-  """Exception for device charging errors."""
-
-  def __init__(self, message, device_serial=None):
-    super(DeviceChargingError, self).__init__(message, device_serial)
diff --git a/third_party/catapult/devil/devil/android/device_errors_test.py b/third_party/catapult/devil/devil/android/device_errors_test.py
deleted file mode 100755
index 68a4f16..0000000
--- a/third_party/catapult/devil/devil/android/device_errors_test.py
+++ /dev/null
@@ -1,72 +0,0 @@
-#! /usr/bin/env python
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import pickle
-import sys
-import unittest
-
-from devil.android import device_errors
-
-
-class DeviceErrorsTest(unittest.TestCase):
-
-  def assertIsPicklable(self, original):
-    pickled = pickle.dumps(original)
-    reconstructed = pickle.loads(pickled)
-    self.assertEquals(original, reconstructed)
-
-  def testPicklable_AdbCommandFailedError(self):
-    original = device_errors.AdbCommandFailedError(
-        ['these', 'are', 'adb', 'args'], 'adb failure output', status=':(',
-        device_serial='0123456789abcdef')
-    self.assertIsPicklable(original)
-
-  def testPicklable_AdbShellCommandFailedError(self):
-    original = device_errors.AdbShellCommandFailedError(
-        'foo', 'erroneous foo output', '1', device_serial='0123456789abcdef')
-    self.assertIsPicklable(original)
-
-  def testPicklable_CommandFailedError(self):
-    original = device_errors.CommandFailedError(
-        'sample command failed')
-    self.assertIsPicklable(original)
-
-  def testPicklable_CommandTimeoutError(self):
-    original = device_errors.CommandTimeoutError(
-        'My fake command timed out :(')
-    self.assertIsPicklable(original)
-
-  def testPicklable_DeviceChargingError(self):
-    original = device_errors.DeviceChargingError(
-        'Fake device failed to charge')
-    self.assertIsPicklable(original)
-
-  def testPicklable_DeviceUnreachableError(self):
-    original = device_errors.DeviceUnreachableError
-    self.assertIsPicklable(original)
-
-  def testPicklable_FastbootCommandFailedError(self):
-    original = device_errors.FastbootCommandFailedError(
-        ['these', 'are', 'fastboot', 'args'], 'fastboot failure output',
-        status=':(', device_serial='0123456789abcdef')
-    self.assertIsPicklable(original)
-
-  def testPicklable_MultipleDevicesError(self):
-    # TODO(jbudorick): Implement this after implementing a stable DeviceUtils
-    # fake. https://github.com/catapult-project/catapult/issues/3145
-    pass
-
-  def testPicklable_NoAdbError(self):
-    original = device_errors.NoAdbError()
-    self.assertIsPicklable(original)
-
-  def testPicklable_NoDevicesError(self):
-    original = device_errors.NoDevicesError()
-    self.assertIsPicklable(original)
-
-
-
-if __name__ == '__main__':
-  sys.exit(unittest.main())
diff --git a/third_party/catapult/devil/devil/android/device_list.py b/third_party/catapult/devil/devil/android/device_list.py
deleted file mode 100644
index 0fbb0f1..0000000
--- a/third_party/catapult/devil/devil/android/device_list.py
+++ /dev/null
@@ -1,52 +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.
-
-"""A module to keep track of devices across builds."""
-
-import json
-import logging
-import os
-
-logger = logging.getLogger(__name__)
-
-
-def GetPersistentDeviceList(file_name):
-  """Returns a list of devices.
-
-  Args:
-    file_name: the file name containing a list of devices.
-
-  Returns: List of device serial numbers that were on the bot.
-  """
-  if not os.path.isfile(file_name):
-    logger.warning("Device file %s doesn't exist.", file_name)
-    return []
-
-  try:
-    with open(file_name) as f:
-      devices = json.load(f)
-    if not isinstance(devices, list) or not all(isinstance(d, basestring)
-                                                for d in devices):
-      logger.warning('Unrecognized device file format: %s', devices)
-      return []
-    return [d for d in devices if d != '(error)']
-  except ValueError:
-    logger.exception(
-        'Error reading device file %s. Falling back to old format.', file_name)
-
-  # TODO(bpastene) Remove support for old unstructured file format.
-  with open(file_name) as f:
-    return [d for d in f.read().splitlines() if d != '(error)']
-
-
-def WritePersistentDeviceList(file_name, device_list):
-  path = os.path.dirname(file_name)
-  assert isinstance(device_list, list)
-  # If there is a problem with ADB "(error)" can be added to the device list.
-  # These should be removed before saving.
-  device_list = [d for d in device_list if d != '(error)']
-  if not os.path.exists(path):
-    os.makedirs(path)
-  with open(file_name, 'w') as f:
-    json.dump(device_list, f)
diff --git a/third_party/catapult/devil/devil/android/device_signal.py b/third_party/catapult/devil/devil/android/device_signal.py
deleted file mode 100644
index 2cec46d..0000000
--- a/third_party/catapult/devil/devil/android/device_signal.py
+++ /dev/null
@@ -1,41 +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.
-
-"""Defines constants for signals that should be supported on devices.
-
-Note: Obtained by running `kill -l` on a user device.
-"""
-
-
-SIGHUP = 1  # Hangup
-SIGINT = 2  # Interrupt
-SIGQUIT = 3  # Quit
-SIGILL = 4  # Illegal instruction
-SIGTRAP = 5  # Trap
-SIGABRT = 6  # Aborted
-SIGBUS = 7  # Bus error
-SIGFPE = 8  # Floating point exception
-SIGKILL = 9  # Killed
-SIGUSR1 = 10  # User signal 1
-SIGSEGV = 11  # Segmentation fault
-SIGUSR2 = 12  # User signal 2
-SIGPIPE = 13  # Broken pipe
-SIGALRM = 14  # Alarm clock
-SIGTERM = 15  # Terminated
-SIGSTKFLT = 16  # Stack fault
-SIGCHLD = 17  # Child exited
-SIGCONT = 18  # Continue
-SIGSTOP = 19  # Stopped (signal)
-SIGTSTP = 20  # Stopped
-SIGTTIN = 21  # Stopped (tty input)
-SIGTTOU = 22  # Stopped (tty output)
-SIGURG = 23  # Urgent I/O condition
-SIGXCPU = 24  # CPU time limit exceeded
-SIGXFSZ = 25  # File size limit exceeded
-SIGVTALRM = 26  # Virtual timer expired
-SIGPROF = 27  # Profiling timer expired
-SIGWINCH = 28  # Window size changed
-SIGIO = 29  # I/O possible
-SIGPWR = 30  # Power failure
-SIGSYS = 31  # Bad system call
diff --git a/third_party/catapult/devil/devil/android/device_temp_file.py b/third_party/catapult/devil/devil/android/device_temp_file.py
deleted file mode 100644
index 4d0c7ad..0000000
--- a/third_party/catapult/devil/devil/android/device_temp_file.py
+++ /dev/null
@@ -1,63 +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.
-
-"""A temp file that automatically gets pushed and deleted from a device."""
-
-# pylint: disable=W0622
-
-import posixpath
-import random
-import threading
-
-from devil.android import device_errors
-from devil.utils import cmd_helper
-
-
-class DeviceTempFile(object):
-
-  def __init__(self, adb, suffix='', prefix='temp_file', dir='/data/local/tmp'):
-    """Find an unused temporary file path on the device.
-
-    When this object is closed, the file will be deleted on the device.
-
-    Args:
-      adb: An instance of AdbWrapper
-      suffix: The suffix of the name of the temp file.
-      prefix: The prefix of the name of the temp file.
-      dir: The directory on the device where to place the temp file.
-    Raises:
-      ValueError if any of suffix, prefix, or dir are None.
-    """
-    if None in (dir, prefix, suffix):
-      m = 'Provided None path component. (dir: %s, prefix: %s, suffix: %s)' % (
-          dir, prefix, suffix)
-      raise ValueError(m)
-
-    self._adb = adb
-    # Python's random module use 52-bit numbers according to its docs.
-    random_hex = hex(random.randint(0, 2 ** 52))[2:]
-    self.name = posixpath.join(dir, '%s-%s%s' % (prefix, random_hex, suffix))
-    self.name_quoted = cmd_helper.SingleQuote(self.name)
-
-  def close(self):
-    """Deletes the temporary file from the device."""
-    # ignore exception if the file is already gone.
-    def delete_temporary_file():
-      try:
-        self._adb.Shell('rm -f %s' % self.name_quoted, expect_status=None)
-      except device_errors.AdbCommandFailedError:
-        # file does not exist on Android version without 'rm -f' support (ICS)
-        pass
-
-    # It shouldn't matter when the temp file gets deleted, so do so
-    # asynchronously.
-    threading.Thread(
-        target=delete_temporary_file,
-        name='delete_temporary_file(%s)' % self._adb.GetDeviceSerial()).start()
-
-  def __enter__(self):
-    return self
-
-  def __exit__(self, type, value, traceback):
-    self.close()
diff --git a/third_party/catapult/devil/devil/android/device_test_case.py b/third_party/catapult/devil/devil/android/device_test_case.py
deleted file mode 100644
index b995fa6..0000000
--- a/third_party/catapult/devil/devil/android/device_test_case.py
+++ /dev/null
@@ -1,54 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import threading
-import unittest
-
-from devil.android import device_errors
-from devil.android import device_utils
-
-_devices_lock = threading.Lock()
-_devices_condition = threading.Condition(_devices_lock)
-_devices = set()
-
-
-def PrepareDevices(*_args):
-
-  raw_devices = device_utils.DeviceUtils.HealthyDevices()
-  live_devices = []
-  for d in raw_devices:
-    try:
-      d.WaitUntilFullyBooted(timeout=5, retries=0)
-      live_devices.append(str(d))
-    except (device_errors.CommandFailedError,
-            device_errors.CommandTimeoutError):
-      pass
-  with _devices_lock:
-    _devices.update(set(live_devices))
-
-  if not _devices:
-    raise Exception('No live devices attached.')
-
-
-class DeviceTestCase(unittest.TestCase):
-
-  def __init__(self, *args, **kwargs):
-    super(DeviceTestCase, self).__init__(*args, **kwargs)
-    self.serial = None
-
-  #override
-  def setUp(self):
-    super(DeviceTestCase, self).setUp()
-    with _devices_lock:
-      while not _devices:
-        _devices_condition.wait(5)
-      self.serial = _devices.pop()
-
-  #override
-  def tearDown(self):
-    super(DeviceTestCase, self).tearDown()
-    with _devices_lock:
-      _devices.add(self.serial)
-      _devices_condition.notify()
-
diff --git a/third_party/catapult/devil/devil/android/device_utils.py b/third_party/catapult/devil/devil/android/device_utils.py
deleted file mode 100644
index 50f362c..0000000
--- a/third_party/catapult/devil/devil/android/device_utils.py
+++ /dev/null
@@ -1,2640 +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.
-
-"""Provides a variety of device interactions based on adb.
-
-Eventually, this will be based on adb_wrapper.
-"""
-# pylint: disable=unused-argument
-
-import calendar
-import collections
-import itertools
-import json
-import logging
-import multiprocessing
-import os
-import posixpath
-import pprint
-import re
-import shutil
-import stat
-import tempfile
-import time
-import threading
-import uuid
-import zipfile
-
-from devil import base_error
-from devil import devil_env
-from devil.utils import cmd_helper
-from devil.android import apk_helper
-from devil.android import device_signal
-from devil.android import decorators
-from devil.android import device_errors
-from devil.android import device_temp_file
-from devil.android import install_commands
-from devil.android import logcat_monitor
-from devil.android import md5sum
-from devil.android.constants import chrome
-from devil.android.sdk import adb_wrapper
-from devil.android.sdk import intent
-from devil.android.sdk import keyevent
-from devil.android.sdk import split_select
-from devil.android.sdk import version_codes
-from devil.utils import host_utils
-from devil.utils import parallelizer
-from devil.utils import reraiser_thread
-from devil.utils import timeout_retry
-from devil.utils import zip_utils
-
-logger = logging.getLogger(__name__)
-
-_DEFAULT_TIMEOUT = 30
-_DEFAULT_RETRIES = 3
-
-# A sentinel object for default values
-# TODO(jbudorick,perezju): revisit how default values are handled by
-# the timeout_retry decorators.
-DEFAULT = object()
-
-_RESTART_ADBD_SCRIPT = """
-  trap '' HUP
-  trap '' TERM
-  trap '' PIPE
-  function restart() {
-    stop adbd
-    start adbd
-  }
-  restart &
-"""
-
-# Not all permissions can be set.
-_PERMISSIONS_BLACKLIST = [
-    'android.permission.ACCESS_LOCATION_EXTRA_COMMANDS',
-    'android.permission.ACCESS_MOCK_LOCATION',
-    'android.permission.ACCESS_NETWORK_STATE',
-    'android.permission.ACCESS_NOTIFICATION_POLICY',
-    'android.permission.ACCESS_WIFI_STATE',
-    'android.permission.AUTHENTICATE_ACCOUNTS',
-    'android.permission.BLUETOOTH',
-    'android.permission.BLUETOOTH_ADMIN',
-    'android.permission.BROADCAST_STICKY',
-    'android.permission.CHANGE_NETWORK_STATE',
-    'android.permission.CHANGE_WIFI_MULTICAST_STATE',
-    'android.permission.CHANGE_WIFI_STATE',
-    'android.permission.DISABLE_KEYGUARD',
-    'android.permission.DOWNLOAD_WITHOUT_NOTIFICATION',
-    'android.permission.EXPAND_STATUS_BAR',
-    'android.permission.GET_PACKAGE_SIZE',
-    'android.permission.INSTALL_SHORTCUT',
-    'android.permission.INTERNET',
-    'android.permission.KILL_BACKGROUND_PROCESSES',
-    'android.permission.MANAGE_ACCOUNTS',
-    'android.permission.MODIFY_AUDIO_SETTINGS',
-    'android.permission.NFC',
-    'android.permission.READ_SYNC_SETTINGS',
-    'android.permission.READ_SYNC_STATS',
-    'android.permission.RECEIVE_BOOT_COMPLETED',
-    'android.permission.RECORD_VIDEO',
-    'android.permission.REORDER_TASKS',
-    'android.permission.REQUEST_INSTALL_PACKAGES',
-    'android.permission.RUN_INSTRUMENTATION',
-    'android.permission.SET_ALARM',
-    'android.permission.SET_TIME_ZONE',
-    'android.permission.SET_WALLPAPER',
-    'android.permission.SET_WALLPAPER_HINTS',
-    'android.permission.TRANSMIT_IR',
-    'android.permission.USE_CREDENTIALS',
-    'android.permission.USE_FINGERPRINT',
-    'android.permission.VIBRATE',
-    'android.permission.WAKE_LOCK',
-    'android.permission.WRITE_SYNC_SETTINGS',
-    'com.android.browser.permission.READ_HISTORY_BOOKMARKS',
-    'com.android.browser.permission.WRITE_HISTORY_BOOKMARKS',
-    'com.android.launcher.permission.INSTALL_SHORTCUT',
-    'com.chrome.permission.DEVICE_EXTRAS',
-    'com.google.android.apps.now.CURRENT_ACCOUNT_ACCESS',
-    'com.google.android.c2dm.permission.RECEIVE',
-    'com.google.android.providers.gsf.permission.READ_GSERVICES',
-    'com.sec.enterprise.knox.MDM_CONTENT_PROVIDER',
-]
-for package_info in chrome.PACKAGE_INFO.itervalues():
-  _PERMISSIONS_BLACKLIST.extend([
-      '%s.permission.C2D_MESSAGE' % package_info.package,
-      '%s.permission.READ_WRITE_BOOKMARK_FOLDERS' % package_info.package,
-      '%s.TOS_ACKED' % package_info.package])
-
-_CURRENT_FOCUS_CRASH_RE = re.compile(
-    r'\s*mCurrentFocus.*Application (Error|Not Responding): (\S+)}')
-
-_GETPROP_RE = re.compile(r'\[(.*?)\]: \[(.*?)\]')
-
-# Regex to parse the long (-l) output of 'ls' command, c.f.
-# https://github.com/landley/toybox/blob/master/toys/posix/ls.c#L446
-_LONG_LS_OUTPUT_RE = re.compile(
-    r'(?P<st_mode>[\w-]{10})\s+'                  # File permissions
-    r'(?:(?P<st_nlink>\d+)\s+)?'                  # Number of links (optional)
-    r'(?P<st_owner>\w+)\s+'                       # Name of owner
-    r'(?P<st_group>\w+)\s+'                       # Group of owner
-    r'(?:'                                        # Either ...
-      r'(?P<st_rdev_major>\d+),\s+'                 # Device major, and
-      r'(?P<st_rdev_minor>\d+)\s+'                  # Device minor
-    r'|'                                          # .. or
-      r'(?P<st_size>\d+)\s+'                        # Size in bytes
-    r')?'                                         # .. or nothing
-    r'(?P<st_mtime>\d{4}-\d\d-\d\d \d\d:\d\d)\s+' # Modification date/time
-    r'(?P<filename>.+?)'                          # File name
-    r'(?: -> (?P<symbolic_link_to>.+))?'          # Symbolic link (optional)
-    r'$'                                          # End of string
-)
-_LS_DATE_FORMAT = '%Y-%m-%d %H:%M'
-_FILE_MODE_RE = re.compile(r'[dbclps-](?:[r-][w-][xSs-]){2}[r-][w-][xTt-]$')
-_FILE_MODE_KIND = {
-    'd': stat.S_IFDIR, 'b': stat.S_IFBLK, 'c': stat.S_IFCHR,
-    'l': stat.S_IFLNK, 'p': stat.S_IFIFO, 's': stat.S_IFSOCK,
-    '-': stat.S_IFREG}
-_FILE_MODE_PERMS = [
-    stat.S_IRUSR, stat.S_IWUSR, stat.S_IXUSR,
-    stat.S_IRGRP, stat.S_IWGRP, stat.S_IXGRP,
-    stat.S_IROTH, stat.S_IWOTH, stat.S_IXOTH,
-]
-_FILE_MODE_SPECIAL = [
-    ('s', stat.S_ISUID),
-    ('s', stat.S_ISGID),
-    ('t', stat.S_ISVTX),
-]
-_SELINUX_MODE = {
-    'enforcing': True,
-    'permissive': False,
-    'disabled': None
-}
-# Some devices require different logic for checking if root is necessary
-_SPECIAL_ROOT_DEVICE_LIST = [
-    'marlin',
-    'sailfish',
-]
-
-
-@decorators.WithExplicitTimeoutAndRetries(
-    _DEFAULT_TIMEOUT, _DEFAULT_RETRIES)
-def GetAVDs():
-  """Returns a list of Android Virtual Devices.
-
-  Returns:
-    A list containing the configured AVDs.
-  """
-  lines = cmd_helper.GetCmdOutput([
-      os.path.join(devil_env.config.LocalPath('android_sdk'),
-                   'tools', 'android'),
-      'list', 'avd']).splitlines()
-  avds = []
-  for line in lines:
-    if 'Name:' not in line:
-      continue
-    key, value = (s.strip() for s in line.split(':', 1))
-    if key == 'Name':
-      avds.append(value)
-  return avds
-
-
-@decorators.WithExplicitTimeoutAndRetries(
-    _DEFAULT_TIMEOUT, _DEFAULT_RETRIES)
-def RestartServer():
-  """Restarts the adb server.
-
-  Raises:
-    CommandFailedError if we fail to kill or restart the server.
-  """
-  def adb_killed():
-    return not adb_wrapper.AdbWrapper.IsServerOnline()
-
-  def adb_started():
-    return adb_wrapper.AdbWrapper.IsServerOnline()
-
-  adb_wrapper.AdbWrapper.KillServer()
-  if not timeout_retry.WaitFor(adb_killed, wait_period=1, max_tries=5):
-    # TODO(perezju): raise an exception after fixng http://crbug.com/442319
-    logger.warning('Failed to kill adb server')
-  adb_wrapper.AdbWrapper.StartServer()
-  if not timeout_retry.WaitFor(adb_started, wait_period=1, max_tries=5):
-    raise device_errors.CommandFailedError('Failed to start adb server')
-
-
-def _ParseModeString(mode_str):
-  """Parse a mode string, e.g. 'drwxrwxrwx', into a st_mode value.
-
-  Effectively the reverse of |mode_to_string| in, e.g.:
-  https://github.com/landley/toybox/blob/master/lib/lib.c#L896
-  """
-  if not _FILE_MODE_RE.match(mode_str):
-    raise ValueError('Unexpected file mode %r', mode_str)
-  mode = _FILE_MODE_KIND[mode_str[0]]
-  for c, flag in zip(mode_str[1:], _FILE_MODE_PERMS):
-    if c != '-' and c.islower():
-      mode |= flag
-  for c, (t, flag) in zip(mode_str[3::3], _FILE_MODE_SPECIAL):
-    if c.lower() == t:
-      mode |= flag
-  return mode
-
-
-def _GetTimeStamp():
-  """Return a basic ISO 8601 time stamp with the current local time."""
-  return time.strftime('%Y%m%dT%H%M%S', time.localtime())
-
-
-def _JoinLines(lines):
-  # makes sure that the last line is also terminated, and is more memory
-  # efficient than first appending an end-line to each line and then joining
-  # all of them together.
-  return ''.join(s for line in lines for s in (line, '\n'))
-
-
-def _CreateAdbWrapper(device):
-  if isinstance(device, adb_wrapper.AdbWrapper):
-    return device
-  else:
-    return adb_wrapper.AdbWrapper(device)
-
-
-def _FormatPartialOutputError(output):
-  lines = output.splitlines() if isinstance(output, basestring) else output
-  message = ['Partial output found:']
-  if len(lines) > 11:
-    message.extend('- %s' % line for line in lines[:5])
-    message.extend('<snip>')
-    message.extend('- %s' % line for line in lines[-5:])
-  else:
-    message.extend('- %s' % line for line in lines)
-  return '\n'.join(message)
-
-
-class DeviceUtils(object):
-
-  _MAX_ADB_COMMAND_LENGTH = 512
-  _MAX_ADB_OUTPUT_LENGTH = 32768
-  _LAUNCHER_FOCUSED_RE = re.compile(
-      r'\s*mCurrentFocus.*(Launcher|launcher).*')
-  _VALID_SHELL_VARIABLE = re.compile('^[a-zA-Z_][a-zA-Z0-9_]*$')
-
-  LOCAL_PROPERTIES_PATH = posixpath.join('/', 'data', 'local.prop')
-
-  # Property in /data/local.prop that controls Java assertions.
-  JAVA_ASSERT_PROPERTY = 'dalvik.vm.enableassertions'
-
-  def __init__(self, device, enable_device_files_cache=False,
-               default_timeout=_DEFAULT_TIMEOUT,
-               default_retries=_DEFAULT_RETRIES):
-    """DeviceUtils constructor.
-
-    Args:
-      device: Either a device serial, an existing AdbWrapper instance, or an
-        an existing AndroidCommands instance.
-      enable_device_files_cache: For PushChangedFiles(), cache checksums of
-        pushed files rather than recomputing them on a subsequent call.
-      default_timeout: An integer containing the default number of seconds to
-        wait for an operation to complete if no explicit value is provided.
-      default_retries: An integer containing the default number or times an
-        operation should be retried on failure if no explicit value is provided.
-    """
-    self.adb = None
-    if isinstance(device, basestring):
-      self.adb = _CreateAdbWrapper(device)
-    elif isinstance(device, adb_wrapper.AdbWrapper):
-      self.adb = device
-    else:
-      raise ValueError('Unsupported device value: %r' % device)
-    self._commands_installed = None
-    self._default_timeout = default_timeout
-    self._default_retries = default_retries
-    self._enable_device_files_cache = enable_device_files_cache
-    self._cache = {}
-    self._client_caches = {}
-    self._cache_lock = threading.RLock()
-    assert hasattr(self, decorators.DEFAULT_TIMEOUT_ATTR)
-    assert hasattr(self, decorators.DEFAULT_RETRIES_ATTR)
-
-    self._ClearCache()
-
-  @property
-  def serial(self):
-    """Returns the device serial."""
-    return self.adb.GetDeviceSerial()
-
-  def __eq__(self, other):
-    """Checks whether |other| refers to the same device as |self|.
-
-    Args:
-      other: The object to compare to. This can be a basestring, an instance
-        of adb_wrapper.AdbWrapper, or an instance of DeviceUtils.
-    Returns:
-      Whether |other| refers to the same device as |self|.
-    """
-    return self.serial == str(other)
-
-  def __lt__(self, other):
-    """Compares two instances of DeviceUtils.
-
-    This merely compares their serial numbers.
-
-    Args:
-      other: The instance of DeviceUtils to compare to.
-    Returns:
-      Whether |self| is less than |other|.
-    """
-    return self.serial < other.serial
-
-  def __str__(self):
-    """Returns the device serial."""
-    return self.serial
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def IsOnline(self, timeout=None, retries=None):
-    """Checks whether the device is online.
-
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      True if the device is online, False otherwise.
-
-    Raises:
-      CommandTimeoutError on timeout.
-    """
-    try:
-      return self.adb.GetState() == 'device'
-    except base_error.BaseError as exc:
-      logger.info('Failed to get state: %s', exc)
-      return False
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def HasRoot(self, timeout=None, retries=None):
-    """Checks whether or not adbd has root privileges.
-
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      True if adbd has root privileges, False otherwise.
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    try:
-      if self.product_name in _SPECIAL_ROOT_DEVICE_LIST:
-        return self.GetProp('service.adb.root') == '1'
-      self.RunShellCommand(['ls', '/root'], check_return=True)
-      return True
-    except device_errors.AdbCommandFailedError:
-      return False
-
-  def NeedsSU(self, timeout=DEFAULT, retries=DEFAULT):
-    """Checks whether 'su' is needed to access protected resources.
-
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      True if 'su' is available on the device and is needed to to access
-        protected resources; False otherwise if either 'su' is not available
-        (e.g. because the device has a user build), or not needed (because adbd
-        already has root privileges).
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    if 'needs_su' not in self._cache:
-      cmd = '%s && ! ls /root' % self._Su('ls /root')
-      if self.product_name in _SPECIAL_ROOT_DEVICE_LIST:
-        if self.HasRoot():
-          self._cache['needs_su'] = False
-          return False
-        cmd = 'which which && which su'
-      try:
-        self.RunShellCommand(cmd, shell=True, check_return=True,
-            timeout=self._default_timeout if timeout is DEFAULT else timeout,
-            retries=self._default_retries if retries is DEFAULT else retries)
-        self._cache['needs_su'] = True
-      except device_errors.AdbCommandFailedError:
-        self._cache['needs_su'] = False
-    return self._cache['needs_su']
-
-
-  def _Su(self, command):
-    if self.build_version_sdk >= version_codes.MARSHMALLOW:
-      return 'su 0 %s' % command
-    return 'su -c %s' % command
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def EnableRoot(self, timeout=None, retries=None):
-    """Restarts adbd with root privileges.
-
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandFailedError if root could not be enabled.
-      CommandTimeoutError on timeout.
-    """
-    if self.IsUserBuild():
-      raise device_errors.CommandFailedError(
-          'Cannot enable root in user builds.', str(self))
-    if 'needs_su' in self._cache:
-      del self._cache['needs_su']
-    self.adb.Root()
-    self.WaitUntilFullyBooted()
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def IsUserBuild(self, timeout=None, retries=None):
-    """Checks whether or not the device is running a user build.
-
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      True if the device is running a user build, False otherwise (i.e. if
-        it's running a userdebug build).
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    return self.build_type == 'user'
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def GetExternalStoragePath(self, timeout=None, retries=None):
-    """Get the device's path to its SD card.
-
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      The device's path to its SD card.
-
-    Raises:
-      CommandFailedError if the external storage path could not be determined.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    self._EnsureCacheInitialized()
-    if not self._cache['external_storage']:
-      raise device_errors.CommandFailedError('$EXTERNAL_STORAGE is not set',
-                                             str(self))
-    return self._cache['external_storage']
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def GetApplicationPaths(self, package, timeout=None, retries=None):
-    """Get the paths of the installed apks on the device for the given package.
-
-    Args:
-      package: Name of the package.
-
-    Returns:
-      List of paths to the apks on the device for the given package.
-    """
-    return self._GetApplicationPathsInternal(package)
-
-  def _GetApplicationPathsInternal(self, package, skip_cache=False):
-    cached_result = self._cache['package_apk_paths'].get(package)
-    if cached_result is not None and not skip_cache:
-      if package in self._cache['package_apk_paths_to_verify']:
-        self._cache['package_apk_paths_to_verify'].remove(package)
-        # Don't verify an app that is not thought to be installed. We are
-        # concerned only with apps we think are installed having been
-        # uninstalled manually.
-        if cached_result and not self.PathExists(cached_result):
-          cached_result = None
-          self._cache['package_apk_checksums'].pop(package, 0)
-      if cached_result is not None:
-        return list(cached_result)
-    # 'pm path' is liable to incorrectly exit with a nonzero number starting
-    # in Lollipop.
-    # TODO(jbudorick): Check if this is fixed as new Android versions are
-    # released to put an upper bound on this.
-    should_check_return = (self.build_version_sdk < version_codes.LOLLIPOP)
-    output = self.RunShellCommand(
-        ['pm', 'path', package], check_return=should_check_return)
-    apks = []
-    for line in output:
-      if not line.startswith('package:'):
-        continue
-      apks.append(line[len('package:'):])
-    if not apks and output:
-      raise device_errors.CommandFailedError(
-          'pm path returned: %r' % '\n'.join(output), str(self))
-    self._cache['package_apk_paths'][package] = list(apks)
-    return apks
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def GetApplicationVersion(self, package, timeout=None, retries=None):
-    """Get the version name of a package installed on the device.
-
-    Args:
-      package: Name of the package.
-
-    Returns:
-      A string with the version name or None if the package is not found
-      on the device.
-    """
-    output = self.RunShellCommand(
-        ['dumpsys', 'package', package], check_return=True)
-    if not output:
-      return None
-    for line in output:
-      line = line.strip()
-      if line.startswith('versionName='):
-        return line[len('versionName='):]
-    raise device_errors.CommandFailedError(
-        'Version name for %s not found on dumpsys output' % package, str(self))
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def GetApplicationDataDirectory(self, package, timeout=None, retries=None):
-    """Get the data directory on the device for the given package.
-
-    Args:
-      package: Name of the package.
-
-    Returns:
-      The package's data directory.
-    Raises:
-      CommandFailedError if the package's data directory can't be found,
-        whether because it's not installed or otherwise.
-    """
-    output = self._RunPipedShellCommand(
-        'pm dump %s | grep dataDir=' % cmd_helper.SingleQuote(package))
-    for line in output:
-      _, _, dataDir = line.partition('dataDir=')
-      if dataDir:
-        return dataDir
-    raise device_errors.CommandFailedError(
-        'Could not find data directory for %s', package)
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def WaitUntilFullyBooted(self, wifi=False, timeout=None, retries=None):
-    """Wait for the device to fully boot.
-
-    This means waiting for the device to boot, the package manager to be
-    available, and the SD card to be ready. It can optionally mean waiting
-    for wifi to come up, too.
-
-    Args:
-      wifi: A boolean indicating if we should wait for wifi to come up or not.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandFailedError on failure.
-      CommandTimeoutError if one of the component waits times out.
-      DeviceUnreachableError if the device becomes unresponsive.
-    """
-    def sd_card_ready():
-      try:
-        self.RunShellCommand(['test', '-d', self.GetExternalStoragePath()],
-                             check_return=True)
-        return True
-      except device_errors.AdbCommandFailedError:
-        return False
-
-    def pm_ready():
-      try:
-        return self._GetApplicationPathsInternal('android', skip_cache=True)
-      except device_errors.CommandFailedError:
-        return False
-
-    def boot_completed():
-      try:
-        return self.GetProp('sys.boot_completed', cache=False) == '1'
-      except device_errors.CommandFailedError:
-        return False
-
-    def wifi_enabled():
-      return 'Wi-Fi is enabled' in self.RunShellCommand(['dumpsys', 'wifi'],
-                                                        check_return=False)
-
-    self.adb.WaitForDevice()
-    timeout_retry.WaitFor(sd_card_ready)
-    timeout_retry.WaitFor(pm_ready)
-    timeout_retry.WaitFor(boot_completed)
-    if wifi:
-      timeout_retry.WaitFor(wifi_enabled)
-
-  REBOOT_DEFAULT_TIMEOUT = 10 * _DEFAULT_TIMEOUT
-
-  @decorators.WithTimeoutAndRetriesFromInstance(
-      min_default_timeout=REBOOT_DEFAULT_TIMEOUT)
-  def Reboot(self, block=True, wifi=False, timeout=None, retries=None):
-    """Reboot the device.
-
-    Args:
-      block: A boolean indicating if we should wait for the reboot to complete.
-      wifi: A boolean indicating if we should wait for wifi to be enabled after
-        the reboot. The option has no effect unless |block| is also True.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    def device_offline():
-      return not self.IsOnline()
-
-    self.adb.Reboot()
-    self._ClearCache()
-    timeout_retry.WaitFor(device_offline, wait_period=1)
-    if block:
-      self.WaitUntilFullyBooted(wifi=wifi)
-
-  INSTALL_DEFAULT_TIMEOUT = 4 * _DEFAULT_TIMEOUT
-
-  @decorators.WithTimeoutAndRetriesFromInstance(
-      min_default_timeout=INSTALL_DEFAULT_TIMEOUT)
-  def Install(self, apk, allow_downgrade=False, reinstall=False,
-              permissions=None, timeout=None, retries=None):
-    """Install an APK.
-
-    Noop if an identical APK is already installed.
-
-    Args:
-      apk: An ApkHelper instance or string containing the path to the APK.
-      allow_downgrade: A boolean indicating if we should allow downgrades.
-      reinstall: A boolean indicating if we should keep any existing app data.
-      permissions: Set of permissions to set. If not set, finds permissions with
-          apk helper. To set no permissions, pass [].
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandFailedError if the installation fails.
-      CommandTimeoutError if the installation times out.
-      DeviceUnreachableError on missing device.
-    """
-    self._InstallInternal(apk, None, allow_downgrade=allow_downgrade,
-                          reinstall=reinstall, permissions=permissions)
-
-  @decorators.WithTimeoutAndRetriesFromInstance(
-      min_default_timeout=INSTALL_DEFAULT_TIMEOUT)
-  def InstallSplitApk(self, base_apk, split_apks, allow_downgrade=False,
-                      reinstall=False, allow_cached_props=False,
-                      permissions=None, timeout=None, retries=None):
-    """Install a split APK.
-
-    Noop if all of the APK splits are already installed.
-
-    Args:
-      base_apk: An ApkHelper instance or string containing the path to the base
-          APK.
-      split_apks: A list of strings of paths of all of the APK splits.
-      allow_downgrade: A boolean indicating if we should allow downgrades.
-      reinstall: A boolean indicating if we should keep any existing app data.
-      allow_cached_props: Whether to use cached values for device properties.
-      permissions: Set of permissions to set. If not set, finds permissions with
-          apk helper. To set no permissions, pass [].
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandFailedError if the installation fails.
-      CommandTimeoutError if the installation times out.
-      DeviceUnreachableError on missing device.
-      DeviceVersionError if device SDK is less than Android L.
-    """
-    self._InstallInternal(base_apk, split_apks, reinstall=reinstall,
-                          allow_cached_props=allow_cached_props,
-                          permissions=permissions,
-                          allow_downgrade=allow_downgrade)
-
-  def _InstallInternal(self, base_apk, split_apks, allow_downgrade=False,
-                       reinstall=False, allow_cached_props=False,
-                       permissions=None):
-    if split_apks:
-      self._CheckSdkLevel(version_codes.LOLLIPOP)
-
-    base_apk = apk_helper.ToHelper(base_apk)
-
-    all_apks = [base_apk.path]
-    if split_apks:
-      all_apks += split_select.SelectSplits(
-        self, base_apk.path, split_apks, allow_cached_props=allow_cached_props)
-      if len(all_apks) == 1:
-        logger.warning('split-select did not select any from %s', split_apks)
-
-    missing_apks = [apk for apk in all_apks if not os.path.exists(apk)]
-    if missing_apks:
-      raise device_errors.CommandFailedError(
-          'Attempted to install non-existent apks: %s'
-              % pprint.pformat(missing_apks))
-
-    package_name = base_apk.GetPackageName()
-    device_apk_paths = self._GetApplicationPathsInternal(package_name)
-
-    apks_to_install = None
-    host_checksums = None
-    if not device_apk_paths:
-      apks_to_install = all_apks
-    elif len(device_apk_paths) > 1 and not split_apks:
-      logger.warning(
-          'Installing non-split APK when split APK was previously installed')
-      apks_to_install = all_apks
-    elif len(device_apk_paths) == 1 and split_apks:
-      logger.warning(
-          'Installing split APK when non-split APK was previously installed')
-      apks_to_install = all_apks
-    else:
-      try:
-        apks_to_install, host_checksums = (
-            self._ComputeStaleApks(package_name, all_apks))
-      except EnvironmentError as e:
-        logger.warning('Error calculating md5: %s', e)
-        apks_to_install, host_checksums = all_apks, None
-      if apks_to_install and not reinstall:
-        self.Uninstall(package_name)
-        apks_to_install = all_apks
-
-    if apks_to_install:
-      # Assume that we won't know the resulting device state.
-      self._cache['package_apk_paths'].pop(package_name, 0)
-      self._cache['package_apk_checksums'].pop(package_name, 0)
-      if split_apks:
-        partial = package_name if len(apks_to_install) < len(all_apks) else None
-        self.adb.InstallMultiple(
-            apks_to_install, partial=partial, reinstall=reinstall,
-            allow_downgrade=allow_downgrade)
-      else:
-        self.adb.Install(
-            base_apk.path, reinstall=reinstall, allow_downgrade=allow_downgrade)
-      if (permissions is None
-          and self.build_version_sdk >= version_codes.MARSHMALLOW):
-        permissions = base_apk.GetPermissions()
-      self.GrantPermissions(package_name, permissions)
-      # Upon success, we know the device checksums, but not their paths.
-      if host_checksums is not None:
-        self._cache['package_apk_checksums'][package_name] = host_checksums
-    else:
-      # Running adb install terminates running instances of the app, so to be
-      # consistent, we explicitly terminate it when skipping the install.
-      self.ForceStop(package_name)
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def Uninstall(self, package_name, keep_data=False, timeout=None,
-                retries=None):
-    """Remove the app |package_name| from the device.
-
-    This is a no-op if the app is not already installed.
-
-    Args:
-      package_name: The package to uninstall.
-      keep_data: (optional) Whether to keep the data and cache directories.
-      timeout: Timeout in seconds.
-      retries: Number of retries.
-
-    Raises:
-      CommandFailedError if the uninstallation fails.
-      CommandTimeoutError if the uninstallation times out.
-      DeviceUnreachableError on missing device.
-    """
-    installed = self._GetApplicationPathsInternal(package_name)
-    if not installed:
-      return
-    try:
-      self.adb.Uninstall(package_name, keep_data)
-      self._cache['package_apk_paths'][package_name] = []
-      self._cache['package_apk_checksums'][package_name] = set()
-    except:
-      # Clear cache since we can't be sure of the state.
-      self._cache['package_apk_paths'].pop(package_name, 0)
-      self._cache['package_apk_checksums'].pop(package_name, 0)
-      raise
-
-  def _CheckSdkLevel(self, required_sdk_level):
-    """Raises an exception if the device does not have the required SDK level.
-    """
-    if self.build_version_sdk < required_sdk_level:
-      raise device_errors.DeviceVersionError(
-          ('Requires SDK level %s, device is SDK level %s' %
-           (required_sdk_level, self.build_version_sdk)),
-           device_serial=self.serial)
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def RunShellCommand(self, cmd, shell=False, check_return=False, cwd=None,
-                      env=None, run_as=None, as_root=False, single_line=False,
-                      large_output=False, raw_output=False, timeout=None,
-                      retries=None):
-    """Run an ADB shell command.
-
-    The command to run |cmd| should be a sequence of program arguments
-    (preferred) or a single string with a shell script to run.
-
-    When |cmd| is a sequence, it is assumed to contain the name of the command
-    to run followed by its arguments. In this case, arguments are passed to the
-    command exactly as given, preventing any further processing by the shell.
-    This allows callers to easily pass arguments with spaces or special
-    characters without having to worry about quoting rules. Whenever possible,
-    it is recomended to pass |cmd| as a sequence.
-
-    When |cmd| is passed as a single string, |shell| should be set to True.
-    The command will be interpreted and run by the shell on the device,
-    allowing the use of shell features such as pipes, wildcards, or variables.
-    Failing to set shell=True will issue a warning, but this will be changed
-    to a hard failure in the future (see: catapult:#3242).
-
-    This behaviour is consistent with that of command runners in cmd_helper as
-    well as Python's own subprocess.Popen.
-
-    TODO(perezju) Change the default of |check_return| to True when callers
-      have switched to the new behaviour.
-
-    Args:
-      cmd: A sequence containing the command to run and its arguments, or a
-        string with a shell script to run (should also set shell=True).
-      shell: A boolean indicating whether shell features may be used in |cmd|.
-      check_return: A boolean indicating whether or not the return code should
-        be checked.
-      cwd: The device directory in which the command should be run.
-      env: The environment variables with which the command should be run.
-      run_as: A string containing the package as which the command should be
-        run.
-      as_root: A boolean indicating whether the shell command should be run
-        with root privileges.
-      single_line: A boolean indicating if only a single line of output is
-        expected.
-      large_output: Uses a work-around for large shell command output. Without
-        this large output will be truncated.
-      raw_output: Whether to only return the raw output
-          (no splitting into lines).
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      If single_line is False, the output of the command as a list of lines,
-      otherwise, a string with the unique line of output emmited by the command
-      (with the optional newline at the end stripped).
-
-    Raises:
-      AdbCommandFailedError if check_return is True and the exit code of
-        the command run on the device is non-zero.
-      CommandFailedError if single_line is True but the output contains two or
-        more lines.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    def env_quote(key, value):
-      if not DeviceUtils._VALID_SHELL_VARIABLE.match(key):
-        raise KeyError('Invalid shell variable name %r' % key)
-      # using double quotes here to allow interpolation of shell variables
-      return '%s=%s' % (key, cmd_helper.DoubleQuote(value))
-
-    def run(cmd):
-      return self.adb.Shell(cmd)
-
-    def handle_check_return(cmd):
-      try:
-        return run(cmd)
-      except device_errors.AdbCommandFailedError as exc:
-        if check_return:
-          raise
-        else:
-          return exc.output
-
-    def handle_large_command(cmd):
-      if len(cmd) < self._MAX_ADB_COMMAND_LENGTH:
-        return handle_check_return(cmd)
-      else:
-        with device_temp_file.DeviceTempFile(self.adb, suffix='.sh') as script:
-          self._WriteFileWithPush(script.name, cmd)
-          logger.info('Large shell command will be run from file: %s ...',
-                      cmd[:self._MAX_ADB_COMMAND_LENGTH])
-          return handle_check_return('sh %s' % script.name_quoted)
-
-    def handle_large_output(cmd, large_output_mode):
-      if large_output_mode:
-        with device_temp_file.DeviceTempFile(self.adb) as large_output_file:
-          cmd = '( %s )>%s' % (cmd, large_output_file.name)
-          logger.debug('Large output mode enabled. Will write output to '
-                       'device and read results from file.')
-          handle_large_command(cmd)
-          return self.ReadFile(large_output_file.name, force_pull=True)
-      else:
-        try:
-          return handle_large_command(cmd)
-        except device_errors.AdbCommandFailedError as exc:
-          if exc.status is None:
-            logger.error(_FormatPartialOutputError(exc.output))
-            logger.warning('Attempting to run in large_output mode.')
-            logger.warning('Use RunShellCommand(..., large_output=True) for '
-                           'shell commands that expect a lot of output.')
-            return handle_large_output(cmd, True)
-          else:
-            raise
-
-    if isinstance(cmd, basestring):
-      if not shell:
-        logging.warning(
-            'The command to run should preferably be passed as a sequence of'
-            ' args. If shell features are needed (pipes, wildcards, variables)'
-            ' clients should explicitly set shell=True.')
-    else:
-      cmd = ' '.join(cmd_helper.SingleQuote(s) for s in cmd)
-    if env:
-      env = ' '.join(env_quote(k, v) for k, v in env.iteritems())
-      cmd = '%s %s' % (env, cmd)
-    if cwd:
-      cmd = 'cd %s && %s' % (cmd_helper.SingleQuote(cwd), cmd)
-    if run_as:
-      cmd = 'run-as %s sh -c %s' % (cmd_helper.SingleQuote(run_as),
-                                    cmd_helper.SingleQuote(cmd))
-    if as_root and self.NeedsSU():
-      # "su -c sh -c" allows using shell features in |cmd|
-      cmd = self._Su('sh -c %s' % cmd_helper.SingleQuote(cmd))
-
-    output = handle_large_output(cmd, large_output)
-
-    if raw_output:
-      return output
-
-    output = output.splitlines()
-    if single_line:
-      if not output:
-        return ''
-      elif len(output) == 1:
-        return output[0]
-      else:
-        msg = 'one line of output was expected, but got: %s'
-        raise device_errors.CommandFailedError(msg % output, str(self))
-    else:
-      return output
-
-  def _RunPipedShellCommand(self, script, **kwargs):
-    PIPESTATUS_LEADER = 'PIPESTATUS: '
-
-    script += '; echo "%s${PIPESTATUS[@]}"' % PIPESTATUS_LEADER
-    kwargs.update(shell=True, check_return=True)
-    output = self.RunShellCommand(script, **kwargs)
-    pipestatus_line = output[-1]
-
-    if not pipestatus_line.startswith(PIPESTATUS_LEADER):
-      logger.error('Pipe exit statuses of shell script missing.')
-      raise device_errors.AdbShellCommandFailedError(
-          script, output, status=None,
-          device_serial=self.serial)
-
-    output = output[:-1]
-    statuses = [
-        int(s) for s in pipestatus_line[len(PIPESTATUS_LEADER):].split()]
-    if any(statuses):
-      raise device_errors.AdbShellCommandFailedError(
-          script, output, status=statuses,
-          device_serial=self.serial)
-    return output
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def KillAll(self, process_name, exact=False, signum=device_signal.SIGKILL,
-              as_root=False, blocking=False, quiet=False,
-              timeout=None, retries=None):
-    """Kill all processes with the given name on the device.
-
-    Args:
-      process_name: A string containing the name of the process to kill.
-      exact: A boolean indicating whether to kill all processes matching
-             the string |process_name| exactly, or all of those which contain
-             |process_name| as a substring. Defaults to False.
-      signum: An integer containing the signal number to send to kill. Defaults
-              to SIGKILL (9).
-      as_root: A boolean indicating whether the kill should be executed with
-               root privileges.
-      blocking: A boolean indicating whether we should wait until all processes
-                with the given |process_name| are dead.
-      quiet: A boolean indicating whether to ignore the fact that no processes
-             to kill were found.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      The number of processes attempted to kill.
-
-    Raises:
-      CommandFailedError if no process was killed and |quiet| is False.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    procs_pids = self.GetPids(process_name)
-    if exact:
-      procs_pids = {process_name: procs_pids.get(process_name, [])}
-    pids = set(itertools.chain(*procs_pids.values()))
-    if not pids:
-      if quiet:
-        return 0
-      else:
-        raise device_errors.CommandFailedError(
-            'No process "%s"' % process_name, str(self))
-
-    logger.info(
-        'KillAll(%r, ...) attempting to kill the following:', process_name)
-    for name, ids in procs_pids.iteritems():
-      for i in ids:
-        logger.info('  %05s %s', str(i), name)
-
-    cmd = ['kill', '-%d' % signum] + sorted(pids)
-    self.RunShellCommand(cmd, as_root=as_root, check_return=True)
-
-    def all_pids_killed():
-      procs_pids_remain = self.GetPids(process_name)
-      return not pids.intersection(itertools.chain(*procs_pids_remain.values()))
-
-    if blocking:
-      timeout_retry.WaitFor(all_pids_killed, wait_period=0.1)
-
-    return len(pids)
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def StartActivity(self, intent_obj, blocking=False, trace_file_name=None,
-                    force_stop=False, timeout=None, retries=None):
-    """Start package's activity on the device.
-
-    Args:
-      intent_obj: An Intent object to send.
-      blocking: A boolean indicating whether we should wait for the activity to
-                finish launching.
-      trace_file_name: If present, a string that both indicates that we want to
-                       profile the activity and contains the path to which the
-                       trace should be saved.
-      force_stop: A boolean indicating whether we should stop the activity
-                  before starting it.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandFailedError if the activity could not be started.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    cmd = ['am', 'start']
-    if blocking:
-      cmd.append('-W')
-    if trace_file_name:
-      cmd.extend(['--start-profiler', trace_file_name])
-    if force_stop:
-      cmd.append('-S')
-    cmd.extend(intent_obj.am_args)
-    for line in self.RunShellCommand(cmd, check_return=True):
-      if line.startswith('Error:'):
-        raise device_errors.CommandFailedError(line, str(self))
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def StartInstrumentation(self, component, finish=True, raw=False,
-                           extras=None, timeout=None, retries=None):
-    if extras is None:
-      extras = {}
-
-    cmd = ['am', 'instrument']
-    if finish:
-      cmd.append('-w')
-    if raw:
-      cmd.append('-r')
-    for k, v in extras.iteritems():
-      cmd.extend(['-e', str(k), str(v)])
-    cmd.append(component)
-
-    # Store the package name in a shell variable to help the command stay under
-    # the _MAX_ADB_COMMAND_LENGTH limit.
-    package = component.split('/')[0]
-    shell_snippet = 'p=%s;%s' % (package,
-                                 cmd_helper.ShrinkToSnippet(cmd, 'p', package))
-    return self.RunShellCommand(shell_snippet, shell=True, check_return=True,
-                                large_output=True)
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def BroadcastIntent(self, intent_obj, timeout=None, retries=None):
-    """Send a broadcast intent.
-
-    Args:
-      intent: An Intent to broadcast.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    cmd = ['am', 'broadcast'] + intent_obj.am_args
-    self.RunShellCommand(cmd, check_return=True)
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def GoHome(self, timeout=None, retries=None):
-    """Return to the home screen and obtain launcher focus.
-
-    This command launches the home screen and attempts to obtain
-    launcher focus until the timeout is reached.
-
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    def is_launcher_focused():
-      output = self.RunShellCommand(['dumpsys', 'window', 'windows'],
-                                    check_return=True, large_output=True)
-      return any(self._LAUNCHER_FOCUSED_RE.match(l) for l in output)
-
-    def dismiss_popups():
-      # There is a dialog present; attempt to get rid of it.
-      # Not all dialogs can be dismissed with back.
-      self.SendKeyEvent(keyevent.KEYCODE_ENTER)
-      self.SendKeyEvent(keyevent.KEYCODE_BACK)
-      return is_launcher_focused()
-
-    # If Home is already focused, return early to avoid unnecessary work.
-    if is_launcher_focused():
-      return
-
-    self.StartActivity(
-        intent.Intent(action='android.intent.action.MAIN',
-                      category='android.intent.category.HOME'),
-        blocking=True)
-
-    if not is_launcher_focused():
-      timeout_retry.WaitFor(dismiss_popups, wait_period=1)
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def ForceStop(self, package, timeout=None, retries=None):
-    """Close the application.
-
-    Args:
-      package: A string containing the name of the package to stop.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    cmd = 'p=%s;if [[ "$(ps)" = *$p* ]]; then am force-stop $p; fi'
-    self.RunShellCommand(cmd % package, shell=True, check_return=True)
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def ClearApplicationState(
-      self, package, permissions=None, timeout=None, retries=None):
-    """Clear all state for the given package.
-
-    Args:
-      package: A string containing the name of the package to stop.
-      permissions: List of permissions to set after clearing data.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    # Check that the package exists before clearing it for android builds below
-    # JB MR2. Necessary because calling pm clear on a package that doesn't exist
-    # may never return.
-    if ((self.build_version_sdk >= version_codes.JELLY_BEAN_MR2)
-        or self._GetApplicationPathsInternal(package)):
-      self.RunShellCommand(['pm', 'clear', package], check_return=True)
-      self.GrantPermissions(package, permissions)
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def SendKeyEvent(self, keycode, timeout=None, retries=None):
-    """Sends a keycode to the device.
-
-    See the devil.android.sdk.keyevent module for suitable keycode values.
-
-    Args:
-      keycode: A integer keycode to send to the device.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    self.RunShellCommand(['input', 'keyevent', format(keycode, 'd')],
-                         check_return=True)
-
-  PUSH_CHANGED_FILES_DEFAULT_TIMEOUT = 10 * _DEFAULT_TIMEOUT
-
-  @decorators.WithTimeoutAndRetriesFromInstance(
-      min_default_timeout=PUSH_CHANGED_FILES_DEFAULT_TIMEOUT)
-  def PushChangedFiles(self, host_device_tuples, timeout=None,
-                       retries=None, delete_device_stale=False):
-    """Push files to the device, skipping files that don't need updating.
-
-    When a directory is pushed, it is traversed recursively on the host and
-    all files in it are pushed to the device as needed.
-    Additionally, if delete_device_stale option is True,
-    files that exist on the device but don't exist on the host are deleted.
-
-    Args:
-      host_device_tuples: A list of (host_path, device_path) tuples, where
-        |host_path| is an absolute path of a file or directory on the host
-        that should be minimially pushed to the device, and |device_path| is
-        an absolute path of the destination on the device.
-      timeout: timeout in seconds
-      retries: number of retries
-      delete_device_stale: option to delete stale files on device
-
-    Raises:
-      CommandFailedError on failure.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-
-    all_changed_files = []
-    all_stale_files = []
-    missing_dirs = []
-    cache_commit_funcs = []
-    for h, d in host_device_tuples:
-      assert os.path.isabs(h) and posixpath.isabs(d)
-      h = os.path.realpath(h)
-      changed_files, up_to_date_files, stale_files, cache_commit_func = (
-          self._GetChangedAndStaleFiles(h, d, delete_device_stale))
-      all_changed_files += changed_files
-      all_stale_files += stale_files
-      cache_commit_funcs.append(cache_commit_func)
-      if changed_files and not up_to_date_files and not stale_files:
-        if os.path.isdir(h):
-          missing_dirs.append(d)
-        else:
-          missing_dirs.append(posixpath.dirname(d))
-
-    if delete_device_stale and all_stale_files:
-      self.RunShellCommand(['rm', '-f'] + all_stale_files, check_return=True)
-
-    if all_changed_files:
-      if missing_dirs:
-        self.RunShellCommand(['mkdir', '-p'] + missing_dirs, check_return=True)
-      self._PushFilesImpl(host_device_tuples, all_changed_files)
-    for func in cache_commit_funcs:
-      func()
-
-  def _GetChangedAndStaleFiles(self, host_path, device_path, track_stale=False):
-    """Get files to push and delete
-
-    Args:
-      host_path: an absolute path of a file or directory on the host
-      device_path: an absolute path of a file or directory on the device
-      track_stale: whether to bother looking for stale files (slower)
-
-    Returns:
-      a four-element tuple
-      1st element: a list of (host_files_path, device_files_path) tuples to push
-      2nd element: a list of host_files_path that are up-to-date
-      3rd element: a list of stale files under device_path, or [] when
-        track_stale == False
-      4th element: a cache commit function.
-    """
-    try:
-      # Length calculations below assume no trailing /.
-      host_path = host_path.rstrip('/')
-      device_path = device_path.rstrip('/')
-
-      specific_device_paths = [device_path]
-      ignore_other_files = not track_stale and os.path.isdir(host_path)
-      if ignore_other_files:
-        specific_device_paths = []
-        for root, _, filenames in os.walk(host_path):
-          relative_dir = root[len(host_path) + 1:]
-          specific_device_paths.extend(
-              posixpath.join(device_path, relative_dir, f) for f in filenames)
-
-      def calculate_host_checksums():
-        return md5sum.CalculateHostMd5Sums([host_path])
-
-      def calculate_device_checksums():
-        if self._enable_device_files_cache:
-          cache_entry = self._cache['device_path_checksums'].get(device_path)
-          if cache_entry and cache_entry[0] == ignore_other_files:
-            return dict(cache_entry[1])
-
-        sums = md5sum.CalculateDeviceMd5Sums(specific_device_paths, self)
-
-        cache_entry = [ignore_other_files, sums]
-        self._cache['device_path_checksums'][device_path] = cache_entry
-        return dict(sums)
-
-      host_checksums, device_checksums = reraiser_thread.RunAsync((
-          calculate_host_checksums,
-          calculate_device_checksums))
-    except EnvironmentError as e:
-      logger.warning('Error calculating md5: %s', e)
-      return ([(host_path, device_path)], [], [], lambda: 0)
-
-    to_push = []
-    up_to_date = []
-    to_delete = []
-    if os.path.isfile(host_path):
-      host_checksum = host_checksums.get(host_path)
-      device_checksum = device_checksums.get(device_path)
-      if host_checksum == device_checksum:
-        up_to_date.append(host_path)
-      else:
-        to_push.append((host_path, device_path))
-    else:
-      for host_abs_path, host_checksum in host_checksums.iteritems():
-        device_abs_path = posixpath.join(
-            device_path, os.path.relpath(host_abs_path, host_path))
-        device_checksum = device_checksums.pop(device_abs_path, None)
-        if device_checksum == host_checksum:
-          up_to_date.append(host_abs_path)
-        else:
-          to_push.append((host_abs_path, device_abs_path))
-      to_delete = device_checksums.keys()
-
-    def cache_commit_func():
-      new_sums = {posixpath.join(device_path, path[len(host_path) + 1:]): val
-                  for path, val in host_checksums.iteritems()}
-      cache_entry = [ignore_other_files, new_sums]
-      self._cache['device_path_checksums'][device_path] = cache_entry
-
-    return (to_push, up_to_date, to_delete, cache_commit_func)
-
-  def _ComputeDeviceChecksumsForApks(self, package_name):
-    ret = self._cache['package_apk_checksums'].get(package_name)
-    if ret is None:
-      device_paths = self._GetApplicationPathsInternal(package_name)
-      file_to_checksums = md5sum.CalculateDeviceMd5Sums(device_paths, self)
-      ret = set(file_to_checksums.values())
-      self._cache['package_apk_checksums'][package_name] = ret
-    return ret
-
-  def _ComputeStaleApks(self, package_name, host_apk_paths):
-    def calculate_host_checksums():
-      return md5sum.CalculateHostMd5Sums(host_apk_paths)
-
-    def calculate_device_checksums():
-      return self._ComputeDeviceChecksumsForApks(package_name)
-
-    host_checksums, device_checksums = reraiser_thread.RunAsync((
-        calculate_host_checksums, calculate_device_checksums))
-    stale_apks = [k for (k, v) in host_checksums.iteritems()
-                  if v not in device_checksums]
-    return stale_apks, set(host_checksums.values())
-
-  def _PushFilesImpl(self, host_device_tuples, files):
-    if not files:
-      return
-
-    size = sum(host_utils.GetRecursiveDiskUsage(h) for h, _ in files)
-    file_count = len(files)
-    dir_size = sum(host_utils.GetRecursiveDiskUsage(h)
-                   for h, _ in host_device_tuples)
-    dir_file_count = 0
-    for h, _ in host_device_tuples:
-      if os.path.isdir(h):
-        dir_file_count += sum(len(f) for _r, _d, f in os.walk(h))
-      else:
-        dir_file_count += 1
-
-    push_duration = self._ApproximateDuration(
-        file_count, file_count, size, False)
-    dir_push_duration = self._ApproximateDuration(
-        len(host_device_tuples), dir_file_count, dir_size, False)
-    zip_duration = self._ApproximateDuration(1, 1, size, True)
-
-    if (dir_push_duration < push_duration and dir_push_duration < zip_duration
-        # TODO(jbudorick): Resume directory pushing once clients have switched
-        # to 1.0.36-compatible syntax.
-        and False):
-      self._PushChangedFilesIndividually(host_device_tuples)
-    elif push_duration < zip_duration:
-      self._PushChangedFilesIndividually(files)
-    elif self._commands_installed is False:
-      # Already tried and failed to install unzip command.
-      self._PushChangedFilesIndividually(files)
-    elif not self._PushChangedFilesZipped(
-        files, [d for _, d in host_device_tuples]):
-      self._PushChangedFilesIndividually(files)
-
-  def _MaybeInstallCommands(self):
-    if self._commands_installed is None:
-      try:
-        if not install_commands.Installed(self):
-          install_commands.InstallCommands(self)
-        self._commands_installed = True
-      except device_errors.CommandFailedError as e:
-        logger.warning('unzip not available: %s', str(e))
-        self._commands_installed = False
-    return self._commands_installed
-
-  @staticmethod
-  def _ApproximateDuration(adb_calls, file_count, byte_count, is_zipping):
-    # We approximate the time to push a set of files to a device as:
-    #   t = c1 * a + c2 * f + c3 + b / c4 + b / (c5 * c6), where
-    #     t: total time (sec)
-    #     c1: adb call time delay (sec)
-    #     a: number of times adb is called (unitless)
-    #     c2: push time delay (sec)
-    #     f: number of files pushed via adb (unitless)
-    #     c3: zip time delay (sec)
-    #     c4: zip rate (bytes/sec)
-    #     b: total number of bytes (bytes)
-    #     c5: transfer rate (bytes/sec)
-    #     c6: compression ratio (unitless)
-
-    # All of these are approximations.
-    ADB_CALL_PENALTY = 0.1  # seconds
-    ADB_PUSH_PENALTY = 0.01  # seconds
-    ZIP_PENALTY = 2.0  # seconds
-    ZIP_RATE = 10000000.0  # bytes / second
-    TRANSFER_RATE = 2000000.0  # bytes / second
-    COMPRESSION_RATIO = 2.0  # unitless
-
-    adb_call_time = ADB_CALL_PENALTY * adb_calls
-    adb_push_setup_time = ADB_PUSH_PENALTY * file_count
-    if is_zipping:
-      zip_time = ZIP_PENALTY + byte_count / ZIP_RATE
-      transfer_time = byte_count / (TRANSFER_RATE * COMPRESSION_RATIO)
-    else:
-      zip_time = 0
-      transfer_time = byte_count / TRANSFER_RATE
-    return adb_call_time + adb_push_setup_time + zip_time + transfer_time
-
-  def _PushChangedFilesIndividually(self, files):
-    for h, d in files:
-      self.adb.Push(h, d)
-
-  def _PushChangedFilesZipped(self, files, dirs):
-    with tempfile.NamedTemporaryFile(suffix='.zip') as zip_file:
-      zip_proc = multiprocessing.Process(
-          target=DeviceUtils._CreateDeviceZip,
-          args=(zip_file.name, files))
-      zip_proc.start()
-      try:
-        # While it's zipping, ensure the unzip command exists on the device.
-        if not self._MaybeInstallCommands():
-          zip_proc.terminate()
-          return False
-
-        # Warm up NeedsSU cache while we're still zipping.
-        self.NeedsSU()
-        with device_temp_file.DeviceTempFile(
-            self.adb, suffix='.zip') as device_temp:
-          zip_proc.join()
-          self.adb.Push(zip_file.name, device_temp.name)
-          quoted_dirs = ' '.join(cmd_helper.SingleQuote(d) for d in dirs)
-          self.RunShellCommand(
-              'unzip %s&&chmod -R 777 %s' % (device_temp.name, quoted_dirs),
-              shell=True, as_root=True,
-              env={'PATH': '%s:$PATH' % install_commands.BIN_DIR},
-              check_return=True)
-      finally:
-        if zip_proc.is_alive():
-          zip_proc.terminate()
-    return True
-
-  @staticmethod
-  def _CreateDeviceZip(zip_path, host_device_tuples):
-    with zipfile.ZipFile(zip_path, 'w') as zip_file:
-      for host_path, device_path in host_device_tuples:
-        zip_utils.WriteToZipFile(zip_file, host_path, device_path)
-
-  # TODO(nednguyen): remove this and migrate the callsite to PathExists().
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def FileExists(self, device_path, timeout=None, retries=None):
-    """Checks whether the given file exists on the device.
-
-    Arguments are the same as PathExists.
-    """
-    return self.PathExists(device_path, timeout=timeout, retries=retries)
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def PathExists(self, device_paths, as_root=False, timeout=None, retries=None):
-    """Checks whether the given path(s) exists on the device.
-
-    Args:
-      device_path: A string containing the absolute path to the file on the
-                   device, or an iterable of paths to check.
-      as_root: Whether root permissions should be use to check for the existence
-               of the given path(s).
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      True if the all given paths exist on the device, False otherwise.
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    paths = device_paths
-    if isinstance(paths, basestring):
-      paths = (paths,)
-    if not paths:
-      return True
-    cmd = ['test', '-e', paths[0]]
-    for p in paths[1:]:
-      cmd.extend(['-a', '-e', p])
-    try:
-      self.RunShellCommand(cmd, as_root=as_root, check_return=True,
-                           timeout=timeout, retries=retries)
-      return True
-    except device_errors.CommandFailedError:
-      return False
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def RemovePath(self, device_path, force=False, recursive=False,
-                 as_root=False, timeout=None, retries=None):
-    """Removes the given path(s) from the device.
-
-    Args:
-      device_path: A string containing the absolute path to the file on the
-                   device, or an iterable of paths to check.
-      force: Whether to remove the path(s) with force (-f).
-      recursive: Whether to remove any directories in the path(s) recursively.
-      as_root: Whether root permissions should be use to remove the given
-               path(s).
-      timeout: timeout in seconds
-      retries: number of retries
-    """
-    args = ['rm']
-    if force:
-      args.append('-f')
-    if recursive:
-      args.append('-r')
-    if isinstance(device_path, basestring):
-      args.append(device_path)
-    else:
-      args.extend(device_path)
-    self.RunShellCommand(args, as_root=as_root, check_return=True)
-
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def PullFile(self, device_path, host_path, timeout=None, retries=None):
-    """Pull a file from the device.
-
-    Args:
-      device_path: A string containing the absolute path of the file to pull
-                   from the device.
-      host_path: A string containing the absolute path of the destination on
-                 the host.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandFailedError on failure.
-      CommandTimeoutError on timeout.
-    """
-    # Create the base dir if it doesn't exist already
-    dirname = os.path.dirname(host_path)
-    if dirname and not os.path.exists(dirname):
-      os.makedirs(dirname)
-    self.adb.Pull(device_path, host_path)
-
-  def _ReadFileWithPull(self, device_path):
-    try:
-      d = tempfile.mkdtemp()
-      host_temp_path = os.path.join(d, 'tmp_ReadFileWithPull')
-      self.adb.Pull(device_path, host_temp_path)
-      with open(host_temp_path, 'r') as host_temp:
-        return host_temp.read()
-    finally:
-      if os.path.exists(d):
-        shutil.rmtree(d)
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def ReadFile(self, device_path, as_root=False, force_pull=False,
-               timeout=None, retries=None):
-    """Reads the contents of a file from the device.
-
-    Args:
-      device_path: A string containing the absolute path of the file to read
-                   from the device.
-      as_root: A boolean indicating whether the read should be executed with
-               root privileges.
-      force_pull: A boolean indicating whether to force the operation to be
-          performed by pulling a file from the device. The default is, when the
-          contents are short, to retrieve the contents using cat instead.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      The contents of |device_path| as a string. Contents are intepreted using
-      universal newlines, so the caller will see them encoded as '\n'. Also,
-      all lines will be terminated.
-
-    Raises:
-      AdbCommandFailedError if the file can't be read.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    def get_size(path):
-      return self.FileSize(path, as_root=as_root)
-
-    if (not force_pull
-        and 0 < get_size(device_path) <= self._MAX_ADB_OUTPUT_LENGTH):
-      return _JoinLines(self.RunShellCommand(
-          ['cat', device_path], as_root=as_root, check_return=True))
-    elif as_root and self.NeedsSU():
-      with device_temp_file.DeviceTempFile(self.adb) as device_temp:
-        cmd = 'SRC=%s DEST=%s;cp "$SRC" "$DEST" && chmod 666 "$DEST"' % (
-            cmd_helper.SingleQuote(device_path),
-            cmd_helper.SingleQuote(device_temp.name))
-        self.RunShellCommand(cmd, shell=True, as_root=True, check_return=True)
-        return self._ReadFileWithPull(device_temp.name)
-    else:
-      return self._ReadFileWithPull(device_path)
-
-  def _WriteFileWithPush(self, device_path, contents):
-    with tempfile.NamedTemporaryFile() as host_temp:
-      host_temp.write(contents)
-      host_temp.flush()
-      self.adb.Push(host_temp.name, device_path)
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def WriteFile(self, device_path, contents, as_root=False, force_push=False,
-                timeout=None, retries=None):
-    """Writes |contents| to a file on the device.
-
-    Args:
-      device_path: A string containing the absolute path to the file to write
-          on the device.
-      contents: A string containing the data to write to the device.
-      as_root: A boolean indicating whether the write should be executed with
-          root privileges (if available).
-      force_push: A boolean indicating whether to force the operation to be
-          performed by pushing a file to the device. The default is, when the
-          contents are short, to pass the contents using a shell script instead.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandFailedError if the file could not be written on the device.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    if not force_push and len(contents) < self._MAX_ADB_COMMAND_LENGTH:
-      # If the contents are small, for efficieny we write the contents with
-      # a shell command rather than pushing a file.
-      cmd = 'echo -n %s > %s' % (cmd_helper.SingleQuote(contents),
-                                 cmd_helper.SingleQuote(device_path))
-      self.RunShellCommand(cmd, shell=True, as_root=as_root, check_return=True)
-    elif as_root and self.NeedsSU():
-      # Adb does not allow to "push with su", so we first push to a temp file
-      # on a safe location, and then copy it to the desired location with su.
-      with device_temp_file.DeviceTempFile(self.adb) as device_temp:
-        self._WriteFileWithPush(device_temp.name, contents)
-        # Here we need 'cp' rather than 'mv' because the temp and
-        # destination files might be on different file systems (e.g.
-        # on internal storage and an external sd card).
-        self.RunShellCommand(['cp', device_temp.name, device_path],
-                             as_root=True, check_return=True)
-    else:
-      # If root is not needed, we can push directly to the desired location.
-      self._WriteFileWithPush(device_path, contents)
-
-  def _ParseLongLsOutput(self, device_path, as_root=False, **kwargs):
-    """Run and scrape the output of 'ls -a -l' on a device directory."""
-    device_path = posixpath.join(device_path, '')  # Force trailing '/'.
-    output = self.RunShellCommand(
-        ['ls', '-a', '-l', device_path], as_root=as_root,
-        check_return=True, env={'TZ': 'utc'}, **kwargs)
-    if output and output[0].startswith('total '):
-      output.pop(0) # pylint: disable=maybe-no-member
-
-    entries = []
-    for line in output:
-      m = _LONG_LS_OUTPUT_RE.match(line)
-      if m:
-        if m.group('filename') not in ['.', '..']:
-          entries.append(m.groupdict())
-      else:
-        logger.info('Skipping: %s', line)
-
-    return entries
-
-  def ListDirectory(self, device_path, as_root=False, **kwargs):
-    """List all files on a device directory.
-
-    Mirroring os.listdir (and most client expectations) the resulting list
-    does not include the special entries '.' and '..' even if they are present
-    in the directory.
-
-    Args:
-      device_path: A string containing the path of the directory on the device
-                   to list.
-      as_root: A boolean indicating whether the to use root privileges to list
-               the directory contents.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      A list of filenames for all entries contained in the directory.
-
-    Raises:
-      AdbCommandFailedError if |device_path| does not specify a valid and
-          accessible directory in the device.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    entries = self._ParseLongLsOutput(device_path, as_root=as_root, **kwargs)
-    return [d['filename'] for d in entries]
-
-  def StatDirectory(self, device_path, as_root=False, **kwargs):
-    """List file and stat info for all entries on a device directory.
-
-    Implementation notes: this is currently implemented by parsing the output
-    of 'ls -a -l' on the device. Whether possible and convenient, we attempt to
-    make parsing strict and return values mirroring those of the standard |os|
-    and |stat| Python modules.
-
-    Mirroring os.listdir (and most client expectations) the resulting list
-    does not include the special entries '.' and '..' even if they are present
-    in the directory.
-
-    Args:
-      device_path: A string containing the path of the directory on the device
-                   to list.
-      as_root: A boolean indicating whether the to use root privileges to list
-               the directory contents.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      A list of dictionaries, each containing the following keys:
-        filename: A string with the file name.
-        st_mode: File permissions, use the stat module to interpret these.
-        st_nlink: Number of hard links (may be missing).
-        st_owner: A string with the user name of the owner.
-        st_group: A string with the group name of the owner.
-        st_rdev_pair: Device type as (major, minior) (only if inode device).
-        st_size: Size of file, in bytes (may be missing for non-regular files).
-        st_mtime: Time of most recent modification, in seconds since epoch
-          (although resolution is in minutes).
-        symbolic_link_to: If entry is a symbolic link, path where it points to;
-          missing otherwise.
-
-    Raises:
-      AdbCommandFailedError if |device_path| does not specify a valid and
-          accessible directory in the device.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    entries = self._ParseLongLsOutput(device_path, as_root=as_root, **kwargs)
-    for d in entries:
-      for key, value in d.items():
-        if value is None:
-          del d[key]  # Remove missing fields.
-      d['st_mode'] = _ParseModeString(d['st_mode'])
-      d['st_mtime'] = calendar.timegm(
-          time.strptime(d['st_mtime'], _LS_DATE_FORMAT))
-      for key in ['st_nlink', 'st_size', 'st_rdev_major', 'st_rdev_minor']:
-        if key in d:
-          d[key] = int(d[key])
-      if 'st_rdev_major' in d and 'st_rdev_minor' in d:
-        d['st_rdev_pair'] = (d.pop('st_rdev_major'), d.pop('st_rdev_minor'))
-    return entries
-
-  def StatPath(self, device_path, as_root=False, **kwargs):
-    """Get the stat attributes of a file or directory on the device.
-
-    Args:
-      device_path: A string containing the path of a file or directory from
-                   which to get attributes.
-      as_root: A boolean indicating whether the to use root privileges to
-               access the file information.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      A dictionary with the stat info collected; see StatDirectory for details.
-
-    Raises:
-      CommandFailedError if device_path cannot be found on the device.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    dirname, filename = posixpath.split(posixpath.normpath(device_path))
-    for entry in self.StatDirectory(dirname, as_root=as_root, **kwargs):
-      if entry['filename'] == filename:
-        return entry
-    raise device_errors.CommandFailedError(
-        'Cannot find file or directory: %r' % device_path, str(self))
-
-  def FileSize(self, device_path, as_root=False, **kwargs):
-    """Get the size of a file on the device.
-
-    Note: This is implemented by parsing the output of the 'ls' command on
-    the device. On some Android versions, when passing a directory or special
-    file, the size is *not* reported and this function will throw an exception.
-
-    Args:
-      device_path: A string containing the path of a file on the device.
-      as_root: A boolean indicating whether the to use root privileges to
-               access the file information.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      The size of the file in bytes.
-
-    Raises:
-      CommandFailedError if device_path cannot be found on the device, or
-        its size cannot be determited for some reason.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    entry = self.StatPath(device_path, as_root=as_root, **kwargs)
-    try:
-      return entry['st_size']
-    except KeyError:
-      raise device_errors.CommandFailedError(
-          'Could not determine the size of: %s' % device_path, str(self))
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def SetJavaAsserts(self, enabled, timeout=None, retries=None):
-    """Enables or disables Java asserts.
-
-    Args:
-      enabled: A boolean indicating whether Java asserts should be enabled
-               or disabled.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      True if the device-side property changed and a restart is required as a
-      result, False otherwise.
-
-    Raises:
-      CommandTimeoutError on timeout.
-    """
-    def find_property(lines, property_name):
-      for index, line in enumerate(lines):
-        if line.strip() == '':
-          continue
-        key_value = tuple(s.strip() for s in line.split('=', 1))
-        if len(key_value) != 2:
-          continue
-        key, value = key_value
-        if key == property_name:
-          return index, value
-      return None, ''
-
-    new_value = 'all' if enabled else ''
-
-    # First ensure the desired property is persisted.
-    try:
-      properties = self.ReadFile(self.LOCAL_PROPERTIES_PATH).splitlines()
-    except device_errors.CommandFailedError:
-      properties = []
-    index, value = find_property(properties, self.JAVA_ASSERT_PROPERTY)
-    if new_value != value:
-      if new_value:
-        new_line = '%s=%s' % (self.JAVA_ASSERT_PROPERTY, new_value)
-        if index is None:
-          properties.append(new_line)
-        else:
-          properties[index] = new_line
-      else:
-        assert index is not None  # since new_value == '' and new_value != value
-        properties.pop(index)
-      self.WriteFile(self.LOCAL_PROPERTIES_PATH, _JoinLines(properties))
-
-    # Next, check the current runtime value is what we need, and
-    # if not, set it and report that a reboot is required.
-    value = self.GetProp(self.JAVA_ASSERT_PROPERTY)
-    if new_value != value:
-      self.SetProp(self.JAVA_ASSERT_PROPERTY, new_value)
-      return True
-    else:
-      return False
-
-  def GetLanguage(self, cache=False):
-    """Returns the language setting on the device.
-    Args:
-      cache: Whether to use cached properties when available.
-    """
-    return self.GetProp('persist.sys.language', cache=cache)
-
-  def GetCountry(self, cache=False):
-    """Returns the country setting on the device.
-
-    Args:
-      cache: Whether to use cached properties when available.
-    """
-    return self.GetProp('persist.sys.country', cache=cache)
-
-  @property
-  def screen_density(self):
-    """Returns the screen density of the device."""
-    DPI_TO_DENSITY = {
-      120: 'ldpi',
-      160: 'mdpi',
-      240: 'hdpi',
-      320: 'xhdpi',
-      480: 'xxhdpi',
-      640: 'xxxhdpi',
-    }
-    return DPI_TO_DENSITY.get(self.pixel_density, 'tvdpi')
-
-  @property
-  def pixel_density(self):
-    return int(self.GetProp('ro.sf.lcd_density', cache=True))
-
-  @property
-  def build_description(self):
-    """Returns the build description of the system.
-
-    For example:
-      nakasi-user 4.4.4 KTU84P 1227136 release-keys
-    """
-    return self.GetProp('ro.build.description', cache=True)
-
-  @property
-  def build_fingerprint(self):
-    """Returns the build fingerprint of the system.
-
-    For example:
-      google/nakasi/grouper:4.4.4/KTU84P/1227136:user/release-keys
-    """
-    return self.GetProp('ro.build.fingerprint', cache=True)
-
-  @property
-  def build_id(self):
-    """Returns the build ID of the system (e.g. 'KTU84P')."""
-    return self.GetProp('ro.build.id', cache=True)
-
-  @property
-  def build_product(self):
-    """Returns the build product of the system (e.g. 'grouper')."""
-    return self.GetProp('ro.build.product', cache=True)
-
-  @property
-  def build_type(self):
-    """Returns the build type of the system (e.g. 'user')."""
-    return self.GetProp('ro.build.type', cache=True)
-
-  @property
-  def build_version_sdk(self):
-    """Returns the build version sdk of the system as a number (e.g. 19).
-
-    For version code numbers see:
-    http://developer.android.com/reference/android/os/Build.VERSION_CODES.html
-
-    For named constants see devil.android.sdk.version_codes
-
-    Raises:
-      CommandFailedError if the build version sdk is not a number.
-    """
-    value = self.GetProp('ro.build.version.sdk', cache=True)
-    try:
-      return int(value)
-    except ValueError:
-      raise device_errors.CommandFailedError(
-          'Invalid build version sdk: %r' % value)
-
-  @property
-  def product_cpu_abi(self):
-    """Returns the product cpu abi of the device (e.g. 'armeabi-v7a')."""
-    return self.GetProp('ro.product.cpu.abi', cache=True)
-
-  @property
-  def product_model(self):
-    """Returns the name of the product model (e.g. 'Nexus 7')."""
-    return self.GetProp('ro.product.model', cache=True)
-
-  @property
-  def product_name(self):
-    """Returns the product name of the device (e.g. 'nakasi')."""
-    return self.GetProp('ro.product.name', cache=True)
-
-  @property
-  def product_board(self):
-    """Returns the product board name of the device (e.g. 'shamu')."""
-    return self.GetProp('ro.product.board', cache=True)
-
-  def _EnsureCacheInitialized(self):
-    """Populates cache token, runs getprop and fetches $EXTERNAL_STORAGE."""
-    if self._cache['token']:
-      return
-    with self._cache_lock:
-      if self._cache['token']:
-        return
-      # Change the token every time to ensure that it will match only the
-      # previously dumped cache.
-      token = str(uuid.uuid1())
-      cmd = (
-          'c=/data/local/tmp/cache_token;'
-          'echo $EXTERNAL_STORAGE;'
-          'cat $c 2>/dev/null||echo;'
-          'echo "%s">$c &&' % token +
-          'getprop'
-      )
-      output = self.RunShellCommand(
-          cmd, shell=True, check_return=True, large_output=True)
-      # Error-checking for this existing is done in GetExternalStoragePath().
-      self._cache['external_storage'] = output[0]
-      self._cache['prev_token'] = output[1]
-      output = output[2:]
-
-      prop_cache = self._cache['getprop']
-      prop_cache.clear()
-      for key, value in _GETPROP_RE.findall(''.join(output)):
-        prop_cache[key] = value
-      self._cache['token'] = token
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def GetProp(self, property_name, cache=False, timeout=None, retries=None):
-    """Gets a property from the device.
-
-    Args:
-      property_name: A string containing the name of the property to get from
-                     the device.
-      cache: Whether to use cached properties when available.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      The value of the device's |property_name| property.
-
-    Raises:
-      CommandTimeoutError on timeout.
-    """
-    assert isinstance(property_name, basestring), (
-        "property_name is not a string: %r" % property_name)
-
-    if cache:
-      # It takes ~120ms to query a single property, and ~130ms to query all
-      # properties. So, when caching we always query all properties.
-      self._EnsureCacheInitialized()
-    else:
-      # timeout and retries are handled down at run shell, because we don't
-      # want to apply them in the other branch when reading from the cache
-      value = self.RunShellCommand(
-          ['getprop', property_name], single_line=True, check_return=True,
-          timeout=timeout, retries=retries)
-      self._cache['getprop'][property_name] = value
-    # Non-existent properties are treated as empty strings by getprop.
-    return self._cache['getprop'].get(property_name, '')
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def SetProp(self, property_name, value, check=False, timeout=None,
-              retries=None):
-    """Sets a property on the device.
-
-    Args:
-      property_name: A string containing the name of the property to set on
-                     the device.
-      value: A string containing the value to set to the property on the
-             device.
-      check: A boolean indicating whether to check that the property was
-             successfully set on the device.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandFailedError if check is true and the property was not correctly
-        set on the device (e.g. because it is not rooted).
-      CommandTimeoutError on timeout.
-    """
-    assert isinstance(property_name, basestring), (
-        "property_name is not a string: %r" % property_name)
-    assert isinstance(value, basestring), "value is not a string: %r" % value
-
-    self.RunShellCommand(['setprop', property_name, value], check_return=True)
-    prop_cache = self._cache['getprop']
-    if property_name in prop_cache:
-      del prop_cache[property_name]
-    # TODO(perezju) remove the option and make the check mandatory, but using a
-    # single shell script to both set- and getprop.
-    if check and value != self.GetProp(property_name, cache=False):
-      raise device_errors.CommandFailedError(
-          'Unable to set property %r on the device to %r'
-          % (property_name, value), str(self))
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def GetABI(self, timeout=None, retries=None):
-    """Gets the device main ABI.
-
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      The device's main ABI name.
-
-    Raises:
-      CommandTimeoutError on timeout.
-    """
-    return self.GetProp('ro.product.cpu.abi', cache=True)
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def GetPids(self, process_name=None, timeout=None, retries=None):
-    """Returns the PIDs of processes containing the given name as substring.
-
-    Note that the |process_name| is often the package name.
-
-    Args:
-      process_name: A string containing the process name to get the PIDs for.
-                    If missing returns PIDs for all processes.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      A dict mapping process name to a list of PIDs for each process that
-      contained the provided |process_name|.
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    procs_pids = collections.defaultdict(list)
-    try:
-      ps_cmd = 'ps'
-      # ps behavior was changed in Android above N, http://crbug.com/686716
-      if (self.build_version_sdk >= version_codes.NOUGAT_MR1
-          and self.build_id[0] > 'N'):
-        ps_cmd = 'ps -e'
-      if process_name:
-        ps_output = self._RunPipedShellCommand(
-            '%s | grep -F %s' % (ps_cmd, cmd_helper.SingleQuote(process_name)))
-      else:
-        ps_output = self.RunShellCommand(
-            ps_cmd.split(), check_return=True, large_output=True)
-    except device_errors.AdbShellCommandFailedError as e:
-      if e.status and isinstance(e.status, list) and not e.status[0]:
-        # If ps succeeded but grep failed, there were no processes with the
-        # given name.
-        return procs_pids
-      else:
-        raise
-
-    process_name = process_name or ''
-    for line in ps_output:
-      try:
-        ps_data = line.split()
-        pid, process = ps_data[1], ps_data[-1]
-        if process_name in process and pid != 'PID':
-          procs_pids[process].append(pid)
-      except IndexError:
-        pass
-    return procs_pids
-
-  def GetApplicationPids(self, process_name, at_most_one=False, **kwargs):
-    """Returns the PID or PIDs of a given process name.
-
-    Note that the |process_name|, often the package name, must match exactly.
-
-    Args:
-      process_name: A string containing the process name to get the PIDs for.
-      at_most_one: A boolean indicating that at most one PID is expected to
-                   be found.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      A list of the PIDs for the named process. If at_most_one=True returns
-      the single PID found or None otherwise.
-
-    Raises:
-      CommandFailedError if at_most_one=True and more than one PID is found
-          for the named process.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    pids = self.GetPids(process_name, **kwargs).get(process_name, [])
-    if at_most_one:
-      if len(pids) > 1:
-        raise device_errors.CommandFailedError(
-            'Expected a single process but found PIDs: %s.' % ', '.join(pids),
-            device_serial=str(self))
-      return pids[0] if pids else None
-    else:
-      return pids
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def GetEnforce(self, timeout=None, retries=None):
-    """Get the current mode of SELinux.
-
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      True (enforcing), False (permissive), or None (disabled).
-
-    Raises:
-      CommandFailedError on failure.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    output = self.RunShellCommand(
-        ['getenforce'], check_return=True, single_line=True).lower()
-    if output not in _SELINUX_MODE:
-      raise device_errors.CommandFailedError(
-          'Unexpected getenforce output: %s' % output)
-    return _SELINUX_MODE[output]
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def SetEnforce(self, enabled, timeout=None, retries=None):
-    """Modify the mode SELinux is running in.
-
-    Args:
-      enabled: a boolean indicating whether to put SELinux in encorcing mode
-               (if True), or permissive mode (otherwise).
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandFailedError on failure.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    self.RunShellCommand(
-        ['setenforce', '1' if int(enabled) else '0'], as_root=True,
-        check_return=True)
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def TakeScreenshot(self, host_path=None, timeout=None, retries=None):
-    """Takes a screenshot of the device.
-
-    Args:
-      host_path: A string containing the path on the host to save the
-                 screenshot to. If None, a file name in the current
-                 directory will be generated.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      The name of the file on the host to which the screenshot was saved.
-
-    Raises:
-      CommandFailedError on failure.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-    """
-    if not host_path:
-      host_path = os.path.abspath('screenshot-%s-%s.png' % (
-          self.serial, _GetTimeStamp()))
-    with device_temp_file.DeviceTempFile(self.adb, suffix='.png') as device_tmp:
-      self.RunShellCommand(['/system/bin/screencap', '-p', device_tmp.name],
-                           check_return=True)
-      self.PullFile(device_tmp.name, host_path)
-    return host_path
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def GetMemoryUsageForPid(self, pid, timeout=None, retries=None):
-    """Gets the memory usage for the given PID.
-
-    Args:
-      pid: PID of the process.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      A dict containing memory usage statistics for the PID. May include:
-        Size, Rss, Pss, Shared_Clean, Shared_Dirty, Private_Clean,
-        Private_Dirty, VmHWM
-
-    Raises:
-      CommandTimeoutError on timeout.
-    """
-    result = collections.defaultdict(int)
-
-    try:
-      result.update(self._GetMemoryUsageForPidFromSmaps(pid))
-    except device_errors.CommandFailedError:
-      logger.exception('Error getting memory usage from smaps')
-
-    try:
-      result.update(self._GetMemoryUsageForPidFromStatus(pid))
-    except device_errors.CommandFailedError:
-      logger.exception('Error getting memory usage from status')
-
-    return result
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def DismissCrashDialogIfNeeded(self, timeout=None, retries=None):
-    """Dismiss the error/ANR dialog if present.
-
-    Returns: Name of the crashed package if a dialog is focused,
-             None otherwise.
-    """
-    def _FindFocusedWindow():
-      match = None
-      # TODO(jbudorick): Try to grep the output on the device instead of using
-      # large_output if/when DeviceUtils exposes a public interface for piped
-      # shell command handling.
-      for line in self.RunShellCommand(['dumpsys', 'window', 'windows'],
-                                       check_return=True, large_output=True):
-        match = re.match(_CURRENT_FOCUS_CRASH_RE, line)
-        if match:
-          break
-      return match
-
-    match = _FindFocusedWindow()
-    if not match:
-      return None
-    package = match.group(2)
-    logger.warning('Trying to dismiss %s dialog for %s', *match.groups())
-    self.SendKeyEvent(keyevent.KEYCODE_DPAD_RIGHT)
-    self.SendKeyEvent(keyevent.KEYCODE_DPAD_RIGHT)
-    self.SendKeyEvent(keyevent.KEYCODE_ENTER)
-    match = _FindFocusedWindow()
-    if match:
-      logger.error('Still showing a %s dialog for %s', *match.groups())
-    return package
-
-  def _GetMemoryUsageForPidFromSmaps(self, pid):
-    SMAPS_COLUMNS = (
-        'Size', 'Rss', 'Pss', 'Shared_Clean', 'Shared_Dirty', 'Private_Clean',
-        'Private_Dirty')
-
-    showmap_out = self._RunPipedShellCommand(
-        'showmap %d | grep TOTAL' % int(pid), as_root=True)
-
-    split_totals = showmap_out[-1].split()
-    if (not split_totals
-        or len(split_totals) != 9
-        or split_totals[-1] != 'TOTAL'):
-      raise device_errors.CommandFailedError(
-          'Invalid output from showmap: %s' % '\n'.join(showmap_out))
-
-    return dict(itertools.izip(SMAPS_COLUMNS, (int(n) for n in split_totals)))
-
-  def _GetMemoryUsageForPidFromStatus(self, pid):
-    for line in self.ReadFile(
-        '/proc/%s/status' % str(pid), as_root=True).splitlines():
-      if line.startswith('VmHWM:'):
-        return {'VmHWM': int(line.split()[1])}
-    raise device_errors.CommandFailedError(
-        'Could not find memory peak value for pid %s', str(pid))
-
-  def GetLogcatMonitor(self, *args, **kwargs):
-    """Returns a new LogcatMonitor associated with this device.
-
-    Parameters passed to this function are passed directly to
-    |logcat_monitor.LogcatMonitor| and are documented there.
-    """
-    return logcat_monitor.LogcatMonitor(self.adb, *args, **kwargs)
-
-  def GetClientCache(self, client_name):
-    """Returns client cache."""
-    if client_name not in self._client_caches:
-      self._client_caches[client_name] = {}
-    return self._client_caches[client_name]
-
-  def _ClearCache(self):
-    """Clears all caches."""
-    for client in self._client_caches:
-      self._client_caches[client].clear()
-    self._cache = {
-        # Map of packageId -> list of on-device .apk paths
-        'package_apk_paths': {},
-        # Set of packageId that were loaded from LoadCacheData and not yet
-        # verified.
-        'package_apk_paths_to_verify': set(),
-        # Map of packageId -> set of on-device .apk checksums
-        'package_apk_checksums': {},
-        # Map of property_name -> value
-        'getprop': {},
-        # Map of device_path -> [ignore_other_files, map of path->checksum]
-        'device_path_checksums': {},
-        # Location of sdcard ($EXTERNAL_STORAGE).
-        'external_storage': None,
-        # Token used to detect when LoadCacheData is stale.
-        'token': None,
-        'prev_token': None,
-    }
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def LoadCacheData(self, data, timeout=None, retries=None):
-    """Initializes the cache from data created using DumpCacheData.
-
-    The cache is used only if its token matches the one found on the device.
-    This prevents a stale cache from being used (which can happen when sharing
-    devices).
-
-    Args:
-      data: A previously serialized cache (string).
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      Whether the cache was loaded.
-    """
-    obj = json.loads(data)
-    self._EnsureCacheInitialized()
-    given_token = obj.get('token')
-    if not given_token or self._cache['prev_token'] != given_token:
-      logger.warning('Stale cache detected. Not using it.')
-      return False
-
-    self._cache['package_apk_paths'] = obj.get('package_apk_paths', {})
-    # When using a cache across script invokations, verify that apps have
-    # not been uninstalled.
-    self._cache['package_apk_paths_to_verify'] = set(
-        self._cache['package_apk_paths'].iterkeys())
-
-    package_apk_checksums = obj.get('package_apk_checksums', {})
-    for k, v in package_apk_checksums.iteritems():
-      package_apk_checksums[k] = set(v)
-    self._cache['package_apk_checksums'] = package_apk_checksums
-    device_path_checksums = obj.get('device_path_checksums', {})
-    self._cache['device_path_checksums'] = device_path_checksums
-    return True
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def DumpCacheData(self, timeout=None, retries=None):
-    """Dumps the current cache state to a string.
-
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      A serialized cache as a string.
-    """
-    self._EnsureCacheInitialized()
-    obj = {}
-    obj['token'] = self._cache['token']
-    obj['package_apk_paths'] = self._cache['package_apk_paths']
-    obj['package_apk_checksums'] = self._cache['package_apk_checksums']
-    # JSON can't handle sets.
-    for k, v in obj['package_apk_checksums'].iteritems():
-      obj['package_apk_checksums'][k] = list(v)
-    obj['device_path_checksums'] = self._cache['device_path_checksums']
-    return json.dumps(obj, separators=(',', ':'))
-
-  @classmethod
-  def parallel(cls, devices, async=False):
-    """Creates a Parallelizer to operate over the provided list of devices.
-
-    Args:
-      devices: A list of either DeviceUtils instances or objects from
-               from which DeviceUtils instances can be constructed. If None,
-               all attached devices will be used.
-      async: If true, returns a Parallelizer that runs operations
-             asynchronously.
-
-    Returns:
-      A Parallelizer operating over |devices|.
-    """
-    devices = [d if isinstance(d, cls) else cls(d) for d in devices]
-    if async:
-      return parallelizer.Parallelizer(devices)
-    else:
-      return parallelizer.SyncParallelizer(devices)
-
-  @classmethod
-  def HealthyDevices(cls, blacklist=None, device_arg='default', **kwargs):
-    """Returns a list of DeviceUtils instances.
-
-    Returns a list of DeviceUtils instances that are attached, not blacklisted,
-    and optionally filtered by --device flags or ANDROID_SERIAL environment
-    variable.
-
-    Args:
-      blacklist: A DeviceBlacklist instance (optional). Device serials in this
-          blacklist will never be returned, but a warning will be logged if they
-          otherwise would have been.
-      device_arg: The value of the --device flag. This can be:
-          'default' -> Same as [], but returns an empty list rather than raise a
-              NoDevicesError.
-          [] -> Returns all devices, unless $ANDROID_SERIAL is set.
-          None -> Use $ANDROID_SERIAL if set, otherwise looks for a single
-              attached device. Raises an exception if multiple devices are
-              attached.
-          'serial' -> Returns an instance for the given serial, if not
-              blacklisted.
-          ['A', 'B', ...] -> Returns instances for the subset that is not
-              blacklisted.
-      A device serial, or a list of device serials (optional).
-
-    Returns:
-      A list of DeviceUtils instances.
-
-    Raises:
-      NoDevicesError: Raised when no non-blacklisted devices exist and
-          device_arg is passed.
-      MultipleDevicesError: Raise when multiple devices exist, but |device_arg|
-          is None.
-    """
-    allow_no_devices = False
-    if device_arg == 'default':
-      allow_no_devices = True
-      device_arg = ()
-
-    select_multiple = True
-    if not (isinstance(device_arg, tuple) or isinstance(device_arg, list)):
-      select_multiple = False
-      if device_arg:
-        device_arg = (device_arg,)
-
-    blacklisted_devices = blacklist.Read() if blacklist else []
-
-    # adb looks for ANDROID_SERIAL, so support it as well.
-    android_serial = os.environ.get('ANDROID_SERIAL')
-    if not device_arg and android_serial:
-      device_arg = (android_serial,)
-
-    def blacklisted(serial):
-      if serial in blacklisted_devices:
-        logger.warning('Device %s is blacklisted.', serial)
-        return True
-      return False
-
-    if device_arg:
-      devices = [cls(x, **kwargs) for x in device_arg if not blacklisted(x)]
-    else:
-      devices = []
-      for adb in adb_wrapper.AdbWrapper.Devices():
-        if not blacklisted(adb.GetDeviceSerial()):
-          devices.append(cls(_CreateAdbWrapper(adb), **kwargs))
-
-    if len(devices) == 0 and not allow_no_devices:
-      raise device_errors.NoDevicesError()
-    if len(devices) > 1 and not select_multiple:
-      raise device_errors.MultipleDevicesError(devices)
-    return sorted(devices)
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def RestartAdbd(self, timeout=None, retries=None):
-    logger.info('Restarting adbd on device.')
-    with device_temp_file.DeviceTempFile(self.adb, suffix='.sh') as script:
-      self.WriteFile(script.name, _RESTART_ADBD_SCRIPT)
-      self.RunShellCommand(
-          ['source', script.name], check_return=True, as_root=True)
-      self.adb.WaitForDevice()
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def GrantPermissions(self, package, permissions, timeout=None, retries=None):
-    # Permissions only need to be set on M and above because of the changes to
-    # the permission model.
-    if not permissions or self.build_version_sdk < version_codes.MARSHMALLOW:
-      return
-    logger.info('Setting permissions for %s.', package)
-    permissions = [p for p in permissions if p not in _PERMISSIONS_BLACKLIST]
-    if ('android.permission.WRITE_EXTERNAL_STORAGE' in permissions
-        and 'android.permission.READ_EXTERNAL_STORAGE' not in permissions):
-      permissions.append('android.permission.READ_EXTERNAL_STORAGE')
-    cmd = '&&'.join('pm grant %s %s' % (package, p) for p in permissions)
-    if cmd:
-      output = self.RunShellCommand(cmd, shell=True, check_return=True)
-      if output:
-        logger.warning('Possible problem when granting permissions. Blacklist '
-                       'may need to be updated.')
-        for line in output:
-          logger.warning('  %s', line)
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def IsScreenOn(self, timeout=None, retries=None):
-    """Determines if screen is on.
-
-    Dumpsys input_method exposes screen on/off state. Below is an explination of
-    the states.
-
-    Pre-L:
-      On: mScreenOn=true
-      Off: mScreenOn=false
-    L+:
-      On: mInteractive=true
-      Off: mInteractive=false
-
-    Returns:
-      True if screen is on, false if it is off.
-
-    Raises:
-      device_errors.CommandFailedError: If screen state cannot be found.
-    """
-    if self.build_version_sdk < version_codes.LOLLIPOP:
-      input_check = 'mScreenOn'
-      check_value = 'mScreenOn=true'
-    else:
-      input_check = 'mInteractive'
-      check_value = 'mInteractive=true'
-    dumpsys_out = self._RunPipedShellCommand(
-        'dumpsys input_method | grep %s' % input_check)
-    if not dumpsys_out:
-      raise device_errors.CommandFailedError(
-          'Unable to detect screen state', str(self))
-    return check_value in dumpsys_out[0]
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def SetScreen(self, on, timeout=None, retries=None):
-    """Turns screen on and off.
-
-    Args:
-      on: bool to decide state to switch to. True = on False = off.
-    """
-    def screen_test():
-      return self.IsScreenOn() == on
-
-    if screen_test():
-      logger.info('Screen already in expected state.')
-      return
-    self.SendKeyEvent(keyevent.KEYCODE_POWER)
-    timeout_retry.WaitFor(screen_test, wait_period=1)
diff --git a/third_party/catapult/devil/devil/android/device_utils_devicetest.py b/third_party/catapult/devil/devil/android/device_utils_devicetest.py
deleted file mode 100755
index e69cc90..0000000
--- a/third_party/catapult/devil/devil/android/device_utils_devicetest.py
+++ /dev/null
@@ -1,229 +0,0 @@
-#!/usr/bin/env python
-# 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.
-
-"""
-Unit tests for the contents of device_utils.py (mostly DeviceUtils).
-The test will invoke real devices
-"""
-
-import os
-import posixpath
-import sys
-import tempfile
-import unittest
-
-if __name__ == '__main__':
-  sys.path.append(
-      os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..', )))
-
-from devil.android import device_test_case
-from devil.android import device_utils
-from devil.android.sdk import adb_wrapper
-from devil.utils import cmd_helper
-
-_OLD_CONTENTS = "foo"
-_NEW_CONTENTS = "bar"
-_DEVICE_DIR = "/data/local/tmp/device_utils_test"
-_SUB_DIR = "sub"
-_SUB_DIR1 = "sub1"
-_SUB_DIR2 = "sub2"
-
-
-class DeviceUtilsPushDeleteFilesTest(device_test_case.DeviceTestCase):
-
-  def setUp(self):
-    super(DeviceUtilsPushDeleteFilesTest, self).setUp()
-    self.adb = adb_wrapper.AdbWrapper(self.serial)
-    self.adb.WaitForDevice()
-    self.device = device_utils.DeviceUtils(
-        self.adb, default_timeout=10, default_retries=0)
-
-  @staticmethod
-  def _MakeTempFile(contents):
-    """Make a temporary file with the given contents.
-
-    Args:
-      contents: string to write to the temporary file.
-
-    Returns:
-      the tuple contains the absolute path to the file and the file name
-    """
-    fi, path = tempfile.mkstemp(text=True)
-    with os.fdopen(fi, 'w') as f:
-      f.write(contents)
-    file_name = os.path.basename(path)
-    return (path, file_name)
-
-  @staticmethod
-  def _MakeTempFileGivenDir(directory, contents):
-    """Make a temporary file under the given directory
-    with the given contents
-
-    Args:
-      directory: the temp directory to create the file
-      contents: string to write to the temp file
-
-    Returns:
-      the list contains the absolute path to the file and the file name
-    """
-    fi, path = tempfile.mkstemp(dir=directory, text=True)
-    with os.fdopen(fi, 'w') as f:
-      f.write(contents)
-    file_name = os.path.basename(path)
-    return (path, file_name)
-
-  @staticmethod
-  def _ChangeTempFile(path, contents):
-    with os.open(path, 'w') as f:
-      f.write(contents)
-
-  @staticmethod
-  def _DeleteTempFile(path):
-    os.remove(path)
-
-  def testPushChangedFiles_noFileChange(self):
-    (host_file_path, file_name) = self._MakeTempFile(_OLD_CONTENTS)
-    device_file_path = "%s/%s" % (_DEVICE_DIR, file_name)
-    self.adb.Push(host_file_path, device_file_path)
-    self.device.PushChangedFiles([(host_file_path, device_file_path)])
-    result = self.device.RunShellCommand(
-        ['cat', device_file_path], check_return=True, single_line=True)
-    self.assertEqual(_OLD_CONTENTS, result)
-
-    cmd_helper.RunCmd(['rm', host_file_path])
-    self.device.RemovePath(_DEVICE_DIR, recursive=True, force=True)
-
-  def testPushChangedFiles_singleFileChange(self):
-    (host_file_path, file_name) = self._MakeTempFile(_OLD_CONTENTS)
-    device_file_path = "%s/%s" % (_DEVICE_DIR, file_name)
-    self.adb.Push(host_file_path, device_file_path)
-
-    with open(host_file_path, 'w') as f:
-      f.write(_NEW_CONTENTS)
-    self.device.PushChangedFiles([(host_file_path, device_file_path)])
-    result = self.device.RunShellCommand(
-        ['cat', device_file_path], check_return=True, single_line=True)
-    self.assertEqual(_NEW_CONTENTS, result)
-
-    cmd_helper.RunCmd(['rm', host_file_path])
-    self.device.RemovePath(_DEVICE_DIR, recursive=True, force=True)
-
-  def testDeleteFiles(self):
-    host_tmp_dir = tempfile.mkdtemp()
-    (host_file_path, file_name) = self._MakeTempFileGivenDir(
-        host_tmp_dir, _OLD_CONTENTS)
-
-    device_file_path = "%s/%s" % (_DEVICE_DIR, file_name)
-    self.adb.Push(host_file_path, device_file_path)
-
-    cmd_helper.RunCmd(['rm', host_file_path])
-    self.device.PushChangedFiles([(host_tmp_dir, _DEVICE_DIR)],
-                                 delete_device_stale=True)
-    filenames = self.device.ListDirectory(_DEVICE_DIR)
-    self.assertEqual([], filenames)
-
-    cmd_helper.RunCmd(['rm', '-rf', host_tmp_dir])
-    self.device.RemovePath(_DEVICE_DIR, recursive=True, force=True)
-
-  def testPushAndDeleteFiles_noSubDir(self):
-    host_tmp_dir = tempfile.mkdtemp()
-    (host_file_path1, file_name1) = self._MakeTempFileGivenDir(
-        host_tmp_dir, _OLD_CONTENTS)
-    (host_file_path2, file_name2) = self._MakeTempFileGivenDir(
-        host_tmp_dir, _OLD_CONTENTS)
-
-    device_file_path1 = "%s/%s" % (_DEVICE_DIR, file_name1)
-    device_file_path2 = "%s/%s" % (_DEVICE_DIR, file_name2)
-    self.adb.Push(host_file_path1, device_file_path1)
-    self.adb.Push(host_file_path2, device_file_path2)
-
-    with open(host_file_path1, 'w') as f:
-      f.write(_NEW_CONTENTS)
-    cmd_helper.RunCmd(['rm', host_file_path2])
-
-    self.device.PushChangedFiles([(host_tmp_dir, _DEVICE_DIR)],
-                                   delete_device_stale=True)
-    result = self.device.RunShellCommand(
-        ['cat', device_file_path1], check_return=True, single_line=True)
-    self.assertEqual(_NEW_CONTENTS, result)
-
-    filenames = self.device.ListDirectory(_DEVICE_DIR)
-    self.assertEqual([file_name1], filenames)
-
-    cmd_helper.RunCmd(['rm', '-rf', host_tmp_dir])
-    self.device.RemovePath(_DEVICE_DIR, recursive=True, force=True)
-
-  def testPushAndDeleteFiles_SubDir(self):
-    host_tmp_dir = tempfile.mkdtemp()
-    host_sub_dir1 = "%s/%s" % (host_tmp_dir, _SUB_DIR1)
-    host_sub_dir2 = "%s/%s/%s" % (host_tmp_dir, _SUB_DIR, _SUB_DIR2)
-    cmd_helper.RunCmd(['mkdir', '-p', host_sub_dir1])
-    cmd_helper.RunCmd(['mkdir', '-p', host_sub_dir2])
-
-    (host_file_path1, file_name1) = self._MakeTempFileGivenDir(
-        host_tmp_dir, _OLD_CONTENTS)
-    (host_file_path2, file_name2) = self._MakeTempFileGivenDir(
-        host_tmp_dir, _OLD_CONTENTS)
-    (host_file_path3, file_name3) = self._MakeTempFileGivenDir(
-        host_sub_dir1, _OLD_CONTENTS)
-    (host_file_path4, file_name4) = self._MakeTempFileGivenDir(
-        host_sub_dir2, _OLD_CONTENTS)
-
-    device_file_path1 = "%s/%s" % (_DEVICE_DIR, file_name1)
-    device_file_path2 = "%s/%s" % (_DEVICE_DIR, file_name2)
-    device_file_path3 = "%s/%s/%s" % (_DEVICE_DIR, _SUB_DIR1, file_name3)
-    device_file_path4 = "%s/%s/%s/%s" % (_DEVICE_DIR, _SUB_DIR,
-                                         _SUB_DIR2, file_name4)
-
-    self.adb.Push(host_file_path1, device_file_path1)
-    self.adb.Push(host_file_path2, device_file_path2)
-    self.adb.Push(host_file_path3, device_file_path3)
-    self.adb.Push(host_file_path4, device_file_path4)
-
-    with open(host_file_path1, 'w') as f:
-      f.write(_NEW_CONTENTS)
-    cmd_helper.RunCmd(['rm', host_file_path2])
-    cmd_helper.RunCmd(['rm', host_file_path4])
-
-    self.device.PushChangedFiles([(host_tmp_dir, _DEVICE_DIR)],
-                                   delete_device_stale=True)
-    result = self.device.RunShellCommand(
-        ['cat', device_file_path1], check_return=True, single_line=True)
-    self.assertEqual(_NEW_CONTENTS, result)
-
-    filenames = self.device.ListDirectory(_DEVICE_DIR)
-    self.assertIn(file_name1, filenames)
-    self.assertIn(_SUB_DIR1, filenames)
-    self.assertIn(_SUB_DIR, filenames)
-    self.assertEqual(3, len(filenames))
-
-    result = self.device.RunShellCommand(
-        ['cat', device_file_path3], check_return=True, single_line=True)
-    self.assertEqual(_OLD_CONTENTS, result)
-
-    filenames = self.device.ListDirectory(
-        posixpath.join(_DEVICE_DIR, _SUB_DIR, _SUB_DIR2))
-    self.assertEqual([], filenames)
-
-    cmd_helper.RunCmd(['rm', '-rf', host_tmp_dir])
-    self.device.RemovePath(_DEVICE_DIR, recursive=True, force=True)
-
-  def testRestartAdbd(self):
-    def get_adbd_pid():
-      # TODO(catapult:#3215): Migrate to device.GetPids().
-      ps_output = self.device.RunShellCommand(['ps'], check_return=True)
-      for ps_line in ps_output:
-        if 'adbd' in ps_line:
-          return ps_line.split()[1]
-      self.fail('Unable to find adbd')
-
-    old_adbd_pid = get_adbd_pid()
-    self.device.RestartAdbd()
-    new_adbd_pid = get_adbd_pid()
-    self.assertNotEqual(old_adbd_pid, new_adbd_pid)
-
-
-if __name__ == '__main__':
-  unittest.main()
diff --git a/third_party/catapult/devil/devil/android/device_utils_test.py b/third_party/catapult/devil/devil/android/device_utils_test.py
deleted file mode 100755
index 2490209..0000000
--- a/third_party/catapult/devil/devil/android/device_utils_test.py
+++ /dev/null
@@ -1,2900 +0,0 @@
-#!/usr/bin/env python
-# 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.
-
-"""
-Unit tests for the contents of device_utils.py (mostly DeviceUtils).
-"""
-
-# pylint: disable=protected-access
-# pylint: disable=unused-argument
-
-import json
-import logging
-import os
-import stat
-import unittest
-
-from devil import devil_env
-from devil.android import device_errors
-from devil.android import device_signal
-from devil.android import device_utils
-from devil.android.sdk import adb_wrapper
-from devil.android.sdk import intent
-from devil.android.sdk import keyevent
-from devil.android.sdk import version_codes
-from devil.utils import cmd_helper
-from devil.utils import mock_calls
-
-with devil_env.SysPath(devil_env.PYMOCK_PATH):
-  import mock  # pylint: disable=import-error
-
-
-class AnyStringWith(object):
-  def __init__(self, value):
-    self._value = value
-
-  def __eq__(self, other):
-    return self._value in other
-
-  def __repr__(self):
-    return '<AnyStringWith: %s>' % self._value
-
-
-class _MockApkHelper(object):
-
-  def __init__(self, path, package_name, perms=None):
-    self.path = path
-    self.package_name = package_name
-    self.perms = perms
-
-  def GetPackageName(self):
-    return self.package_name
-
-  def GetPermissions(self):
-    return self.perms
-
-
-class _MockMultipleDevicesError(Exception):
-  pass
-
-
-class DeviceUtilsInitTest(unittest.TestCase):
-
-  def testInitWithStr(self):
-    serial_as_str = str('0123456789abcdef')
-    d = device_utils.DeviceUtils('0123456789abcdef')
-    self.assertEqual(serial_as_str, d.adb.GetDeviceSerial())
-
-  def testInitWithUnicode(self):
-    serial_as_unicode = unicode('fedcba9876543210')
-    d = device_utils.DeviceUtils(serial_as_unicode)
-    self.assertEqual(serial_as_unicode, d.adb.GetDeviceSerial())
-
-  def testInitWithAdbWrapper(self):
-    serial = '123456789abcdef0'
-    a = adb_wrapper.AdbWrapper(serial)
-    d = device_utils.DeviceUtils(a)
-    self.assertEqual(serial, d.adb.GetDeviceSerial())
-
-  def testInitWithMissing_fails(self):
-    with self.assertRaises(ValueError):
-      device_utils.DeviceUtils(None)
-    with self.assertRaises(ValueError):
-      device_utils.DeviceUtils('')
-
-
-class DeviceUtilsGetAVDsTest(mock_calls.TestCase):
-
-  def testGetAVDs(self):
-    mocked_attrs = {
-      'android_sdk': '/my/sdk/path'
-    }
-    with mock.patch('devil.devil_env._Environment.LocalPath',
-                    mock.Mock(side_effect=lambda a: mocked_attrs[a])):
-      with self.assertCall(
-          mock.call.devil.utils.cmd_helper.GetCmdOutput(
-              [mock.ANY, 'list', 'avd']),
-          'Available Android Virtual Devices:\n'
-          '    Name: my_android5.0\n'
-          '    Path: /some/path/to/.android/avd/my_android5.0.avd\n'
-          '  Target: Android 5.0 (API level 21)\n'
-          ' Tag/ABI: default/x86\n'
-          '    Skin: WVGA800\n'):
-        self.assertEquals(['my_android5.0'], device_utils.GetAVDs())
-
-
-class DeviceUtilsRestartServerTest(mock_calls.TestCase):
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testRestartServer_succeeds(self):
-    with self.assertCalls(
-        mock.call.devil.android.sdk.adb_wrapper.AdbWrapper.KillServer(),
-        (mock.call.devil.utils.cmd_helper.GetCmdStatusAndOutput(
-            ['pgrep', 'adb']),
-         (1, '')),
-        mock.call.devil.android.sdk.adb_wrapper.AdbWrapper.StartServer(),
-        (mock.call.devil.utils.cmd_helper.GetCmdStatusAndOutput(
-            ['pgrep', 'adb']),
-         (1, '')),
-        (mock.call.devil.utils.cmd_helper.GetCmdStatusAndOutput(
-            ['pgrep', 'adb']),
-         (0, '123\n'))):
-      device_utils.RestartServer()
-
-
-class MockTempFile(object):
-
-  def __init__(self, name='/tmp/some/file'):
-    self.file = mock.MagicMock(spec=file)
-    self.file.name = name
-    self.file.name_quoted = cmd_helper.SingleQuote(name)
-
-  def __enter__(self):
-    return self.file
-
-  def __exit__(self, exc_type, exc_val, exc_tb):
-    pass
-
-  @property
-  def name(self):
-    return self.file.name
-
-
-class _PatchedFunction(object):
-
-  def __init__(self, patched=None, mocked=None):
-    self.patched = patched
-    self.mocked = mocked
-
-
-def _AdbWrapperMock(test_serial, is_ready=True):
-  adb = mock.Mock(spec=adb_wrapper.AdbWrapper)
-  adb.__str__ = mock.Mock(return_value=test_serial)
-  adb.GetDeviceSerial.return_value = test_serial
-  adb.is_ready = is_ready
-  return adb
-
-
-class DeviceUtilsTest(mock_calls.TestCase):
-
-  def setUp(self):
-    self.adb = _AdbWrapperMock('0123456789abcdef')
-    self.device = device_utils.DeviceUtils(
-        self.adb, default_timeout=10, default_retries=0)
-    self.watchMethodCalls(self.call.adb, ignore=['GetDeviceSerial'])
-
-  def AdbCommandError(self, args=None, output=None, status=None, msg=None):
-    if args is None:
-      args = ['[unspecified]']
-    return mock.Mock(side_effect=device_errors.AdbCommandFailedError(
-        args, output, status, msg, str(self.device)))
-
-  def CommandError(self, msg=None):
-    if msg is None:
-      msg = 'Command failed'
-    return mock.Mock(side_effect=device_errors.CommandFailedError(
-        msg, str(self.device)))
-
-  def ShellError(self, output=None, status=1):
-    def action(cmd, *args, **kwargs):
-      raise device_errors.AdbShellCommandFailedError(
-          cmd, output, status, str(self.device))
-    if output is None:
-      output = 'Permission denied\n'
-    return action
-
-  def TimeoutError(self, msg=None):
-    if msg is None:
-      msg = 'Operation timed out'
-    return mock.Mock(side_effect=device_errors.CommandTimeoutError(
-        msg, str(self.device)))
-
-  def EnsureCacheInitialized(self, props=None, sdcard='/sdcard'):
-    props = props or []
-    ret = [sdcard, 'TOKEN'] + props
-    return (self.call.device.RunShellCommand(
-        AnyStringWith('getprop'),
-        shell=True, check_return=True, large_output=True), ret)
-
-
-class DeviceUtilsEqTest(DeviceUtilsTest):
-
-  def testEq_equal_deviceUtils(self):
-    other = device_utils.DeviceUtils(_AdbWrapperMock('0123456789abcdef'))
-    self.assertTrue(self.device == other)
-    self.assertTrue(other == self.device)
-
-  def testEq_equal_adbWrapper(self):
-    other = adb_wrapper.AdbWrapper('0123456789abcdef')
-    self.assertTrue(self.device == other)
-    self.assertTrue(other == self.device)
-
-  def testEq_equal_string(self):
-    other = '0123456789abcdef'
-    self.assertTrue(self.device == other)
-    self.assertTrue(other == self.device)
-
-  def testEq_devicesNotEqual(self):
-    other = device_utils.DeviceUtils(_AdbWrapperMock('0123456789abcdee'))
-    self.assertFalse(self.device == other)
-    self.assertFalse(other == self.device)
-
-  def testEq_identity(self):
-    self.assertTrue(self.device == self.device)
-
-  def testEq_serialInList(self):
-    devices = [self.device]
-    self.assertTrue('0123456789abcdef' in devices)
-
-
-class DeviceUtilsLtTest(DeviceUtilsTest):
-
-  def testLt_lessThan(self):
-    other = device_utils.DeviceUtils(_AdbWrapperMock('ffffffffffffffff'))
-    self.assertTrue(self.device < other)
-    self.assertTrue(other > self.device)
-
-  def testLt_greaterThan_lhs(self):
-    other = device_utils.DeviceUtils(_AdbWrapperMock('0000000000000000'))
-    self.assertFalse(self.device < other)
-    self.assertFalse(other > self.device)
-
-  def testLt_equal(self):
-    other = device_utils.DeviceUtils(_AdbWrapperMock('0123456789abcdef'))
-    self.assertFalse(self.device < other)
-    self.assertFalse(other > self.device)
-
-  def testLt_sorted(self):
-    devices = [
-        device_utils.DeviceUtils(_AdbWrapperMock('ffffffffffffffff')),
-        device_utils.DeviceUtils(_AdbWrapperMock('0000000000000000')),
-    ]
-    sorted_devices = sorted(devices)
-    self.assertEquals('0000000000000000',
-                      sorted_devices[0].adb.GetDeviceSerial())
-    self.assertEquals('ffffffffffffffff',
-                      sorted_devices[1].adb.GetDeviceSerial())
-
-
-class DeviceUtilsStrTest(DeviceUtilsTest):
-
-  def testStr_returnsSerial(self):
-    with self.assertCalls(
-        (self.call.adb.GetDeviceSerial(), '0123456789abcdef')):
-      self.assertEqual('0123456789abcdef', str(self.device))
-
-
-class DeviceUtilsIsOnlineTest(DeviceUtilsTest):
-
-  def testIsOnline_true(self):
-    with self.assertCall(self.call.adb.GetState(), 'device'):
-      self.assertTrue(self.device.IsOnline())
-
-  def testIsOnline_false(self):
-    with self.assertCall(self.call.adb.GetState(), 'offline'):
-      self.assertFalse(self.device.IsOnline())
-
-  def testIsOnline_error(self):
-    with self.assertCall(self.call.adb.GetState(), self.CommandError()):
-      self.assertFalse(self.device.IsOnline())
-
-
-class DeviceUtilsHasRootTest(DeviceUtilsTest):
-
-  def testHasRoot_true(self):
-    with self.patch_call(self.call.device.product_name,
-                          return_value='notasailfish'), (
-        self.assertCall(self.call.adb.Shell('ls /root'), 'foo\n')):
-      self.assertTrue(self.device.HasRoot())
-
-  def testhasRootSpecial_true(self):
-    with self.patch_call(self.call.device.product_name,
-                         return_value='sailfish'), (
-        self.assertCall(self.call.adb.Shell('getprop service.adb.root'),
-                        '1\n')):
-      self.assertTrue(self.device.HasRoot())
-
-  def testHasRoot_false(self):
-    with self.patch_call(self.call.device.product_name,
-                         return_value='notasailfish'), (
-        self.assertCall(self.call.adb.Shell('ls /root'),
-                        self.ShellError())):
-      self.assertFalse(self.device.HasRoot())
-
-  def testHasRootSpecial_false(self):
-    with self.patch_call(self.call.device.product_name,
-                         return_value='sailfish'), (
-        self.assertCall(self.call.adb.Shell('getprop service.adb.root'),
-                        '\n')):
-      self.assertFalse(self.device.HasRoot())
-
-
-class DeviceUtilsEnableRootTest(DeviceUtilsTest):
-
-  def testEnableRoot_succeeds(self):
-    with self.assertCalls(
-        (self.call.device.IsUserBuild(), False),
-         self.call.adb.Root(),
-         self.call.device.WaitUntilFullyBooted()):
-      self.device.EnableRoot()
-
-  def testEnableRoot_userBuild(self):
-    with self.assertCalls(
-        (self.call.device.IsUserBuild(), True)):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.device.EnableRoot()
-
-  def testEnableRoot_rootFails(self):
-    with self.assertCalls(
-        (self.call.device.IsUserBuild(), False),
-        (self.call.adb.Root(), self.CommandError())):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.device.EnableRoot()
-
-
-class DeviceUtilsIsUserBuildTest(DeviceUtilsTest):
-
-  def testIsUserBuild_yes(self):
-    with self.assertCall(
-        self.call.device.GetProp('ro.build.type', cache=True), 'user'):
-      self.assertTrue(self.device.IsUserBuild())
-
-  def testIsUserBuild_no(self):
-    with self.assertCall(
-        self.call.device.GetProp('ro.build.type', cache=True), 'userdebug'):
-      self.assertFalse(self.device.IsUserBuild())
-
-
-class DeviceUtilsGetExternalStoragePathTest(DeviceUtilsTest):
-
-  def testGetExternalStoragePath_succeeds(self):
-    with self.assertCalls(
-        self.EnsureCacheInitialized(sdcard='/fake/storage/path')):
-      self.assertEquals('/fake/storage/path',
-                        self.device.GetExternalStoragePath())
-
-  def testGetExternalStoragePath_fails(self):
-    with self.assertCalls(
-        self.EnsureCacheInitialized(sdcard='')):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.device.GetExternalStoragePath()
-
-
-class DeviceUtilsGetApplicationPathsInternalTest(DeviceUtilsTest):
-
-  def testGetApplicationPathsInternal_exists(self):
-    with self.assertCalls(
-        (self.call.device.GetProp('ro.build.version.sdk', cache=True), '19'),
-        (self.call.device.RunShellCommand(
-            ['pm', 'path', 'android'], check_return=True),
-         ['package:/path/to/android.apk'])):
-      self.assertEquals(['/path/to/android.apk'],
-                        self.device._GetApplicationPathsInternal('android'))
-
-  def testGetApplicationPathsInternal_notExists(self):
-    with self.assertCalls(
-        (self.call.device.GetProp('ro.build.version.sdk', cache=True), '19'),
-        (self.call.device.RunShellCommand(
-            ['pm', 'path', 'not.installed.app'], check_return=True),
-         '')):
-      self.assertEquals([],
-          self.device._GetApplicationPathsInternal('not.installed.app'))
-
-  def testGetApplicationPathsInternal_garbageFirstLine(self):
-    with self.assertCalls(
-        (self.call.device.GetProp('ro.build.version.sdk', cache=True), '19'),
-        (self.call.device.RunShellCommand(
-            ['pm', 'path', 'android'], check_return=True),
-         ['garbage first line'])):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.device._GetApplicationPathsInternal('android')
-
-  def testGetApplicationPathsInternal_fails(self):
-    with self.assertCalls(
-        (self.call.device.GetProp('ro.build.version.sdk', cache=True), '19'),
-        (self.call.device.RunShellCommand(
-            ['pm', 'path', 'android'], check_return=True),
-         self.CommandError('ERROR. Is package manager running?\n'))):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.device._GetApplicationPathsInternal('android')
-
-
-class DeviceUtils_GetApplicationVersionTest(DeviceUtilsTest):
-
-  def test_GetApplicationVersion_exists(self):
-    with self.assertCalls(
-        (self.call.adb.Shell('dumpsys package com.android.chrome'),
-         'Packages:\n'
-         '  Package [com.android.chrome] (3901ecfb):\n'
-         '    userId=1234 gids=[123, 456, 789]\n'
-         '    pkg=Package{1fecf634 com.android.chrome}\n'
-         '    versionName=45.0.1234.7\n')):
-      self.assertEquals('45.0.1234.7',
-                        self.device.GetApplicationVersion('com.android.chrome'))
-
-  def test_GetApplicationVersion_notExists(self):
-    with self.assertCalls(
-        (self.call.adb.Shell('dumpsys package com.android.chrome'), '')):
-      self.assertEquals(None,
-                        self.device.GetApplicationVersion('com.android.chrome'))
-
-  def test_GetApplicationVersion_fails(self):
-    with self.assertCalls(
-        (self.call.adb.Shell('dumpsys package com.android.chrome'),
-         'Packages:\n'
-         '  Package [com.android.chrome] (3901ecfb):\n'
-         '    userId=1234 gids=[123, 456, 789]\n'
-         '    pkg=Package{1fecf634 com.android.chrome}\n')):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.device.GetApplicationVersion('com.android.chrome')
-
-
-class DeviceUtilsGetApplicationDataDirectoryTest(DeviceUtilsTest):
-
-  def testGetApplicationDataDirectory_exists(self):
-    with self.assertCall(
-        self.call.device._RunPipedShellCommand(
-            'pm dump foo.bar.baz | grep dataDir='),
-        ['dataDir=/data/data/foo.bar.baz']):
-      self.assertEquals(
-          '/data/data/foo.bar.baz',
-          self.device.GetApplicationDataDirectory('foo.bar.baz'))
-
-  def testGetApplicationDataDirectory_notExists(self):
-    with self.assertCall(
-        self.call.device._RunPipedShellCommand(
-            'pm dump foo.bar.baz | grep dataDir='),
-        self.ShellError()):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.device.GetApplicationDataDirectory('foo.bar.baz')
-
-
-@mock.patch('time.sleep', mock.Mock())
-class DeviceUtilsWaitUntilFullyBootedTest(DeviceUtilsTest):
-
-  def testWaitUntilFullyBooted_succeedsNoWifi(self):
-    with self.assertCalls(
-        self.call.adb.WaitForDevice(),
-        # sd_card_ready
-        (self.call.device.GetExternalStoragePath(), '/fake/storage/path'),
-        (self.call.adb.Shell('test -d /fake/storage/path'), ''),
-        # pm_ready
-        (self.call.device._GetApplicationPathsInternal('android',
-                                                       skip_cache=True),
-         ['package:/some/fake/path']),
-        # boot_completed
-        (self.call.device.GetProp('sys.boot_completed', cache=False), '1')):
-      self.device.WaitUntilFullyBooted(wifi=False)
-
-  def testWaitUntilFullyBooted_succeedsWithWifi(self):
-    with self.assertCalls(
-        self.call.adb.WaitForDevice(),
-        # sd_card_ready
-        (self.call.device.GetExternalStoragePath(), '/fake/storage/path'),
-        (self.call.adb.Shell('test -d /fake/storage/path'), ''),
-        # pm_ready
-        (self.call.device._GetApplicationPathsInternal('android',
-                                                       skip_cache=True),
-         ['package:/some/fake/path']),
-        # boot_completed
-        (self.call.device.GetProp('sys.boot_completed', cache=False), '1'),
-        # wifi_enabled
-        (self.call.adb.Shell('dumpsys wifi'),
-         'stuff\nWi-Fi is enabled\nmore stuff\n')):
-      self.device.WaitUntilFullyBooted(wifi=True)
-
-  def testWaitUntilFullyBooted_deviceNotInitiallyAvailable(self):
-    with self.assertCalls(
-        self.call.adb.WaitForDevice(),
-        # sd_card_ready
-        (self.call.device.GetExternalStoragePath(), self.AdbCommandError()),
-        # sd_card_ready
-        (self.call.device.GetExternalStoragePath(), self.AdbCommandError()),
-        # sd_card_ready
-        (self.call.device.GetExternalStoragePath(), self.AdbCommandError()),
-        # sd_card_ready
-        (self.call.device.GetExternalStoragePath(), self.AdbCommandError()),
-        # sd_card_ready
-        (self.call.device.GetExternalStoragePath(), '/fake/storage/path'),
-        (self.call.adb.Shell('test -d /fake/storage/path'), ''),
-        # pm_ready
-        (self.call.device._GetApplicationPathsInternal('android',
-                                                       skip_cache=True),
-         ['package:/some/fake/path']),
-        # boot_completed
-        (self.call.device.GetProp('sys.boot_completed', cache=False), '1')):
-      self.device.WaitUntilFullyBooted(wifi=False)
-
-  def testWaitUntilFullyBooted_deviceBrieflyOffline(self):
-    with self.assertCalls(
-        self.call.adb.WaitForDevice(),
-        # sd_card_ready
-        (self.call.device.GetExternalStoragePath(), '/fake/storage/path'),
-        (self.call.adb.Shell('test -d /fake/storage/path'), ''),
-        # pm_ready
-        (self.call.device._GetApplicationPathsInternal('android',
-                                                       skip_cache=True),
-         ['package:/some/fake/path']),
-        # boot_completed
-        (self.call.device.GetProp('sys.boot_completed', cache=False),
-         self.AdbCommandError()),
-        # boot_completed
-        (self.call.device.GetProp('sys.boot_completed', cache=False), '1')):
-      self.device.WaitUntilFullyBooted(wifi=False)
-
-  def testWaitUntilFullyBooted_sdCardReadyFails_noPath(self):
-    with self.assertCalls(
-        self.call.adb.WaitForDevice(),
-        # sd_card_ready
-        (self.call.device.GetExternalStoragePath(), self.CommandError())):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.device.WaitUntilFullyBooted(wifi=False)
-
-  def testWaitUntilFullyBooted_sdCardReadyFails_notExists(self):
-    with self.assertCalls(
-        self.call.adb.WaitForDevice(),
-        # sd_card_ready
-        (self.call.device.GetExternalStoragePath(), '/fake/storage/path'),
-        (self.call.adb.Shell('test -d /fake/storage/path'), self.ShellError()),
-        # sd_card_ready
-        (self.call.device.GetExternalStoragePath(), '/fake/storage/path'),
-        (self.call.adb.Shell('test -d /fake/storage/path'), self.ShellError()),
-        # sd_card_ready
-        (self.call.device.GetExternalStoragePath(), '/fake/storage/path'),
-        (self.call.adb.Shell('test -d /fake/storage/path'),
-         self.TimeoutError())):
-      with self.assertRaises(device_errors.CommandTimeoutError):
-        self.device.WaitUntilFullyBooted(wifi=False)
-
-  def testWaitUntilFullyBooted_devicePmFails(self):
-    with self.assertCalls(
-        self.call.adb.WaitForDevice(),
-        # sd_card_ready
-        (self.call.device.GetExternalStoragePath(), '/fake/storage/path'),
-        (self.call.adb.Shell('test -d /fake/storage/path'), ''),
-        # pm_ready
-        (self.call.device._GetApplicationPathsInternal('android',
-                                                       skip_cache=True),
-         self.CommandError()),
-        # pm_ready
-        (self.call.device._GetApplicationPathsInternal('android',
-                                                       skip_cache=True),
-         self.CommandError()),
-        # pm_ready
-        (self.call.device._GetApplicationPathsInternal('android',
-                                                       skip_cache=True),
-         self.TimeoutError())):
-      with self.assertRaises(device_errors.CommandTimeoutError):
-        self.device.WaitUntilFullyBooted(wifi=False)
-
-  def testWaitUntilFullyBooted_bootFails(self):
-    with self.assertCalls(
-        self.call.adb.WaitForDevice(),
-        # sd_card_ready
-        (self.call.device.GetExternalStoragePath(), '/fake/storage/path'),
-        (self.call.adb.Shell('test -d /fake/storage/path'), ''),
-        # pm_ready
-        (self.call.device._GetApplicationPathsInternal('android',
-                                                       skip_cache=True),
-         ['package:/some/fake/path']),
-        # boot_completed
-        (self.call.device.GetProp('sys.boot_completed', cache=False), '0'),
-        # boot_completed
-        (self.call.device.GetProp('sys.boot_completed', cache=False), '0'),
-        # boot_completed
-        (self.call.device.GetProp('sys.boot_completed', cache=False),
-         self.TimeoutError())):
-      with self.assertRaises(device_errors.CommandTimeoutError):
-        self.device.WaitUntilFullyBooted(wifi=False)
-
-  def testWaitUntilFullyBooted_wifiFails(self):
-    with self.assertCalls(
-        self.call.adb.WaitForDevice(),
-        # sd_card_ready
-        (self.call.device.GetExternalStoragePath(), '/fake/storage/path'),
-        (self.call.adb.Shell('test -d /fake/storage/path'), ''),
-        # pm_ready
-        (self.call.device._GetApplicationPathsInternal('android',
-                                                       skip_cache=True),
-         ['package:/some/fake/path']),
-        # boot_completed
-        (self.call.device.GetProp('sys.boot_completed', cache=False), '1'),
-        # wifi_enabled
-        (self.call.adb.Shell('dumpsys wifi'), 'stuff\nmore stuff\n'),
-        # wifi_enabled
-        (self.call.adb.Shell('dumpsys wifi'), 'stuff\nmore stuff\n'),
-        # wifi_enabled
-        (self.call.adb.Shell('dumpsys wifi'), self.TimeoutError())):
-      with self.assertRaises(device_errors.CommandTimeoutError):
-        self.device.WaitUntilFullyBooted(wifi=True)
-
-
-@mock.patch('time.sleep', mock.Mock())
-class DeviceUtilsRebootTest(DeviceUtilsTest):
-
-  def testReboot_nonBlocking(self):
-    with self.assertCalls(
-        self.call.adb.Reboot(),
-        (self.call.device.IsOnline(), True),
-        (self.call.device.IsOnline(), False)):
-      self.device.Reboot(block=False)
-
-  def testReboot_blocking(self):
-    with self.assertCalls(
-        self.call.adb.Reboot(),
-        (self.call.device.IsOnline(), True),
-        (self.call.device.IsOnline(), False),
-        self.call.device.WaitUntilFullyBooted(wifi=False)):
-      self.device.Reboot(block=True)
-
-  def testReboot_blockUntilWifi(self):
-    with self.assertCalls(
-        self.call.adb.Reboot(),
-        (self.call.device.IsOnline(), True),
-        (self.call.device.IsOnline(), False),
-        self.call.device.WaitUntilFullyBooted(wifi=True)):
-      self.device.Reboot(block=True, wifi=True)
-
-
-class DeviceUtilsInstallTest(DeviceUtilsTest):
-
-  mock_apk = _MockApkHelper('/fake/test/app.apk', 'test.package', ['p1'])
-
-  def testInstall_noPriorInstall(self):
-    with self.patch_call(self.call.device.build_version_sdk, return_value=23):
-      with self.assertCalls(
-          (mock.call.os.path.exists('/fake/test/app.apk'), True),
-          (self.call.device._GetApplicationPathsInternal('test.package'), []),
-          self.call.adb.Install('/fake/test/app.apk', reinstall=False,
-                                allow_downgrade=False),
-          (self.call.device.GrantPermissions('test.package', ['p1']), [])):
-        self.device.Install(DeviceUtilsInstallTest.mock_apk, retries=0)
-
-  def testInstall_permissionsPreM(self):
-    with self.patch_call(self.call.device.build_version_sdk, return_value=20):
-      with self.assertCalls(
-          (mock.call.os.path.exists('/fake/test/app.apk'), True),
-          (self.call.device._GetApplicationPathsInternal('test.package'), []),
-          (self.call.adb.Install('/fake/test/app.apk', reinstall=False,
-                                 allow_downgrade=False))):
-        self.device.Install(DeviceUtilsInstallTest.mock_apk, retries=0)
-
-  def testInstall_findPermissions(self):
-    with self.patch_call(self.call.device.build_version_sdk, return_value=23):
-      with self.assertCalls(
-          (mock.call.os.path.exists('/fake/test/app.apk'), True),
-          (self.call.device._GetApplicationPathsInternal('test.package'), []),
-          (self.call.adb.Install('/fake/test/app.apk', reinstall=False,
-                                 allow_downgrade=False)),
-          (self.call.device.GrantPermissions('test.package', ['p1']), [])):
-        self.device.Install(DeviceUtilsInstallTest.mock_apk, retries=0)
-
-  def testInstall_passPermissions(self):
-    with self.assertCalls(
-        (mock.call.os.path.exists('/fake/test/app.apk'), True),
-        (self.call.device._GetApplicationPathsInternal('test.package'), []),
-        (self.call.adb.Install('/fake/test/app.apk', reinstall=False,
-                               allow_downgrade=False)),
-        (self.call.device.GrantPermissions('test.package', ['p1', 'p2']), [])):
-      self.device.Install(DeviceUtilsInstallTest.mock_apk, retries=0,
-                          permissions=['p1', 'p2'])
-
-  def testInstall_differentPriorInstall(self):
-    with self.assertCalls(
-        (mock.call.os.path.exists('/fake/test/app.apk'), True),
-        (self.call.device._GetApplicationPathsInternal('test.package'),
-         ['/fake/data/app/test.package.apk']),
-        (self.call.device._ComputeStaleApks('test.package',
-            ['/fake/test/app.apk']),
-         (['/fake/test/app.apk'], None)),
-        self.call.device.Uninstall('test.package'),
-        self.call.adb.Install('/fake/test/app.apk', reinstall=False,
-                              allow_downgrade=False)):
-      self.device.Install(DeviceUtilsInstallTest.mock_apk, retries=0,
-                          permissions=[])
-
-  def testInstall_differentPriorInstall_reinstall(self):
-    with self.assertCalls(
-        (mock.call.os.path.exists('/fake/test/app.apk'), True),
-        (self.call.device._GetApplicationPathsInternal('test.package'),
-         ['/fake/data/app/test.package.apk']),
-        (self.call.device._ComputeStaleApks('test.package',
-            ['/fake/test/app.apk']),
-         (['/fake/test/app.apk'], None)),
-        self.call.adb.Install('/fake/test/app.apk', reinstall=True,
-                              allow_downgrade=False)):
-      self.device.Install(DeviceUtilsInstallTest.mock_apk,
-          reinstall=True, retries=0, permissions=[])
-
-  def testInstall_identicalPriorInstall_reinstall(self):
-    with self.assertCalls(
-        (mock.call.os.path.exists('/fake/test/app.apk'), True),
-        (self.call.device._GetApplicationPathsInternal('test.package'),
-         ['/fake/data/app/test.package.apk']),
-        (self.call.device._ComputeStaleApks('test.package',
-            ['/fake/test/app.apk']),
-         ([], None)),
-        (self.call.device.ForceStop('test.package'))):
-      self.device.Install(DeviceUtilsInstallTest.mock_apk,
-          reinstall=True, retries=0, permissions=[])
-
-  def testInstall_missingApk(self):
-    with self.assertCalls(
-        (mock.call.os.path.exists('/fake/test/app.apk'), False)):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.device.Install(DeviceUtilsInstallTest.mock_apk, retries=0)
-
-  def testInstall_fails(self):
-    with self.assertCalls(
-        (mock.call.os.path.exists('/fake/test/app.apk'), True),
-        (self.call.device._GetApplicationPathsInternal('test.package'), []),
-        (self.call.adb.Install('/fake/test/app.apk', reinstall=False,
-                               allow_downgrade=False),
-         self.CommandError('Failure\r\n'))):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.device.Install(DeviceUtilsInstallTest.mock_apk, retries=0)
-
-  def testInstall_downgrade(self):
-    with self.assertCalls(
-        (mock.call.os.path.exists('/fake/test/app.apk'), True),
-        (self.call.device._GetApplicationPathsInternal('test.package'),
-         ['/fake/data/app/test.package.apk']),
-        (self.call.device._ComputeStaleApks('test.package',
-            ['/fake/test/app.apk']),
-         (['/fake/test/app.apk'], None)),
-        self.call.adb.Install('/fake/test/app.apk', reinstall=True,
-                              allow_downgrade=True)):
-      self.device.Install(DeviceUtilsInstallTest.mock_apk,
-          reinstall=True, retries=0, permissions=[], allow_downgrade=True)
-
-
-class DeviceUtilsInstallSplitApkTest(DeviceUtilsTest):
-
-  mock_apk = _MockApkHelper('base.apk', 'test.package', ['p1'])
-
-  def testInstallSplitApk_noPriorInstall(self):
-    with self.assertCalls(
-        (self.call.device._CheckSdkLevel(21)),
-        (mock.call.devil.android.sdk.split_select.SelectSplits(
-            self.device, 'base.apk',
-            ['split1.apk', 'split2.apk', 'split3.apk'],
-            allow_cached_props=False),
-         ['split2.apk']),
-        (mock.call.os.path.exists('base.apk'), True),
-        (mock.call.os.path.exists('split2.apk'), True),
-        (self.call.device._GetApplicationPathsInternal('test.package'), []),
-        (self.call.adb.InstallMultiple(
-            ['base.apk', 'split2.apk'], partial=None, reinstall=False,
-            allow_downgrade=False))):
-      self.device.InstallSplitApk(DeviceUtilsInstallSplitApkTest.mock_apk,
-          ['split1.apk', 'split2.apk', 'split3.apk'], permissions=[], retries=0)
-
-  def testInstallSplitApk_partialInstall(self):
-    with self.assertCalls(
-        (self.call.device._CheckSdkLevel(21)),
-        (mock.call.devil.android.sdk.split_select.SelectSplits(
-            self.device, 'base.apk',
-            ['split1.apk', 'split2.apk', 'split3.apk'],
-            allow_cached_props=False),
-         ['split2.apk']),
-        (mock.call.os.path.exists('base.apk'), True),
-        (mock.call.os.path.exists('split2.apk'), True),
-        (self.call.device._GetApplicationPathsInternal('test.package'),
-         ['base-on-device.apk', 'split2-on-device.apk']),
-        (self.call.device._ComputeStaleApks('test.package',
-                                            ['base.apk', 'split2.apk']),
-         (['split2.apk'], None)),
-        (self.call.adb.InstallMultiple(
-            ['split2.apk'], partial='test.package', reinstall=True,
-            allow_downgrade=False))):
-      self.device.InstallSplitApk(DeviceUtilsInstallSplitApkTest.mock_apk,
-                                  ['split1.apk', 'split2.apk', 'split3.apk'],
-                                  reinstall=True, permissions=[], retries=0)
-
-  def testInstallSplitApk_downgrade(self):
-    with self.assertCalls(
-        (self.call.device._CheckSdkLevel(21)),
-        (mock.call.devil.android.sdk.split_select.SelectSplits(
-            self.device, 'base.apk',
-            ['split1.apk', 'split2.apk', 'split3.apk'],
-            allow_cached_props=False),
-         ['split2.apk']),
-        (mock.call.os.path.exists('base.apk'), True),
-        (mock.call.os.path.exists('split2.apk'), True),
-        (self.call.device._GetApplicationPathsInternal('test.package'),
-         ['base-on-device.apk', 'split2-on-device.apk']),
-        (self.call.device._ComputeStaleApks('test.package',
-                                            ['base.apk', 'split2.apk']),
-         (['split2.apk'], None)),
-        (self.call.adb.InstallMultiple(
-            ['split2.apk'], partial='test.package', reinstall=True,
-            allow_downgrade=True))):
-      self.device.InstallSplitApk(DeviceUtilsInstallSplitApkTest.mock_apk,
-                                  ['split1.apk', 'split2.apk', 'split3.apk'],
-                                  reinstall=True, permissions=[], retries=0,
-                                  allow_downgrade=True)
-
-  def testInstallSplitApk_missingSplit(self):
-    with self.assertCalls(
-        (self.call.device._CheckSdkLevel(21)),
-        (mock.call.devil.android.sdk.split_select.SelectSplits(
-            self.device, 'base.apk',
-            ['split1.apk', 'split2.apk', 'split3.apk'],
-            allow_cached_props=False),
-         ['split2.apk']),
-        (mock.call.os.path.exists('base.apk'), True),
-        (mock.call.os.path.exists('split2.apk'), False)):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.device.InstallSplitApk(DeviceUtilsInstallSplitApkTest.mock_apk,
-            ['split1.apk', 'split2.apk', 'split3.apk'], permissions=[],
-            retries=0)
-
-
-class DeviceUtilsUninstallTest(DeviceUtilsTest):
-
-  def testUninstall_callsThrough(self):
-    with self.assertCalls(
-        (self.call.device._GetApplicationPathsInternal('test.package'),
-         ['/path.apk']),
-        self.call.adb.Uninstall('test.package', True)):
-      self.device.Uninstall('test.package', True)
-
-  def testUninstall_noop(self):
-    with self.assertCalls(
-        (self.call.device._GetApplicationPathsInternal('test.package'), [])):
-      self.device.Uninstall('test.package', True)
-
-
-class DeviceUtilsSuTest(DeviceUtilsTest):
-
-  def testSu_preM(self):
-    with self.patch_call(
-        self.call.device.build_version_sdk,
-        return_value=version_codes.LOLLIPOP_MR1):
-      self.assertEquals('su -c foo', self.device._Su('foo'))
-
-  def testSu_mAndAbove(self):
-    with self.patch_call(
-        self.call.device.build_version_sdk,
-        return_value=version_codes.MARSHMALLOW):
-      self.assertEquals('su 0 foo', self.device._Su('foo'))
-
-
-class DeviceUtilsRunShellCommandTest(DeviceUtilsTest):
-
-  def setUp(self):
-    super(DeviceUtilsRunShellCommandTest, self).setUp()
-    self.device.NeedsSU = mock.Mock(return_value=False)
-
-  def testRunShellCommand_commandAsList(self):
-    with self.assertCall(self.call.adb.Shell('pm list packages'), ''):
-      self.device.RunShellCommand(
-          ['pm', 'list', 'packages'], check_return=True)
-
-  def testRunShellCommand_commandAsListQuoted(self):
-    with self.assertCall(self.call.adb.Shell("echo 'hello world' '$10'"), ''):
-      self.device.RunShellCommand(
-          ['echo', 'hello world', '$10'], check_return=True)
-
-  def testRunShellCommand_commandAsString(self):
-    with self.assertCall(self.call.adb.Shell('echo "$VAR"'), ''):
-      self.device.RunShellCommand(
-          'echo "$VAR"', shell=True, check_return=True)
-
-  def testNewRunShellImpl_withEnv(self):
-    with self.assertCall(
-        self.call.adb.Shell('VAR=some_string echo "$VAR"'), ''):
-      self.device.RunShellCommand(
-          'echo "$VAR"', shell=True, check_return=True,
-          env={'VAR': 'some_string'})
-
-  def testNewRunShellImpl_withEnvQuoted(self):
-    with self.assertCall(
-        self.call.adb.Shell('PATH="$PATH:/other/path" run_this'), ''):
-      self.device.RunShellCommand(
-          ['run_this'], check_return=True, env={'PATH': '$PATH:/other/path'})
-
-  def testNewRunShellImpl_withEnv_failure(self):
-    with self.assertRaises(KeyError):
-      self.device.RunShellCommand(
-          ['some_cmd'], check_return=True, env={'INVALID NAME': 'value'})
-
-  def testNewRunShellImpl_withCwd(self):
-    with self.assertCall(self.call.adb.Shell('cd /some/test/path && ls'), ''):
-      self.device.RunShellCommand(
-          ['ls'], check_return=True, cwd='/some/test/path')
-
-  def testNewRunShellImpl_withCwdQuoted(self):
-    with self.assertCall(
-        self.call.adb.Shell("cd '/some test/path with/spaces' && ls"), ''):
-      self.device.RunShellCommand(
-          ['ls'], check_return=True, cwd='/some test/path with/spaces')
-
-  def testRunShellCommand_withHugeCmd(self):
-    payload = 'hi! ' * 1024
-    expected_cmd = "echo '%s'" % payload
-    with self.assertCalls(
-      (mock.call.devil.android.device_temp_file.DeviceTempFile(
-          self.adb, suffix='.sh'), MockTempFile('/sdcard/temp-123.sh')),
-      self.call.device._WriteFileWithPush('/sdcard/temp-123.sh', expected_cmd),
-      (self.call.adb.Shell('sh /sdcard/temp-123.sh'), payload + '\n')):
-      self.assertEquals(
-          [payload],
-          self.device.RunShellCommand(['echo', payload], check_return=True))
-
-  def testRunShellCommand_withHugeCmdAndSu(self):
-    payload = 'hi! ' * 1024
-    expected_cmd_without_su = """sh -c 'echo '"'"'%s'"'"''""" % payload
-    expected_cmd = 'su -c %s' % expected_cmd_without_su
-    with self.assertCalls(
-      (self.call.device.NeedsSU(), True),
-      (self.call.device._Su(expected_cmd_without_su), expected_cmd),
-      (mock.call.devil.android.device_temp_file.DeviceTempFile(
-          self.adb, suffix='.sh'), MockTempFile('/sdcard/temp-123.sh')),
-      self.call.device._WriteFileWithPush('/sdcard/temp-123.sh', expected_cmd),
-      (self.call.adb.Shell('sh /sdcard/temp-123.sh'), payload + '\n')):
-      self.assertEquals(
-          [payload],
-          self.device.RunShellCommand(
-              ['echo', payload], check_return=True, as_root=True))
-
-  def testRunShellCommand_withSu(self):
-    expected_cmd_without_su = "sh -c 'setprop service.adb.root 0'"
-    expected_cmd = 'su -c %s' % expected_cmd_without_su
-    with self.assertCalls(
-        (self.call.device.NeedsSU(), True),
-        (self.call.device._Su(expected_cmd_without_su), expected_cmd),
-        (self.call.adb.Shell(expected_cmd), '')):
-      self.device.RunShellCommand(
-          ['setprop', 'service.adb.root', '0'],
-          check_return=True, as_root=True)
-
-  def testRunShellCommand_withRunAs(self):
-    expected_cmd_without_run_as = "sh -c 'mkdir -p files'"
-    expected_cmd = (
-        'run-as org.devil.test_package %s' % expected_cmd_without_run_as)
-    with self.assertCall(self.call.adb.Shell(expected_cmd), ''):
-      self.device.RunShellCommand(
-          ['mkdir', '-p', 'files'],
-          check_return=True, run_as='org.devil.test_package')
-
-  def testRunShellCommand_withRunAsAndSu(self):
-    expected_cmd_with_nothing = "sh -c 'mkdir -p files'"
-    expected_cmd_with_run_as = (
-        'run-as org.devil.test_package %s' % expected_cmd_with_nothing)
-    expected_cmd_without_su = (
-        'sh -c %s' % cmd_helper.SingleQuote(expected_cmd_with_run_as))
-    expected_cmd = 'su -c %s' % expected_cmd_without_su
-    with self.assertCalls(
-        (self.call.device.NeedsSU(), True),
-        (self.call.device._Su(expected_cmd_without_su), expected_cmd),
-        (self.call.adb.Shell(expected_cmd), '')):
-      self.device.RunShellCommand(
-          ['mkdir', '-p', 'files'],
-          check_return=True, run_as='org.devil.test_package',
-          as_root=True)
-
-  def testRunShellCommand_manyLines(self):
-    cmd = 'ls /some/path'
-    with self.assertCall(self.call.adb.Shell(cmd), 'file1\nfile2\nfile3\n'):
-      self.assertEquals(
-          ['file1', 'file2', 'file3'],
-          self.device.RunShellCommand(cmd.split(), check_return=True))
-
-  def testRunShellCommand_manyLinesRawOutput(self):
-    cmd = 'ls /some/path'
-    with self.assertCall(self.call.adb.Shell(cmd), '\rfile1\nfile2\r\nfile3\n'):
-      self.assertEquals(
-          '\rfile1\nfile2\r\nfile3\n',
-          self.device.RunShellCommand(
-              cmd.split(), check_return=True, raw_output=True))
-
-  def testRunShellCommand_singleLine_success(self):
-    cmd = 'echo $VALUE'
-    with self.assertCall(self.call.adb.Shell(cmd), 'some value\n'):
-      self.assertEquals(
-          'some value',
-          self.device.RunShellCommand(
-              cmd, shell=True, check_return=True, single_line=True))
-
-  def testRunShellCommand_singleLine_successEmptyLine(self):
-    cmd = 'echo $VALUE'
-    with self.assertCall(self.call.adb.Shell(cmd), '\n'):
-      self.assertEquals(
-          '',
-          self.device.RunShellCommand(
-              cmd, shell=True, check_return=True, single_line=True))
-
-  def testRunShellCommand_singleLine_successWithoutEndLine(self):
-    cmd = 'echo -n $VALUE'
-    with self.assertCall(self.call.adb.Shell(cmd), 'some value'):
-      self.assertEquals(
-          'some value',
-          self.device.RunShellCommand(
-              cmd, shell=True, check_return=True, single_line=True))
-
-  def testRunShellCommand_singleLine_successNoOutput(self):
-    cmd = 'echo -n $VALUE'
-    with self.assertCall(self.call.adb.Shell(cmd), ''):
-      self.assertEquals(
-          '',
-          self.device.RunShellCommand(
-              cmd, shell=True, check_return=True, single_line=True))
-
-  def testRunShellCommand_singleLine_failTooManyLines(self):
-    cmd = 'echo $VALUE'
-    with self.assertCall(self.call.adb.Shell(cmd),
-                         'some value\nanother value\n'):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.device.RunShellCommand(
-            cmd, shell=True, check_return=True, single_line=True)
-
-  def testRunShellCommand_checkReturn_success(self):
-    cmd = 'echo $ANDROID_DATA'
-    output = '/data\n'
-    with self.assertCall(self.call.adb.Shell(cmd), output):
-      self.assertEquals(
-          [output.rstrip()],
-          self.device.RunShellCommand(cmd, shell=True, check_return=True))
-
-  def testRunShellCommand_checkReturn_failure(self):
-    cmd = 'ls /root'
-    output = 'opendir failed, Permission denied\n'
-    with self.assertCall(self.call.adb.Shell(cmd), self.ShellError(output)):
-      with self.assertRaises(device_errors.AdbCommandFailedError):
-        self.device.RunShellCommand(cmd.split(), check_return=True)
-
-  def testRunShellCommand_checkReturn_disabled(self):
-    cmd = 'ls /root'
-    output = 'opendir failed, Permission denied\n'
-    with self.assertCall(self.call.adb.Shell(cmd), self.ShellError(output)):
-      self.assertEquals(
-          [output.rstrip()],
-          self.device.RunShellCommand(cmd.split(), check_return=False))
-
-  def testRunShellCommand_largeOutput_enabled(self):
-    cmd = 'echo $VALUE'
-    temp_file = MockTempFile('/sdcard/temp-123')
-    cmd_redirect = '( %s )>%s' % (cmd, temp_file.name)
-    with self.assertCalls(
-        (mock.call.devil.android.device_temp_file.DeviceTempFile(self.adb),
-            temp_file),
-        (self.call.adb.Shell(cmd_redirect)),
-        (self.call.device.ReadFile(temp_file.name, force_pull=True),
-         'something')):
-      self.assertEquals(
-          ['something'],
-          self.device.RunShellCommand(
-              cmd, shell=True, large_output=True, check_return=True))
-
-  def testRunShellCommand_largeOutput_disabledNoTrigger(self):
-    cmd = 'something'
-    with self.assertCall(self.call.adb.Shell(cmd), self.ShellError('')):
-      with self.assertRaises(device_errors.AdbCommandFailedError):
-        self.device.RunShellCommand([cmd], check_return=True)
-
-  def testRunShellCommand_largeOutput_disabledTrigger(self):
-    cmd = 'echo $VALUE'
-    temp_file = MockTempFile('/sdcard/temp-123')
-    cmd_redirect = '( %s )>%s' % (cmd, temp_file.name)
-    with self.assertCalls(
-        (self.call.adb.Shell(cmd), self.ShellError('', None)),
-        (mock.call.devil.android.device_temp_file.DeviceTempFile(self.adb),
-            temp_file),
-        (self.call.adb.Shell(cmd_redirect)),
-        (self.call.device.ReadFile(mock.ANY, force_pull=True),
-         'something')):
-      self.assertEquals(
-          ['something'],
-          self.device.RunShellCommand(cmd, shell=True, check_return=True))
-
-
-class DeviceUtilsRunPipedShellCommandTest(DeviceUtilsTest):
-
-  def testRunPipedShellCommand_success(self):
-    with self.assertCall(
-        self.call.device.RunShellCommand(
-            'ps | grep foo; echo "PIPESTATUS: ${PIPESTATUS[@]}"',
-            shell=True, check_return=True),
-        ['This line contains foo', 'PIPESTATUS: 0 0']):
-      self.assertEquals(['This line contains foo'],
-                        self.device._RunPipedShellCommand('ps | grep foo'))
-
-  def testRunPipedShellCommand_firstCommandFails(self):
-    with self.assertCall(
-        self.call.device.RunShellCommand(
-            'ps | grep foo; echo "PIPESTATUS: ${PIPESTATUS[@]}"',
-            shell=True, check_return=True),
-        ['PIPESTATUS: 1 0']):
-      with self.assertRaises(device_errors.AdbShellCommandFailedError) as ec:
-        self.device._RunPipedShellCommand('ps | grep foo')
-      self.assertEquals([1, 0], ec.exception.status)
-
-  def testRunPipedShellCommand_secondCommandFails(self):
-    with self.assertCall(
-        self.call.device.RunShellCommand(
-            'ps | grep foo; echo "PIPESTATUS: ${PIPESTATUS[@]}"',
-            shell=True, check_return=True),
-        ['PIPESTATUS: 0 1']):
-      with self.assertRaises(device_errors.AdbShellCommandFailedError) as ec:
-        self.device._RunPipedShellCommand('ps | grep foo')
-      self.assertEquals([0, 1], ec.exception.status)
-
-  def testRunPipedShellCommand_outputCutOff(self):
-    with self.assertCall(
-        self.call.device.RunShellCommand(
-            'ps | grep foo; echo "PIPESTATUS: ${PIPESTATUS[@]}"',
-            shell=True, check_return=True),
-        ['foo.bar'] * 256 + ['foo.ba']):
-      with self.assertRaises(device_errors.AdbShellCommandFailedError) as ec:
-        self.device._RunPipedShellCommand('ps | grep foo')
-      self.assertIs(None, ec.exception.status)
-
-
-@mock.patch('time.sleep', mock.Mock())
-class DeviceUtilsKillAllTest(DeviceUtilsTest):
-
-  def testKillAll_noMatchingProcessesFailure(self):
-    with self.assertCall(self.call.device.GetPids('test_process'), {}):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.device.KillAll('test_process')
-
-  def testKillAll_noMatchingProcessesQuiet(self):
-    with self.assertCall(self.call.device.GetPids('test_process'), {}):
-      self.assertEqual(0, self.device.KillAll('test_process', quiet=True))
-
-  def testKillAll_nonblocking(self):
-    with self.assertCalls(
-        (self.call.device.GetPids('some.process'),
-         {'some.process': ['1234'], 'some.processing.thing': ['5678']}),
-        (self.call.adb.Shell('kill -9 1234 5678'), '')):
-      self.assertEquals(
-          2, self.device.KillAll('some.process', blocking=False))
-
-  def testKillAll_blocking(self):
-    with self.assertCalls(
-        (self.call.device.GetPids('some.process'),
-         {'some.process': ['1234'], 'some.processing.thing': ['5678']}),
-        (self.call.adb.Shell('kill -9 1234 5678'), ''),
-        (self.call.device.GetPids('some.process'),
-         {'some.processing.thing': ['5678']}),
-        (self.call.device.GetPids('some.process'),
-         {'some.process': ['1111']})):  # Other instance with different pid.
-      self.assertEquals(
-          2, self.device.KillAll('some.process', blocking=True))
-
-  def testKillAll_exactNonblocking(self):
-    with self.assertCalls(
-        (self.call.device.GetPids('some.process'),
-         {'some.process': ['1234'], 'some.processing.thing': ['5678']}),
-        (self.call.adb.Shell('kill -9 1234'), '')):
-      self.assertEquals(
-          1, self.device.KillAll('some.process', exact=True, blocking=False))
-
-  def testKillAll_exactBlocking(self):
-    with self.assertCalls(
-        (self.call.device.GetPids('some.process'),
-         {'some.process': ['1234'], 'some.processing.thing': ['5678']}),
-        (self.call.adb.Shell('kill -9 1234'), ''),
-        (self.call.device.GetPids('some.process'),
-         {'some.process': ['1234'], 'some.processing.thing': ['5678']}),
-        (self.call.device.GetPids('some.process'),
-         {'some.processing.thing': ['5678']})):
-      self.assertEquals(
-          1, self.device.KillAll('some.process', exact=True, blocking=True))
-
-  def testKillAll_root(self):
-    with self.assertCalls(
-        (self.call.device.GetPids('some.process'), {'some.process': ['1234']}),
-        (self.call.device.NeedsSU(), True),
-        (self.call.device._Su("sh -c 'kill -9 1234'"),
-         "su -c sh -c 'kill -9 1234'"),
-        (self.call.adb.Shell("su -c sh -c 'kill -9 1234'"), '')):
-      self.assertEquals(
-          1, self.device.KillAll('some.process', as_root=True))
-
-  def testKillAll_sigterm(self):
-    with self.assertCalls(
-        (self.call.device.GetPids('some.process'),
-            {'some.process': ['1234']}),
-        (self.call.adb.Shell('kill -15 1234'), '')):
-      self.assertEquals(
-          1, self.device.KillAll('some.process', signum=device_signal.SIGTERM))
-
-  def testKillAll_multipleInstances(self):
-    with self.assertCalls(
-        (self.call.device.GetPids('some.process'),
-            {'some.process': ['1234', '4567']}),
-        (self.call.adb.Shell('kill -15 1234 4567'), '')):
-      self.assertEquals(
-          2, self.device.KillAll('some.process', signum=device_signal.SIGTERM))
-
-
-class DeviceUtilsStartActivityTest(DeviceUtilsTest):
-
-  def testStartActivity_actionOnly(self):
-    test_intent = intent.Intent(action='android.intent.action.VIEW')
-    with self.assertCall(
-        self.call.adb.Shell('am start '
-                            '-a android.intent.action.VIEW'),
-        'Starting: Intent { act=android.intent.action.VIEW }'):
-      self.device.StartActivity(test_intent)
-
-  def testStartActivity_success(self):
-    test_intent = intent.Intent(action='android.intent.action.VIEW',
-                                package='test.package',
-                                activity='.Main')
-    with self.assertCall(
-        self.call.adb.Shell('am start '
-                            '-a android.intent.action.VIEW '
-                            '-n test.package/.Main'),
-        'Starting: Intent { act=android.intent.action.VIEW }'):
-      self.device.StartActivity(test_intent)
-
-  def testStartActivity_failure(self):
-    test_intent = intent.Intent(action='android.intent.action.VIEW',
-                                package='test.package',
-                                activity='.Main')
-    with self.assertCall(
-        self.call.adb.Shell('am start '
-                            '-a android.intent.action.VIEW '
-                            '-n test.package/.Main'),
-        'Error: Failed to start test activity'):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.device.StartActivity(test_intent)
-
-  def testStartActivity_blocking(self):
-    test_intent = intent.Intent(action='android.intent.action.VIEW',
-                                package='test.package',
-                                activity='.Main')
-    with self.assertCall(
-        self.call.adb.Shell('am start '
-                            '-W '
-                            '-a android.intent.action.VIEW '
-                            '-n test.package/.Main'),
-        'Starting: Intent { act=android.intent.action.VIEW }'):
-      self.device.StartActivity(test_intent, blocking=True)
-
-  def testStartActivity_withCategory(self):
-    test_intent = intent.Intent(action='android.intent.action.VIEW',
-                                package='test.package',
-                                activity='.Main',
-                                category='android.intent.category.HOME')
-    with self.assertCall(
-        self.call.adb.Shell('am start '
-                            '-a android.intent.action.VIEW '
-                            '-c android.intent.category.HOME '
-                            '-n test.package/.Main'),
-        'Starting: Intent { act=android.intent.action.VIEW }'):
-      self.device.StartActivity(test_intent)
-
-  def testStartActivity_withMultipleCategories(self):
-    test_intent = intent.Intent(action='android.intent.action.VIEW',
-                                package='test.package',
-                                activity='.Main',
-                                category=['android.intent.category.HOME',
-                                          'android.intent.category.BROWSABLE'])
-    with self.assertCall(
-        self.call.adb.Shell('am start '
-                            '-a android.intent.action.VIEW '
-                            '-c android.intent.category.HOME '
-                            '-c android.intent.category.BROWSABLE '
-                            '-n test.package/.Main'),
-        'Starting: Intent { act=android.intent.action.VIEW }'):
-      self.device.StartActivity(test_intent)
-
-  def testStartActivity_withData(self):
-    test_intent = intent.Intent(action='android.intent.action.VIEW',
-                                package='test.package',
-                                activity='.Main',
-                                data='http://www.google.com/')
-    with self.assertCall(
-        self.call.adb.Shell('am start '
-                            '-a android.intent.action.VIEW '
-                            '-d http://www.google.com/ '
-                            '-n test.package/.Main'),
-        'Starting: Intent { act=android.intent.action.VIEW }'):
-      self.device.StartActivity(test_intent)
-
-  def testStartActivity_withStringExtra(self):
-    test_intent = intent.Intent(action='android.intent.action.VIEW',
-                                package='test.package',
-                                activity='.Main',
-                                extras={'foo': 'test'})
-    with self.assertCall(
-        self.call.adb.Shell('am start '
-                            '-a android.intent.action.VIEW '
-                            '-n test.package/.Main '
-                            '--es foo test'),
-        'Starting: Intent { act=android.intent.action.VIEW }'):
-      self.device.StartActivity(test_intent)
-
-  def testStartActivity_withBoolExtra(self):
-    test_intent = intent.Intent(action='android.intent.action.VIEW',
-                                package='test.package',
-                                activity='.Main',
-                                extras={'foo': True})
-    with self.assertCall(
-        self.call.adb.Shell('am start '
-                            '-a android.intent.action.VIEW '
-                            '-n test.package/.Main '
-                            '--ez foo True'),
-        'Starting: Intent { act=android.intent.action.VIEW }'):
-      self.device.StartActivity(test_intent)
-
-  def testStartActivity_withIntExtra(self):
-    test_intent = intent.Intent(action='android.intent.action.VIEW',
-                                package='test.package',
-                                activity='.Main',
-                                extras={'foo': 123})
-    with self.assertCall(
-        self.call.adb.Shell('am start '
-                            '-a android.intent.action.VIEW '
-                            '-n test.package/.Main '
-                            '--ei foo 123'),
-        'Starting: Intent { act=android.intent.action.VIEW }'):
-      self.device.StartActivity(test_intent)
-
-  def testStartActivity_withTraceFile(self):
-    test_intent = intent.Intent(action='android.intent.action.VIEW',
-                                package='test.package',
-                                activity='.Main')
-    with self.assertCall(
-        self.call.adb.Shell('am start '
-                            '--start-profiler test_trace_file.out '
-                            '-a android.intent.action.VIEW '
-                            '-n test.package/.Main'),
-        'Starting: Intent { act=android.intent.action.VIEW }'):
-      self.device.StartActivity(test_intent,
-                                trace_file_name='test_trace_file.out')
-
-  def testStartActivity_withForceStop(self):
-    test_intent = intent.Intent(action='android.intent.action.VIEW',
-                                package='test.package',
-                                activity='.Main')
-    with self.assertCall(
-        self.call.adb.Shell('am start '
-                            '-S '
-                            '-a android.intent.action.VIEW '
-                            '-n test.package/.Main'),
-        'Starting: Intent { act=android.intent.action.VIEW }'):
-      self.device.StartActivity(test_intent, force_stop=True)
-
-  def testStartActivity_withFlags(self):
-    test_intent = intent.Intent(action='android.intent.action.VIEW',
-                                package='test.package',
-                                activity='.Main',
-                                flags=[
-                                  intent.FLAG_ACTIVITY_NEW_TASK,
-                                  intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
-                                ])
-    with self.assertCall(
-        self.call.adb.Shell('am start '
-                            '-a android.intent.action.VIEW '
-                            '-n test.package/.Main '
-                            '-f 0x10200000'),
-        'Starting: Intent { act=android.intent.action.VIEW }'):
-      self.device.StartActivity(test_intent)
-
-
-class DeviceUtilsStartInstrumentationTest(DeviceUtilsTest):
-
-  def testStartInstrumentation_nothing(self):
-    with self.assertCalls(
-        self.call.device.RunShellCommand(
-            'p=test.package;am instrument "$p"/.TestInstrumentation',
-            shell=True, check_return=True, large_output=True)):
-      self.device.StartInstrumentation(
-          'test.package/.TestInstrumentation',
-          finish=False, raw=False, extras=None)
-
-  def testStartInstrumentation_finish(self):
-    with self.assertCalls(
-        (self.call.device.RunShellCommand(
-            'p=test.package;am instrument -w "$p"/.TestInstrumentation',
-            shell=True, check_return=True, large_output=True),
-         ['OK (1 test)'])):
-      output = self.device.StartInstrumentation(
-          'test.package/.TestInstrumentation',
-          finish=True, raw=False, extras=None)
-      self.assertEquals(['OK (1 test)'], output)
-
-  def testStartInstrumentation_raw(self):
-    with self.assertCalls(
-        self.call.device.RunShellCommand(
-            'p=test.package;am instrument -r "$p"/.TestInstrumentation',
-            shell=True, check_return=True, large_output=True)):
-      self.device.StartInstrumentation(
-          'test.package/.TestInstrumentation',
-          finish=False, raw=True, extras=None)
-
-  def testStartInstrumentation_extras(self):
-    with self.assertCalls(
-        self.call.device.RunShellCommand(
-            'p=test.package;am instrument -e "$p".foo Foo -e bar \'Val \'"$p" '
-            '"$p"/.TestInstrumentation',
-            shell=True, check_return=True, large_output=True)):
-      self.device.StartInstrumentation(
-          'test.package/.TestInstrumentation',
-          finish=False, raw=False, extras={'test.package.foo': 'Foo',
-                                           'bar': 'Val test.package'})
-
-
-class DeviceUtilsBroadcastIntentTest(DeviceUtilsTest):
-
-  def testBroadcastIntent_noExtras(self):
-    test_intent = intent.Intent(action='test.package.with.an.INTENT')
-    with self.assertCall(
-        self.call.adb.Shell('am broadcast -a test.package.with.an.INTENT'),
-        'Broadcasting: Intent { act=test.package.with.an.INTENT } '):
-      self.device.BroadcastIntent(test_intent)
-
-  def testBroadcastIntent_withExtra(self):
-    test_intent = intent.Intent(action='test.package.with.an.INTENT',
-                                extras={'foo': 'bar value'})
-    with self.assertCall(
-        self.call.adb.Shell(
-            "am broadcast -a test.package.with.an.INTENT --es foo 'bar value'"),
-        'Broadcasting: Intent { act=test.package.with.an.INTENT } '):
-      self.device.BroadcastIntent(test_intent)
-
-  def testBroadcastIntent_withExtra_noValue(self):
-    test_intent = intent.Intent(action='test.package.with.an.INTENT',
-                                extras={'foo': None})
-    with self.assertCall(
-        self.call.adb.Shell(
-            'am broadcast -a test.package.with.an.INTENT --esn foo'),
-        'Broadcasting: Intent { act=test.package.with.an.INTENT } '):
-      self.device.BroadcastIntent(test_intent)
-
-
-class DeviceUtilsGoHomeTest(DeviceUtilsTest):
-
-  def testGoHome_popupsExist(self):
-    with self.assertCalls(
-        (self.call.device.RunShellCommand(
-            ['dumpsys', 'window', 'windows'], check_return=True,
-            large_output=True), []),
-        (self.call.device.RunShellCommand(
-            ['am', 'start', '-W', '-a', 'android.intent.action.MAIN',
-            '-c', 'android.intent.category.HOME'], check_return=True),
-         'Starting: Intent { act=android.intent.action.MAIN }\r\n'''),
-        (self.call.device.RunShellCommand(
-            ['dumpsys', 'window', 'windows'], check_return=True,
-            large_output=True), []),
-        (self.call.device.RunShellCommand(
-            ['input', 'keyevent', '66'], check_return=True)),
-        (self.call.device.RunShellCommand(
-            ['input', 'keyevent', '4'], check_return=True)),
-        (self.call.device.RunShellCommand(
-            ['dumpsys', 'window', 'windows'], check_return=True,
-            large_output=True),
-         ['mCurrentFocus Launcher'])):
-      self.device.GoHome()
-
-  def testGoHome_willRetry(self):
-    with self.assertCalls(
-        (self.call.device.RunShellCommand(
-            ['dumpsys', 'window', 'windows'], check_return=True,
-            large_output=True), []),
-        (self.call.device.RunShellCommand(
-            ['am', 'start', '-W', '-a', 'android.intent.action.MAIN',
-            '-c', 'android.intent.category.HOME'], check_return=True),
-         'Starting: Intent { act=android.intent.action.MAIN }\r\n'''),
-        (self.call.device.RunShellCommand(
-            ['dumpsys', 'window', 'windows'], check_return=True,
-            large_output=True), []),
-        (self.call.device.RunShellCommand(
-            ['input', 'keyevent', '66'], check_return=True,)),
-        (self.call.device.RunShellCommand(
-            ['input', 'keyevent', '4'], check_return=True)),
-        (self.call.device.RunShellCommand(
-            ['dumpsys', 'window', 'windows'], check_return=True,
-            large_output=True), []),
-        (self.call.device.RunShellCommand(
-            ['input', 'keyevent', '66'], check_return=True)),
-        (self.call.device.RunShellCommand(
-            ['input', 'keyevent', '4'], check_return=True)),
-        (self.call.device.RunShellCommand(
-            ['dumpsys', 'window', 'windows'], check_return=True,
-            large_output=True),
-         self.TimeoutError())):
-      with self.assertRaises(device_errors.CommandTimeoutError):
-        self.device.GoHome()
-
-  def testGoHome_alreadyFocused(self):
-    with self.assertCall(
-        self.call.device.RunShellCommand(
-            ['dumpsys', 'window', 'windows'], check_return=True,
-            large_output=True),
-        ['mCurrentFocus Launcher']):
-      self.device.GoHome()
-
-  def testGoHome_alreadyFocusedAlternateCase(self):
-    with self.assertCall(
-        self.call.device.RunShellCommand(
-            ['dumpsys', 'window', 'windows'], check_return=True,
-            large_output=True),
-        [' mCurrentFocus .launcher/.']):
-      self.device.GoHome()
-
-  def testGoHome_obtainsFocusAfterGoingHome(self):
-    with self.assertCalls(
-        (self.call.device.RunShellCommand(
-            ['dumpsys', 'window', 'windows'], check_return=True,
-            large_output=True), []),
-        (self.call.device.RunShellCommand(
-            ['am', 'start', '-W', '-a', 'android.intent.action.MAIN',
-            '-c', 'android.intent.category.HOME'], check_return=True),
-         'Starting: Intent { act=android.intent.action.MAIN }\r\n'''),
-        (self.call.device.RunShellCommand(
-            ['dumpsys', 'window', 'windows'], check_return=True,
-            large_output=True),
-         ['mCurrentFocus Launcher'])):
-      self.device.GoHome()
-
-
-class DeviceUtilsForceStopTest(DeviceUtilsTest):
-
-  def testForceStop(self):
-    with self.assertCall(
-        self.call.adb.Shell('p=test.package;if [[ "$(ps)" = *$p* ]]; then '
-                            'am force-stop $p; fi'),
-        ''):
-      self.device.ForceStop('test.package')
-
-
-class DeviceUtilsClearApplicationStateTest(DeviceUtilsTest):
-
-  def testClearApplicationState_setPermissions(self):
-    with self.assertCalls(
-        (self.call.device.GetProp('ro.build.version.sdk', cache=True), '17'),
-        (self.call.device._GetApplicationPathsInternal('this.package.exists'),
-         ['/data/app/this.package.exists.apk']),
-        (self.call.device.RunShellCommand(
-            ['pm', 'clear', 'this.package.exists'],
-            check_return=True),
-         ['Success']),
-        (self.call.device.GrantPermissions(
-            'this.package.exists', ['p1']), [])):
-      self.device.ClearApplicationState(
-          'this.package.exists', permissions=['p1'])
-
-  def testClearApplicationState_packageDoesntExist(self):
-    with self.assertCalls(
-        (self.call.device.GetProp('ro.build.version.sdk', cache=True), '11'),
-        (self.call.device._GetApplicationPathsInternal('does.not.exist'),
-         [])):
-      self.device.ClearApplicationState('does.not.exist')
-
-  def testClearApplicationState_packageDoesntExistOnAndroidJBMR2OrAbove(self):
-    with self.assertCalls(
-        (self.call.device.GetProp('ro.build.version.sdk', cache=True), '18'),
-        (self.call.device.RunShellCommand(
-            ['pm', 'clear', 'this.package.does.not.exist'],
-            check_return=True),
-         ['Failed'])):
-      self.device.ClearApplicationState('this.package.does.not.exist')
-
-  def testClearApplicationState_packageExists(self):
-    with self.assertCalls(
-        (self.call.device.GetProp('ro.build.version.sdk', cache=True), '17'),
-        (self.call.device._GetApplicationPathsInternal('this.package.exists'),
-         ['/data/app/this.package.exists.apk']),
-        (self.call.device.RunShellCommand(
-            ['pm', 'clear', 'this.package.exists'],
-            check_return=True),
-         ['Success'])):
-      self.device.ClearApplicationState('this.package.exists')
-
-  def testClearApplicationState_packageExistsOnAndroidJBMR2OrAbove(self):
-    with self.assertCalls(
-        (self.call.device.GetProp('ro.build.version.sdk', cache=True), '18'),
-        (self.call.device.RunShellCommand(
-            ['pm', 'clear', 'this.package.exists'],
-            check_return=True),
-         ['Success'])):
-      self.device.ClearApplicationState('this.package.exists')
-
-
-class DeviceUtilsSendKeyEventTest(DeviceUtilsTest):
-
-  def testSendKeyEvent(self):
-    with self.assertCall(self.call.adb.Shell('input keyevent 66'), ''):
-      self.device.SendKeyEvent(66)
-
-
-class DeviceUtilsPushChangedFilesIndividuallyTest(DeviceUtilsTest):
-
-  def testPushChangedFilesIndividually_empty(self):
-    test_files = []
-    with self.assertCalls():
-      self.device._PushChangedFilesIndividually(test_files)
-
-  def testPushChangedFilesIndividually_single(self):
-    test_files = [('/test/host/path', '/test/device/path')]
-    with self.assertCalls(self.call.adb.Push(*test_files[0])):
-      self.device._PushChangedFilesIndividually(test_files)
-
-  def testPushChangedFilesIndividually_multiple(self):
-    test_files = [
-        ('/test/host/path/file1', '/test/device/path/file1'),
-        ('/test/host/path/file2', '/test/device/path/file2')]
-    with self.assertCalls(
-        self.call.adb.Push(*test_files[0]),
-        self.call.adb.Push(*test_files[1])):
-      self.device._PushChangedFilesIndividually(test_files)
-
-
-class DeviceUtilsPushChangedFilesZippedTest(DeviceUtilsTest):
-
-  def testPushChangedFilesZipped_noUnzipCommand(self):
-    test_files = [('/test/host/path/file1', '/test/device/path/file1')]
-    mock_zip_temp = mock.mock_open()
-    mock_zip_temp.return_value.name = '/test/temp/file/tmp.zip'
-    with self.assertCalls(
-        (mock.call.tempfile.NamedTemporaryFile(suffix='.zip'), mock_zip_temp),
-        (mock.call.multiprocessing.Process(
-            target=device_utils.DeviceUtils._CreateDeviceZip,
-            args=('/test/temp/file/tmp.zip', test_files)), mock.Mock()),
-        (self.call.device._MaybeInstallCommands(), False)):
-      self.assertFalse(self.device._PushChangedFilesZipped(test_files,
-                                                           ['/test/dir']))
-
-  def _testPushChangedFilesZipped_spec(self, test_files):
-    mock_zip_temp = mock.mock_open()
-    mock_zip_temp.return_value.name = '/test/temp/file/tmp.zip'
-    with self.assertCalls(
-        (mock.call.tempfile.NamedTemporaryFile(suffix='.zip'), mock_zip_temp),
-        (mock.call.multiprocessing.Process(
-            target=device_utils.DeviceUtils._CreateDeviceZip,
-            args=('/test/temp/file/tmp.zip', test_files)), mock.Mock()),
-        (self.call.device._MaybeInstallCommands(), True),
-        (self.call.device.NeedsSU(), True),
-        (mock.call.devil.android.device_temp_file.DeviceTempFile(self.adb,
-                                                                 suffix='.zip'),
-             MockTempFile('/test/sdcard/foo123.zip')),
-        self.call.adb.Push(
-            '/test/temp/file/tmp.zip', '/test/sdcard/foo123.zip'),
-        self.call.device.RunShellCommand(
-            'unzip /test/sdcard/foo123.zip&&chmod -R 777 /test/dir',
-            shell=True, as_root=True,
-            env={'PATH': '/data/local/tmp/bin:$PATH'},
-            check_return=True)):
-      self.assertTrue(self.device._PushChangedFilesZipped(test_files,
-                                                          ['/test/dir']))
-
-  def testPushChangedFilesZipped_single(self):
-    self._testPushChangedFilesZipped_spec(
-        [('/test/host/path/file1', '/test/device/path/file1')])
-
-  def testPushChangedFilesZipped_multiple(self):
-    self._testPushChangedFilesZipped_spec(
-        [('/test/host/path/file1', '/test/device/path/file1'),
-         ('/test/host/path/file2', '/test/device/path/file2')])
-
-
-class DeviceUtilsPathExistsTest(DeviceUtilsTest):
-
-  def testPathExists_pathExists(self):
-    with self.assertCall(
-        self.call.device.RunShellCommand(
-            ['test', '-e', '/path/file exists'],
-            as_root=False, check_return=True, timeout=10, retries=0),
-        []):
-      self.assertTrue(self.device.PathExists('/path/file exists'))
-
-  def testPathExists_multiplePathExists(self):
-    with self.assertCall(
-        self.call.device.RunShellCommand(
-            ['test', '-e', '/path 1', '-a', '-e', '/path2'],
-            as_root=False, check_return=True, timeout=10, retries=0),
-        []):
-      self.assertTrue(self.device.PathExists(('/path 1', '/path2')))
-
-  def testPathExists_pathDoesntExist(self):
-    with self.assertCall(
-        self.call.device.RunShellCommand(
-            ['test', '-e', '/path/file.not.exists'],
-            as_root=False, check_return=True, timeout=10, retries=0),
-        self.ShellError()):
-      self.assertFalse(self.device.PathExists('/path/file.not.exists'))
-
-  def testPathExists_asRoot(self):
-    with self.assertCall(
-        self.call.device.RunShellCommand(
-            ['test', '-e', '/root/path/exists'],
-            as_root=True, check_return=True, timeout=10, retries=0),
-        self.ShellError()):
-      self.assertFalse(
-          self.device.PathExists('/root/path/exists', as_root=True))
-
-  def testFileExists_pathDoesntExist(self):
-    with self.assertCall(
-        self.call.device.RunShellCommand(
-            ['test', '-e', '/path/file.not.exists'],
-            as_root=False, check_return=True, timeout=10, retries=0),
-        self.ShellError()):
-      self.assertFalse(self.device.FileExists('/path/file.not.exists'))
-
-
-class DeviceUtilsRemovePathTest(DeviceUtilsTest):
-
-  def testRemovePath_regular(self):
-    with self.assertCall(
-        self.call.device.RunShellCommand(
-            ['rm', 'some file'], as_root=False, check_return=True),
-        []):
-      self.device.RemovePath('some file')
-
-  def testRemovePath_withForce(self):
-    with self.assertCall(
-        self.call.device.RunShellCommand(
-            ['rm', '-f', 'some file'], as_root=False, check_return=True),
-        []):
-      self.device.RemovePath('some file', force=True)
-
-  def testRemovePath_recursively(self):
-    with self.assertCall(
-        self.call.device.RunShellCommand(
-            ['rm', '-r', '/remove/this/dir'], as_root=False, check_return=True),
-        []):
-      self.device.RemovePath('/remove/this/dir', recursive=True)
-
-  def testRemovePath_withRoot(self):
-    with self.assertCall(
-        self.call.device.RunShellCommand(
-            ['rm', 'some file'], as_root=True, check_return=True),
-        []):
-      self.device.RemovePath('some file', as_root=True)
-
-  def testRemovePath_manyPaths(self):
-    with self.assertCall(
-        self.call.device.RunShellCommand(
-            ['rm', 'eeny', 'meeny', 'miny', 'moe'],
-            as_root=False, check_return=True),
-        []):
-      self.device.RemovePath(['eeny', 'meeny', 'miny', 'moe'])
-
-
-class DeviceUtilsPullFileTest(DeviceUtilsTest):
-
-  def testPullFile_existsOnDevice(self):
-    with mock.patch('os.path.exists', return_value=True):
-      with self.assertCall(
-          self.call.adb.Pull('/data/app/test.file.exists',
-                             '/test/file/host/path')):
-        self.device.PullFile('/data/app/test.file.exists',
-                             '/test/file/host/path')
-
-  def testPullFile_doesntExistOnDevice(self):
-    with mock.patch('os.path.exists', return_value=True):
-      with self.assertCall(
-          self.call.adb.Pull('/data/app/test.file.does.not.exist',
-                             '/test/file/host/path'),
-          self.CommandError('remote object does not exist')):
-        with self.assertRaises(device_errors.CommandFailedError):
-          self.device.PullFile('/data/app/test.file.does.not.exist',
-                               '/test/file/host/path')
-
-
-class DeviceUtilsReadFileTest(DeviceUtilsTest):
-
-  def testReadFileWithPull_success(self):
-    tmp_host_dir = '/tmp/dir/on.host/'
-    tmp_host = MockTempFile('/tmp/dir/on.host/tmp_ReadFileWithPull')
-    tmp_host.file.read.return_value = 'some interesting contents'
-    with self.assertCalls(
-        (mock.call.tempfile.mkdtemp(), tmp_host_dir),
-        (self.call.adb.Pull('/path/to/device/file', mock.ANY)),
-        (mock.call.__builtin__.open(mock.ANY, 'r'), tmp_host),
-        (mock.call.os.path.exists(tmp_host_dir), True),
-        (mock.call.shutil.rmtree(tmp_host_dir), None)):
-      self.assertEquals('some interesting contents',
-                        self.device._ReadFileWithPull('/path/to/device/file'))
-    tmp_host.file.read.assert_called_once_with()
-
-  def testReadFileWithPull_rejected(self):
-    tmp_host_dir = '/tmp/dir/on.host/'
-    with self.assertCalls(
-        (mock.call.tempfile.mkdtemp(), tmp_host_dir),
-        (self.call.adb.Pull('/path/to/device/file', mock.ANY),
-         self.CommandError()),
-        (mock.call.os.path.exists(tmp_host_dir), True),
-        (mock.call.shutil.rmtree(tmp_host_dir), None)):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.device._ReadFileWithPull('/path/to/device/file')
-
-  def testReadFile_exists(self):
-    with self.assertCalls(
-        (self.call.device.FileSize('/read/this/test/file', as_root=False), 256),
-        (self.call.device.RunShellCommand(
-            ['cat', '/read/this/test/file'],
-            as_root=False, check_return=True),
-         ['this is a test file'])):
-      self.assertEqual('this is a test file\n',
-                       self.device.ReadFile('/read/this/test/file'))
-
-  def testReadFile_exists2(self):
-    # Same as testReadFile_exists, but uses Android N ls output.
-    with self.assertCalls(
-        (self.call.device.FileSize('/read/this/test/file', as_root=False), 256),
-        (self.call.device.RunShellCommand(
-            ['cat', '/read/this/test/file'],
-            as_root=False, check_return=True),
-         ['this is a test file'])):
-      self.assertEqual('this is a test file\n',
-                       self.device.ReadFile('/read/this/test/file'))
-
-  def testReadFile_doesNotExist(self):
-    with self.assertCall(
-        self.call.device.FileSize('/this/file/does.not.exist', as_root=False),
-        self.CommandError('File does not exist')):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.device.ReadFile('/this/file/does.not.exist')
-
-  def testReadFile_zeroSize(self):
-    with self.assertCalls(
-        (self.call.device.FileSize('/this/file/has/zero/size', as_root=False),
-         0),
-        (self.call.device._ReadFileWithPull('/this/file/has/zero/size'),
-         'but it has contents\n')):
-      self.assertEqual('but it has contents\n',
-                       self.device.ReadFile('/this/file/has/zero/size'))
-
-  def testReadFile_withSU(self):
-    with self.assertCalls(
-        (self.call.device.FileSize(
-            '/this/file/can.be.read.with.su', as_root=True), 256),
-        (self.call.device.RunShellCommand(
-            ['cat', '/this/file/can.be.read.with.su'],
-            as_root=True, check_return=True),
-         ['this is a test file', 'read with su'])):
-      self.assertEqual(
-          'this is a test file\nread with su\n',
-          self.device.ReadFile('/this/file/can.be.read.with.su',
-                               as_root=True))
-
-  def testReadFile_withPull(self):
-    contents = 'a' * 123456
-    with self.assertCalls(
-        (self.call.device.FileSize('/read/this/big/test/file', as_root=False),
-         123456),
-        (self.call.device._ReadFileWithPull('/read/this/big/test/file'),
-         contents)):
-      self.assertEqual(
-          contents, self.device.ReadFile('/read/this/big/test/file'))
-
-  def testReadFile_withPullAndSU(self):
-    contents = 'b' * 123456
-    with self.assertCalls(
-        (self.call.device.FileSize(
-            '/this/big/file/can.be.read.with.su', as_root=True), 123456),
-        (self.call.device.NeedsSU(), True),
-        (mock.call.devil.android.device_temp_file.DeviceTempFile(self.adb),
-         MockTempFile('/sdcard/tmp/on.device')),
-        self.call.device.RunShellCommand(
-            'SRC=/this/big/file/can.be.read.with.su DEST=/sdcard/tmp/on.device;'
-            'cp "$SRC" "$DEST" && chmod 666 "$DEST"',
-            shell=True, as_root=True, check_return=True),
-        (self.call.device._ReadFileWithPull('/sdcard/tmp/on.device'),
-         contents)):
-      self.assertEqual(
-          contents,
-          self.device.ReadFile('/this/big/file/can.be.read.with.su',
-                               as_root=True))
-
-  def testReadFile_forcePull(self):
-    contents = 'a' * 123456
-    with self.assertCall(
-        self.call.device._ReadFileWithPull('/read/this/big/test/file'),
-        contents):
-      self.assertEqual(
-          contents,
-          self.device.ReadFile('/read/this/big/test/file', force_pull=True))
-
-
-class DeviceUtilsWriteFileTest(DeviceUtilsTest):
-
-  def testWriteFileWithPush_success(self):
-    tmp_host = MockTempFile('/tmp/file/on.host')
-    contents = 'some interesting contents'
-    with self.assertCalls(
-        (mock.call.tempfile.NamedTemporaryFile(), tmp_host),
-        self.call.adb.Push('/tmp/file/on.host', '/path/to/device/file')):
-      self.device._WriteFileWithPush('/path/to/device/file', contents)
-    tmp_host.file.write.assert_called_once_with(contents)
-
-  def testWriteFileWithPush_rejected(self):
-    tmp_host = MockTempFile('/tmp/file/on.host')
-    contents = 'some interesting contents'
-    with self.assertCalls(
-        (mock.call.tempfile.NamedTemporaryFile(), tmp_host),
-        (self.call.adb.Push('/tmp/file/on.host', '/path/to/device/file'),
-         self.CommandError())):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.device._WriteFileWithPush('/path/to/device/file', contents)
-
-  def testWriteFile_withPush(self):
-    contents = 'some large contents ' * 26  # 20 * 26 = 520 chars
-    with self.assertCalls(
-        self.call.device._WriteFileWithPush('/path/to/device/file', contents)):
-      self.device.WriteFile('/path/to/device/file', contents)
-
-  def testWriteFile_withPushForced(self):
-    contents = 'tiny contents'
-    with self.assertCalls(
-        self.call.device._WriteFileWithPush('/path/to/device/file', contents)):
-      self.device.WriteFile('/path/to/device/file', contents, force_push=True)
-
-  def testWriteFile_withPushAndSU(self):
-    contents = 'some large contents ' * 26  # 20 * 26 = 520 chars
-    with self.assertCalls(
-        (self.call.device.NeedsSU(), True),
-        (mock.call.devil.android.device_temp_file.DeviceTempFile(self.adb),
-         MockTempFile('/sdcard/tmp/on.device')),
-        self.call.device._WriteFileWithPush('/sdcard/tmp/on.device', contents),
-        self.call.device.RunShellCommand(
-            ['cp', '/sdcard/tmp/on.device', '/path/to/device/file'],
-            as_root=True, check_return=True)):
-      self.device.WriteFile('/path/to/device/file', contents, as_root=True)
-
-  def testWriteFile_withEcho(self):
-    with self.assertCall(self.call.adb.Shell(
-        "echo -n the.contents > /test/file/to.write"), ''):
-      self.device.WriteFile('/test/file/to.write', 'the.contents')
-
-  def testWriteFile_withEchoAndQuotes(self):
-    with self.assertCall(self.call.adb.Shell(
-        "echo -n 'the contents' > '/test/file/to write'"), ''):
-      self.device.WriteFile('/test/file/to write', 'the contents')
-
-  def testWriteFile_withEchoAndSU(self):
-    expected_cmd_without_su = "sh -c 'echo -n contents > /test/file'"
-    expected_cmd = 'su -c %s' % expected_cmd_without_su
-    with self.assertCalls(
-        (self.call.device.NeedsSU(), True),
-        (self.call.device._Su(expected_cmd_without_su), expected_cmd),
-        (self.call.adb.Shell(expected_cmd),
-         '')):
-      self.device.WriteFile('/test/file', 'contents', as_root=True)
-
-
-class DeviceUtilsStatDirectoryTest(DeviceUtilsTest):
-  # Note: Also tests ListDirectory in testStatDirectory_fileList.
-
-  EXAMPLE_LS_OUTPUT = [
-    'total 12345',
-    'drwxr-xr-x  19 root   root          0 1970-04-06 18:03 .',
-    'drwxr-xr-x  19 root   root          0 1970-04-06 18:03 ..',
-    'drwxr-xr-x   6 root   root            1970-01-01 00:00 some_dir',
-    '-rw-r--r--   1 root   root        723 1971-01-01 07:04 some_file',
-    '-rw-r-----   1 root   root        327 2009-02-13 23:30 My Music File',
-    # Older Android versions do not print st_nlink
-    'lrwxrwxrwx root     root              1970-01-01 00:00 lnk -> /some/path',
-    'srwxrwx--- system   system            2016-05-31 17:25 a_socket1',
-    'drwxrwxrwt system   misc              1970-11-23 02:25 tmp',
-    'drwxr-s--- system   shell             1970-11-23 02:24 my_cmd',
-    'cr--r----- root     system    10, 183 1971-01-01 07:04 random',
-    'brw------- root     root       7,   0 1971-01-01 07:04 block_dev',
-    '-rwS------ root     shell      157404 2015-04-13 15:44 silly',
-  ]
-
-  FILENAMES = [
-    'some_dir', 'some_file', 'My Music File', 'lnk', 'a_socket1',
-    'tmp', 'my_cmd', 'random', 'block_dev', 'silly']
-
-  def getStatEntries(self, path_given='/', path_listed='/'):
-    with self.assertCall(
-        self.call.device.RunShellCommand(
-            ['ls', '-a', '-l', path_listed],
-            check_return=True, as_root=False, env={'TZ': 'utc'}),
-        self.EXAMPLE_LS_OUTPUT):
-      entries = self.device.StatDirectory(path_given)
-    return {f['filename']: f for f in entries}
-
-  def getListEntries(self):
-    with self.assertCall(
-        self.call.device.RunShellCommand(
-            ['ls', '-a', '-l', '/'],
-            check_return=True, as_root=False, env={'TZ': 'utc'}),
-        self.EXAMPLE_LS_OUTPUT):
-      return self.device.ListDirectory('/')
-
-  def testStatDirectory_forceTrailingSlash(self):
-    self.getStatEntries(path_given='/foo/bar/', path_listed='/foo/bar/')
-    self.getStatEntries(path_given='/foo/bar', path_listed='/foo/bar/')
-
-  def testStatDirectory_fileList(self):
-    self.assertItemsEqual(self.getStatEntries().keys(), self.FILENAMES)
-    self.assertItemsEqual(self.getListEntries(), self.FILENAMES)
-
-  def testStatDirectory_fileModes(self):
-    expected_modes = (
-      ('some_dir', stat.S_ISDIR),
-      ('some_file', stat.S_ISREG),
-      ('lnk', stat.S_ISLNK),
-      ('a_socket1', stat.S_ISSOCK),
-      ('block_dev', stat.S_ISBLK),
-      ('random', stat.S_ISCHR),
-    )
-    entries = self.getStatEntries()
-    for filename, check in expected_modes:
-      self.assertTrue(check(entries[filename]['st_mode']))
-
-  def testStatDirectory_filePermissions(self):
-    should_have = (
-      ('some_file', stat.S_IWUSR),  # Owner can write.
-      ('tmp', stat.S_IXOTH),  # Others can execute.
-      ('tmp', stat.S_ISVTX),  # Has sticky bit.
-      ('my_cmd', stat.S_ISGID),  # Has set-group-ID bit.
-      ('silly', stat.S_ISUID),  # Has set UID bit.
-    )
-    should_not_have = (
-      ('some_file', stat.S_IWOTH),  # Others can't write.
-      ('block_dev', stat.S_IRGRP),  # Group can't read.
-      ('silly', stat.S_IXUSR),  # Owner can't execute.
-    )
-    entries = self.getStatEntries()
-    for filename, bit in should_have:
-      self.assertTrue(entries[filename]['st_mode'] & bit)
-    for filename, bit in should_not_have:
-      self.assertFalse(entries[filename]['st_mode'] & bit)
-
-  def testStatDirectory_numHardLinks(self):
-    entries = self.getStatEntries()
-    self.assertEqual(entries['some_dir']['st_nlink'], 6)
-    self.assertEqual(entries['some_file']['st_nlink'], 1)
-    self.assertFalse('st_nlink' in entries['tmp'])
-
-  def testStatDirectory_fileOwners(self):
-    entries = self.getStatEntries()
-    self.assertEqual(entries['some_dir']['st_owner'], 'root')
-    self.assertEqual(entries['my_cmd']['st_owner'], 'system')
-    self.assertEqual(entries['my_cmd']['st_group'], 'shell')
-    self.assertEqual(entries['tmp']['st_group'], 'misc')
-
-  def testStatDirectory_fileSize(self):
-    entries = self.getStatEntries()
-    self.assertEqual(entries['some_file']['st_size'], 723)
-    self.assertEqual(entries['My Music File']['st_size'], 327)
-    # Sizes are sometimes not reported for non-regular files, don't try to
-    # guess the size in those cases.
-    self.assertFalse('st_size' in entries['some_dir'])
-
-  def testStatDirectory_fileDateTime(self):
-    entries = self.getStatEntries()
-    self.assertEqual(entries['some_dir']['st_mtime'], 0)  # Epoch!
-    self.assertEqual(entries['My Music File']['st_mtime'], 1234567800)
-
-  def testStatDirectory_deviceType(self):
-    entries = self.getStatEntries()
-    self.assertEqual(entries['random']['st_rdev_pair'], (10, 183))
-    self.assertEqual(entries['block_dev']['st_rdev_pair'], (7, 0))
-
-  def testStatDirectory_symbolicLinks(self):
-    entries = self.getStatEntries()
-    self.assertEqual(entries['lnk']['symbolic_link_to'], '/some/path')
-    for d in entries.itervalues():
-      self.assertEqual('symbolic_link_to' in d, stat.S_ISLNK(d['st_mode']))
-
-
-class DeviceUtilsStatPathTest(DeviceUtilsTest):
-
-  EXAMPLE_DIRECTORY = [
-    {'filename': 'foo.txt', 'st_size': 123, 'st_time': 456},
-    {'filename': 'some_dir', 'st_time': 0}
-  ]
-  INDEX = {e['filename']: e for e in EXAMPLE_DIRECTORY}
-
-  def testStatPath_file(self):
-    with self.assertCall(
-        self.call.device.StatDirectory('/data/local/tmp', as_root=False),
-        self.EXAMPLE_DIRECTORY):
-      self.assertEquals(self.INDEX['foo.txt'],
-                        self.device.StatPath('/data/local/tmp/foo.txt'))
-
-  def testStatPath_directory(self):
-    with self.assertCall(
-        self.call.device.StatDirectory('/data/local/tmp', as_root=False),
-        self.EXAMPLE_DIRECTORY):
-      self.assertEquals(self.INDEX['some_dir'],
-                        self.device.StatPath('/data/local/tmp/some_dir'))
-
-  def testStatPath_directoryWithTrailingSlash(self):
-    with self.assertCall(
-        self.call.device.StatDirectory('/data/local/tmp', as_root=False),
-        self.EXAMPLE_DIRECTORY):
-      self.assertEquals(self.INDEX['some_dir'],
-                        self.device.StatPath('/data/local/tmp/some_dir/'))
-
-  def testStatPath_doesNotExist(self):
-    with self.assertCall(
-        self.call.device.StatDirectory('/data/local/tmp', as_root=False),
-        self.EXAMPLE_DIRECTORY):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.device.StatPath('/data/local/tmp/does.not.exist.txt')
-
-
-class DeviceUtilsFileSizeTest(DeviceUtilsTest):
-
-  EXAMPLE_DIRECTORY = [
-    {'filename': 'foo.txt', 'st_size': 123, 'st_mtime': 456},
-    {'filename': 'some_dir', 'st_mtime': 0}
-  ]
-
-  def testFileSize_file(self):
-    with self.assertCall(
-        self.call.device.StatDirectory('/data/local/tmp', as_root=False),
-        self.EXAMPLE_DIRECTORY):
-      self.assertEquals(123,
-                        self.device.FileSize('/data/local/tmp/foo.txt'))
-
-  def testFileSize_doesNotExist(self):
-    with self.assertCall(
-        self.call.device.StatDirectory('/data/local/tmp', as_root=False),
-        self.EXAMPLE_DIRECTORY):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.device.FileSize('/data/local/tmp/does.not.exist.txt')
-
-  def testFileSize_directoryWithNoSize(self):
-    with self.assertCall(
-        self.call.device.StatDirectory('/data/local/tmp', as_root=False),
-        self.EXAMPLE_DIRECTORY):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.device.FileSize('/data/local/tmp/some_dir')
-
-
-class DeviceUtilsSetJavaAssertsTest(DeviceUtilsTest):
-
-  def testSetJavaAsserts_enable(self):
-    with self.assertCalls(
-        (self.call.device.ReadFile(self.device.LOCAL_PROPERTIES_PATH),
-         'some.example.prop=with an example value\n'
-         'some.other.prop=value_ok\n'),
-        self.call.device.WriteFile(
-            self.device.LOCAL_PROPERTIES_PATH,
-            'some.example.prop=with an example value\n'
-            'some.other.prop=value_ok\n'
-            'dalvik.vm.enableassertions=all\n'),
-        (self.call.device.GetProp('dalvik.vm.enableassertions'), ''),
-        self.call.device.SetProp('dalvik.vm.enableassertions', 'all')):
-      self.assertTrue(self.device.SetJavaAsserts(True))
-
-  def testSetJavaAsserts_disable(self):
-    with self.assertCalls(
-        (self.call.device.ReadFile(self.device.LOCAL_PROPERTIES_PATH),
-         'some.example.prop=with an example value\n'
-         'dalvik.vm.enableassertions=all\n'
-         'some.other.prop=value_ok\n'),
-        self.call.device.WriteFile(
-            self.device.LOCAL_PROPERTIES_PATH,
-            'some.example.prop=with an example value\n'
-            'some.other.prop=value_ok\n'),
-        (self.call.device.GetProp('dalvik.vm.enableassertions'), 'all'),
-        self.call.device.SetProp('dalvik.vm.enableassertions', '')):
-      self.assertTrue(self.device.SetJavaAsserts(False))
-
-  def testSetJavaAsserts_alreadyEnabled(self):
-    with self.assertCalls(
-        (self.call.device.ReadFile(self.device.LOCAL_PROPERTIES_PATH),
-         'some.example.prop=with an example value\n'
-         'dalvik.vm.enableassertions=all\n'
-         'some.other.prop=value_ok\n'),
-        (self.call.device.GetProp('dalvik.vm.enableassertions'), 'all')):
-      self.assertFalse(self.device.SetJavaAsserts(True))
-
-  def testSetJavaAsserts_malformedLocalProp(self):
-    with self.assertCalls(
-        (self.call.device.ReadFile(self.device.LOCAL_PROPERTIES_PATH),
-         'some.example.prop=with an example value\n'
-         'malformed_property\n'
-         'dalvik.vm.enableassertions=all\n'
-         'some.other.prop=value_ok\n'),
-        (self.call.device.GetProp('dalvik.vm.enableassertions'), 'all')):
-      self.assertFalse(self.device.SetJavaAsserts(True))
-
-
-class DeviceUtilsEnsureCacheInitializedTest(DeviceUtilsTest):
-
-  def testEnsureCacheInitialized_noCache_success(self):
-    self.assertIsNone(self.device._cache['token'])
-    with self.assertCall(
-        self.call.device.RunShellCommand(
-            AnyStringWith('getprop'),
-            shell=True, check_return=True, large_output=True),
-        ['/sdcard', 'TOKEN']):
-      self.device._EnsureCacheInitialized()
-    self.assertIsNotNone(self.device._cache['token'])
-
-  def testEnsureCacheInitialized_noCache_failure(self):
-    self.assertIsNone(self.device._cache['token'])
-    with self.assertCall(
-        self.call.device.RunShellCommand(
-            AnyStringWith('getprop'),
-            shell=True, check_return=True, large_output=True),
-        self.TimeoutError()):
-      with self.assertRaises(device_errors.CommandTimeoutError):
-        self.device._EnsureCacheInitialized()
-    self.assertIsNone(self.device._cache['token'])
-
-  def testEnsureCacheInitialized_cache(self):
-    self.device._cache['token'] = 'TOKEN'
-    with self.assertCalls():
-      self.device._EnsureCacheInitialized()
-    self.assertIsNotNone(self.device._cache['token'])
-
-
-class DeviceUtilsGetPropTest(DeviceUtilsTest):
-
-  def testGetProp_exists(self):
-    with self.assertCall(
-        self.call.device.RunShellCommand(
-            ['getprop', 'test.property'], check_return=True, single_line=True,
-            timeout=self.device._default_timeout,
-            retries=self.device._default_retries),
-        'property_value'):
-      self.assertEqual('property_value',
-                       self.device.GetProp('test.property'))
-
-  def testGetProp_doesNotExist(self):
-    with self.assertCall(
-        self.call.device.RunShellCommand(
-            ['getprop', 'property.does.not.exist'],
-            check_return=True, single_line=True,
-            timeout=self.device._default_timeout,
-            retries=self.device._default_retries),
-        ''):
-      self.assertEqual('', self.device.GetProp('property.does.not.exist'))
-
-  def testGetProp_cachedRoProp(self):
-    with self.assertCalls(
-        self.EnsureCacheInitialized(props=['[ro.build.type]: [userdebug]'])):
-      self.assertEqual('userdebug',
-                       self.device.GetProp('ro.build.type', cache=True))
-      self.assertEqual('userdebug',
-                       self.device.GetProp('ro.build.type', cache=True))
-
-
-class DeviceUtilsSetPropTest(DeviceUtilsTest):
-
-  def testSetProp(self):
-    with self.assertCall(
-        self.call.device.RunShellCommand(
-            ['setprop', 'test.property', 'test value'], check_return=True)):
-      self.device.SetProp('test.property', 'test value')
-
-  def testSetProp_check_succeeds(self):
-    with self.assertCalls(
-        (self.call.device.RunShellCommand(
-            ['setprop', 'test.property', 'new_value'], check_return=True)),
-        (self.call.device.GetProp('test.property', cache=False), 'new_value')):
-      self.device.SetProp('test.property', 'new_value', check=True)
-
-  def testSetProp_check_fails(self):
-    with self.assertCalls(
-        (self.call.device.RunShellCommand(
-            ['setprop', 'test.property', 'new_value'], check_return=True)),
-        (self.call.device.GetProp('test.property', cache=False), 'old_value')):
-      with self.assertRaises(device_errors.CommandFailedError):
-        self.device.SetProp('test.property', 'new_value', check=True)
-
-
-class DeviceUtilsGetPidsTest(DeviceUtilsTest):
-  def setUp(self):
-    super(DeviceUtilsGetPidsTest, self).setUp()
-    self.sample_output = [
-        'USER  PID     PPID  VSIZE RSS   WCHAN          PC  NAME',
-        'user  1001    100   1024  1024  ffffffff 00000000 one.match',
-        'user  1002    100   1024  1024  ffffffff 00000000 two.match',
-        'user  1003    100   1024  1024  ffffffff 00000000 three.match',
-        'user  1234    100   1024  1024  ffffffff 00000000 my$process',
-        'user  1000    100   1024  1024  ffffffff 00000000 foo',
-        'user  1236    100   1024  1024  ffffffff 00000000 foo',
-    ]
-
-  def _grepOutput(self, substring):
-    return [line for line in self.sample_output if substring in line]
-
-  def testGetPids_sdkGreaterThanNougatMR1(self):
-    with self.patch_call(self.call.device.build_version_sdk,
-                         return_value=(version_codes.NOUGAT_MR1 + 1)):
-      with self.patch_call(self.call.device.build_id,
-                           return_value='ZZZ99Z'):
-        with self.assertCall(
-            self.call.device._RunPipedShellCommand(
-                'ps -e | grep -F example.process'), []):
-          self.device.GetPids('example.process')
-
-  def testGetPids_noMatches(self):
-    with self.patch_call(self.call.device.build_version_sdk,
-                         return_value=version_codes.LOLLIPOP):
-      with self.assertCall(
-          self.call.device._RunPipedShellCommand('ps | grep -F does.not.match'),
-          self._grepOutput('does.not.match')):
-        self.assertEqual({}, self.device.GetPids('does.not.match'))
-
-  def testGetPids_oneMatch(self):
-    with self.patch_call(self.call.device.build_version_sdk,
-                         return_value=version_codes.LOLLIPOP):
-      with self.assertCall(
-          self.call.device._RunPipedShellCommand('ps | grep -F one.match'),
-          self._grepOutput('one.match')):
-        self.assertEqual(
-            {'one.match': ['1001']},
-            self.device.GetPids('one.match'))
-
-  def testGetPids_multipleMatches(self):
-    with self.patch_call(self.call.device.build_version_sdk,
-                         return_value=version_codes.LOLLIPOP):
-      with self.assertCall(
-          self.call.device._RunPipedShellCommand('ps | grep -F match'),
-          self._grepOutput('match')):
-        self.assertEqual(
-            {'one.match': ['1001'],
-             'two.match': ['1002'],
-             'three.match': ['1003']},
-            self.device.GetPids('match'))
-
-  def testGetPids_quotable(self):
-    with self.patch_call(self.call.device.build_version_sdk,
-                         return_value=version_codes.LOLLIPOP):
-      with self.assertCall(
-          self.call.device._RunPipedShellCommand("ps | grep -F 'my$process'"),
-          self._grepOutput('my$process')):
-        self.assertEqual(
-            {'my$process': ['1234']}, self.device.GetPids('my$process'))
-
-  def testGetPids_multipleInstances(self):
-    with self.patch_call(self.call.device.build_version_sdk,
-                         return_value=version_codes.LOLLIPOP):
-      with self.assertCall(
-          self.call.device._RunPipedShellCommand('ps | grep -F foo'),
-          self._grepOutput('foo')):
-        self.assertEqual(
-            {'foo': ['1000', '1236']},
-            self.device.GetPids('foo'))
-
-  def testGetPids_allProcesses(self):
-    with self.patch_call(self.call.device.build_version_sdk,
-                         return_value=version_codes.LOLLIPOP):
-      with self.assertCall(
-          self.call.device.RunShellCommand(
-              ['ps'], check_return=True, large_output=True),
-          self.sample_output):
-        self.assertEqual(
-            {'one.match': ['1001'],
-             'two.match': ['1002'],
-             'three.match': ['1003'],
-             'my$process': ['1234'],
-             'foo': ['1000', '1236']},
-            self.device.GetPids())
-
-  def testGetApplicationPids_notFound(self):
-    with self.patch_call(self.call.device.build_version_sdk,
-                         return_value=version_codes.LOLLIPOP):
-      with self.assertCall(
-          self.call.device._RunPipedShellCommand('ps | grep -F match'),
-          self._grepOutput('match')):
-        # No PIDs found, process name should be exact match.
-        self.assertEqual([], self.device.GetApplicationPids('match'))
-
-  def testGetApplicationPids_foundOne(self):
-    with self.patch_call(self.call.device.build_version_sdk,
-                         return_value=version_codes.LOLLIPOP):
-      with self.assertCall(
-          self.call.device._RunPipedShellCommand('ps | grep -F one.match'),
-          self._grepOutput('one.match')):
-        self.assertEqual(['1001'], self.device.GetApplicationPids('one.match'))
-
-  def testGetApplicationPids_foundMany(self):
-    with self.patch_call(self.call.device.build_version_sdk,
-                         return_value=version_codes.LOLLIPOP):
-      with self.assertCall(
-          self.call.device._RunPipedShellCommand('ps | grep -F foo'),
-          self._grepOutput('foo')):
-        self.assertEqual(
-            ['1000', '1236'],
-            self.device.GetApplicationPids('foo'))
-
-  def testGetApplicationPids_atMostOneNotFound(self):
-    with self.patch_call(self.call.device.build_version_sdk,
-                         return_value=version_codes.LOLLIPOP):
-      with self.assertCall(
-          self.call.device._RunPipedShellCommand('ps | grep -F match'),
-          self._grepOutput('match')):
-        # No PIDs found, process name should be exact match.
-        self.assertEqual(
-            None,
-            self.device.GetApplicationPids('match', at_most_one=True))
-
-  def testGetApplicationPids_atMostOneFound(self):
-    with self.patch_call(self.call.device.build_version_sdk,
-                         return_value=version_codes.LOLLIPOP):
-      with self.assertCall(
-          self.call.device._RunPipedShellCommand('ps | grep -F one.match'),
-          self._grepOutput('one.match')):
-        self.assertEqual(
-            '1001',
-            self.device.GetApplicationPids('one.match', at_most_one=True))
-
-  def testGetApplicationPids_atMostOneFoundTooMany(self):
-    with self.patch_call(self.call.device.build_version_sdk,
-                         return_value=version_codes.LOLLIPOP):
-      with self.assertRaises(device_errors.CommandFailedError):
-        with self.assertCall(
-            self.call.device._RunPipedShellCommand('ps | grep -F foo'),
-            self._grepOutput('foo')):
-          self.device.GetApplicationPids('foo', at_most_one=True)
-
-
-class DeviceUtilsGetSetEnforce(DeviceUtilsTest):
-
-  def testGetEnforce_Enforcing(self):
-    with self.assertCall(self.call.adb.Shell('getenforce'), 'Enforcing'):
-      self.assertEqual(True, self.device.GetEnforce())
-
-  def testGetEnforce_Permissive(self):
-    with self.assertCall(self.call.adb.Shell('getenforce'), 'Permissive'):
-      self.assertEqual(False, self.device.GetEnforce())
-
-  def testGetEnforce_Disabled(self):
-    with self.assertCall(self.call.adb.Shell('getenforce'), 'Disabled'):
-      self.assertEqual(None, self.device.GetEnforce())
-
-  def testSetEnforce_Enforcing(self):
-    with self.assertCalls(
-        (self.call.device.NeedsSU(), False),
-        (self.call.adb.Shell('setenforce 1'), '')):
-      self.device.SetEnforce(enabled=True)
-
-  def testSetEnforce_Permissive(self):
-    with self.assertCalls(
-        (self.call.device.NeedsSU(), False),
-        (self.call.adb.Shell('setenforce 0'), '')):
-      self.device.SetEnforce(enabled=False)
-
-  def testSetEnforce_EnforcingWithInt(self):
-    with self.assertCalls(
-        (self.call.device.NeedsSU(), False),
-        (self.call.adb.Shell('setenforce 1'), '')):
-      self.device.SetEnforce(enabled=1)
-
-  def testSetEnforce_PermissiveWithInt(self):
-    with self.assertCalls(
-        (self.call.device.NeedsSU(), False),
-        (self.call.adb.Shell('setenforce 0'), '')):
-      self.device.SetEnforce(enabled=0)
-
-  def testSetEnforce_EnforcingWithStr(self):
-    with self.assertCalls(
-        (self.call.device.NeedsSU(), False),
-        (self.call.adb.Shell('setenforce 1'), '')):
-      self.device.SetEnforce(enabled='1')
-
-  def testSetEnforce_PermissiveWithStr(self):
-    with self.assertCalls(
-        (self.call.device.NeedsSU(), False),
-        (self.call.adb.Shell('setenforce 0'), '')):
-      self.device.SetEnforce(enabled='0')  # Not recommended but it works!
-
-
-class DeviceUtilsTakeScreenshotTest(DeviceUtilsTest):
-
-  def testTakeScreenshot_fileNameProvided(self):
-    with self.assertCalls(
-        (mock.call.devil.android.device_temp_file.DeviceTempFile(
-            self.adb, suffix='.png'),
-         MockTempFile('/tmp/path/temp-123.png')),
-        (self.call.adb.Shell('/system/bin/screencap -p /tmp/path/temp-123.png'),
-         ''),
-        self.call.device.PullFile('/tmp/path/temp-123.png',
-                                  '/test/host/screenshot.png')):
-      self.device.TakeScreenshot('/test/host/screenshot.png')
-
-
-class DeviceUtilsGetMemoryUsageForPidTest(DeviceUtilsTest):
-
-  def setUp(self):
-    super(DeviceUtilsGetMemoryUsageForPidTest, self).setUp()
-
-  def testGetMemoryUsageForPid_validPid(self):
-    with self.assertCalls(
-        (self.call.device._RunPipedShellCommand(
-            'showmap 1234 | grep TOTAL', as_root=True),
-         ['100 101 102 103 104 105 106 107 TOTAL']),
-        (self.call.device.ReadFile('/proc/1234/status', as_root=True),
-         'VmHWM: 1024 kB\n')):
-      self.assertEqual(
-          {
-            'Size': 100,
-            'Rss': 101,
-            'Pss': 102,
-            'Shared_Clean': 103,
-            'Shared_Dirty': 104,
-            'Private_Clean': 105,
-            'Private_Dirty': 106,
-            'VmHWM': 1024
-          },
-          self.device.GetMemoryUsageForPid(1234))
-
-  def testGetMemoryUsageForPid_noSmaps(self):
-    with self.assertCalls(
-        (self.call.device._RunPipedShellCommand(
-            'showmap 4321 | grep TOTAL', as_root=True),
-         ['cannot open /proc/4321/smaps: No such file or directory']),
-        (self.call.device.ReadFile('/proc/4321/status', as_root=True),
-         'VmHWM: 1024 kb\n')):
-      self.assertEquals({'VmHWM': 1024}, self.device.GetMemoryUsageForPid(4321))
-
-  def testGetMemoryUsageForPid_noStatus(self):
-    with self.assertCalls(
-        (self.call.device._RunPipedShellCommand(
-            'showmap 4321 | grep TOTAL', as_root=True),
-         ['100 101 102 103 104 105 106 107 TOTAL']),
-        (self.call.device.ReadFile('/proc/4321/status', as_root=True),
-         self.CommandError())):
-      self.assertEquals(
-          {
-            'Size': 100,
-            'Rss': 101,
-            'Pss': 102,
-            'Shared_Clean': 103,
-            'Shared_Dirty': 104,
-            'Private_Clean': 105,
-            'Private_Dirty': 106,
-          },
-          self.device.GetMemoryUsageForPid(4321))
-
-
-class DeviceUtilsDismissCrashDialogIfNeededTest(DeviceUtilsTest):
-
-  def testDismissCrashDialogIfNeeded_crashedPageckageNotFound(self):
-    sample_dumpsys_output = '''
-WINDOW MANAGER WINDOWS (dumpsys window windows)
-  Window #11 Window{f8b647a u0 SearchPanel}:
-    mDisplayId=0 mSession=Session{8 94:122} mClient=android.os.BinderProxy@1ba5
-    mOwnerUid=100 mShowToOwnerOnly=false package=com.android.systemui appop=NONE
-    mAttrs=WM.LayoutParams{(0,0)(fillxfill) gr=#53 sim=#31 ty=2024 fl=100
-    Requested w=1080 h=1920 mLayoutSeq=426
-    mBaseLayer=211000 mSubLayer=0 mAnimLayer=211000+0=211000 mLastLayer=211000
-'''
-    with self.assertCalls(
-        (self.call.device.RunShellCommand(
-            ['dumpsys', 'window', 'windows'], check_return=True,
-            large_output=True), sample_dumpsys_output.split('\n'))):
-      package_name = self.device.DismissCrashDialogIfNeeded()
-      self.assertIsNone(package_name)
-
-  def testDismissCrashDialogIfNeeded_crashedPageckageFound(self):
-    sample_dumpsys_output = '''
-WINDOW MANAGER WINDOWS (dumpsys window windows)
-  Window #11 Window{f8b647a u0 SearchPanel}:
-    mDisplayId=0 mSession=Session{8 94:122} mClient=android.os.BinderProxy@1ba5
-    mOwnerUid=102 mShowToOwnerOnly=false package=com.android.systemui appop=NONE
-    mAttrs=WM.LayoutParams{(0,0)(fillxfill) gr=#53 sim=#31 ty=2024 fl=100
-    Requested w=1080 h=1920 mLayoutSeq=426
-    mBaseLayer=211000 mSubLayer=0 mAnimLayer=211000+0=211000 mLastLayer=211000
-  mHasPermanentDpad=false
-  mCurrentFocus=Window{3a27740f u0 Application Error: com.android.chrome}
-  mFocusedApp=AppWindowToken{470af6f token=Token{272ec24e ActivityRecord{t894}}}
-'''
-    with self.assertCalls(
-        (self.call.device.RunShellCommand(
-            ['dumpsys', 'window', 'windows'], check_return=True,
-            large_output=True), sample_dumpsys_output.split('\n')),
-        (self.call.device.RunShellCommand(
-            ['input', 'keyevent', '22'], check_return=True)),
-        (self.call.device.RunShellCommand(
-            ['input', 'keyevent', '22'], check_return=True)),
-        (self.call.device.RunShellCommand(
-            ['input', 'keyevent', '66'], check_return=True)),
-        (self.call.device.RunShellCommand(
-            ['dumpsys', 'window', 'windows'], check_return=True,
-            large_output=True), [])):
-      package_name = self.device.DismissCrashDialogIfNeeded()
-      self.assertEqual(package_name, 'com.android.chrome')
-
-
-class DeviceUtilsClientCache(DeviceUtilsTest):
-
-  def testClientCache_twoCaches(self):
-    self.device._cache['test'] = 0
-    client_cache_one = self.device.GetClientCache('ClientOne')
-    client_cache_one['test'] = 1
-    client_cache_two = self.device.GetClientCache('ClientTwo')
-    client_cache_two['test'] = 2
-    self.assertEqual(self.device._cache['test'], 0)
-    self.assertEqual(client_cache_one, {'test': 1})
-    self.assertEqual(client_cache_two, {'test': 2})
-    self.device._ClearCache()
-    self.assertTrue('test' not in self.device._cache)
-    self.assertEqual(client_cache_one, {})
-    self.assertEqual(client_cache_two, {})
-
-  def testClientCache_multipleInstances(self):
-    client_cache_one = self.device.GetClientCache('ClientOne')
-    client_cache_one['test'] = 1
-    client_cache_two = self.device.GetClientCache('ClientOne')
-    self.assertEqual(client_cache_one, {'test': 1})
-    self.assertEqual(client_cache_two, {'test': 1})
-    self.device._ClearCache()
-    self.assertEqual(client_cache_one, {})
-    self.assertEqual(client_cache_two, {})
-
-
-class DeviceUtilsHealthyDevicesTest(mock_calls.TestCase):
-
-  def testHealthyDevices_emptyBlacklist_defaultDeviceArg(self):
-    test_serials = ['0123456789abcdef', 'fedcba9876543210']
-    with self.assertCalls(
-        (mock.call.devil.android.sdk.adb_wrapper.AdbWrapper.Devices(),
-         [_AdbWrapperMock(s) for s in test_serials])):
-      blacklist = mock.NonCallableMock(**{'Read.return_value': []})
-      devices = device_utils.DeviceUtils.HealthyDevices(blacklist)
-    for serial, device in zip(test_serials, devices):
-      self.assertTrue(isinstance(device, device_utils.DeviceUtils))
-      self.assertEquals(serial, device.adb.GetDeviceSerial())
-
-  def testHealthyDevices_blacklist_defaultDeviceArg(self):
-    test_serials = ['0123456789abcdef', 'fedcba9876543210']
-    with self.assertCalls(
-        (mock.call.devil.android.sdk.adb_wrapper.AdbWrapper.Devices(),
-         [_AdbWrapperMock(s) for s in test_serials])):
-      blacklist = mock.NonCallableMock(
-          **{'Read.return_value': ['fedcba9876543210']})
-      devices = device_utils.DeviceUtils.HealthyDevices(blacklist)
-    self.assertEquals(1, len(devices))
-    self.assertTrue(isinstance(devices[0], device_utils.DeviceUtils))
-    self.assertEquals('0123456789abcdef', devices[0].adb.GetDeviceSerial())
-
-  def testHealthyDevices_noneDeviceArg_multiple_attached(self):
-    test_serials = ['0123456789abcdef', 'fedcba9876543210']
-    with self.assertCalls(
-        (mock.call.devil.android.sdk.adb_wrapper.AdbWrapper.Devices(),
-         [_AdbWrapperMock(s) for s in test_serials]),
-        (mock.call.devil.android.device_errors.MultipleDevicesError(mock.ANY),
-         _MockMultipleDevicesError())):
-      with self.assertRaises(_MockMultipleDevicesError):
-        device_utils.DeviceUtils.HealthyDevices(device_arg=None)
-
-  def testHealthyDevices_noneDeviceArg_one_attached(self):
-    test_serials = ['0123456789abcdef']
-    with self.assertCalls(
-        (mock.call.devil.android.sdk.adb_wrapper.AdbWrapper.Devices(),
-         [_AdbWrapperMock(s) for s in test_serials])):
-      devices = device_utils.DeviceUtils.HealthyDevices(device_arg=None)
-    self.assertEquals(1, len(devices))
-
-  def testHealthyDevices_noneDeviceArg_no_attached(self):
-    test_serials = []
-    with self.assertCalls(
-        (mock.call.devil.android.sdk.adb_wrapper.AdbWrapper.Devices(),
-         [_AdbWrapperMock(s) for s in test_serials])):
-      with self.assertRaises(device_errors.NoDevicesError):
-        device_utils.DeviceUtils.HealthyDevices(device_arg=None)
-
-  def testHealthyDevices_noneDeviceArg_multiple_attached_ANDROID_SERIAL(self):
-    try:
-      os.environ['ANDROID_SERIAL'] = '0123456789abcdef'
-      with self.assertCalls():  # Should skip adb devices when device is known.
-        device_utils.DeviceUtils.HealthyDevices(device_arg=None)
-    finally:
-      del os.environ['ANDROID_SERIAL']
-
-  def testHealthyDevices_stringDeviceArg(self):
-    with self.assertCalls():  # Should skip adb devices when device is known.
-      devices = device_utils.DeviceUtils.HealthyDevices(
-          device_arg='0123456789abcdef')
-    self.assertEquals(1, len(devices))
-
-  def testHealthyDevices_EmptyListDeviceArg_multiple_attached(self):
-    test_serials = ['0123456789abcdef', 'fedcba9876543210']
-    with self.assertCalls(
-        (mock.call.devil.android.sdk.adb_wrapper.AdbWrapper.Devices(),
-         [_AdbWrapperMock(s) for s in test_serials])):
-      devices = device_utils.DeviceUtils.HealthyDevices(device_arg=())
-    self.assertEquals(2, len(devices))
-
-  def testHealthyDevices_EmptyListDeviceArg_ANDROID_SERIAL(self):
-    try:
-      os.environ['ANDROID_SERIAL'] = '0123456789abcdef'
-      with self.assertCalls():  # Should skip adb devices when device is known.
-        devices = device_utils.DeviceUtils.HealthyDevices(device_arg=())
-    finally:
-      del os.environ['ANDROID_SERIAL']
-    self.assertEquals(1, len(devices))
-
-  def testHealthyDevices_EmptyListDeviceArg_no_attached(self):
-    test_serials = []
-    with self.assertCalls(
-        (mock.call.devil.android.sdk.adb_wrapper.AdbWrapper.Devices(),
-         [_AdbWrapperMock(s) for s in test_serials])):
-      with self.assertRaises(device_errors.NoDevicesError):
-        device_utils.DeviceUtils.HealthyDevices(device_arg=[])
-
-  def testHealthyDevices_ListDeviceArg(self):
-    device_arg = ['0123456789abcdef', 'fedcba9876543210']
-    try:
-      os.environ['ANDROID_SERIAL'] = 'should-not-apply'
-      with self.assertCalls():  # Should skip adb devices when device is known.
-        devices = device_utils.DeviceUtils.HealthyDevices(device_arg=device_arg)
-    finally:
-      del os.environ['ANDROID_SERIAL']
-    self.assertEquals(2, len(devices))
-
-
-class DeviceUtilsRestartAdbdTest(DeviceUtilsTest):
-
-  def testAdbdRestart(self):
-    mock_temp_file = '/sdcard/temp-123.sh'
-    with self.assertCalls(
-        (mock.call.devil.android.device_temp_file.DeviceTempFile(
-            self.adb, suffix='.sh'), MockTempFile(mock_temp_file)),
-        self.call.device.WriteFile(mock.ANY, mock.ANY),
-        (self.call.device.RunShellCommand(
-            ['source', mock_temp_file], check_return=True, as_root=True)),
-        self.call.adb.WaitForDevice()):
-      self.device.RestartAdbd()
-
-
-class DeviceUtilsGrantPermissionsTest(DeviceUtilsTest):
-
-  def testGrantPermissions_none(self):
-    self.device.GrantPermissions('package', [])
-
-  def testGrantPermissions_underM(self):
-    with self.patch_call(self.call.device.build_version_sdk,
-                         return_value=version_codes.LOLLIPOP):
-      self.device.GrantPermissions('package', ['p1'])
-
-  def testGrantPermissions_one(self):
-    permissions_cmd = 'pm grant package p1'
-    with self.patch_call(self.call.device.build_version_sdk,
-                         return_value=version_codes.MARSHMALLOW):
-      with self.assertCalls(
-          (self.call.device.RunShellCommand(
-              permissions_cmd, shell=True, check_return=True), [])):
-        self.device.GrantPermissions('package', ['p1'])
-
-  def testGrantPermissions_multiple(self):
-    permissions_cmd = 'pm grant package p1&&pm grant package p2'
-    with self.patch_call(self.call.device.build_version_sdk,
-                         return_value=version_codes.MARSHMALLOW):
-      with self.assertCalls(
-          (self.call.device.RunShellCommand(
-              permissions_cmd, shell=True, check_return=True), [])):
-        self.device.GrantPermissions('package', ['p1', 'p2'])
-
-  def testGrantPermissions_WriteExtrnalStorage(self):
-    permissions_cmd = (
-        'pm grant package android.permission.WRITE_EXTERNAL_STORAGE&&'
-        'pm grant package android.permission.READ_EXTERNAL_STORAGE')
-    with self.patch_call(self.call.device.build_version_sdk,
-                         return_value=version_codes.MARSHMALLOW):
-      with self.assertCalls(
-          (self.call.device.RunShellCommand(
-              permissions_cmd, shell=True, check_return=True), [])):
-        self.device.GrantPermissions(
-            'package', ['android.permission.WRITE_EXTERNAL_STORAGE'])
-
-  def testGrantPermissions_BlackList(self):
-    with self.patch_call(self.call.device.build_version_sdk,
-                         return_value=version_codes.MARSHMALLOW):
-      self.device.GrantPermissions(
-          'package', ['android.permission.ACCESS_MOCK_LOCATION'])
-
-
-class DeviecUtilsIsScreenOn(DeviceUtilsTest):
-
-  _L_SCREEN_ON = ['test=test mInteractive=true']
-  _K_SCREEN_ON = ['test=test mScreenOn=true']
-  _L_SCREEN_OFF = ['mInteractive=false']
-  _K_SCREEN_OFF = ['mScreenOn=false']
-
-  def testIsScreenOn_onPreL(self):
-    with self.patch_call(self.call.device.build_version_sdk,
-                         return_value=version_codes.KITKAT):
-      with self.assertCalls(
-          (self.call.device._RunPipedShellCommand(
-              'dumpsys input_method | grep mScreenOn'), self._K_SCREEN_ON)):
-        self.assertTrue(self.device.IsScreenOn())
-
-  def testIsScreenOn_onL(self):
-    with self.patch_call(self.call.device.build_version_sdk,
-                         return_value=version_codes.LOLLIPOP):
-      with self.assertCalls(
-          (self.call.device._RunPipedShellCommand(
-              'dumpsys input_method | grep mInteractive'), self._L_SCREEN_ON)):
-        self.assertTrue(self.device.IsScreenOn())
-
-  def testIsScreenOn_offPreL(self):
-    with self.patch_call(self.call.device.build_version_sdk,
-                         return_value=version_codes.KITKAT):
-      with self.assertCalls(
-          (self.call.device._RunPipedShellCommand(
-              'dumpsys input_method | grep mScreenOn'), self._K_SCREEN_OFF)):
-        self.assertFalse(self.device.IsScreenOn())
-
-  def testIsScreenOn_offL(self):
-    with self.patch_call(self.call.device.build_version_sdk,
-                         return_value=version_codes.LOLLIPOP):
-      with self.assertCalls(
-          (self.call.device._RunPipedShellCommand(
-              'dumpsys input_method | grep mInteractive'), self._L_SCREEN_OFF)):
-        self.assertFalse(self.device.IsScreenOn())
-
-  def testIsScreenOn_noOutput(self):
-    with self.patch_call(self.call.device.build_version_sdk,
-                         return_value=version_codes.LOLLIPOP):
-      with self.assertCalls(
-          (self.call.device._RunPipedShellCommand(
-              'dumpsys input_method | grep mInteractive'), [])):
-        with self.assertRaises(device_errors.CommandFailedError):
-          self.device.IsScreenOn()
-
-
-class DeviecUtilsSetScreen(DeviceUtilsTest):
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testSetScren_alreadySet(self):
-    with self.assertCalls(
-        (self.call.device.IsScreenOn(), False)):
-      self.device.SetScreen(False)
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testSetScreen_on(self):
-    with self.assertCalls(
-        (self.call.device.IsScreenOn(), False),
-        (self.call.device.SendKeyEvent(keyevent.KEYCODE_POWER), None),
-        (self.call.device.IsScreenOn(), True)):
-      self.device.SetScreen(True)
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testSetScreen_off(self):
-    with self.assertCalls(
-        (self.call.device.IsScreenOn(), True),
-        (self.call.device.SendKeyEvent(keyevent.KEYCODE_POWER), None),
-        (self.call.device.IsScreenOn(), False)):
-      self.device.SetScreen(False)
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testSetScreen_slow(self):
-    with self.assertCalls(
-        (self.call.device.IsScreenOn(), True),
-        (self.call.device.SendKeyEvent(keyevent.KEYCODE_POWER), None),
-        (self.call.device.IsScreenOn(), True),
-        (self.call.device.IsScreenOn(), True),
-        (self.call.device.IsScreenOn(), False)):
-      self.device.SetScreen(False)
-
-class DeviecUtilsLoadCacheData(DeviceUtilsTest):
-
-  def testTokenMissing(self):
-    with self.assertCalls(
-        self.EnsureCacheInitialized()):
-      self.assertFalse(self.device.LoadCacheData('{}'))
-
-  def testTokenStale(self):
-    with self.assertCalls(
-        self.EnsureCacheInitialized()):
-      self.assertFalse(self.device.LoadCacheData('{"token":"foo"}'))
-
-  def testTokenMatches(self):
-    with self.assertCalls(
-        self.EnsureCacheInitialized()):
-      self.assertTrue(self.device.LoadCacheData('{"token":"TOKEN"}'))
-
-  def testDumpThenLoad(self):
-    with self.assertCalls(
-        self.EnsureCacheInitialized()):
-      data = json.loads(self.device.DumpCacheData())
-      data['token'] = 'TOKEN'
-      self.assertTrue(self.device.LoadCacheData(json.dumps(data)))
-
-
-if __name__ == '__main__':
-  logging.getLogger().setLevel(logging.DEBUG)
-  unittest.main(verbosity=2)
diff --git a/third_party/catapult/devil/devil/android/fastboot_utils.py b/third_party/catapult/devil/devil/android/fastboot_utils.py
deleted file mode 100644
index 3bd3ee8..0000000
--- a/third_party/catapult/devil/devil/android/fastboot_utils.py
+++ /dev/null
@@ -1,256 +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.
-
-"""Provides a variety of device interactions based on fastboot."""
-# pylint: disable=unused-argument
-
-import collections
-import contextlib
-import fnmatch
-import logging
-import os
-import re
-
-from devil.android import decorators
-from devil.android import device_errors
-from devil.android.sdk import fastboot
-from devil.utils import timeout_retry
-
-logger = logging.getLogger(__name__)
-
-_DEFAULT_TIMEOUT = 30
-_DEFAULT_RETRIES = 3
-_FASTBOOT_REBOOT_TIMEOUT = 10 * _DEFAULT_TIMEOUT
-_KNOWN_PARTITIONS = collections.OrderedDict([
-      ('bootloader', {'image': 'bootloader*.img', 'restart': True}),
-      ('radio', {'image': 'radio*.img', 'restart': True}),
-      ('boot', {'image': 'boot.img'}),
-      ('recovery', {'image': 'recovery.img'}),
-      ('system', {'image': 'system.img'}),
-      ('userdata', {'image': 'userdata.img', 'wipe_only': True}),
-      ('cache', {'image': 'cache.img', 'wipe_only': True}),
-      ('vendor', {'image': 'vendor*.img', 'optional': True}),
-  ])
-ALL_PARTITIONS = _KNOWN_PARTITIONS.keys()
-
-
-def _FindAndVerifyPartitionsAndImages(partitions, directory):
-  """Validate partitions and images.
-
-  Validate all partition names and partition directories. Cannot stop mid
-  flash so its important to validate everything first.
-
-  Args:
-    Partitions: partitions to be tested.
-    directory: directory containing the images.
-
-  Returns:
-    Dictionary with exact partition, image name mapping.
-  """
-
-  files = os.listdir(directory)
-  return_dict = collections.OrderedDict()
-
-  def find_file(pattern):
-    for filename in files:
-      if fnmatch.fnmatch(filename, pattern):
-        return os.path.join(directory, filename)
-    return None
-  for partition in partitions:
-    partition_info = _KNOWN_PARTITIONS[partition]
-    image_file = find_file(partition_info['image'])
-    if image_file:
-      return_dict[partition] = image_file
-    elif not partition_info.get('optional'):
-      raise device_errors.FastbootCommandFailedError(
-          'Failed to flash device. Could not find image for %s.',
-          partition_info['image'])
-  return return_dict
-
-
-class FastbootUtils(object):
-
-  _FASTBOOT_WAIT_TIME = 1
-  _BOARD_VERIFICATION_FILE = 'android-info.txt'
-
-  def __init__(self, device, fastbooter=None, default_timeout=_DEFAULT_TIMEOUT,
-               default_retries=_DEFAULT_RETRIES):
-    """FastbootUtils constructor.
-
-    Example Usage to flash a device:
-      fastboot = fastboot_utils.FastbootUtils(device)
-      fastboot.FlashDevice('/path/to/build/directory')
-
-    Args:
-      device: A DeviceUtils instance.
-      fastbooter: Optional fastboot object. If none is passed, one will
-        be created.
-      default_timeout: An integer containing the default number of seconds to
-        wait for an operation to complete if no explicit value is provided.
-      default_retries: An integer containing the default number or times an
-        operation should be retried on failure if no explicit value is provided.
-    """
-    self._device = device
-    self._board = device.product_board
-    self._serial = str(device)
-    self._default_timeout = default_timeout
-    self._default_retries = default_retries
-    if fastbooter:
-      self.fastboot = fastbooter
-    else:
-      self.fastboot = fastboot.Fastboot(self._serial)
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def WaitForFastbootMode(self, timeout=None, retries=None):
-    """Wait for device to boot into fastboot mode.
-
-    This waits for the device serial to show up in fastboot devices output.
-    """
-    def fastboot_mode():
-      return self._serial in self.fastboot.Devices()
-
-    timeout_retry.WaitFor(fastboot_mode, wait_period=self._FASTBOOT_WAIT_TIME)
-
-  @decorators.WithTimeoutAndRetriesFromInstance(
-      min_default_timeout=_FASTBOOT_REBOOT_TIMEOUT)
-  def EnableFastbootMode(self, timeout=None, retries=None):
-    """Reboots phone into fastboot mode.
-
-    Roots phone if needed, then reboots phone into fastboot mode and waits.
-    """
-    self._device.EnableRoot()
-    self._device.adb.Reboot(to_bootloader=True)
-    self.WaitForFastbootMode()
-
-  @decorators.WithTimeoutAndRetriesFromInstance(
-      min_default_timeout=_FASTBOOT_REBOOT_TIMEOUT)
-  def Reboot(
-      self, bootloader=False, wait_for_reboot=True, timeout=None, retries=None):
-    """Reboots out of fastboot mode.
-
-    It reboots the phone either back into fastboot, or to a regular boot. It
-    then blocks until the device is ready.
-
-    Args:
-      bootloader: If set to True, reboots back into bootloader.
-    """
-    if bootloader:
-      self.fastboot.RebootBootloader()
-      self.WaitForFastbootMode()
-    else:
-      self.fastboot.Reboot()
-      if wait_for_reboot:
-        self._device.WaitUntilFullyBooted(timeout=_FASTBOOT_REBOOT_TIMEOUT)
-
-  def _VerifyBoard(self, directory):
-    """Validate as best as possible that the android build matches the device.
-
-    Goes through build files and checks if the board name is mentioned in the
-    |self._BOARD_VERIFICATION_FILE| or in the build archive.
-
-    Args:
-      directory: directory where build files are located.
-    """
-    files = os.listdir(directory)
-    board_regex = re.compile(r'require board=(\w+)')
-    if self._BOARD_VERIFICATION_FILE in files:
-      with open(os.path.join(directory, self._BOARD_VERIFICATION_FILE)) as f:
-        for line in f:
-          m = board_regex.match(line)
-          if m:
-            board_name = m.group(1)
-            if board_name == self._board:
-              return True
-            elif board_name:
-              return False
-            else:
-              logger.warning('No board type found in %s.',
-                             self._BOARD_VERIFICATION_FILE)
-    else:
-      logger.warning('%s not found. Unable to use it to verify device.',
-                     self._BOARD_VERIFICATION_FILE)
-
-    zip_regex = re.compile(r'.*%s.*\.zip' % re.escape(self._board))
-    for f in files:
-      if zip_regex.match(f):
-        return True
-
-    return False
-
-  def _FlashPartitions(self, partitions, directory, wipe=False, force=False):
-    """Flashes all given partiitons with all given images.
-
-    Args:
-      partitions: List of partitions to flash.
-      directory: Directory where all partitions can be found.
-      wipe: If set to true, will automatically detect if cache and userdata
-          partitions are sent, and if so ignore them.
-      force: boolean to decide to ignore board name safety checks.
-
-    Raises:
-      device_errors.CommandFailedError(): If image cannot be found or if bad
-          partition name is give.
-    """
-    if not self._VerifyBoard(directory):
-      if force:
-        logger.warning('Could not verify build is meant to be installed on '
-                       'the current device type, but force flag is set. '
-                       'Flashing device. Possibly dangerous operation.')
-      else:
-        raise device_errors.CommandFailedError(
-            'Could not verify build is meant to be installed on the current '
-            'device type. Run again with force=True to force flashing with an '
-            'unverified board.')
-
-    flash_image_files = _FindAndVerifyPartitionsAndImages(partitions, directory)
-    partitions = flash_image_files.keys()
-    for partition in partitions:
-      if _KNOWN_PARTITIONS[partition].get('wipe_only') and not wipe:
-        logger.info(
-            'Not flashing in wipe mode. Skipping partition %s.', partition)
-      else:
-        logger.info(
-            'Flashing %s with %s', partition, flash_image_files[partition])
-        self.fastboot.Flash(partition, flash_image_files[partition])
-        if _KNOWN_PARTITIONS[partition].get('restart', False):
-          self.Reboot(bootloader=True)
-
-  @contextlib.contextmanager
-  def FastbootMode(self, wait_for_reboot=True, timeout=None, retries=None):
-    """Context manager that enables fastboot mode, and reboots after.
-
-    Example usage:
-      with FastbootMode():
-        Flash Device
-      # Anything that runs after flashing.
-    """
-    self.EnableFastbootMode()
-    self.fastboot.SetOemOffModeCharge(False)
-    try:
-      yield self
-    finally:
-      self.fastboot.SetOemOffModeCharge(True)
-      self.Reboot(wait_for_reboot=wait_for_reboot)
-
-  def FlashDevice(self, directory, partitions=None, wipe=False):
-    """Flash device with build in |directory|.
-
-    Directory must contain bootloader, radio, boot, recovery, system, userdata,
-    and cache .img files from an android build. This is a dangerous operation so
-    use with care.
-
-    Args:
-      fastboot: A FastbootUtils instance.
-      directory: Directory with build files.
-      wipe: Wipes cache and userdata if set to true.
-      partitions: List of partitions to flash. Defaults to all.
-    """
-    if partitions is None:
-      partitions = ALL_PARTITIONS
-    # If a device is wiped, then it will no longer have adb keys so it cannot be
-    # communicated with to verify that it is rebooted. It is up to the user of
-    # this script to ensure that the adb keys are set on the device after using
-    # this to wipe a device.
-    with self.FastbootMode(wait_for_reboot=not wipe):
-      self._FlashPartitions(partitions, directory, wipe=wipe)
diff --git a/third_party/catapult/devil/devil/android/fastboot_utils_test.py b/third_party/catapult/devil/devil/android/fastboot_utils_test.py
deleted file mode 100755
index 0562974..0000000
--- a/third_party/catapult/devil/devil/android/fastboot_utils_test.py
+++ /dev/null
@@ -1,375 +0,0 @@
-#!/usr/bin/env python
-# 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.
-
-"""
-Unit tests for the contents of fastboot_utils.py
-"""
-
-# pylint: disable=protected-access,unused-argument
-
-import collections
-import io
-import logging
-import unittest
-
-from devil import devil_env
-from devil.android import device_errors
-from devil.android import device_utils
-from devil.android import fastboot_utils
-from devil.android.sdk import fastboot
-from devil.utils import mock_calls
-
-with devil_env.SysPath(devil_env.PYMOCK_PATH):
-  import mock  # pylint: disable=import-error
-
-_BOARD = 'board_type'
-_SERIAL = '0123456789abcdef'
-_PARTITIONS = [
-    'bootloader', 'radio', 'boot', 'recovery', 'system', 'userdata', 'cache']
-_IMAGES = collections.OrderedDict([
-    ('bootloader', 'bootloader.img'),
-    ('radio', 'radio.img'),
-    ('boot', 'boot.img'),
-    ('recovery', 'recovery.img'),
-    ('system', 'system.img'),
-    ('userdata', 'userdata.img'),
-    ('cache', 'cache.img')
-])
-_VALID_FILES = [_BOARD + '.zip', 'android-info.txt']
-_INVALID_FILES = ['test.zip', 'android-info.txt']
-
-
-class MockFile(object):
-
-  def __init__(self, name='/tmp/some/file'):
-    self.file = mock.MagicMock(spec=file)
-    self.file.name = name
-
-  def __enter__(self):
-    return self.file
-
-  def __exit__(self, exc_type, exc_val, exc_tb):
-    pass
-
-  @property
-  def name(self):
-    return self.file.name
-
-
-def _FastbootWrapperMock(test_serial):
-  fastbooter = mock.Mock(spec=fastboot.Fastboot)
-  fastbooter.__str__ = mock.Mock(return_value=test_serial)
-  fastbooter.Devices.return_value = [test_serial]
-  return fastbooter
-
-
-def _DeviceUtilsMock(test_serial):
-  device = mock.Mock(spec=device_utils.DeviceUtils)
-  device.__str__ = mock.Mock(return_value=test_serial)
-  device.product_board = mock.Mock(return_value=_BOARD)
-  device.adb = mock.Mock()
-  return device
-
-
-class FastbootUtilsTest(mock_calls.TestCase):
-
-  def setUp(self):
-    self.device_utils_mock = _DeviceUtilsMock(_SERIAL)
-    self.fastboot_wrapper = _FastbootWrapperMock(_SERIAL)
-    self.fastboot = fastboot_utils.FastbootUtils(
-        self.device_utils_mock, fastbooter=self.fastboot_wrapper,
-        default_timeout=2, default_retries=0)
-    self.fastboot._board = _BOARD
-
-
-class FastbootUtilsInitTest(FastbootUtilsTest):
-
-  def testInitWithDeviceUtil(self):
-    f = fastboot_utils.FastbootUtils(self.device_utils_mock)
-    self.assertEqual(str(self.device_utils_mock), str(f._device))
-
-  def testInitWithMissing_fails(self):
-    with self.assertRaises(AttributeError):
-      fastboot_utils.FastbootUtils(None)
-    with self.assertRaises(AttributeError):
-      fastboot_utils.FastbootUtils('')
-
-  def testPartitionOrdering(self):
-    parts = ['bootloader', 'radio', 'boot', 'recovery', 'system', 'userdata',
-             'cache', 'vendor']
-    self.assertListEqual(fastboot_utils.ALL_PARTITIONS, parts)
-
-
-class FastbootUtilsWaitForFastbootMode(FastbootUtilsTest):
-
-  # If this test fails by timing out after 1 second.
-  @mock.patch('time.sleep', mock.Mock())
-  def testWaitForFastbootMode(self):
-    self.fastboot.WaitForFastbootMode()
-
-
-class FastbootUtilsEnableFastbootMode(FastbootUtilsTest):
-
-  def testEnableFastbootMode(self):
-    with self.assertCalls(
-        self.call.fastboot._device.EnableRoot(),
-        self.call.fastboot._device.adb.Reboot(to_bootloader=True),
-        self.call.fastboot.WaitForFastbootMode()):
-      self.fastboot.EnableFastbootMode()
-
-
-class FastbootUtilsReboot(FastbootUtilsTest):
-
-  def testReboot_bootloader(self):
-    with self.assertCalls(
-        self.call.fastboot.fastboot.RebootBootloader(),
-        self.call.fastboot.WaitForFastbootMode()):
-      self.fastboot.Reboot(bootloader=True)
-
-  def testReboot_normal(self):
-    with self.assertCalls(
-        self.call.fastboot.fastboot.Reboot(),
-        self.call.fastboot._device.WaitUntilFullyBooted(timeout=mock.ANY)):
-      self.fastboot.Reboot()
-
-
-class FastbootUtilsFlashPartitions(FastbootUtilsTest):
-
-  def testFlashPartitions_wipe(self):
-    with self.assertCalls(
-        (self.call.fastboot._VerifyBoard('test'), True),
-        (mock.call.devil.android.fastboot_utils.
-            _FindAndVerifyPartitionsAndImages(_PARTITIONS, 'test'), _IMAGES),
-        (self.call.fastboot.fastboot.Flash('bootloader', 'bootloader.img')),
-        (self.call.fastboot.Reboot(bootloader=True)),
-        (self.call.fastboot.fastboot.Flash('radio', 'radio.img')),
-        (self.call.fastboot.Reboot(bootloader=True)),
-        (self.call.fastboot.fastboot.Flash('boot', 'boot.img')),
-        (self.call.fastboot.fastboot.Flash('recovery', 'recovery.img')),
-        (self.call.fastboot.fastboot.Flash('system', 'system.img')),
-        (self.call.fastboot.fastboot.Flash('userdata', 'userdata.img')),
-        (self.call.fastboot.fastboot.Flash('cache', 'cache.img'))):
-      self.fastboot._FlashPartitions(_PARTITIONS, 'test', wipe=True)
-
-  def testFlashPartitions_noWipe(self):
-    with self.assertCalls(
-        (self.call.fastboot._VerifyBoard('test'), True),
-        (mock.call.devil.android.fastboot_utils.
-            _FindAndVerifyPartitionsAndImages(_PARTITIONS, 'test'), _IMAGES),
-        (self.call.fastboot.fastboot.Flash('bootloader', 'bootloader.img')),
-        (self.call.fastboot.Reboot(bootloader=True)),
-        (self.call.fastboot.fastboot.Flash('radio', 'radio.img')),
-        (self.call.fastboot.Reboot(bootloader=True)),
-        (self.call.fastboot.fastboot.Flash('boot', 'boot.img')),
-        (self.call.fastboot.fastboot.Flash('recovery', 'recovery.img')),
-        (self.call.fastboot.fastboot.Flash('system', 'system.img'))):
-      self.fastboot._FlashPartitions(_PARTITIONS, 'test')
-
-
-class FastbootUtilsFastbootMode(FastbootUtilsTest):
-
-  def testFastbootMode_goodWait(self):
-    with self.assertCalls(
-        self.call.fastboot.EnableFastbootMode(),
-        self.call.fastboot.fastboot.SetOemOffModeCharge(False),
-        self.call.fastboot.fastboot.SetOemOffModeCharge(True),
-        self.call.fastboot.Reboot(wait_for_reboot=True)):
-      with self.fastboot.FastbootMode() as fbm:
-        self.assertEqual(self.fastboot, fbm)
-
-  def testFastbootMode_goodNoWait(self):
-    with self.assertCalls(
-        self.call.fastboot.EnableFastbootMode(),
-        self.call.fastboot.fastboot.SetOemOffModeCharge(False),
-        self.call.fastboot.fastboot.SetOemOffModeCharge(True),
-        self.call.fastboot.Reboot(wait_for_reboot=False)):
-      with self.fastboot.FastbootMode(wait_for_reboot=False) as fbm:
-        self.assertEqual(self.fastboot, fbm)
-
-  def testFastbootMode_exception(self):
-    with self.assertCalls(
-        self.call.fastboot.EnableFastbootMode(),
-        self.call.fastboot.fastboot.SetOemOffModeCharge(False),
-        self.call.fastboot.fastboot.SetOemOffModeCharge(True),
-        self.call.fastboot.Reboot(wait_for_reboot=True)):
-      with self.assertRaises(NotImplementedError):
-        with self.fastboot.FastbootMode() as fbm:
-          self.assertEqual(self.fastboot, fbm)
-          raise NotImplementedError
-
-  def testFastbootMode_exceptionInEnableFastboot(self):
-    self.fastboot.EnableFastbootMode = mock.Mock()
-    self.fastboot.EnableFastbootMode.side_effect = NotImplementedError
-    with self.assertRaises(NotImplementedError):
-      with self.fastboot.FastbootMode():
-        pass
-
-
-class FastbootUtilsVerifyBoard(FastbootUtilsTest):
-
-  def testVerifyBoard_bothValid(self):
-    mock_file = io.StringIO(u'require board=%s\n' % _BOARD)
-    with mock.patch('__builtin__.open', return_value=mock_file, create=True):
-      with mock.patch('os.listdir', return_value=_VALID_FILES):
-        self.assertTrue(self.fastboot._VerifyBoard('test'))
-
-  def testVerifyBoard_BothNotValid(self):
-    mock_file = io.StringIO(u'abc')
-    with mock.patch('__builtin__.open', return_value=mock_file, create=True):
-      with mock.patch('os.listdir', return_value=_INVALID_FILES):
-        self.assertFalse(self.assertFalse(self.fastboot._VerifyBoard('test')))
-
-  def testVerifyBoard_FileNotFoundZipValid(self):
-    with mock.patch('os.listdir', return_value=[_BOARD + '.zip']):
-      self.assertTrue(self.fastboot._VerifyBoard('test'))
-
-  def testVerifyBoard_ZipNotFoundFileValid(self):
-    mock_file = io.StringIO(u'require board=%s\n' % _BOARD)
-    with mock.patch('__builtin__.open', return_value=mock_file, create=True):
-      with mock.patch('os.listdir', return_value=['android-info.txt']):
-        self.assertTrue(self.fastboot._VerifyBoard('test'))
-
-  def testVerifyBoard_zipNotValidFileIs(self):
-    mock_file = io.StringIO(u'require board=%s\n' % _BOARD)
-    with mock.patch('__builtin__.open', return_value=mock_file, create=True):
-      with mock.patch('os.listdir', return_value=_INVALID_FILES):
-        self.assertTrue(self.fastboot._VerifyBoard('test'))
-
-  def testVerifyBoard_fileNotValidZipIs(self):
-    mock_file = io.StringIO(u'require board=WrongBoard')
-    with mock.patch('__builtin__.open', return_value=mock_file, create=True):
-      with mock.patch('os.listdir', return_value=_VALID_FILES):
-        self.assertFalse(self.fastboot._VerifyBoard('test'))
-
-  def testVerifyBoard_noBoardInFileValidZip(self):
-    mock_file = io.StringIO(u'Regex wont match')
-    with mock.patch('__builtin__.open', return_value=mock_file, create=True):
-      with mock.patch('os.listdir', return_value=_VALID_FILES):
-        self.assertTrue(self.fastboot._VerifyBoard('test'))
-
-  def testVerifyBoard_noBoardInFileInvalidZip(self):
-    mock_file = io.StringIO(u'Regex wont match')
-    with mock.patch('__builtin__.open', return_value=mock_file, create=True):
-      with mock.patch('os.listdir', return_value=_INVALID_FILES):
-        self.assertFalse(self.fastboot._VerifyBoard('test'))
-
-
-class FastbootUtilsFindAndVerifyPartitionsAndImages(FastbootUtilsTest):
-
-  def testFindAndVerifyPartitionsAndImages_validNoVendor(self):
-    PARTITIONS = [
-        'bootloader', 'radio', 'boot', 'recovery', 'system', 'userdata',
-        'cache', 'vendor'
-    ]
-    files = [
-        'bootloader-test-.img',
-        'radio123.img',
-        'boot.img',
-        'recovery.img',
-        'system.img',
-        'userdata.img',
-        'cache.img'
-    ]
-    img_check = collections.OrderedDict([
-      ('bootloader', 'test/bootloader-test-.img'),
-      ('radio', 'test/radio123.img'),
-      ('boot', 'test/boot.img'),
-      ('recovery', 'test/recovery.img'),
-      ('system', 'test/system.img'),
-      ('userdata', 'test/userdata.img'),
-      ('cache', 'test/cache.img'),
-    ])
-    parts_check = [
-        'bootloader', 'radio', 'boot', 'recovery', 'system', 'userdata',
-        'cache'
-    ]
-    with mock.patch('os.listdir', return_value=files):
-      imgs = fastboot_utils._FindAndVerifyPartitionsAndImages(
-          PARTITIONS, 'test')
-      parts = imgs.keys()
-      self.assertDictEqual(imgs, img_check)
-      self.assertListEqual(parts, parts_check)
-
-  def testFindAndVerifyPartitionsAndImages_validVendor(self):
-    PARTITIONS = [
-        'bootloader', 'radio', 'boot', 'recovery', 'system', 'userdata',
-        'cache', 'vendor'
-    ]
-    files = [
-        'bootloader-test-.img',
-        'radio123.img',
-        'boot.img',
-        'recovery.img',
-        'system.img',
-        'userdata.img',
-        'cache.img',
-        'vendor.img'
-    ]
-    img_check = {
-      'bootloader': 'test/bootloader-test-.img',
-      'radio': 'test/radio123.img',
-      'boot': 'test/boot.img',
-      'recovery': 'test/recovery.img',
-      'system': 'test/system.img',
-      'userdata': 'test/userdata.img',
-      'cache': 'test/cache.img',
-      'vendor': 'test/vendor.img',
-    }
-    parts_check = [
-        'bootloader', 'radio', 'boot', 'recovery', 'system', 'userdata',
-        'cache', 'vendor'
-    ]
-
-    with mock.patch('os.listdir', return_value=files):
-      imgs = fastboot_utils._FindAndVerifyPartitionsAndImages(
-          PARTITIONS, 'test')
-      parts = imgs.keys()
-      self.assertDictEqual(imgs, img_check)
-      self.assertListEqual(parts, parts_check)
-
-  def testFindAndVerifyPartitionsAndImages_badPartition(self):
-    with mock.patch('os.listdir', return_value=['test']):
-      with self.assertRaises(KeyError):
-        fastboot_utils._FindAndVerifyPartitionsAndImages(['test'], 'test')
-
-  def testFindAndVerifyPartitionsAndImages_noFile(self):
-    with mock.patch('os.listdir', return_value=['test']):
-      with self.assertRaises(device_errors.FastbootCommandFailedError):
-        fastboot_utils._FindAndVerifyPartitionsAndImages(['cache'], 'test')
-
-
-class FastbootUtilsFlashDevice(FastbootUtilsTest):
-
-  def testFlashDevice_wipe(self):
-    with self.assertCalls(
-        self.call.fastboot.EnableFastbootMode(),
-        self.call.fastboot.fastboot.SetOemOffModeCharge(False),
-        self.call.fastboot._FlashPartitions(mock.ANY, 'test', wipe=True),
-        self.call.fastboot.fastboot.SetOemOffModeCharge(True),
-        self.call.fastboot.Reboot(wait_for_reboot=False)):
-      self.fastboot.FlashDevice('test', wipe=True)
-
-  def testFlashDevice_noWipe(self):
-    with self.assertCalls(
-        self.call.fastboot.EnableFastbootMode(),
-        self.call.fastboot.fastboot.SetOemOffModeCharge(False),
-        self.call.fastboot._FlashPartitions(mock.ANY, 'test', wipe=False),
-        self.call.fastboot.fastboot.SetOemOffModeCharge(True),
-        self.call.fastboot.Reboot(wait_for_reboot=True)):
-      self.fastboot.FlashDevice('test', wipe=False)
-
-  def testFlashDevice_partitions(self):
-    with self.assertCalls(
-        self.call.fastboot.EnableFastbootMode(),
-        self.call.fastboot.fastboot.SetOemOffModeCharge(False),
-        self.call.fastboot._FlashPartitions(['boot'], 'test', wipe=False),
-        self.call.fastboot.fastboot.SetOemOffModeCharge(True),
-        self.call.fastboot.Reboot(wait_for_reboot=True)):
-      self.fastboot.FlashDevice('test', partitions=['boot'], wipe=False)
-
-
-if __name__ == '__main__':
-  logging.getLogger().setLevel(logging.DEBUG)
-  unittest.main(verbosity=2)
diff --git a/third_party/catapult/devil/devil/android/flag_changer.py b/third_party/catapult/devil/devil/android/flag_changer.py
deleted file mode 100644
index b2ee8b1..0000000
--- a/third_party/catapult/devil/devil/android/flag_changer.py
+++ /dev/null
@@ -1,300 +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.
-
-import contextlib
-import logging
-import posixpath
-import re
-
-from devil.android.sdk import version_codes
-
-
-logger = logging.getLogger(__name__)
-
-
-_CMDLINE_DIR = '/data/local/tmp'
-_CMDLINE_DIR_LEGACY = '/data/local'
-_RE_NEEDS_QUOTING = re.compile(r'[^\w-]')  # Not in: alphanumeric or hyphens.
-_QUOTES = '"\''  # Either a single or a double quote.
-_ESCAPE = '\\'  # A backslash.
-
-
-@contextlib.contextmanager
-def CustomCommandLineFlags(device, cmdline_name, flags):
-  """Context manager to change Chrome's command line temporarily.
-
-  Example:
-
-      with flag_changer.TemporaryCommandLineFlags(device, name, flags):
-        # Launching Chrome will use the provided flags.
-
-      # Previous set of flags on the device is now restored.
-
-  Args:
-    device: A DeviceUtils instance.
-    cmdline_name: Name of the command line file where to store flags.
-    flags: A sequence of command line flags to set.
-  """
-  # On Android N and above, we need to temporarily set SELinux to permissive
-  # so that Chrome is allowed to read the command line file.
-  # TODO(crbug.com/699082): Remove when a solution to avoid this is implemented.
-  needs_permissive = (
-      device.build_version_sdk >= version_codes.NOUGAT and
-      device.GetEnforce())
-  if needs_permissive:
-    device.SetEnforce(enabled=False)
-  try:
-    changer = FlagChanger(device, cmdline_name)
-    try:
-      changer.ReplaceFlags(flags)
-      yield
-    finally:
-      changer.Restore()
-  finally:
-    if needs_permissive:
-      device.SetEnforce(enabled=True)
-
-
-class FlagChanger(object):
-  """Changes the flags Chrome runs with.
-
-    Flags can be temporarily set for a particular set of unit tests.  These
-    tests should call Restore() to revert the flags to their original state
-    once the tests have completed.
-  """
-
-  def __init__(self, device, cmdline_file):
-    """Initializes the FlagChanger and records the original arguments.
-
-    Args:
-      device: A DeviceUtils instance.
-      cmdline_file: Name of the command line file where to store flags.
-    """
-    self._device = device
-
-    if posixpath.sep in cmdline_file:
-      raise ValueError(
-          'cmdline_file should be a file name only, do not include path'
-          ' separators in: %s' % cmdline_file)
-    self._cmdline_path = posixpath.join(_CMDLINE_DIR, cmdline_file)
-
-    cmdline_path_legacy = posixpath.join(_CMDLINE_DIR_LEGACY, cmdline_file)
-    if self._device.PathExists(cmdline_path_legacy):
-      logging.warning(
-            'Removing legacy command line file %r.', cmdline_path_legacy)
-      self._device.RemovePath(cmdline_path_legacy, as_root=True)
-
-    self._state_stack = [None]  # Actual state is set by GetCurrentFlags().
-    self.GetCurrentFlags()
-
-  def GetCurrentFlags(self):
-    """Read the current flags currently stored in the device.
-
-    Also updates the internal state of the flag_changer.
-
-    Returns:
-      A list of flags.
-    """
-    if self._device.PathExists(self._cmdline_path):
-      command_line = self._device.ReadFile(self._cmdline_path).strip()
-    else:
-      command_line = ''
-    flags = _ParseFlags(command_line)
-
-    # Store the flags as a set to facilitate adding and removing flags.
-    self._state_stack[-1] = set(flags)
-    return flags
-
-  def ReplaceFlags(self, flags):
-    """Replaces the flags in the command line with the ones provided.
-       Saves the current flags state on the stack, so a call to Restore will
-       change the state back to the one preceeding the call to ReplaceFlags.
-
-    Args:
-      flags: A sequence of command line flags to set, eg. ['--single-process'].
-             Note: this should include flags only, not the name of a command
-             to run (ie. there is no need to start the sequence with 'chrome').
-
-    Returns:
-      A list with the flags now stored on the device.
-    """
-    new_flags = set(flags)
-    self._state_stack.append(new_flags)
-    return self._UpdateCommandLineFile()
-
-  def AddFlags(self, flags):
-    """Appends flags to the command line if they aren't already there.
-       Saves the current flags state on the stack, so a call to Restore will
-       change the state back to the one preceeding the call to AddFlags.
-
-    Args:
-      flags: A sequence of flags to add on, eg. ['--single-process'].
-
-    Returns:
-      A list with the flags now stored on the device.
-    """
-    return self.PushFlags(add=flags)
-
-  def RemoveFlags(self, flags):
-    """Removes flags from the command line, if they exist.
-       Saves the current flags state on the stack, so a call to Restore will
-       change the state back to the one preceeding the call to RemoveFlags.
-
-       Note that calling RemoveFlags after AddFlags will result in having
-       two nested states.
-
-    Args:
-      flags: A sequence of flags to remove, eg. ['--single-process'].  Note
-             that we expect a complete match when removing flags; if you want
-             to remove a switch with a value, you must use the exact string
-             used to add it in the first place.
-
-    Returns:
-      A list with the flags now stored on the device.
-    """
-    return self.PushFlags(remove=flags)
-
-  def PushFlags(self, add=None, remove=None):
-    """Appends and removes flags to/from the command line if they aren't already
-       there. Saves the current flags state on the stack, so a call to Restore
-       will change the state back to the one preceeding the call to PushFlags.
-
-    Args:
-      add: A list of flags to add on, eg. ['--single-process'].
-      remove: A list of flags to remove, eg. ['--single-process'].  Note that we
-              expect a complete match when removing flags; if you want to remove
-              a switch with a value, you must use the exact string used to add
-              it in the first place.
-
-    Returns:
-      A list with the flags now stored on the device.
-    """
-    new_flags = self._state_stack[-1].copy()
-    if add:
-      new_flags.update(add)
-    if remove:
-      new_flags.difference_update(remove)
-    return self.ReplaceFlags(new_flags)
-
-  def Restore(self):
-    """Restores the flags to their state prior to the last AddFlags or
-       RemoveFlags call.
-
-    Returns:
-      A list with the flags now stored on the device.
-    """
-    # The initial state must always remain on the stack.
-    assert len(self._state_stack) > 1, (
-      "Mismatch between calls to Add/RemoveFlags and Restore")
-    self._state_stack.pop()
-    return self._UpdateCommandLineFile()
-
-  def _UpdateCommandLineFile(self):
-    """Writes out the command line to the file, or removes it if empty.
-
-    Returns:
-      A list with the flags now stored on the device.
-    """
-    command_line = _SerializeFlags(self._state_stack[-1])
-    if command_line is not None:
-      self._device.WriteFile(self._cmdline_path, command_line)
-    else:
-      self._device.RemovePath(self._cmdline_path, force=True)
-
-    current_flags = self.GetCurrentFlags()
-    logger.info('Flags now set on the device: %s', current_flags)
-    return current_flags
-
-
-def _ParseFlags(line):
-  """Parse the string containing the command line into a list of flags.
-
-  It's a direct port of CommandLine.java::tokenizeQuotedArguments.
-
-  The first token is assumed to be the (unused) program name and stripped off
-  from the list of flags.
-
-  Args:
-    line: A string containing the entire command line.  The first token is
-          assumed to be the program name.
-
-  Returns:
-     A list of flags, with quoting removed.
-  """
-  flags = []
-  current_quote = None
-  current_flag = None
-
-  for c in line:
-    # Detect start or end of quote block.
-    if (current_quote is None and c in _QUOTES) or c == current_quote:
-      if current_flag is not None and current_flag[-1] == _ESCAPE:
-        # Last char was a backslash; pop it, and treat c as a literal.
-        current_flag = current_flag[:-1] + c
-      else:
-        current_quote = c if current_quote is None else None
-    elif current_quote is None and c.isspace():
-      if current_flag is not None:
-        flags.append(current_flag)
-        current_flag = None
-    else:
-      if current_flag is None:
-        current_flag = ''
-      current_flag += c
-
-  if current_flag is not None:
-    if current_quote is not None:
-      logger.warning('Unterminated quoted argument: ' + current_flag)
-    flags.append(current_flag)
-
-  # Return everything but the program name.
-  return flags[1:]
-
-
-def _SerializeFlags(flags):
-  """Serialize a sequence of flags into a command line string.
-
-  Args:
-    flags: A sequence of strings with individual flags.
-
-  Returns:
-    A line with the command line contents to save; or None if the sequence of
-    flags is empty.
-  """
-  if flags:
-    # The first command line argument doesn't matter as we are not actually
-    # launching the chrome executable using this command line.
-    args = ['_']
-    args.extend(_QuoteFlag(f) for f in flags)
-    return ' '.join(args)
-  else:
-    return None
-
-
-def _QuoteFlag(flag):
-  """Validate and quote a single flag.
-
-  Args:
-    A string with the flag to quote.
-
-  Returns:
-    A string with the flag quoted so that it can be parsed by the algorithm
-    in _ParseFlags; or None if the flag does not appear to be valid.
-  """
-  if '=' in flag:
-    key, value = flag.split('=', 1)
-  else:
-    key, value = flag, None
-
-  if not flag or _RE_NEEDS_QUOTING.search(key):
-    # Probably not a valid flag, but quote the whole thing so it can be
-    # parsed back correctly.
-    return '"%s"' % flag.replace('"', r'\"')
-
-  if value is None:
-    return key
-
-  if _RE_NEEDS_QUOTING.search(value):
-    value = '"%s"' % value.replace('"', r'\"')
-  return '='.join([key, value])
diff --git a/third_party/catapult/devil/devil/android/flag_changer_devicetest.py b/third_party/catapult/devil/devil/android/flag_changer_devicetest.py
deleted file mode 100644
index b75504b..0000000
--- a/third_party/catapult/devil/devil/android/flag_changer_devicetest.py
+++ /dev/null
@@ -1,88 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""
-Unit tests for the contents of flag_changer.py.
-The test will invoke real devices
-"""
-
-import os
-import posixpath
-import sys
-import unittest
-
-if __name__ == '__main__':
-  sys.path.append(
-      os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..', )))
-
-from devil.android import device_test_case
-from devil.android import device_utils
-from devil.android import flag_changer
-from devil.android.sdk import adb_wrapper
-
-
-_CMDLINE_FILE = 'dummy-command-line'
-
-
-class FlagChangerTest(device_test_case.DeviceTestCase):
-
-  def setUp(self):
-    super(FlagChangerTest, self).setUp()
-    self.adb = adb_wrapper.AdbWrapper(self.serial)
-    self.adb.WaitForDevice()
-    self.device = device_utils.DeviceUtils(
-        self.adb, default_timeout=10, default_retries=0)
-    # pylint: disable=protected-access
-    self.cmdline_path = posixpath.join(flag_changer._CMDLINE_DIR, _CMDLINE_FILE)
-    self.cmdline_path_legacy = posixpath.join(
-        flag_changer._CMDLINE_DIR_LEGACY, _CMDLINE_FILE)
-
-  def tearDown(self):
-    super(FlagChangerTest, self).tearDown()
-    self.device.RemovePath(
-        [self.cmdline_path, self.cmdline_path_legacy], force=True, as_root=True)
-
-  def testFlagChanger_restoreFlags(self):
-    if not self.device.HasRoot():
-      self.skipTest('Test needs a rooted device')
-
-    # Write some custom chrome command line flags.
-    self.device.WriteFile(
-        self.cmdline_path, 'chrome --some --old --flags')
-
-    # Write some more flags on a command line file in the legacy location.
-    self.device.WriteFile(
-        self.cmdline_path_legacy, 'some --stray --flags', as_root=True)
-    self.assertTrue(self.device.PathExists(self.cmdline_path_legacy))
-
-    changer = flag_changer.FlagChanger(self.device, _CMDLINE_FILE)
-
-    # Legacy command line file is removed, ensuring Chrome picks up the
-    # right file.
-    self.assertFalse(self.device.PathExists(self.cmdline_path_legacy))
-
-    # Write some new files, and check they are set.
-    new_flags = ['--my', '--new', '--flags=with special value']
-    self.assertItemsEqual(
-        changer.ReplaceFlags(new_flags),
-        new_flags)
-
-    # Restore and go back to the old flags.
-    self.assertItemsEqual(
-        changer.Restore(),
-        ['--some', '--old', '--flags'])
-
-  def testFlagChanger_removeFlags(self):
-    self.device.RemovePath(self.cmdline_path, force=True)
-    self.assertFalse(self.device.PathExists(self.cmdline_path))
-
-    with flag_changer.CustomCommandLineFlags(
-        self.device, _CMDLINE_FILE, ['--some', '--flags']):
-      self.assertTrue(self.device.PathExists(self.cmdline_path))
-
-    self.assertFalse(self.device.PathExists(self.cmdline_path))
-
-
-if __name__ == '__main__':
-  unittest.main()
diff --git a/third_party/catapult/devil/devil/android/flag_changer_test.py b/third_party/catapult/devil/devil/android/flag_changer_test.py
deleted file mode 100755
index 5342cf4..0000000
--- a/third_party/catapult/devil/devil/android/flag_changer_test.py
+++ /dev/null
@@ -1,135 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import posixpath
-import unittest
-
-from devil.android import flag_changer
-
-
-_CMDLINE_FILE = 'chrome-command-line'
-
-
-class _FakeDevice(object):
-  def __init__(self):
-    self.build_type = 'user'
-    self.has_root = True
-    self.file_system = {}
-
-  def HasRoot(self):
-    return self.has_root
-
-  def PathExists(self, filepath):
-    return filepath in self.file_system
-
-  def RemovePath(self, path, **_kwargs):
-    self.file_system.pop(path)
-
-  def WriteFile(self, path, contents, **_kwargs):
-    self.file_system[path] = contents
-
-  def ReadFile(self, path, **_kwargs):
-    return self.file_system[path]
-
-
-class FlagChangerTest(unittest.TestCase):
-  def setUp(self):
-    self.device = _FakeDevice()
-    # pylint: disable=protected-access
-    self.cmdline_path = posixpath.join(flag_changer._CMDLINE_DIR, _CMDLINE_FILE)
-    self.cmdline_path_legacy = posixpath.join(
-        flag_changer._CMDLINE_DIR_LEGACY, _CMDLINE_FILE)
-
-  def testFlagChanger_removeLegacyCmdLine(self):
-    self.device.WriteFile(self.cmdline_path_legacy, 'chrome --old --stuff')
-    self.assertTrue(self.device.PathExists(self.cmdline_path_legacy))
-
-    changer = flag_changer.FlagChanger(self.device, 'chrome-command-line')
-    self.assertEquals(
-        changer._cmdline_path,  # pylint: disable=protected-access
-        self.cmdline_path)
-    self.assertFalse(self.device.PathExists(self.cmdline_path_legacy))
-
-  def testFlagChanger_mustBeFileName(self):
-    with self.assertRaises(ValueError):
-      flag_changer.FlagChanger(self.device, '/data/local/chrome-command-line')
-
-
-class ParseSerializeFlagsTest(unittest.TestCase):
-  def _testQuoteFlag(self, flag, expected_quoted_flag):
-    # Start with an unquoted flag, check that it's quoted as expected.
-    # pylint: disable=protected-access
-    quoted_flag = flag_changer._QuoteFlag(flag)
-    self.assertEqual(quoted_flag, expected_quoted_flag)
-    # Check that it survives a round-trip.
-    parsed_flags = flag_changer._ParseFlags('_ %s' % quoted_flag)
-    self.assertEqual(len(parsed_flags), 1)
-    self.assertEqual(flag, parsed_flags[0])
-
-  def testQuoteFlag_simple(self):
-    self._testQuoteFlag('--simple-flag', '--simple-flag')
-
-  def testQuoteFlag_withSimpleValue(self):
-    self._testQuoteFlag('--key=value', '--key=value')
-
-  def testQuoteFlag_withQuotedValue1(self):
-    self._testQuoteFlag('--key=valueA valueB', '--key="valueA valueB"')
-
-  def testQuoteFlag_withQuotedValue2(self):
-    self._testQuoteFlag(
-        '--key=this "should" work', r'--key="this \"should\" work"')
-
-  def testQuoteFlag_withQuotedValue3(self):
-    self._testQuoteFlag(
-        "--key=this is 'fine' too", '''--key="this is 'fine' too"''')
-
-  def testQuoteFlag_withQuotedValue4(self):
-    self._testQuoteFlag(
-        "--key='I really want to keep these quotes'",
-        '''--key="'I really want to keep these quotes'"''')
-
-  def testQuoteFlag_withQuotedValue5(self):
-    self._testQuoteFlag(
-        "--this is a strange=flag", '"--this is a strange=flag"')
-
-  def testQuoteFlag_withEmptyValue(self):
-    self._testQuoteFlag('--some-flag=', '--some-flag=')
-
-  def _testParseCmdLine(self, command_line, expected_flags):
-    # Start with a command line, check that flags are parsed as expected.
-    # pylint: disable=protected-access
-    flags = flag_changer._ParseFlags(command_line)
-    self.assertItemsEqual(flags, expected_flags)
-
-    # Check that flags survive a round-trip.
-    # Note: Although new_command_line and command_line may not match, they
-    # should describe the same set of flags.
-    new_command_line = flag_changer._SerializeFlags(flags)
-    new_flags = flag_changer._ParseFlags(new_command_line)
-    self.assertItemsEqual(new_flags, expected_flags)
-
-  def testParseCmdLine_simple(self):
-    self._testParseCmdLine(
-        'chrome --foo --bar="a b" --baz=true --fine="ok"',
-        ['--foo', '--bar=a b', '--baz=true', '--fine=ok'])
-
-  def testParseCmdLine_withFancyQuotes(self):
-    self._testParseCmdLine(
-        r'''_ --foo="this 'is' ok"
-              --bar='this \'is\' too'
-              --baz="this \'is\' tricky"
-        ''',
-        ["--foo=this 'is' ok",
-         "--bar=this 'is' too",
-         r"--baz=this \'is\' tricky"])
-
-  def testParseCmdLine_withUnterminatedQuote(self):
-    self._testParseCmdLine(
-        '_ --foo --bar="I forgot something',
-        ['--foo', '--bar=I forgot something'])
-
-
-if __name__ == '__main__':
-  unittest.main(verbosity=2)
diff --git a/third_party/catapult/devil/devil/android/forwarder.py b/third_party/catapult/devil/devil/android/forwarder.py
deleted file mode 100644
index 244f555..0000000
--- a/third_party/catapult/devil/devil/android/forwarder.py
+++ /dev/null
@@ -1,464 +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.
-
-# pylint: disable=W0212
-
-import fcntl
-import logging
-import os
-import psutil
-
-from devil import base_error
-from devil import devil_env
-from devil.android import device_errors
-from devil.android.constants import file_system
-from devil.android.sdk import adb_wrapper
-from devil.android.valgrind_tools import base_tool
-from devil.utils import cmd_helper
-
-logger = logging.getLogger(__name__)
-
-# If passed as the device port, this will tell the forwarder to allocate
-# a dynamic port on the device. The actual port can then be retrieved with
-# Forwarder.DevicePortForHostPort.
-DYNAMIC_DEVICE_PORT = 0
-
-
-def _GetProcessStartTime(pid):
-  return psutil.Process(pid).create_time
-
-
-def _LogMapFailureDiagnostics(device):
-  # The host forwarder daemon logs to /tmp/host_forwarder_log, so print the end
-  # of that.
-  try:
-    with open('/tmp/host_forwarder_log') as host_forwarder_log:
-      logger.info('Last 50 lines of the host forwarder daemon log:')
-      for line in host_forwarder_log.read().splitlines()[-50:]:
-        logger.info('    %s', line)
-  except Exception: # pylint: disable=broad-except
-    # Grabbing the host forwarder log is best-effort. Ignore all errors.
-    logger.warning('Failed to get the contents of host_forwarder_log.')
-
-  # The device forwarder daemon logs to the logcat, so print the end of that.
-  try:
-    logger.info('Last 50 lines of logcat:')
-    for logcat_line in device.adb.Logcat(dump=True)[-50:]:
-      logger.info('    %s', logcat_line)
-  except device_errors.CommandFailedError:
-    # Grabbing the device forwarder log is also best-effort. Ignore all errors.
-    logger.warning('Failed to get the contents of the logcat.')
-
-  # Log alive device forwarders.
-  try:
-    ps_out = device.RunShellCommand(['ps'], check_return=True)
-    logger.info('Currently running device_forwarders:')
-    for line in ps_out:
-      if 'device_forwarder' in line:
-        logger.info('    %s', line)
-  except device_errors.CommandFailedError:
-    logger.warning('Failed to list currently running device_forwarder '
-                   'instances.')
-
-
-class _FileLock(object):
-  """With statement-aware implementation of a file lock.
-
-  File locks are needed for cross-process synchronization when the
-  multiprocessing Python module is used.
-  """
-
-  def __init__(self, path):
-    self._fd = -1
-    self._path = path
-
-  def __enter__(self):
-    self._fd = os.open(self._path, os.O_RDONLY | os.O_CREAT)
-    if self._fd < 0:
-      raise Exception('Could not open file %s for reading' % self._path)
-    fcntl.flock(self._fd, fcntl.LOCK_EX)
-
-  def __exit__(self, _exception_type, _exception_value, traceback):
-    fcntl.flock(self._fd, fcntl.LOCK_UN)
-    os.close(self._fd)
-
-
-class HostForwarderError(base_error.BaseError):
-  """Exception for failures involving host_forwarder."""
-
-  def __init__(self, message):
-    super(HostForwarderError, self).__init__(message)
-
-
-class Forwarder(object):
-  """Thread-safe class to manage port forwards from the device to the host."""
-
-  _DEVICE_FORWARDER_FOLDER = (file_system.TEST_EXECUTABLE_DIR +
-                              '/forwarder/')
-  _DEVICE_FORWARDER_PATH = (file_system.TEST_EXECUTABLE_DIR +
-                            '/forwarder/device_forwarder')
-  _LOCK_PATH = '/tmp/chrome.forwarder.lock'
-  # Defined in host_forwarder_main.cc
-  _HOST_FORWARDER_LOG = '/tmp/host_forwarder_log'
-
-  _TIMEOUT = 60  # seconds
-
-  _instance = None
-
-  @staticmethod
-  def Map(port_pairs, device, tool=None):
-    """Runs the forwarder.
-
-    Args:
-      port_pairs: A list of tuples (device_port, host_port) to forward. Note
-                 that you can specify 0 as a device_port, in which case a
-                 port will by dynamically assigned on the device. You can
-                 get the number of the assigned port using the
-                 DevicePortForHostPort method.
-      device: A DeviceUtils instance.
-      tool: Tool class to use to get wrapper, if necessary, for executing the
-            forwarder (see valgrind_tools.py).
-
-    Raises:
-      Exception on failure to forward the port.
-    """
-    if not tool:
-      tool = base_tool.BaseTool()
-    with _FileLock(Forwarder._LOCK_PATH):
-      instance = Forwarder._GetInstanceLocked(tool)
-      instance._InitDeviceLocked(device, tool)
-
-      device_serial = str(device)
-      map_arg_lists = [
-          ['--adb=' + adb_wrapper.AdbWrapper.GetAdbPath(),
-           '--serial-id=' + device_serial,
-           '--map', str(device_port), str(host_port)]
-          for device_port, host_port in port_pairs]
-      logger.info('Forwarding using commands: %s', map_arg_lists)
-
-      for map_arg_list in map_arg_lists:
-        try:
-          map_cmd = [instance._host_forwarder_path] + map_arg_list
-          (exit_code, output) = cmd_helper.GetCmdStatusAndOutputWithTimeout(
-              map_cmd, Forwarder._TIMEOUT)
-        except cmd_helper.TimeoutError as e:
-          raise HostForwarderError(
-              '`%s` timed out:\n%s' % (' '.join(map_cmd), e.output))
-        except OSError as e:
-          if e.errno == 2:
-            raise HostForwarderError(
-                'Unable to start host forwarder. '
-                'Make sure you have built host_forwarder.')
-          else: raise
-        if exit_code != 0:
-          try:
-            instance._KillDeviceLocked(device, tool)
-          except device_errors.CommandFailedError:
-            # We don't want the failure to kill the device forwarder to
-            # supersede the original failure to map.
-            logging.warning(
-                'Failed to kill the device forwarder after map failure: %s',
-                str(e))
-          _LogMapFailureDiagnostics(device)
-          formatted_output = ('\n'.join(output) if isinstance(output, list)
-                              else output)
-          raise HostForwarderError(
-              '`%s` exited with %d:\n%s' % (
-                  ' '.join(map_cmd),
-                  exit_code,
-                  formatted_output))
-        tokens = output.split(':')
-        if len(tokens) != 2:
-          raise HostForwarderError(
-              'Unexpected host forwarder output "%s", '
-              'expected "device_port:host_port"' % output)
-        device_port = int(tokens[0])
-        host_port = int(tokens[1])
-        serial_with_port = (device_serial, device_port)
-        instance._device_to_host_port_map[serial_with_port] = host_port
-        instance._host_to_device_port_map[host_port] = serial_with_port
-        logger.info('Forwarding device port: %d to host port: %d.',
-                    device_port, host_port)
-
-  @staticmethod
-  def UnmapDevicePort(device_port, device):
-    """Unmaps a previously forwarded device port.
-
-    Args:
-      device: A DeviceUtils instance.
-      device_port: A previously forwarded port (through Map()).
-    """
-    with _FileLock(Forwarder._LOCK_PATH):
-      Forwarder._UnmapDevicePortLocked(device_port, device)
-
-  @staticmethod
-  def UnmapAllDevicePorts(device):
-    """Unmaps all the previously forwarded ports for the provided device.
-
-    Args:
-      device: A DeviceUtils instance.
-      port_pairs: A list of tuples (device_port, host_port) to unmap.
-    """
-    with _FileLock(Forwarder._LOCK_PATH):
-      instance = Forwarder._GetInstanceLocked(None)
-      unmap_all_cmd = [
-          instance._host_forwarder_path,
-          '--adb=%s' % adb_wrapper.AdbWrapper.GetAdbPath(),
-          '--serial-id=%s' % device.serial,
-          '--unmap-all'
-      ]
-      try:
-        exit_code, output = cmd_helper.GetCmdStatusAndOutputWithTimeout(
-            unmap_all_cmd, Forwarder._TIMEOUT)
-      except cmd_helper.TimeoutError as e:
-        raise HostForwarderError(
-            '`%s` timed out:\n%s' % (' '.join(unmap_all_cmd), e.output))
-      if exit_code != 0:
-        error_msg = [
-            '`%s` exited with %d' % (' '.join(unmap_all_cmd), exit_code)]
-        if isinstance(output, list):
-          error_msg += output
-        else:
-          error_msg += [output]
-        raise HostForwarderError('\n'.join(error_msg))
-
-      # Clean out any entries from the device & host map.
-      device_map = instance._device_to_host_port_map
-      host_map = instance._host_to_device_port_map
-      for device_serial_and_port, host_port in device_map.items():
-        device_serial = device_serial_and_port[0]
-        if device_serial == device.serial:
-          del device_map[device_serial_and_port]
-          del host_map[host_port]
-
-      # Kill the device forwarder.
-      tool = base_tool.BaseTool()
-      instance._KillDeviceLocked(device, tool)
-
-  @staticmethod
-  def DevicePortForHostPort(host_port):
-    """Returns the device port that corresponds to a given host port."""
-    with _FileLock(Forwarder._LOCK_PATH):
-      serial_and_port = Forwarder._GetInstanceLocked(
-          None)._host_to_device_port_map.get(host_port)
-      return serial_and_port[1] if serial_and_port else None
-
-  @staticmethod
-  def RemoveHostLog():
-    if os.path.exists(Forwarder._HOST_FORWARDER_LOG):
-      os.unlink(Forwarder._HOST_FORWARDER_LOG)
-
-  @staticmethod
-  def GetHostLog():
-    if not os.path.exists(Forwarder._HOST_FORWARDER_LOG):
-      return ''
-    with file(Forwarder._HOST_FORWARDER_LOG, 'r') as f:
-      return f.read()
-
-  @staticmethod
-  def _GetInstanceLocked(tool):
-    """Returns the singleton instance.
-
-    Note that the global lock must be acquired before calling this method.
-
-    Args:
-      tool: Tool class to use to get wrapper, if necessary, for executing the
-            forwarder (see valgrind_tools.py).
-    """
-    if not Forwarder._instance:
-      Forwarder._instance = Forwarder(tool)
-    return Forwarder._instance
-
-  def __init__(self, tool):
-    """Constructs a new instance of Forwarder.
-
-    Note that Forwarder is a singleton therefore this constructor should be
-    called only once.
-
-    Args:
-      tool: Tool class to use to get wrapper, if necessary, for executing the
-            forwarder (see valgrind_tools.py).
-    """
-    assert not Forwarder._instance
-    self._tool = tool
-    self._initialized_devices = set()
-    self._device_to_host_port_map = dict()
-    self._host_to_device_port_map = dict()
-    self._host_forwarder_path = devil_env.config.FetchPath('forwarder_host')
-    assert os.path.exists(self._host_forwarder_path), 'Please build forwarder2'
-    self._InitHostLocked()
-
-  @staticmethod
-  def _UnmapDevicePortLocked(device_port, device):
-    """Internal method used by UnmapDevicePort().
-
-    Note that the global lock must be acquired before calling this method.
-    """
-    instance = Forwarder._GetInstanceLocked(None)
-    serial = str(device)
-    serial_with_port = (serial, device_port)
-    if not serial_with_port in instance._device_to_host_port_map:
-      logger.error('Trying to unmap non-forwarded port %d', device_port)
-      return
-
-    host_port = instance._device_to_host_port_map[serial_with_port]
-    del instance._device_to_host_port_map[serial_with_port]
-    del instance._host_to_device_port_map[host_port]
-
-    unmap_cmd = [
-        instance._host_forwarder_path,
-        '--adb=%s' % adb_wrapper.AdbWrapper.GetAdbPath(),
-        '--serial-id=%s' % serial,
-        '--unmap', str(device_port)
-    ]
-    try:
-      (exit_code, output) = cmd_helper.GetCmdStatusAndOutputWithTimeout(
-          unmap_cmd, Forwarder._TIMEOUT)
-    except cmd_helper.TimeoutError as e:
-      raise HostForwarderError(
-          '`%s` timed out:\n%s' % (' '.join(unmap_cmd), e.output))
-    if exit_code != 0:
-      logger.error(
-          '`%s` exited with %d:\n%s',
-          ' '.join(unmap_cmd),
-          exit_code,
-          '\n'.join(output) if isinstance(output, list) else output)
-
-  @staticmethod
-  def _GetPidForLock():
-    """Returns the PID used for host_forwarder initialization.
-
-    The PID of the "sharder" is used to handle multiprocessing. The "sharder"
-    is the initial process that forks that is the parent process.
-    """
-    return os.getpgrp()
-
-  def _InitHostLocked(self):
-    """Initializes the host forwarder daemon.
-
-    Note that the global lock must be acquired before calling this method. This
-    method kills any existing host_forwarder process that could be stale.
-    """
-    # See if the host_forwarder daemon was already initialized by a concurrent
-    # process or thread (in case multi-process sharding is not used).
-    pid_for_lock = Forwarder._GetPidForLock()
-    fd = os.open(Forwarder._LOCK_PATH, os.O_RDWR | os.O_CREAT)
-    with os.fdopen(fd, 'r+') as pid_file:
-      pid_with_start_time = pid_file.readline()
-      if pid_with_start_time:
-        (pid, process_start_time) = pid_with_start_time.split(':')
-        if pid == str(pid_for_lock):
-          if process_start_time == str(_GetProcessStartTime(pid_for_lock)):
-            return
-      self._KillHostLocked()
-      pid_file.seek(0)
-      pid_file.write(
-          '%s:%s' % (pid_for_lock, str(_GetProcessStartTime(pid_for_lock))))
-      pid_file.truncate()
-
-  def _InitDeviceLocked(self, device, tool):
-    """Initializes the device_forwarder daemon for a specific device (once).
-
-    Note that the global lock must be acquired before calling this method. This
-    method kills any existing device_forwarder daemon on the device that could
-    be stale, pushes the latest version of the daemon (to the device) and starts
-    it.
-
-    Args:
-      device: A DeviceUtils instance.
-      tool: Tool class to use to get wrapper, if necessary, for executing the
-            forwarder (see valgrind_tools.py).
-    """
-    device_serial = str(device)
-    if device_serial in self._initialized_devices:
-      return
-    try:
-      self._KillDeviceLocked(device, tool)
-    except device_errors.CommandFailedError:
-      logger.warning('Failed to kill device forwarder. Rebooting.')
-      device.Reboot()
-    forwarder_device_path_on_host = devil_env.config.FetchPath(
-        'forwarder_device', device=device)
-    forwarder_device_path_on_device = (
-        Forwarder._DEVICE_FORWARDER_FOLDER
-        if os.path.isdir(forwarder_device_path_on_host)
-        else Forwarder._DEVICE_FORWARDER_PATH)
-    device.PushChangedFiles([(
-        forwarder_device_path_on_host,
-        forwarder_device_path_on_device)])
-
-    cmd = [Forwarder._DEVICE_FORWARDER_PATH]
-    wrapper = tool.GetUtilWrapper()
-    if wrapper:
-      cmd.insert(0, wrapper)
-    device.RunShellCommand(
-        cmd, env={'LD_LIBRARY_PATH': Forwarder._DEVICE_FORWARDER_FOLDER},
-        check_return=True)
-    self._initialized_devices.add(device_serial)
-
-  @staticmethod
-  def KillHost():
-    """Kills the forwarder process running on the host."""
-    with _FileLock(Forwarder._LOCK_PATH):
-      Forwarder._GetInstanceLocked(None)._KillHostLocked()
-
-  def _KillHostLocked(self):
-    """Kills the forwarder process running on the host.
-
-    Note that the global lock must be acquired before calling this method.
-    """
-    logger.info('Killing host_forwarder.')
-    try:
-      kill_cmd = [self._host_forwarder_path, '--kill-server']
-      (exit_code, _o) = cmd_helper.GetCmdStatusAndOutputWithTimeout(
-          kill_cmd, Forwarder._TIMEOUT)
-      if exit_code != 0:
-        kill_cmd = ['pkill', '-9', 'host_forwarder']
-        (exit_code, output) = cmd_helper.GetCmdStatusAndOutputWithTimeout(
-            kill_cmd, Forwarder._TIMEOUT)
-        if exit_code != 0:
-          raise HostForwarderError(
-              '%s exited with %d:\n%s' % (
-                  self._host_forwarder_path,
-                  exit_code,
-                  '\n'.join(output) if isinstance(output, list) else output))
-    except cmd_helper.TimeoutError as e:
-      raise HostForwarderError(
-          '`%s` timed out:\n%s' % (' '.join(kill_cmd), e.output))
-
-  @staticmethod
-  def KillDevice(device, tool=None):
-    """Kills the forwarder process running on the device.
-
-    Args:
-      device: Instance of DeviceUtils for talking to the device.
-      tool: Wrapper tool (e.g. valgrind) that can be used to execute the device
-            forwarder (see valgrind_tools.py).
-    """
-    with _FileLock(Forwarder._LOCK_PATH):
-      Forwarder._GetInstanceLocked(None)._KillDeviceLocked(
-          device, tool or base_tool.BaseTool())
-
-  def _KillDeviceLocked(self, device, tool):
-    """Kills the forwarder process running on the device.
-
-    Note that the global lock must be acquired before calling this method.
-
-    Args:
-      device: Instance of DeviceUtils for talking to the device.
-      tool: Wrapper tool (e.g. valgrind) that can be used to execute the device
-            forwarder (see valgrind_tools.py).
-    """
-    logger.info('Killing device_forwarder.')
-    self._initialized_devices.discard(device.serial)
-    if not device.FileExists(Forwarder._DEVICE_FORWARDER_PATH):
-      return
-
-    cmd = [Forwarder._DEVICE_FORWARDER_PATH, '--kill-server']
-    wrapper = tool.GetUtilWrapper()
-    if wrapper:
-      cmd.insert(0, wrapper)
-    device.RunShellCommand(
-        cmd, env={'LD_LIBRARY_PATH': Forwarder._DEVICE_FORWARDER_FOLDER},
-        check_return=True)
diff --git a/third_party/catapult/devil/devil/android/install_commands.py b/third_party/catapult/devil/devil/android/install_commands.py
deleted file mode 100644
index c8da869..0000000
--- a/third_party/catapult/devil/devil/android/install_commands.py
+++ /dev/null
@@ -1,57 +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.
-
-import os
-import posixpath
-
-from devil import devil_env
-from devil.android import device_errors
-from devil.android.constants import file_system
-
-BIN_DIR = '%s/bin' % file_system.TEST_EXECUTABLE_DIR
-_FRAMEWORK_DIR = '%s/framework' % file_system.TEST_EXECUTABLE_DIR
-
-_COMMANDS = {
-  'unzip': 'org.chromium.android.commands.unzip.Unzip',
-}
-
-_SHELL_COMMAND_FORMAT = (
-"""#!/system/bin/sh
-base=%s
-export CLASSPATH=$base/framework/chromium_commands.jar
-exec app_process $base/bin %s $@
-""")
-
-
-def Installed(device):
-  paths = [posixpath.join(BIN_DIR, c) for c in _COMMANDS]
-  paths.append(posixpath.join(_FRAMEWORK_DIR, 'chromium_commands.jar'))
-  return device.PathExists(paths)
-
-
-def InstallCommands(device):
-  if device.IsUserBuild():
-    raise device_errors.CommandFailedError(
-        'chromium_commands currently requires a userdebug build.',
-        device_serial=device.adb.GetDeviceSerial())
-
-  chromium_commands_jar_path = devil_env.config.FetchPath('chromium_commands')
-  if not os.path.exists(chromium_commands_jar_path):
-    raise device_errors.CommandFailedError(
-        '%s not found. Please build chromium_commands.'
-        % chromium_commands_jar_path)
-
-  device.RunShellCommand(
-      ['mkdir', '-p', BIN_DIR, _FRAMEWORK_DIR], check_return=True)
-  for command, main_class in _COMMANDS.iteritems():
-    shell_command = _SHELL_COMMAND_FORMAT % (
-        file_system.TEST_EXECUTABLE_DIR, main_class)
-    shell_file = '%s/%s' % (BIN_DIR, command)
-    device.WriteFile(shell_file, shell_command)
-    device.RunShellCommand(
-        ['chmod', '755', shell_file], check_return=True)
-
-  device.adb.Push(
-      chromium_commands_jar_path,
-      '%s/chromium_commands.jar' % _FRAMEWORK_DIR)
diff --git a/third_party/catapult/devil/devil/android/logcat_monitor.py b/third_party/catapult/devil/devil/android/logcat_monitor.py
deleted file mode 100644
index 0aece87..0000000
--- a/third_party/catapult/devil/devil/android/logcat_monitor.py
+++ /dev/null
@@ -1,255 +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.
-
-# pylint: disable=unused-argument
-
-import errno
-import logging
-import os
-import re
-import shutil
-import tempfile
-import threading
-import time
-
-from devil.android import decorators
-from devil.android import device_errors
-from devil.android.sdk import adb_wrapper
-from devil.utils import reraiser_thread
-
-logger = logging.getLogger(__name__)
-
-
-class LogcatMonitor(object):
-
-  _RECORD_ITER_TIMEOUT = 2.0
-  _RECORD_THREAD_JOIN_WAIT = 5.0
-  _WAIT_TIME = 0.2
-  _THREADTIME_RE_FORMAT = (
-      r'(?P<date>\S*) +(?P<time>\S*) +(?P<proc_id>%s) +(?P<thread_id>%s) +'
-      r'(?P<log_level>%s) +(?P<component>%s) *: +(?P<message>%s)$')
-
-  def __init__(self, adb, clear=True, filter_specs=None, output_file=None):
-    """Create a LogcatMonitor instance.
-
-    Args:
-      adb: An instance of adb_wrapper.AdbWrapper.
-      clear: If True, clear the logcat when monitoring starts.
-      filter_specs: An optional list of '<tag>[:priority]' strings.
-      output_file: File path to save recorded logcat.
-    """
-    if isinstance(adb, adb_wrapper.AdbWrapper):
-      self._adb = adb
-    else:
-      raise ValueError('Unsupported type passed for argument "device"')
-    self._clear = clear
-    self._filter_specs = filter_specs
-    self._output_file = output_file
-    self._record_file = None
-    self._record_file_lock = threading.Lock()
-    self._record_thread = None
-    self._stop_recording_event = threading.Event()
-
-  @property
-  def output_file(self):
-    return self._output_file
-
-  @decorators.WithTimeoutAndRetriesDefaults(10, 0)
-  def WaitFor(self, success_regex, failure_regex=None, timeout=None,
-              retries=None):
-    """Wait for a matching logcat line or until a timeout occurs.
-
-    This will attempt to match lines in the logcat against both |success_regex|
-    and |failure_regex| (if provided). Note that this calls re.search on each
-    logcat line, not re.match, so the provided regular expressions don't have
-    to match an entire line.
-
-    Args:
-      success_regex: The regular expression to search for.
-      failure_regex: An optional regular expression that, if hit, causes this
-        to stop looking for a match. Can be None.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      A match object if |success_regex| matches a part of a logcat line, or
-      None if |failure_regex| matches a part of a logcat line.
-    Raises:
-      CommandFailedError on logcat failure (NOT on a |failure_regex| match).
-      CommandTimeoutError if no logcat line matching either |success_regex| or
-        |failure_regex| is found in |timeout| seconds.
-      DeviceUnreachableError if the device becomes unreachable.
-      LogcatMonitorCommandError when calling |WaitFor| while not recording
-        logcat.
-    """
-    if self._record_thread is None:
-      raise LogcatMonitorCommandError(
-          'Must be recording logcat when calling |WaitFor|',
-          device_serial=str(self._adb))
-    if isinstance(success_regex, basestring):
-      success_regex = re.compile(success_regex)
-    if isinstance(failure_regex, basestring):
-      failure_regex = re.compile(failure_regex)
-
-    logger.debug('Waiting %d seconds for "%s"', timeout, success_regex.pattern)
-
-    # NOTE This will continue looping until:
-    #  - success_regex matches a line, in which case the match object is
-    #    returned.
-    #  - failure_regex matches a line, in which case None is returned
-    #  - the timeout is hit, in which case a CommandTimeoutError is raised.
-    with open(self._record_file.name, 'r') as f:
-      while True:
-        line = f.readline()
-        if line:
-          m = success_regex.search(line)
-          if m:
-            return m
-          if failure_regex and failure_regex.search(line):
-            return None
-        else:
-          time.sleep(self._WAIT_TIME)
-
-  def FindAll(self, message_regex, proc_id=None, thread_id=None, log_level=None,
-              component=None):
-    """Finds all lines in the logcat that match the provided constraints.
-
-    Args:
-      message_regex: The regular expression that the <message> section must
-        match.
-      proc_id: The process ID to match. If None, matches any process ID.
-      thread_id: The thread ID to match. If None, matches any thread ID.
-      log_level: The log level to match. If None, matches any log level.
-      component: The component to match. If None, matches any component.
-
-    Raises:
-      LogcatMonitorCommandError when calling |FindAll| before recording logcat.
-
-    Yields:
-      A match object for each matching line in the logcat. The match object
-      will always contain, in addition to groups defined in |message_regex|,
-      the following named groups: 'date', 'time', 'proc_id', 'thread_id',
-      'log_level', 'component', and 'message'.
-    """
-    if self._record_file is None:
-      raise LogcatMonitorCommandError(
-          'Must have recorded or be recording a logcat to call |FindAll|',
-          device_serial=str(self._adb))
-    if proc_id is None:
-      proc_id = r'\d+'
-    if thread_id is None:
-      thread_id = r'\d+'
-    if log_level is None:
-      log_level = r'[VDIWEF]'
-    if component is None:
-      component = r'[^\s:]+'
-    # pylint: disable=protected-access
-    threadtime_re = re.compile(
-        type(self)._THREADTIME_RE_FORMAT % (
-            proc_id, thread_id, log_level, component, message_regex))
-
-    with open(self._record_file.name, 'r') as f:
-      for line in f:
-        m = re.match(threadtime_re, line)
-        if m:
-          yield m
-
-  def _StartRecording(self):
-    """Starts recording logcat to file.
-
-    Function spawns a thread that records logcat to file and will not die
-    until |StopRecording| is called.
-    """
-    def record_to_file():
-      # Write the log with line buffering so the consumer sees each individual
-      # line.
-      for data in self._adb.Logcat(filter_specs=self._filter_specs,
-                                   logcat_format='threadtime',
-                                   iter_timeout=self._RECORD_ITER_TIMEOUT):
-        if self._stop_recording_event.isSet():
-          return
-
-        if data is None:
-          # Logcat can yield None if the iter_timeout is hit.
-          continue
-
-        with self._record_file_lock:
-          if self._record_file and not self._record_file.closed:
-            self._record_file.write(data + '\n')
-
-    self._stop_recording_event.clear()
-    if not self._record_thread:
-      self._record_thread = reraiser_thread.ReraiserThread(record_to_file)
-      self._record_thread.start()
-
-  def _StopRecording(self):
-    """Finish recording logcat."""
-    if self._record_thread:
-      self._stop_recording_event.set()
-      self._record_thread.join(timeout=self._RECORD_THREAD_JOIN_WAIT)
-      self._record_thread.ReraiseIfException()
-      self._record_thread = None
-
-  def Start(self):
-    """Starts the logcat monitor.
-
-    Clears the logcat if |clear| was set in |__init__|.
-    """
-    if self._clear:
-      self._adb.Logcat(clear=True)
-    if not self._record_file:
-      self._record_file = tempfile.NamedTemporaryFile(mode='a', bufsize=1)
-    self._StartRecording()
-
-  def Stop(self):
-    """Stops the logcat monitor.
-
-    Stops recording the logcat. Copies currently recorded logcat to
-    |self._output_file|.
-    """
-    self._StopRecording()
-    with self._record_file_lock:
-      if self._record_file and self._output_file:
-        try:
-          os.makedirs(os.path.dirname(self._output_file))
-        except OSError as e:
-          if e.errno != errno.EEXIST:
-            raise
-        shutil.copy(self._record_file.name, self._output_file)
-
-  def Close(self):
-    """Closes logcat recording file.
-
-    Should be called when finished using the logcat monitor.
-    """
-    with self._record_file_lock:
-      if self._record_file:
-        self._record_file.close()
-        self._record_file = None
-
-  def __enter__(self):
-    """Starts the logcat monitor."""
-    self.Start()
-    return self
-
-  def __exit__(self, exc_type, exc_val, exc_tb):
-    """Stops the logcat monitor."""
-    self.Stop()
-
-  def __del__(self):
-    """Closes logcat recording file in case |Close| was never called."""
-    with self._record_file_lock:
-      if self._record_file:
-        logger.warning(
-            'Need to call |Close| on the logcat monitor when done!')
-        self._record_file.close()
-
-  @property
-  def adb(self):
-    return self._adb
-
-
-class LogcatMonitorCommandError(device_errors.CommandFailedError):
-  """Exception for errors with logcat monitor commands."""
-  pass
diff --git a/third_party/catapult/devil/devil/android/logcat_monitor_test.py b/third_party/catapult/devil/devil/android/logcat_monitor_test.py
deleted file mode 100755
index 8fb4d74..0000000
--- a/third_party/catapult/devil/devil/android/logcat_monitor_test.py
+++ /dev/null
@@ -1,230 +0,0 @@
-#!/usr/bin/env python
-# 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.
-
-# pylint: disable=protected-access
-
-import itertools
-import threading
-import unittest
-
-from devil import devil_env
-from devil.android import logcat_monitor
-from devil.android.sdk import adb_wrapper
-
-with devil_env.SysPath(devil_env.PYMOCK_PATH):
-  import mock  # pylint: disable=import-error
-
-
-def _CreateTestLog(raw_logcat=None):
-  test_adb = adb_wrapper.AdbWrapper('0123456789abcdef')
-  test_adb.Logcat = mock.Mock(return_value=(l for l in raw_logcat))
-  test_log = logcat_monitor.LogcatMonitor(test_adb, clear=False)
-  return test_log
-
-
-class LogcatMonitorTest(unittest.TestCase):
-
-  _TEST_THREADTIME_LOGCAT_DATA = [
-      '01-01 01:02:03.456  7890  0987 V LogcatMonitorTest: '
-          'verbose logcat monitor test message 1',
-      '01-01 01:02:03.457  8901  1098 D LogcatMonitorTest: '
-          'debug logcat monitor test message 2',
-      '01-01 01:02:03.458  9012  2109 I LogcatMonitorTest: '
-          'info logcat monitor test message 3',
-      '01-01 01:02:03.459  0123  3210 W LogcatMonitorTest: '
-          'warning logcat monitor test message 4',
-      '01-01 01:02:03.460  1234  4321 E LogcatMonitorTest: '
-          'error logcat monitor test message 5',
-      '01-01 01:02:03.461  2345  5432 F LogcatMonitorTest: '
-          'fatal logcat monitor test message 6',
-      '01-01 01:02:03.462  3456  6543 D LogcatMonitorTest: '
-          'last line'
-  ]
-
-  def assertIterEqual(self, expected_iter, actual_iter):
-    for expected, actual in itertools.izip_longest(expected_iter, actual_iter):
-      self.assertIsNotNone(
-          expected,
-          msg='actual has unexpected elements starting with %s' % str(actual))
-      self.assertIsNotNone(
-          actual,
-          msg='actual is missing elements starting with %s' % str(expected))
-      self.assertEqual(actual.group('proc_id'), expected[0])
-      self.assertEqual(actual.group('thread_id'), expected[1])
-      self.assertEqual(actual.group('log_level'), expected[2])
-      self.assertEqual(actual.group('component'), expected[3])
-      self.assertEqual(actual.group('message'), expected[4])
-
-    with self.assertRaises(StopIteration):
-      next(actual_iter)
-    with self.assertRaises(StopIteration):
-      next(expected_iter)
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testWaitFor_success(self):
-    test_log = _CreateTestLog(
-        raw_logcat=type(self)._TEST_THREADTIME_LOGCAT_DATA)
-    test_log.Start()
-    actual_match = test_log.WaitFor(r'.*(fatal|error) logcat monitor.*', None)
-    self.assertTrue(actual_match)
-    self.assertEqual(
-        '01-01 01:02:03.460  1234  4321 E LogcatMonitorTest: '
-            'error logcat monitor test message 5',
-        actual_match.group(0))
-    self.assertEqual('error', actual_match.group(1))
-    test_log.Stop()
-    test_log.Close()
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testWaitFor_failure(self):
-    test_log = _CreateTestLog(
-        raw_logcat=type(self)._TEST_THREADTIME_LOGCAT_DATA)
-    test_log.Start()
-    actual_match = test_log.WaitFor(
-        r'.*My Success Regex.*', r'.*(fatal|error) logcat monitor.*')
-    self.assertIsNone(actual_match)
-    test_log.Stop()
-    test_log.Close()
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testWaitFor_buffering(self):
-    # Simulate an adb log stream which does not complete until the test tells it
-    # to. This checks that the log matcher can receive individual lines from the
-    # log reader thread even if adb is not producing enough output to fill an
-    # entire file io buffer.
-    finished_lock = threading.Lock()
-    finished_lock.acquire()
-
-    def LogGenerator():
-      for line in type(self)._TEST_THREADTIME_LOGCAT_DATA:
-        yield line
-      finished_lock.acquire()
-
-    test_adb = adb_wrapper.AdbWrapper('0123456789abcdef')
-    test_adb.Logcat = mock.Mock(return_value=LogGenerator())
-    test_log = logcat_monitor.LogcatMonitor(test_adb, clear=False)
-    test_log.Start()
-
-    actual_match = test_log.WaitFor(r'.*last line.*', None)
-    finished_lock.release()
-    self.assertTrue(actual_match)
-    test_log.Stop()
-    test_log.Close()
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testFindAll_defaults(self):
-    test_log = _CreateTestLog(
-        raw_logcat=type(self)._TEST_THREADTIME_LOGCAT_DATA)
-    test_log.Start()
-    test_log.WaitFor(r'.*last line.*', None)
-    test_log.Stop()
-    expected_results = [
-        ('7890', '0987', 'V', 'LogcatMonitorTest',
-         'verbose logcat monitor test message 1'),
-        ('8901', '1098', 'D', 'LogcatMonitorTest',
-         'debug logcat monitor test message 2'),
-        ('9012', '2109', 'I', 'LogcatMonitorTest',
-         'info logcat monitor test message 3'),
-        ('0123', '3210', 'W', 'LogcatMonitorTest',
-         'warning logcat monitor test message 4'),
-        ('1234', '4321', 'E', 'LogcatMonitorTest',
-         'error logcat monitor test message 5'),
-        ('2345', '5432', 'F', 'LogcatMonitorTest',
-         'fatal logcat monitor test message 6')]
-    actual_results = test_log.FindAll(r'\S* logcat monitor test message \d')
-    self.assertIterEqual(iter(expected_results), actual_results)
-    test_log.Close()
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testFindAll_defaults_miss(self):
-    test_log = _CreateTestLog(
-        raw_logcat=type(self)._TEST_THREADTIME_LOGCAT_DATA)
-    test_log.Start()
-    test_log.WaitFor(r'.*last line.*', None)
-    test_log.Stop()
-    expected_results = []
-    actual_results = test_log.FindAll(r'\S* nothing should match this \d')
-    self.assertIterEqual(iter(expected_results), actual_results)
-    test_log.Close()
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testFindAll_filterProcId(self):
-    test_log = _CreateTestLog(
-        raw_logcat=type(self)._TEST_THREADTIME_LOGCAT_DATA)
-    test_log.Start()
-    test_log.WaitFor(r'.*last line.*', None)
-    test_log.Stop()
-    actual_results = test_log.FindAll(
-        r'\S* logcat monitor test message \d', proc_id=1234)
-    expected_results = [
-        ('1234', '4321', 'E', 'LogcatMonitorTest',
-         'error logcat monitor test message 5')]
-    self.assertIterEqual(iter(expected_results), actual_results)
-    test_log.Close()
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testFindAll_filterThreadId(self):
-    test_log = _CreateTestLog(
-        raw_logcat=type(self)._TEST_THREADTIME_LOGCAT_DATA)
-    test_log.Start()
-    test_log.WaitFor(r'.*last line.*', None)
-    test_log.Stop()
-    actual_results = test_log.FindAll(
-        r'\S* logcat monitor test message \d', thread_id=2109)
-    expected_results = [
-        ('9012', '2109', 'I', 'LogcatMonitorTest',
-         'info logcat monitor test message 3')]
-    self.assertIterEqual(iter(expected_results), actual_results)
-    test_log.Close()
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testFindAll_filterLogLevel(self):
-    test_log = _CreateTestLog(
-        raw_logcat=type(self)._TEST_THREADTIME_LOGCAT_DATA)
-    test_log.Start()
-    test_log.WaitFor(r'.*last line.*', None)
-    test_log.Stop()
-    actual_results = test_log.FindAll(
-        r'\S* logcat monitor test message \d', log_level=r'[DW]')
-    expected_results = [
-        ('8901', '1098', 'D', 'LogcatMonitorTest',
-         'debug logcat monitor test message 2'),
-        ('0123', '3210', 'W', 'LogcatMonitorTest',
-         'warning logcat monitor test message 4')
-    ]
-    self.assertIterEqual(iter(expected_results), actual_results)
-    test_log.Close()
-
-  @mock.patch('time.sleep', mock.Mock())
-  def testFindAll_filterComponent(self):
-    test_log = _CreateTestLog(
-        raw_logcat=type(self)._TEST_THREADTIME_LOGCAT_DATA)
-    test_log.Start()
-    test_log.WaitFor(r'.*last line.*', None)
-    test_log.Stop()
-    actual_results = test_log.FindAll(r'.*', component='LogcatMonitorTest')
-    expected_results = [
-        ('7890', '0987', 'V', 'LogcatMonitorTest',
-         'verbose logcat monitor test message 1'),
-        ('8901', '1098', 'D', 'LogcatMonitorTest',
-         'debug logcat monitor test message 2'),
-        ('9012', '2109', 'I', 'LogcatMonitorTest',
-         'info logcat monitor test message 3'),
-        ('0123', '3210', 'W', 'LogcatMonitorTest',
-         'warning logcat monitor test message 4'),
-        ('1234', '4321', 'E', 'LogcatMonitorTest',
-         'error logcat monitor test message 5'),
-        ('2345', '5432', 'F', 'LogcatMonitorTest',
-         'fatal logcat monitor test message 6'),
-        ('3456', '6543', 'D', 'LogcatMonitorTest',
-         'last line')
-    ]
-    self.assertIterEqual(iter(expected_results), actual_results)
-    test_log.Close()
-
-
-if __name__ == '__main__':
-  unittest.main(verbosity=2)
-
diff --git a/third_party/catapult/devil/devil/android/md5sum.py b/third_party/catapult/devil/devil/android/md5sum.py
deleted file mode 100644
index 6dece9e..0000000
--- a/third_party/catapult/devil/devil/android/md5sum.py
+++ /dev/null
@@ -1,120 +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.
-
-import os
-import posixpath
-import re
-
-from devil import devil_env
-from devil.android import device_errors
-from devil.utils import cmd_helper
-
-MD5SUM_DEVICE_LIB_PATH = '/data/local/tmp/md5sum'
-MD5SUM_DEVICE_BIN_PATH = MD5SUM_DEVICE_LIB_PATH + '/md5sum_bin'
-
-_STARTS_WITH_CHECKSUM_RE = re.compile(r'^\s*[0-9a-fA-F]{32}\s+')
-
-
-def CalculateHostMd5Sums(paths):
-  """Calculates the MD5 sum value for all items in |paths|.
-
-  Directories are traversed recursively and the MD5 sum of each file found is
-  reported in the result.
-
-  Args:
-    paths: A list of host paths to md5sum.
-  Returns:
-    A dict mapping file paths to their respective md5sum checksums.
-  """
-  if isinstance(paths, basestring):
-    paths = [paths]
-
-  md5sum_bin_host_path = devil_env.config.FetchPath('md5sum_host')
-  if not os.path.exists(md5sum_bin_host_path):
-    raise IOError('File not built: %s' % md5sum_bin_host_path)
-  out = cmd_helper.GetCmdOutput(
-    [md5sum_bin_host_path] + [os.path.realpath(p) for p in paths])
-
-  return _ParseMd5SumOutput(out.splitlines())
-
-
-def CalculateDeviceMd5Sums(paths, device):
-  """Calculates the MD5 sum value for all items in |paths|.
-
-  Directories are traversed recursively and the MD5 sum of each file found is
-  reported in the result.
-
-  Args:
-    paths: A list of device paths to md5sum.
-  Returns:
-    A dict mapping file paths to their respective md5sum checksums.
-  """
-  if not paths:
-    return {}
-
-  if isinstance(paths, basestring):
-    paths = [paths]
-  # Allow generators
-  paths = list(paths)
-
-  md5sum_dist_path = devil_env.config.FetchPath('md5sum_device', device=device)
-
-  if os.path.isdir(md5sum_dist_path):
-    md5sum_dist_bin_path = os.path.join(md5sum_dist_path, 'md5sum_bin')
-  else:
-    md5sum_dist_bin_path = md5sum_dist_path
-
-  if not os.path.exists(md5sum_dist_path):
-    raise IOError('File not built: %s' % md5sum_dist_path)
-  md5sum_file_size = os.path.getsize(md5sum_dist_bin_path)
-
-  # For better performance, make the script as small as possible to try and
-  # avoid needing to write to an intermediary file (which RunShellCommand will
-  # do if necessary).
-  md5sum_script = 'a=%s;' % MD5SUM_DEVICE_BIN_PATH
-  # Check if the binary is missing or has changed (using its file size as an
-  # indicator), and trigger a (re-)push via the exit code.
-  md5sum_script += '! [[ $(ls -l $a) = *%d* ]]&&exit 2;' % md5sum_file_size
-  # Make sure it can find libbase.so
-  md5sum_script += 'export LD_LIBRARY_PATH=%s;' % MD5SUM_DEVICE_LIB_PATH
-  if len(paths) > 1:
-    prefix = posixpath.commonprefix(paths)
-    if len(prefix) > 4:
-      md5sum_script += 'p="%s";' % prefix
-      paths = ['$p"%s"' % p[len(prefix):] for p in paths]
-
-  md5sum_script += ';'.join('$a %s' % p for p in paths)
-  # Don't fail the script if the last md5sum fails (due to file not found)
-  # Note: ":" is equivalent to "true".
-  md5sum_script += ';:'
-  try:
-    out = device.RunShellCommand(md5sum_script, shell=True, check_return=True)
-  except device_errors.AdbShellCommandFailedError as e:
-    # Push the binary only if it is found to not exist
-    # (faster than checking up-front).
-    if e.status == 2:
-      # If files were previously pushed as root (adbd running as root), trying
-      # to re-push as non-root causes the push command to report success, but
-      # actually fail. So, wipe the directory first.
-      device.RunShellCommand(['rm', '-rf', MD5SUM_DEVICE_LIB_PATH],
-                             as_root=True, check_return=True)
-      if os.path.isdir(md5sum_dist_path):
-        device.adb.Push(md5sum_dist_path, MD5SUM_DEVICE_LIB_PATH)
-      else:
-        mkdir_cmd = 'a=%s;[[ -e $a ]] || mkdir $a' % MD5SUM_DEVICE_LIB_PATH
-        device.RunShellCommand(mkdir_cmd, shell=True, check_return=True)
-        device.adb.Push(md5sum_dist_bin_path, MD5SUM_DEVICE_BIN_PATH)
-
-      out = device.RunShellCommand(md5sum_script, shell=True, check_return=True)
-    else:
-      raise
-
-  return _ParseMd5SumOutput(out)
-
-
-def _ParseMd5SumOutput(out):
-  hash_and_path = (l.split(None, 1) for l in out
-                   if l and _STARTS_WITH_CHECKSUM_RE.match(l))
-  return dict((p, h) for h, p in hash_and_path)
-
diff --git a/third_party/catapult/devil/devil/android/md5sum_test.py b/third_party/catapult/devil/devil/android/md5sum_test.py
deleted file mode 100755
index c9b4954..0000000
--- a/third_party/catapult/devil/devil/android/md5sum_test.py
+++ /dev/null
@@ -1,237 +0,0 @@
-#!/usr/bin/env python
-# 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.
-
-import os
-import unittest
-
-from devil import devil_env
-from devil.android import device_errors
-from devil.android import md5sum
-
-with devil_env.SysPath(devil_env.PYMOCK_PATH):
-  import mock  # pylint: disable=import-error
-
-TEST_OUT_DIR = os.path.join('test', 'out', 'directory')
-HOST_MD5_EXECUTABLE = os.path.join(TEST_OUT_DIR, 'md5sum_bin_host')
-MD5_DIST = os.path.join(TEST_OUT_DIR, 'md5sum_dist')
-
-
-class Md5SumTest(unittest.TestCase):
-
-  def setUp(self):
-    mocked_attrs = {
-      'md5sum_host': HOST_MD5_EXECUTABLE,
-      'md5sum_device': MD5_DIST,
-    }
-    self._patchers = [
-      mock.patch('devil.devil_env._Environment.FetchPath',
-                 mock.Mock(side_effect=lambda a, device=None: mocked_attrs[a])),
-      mock.patch('os.path.exists',
-                 new=mock.Mock(return_value=True)),
-    ]
-    for p in self._patchers:
-      p.start()
-
-  def tearDown(self):
-    for p in self._patchers:
-      p.stop()
-
-  def testCalculateHostMd5Sums_singlePath(self):
-    test_path = '/test/host/file.dat'
-    mock_get_cmd_output = mock.Mock(
-        return_value='0123456789abcdeffedcba9876543210 /test/host/file.dat')
-    with mock.patch('devil.utils.cmd_helper.GetCmdOutput',
-                    new=mock_get_cmd_output):
-      out = md5sum.CalculateHostMd5Sums(test_path)
-      self.assertEquals(1, len(out))
-      self.assertTrue('/test/host/file.dat' in out)
-      self.assertEquals('0123456789abcdeffedcba9876543210',
-                        out['/test/host/file.dat'])
-      mock_get_cmd_output.assert_called_once_with(
-          [HOST_MD5_EXECUTABLE, '/test/host/file.dat'])
-
-  def testCalculateHostMd5Sums_list(self):
-    test_paths = ['/test/host/file0.dat', '/test/host/file1.dat']
-    mock_get_cmd_output = mock.Mock(
-        return_value='0123456789abcdeffedcba9876543210 /test/host/file0.dat\n'
-                     '123456789abcdef00fedcba987654321 /test/host/file1.dat\n')
-    with mock.patch('devil.utils.cmd_helper.GetCmdOutput',
-                    new=mock_get_cmd_output):
-      out = md5sum.CalculateHostMd5Sums(test_paths)
-      self.assertEquals(2, len(out))
-      self.assertTrue('/test/host/file0.dat' in out)
-      self.assertEquals('0123456789abcdeffedcba9876543210',
-                        out['/test/host/file0.dat'])
-      self.assertTrue('/test/host/file1.dat' in out)
-      self.assertEquals('123456789abcdef00fedcba987654321',
-                        out['/test/host/file1.dat'])
-      mock_get_cmd_output.assert_called_once_with(
-          [HOST_MD5_EXECUTABLE, '/test/host/file0.dat',
-           '/test/host/file1.dat'])
-
-  def testCalculateHostMd5Sums_generator(self):
-    test_paths = ('/test/host/' + p for p in ['file0.dat', 'file1.dat'])
-    mock_get_cmd_output = mock.Mock(
-        return_value='0123456789abcdeffedcba9876543210 /test/host/file0.dat\n'
-                     '123456789abcdef00fedcba987654321 /test/host/file1.dat\n')
-    with mock.patch('devil.utils.cmd_helper.GetCmdOutput',
-                    new=mock_get_cmd_output):
-      out = md5sum.CalculateHostMd5Sums(test_paths)
-      self.assertEquals(2, len(out))
-      self.assertTrue('/test/host/file0.dat' in out)
-      self.assertEquals('0123456789abcdeffedcba9876543210',
-                        out['/test/host/file0.dat'])
-      self.assertTrue('/test/host/file1.dat' in out)
-      self.assertEquals('123456789abcdef00fedcba987654321',
-                        out['/test/host/file1.dat'])
-      mock_get_cmd_output.assert_called_once_with(
-          [HOST_MD5_EXECUTABLE, '/test/host/file0.dat', '/test/host/file1.dat'])
-
-  def testCalculateDeviceMd5Sums_noPaths(self):
-    device = mock.NonCallableMock()
-    device.RunShellCommand = mock.Mock(side_effect=Exception())
-
-    out = md5sum.CalculateDeviceMd5Sums([], device)
-    self.assertEquals(0, len(out))
-
-  def testCalculateDeviceMd5Sums_singlePath(self):
-    test_path = '/storage/emulated/legacy/test/file.dat'
-
-    device = mock.NonCallableMock()
-    device_md5sum_output = [
-        '0123456789abcdeffedcba9876543210 '
-            '/storage/emulated/legacy/test/file.dat',
-    ]
-    device.RunShellCommand = mock.Mock(return_value=device_md5sum_output)
-
-    with mock.patch('os.path.getsize', return_value=1337):
-      out = md5sum.CalculateDeviceMd5Sums(test_path, device)
-      self.assertEquals(1, len(out))
-      self.assertTrue('/storage/emulated/legacy/test/file.dat' in out)
-      self.assertEquals('0123456789abcdeffedcba9876543210',
-                        out['/storage/emulated/legacy/test/file.dat'])
-      self.assertEquals(1, len(device.RunShellCommand.call_args_list))
-
-  def testCalculateDeviceMd5Sums_list(self):
-    test_path = ['/storage/emulated/legacy/test/file0.dat',
-                 '/storage/emulated/legacy/test/file1.dat']
-    device = mock.NonCallableMock()
-    device_md5sum_output = [
-        '0123456789abcdeffedcba9876543210 '
-            '/storage/emulated/legacy/test/file0.dat',
-        '123456789abcdef00fedcba987654321 '
-            '/storage/emulated/legacy/test/file1.dat',
-    ]
-    device.RunShellCommand = mock.Mock(return_value=device_md5sum_output)
-
-    with mock.patch('os.path.getsize', return_value=1337):
-      out = md5sum.CalculateDeviceMd5Sums(test_path, device)
-      self.assertEquals(2, len(out))
-      self.assertTrue('/storage/emulated/legacy/test/file0.dat' in out)
-      self.assertEquals('0123456789abcdeffedcba9876543210',
-                        out['/storage/emulated/legacy/test/file0.dat'])
-      self.assertTrue('/storage/emulated/legacy/test/file1.dat' in out)
-      self.assertEquals('123456789abcdef00fedcba987654321',
-                        out['/storage/emulated/legacy/test/file1.dat'])
-      self.assertEquals(1, len(device.RunShellCommand.call_args_list))
-
-  def testCalculateDeviceMd5Sums_generator(self):
-    test_path = ('/storage/emulated/legacy/test/file%d.dat' % n
-                 for n in xrange(0, 2))
-
-    device = mock.NonCallableMock()
-    device_md5sum_output = [
-        '0123456789abcdeffedcba9876543210 '
-            '/storage/emulated/legacy/test/file0.dat',
-        '123456789abcdef00fedcba987654321 '
-            '/storage/emulated/legacy/test/file1.dat',
-    ]
-    device.RunShellCommand = mock.Mock(return_value=device_md5sum_output)
-
-    with mock.patch('os.path.getsize', return_value=1337):
-      out = md5sum.CalculateDeviceMd5Sums(test_path, device)
-      self.assertEquals(2, len(out))
-      self.assertTrue('/storage/emulated/legacy/test/file0.dat' in out)
-      self.assertEquals('0123456789abcdeffedcba9876543210',
-                        out['/storage/emulated/legacy/test/file0.dat'])
-      self.assertTrue('/storage/emulated/legacy/test/file1.dat' in out)
-      self.assertEquals('123456789abcdef00fedcba987654321',
-                        out['/storage/emulated/legacy/test/file1.dat'])
-      self.assertEquals(1, len(device.RunShellCommand.call_args_list))
-
-  def testCalculateDeviceMd5Sums_singlePath_linkerWarning(self):
-    # See crbug/479966
-    test_path = '/storage/emulated/legacy/test/file.dat'
-
-    device = mock.NonCallableMock()
-    device_md5sum_output = [
-        'WARNING: linker: /data/local/tmp/md5sum/md5sum_bin: '
-            'unused DT entry: type 0x1d arg 0x15db',
-        'THIS_IS_NOT_A_VALID_CHECKSUM_ZZZ some random text',
-        '0123456789abcdeffedcba9876543210 '
-            '/storage/emulated/legacy/test/file.dat',
-    ]
-    device.RunShellCommand = mock.Mock(return_value=device_md5sum_output)
-
-    with mock.patch('os.path.getsize', return_value=1337):
-      out = md5sum.CalculateDeviceMd5Sums(test_path, device)
-      self.assertEquals(1, len(out))
-      self.assertTrue('/storage/emulated/legacy/test/file.dat' in out)
-      self.assertEquals('0123456789abcdeffedcba9876543210',
-                        out['/storage/emulated/legacy/test/file.dat'])
-      self.assertEquals(1, len(device.RunShellCommand.call_args_list))
-
-  def testCalculateDeviceMd5Sums_list_fileMissing(self):
-    test_path = ['/storage/emulated/legacy/test/file0.dat',
-                 '/storage/emulated/legacy/test/file1.dat']
-    device = mock.NonCallableMock()
-    device_md5sum_output = [
-        '0123456789abcdeffedcba9876543210 '
-            '/storage/emulated/legacy/test/file0.dat',
-        '[0819/203513:ERROR:md5sum.cc(25)] Could not open file asdf',
-        '',
-    ]
-    device.RunShellCommand = mock.Mock(return_value=device_md5sum_output)
-
-    with mock.patch('os.path.getsize', return_value=1337):
-      out = md5sum.CalculateDeviceMd5Sums(test_path, device)
-      self.assertEquals(1, len(out))
-      self.assertTrue('/storage/emulated/legacy/test/file0.dat' in out)
-      self.assertEquals('0123456789abcdeffedcba9876543210',
-                        out['/storage/emulated/legacy/test/file0.dat'])
-      self.assertEquals(1, len(device.RunShellCommand.call_args_list))
-
-  def testCalculateDeviceMd5Sums_requiresBinary(self):
-    test_path = '/storage/emulated/legacy/test/file.dat'
-
-    device = mock.NonCallableMock()
-    device.adb = mock.NonCallableMock()
-    device.adb.Push = mock.Mock()
-    device_md5sum_output = [
-        'WARNING: linker: /data/local/tmp/md5sum/md5sum_bin: '
-            'unused DT entry: type 0x1d arg 0x15db',
-        'THIS_IS_NOT_A_VALID_CHECKSUM_ZZZ some random text',
-        '0123456789abcdeffedcba9876543210 '
-            '/storage/emulated/legacy/test/file.dat',
-    ]
-    error = device_errors.AdbShellCommandFailedError('cmd', 'out', 2)
-    device.RunShellCommand = mock.Mock(
-        side_effect=(error, '', device_md5sum_output))
-
-    with mock.patch('os.path.isdir', return_value=True), (
-         mock.patch('os.path.getsize', return_value=1337)):
-      out = md5sum.CalculateDeviceMd5Sums(test_path, device)
-      self.assertEquals(1, len(out))
-      self.assertTrue('/storage/emulated/legacy/test/file.dat' in out)
-      self.assertEquals('0123456789abcdeffedcba9876543210',
-                        out['/storage/emulated/legacy/test/file.dat'])
-      self.assertEquals(3, len(device.RunShellCommand.call_args_list))
-      device.adb.Push.assert_called_once_with(
-          'test/out/directory/md5sum_dist', '/data/local/tmp/md5sum')
-
-
-if __name__ == '__main__':
-  unittest.main(verbosity=2)
-
diff --git a/third_party/catapult/devil/devil/android/perf/__init__.py b/third_party/catapult/devil/devil/android/perf/__init__.py
deleted file mode 100644
index 50b23df..0000000
--- a/third_party/catapult/devil/devil/android/perf/__init__.py
+++ /dev/null
@@ -1,3 +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.
diff --git a/third_party/catapult/devil/devil/android/perf/cache_control.py b/third_party/catapult/devil/devil/android/perf/cache_control.py
deleted file mode 100644
index 27782b5..0000000
--- a/third_party/catapult/devil/devil/android/perf/cache_control.py
+++ /dev/null
@@ -1,15 +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.
-
-
-class CacheControl(object):
-  _DROP_CACHES = '/proc/sys/vm/drop_caches'
-
-  def __init__(self, device):
-    self._device = device
-
-  def DropRamCaches(self):
-    """Drops the filesystem ram caches for performance testing."""
-    self._device.RunShellCommand(['sync'], check_return=True, as_root=True)
-    self._device.WriteFile(CacheControl._DROP_CACHES, '3', as_root=True)
diff --git a/third_party/catapult/devil/devil/android/perf/perf_control.py b/third_party/catapult/devil/devil/android/perf/perf_control.py
deleted file mode 100644
index 06a5db6..0000000
--- a/third_party/catapult/devil/devil/android/perf/perf_control.py
+++ /dev/null
@@ -1,210 +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.
-
-import atexit
-import logging
-import re
-
-from devil.android import device_errors
-
-logger = logging.getLogger(__name__)
-
-
-class PerfControl(object):
-  """Provides methods for setting the performance mode of a device."""
-
-  _AVAILABLE_GOVERNORS_REL_PATH = 'cpufreq/scaling_available_governors'
-  _CPU_FILE_PATTERN = re.compile(r'^cpu\d+$')
-  _CPU_PATH = '/sys/devices/system/cpu'
-  _KERNEL_MAX = '/sys/devices/system/cpu/kernel_max'
-
-  def __init__(self, device):
-    self._device = device
-    self._cpu_files = [
-        filename
-        for filename in self._device.ListDirectory(self._CPU_PATH, as_root=True)
-        if self._CPU_FILE_PATTERN.match(filename)]
-    assert self._cpu_files, 'Failed to detect CPUs.'
-    self._cpu_file_list = ' '.join(self._cpu_files)
-    logger.info('CPUs found: %s', self._cpu_file_list)
-
-    self._have_mpdecision = self._device.FileExists('/system/bin/mpdecision')
-
-    raw = self._ReadEachCpuFile(self._AVAILABLE_GOVERNORS_REL_PATH)
-    self._available_governors = [
-        (cpu, raw_governors.strip().split() if not exit_code else None)
-        for cpu, raw_governors, exit_code in raw]
-
-  def SetHighPerfMode(self):
-    """Sets the highest stable performance mode for the device."""
-    try:
-      self._device.EnableRoot()
-    except device_errors.CommandFailedError:
-      message = 'Need root for performance mode. Results may be NOISY!!'
-      logger.warning(message)
-      # Add an additional warning at exit, such that it's clear that any results
-      # may be different/noisy (due to the lack of intended performance mode).
-      atexit.register(logger.warning, message)
-      return
-
-    product_model = self._device.product_model
-    # TODO(epenner): Enable on all devices (http://crbug.com/383566)
-    if 'Nexus 4' == product_model:
-      self._ForceAllCpusOnline(True)
-      if not self._AllCpusAreOnline():
-        logger.warning('Failed to force CPUs online. Results may be NOISY!')
-      self.SetScalingGovernor('performance')
-    elif 'Nexus 5' == product_model:
-      self._ForceAllCpusOnline(True)
-      if not self._AllCpusAreOnline():
-        logger.warning('Failed to force CPUs online. Results may be NOISY!')
-      self.SetScalingGovernor('performance')
-      self._SetScalingMaxFreq(1190400)
-      self._SetMaxGpuClock(200000000)
-    else:
-      self.SetScalingGovernor('performance')
-
-  def SetPerfProfilingMode(self):
-    """Enables all cores for reliable perf profiling."""
-    self._ForceAllCpusOnline(True)
-    self.SetScalingGovernor('performance')
-    if not self._AllCpusAreOnline():
-      if not self._device.HasRoot():
-        raise RuntimeError('Need root to force CPUs online.')
-      raise RuntimeError('Failed to force CPUs online.')
-
-  def SetDefaultPerfMode(self):
-    """Sets the performance mode for the device to its default mode."""
-    if not self._device.HasRoot():
-      return
-    product_model = self._device.product_model
-    if 'Nexus 5' == product_model:
-      if self._AllCpusAreOnline():
-        self._SetScalingMaxFreq(2265600)
-        self._SetMaxGpuClock(450000000)
-
-    governor_mode = {
-        'GT-I9300': 'pegasusq',
-        'Galaxy Nexus': 'interactive',
-        'Nexus 4': 'ondemand',
-        'Nexus 5': 'ondemand',
-        'Nexus 7': 'interactive',
-        'Nexus 10': 'interactive'
-    }.get(product_model, 'ondemand')
-    self.SetScalingGovernor(governor_mode)
-    self._ForceAllCpusOnline(False)
-
-  def GetCpuInfo(self):
-    online = (output.rstrip() == '1' and status == 0
-              for (_, output, status) in self._ForEachCpu('cat "$CPU/online"'))
-    governor = (output.rstrip() if status == 0 else None
-                for (_, output, status)
-                in self._ForEachCpu('cat "$CPU/cpufreq/scaling_governor"'))
-    return zip(self._cpu_files, online, governor)
-
-  def _ForEachCpu(self, cmd):
-    script = '; '.join([
-        'for CPU in %s' % self._cpu_file_list,
-        'do %s' % cmd,
-        'echo -n "%~%$?%~%"',
-        'done'
-    ])
-    output = self._device.RunShellCommand(
-        script, cwd=self._CPU_PATH, check_return=True, as_root=True, shell=True)
-    output = '\n'.join(output).split('%~%')
-    return zip(self._cpu_files, output[0::2], (int(c) for c in output[1::2]))
-
-  def _WriteEachCpuFile(self, path, value):
-    self._ConditionallyWriteEachCpuFile(path, value, condition='true')
-
-  def _ConditionallyWriteEachCpuFile(self, path, value, condition):
-    template = (
-        '{condition} && test -e "$CPU/{path}" && echo {value} > "$CPU/{path}"')
-    results = self._ForEachCpu(
-        template.format(path=path, value=value, condition=condition))
-    cpus = ' '.join(cpu for (cpu, _, status) in results if status == 0)
-    if cpus:
-      logger.info('Successfully set %s to %r on: %s', path, value, cpus)
-    else:
-      logger.warning('Failed to set %s to %r on any cpus', path, value)
-
-  def _ReadEachCpuFile(self, path):
-    return self._ForEachCpu(
-        'cat "$CPU/{path}"'.format(path=path))
-
-  def SetScalingGovernor(self, value):
-    """Sets the scaling governor to the given value on all possible CPUs.
-
-    This does not attempt to set a governor to a value not reported as available
-    on the corresponding CPU.
-
-    Args:
-      value: [string] The new governor value.
-    """
-    condition = 'test -e "{path}" && grep -q {value} {path}'.format(
-        path=('${CPU}/%s' % self._AVAILABLE_GOVERNORS_REL_PATH),
-        value=value)
-    self._ConditionallyWriteEachCpuFile(
-        'cpufreq/scaling_governor', value, condition)
-
-  def GetScalingGovernor(self):
-    """Gets the currently set governor for each CPU.
-
-    Returns:
-      An iterable of 2-tuples, each containing the cpu and the current
-      governor.
-    """
-    raw = self._ReadEachCpuFile('cpufreq/scaling_governor')
-    return [
-        (cpu, raw_governor.strip() if not exit_code else None)
-        for cpu, raw_governor, exit_code in raw]
-
-  def ListAvailableGovernors(self):
-    """Returns the list of available governors for each CPU.
-
-    Returns:
-      An iterable of 2-tuples, each containing the cpu and a list of available
-      governors for that cpu.
-    """
-    return self._available_governors
-
-  def _SetScalingMaxFreq(self, value):
-    self._WriteEachCpuFile('cpufreq/scaling_max_freq', '%d' % value)
-
-  def _SetMaxGpuClock(self, value):
-    self._device.WriteFile('/sys/class/kgsl/kgsl-3d0/max_gpuclk',
-                           str(value),
-                           as_root=True)
-
-  def _AllCpusAreOnline(self):
-    results = self._ForEachCpu('cat "$CPU/online"')
-    # TODO(epenner): Investigate why file may be missing
-    # (http://crbug.com/397118)
-    return all(output.rstrip() == '1' and status == 0
-               for (cpu, output, status) in results
-               if cpu != 'cpu0')
-
-  def _ForceAllCpusOnline(self, force_online):
-    """Enable all CPUs on a device.
-
-    Some vendors (or only Qualcomm?) hot-plug their CPUs, which can add noise
-    to measurements:
-    - In perf, samples are only taken for the CPUs that are online when the
-      measurement is started.
-    - The scaling governor can't be set for an offline CPU and frequency scaling
-      on newly enabled CPUs adds noise to both perf and tracing measurements.
-
-    It appears Qualcomm is the only vendor that hot-plugs CPUs, and on Qualcomm
-    this is done by "mpdecision".
-
-    """
-    if self._have_mpdecision:
-      cmd = ['stop', 'mpdecision'] if force_online else ['start', 'mpdecision']
-      self._device.RunShellCommand(cmd, check_return=True, as_root=True)
-
-    if not self._have_mpdecision and not self._AllCpusAreOnline():
-      logger.warning('Unexpected cpu hot plugging detected.')
-
-    if force_online:
-      self._ForEachCpu('echo 1 > "$CPU/online"')
diff --git a/third_party/catapult/devil/devil/android/perf/perf_control_devicetest.py b/third_party/catapult/devil/devil/android/perf/perf_control_devicetest.py
deleted file mode 100644
index b645803..0000000
--- a/third_party/catapult/devil/devil/android/perf/perf_control_devicetest.py
+++ /dev/null
@@ -1,38 +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.
-# pylint: disable=W0212
-
-import os
-import sys
-import unittest
-
-sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..'))
-
-from devil.android import device_test_case
-from devil.android import device_utils
-from devil.android.perf import perf_control
-
-
-class TestPerfControl(device_test_case.DeviceTestCase):
-
-  def setUp(self):
-    super(TestPerfControl, self).setUp()
-    if not os.getenv('BUILDTYPE'):
-      os.environ['BUILDTYPE'] = 'Debug'
-    self._device = device_utils.DeviceUtils(self.serial)
-
-  def testHighPerfMode(self):
-    perf = perf_control.PerfControl(self._device)
-    try:
-      perf.SetPerfProfilingMode()
-      cpu_info = perf.GetCpuInfo()
-      self.assertEquals(len(perf._cpu_files), len(cpu_info))
-      for _, online, governor in cpu_info:
-        self.assertTrue(online)
-        self.assertEquals('performance', governor)
-    finally:
-      perf.SetDefaultPerfMode()
-
-if __name__ == '__main__':
-  unittest.main()
diff --git a/third_party/catapult/devil/devil/android/perf/surface_stats_collector.py b/third_party/catapult/devil/devil/android/perf/surface_stats_collector.py
deleted file mode 100644
index 25079f3..0000000
--- a/third_party/catapult/devil/devil/android/perf/surface_stats_collector.py
+++ /dev/null
@@ -1,186 +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.
-
-import Queue
-import threading
-
-
-# Log marker containing SurfaceTexture timestamps.
-_SURFACE_TEXTURE_TIMESTAMPS_MESSAGE = 'SurfaceTexture update timestamps'
-_SURFACE_TEXTURE_TIMESTAMP_RE = r'\d+'
-
-
-class SurfaceStatsCollector(object):
-  """Collects surface stats for a SurfaceView from the output of SurfaceFlinger.
-
-  Args:
-    device: A DeviceUtils instance.
-  """
-
-  def __init__(self, device):
-    self._device = device
-    self._collector_thread = None
-    self._surface_before = None
-    self._get_data_event = None
-    self._data_queue = None
-    self._stop_event = None
-    self._warn_about_empty_data = True
-
-  def DisableWarningAboutEmptyData(self):
-    self._warn_about_empty_data = False
-
-  def Start(self):
-    assert not self._collector_thread
-
-    if self._ClearSurfaceFlingerLatencyData():
-      self._get_data_event = threading.Event()
-      self._stop_event = threading.Event()
-      self._data_queue = Queue.Queue()
-      self._collector_thread = threading.Thread(target=self._CollectorThread)
-      self._collector_thread.start()
-    else:
-      raise Exception('SurfaceFlinger not supported on this device.')
-
-  def Stop(self):
-    assert self._collector_thread
-    (refresh_period, timestamps) = self._GetDataFromThread()
-    if self._collector_thread:
-      self._stop_event.set()
-      self._collector_thread.join()
-      self._collector_thread = None
-    return (refresh_period, timestamps)
-
-  def _CollectorThread(self):
-    last_timestamp = 0
-    timestamps = []
-    retries = 0
-
-    while not self._stop_event.is_set():
-      self._get_data_event.wait(1)
-      try:
-        refresh_period, new_timestamps = self._GetSurfaceFlingerFrameData()
-        if refresh_period is None or timestamps is None:
-          retries += 1
-          if retries < 3:
-            continue
-          if last_timestamp:
-            # Some data has already been collected, but either the app
-            # was closed or there's no new data. Signal the main thread and
-            # wait.
-            self._data_queue.put((None, None))
-            self._stop_event.wait()
-            break
-          raise Exception('Unable to get surface flinger latency data')
-
-        timestamps += [timestamp for timestamp in new_timestamps
-                       if timestamp > last_timestamp]
-        if len(timestamps):
-          last_timestamp = timestamps[-1]
-
-        if self._get_data_event.is_set():
-          self._get_data_event.clear()
-          self._data_queue.put((refresh_period, timestamps))
-          timestamps = []
-      except Exception as e:
-        # On any error, before aborting, put the exception into _data_queue to
-        # prevent the main thread from waiting at _data_queue.get() infinitely.
-        self._data_queue.put(e)
-        raise
-
-  def _GetDataFromThread(self):
-    self._get_data_event.set()
-    ret = self._data_queue.get()
-    if isinstance(ret, Exception):
-      raise ret
-    return ret
-
-  def _ClearSurfaceFlingerLatencyData(self):
-    """Clears the SurfaceFlinger latency data.
-
-    Returns:
-      True if SurfaceFlinger latency is supported by the device, otherwise
-      False.
-    """
-    # The command returns nothing if it is supported, otherwise returns many
-    # lines of result just like 'dumpsys SurfaceFlinger'.
-    results = self._device.RunShellCommand(
-        ['dumpsys', 'SurfaceFlinger', '--latency-clear', 'SurfaceView'],
-        check_return=True)
-    return not len(results)
-
-  def GetSurfaceFlingerPid(self):
-    pids_dict = self._device.GetPids('surfaceflinger')
-    if not pids_dict:
-      raise Exception('Unable to get surface flinger process id')
-    # TODO(cataput:#3378): Do more strict checks in GetPids when possible.
-    # For now it just returns the first pid found of some matching process.
-    return pids_dict.popitem()[1][0]
-
-  def _GetSurfaceFlingerFrameData(self):
-    """Returns collected SurfaceFlinger frame timing data.
-
-    Returns:
-      A tuple containing:
-      - The display's nominal refresh period in milliseconds.
-      - A list of timestamps signifying frame presentation times in
-        milliseconds.
-      The return value may be (None, None) if there was no data collected (for
-      example, if the app was closed before the collector thread has finished).
-    """
-    # adb shell dumpsys SurfaceFlinger --latency <window name>
-    # prints some information about the last 128 frames displayed in
-    # that window.
-    # The data returned looks like this:
-    # 16954612
-    # 7657467895508   7657482691352   7657493499756
-    # 7657484466553   7657499645964   7657511077881
-    # 7657500793457   7657516600576   7657527404785
-    # (...)
-    #
-    # The first line is the refresh period (here 16.95 ms), it is followed
-    # by 128 lines w/ 3 timestamps in nanosecond each:
-    # A) when the app started to draw
-    # B) the vsync immediately preceding SF submitting the frame to the h/w
-    # C) timestamp immediately after SF submitted that frame to the h/w
-    #
-    # The difference between the 1st and 3rd timestamp is the frame-latency.
-    # An interesting data is when the frame latency crosses a refresh period
-    # boundary, this can be calculated this way:
-    #
-    # ceil((C - A) / refresh-period)
-    #
-    # (each time the number above changes, we have a "jank").
-    # If this happens a lot during an animation, the animation appears
-    # janky, even if it runs at 60 fps in average.
-    #
-    # We use the special "SurfaceView" window name because the statistics for
-    # the activity's main window are not updated when the main web content is
-    # composited into a SurfaceView.
-    results = self._device.RunShellCommand(
-        ['dumpsys', 'SurfaceFlinger', '--latency', 'SurfaceView'],
-        check_return=True)
-    if not len(results):
-      return (None, None)
-
-    timestamps = []
-    nanoseconds_per_millisecond = 1e6
-    refresh_period = long(results[0]) / nanoseconds_per_millisecond
-
-    # If a fence associated with a frame is still pending when we query the
-    # latency data, SurfaceFlinger gives the frame a timestamp of INT64_MAX.
-    # Since we only care about completed frames, we will ignore any timestamps
-    # with this value.
-    pending_fence_timestamp = (1 << 63) - 1
-
-    for line in results[1:]:
-      fields = line.split()
-      if len(fields) != 3:
-        continue
-      timestamp = long(fields[1])
-      if timestamp == pending_fence_timestamp:
-        continue
-      timestamp /= nanoseconds_per_millisecond
-      timestamps.append(timestamp)
-
-    return (refresh_period, timestamps)
diff --git a/third_party/catapult/devil/devil/android/perf/thermal_throttle.py b/third_party/catapult/devil/devil/android/perf/thermal_throttle.py
deleted file mode 100644
index 546a92e..0000000
--- a/third_party/catapult/devil/devil/android/perf/thermal_throttle.py
+++ /dev/null
@@ -1,135 +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.
-
-import logging
-
-logger = logging.getLogger(__name__)
-
-
-class OmapThrottlingDetector(object):
-  """Class to detect and track thermal throttling on an OMAP 4."""
-  OMAP_TEMP_FILE = ('/sys/devices/platform/omap/omap_temp_sensor.0/'
-                    'temperature')
-
-  @staticmethod
-  def IsSupported(device):
-    return device.FileExists(OmapThrottlingDetector.OMAP_TEMP_FILE)
-
-  def __init__(self, device):
-    self._device = device
-
-  @staticmethod
-  def BecameThrottled(log_line):
-    return 'omap_thermal_throttle' in log_line
-
-  @staticmethod
-  def BecameUnthrottled(log_line):
-    return 'omap_thermal_unthrottle' in log_line
-
-  @staticmethod
-  def GetThrottlingTemperature(log_line):
-    if 'throttle_delayed_work_fn' in log_line:
-      return float([s for s in log_line.split() if s.isdigit()][0]) / 1000.0
-
-  def GetCurrentTemperature(self):
-    tempdata = self._device.ReadFile(OmapThrottlingDetector.OMAP_TEMP_FILE)
-    return float(tempdata) / 1000.0
-
-
-class ExynosThrottlingDetector(object):
-  """Class to detect and track thermal throttling on an Exynos 5."""
-  @staticmethod
-  def IsSupported(device):
-    return device.FileExists('/sys/bus/exynos5-core')
-
-  def __init__(self, device):
-    pass
-
-  @staticmethod
-  def BecameThrottled(log_line):
-    return 'exynos_tmu: Throttling interrupt' in log_line
-
-  @staticmethod
-  def BecameUnthrottled(log_line):
-    return 'exynos_thermal_unthrottle: not throttling' in log_line
-
-  @staticmethod
-  def GetThrottlingTemperature(_log_line):
-    return None
-
-  @staticmethod
-  def GetCurrentTemperature():
-    return None
-
-
-class ThermalThrottle(object):
-  """Class to detect and track thermal throttling.
-
-  Usage:
-    Wait for IsThrottled() to be False before running test
-    After running test call HasBeenThrottled() to find out if the
-    test run was affected by thermal throttling.
-  """
-
-  def __init__(self, device):
-    self._device = device
-    self._throttled = False
-    self._detector = None
-    if OmapThrottlingDetector.IsSupported(device):
-      self._detector = OmapThrottlingDetector(device)
-    elif ExynosThrottlingDetector.IsSupported(device):
-      self._detector = ExynosThrottlingDetector(device)
-
-  def HasBeenThrottled(self):
-    """True if there has been any throttling since the last call to
-       HasBeenThrottled or IsThrottled.
-    """
-    return self._ReadLog()
-
-  def IsThrottled(self):
-    """True if currently throttled."""
-    self._ReadLog()
-    return self._throttled
-
-  def _ReadLog(self):
-    if not self._detector:
-      return False
-    has_been_throttled = False
-    serial_number = str(self._device)
-    log = self._device.RunShellCommand(
-        ['dmesg', '-c'], large_output=True, check_return=True)
-    degree_symbol = unichr(0x00B0)
-    for line in log:
-      if self._detector.BecameThrottled(line):
-        if not self._throttled:
-          logger.warning('>>> Device %s thermally throttled', serial_number)
-        self._throttled = True
-        has_been_throttled = True
-      elif self._detector.BecameUnthrottled(line):
-        if self._throttled:
-          logger.warning('>>> Device %s thermally unthrottled', serial_number)
-        self._throttled = False
-        has_been_throttled = True
-      temperature = self._detector.GetThrottlingTemperature(line)
-      if temperature is not None:
-        logger.info(u'Device %s thermally throttled at %3.1f%sC',
-                    serial_number, temperature, degree_symbol)
-
-    if logger.isEnabledFor(logging.DEBUG):
-      # Print current temperature of CPU SoC.
-      temperature = self._detector.GetCurrentTemperature()
-      if temperature is not None:
-        logger.debug(u'Current SoC temperature of %s = %3.1f%sC',
-                     serial_number, temperature, degree_symbol)
-
-      # Print temperature of battery, to give a system temperature
-      dumpsys_log = self._device.RunShellCommand(
-          ['dumpsys', 'battery'], check_return=True)
-      for line in dumpsys_log:
-        if 'temperature' in line:
-          btemp = float([s for s in line.split() if s.isdigit()][0]) / 10.0
-          logger.debug(u'Current battery temperature of %s = %3.1f%sC',
-                       serial_number, btemp, degree_symbol)
-
-    return has_been_throttled
diff --git a/third_party/catapult/devil/devil/android/ports.py b/third_party/catapult/devil/devil/android/ports.py
deleted file mode 100644
index 1d4e5f2..0000000
--- a/third_party/catapult/devil/devil/android/ports.py
+++ /dev/null
@@ -1,178 +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.
-
-"""Functions that deal with local and device ports."""
-
-import contextlib
-import fcntl
-import httplib
-import logging
-import os
-import socket
-import traceback
-
-logger = logging.getLogger(__name__)
-
-# The net test server is started from port 10201.
-_TEST_SERVER_PORT_FIRST = 10201
-_TEST_SERVER_PORT_LAST = 30000
-# A file to record next valid port of test server.
-_TEST_SERVER_PORT_FILE = '/tmp/test_server_port'
-_TEST_SERVER_PORT_LOCKFILE = '/tmp/test_server_port.lock'
-
-
-# The following two methods are used to allocate the port source for various
-# types of test servers. Because some net-related tests can be run on shards at
-# same time, it's important to have a mechanism to allocate the port
-# process-safe. In here, we implement the safe port allocation by leveraging
-# flock.
-def ResetTestServerPortAllocation():
-  """Resets the port allocation to start from TEST_SERVER_PORT_FIRST.
-
-  Returns:
-    Returns True if reset successes. Otherwise returns False.
-  """
-  try:
-    with open(_TEST_SERVER_PORT_FILE, 'w') as fp:
-      fp.write('%d' % _TEST_SERVER_PORT_FIRST)
-    return True
-  except Exception:  # pylint: disable=broad-except
-    logger.exception('Error while resetting port allocation')
-  return False
-
-
-def AllocateTestServerPort():
-  """Allocates a port incrementally.
-
-  Returns:
-    Returns a valid port which should be in between TEST_SERVER_PORT_FIRST and
-    TEST_SERVER_PORT_LAST. Returning 0 means no more valid port can be used.
-  """
-  port = 0
-  ports_tried = []
-  try:
-    fp_lock = open(_TEST_SERVER_PORT_LOCKFILE, 'w')
-    fcntl.flock(fp_lock, fcntl.LOCK_EX)
-    # Get current valid port and calculate next valid port.
-    if not os.path.exists(_TEST_SERVER_PORT_FILE):
-      ResetTestServerPortAllocation()
-    with open(_TEST_SERVER_PORT_FILE, 'r+') as fp:
-      port = int(fp.read())
-      ports_tried.append(port)
-      while not IsHostPortAvailable(port):
-        port += 1
-        ports_tried.append(port)
-      if (port > _TEST_SERVER_PORT_LAST or
-          port < _TEST_SERVER_PORT_FIRST):
-        port = 0
-      else:
-        fp.seek(0, os.SEEK_SET)
-        fp.write('%d' % (port + 1))
-  except Exception:  # pylint: disable=broad-except
-    logger.exception('Error while allocating port')
-  finally:
-    if fp_lock:
-      fcntl.flock(fp_lock, fcntl.LOCK_UN)
-      fp_lock.close()
-  if port:
-    logger.info('Allocate port %d for test server.', port)
-  else:
-    logger.error('Could not allocate port for test server. '
-                 'List of ports tried: %s', str(ports_tried))
-  return port
-
-
-def IsHostPortAvailable(host_port):
-  """Checks whether the specified host port is available.
-
-  Args:
-    host_port: Port on host to check.
-
-  Returns:
-    True if the port on host is available, otherwise returns False.
-  """
-  s = socket.socket()
-  try:
-    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
-    s.bind(('', host_port))
-    s.close()
-    return True
-  except socket.error:
-    return False
-
-
-def IsDevicePortUsed(device, device_port, state=''):
-  """Checks whether the specified device port is used or not.
-
-  Args:
-    device: A DeviceUtils instance.
-    device_port: Port on device we want to check.
-    state: String of the specified state. Default is empty string, which
-           means any state.
-
-  Returns:
-    True if the port on device is already used, otherwise returns False.
-  """
-  base_urls = ('127.0.0.1:%d' % device_port, 'localhost:%d' % device_port)
-  netstat_results = device.RunShellCommand(
-      ['netstat', '-a'], check_return=True, large_output=True)
-  for single_connect in netstat_results:
-    # Column 3 is the local address which we want to check with.
-    connect_results = single_connect.split()
-    if connect_results[0] != 'tcp':
-      continue
-    if len(connect_results) < 6:
-      raise Exception('Unexpected format while parsing netstat line: ' +
-                      single_connect)
-    is_state_match = connect_results[5] == state if state else True
-    if connect_results[3] in base_urls and is_state_match:
-      return True
-  return False
-
-
-def IsHttpServerConnectable(host, port, tries=3, command='GET', path='/',
-                            expected_read='', timeout=2):
-  """Checks whether the specified http server is ready to serve request or not.
-
-  Args:
-    host: Host name of the HTTP server.
-    port: Port number of the HTTP server.
-    tries: How many times we want to test the connection. The default value is
-           3.
-    command: The http command we use to connect to HTTP server. The default
-             command is 'GET'.
-    path: The path we use when connecting to HTTP server. The default path is
-          '/'.
-    expected_read: The content we expect to read from the response. The default
-                   value is ''.
-    timeout: Timeout (in seconds) for each http connection. The default is 2s.
-
-  Returns:
-    Tuple of (connect status, client error). connect status is a boolean value
-    to indicate whether the server is connectable. client_error is the error
-    message the server returns when connect status is false.
-  """
-  assert tries >= 1
-  for i in xrange(0, tries):
-    client_error = None
-    try:
-      with contextlib.closing(httplib.HTTPConnection(
-          host, port, timeout=timeout)) as http:
-        # Output some debug information when we have tried more than 2 times.
-        http.set_debuglevel(i >= 2)
-        http.request(command, path)
-        r = http.getresponse()
-        content = r.read()
-        if r.status == 200 and r.reason == 'OK' and content == expected_read:
-          return (True, '')
-        client_error = ('Bad response: %s %s version %s\n  ' %
-                        (r.status, r.reason, r.version) +
-                        '\n  '.join([': '.join(h) for h in r.getheaders()]))
-    except (httplib.HTTPException, socket.error) as e:
-      # Probably too quick connecting: try again.
-      exception_error_msgs = traceback.format_exception_only(type(e), e)
-      if exception_error_msgs:
-        client_error = ''.join(exception_error_msgs)
-  # Only returns last client_error.
-  return (False, client_error or 'Timeout')
diff --git a/third_party/catapult/devil/devil/android/sdk/__init__.py b/third_party/catapult/devil/devil/android/sdk/__init__.py
deleted file mode 100644
index f95d3b2..0000000
--- a/third_party/catapult/devil/devil/android/sdk/__init__.py
+++ /dev/null
@@ -1,6 +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.
-
-# This package is intended for modules that are very tightly coupled to
-# tools or APIs from the Android SDK.
diff --git a/third_party/catapult/devil/devil/android/sdk/aapt.py b/third_party/catapult/devil/devil/android/sdk/aapt.py
deleted file mode 100644
index 7ae3a93..0000000
--- a/third_party/catapult/devil/devil/android/sdk/aapt.py
+++ /dev/null
@@ -1,43 +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.
-
-"""This module wraps the Android Asset Packaging Tool."""
-
-from devil.android.sdk import build_tools
-from devil.utils import cmd_helper
-from devil.utils import lazy
-
-
-_aapt_path = lazy.WeakConstant(lambda: build_tools.GetPath('aapt'))
-
-
-def _RunAaptCmd(args):
-  """Runs an aapt command.
-
-  Args:
-    args: A list of arguments for aapt.
-
-  Returns:
-    The output of the command.
-  """
-  cmd = [_aapt_path.read()] + args
-  status, output = cmd_helper.GetCmdStatusAndOutput(cmd)
-  if status != 0:
-    raise Exception('Failed running aapt command: "%s" with output "%s".' %
-                    (' '.join(cmd), output))
-  return output
-
-
-def Dump(what, apk, assets=None):
-  """Returns the output of the aapt dump command.
-
-  Args:
-    what: What you want to dump.
-    apk: Path to apk you want to dump information for.
-    assets: List of assets in apk you want to dump information for.
-  """
-  assets = assets or []
-  if isinstance(assets, basestring):
-    assets = [assets]
-  return _RunAaptCmd(['dump', what, apk] + assets).splitlines()
diff --git a/third_party/catapult/devil/devil/android/sdk/adb_compatibility_devicetest.py b/third_party/catapult/devil/devil/android/sdk/adb_compatibility_devicetest.py
deleted file mode 100644
index cbe2a1b..0000000
--- a/third_party/catapult/devil/devil/android/sdk/adb_compatibility_devicetest.py
+++ /dev/null
@@ -1,230 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import contextlib
-import os
-import posixpath
-import random
-import signal
-import sys
-import unittest
-
-_CATAPULT_BASE_DIR = os.path.abspath(os.path.join(
-    os.path.dirname(__file__), '..', '..', '..', '..'))
-
-sys.path.append(os.path.join(_CATAPULT_BASE_DIR, 'devil'))
-from devil import devil_env
-from devil.android import device_errors
-from devil.android import device_test_case
-from devil.android.sdk import adb_wrapper
-from devil.utils import cmd_helper
-from devil.utils import timeout_retry
-
-
-_TEST_DATA_DIR = os.path.abspath(os.path.join(
-    os.path.dirname(__file__), 'test', 'data'))
-
-
-def _hostAdbPids():
-  ps_status, ps_output = cmd_helper.GetCmdStatusAndOutput(
-      ['pgrep', '-l', 'adb'])
-  if ps_status != 0:
-    return []
-
-  pids_and_names = (line.split() for line in ps_output.splitlines())
-  return [int(pid) for pid, name in pids_and_names
-          if name == 'adb']
-
-
-class AdbCompatibilityTest(device_test_case.DeviceTestCase):
-
-  @classmethod
-  def setUpClass(cls):
-    custom_adb_path = os.environ.get('ADB_PATH')
-    custom_deps = {
-      'config_type': 'BaseConfig',
-      'dependencies': {},
-    }
-    if custom_adb_path:
-      custom_deps['dependencies']['adb'] = {
-        'file_info': {
-          devil_env.GetPlatform(): {
-            'local_paths': [custom_adb_path],
-          },
-        },
-      }
-    devil_env.config.Initialize(configs=[custom_deps])
-
-  def testStartServer(self):
-    # Manually kill off any instances of adb.
-    adb_pids = _hostAdbPids()
-    for p in adb_pids:
-      os.kill(p, signal.SIGKILL)
-
-    self.assertIsNotNone(
-        timeout_retry.WaitFor(
-            lambda: not _hostAdbPids(), wait_period=0.1, max_tries=10))
-
-    # start the adb server
-    start_server_status, _ = cmd_helper.GetCmdStatusAndOutput(
-        [adb_wrapper.AdbWrapper.GetAdbPath(), 'start-server'])
-
-    # verify that the server is now online
-    self.assertEquals(0, start_server_status)
-    self.assertIsNotNone(
-        timeout_retry.WaitFor(
-            lambda: bool(_hostAdbPids()), wait_period=0.1, max_tries=10))
-
-  def testKillServer(self):
-    adb_pids = _hostAdbPids()
-    if not adb_pids:
-      adb_wrapper.AdbWrapper.StartServer()
-
-    adb_pids = _hostAdbPids()
-    self.assertGreaterEqual(len(adb_pids), 1)
-
-    kill_server_status, _ = cmd_helper.GetCmdStatusAndOutput(
-        [adb_wrapper.AdbWrapper.GetAdbPath(), 'kill-server'])
-    self.assertEqual(0, kill_server_status)
-
-    adb_pids = _hostAdbPids()
-    self.assertEqual(0, len(adb_pids))
-
-  def testDevices(self):
-    devices = adb_wrapper.AdbWrapper.Devices()
-    self.assertNotEqual(0, len(devices), 'No devices found.')
-
-  def getTestInstance(self):
-    """Creates a real AdbWrapper instance for testing."""
-    return adb_wrapper.AdbWrapper(self.serial)
-
-  def testShell(self):
-    under_test = self.getTestInstance()
-    shell_ls_result = under_test.Shell('ls')
-    self.assertIsInstance(shell_ls_result, str)
-    self.assertTrue(bool(shell_ls_result))
-
-  def testShell_failed(self):
-    under_test = self.getTestInstance()
-    with self.assertRaises(device_errors.AdbShellCommandFailedError):
-      under_test.Shell('ls /foo/bar/baz')
-
-  def testShell_externalStorageDefined(self):
-    under_test = self.getTestInstance()
-    external_storage = under_test.Shell('echo $EXTERNAL_STORAGE')
-    self.assertIsInstance(external_storage, str)
-    self.assertTrue(posixpath.isabs(external_storage))
-
-  @contextlib.contextmanager
-  def getTestPushDestination(self, under_test):
-    """Creates a temporary directory suitable for pushing to."""
-    external_storage = under_test.Shell('echo $EXTERNAL_STORAGE').strip()
-    if not external_storage:
-      self.skipTest('External storage not available.')
-    while True:
-      random_hex = hex(random.randint(0, 2 ** 52))[2:]
-      name = 'tmp_push_test%s' % random_hex
-      path = posixpath.join(external_storage, name)
-      try:
-        under_test.Shell('ls %s' % path)
-      except device_errors.AdbShellCommandFailedError:
-        break
-    under_test.Shell('mkdir %s' % path)
-    try:
-      yield path
-    finally:
-      under_test.Shell('rm -rf %s' % path)
-
-  def testPush_fileToFile(self):
-    under_test = self.getTestInstance()
-    with self.getTestPushDestination(under_test) as push_target_directory:
-      src = os.path.join(_TEST_DATA_DIR, 'push_file.txt')
-      dest = posixpath.join(push_target_directory, 'push_file.txt')
-      with self.assertRaises(device_errors.AdbShellCommandFailedError):
-        under_test.Shell('ls %s' % dest)
-      under_test.Push(src, dest)
-      self.assertEquals(dest, under_test.Shell('ls %s' % dest).strip())
-
-  def testPush_fileToDirectory(self):
-    under_test = self.getTestInstance()
-    with self.getTestPushDestination(under_test) as push_target_directory:
-      src = os.path.join(_TEST_DATA_DIR, 'push_file.txt')
-      dest = push_target_directory
-      resulting_file = posixpath.join(dest, 'push_file.txt')
-      with self.assertRaises(device_errors.AdbShellCommandFailedError):
-        under_test.Shell('ls %s' % resulting_file)
-      under_test.Push(src, dest)
-      self.assertEquals(
-          resulting_file,
-          under_test.Shell('ls %s' % resulting_file).strip())
-
-  def testPush_directoryToDirectory(self):
-    under_test = self.getTestInstance()
-    with self.getTestPushDestination(under_test) as push_target_directory:
-      src = os.path.join(_TEST_DATA_DIR, 'push_directory')
-      dest = posixpath.join(push_target_directory, 'push_directory')
-      with self.assertRaises(device_errors.AdbShellCommandFailedError):
-        under_test.Shell('ls %s' % dest)
-      under_test.Push(src, dest)
-      self.assertEquals(
-          sorted(os.listdir(src)),
-          sorted(under_test.Shell('ls %s' % dest).strip().split()))
-
-  def testPush_directoryToExistingDirectory(self):
-    under_test = self.getTestInstance()
-    with self.getTestPushDestination(under_test) as push_target_directory:
-      src = os.path.join(_TEST_DATA_DIR, 'push_directory')
-      dest = push_target_directory
-      resulting_directory = posixpath.join(dest, 'push_directory')
-      with self.assertRaises(device_errors.AdbShellCommandFailedError):
-        under_test.Shell('ls %s' % resulting_directory)
-      under_test.Shell('mkdir %s' % resulting_directory)
-      under_test.Push(src, dest)
-      self.assertEquals(
-          sorted(os.listdir(src)),
-          sorted(under_test.Shell('ls %s' % resulting_directory).split()))
-
-  # TODO(jbudorick): Implement tests for the following:
-  # taskset -c
-  # devices [-l]
-  # pull
-  # shell
-  # ls
-  # logcat [-c] [-d] [-v] [-b]
-  # forward [--remove] [--list]
-  # jdwp
-  # install [-l] [-r] [-s] [-d]
-  # install-multiple [-l] [-r] [-s] [-d] [-p]
-  # uninstall [-k]
-  # backup -f [-apk] [-shared] [-nosystem] [-all]
-  # restore
-  # wait-for-device
-  # get-state (BROKEN IN THE M SDK)
-  # get-devpath
-  # remount
-  # reboot
-  # reboot-bootloader
-  # root
-  # emu
-
-  @classmethod
-  def tearDownClass(cls):
-    print
-    print
-    print 'tested %s' % adb_wrapper.AdbWrapper.GetAdbPath()
-    print '  %s' % adb_wrapper.AdbWrapper.Version()
-    print 'connected devices:'
-    try:
-      for d in adb_wrapper.AdbWrapper.Devices():
-        print '  %s' % d
-    except device_errors.AdbCommandFailedError:
-      print '  <failed to list devices>'
-      raise
-    finally:
-      print
-
-
-if __name__ == '__main__':
-  sys.exit(unittest.main())
diff --git a/third_party/catapult/devil/devil/android/sdk/adb_wrapper.py b/third_party/catapult/devil/devil/android/sdk/adb_wrapper.py
deleted file mode 100644
index 7f6b8d9..0000000
--- a/third_party/catapult/devil/devil/android/sdk/adb_wrapper.py
+++ /dev/null
@@ -1,917 +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.
-
-"""This module wraps Android's adb tool.
-
-This is a thin wrapper around the adb interface. Any additional complexity
-should be delegated to a higher level (ex. DeviceUtils).
-"""
-
-import collections
-import distutils.version
-import errno
-import logging
-import os
-import posixpath
-import re
-import subprocess
-
-from devil import devil_env
-from devil.android import decorators
-from devil.android import device_errors
-from devil.utils import cmd_helper
-from devil.utils import lazy
-from devil.utils import timeout_retry
-
-with devil_env.SysPath(devil_env.DEPENDENCY_MANAGER_PATH):
-  import dependency_manager  # pylint: disable=import-error
-
-logger = logging.getLogger(__name__)
-
-
-ADB_KEYS_FILE = '/data/misc/adb/adb_keys'
-
-DEFAULT_TIMEOUT = 30
-DEFAULT_RETRIES = 2
-
-_ADB_VERSION_RE = re.compile(r'Android Debug Bridge version (\d+\.\d+\.\d+)')
-_EMULATOR_RE = re.compile(r'^emulator-[0-9]+$')
-_READY_STATE = 'device'
-_VERITY_DISABLE_RE = re.compile(r'Verity (already )?disabled')
-_VERITY_ENABLE_RE = re.compile(r'Verity (already )?enabled')
-
-
-def VerifyLocalFileExists(path):
-  """Verifies a local file exists.
-
-  Args:
-    path: Path to the local file.
-
-  Raises:
-    IOError: If the file doesn't exist.
-  """
-  if not os.path.exists(path):
-    raise IOError(errno.ENOENT, os.strerror(errno.ENOENT), path)
-
-
-def _FindAdb():
-  try:
-    return devil_env.config.LocalPath('adb')
-  except dependency_manager.NoPathFoundError:
-    pass
-
-  try:
-    return os.path.join(devil_env.config.LocalPath('android_sdk'),
-                        'platform-tools', 'adb')
-  except dependency_manager.NoPathFoundError:
-    pass
-
-  try:
-    return devil_env.config.FetchPath('adb')
-  except dependency_manager.NoPathFoundError:
-    raise device_errors.NoAdbError()
-
-
-def _GetVersion():
-  # pylint: disable=protected-access
-  raw_version = AdbWrapper._RunAdbCmd(['version'], timeout=2, retries=0)
-  for l in raw_version.splitlines():
-    m = _ADB_VERSION_RE.search(l)
-    if m:
-      return m.group(1)
-  return None
-
-
-def _ShouldRetryAdbCmd(exc):
-  return not isinstance(exc, device_errors.NoAdbError)
-
-
-DeviceStat = collections.namedtuple('DeviceStat',
-                                    ['st_mode', 'st_size', 'st_time'])
-
-
-def _IsExtraneousLine(line, send_cmd):
-  """Determine if a line read from stdout in persistent shell is extraneous.
-
-  The results output to stdout by the persistent shell process
-  (in PersistentShell below) often include "extraneous" lines that are
-  not part of the output of the shell command. These "extraneous" lines
-  do not always appear and are of two forms: shell prompt lines and lines
-  that just duplicate what the input command was. This function
-  detects these extraneous lines. Since all these lines have the
-  original command in them, that is what it detects ror.
-
-  Args:
-      line: Output line to check.
-      send_cmd: Command that was sent to adb persistent shell.
-  """
-  return send_cmd.rstrip() in line
-
-
-class AdbWrapper(object):
-  """A wrapper around a local Android Debug Bridge executable."""
-
-  _adb_path = lazy.WeakConstant(_FindAdb)
-  _adb_version = lazy.WeakConstant(_GetVersion)
-
-  def __init__(self, device_serial):
-    """Initializes the AdbWrapper.
-
-    Args:
-      device_serial: The device serial number as a string.
-    """
-    if not device_serial:
-      raise ValueError('A device serial must be specified')
-    self._device_serial = str(device_serial)
-
-  class PersistentShell(object):
-    '''Class to use persistent shell for ADB.
-
-    This class allows a persistent ADB shell to be created, where multiple
-    commands can be passed into it. This avoids the overhead of starting
-    up a new ADB shell for each command.
-
-    Example of use:
-    with PersistentShell('123456789') as pshell:
-        pshell.RunCommand('which ls')
-        pshell.RunCommandAndClose('echo TEST')
-    '''
-    def __init__(self, serial):
-      """Initialization function:
-
-      Args:
-        serial: Serial number of device.
-      """
-      self._cmd = [AdbWrapper.GetAdbPath(), '-s', serial, 'shell']
-      self._process = None
-
-    def __enter__(self):
-      self.Start()
-      self.WaitForReady()
-      return self
-
-    def __exit__(self, exc_type, exc_value, tb):
-      self.Stop()
-
-    def Start(self):
-      """Start the shell."""
-      if self._process is not None:
-        raise RuntimeError('Persistent shell already running.')
-      self._process = subprocess.Popen(self._cmd,
-                                       stdin=subprocess.PIPE,
-                                       stdout=subprocess.PIPE,
-                                       shell=False)
-
-    def WaitForReady(self):
-      """Wait for the shell to be ready after starting.
-
-      Sends an echo command, then waits until it gets a response.
-      """
-      self._process.stdin.write('echo\n')
-      output_line = self._process.stdout.readline()
-      while output_line.rstrip() != '':
-        output_line = self._process.stdout.readline()
-
-    def RunCommand(self, command, close=False):
-      """Runs an ADB command and returns the output.
-
-      Note that there can be approximately 40 ms of additional latency
-      between sending the command and receiving the results if close=False
-      due to the use of Nagle's algorithm in the TCP socket between the
-      adb server and client. To avoid this extra latency, set close=True.
-
-      Args:
-        command: Command to send.
-      Returns:
-        The command output, given as a list of lines, and the exit code
-      """
-
-      if close:
-        def run_cmd(cmd):
-          send_cmd = '( %s ); echo $?; exit;\n' % cmd.rstrip()
-          (output, _) = self._process.communicate(send_cmd)
-          self._process = None
-          for x in output.splitlines():
-            yield x
-
-      else:
-        def run_cmd(cmd):
-          send_cmd = '( %s ); echo DONE:$?;\n' % cmd.rstrip()
-          self._process.stdin.write(send_cmd)
-          while True:
-            output_line = self._process.stdout.readline().rstrip()
-            if output_line[:5] == 'DONE:':
-              yield output_line[5:]
-              break
-            yield output_line
-
-      result = [line for line in run_cmd(command)
-                if not _IsExtraneousLine(line, command)]
-
-      return (result[:-1], int(result[-1]))
-
-    def Stop(self):
-      """Stops the ADB process if it is still running."""
-      if self._process is not None:
-        self._process.stdin.write('exit\n')
-        self._process = None
-
-  @classmethod
-  def GetAdbPath(cls):
-    return cls._adb_path.read()
-
-  @classmethod
-  def Version(cls):
-    return cls._adb_version.read()
-
-  @classmethod
-  def _BuildAdbCmd(cls, args, device_serial, cpu_affinity=None):
-    if cpu_affinity is not None:
-      cmd = ['taskset', '-c', str(cpu_affinity)]
-    else:
-      cmd = []
-    cmd.append(cls.GetAdbPath())
-    if device_serial is not None:
-      cmd.extend(['-s', device_serial])
-    cmd.extend(args)
-    return cmd
-
-  # pylint: disable=unused-argument
-  @classmethod
-  @decorators.WithTimeoutAndConditionalRetries(_ShouldRetryAdbCmd)
-  def _RunAdbCmd(cls, args, timeout=None, retries=None, device_serial=None,
-                 check_error=True, cpu_affinity=None):
-    # pylint: disable=no-member
-    try:
-      status, output = cmd_helper.GetCmdStatusAndOutputWithTimeout(
-          cls._BuildAdbCmd(args, device_serial, cpu_affinity=cpu_affinity),
-          timeout_retry.CurrentTimeoutThreadGroup().GetRemainingTime())
-    except OSError as e:
-      if e.errno in (errno.ENOENT, errno.ENOEXEC):
-        raise device_errors.NoAdbError(msg=str(e))
-      else:
-        raise
-
-    if status != 0:
-      raise device_errors.AdbCommandFailedError(
-          args, output, status, device_serial)
-    # This catches some errors, including when the device drops offline;
-    # unfortunately adb is very inconsistent with error reporting so many
-    # command failures present differently.
-    if check_error and output.startswith('error:'):
-      raise device_errors.AdbCommandFailedError(args, output)
-    return output
-  # pylint: enable=unused-argument
-
-  def _RunDeviceAdbCmd(self, args, timeout, retries, check_error=True):
-    """Runs an adb command on the device associated with this object.
-
-    Args:
-      args: A list of arguments to adb.
-      timeout: Timeout in seconds.
-      retries: Number of retries.
-      check_error: Check that the command doesn't return an error message. This
-        does NOT check the exit status of shell commands.
-
-    Returns:
-      The output of the command.
-    """
-    return self._RunAdbCmd(args, timeout=timeout, retries=retries,
-                           device_serial=self._device_serial,
-                           check_error=check_error)
-
-  def _IterRunDeviceAdbCmd(self, args, iter_timeout, timeout):
-    """Runs an adb command and returns an iterator over its output lines.
-
-    Args:
-      args: A list of arguments to adb.
-      iter_timeout: Timeout for each iteration in seconds.
-      timeout: Timeout for the entire command in seconds.
-
-    Yields:
-      The output of the command line by line.
-    """
-    return cmd_helper.IterCmdOutputLines(
-        self._BuildAdbCmd(args, self._device_serial),
-        iter_timeout=iter_timeout,
-        timeout=timeout)
-
-  def __eq__(self, other):
-    """Consider instances equal if they refer to the same device.
-
-    Args:
-      other: The instance to compare equality with.
-
-    Returns:
-      True if the instances are considered equal, false otherwise.
-    """
-    return self._device_serial == str(other)
-
-  def __str__(self):
-    """The string representation of an instance.
-
-    Returns:
-      The device serial number as a string.
-    """
-    return self._device_serial
-
-  def __repr__(self):
-    return '%s(\'%s\')' % (self.__class__.__name__, self)
-
-  # pylint: disable=unused-argument
-  @classmethod
-  def IsServerOnline(cls):
-    status, output = cmd_helper.GetCmdStatusAndOutput(['pgrep', 'adb'])
-    output = [int(x) for x in output.split()]
-    logger.info('PIDs for adb found: %r', output)
-    return status == 0
-  # pylint: enable=unused-argument
-
-  @classmethod
-  def KillServer(cls, timeout=DEFAULT_TIMEOUT, retries=DEFAULT_RETRIES):
-    cls._RunAdbCmd(['kill-server'], timeout=timeout, retries=retries)
-
-  @classmethod
-  def StartServer(cls, timeout=DEFAULT_TIMEOUT, retries=DEFAULT_RETRIES):
-    # CPU affinity is used to reduce adb instability http://crbug.com/268450
-    cls._RunAdbCmd(['start-server'], timeout=timeout, retries=retries,
-                   cpu_affinity=0)
-
-  @classmethod
-  def GetDevices(cls, timeout=DEFAULT_TIMEOUT, retries=DEFAULT_RETRIES):
-    """DEPRECATED. Refer to Devices(...) below."""
-    # TODO(jbudorick): Remove this function once no more clients are using it.
-    return cls.Devices(timeout=timeout, retries=retries)
-
-  @classmethod
-  def Devices(cls, desired_state=_READY_STATE, long_list=False,
-              timeout=DEFAULT_TIMEOUT, retries=DEFAULT_RETRIES):
-    """Get the list of active attached devices.
-
-    Args:
-      desired_state: If not None, limit the devices returned to only those
-        in the given state.
-      long_list: Whether to use the long listing format.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-
-    Yields:
-      AdbWrapper instances.
-    """
-    lines = cls._RawDevices(long_list=long_list, timeout=timeout,
-                            retries=retries)
-    if long_list:
-      return [
-        [AdbWrapper(line[0])] + line[1:]
-        for line in lines
-        if (len(line) >= 2 and (not desired_state or line[1] == desired_state))
-      ]
-    else:
-      return [
-        AdbWrapper(line[0])
-        for line in lines
-        if (len(line) == 2 and (not desired_state or line[1] == desired_state))
-      ]
-
-  @classmethod
-  def _RawDevices(cls, long_list=False, timeout=DEFAULT_TIMEOUT,
-                  retries=DEFAULT_RETRIES):
-    cmd = ['devices']
-    if long_list:
-      cmd.append('-l')
-    output = cls._RunAdbCmd(cmd, timeout=timeout, retries=retries)
-    return [line.split() for line in output.splitlines()[1:]]
-
-  def GetDeviceSerial(self):
-    """Gets the device serial number associated with this object.
-
-    Returns:
-      Device serial number as a string.
-    """
-    return self._device_serial
-
-  def Push(self, local, remote, timeout=60 * 5, retries=DEFAULT_RETRIES):
-    """Pushes a file from the host to the device.
-
-    Args:
-      local: Path on the host filesystem.
-      remote: Path on the device filesystem.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-    """
-    VerifyLocalFileExists(local)
-
-    if (distutils.version.LooseVersion(self.Version()) <
-        distutils.version.LooseVersion('1.0.36')):
-
-      # Different versions of adb handle pushing a directory to an existing
-      # directory differently.
-
-      # In the version packaged with the M SDK, 1.0.32, the following push:
-      #   foo/bar -> /sdcard/foo/bar
-      # where bar is an existing directory both on the host and the device
-      # results in the contents of bar/ on the host being pushed to bar/ on
-      # the device, i.e.
-      #   foo/bar/A -> /sdcard/foo/bar/A
-      #   foo/bar/B -> /sdcard/foo/bar/B
-      #   ... etc.
-
-      # In the version packaged with the N SDK, 1.0.36, the same push under
-      # the same conditions results in a second bar/ directory being created
-      # underneath the first bar/ directory on the device, i.e.
-      #   foo/bar/A -> /sdcard/foo/bar/bar/A
-      #   foo/bar/B -> /sdcard/foo/bar/bar/B
-      #   ... etc.
-
-      # In order to provide a consistent interface to clients, we check whether
-      # the target is an existing directory on the device and, if so, modifies
-      # the target passed to adb to emulate the behavior on 1.0.36 and above.
-
-      # Note that this behavior may have started before 1.0.36; that's simply
-      # the earliest version we've confirmed thus far.
-
-      try:
-        self.Shell('test -d %s' % remote, timeout=timeout, retries=retries)
-        remote = posixpath.join(remote, posixpath.basename(local))
-      except device_errors.AdbShellCommandFailedError:
-        # The target directory doesn't exist on the device, so we can use it
-        # without modification.
-        pass
-
-    self._RunDeviceAdbCmd(['push', local, remote], timeout, retries)
-
-  def Pull(self, remote, local, timeout=60 * 5, retries=DEFAULT_RETRIES):
-    """Pulls a file from the device to the host.
-
-    Args:
-      remote: Path on the device filesystem.
-      local: Path on the host filesystem.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-    """
-    cmd = ['pull', remote, local]
-    self._RunDeviceAdbCmd(cmd, timeout, retries)
-    try:
-      VerifyLocalFileExists(local)
-    except IOError:
-      raise device_errors.AdbCommandFailedError(
-          cmd,
-          'File pulled from the device did not arrive on the host: %s' % local,
-          device_serial=str(self))
-
-  def Shell(self, command, expect_status=0, timeout=DEFAULT_TIMEOUT,
-            retries=DEFAULT_RETRIES):
-    """Runs a shell command on the device.
-
-    Args:
-      command: A string with the shell command to run.
-      expect_status: (optional) Check that the command's exit status matches
-        this value. Default is 0. If set to None the test is skipped.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-
-    Returns:
-      The output of the shell command as a string.
-
-    Raises:
-      device_errors.AdbCommandFailedError: If the exit status doesn't match
-        |expect_status|.
-    """
-    if expect_status is None:
-      args = ['shell', command]
-    else:
-      args = ['shell', '( %s );echo %%$?' % command.rstrip()]
-    output = self._RunDeviceAdbCmd(args, timeout, retries, check_error=False)
-    if expect_status is not None:
-      output_end = output.rfind('%')
-      if output_end < 0:
-        # causes the status string to become empty and raise a ValueError
-        output_end = len(output)
-
-      try:
-        status = int(output[output_end + 1:])
-      except ValueError:
-        logger.warning('exit status of shell command %r missing.', command)
-        raise device_errors.AdbShellCommandFailedError(
-            command, output, status=None, device_serial=self._device_serial)
-      output = output[:output_end]
-      if status != expect_status:
-        raise device_errors.AdbShellCommandFailedError(
-            command, output, status=status, device_serial=self._device_serial)
-    return output
-
-  def IterShell(self, command, timeout):
-    """Runs a shell command and returns an iterator over its output lines.
-
-    Args:
-      command: A string with the shell command to run.
-      timeout: Timeout in seconds.
-
-    Yields:
-      The output of the command line by line.
-    """
-    args = ['shell', command]
-    return cmd_helper.IterCmdOutputLines(
-      self._BuildAdbCmd(args, self._device_serial), timeout=timeout)
-
-  def Ls(self, path, timeout=DEFAULT_TIMEOUT, retries=DEFAULT_RETRIES):
-    """List the contents of a directory on the device.
-
-    Args:
-      path: Path on the device filesystem.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-
-    Returns:
-      A list of pairs (filename, stat) for each file found in the directory,
-      where the stat object has the properties: st_mode, st_size, and st_time.
-
-    Raises:
-      AdbCommandFailedError if |path| does not specify a valid and accessible
-          directory in the device, or the output of "adb ls" command is less
-          than four columns
-    """
-    def ParseLine(line, cmd):
-      cols = line.split(None, 3)
-      if len(cols) < 4:
-        raise device_errors.AdbCommandFailedError(
-            cmd, line, "the output should be 4 columns, but is only %d columns"
-            % len(cols), device_serial=self._device_serial)
-      filename = cols.pop()
-      stat = DeviceStat(*[int(num, base=16) for num in cols])
-      return (filename, stat)
-
-    cmd = ['ls', path]
-    lines = self._RunDeviceAdbCmd(
-        cmd, timeout=timeout, retries=retries).splitlines()
-    if lines:
-      return [ParseLine(line, cmd) for line in lines]
-    else:
-      raise device_errors.AdbCommandFailedError(
-          cmd, 'path does not specify an accessible directory in the device',
-          device_serial=self._device_serial)
-
-  def Logcat(self, clear=False, dump=False, filter_specs=None,
-             logcat_format=None, ring_buffer=None, iter_timeout=None,
-             timeout=None, retries=DEFAULT_RETRIES):
-    """Get an iterable over the logcat output.
-
-    Args:
-      clear: If true, clear the logcat.
-      dump: If true, dump the current logcat contents.
-      filter_specs: If set, a list of specs to filter the logcat.
-      logcat_format: If set, the format in which the logcat should be output.
-        Options include "brief", "process", "tag", "thread", "raw", "time",
-        "threadtime", and "long"
-      ring_buffer: If set, a list of alternate ring buffers to request.
-        Options include "main", "system", "radio", "events", "crash" or "all".
-        The default is equivalent to ["main", "system", "crash"].
-      iter_timeout: If set and neither clear nor dump is set, the number of
-        seconds to wait between iterations. If no line is found before the
-        given number of seconds elapses, the iterable will yield None.
-      timeout: (optional) If set, timeout per try in seconds. If clear or dump
-        is set, defaults to DEFAULT_TIMEOUT.
-      retries: (optional) If clear or dump is set, the number of retries to
-        attempt. Otherwise, does nothing.
-
-    Yields:
-      logcat output line by line.
-    """
-    cmd = ['logcat']
-    use_iter = True
-    if clear:
-      cmd.append('-c')
-      use_iter = False
-    if dump:
-      cmd.append('-d')
-      use_iter = False
-    if logcat_format:
-      cmd.extend(['-v', logcat_format])
-    if ring_buffer:
-      for buffer_name in ring_buffer:
-        cmd.extend(['-b', buffer_name])
-    if filter_specs:
-      cmd.extend(filter_specs)
-
-    if use_iter:
-      return self._IterRunDeviceAdbCmd(cmd, iter_timeout, timeout)
-    else:
-      timeout = timeout if timeout is not None else DEFAULT_TIMEOUT
-      return self._RunDeviceAdbCmd(cmd, timeout, retries).splitlines()
-
-  def Forward(self, local, remote, allow_rebind=False,
-              timeout=DEFAULT_TIMEOUT, retries=DEFAULT_RETRIES):
-    """Forward socket connections from the local socket to the remote socket.
-
-    Sockets are specified by one of:
-      tcp:<port>
-      localabstract:<unix domain socket name>
-      localreserved:<unix domain socket name>
-      localfilesystem:<unix domain socket name>
-      dev:<character device name>
-      jdwp:<process pid> (remote only)
-
-    Args:
-      local: The host socket.
-      remote: The device socket.
-      allow_rebind: A boolean indicating whether adb may rebind a local socket;
-        otherwise, the default, an exception is raised if the local socket is
-        already being forwarded.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-    """
-    cmd = ['forward']
-    if not allow_rebind:
-      cmd.append('--no-rebind')
-    cmd.extend([str(local), str(remote)])
-    self._RunDeviceAdbCmd(cmd, timeout, retries)
-
-  def ForwardRemove(self, local, timeout=DEFAULT_TIMEOUT,
-                    retries=DEFAULT_RETRIES):
-    """Remove a forward socket connection.
-
-    Args:
-      local: The host socket.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-    """
-    self._RunDeviceAdbCmd(['forward', '--remove', str(local)], timeout,
-                          retries)
-
-  def ForwardList(self, timeout=DEFAULT_TIMEOUT, retries=DEFAULT_RETRIES):
-    """List all currently forwarded socket connections.
-
-    Args:
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-    Returns:
-      The output of adb forward --list as a string.
-    """
-    if (distutils.version.LooseVersion(self.Version()) >=
-        distutils.version.LooseVersion('1.0.36')):
-      # Starting in 1.0.36, this can occasionally fail with a protocol fault.
-      # As this interrupts all connections with all devices, we instead just
-      # return an empty list. This may give clients an inaccurate result, but
-      # that's usually better than crashing the adb server.
-
-      # TODO(jbudorick): Determine an appropriate upper version bound for this
-      # once b/31811775 is fixed.
-      return ''
-
-    return self._RunDeviceAdbCmd(['forward', '--list'], timeout, retries)
-
-  def JDWP(self, timeout=DEFAULT_TIMEOUT, retries=DEFAULT_RETRIES):
-    """List of PIDs of processes hosting a JDWP transport.
-
-    Args:
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-
-    Returns:
-      A list of PIDs as strings.
-    """
-    return [a.strip() for a in
-            self._RunDeviceAdbCmd(['jdwp'], timeout, retries).split('\n')]
-
-  def Install(self, apk_path, forward_lock=False, allow_downgrade=False,
-              reinstall=False, sd_card=False, timeout=60 * 2,
-              retries=DEFAULT_RETRIES):
-    """Install an apk on the device.
-
-    Args:
-      apk_path: Host path to the APK file.
-      forward_lock: (optional) If set forward-locks the app.
-      allow_downgrade: (optional) If set, allows for downgrades.
-      reinstall: (optional) If set reinstalls the app, keeping its data.
-      sd_card: (optional) If set installs on the SD card.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-    """
-    VerifyLocalFileExists(apk_path)
-    cmd = ['install']
-    if forward_lock:
-      cmd.append('-l')
-    if reinstall:
-      cmd.append('-r')
-    if sd_card:
-      cmd.append('-s')
-    if allow_downgrade:
-      cmd.append('-d')
-    cmd.append(apk_path)
-    output = self._RunDeviceAdbCmd(cmd, timeout, retries)
-    if 'Success' not in output:
-      raise device_errors.AdbCommandFailedError(
-          cmd, output, device_serial=self._device_serial)
-
-  def InstallMultiple(self, apk_paths, forward_lock=False, reinstall=False,
-                      sd_card=False, allow_downgrade=False, partial=False,
-                      timeout=60 * 2, retries=DEFAULT_RETRIES):
-    """Install an apk with splits on the device.
-
-    Args:
-      apk_paths: Host path to the APK file.
-      forward_lock: (optional) If set forward-locks the app.
-      reinstall: (optional) If set reinstalls the app, keeping its data.
-      sd_card: (optional) If set installs on the SD card.
-      allow_downgrade: (optional) Allow versionCode downgrade.
-      partial: (optional) Package ID if apk_paths doesn't include all .apks.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-    """
-    for path in apk_paths:
-      VerifyLocalFileExists(path)
-    cmd = ['install-multiple']
-    if forward_lock:
-      cmd.append('-l')
-    if reinstall:
-      cmd.append('-r')
-    if sd_card:
-      cmd.append('-s')
-    if allow_downgrade:
-      cmd.append('-d')
-    if partial:
-      cmd.extend(('-p', partial))
-    cmd.extend(apk_paths)
-    output = self._RunDeviceAdbCmd(cmd, timeout, retries)
-    if 'Success' not in output:
-      raise device_errors.AdbCommandFailedError(
-          cmd, output, device_serial=self._device_serial)
-
-  def Uninstall(self, package, keep_data=False, timeout=DEFAULT_TIMEOUT,
-                retries=DEFAULT_RETRIES):
-    """Remove the app |package| from the device.
-
-    Args:
-      package: The package to uninstall.
-      keep_data: (optional) If set keep the data and cache directories.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-    """
-    cmd = ['uninstall']
-    if keep_data:
-      cmd.append('-k')
-    cmd.append(package)
-    output = self._RunDeviceAdbCmd(cmd, timeout, retries)
-    if 'Failure' in output or 'Exception' in output:
-      raise device_errors.AdbCommandFailedError(
-          cmd, output, device_serial=self._device_serial)
-
-  def Backup(self, path, packages=None, apk=False, shared=False,
-             nosystem=True, include_all=False, timeout=DEFAULT_TIMEOUT,
-             retries=DEFAULT_RETRIES):
-    """Write an archive of the device's data to |path|.
-
-    Args:
-      path: Local path to store the backup file.
-      packages: List of to packages to be backed up.
-      apk: (optional) If set include the .apk files in the archive.
-      shared: (optional) If set buckup the device's SD card.
-      nosystem: (optional) If set exclude system applications.
-      include_all: (optional) If set back up all installed applications and
-        |packages| is optional.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-    """
-    cmd = ['backup', '-f', path]
-    if apk:
-      cmd.append('-apk')
-    if shared:
-      cmd.append('-shared')
-    if nosystem:
-      cmd.append('-nosystem')
-    if include_all:
-      cmd.append('-all')
-    if packages:
-      cmd.extend(packages)
-    assert bool(packages) ^ bool(include_all), (
-        'Provide \'packages\' or set \'include_all\' but not both.')
-    ret = self._RunDeviceAdbCmd(cmd, timeout, retries)
-    VerifyLocalFileExists(path)
-    return ret
-
-  def Restore(self, path, timeout=DEFAULT_TIMEOUT, retries=DEFAULT_RETRIES):
-    """Restore device contents from the backup archive.
-
-    Args:
-      path: Host path to the backup archive.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-    """
-    VerifyLocalFileExists(path)
-    self._RunDeviceAdbCmd(['restore'] + [path], timeout, retries)
-
-  def WaitForDevice(self, timeout=60 * 5, retries=DEFAULT_RETRIES):
-    """Block until the device is online.
-
-    Args:
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-    """
-    self._RunDeviceAdbCmd(['wait-for-device'], timeout, retries)
-
-  def GetState(self, timeout=DEFAULT_TIMEOUT, retries=DEFAULT_RETRIES):
-    """Get device state.
-
-    Args:
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-
-    Returns:
-      One of 'offline', 'bootloader', or 'device'.
-    """
-    # TODO(jbudorick): Revert to using get-state once it doesn't cause a
-    # a protocol fault.
-    # return self._RunDeviceAdbCmd(['get-state'], timeout, retries).strip()
-
-    lines = self._RawDevices(timeout=timeout, retries=retries)
-    for line in lines:
-      if len(line) >= 2 and line[0] == self._device_serial:
-        return line[1]
-    return 'offline'
-
-  def GetDevPath(self, timeout=DEFAULT_TIMEOUT, retries=DEFAULT_RETRIES):
-    """Gets the device path.
-
-    Args:
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-
-    Returns:
-      The device path (e.g. usb:3-4)
-    """
-    return self._RunDeviceAdbCmd(['get-devpath'], timeout, retries)
-
-  def Remount(self, timeout=DEFAULT_TIMEOUT, retries=DEFAULT_RETRIES):
-    """Remounts the /system partition on the device read-write."""
-    self._RunDeviceAdbCmd(['remount'], timeout, retries)
-
-  def Reboot(self, to_bootloader=False, timeout=60 * 5,
-             retries=DEFAULT_RETRIES):
-    """Reboots the device.
-
-    Args:
-      to_bootloader: (optional) If set reboots to the bootloader.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-    """
-    if to_bootloader:
-      cmd = ['reboot-bootloader']
-    else:
-      cmd = ['reboot']
-    self._RunDeviceAdbCmd(cmd, timeout, retries)
-
-  def Root(self, timeout=DEFAULT_TIMEOUT, retries=DEFAULT_RETRIES):
-    """Restarts the adbd daemon with root permissions, if possible.
-
-    Args:
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-    """
-    output = self._RunDeviceAdbCmd(['root'], timeout, retries)
-    if 'cannot' in output:
-      raise device_errors.AdbCommandFailedError(
-          ['root'], output, device_serial=self._device_serial)
-
-  def Emu(self, cmd, timeout=DEFAULT_TIMEOUT,
-               retries=DEFAULT_RETRIES):
-    """Runs an emulator console command.
-
-    See http://developer.android.com/tools/devices/emulator.html#console
-
-    Args:
-      cmd: The command to run on the emulator console.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-
-    Returns:
-      The output of the emulator console command.
-    """
-    if isinstance(cmd, basestring):
-      cmd = [cmd]
-    return self._RunDeviceAdbCmd(['emu'] + cmd, timeout, retries)
-
-  def DisableVerity(self, timeout=DEFAULT_TIMEOUT, retries=DEFAULT_RETRIES):
-    """Disable Marshmallow's Verity security feature"""
-    output = self._RunDeviceAdbCmd(['disable-verity'], timeout, retries)
-    if output and not _VERITY_DISABLE_RE.search(output):
-      raise device_errors.AdbCommandFailedError(
-          ['disable-verity'], output, device_serial=self._device_serial)
-
-  def EnableVerity(self, timeout=DEFAULT_TIMEOUT, retries=DEFAULT_RETRIES):
-    """Enable Marshmallow's Verity security feature"""
-    output = self._RunDeviceAdbCmd(['enable-verity'], timeout, retries)
-    if output and not _VERITY_ENABLE_RE.search(output):
-      raise device_errors.AdbCommandFailedError(
-          ['enable-verity'], output, device_serial=self._device_serial)
-
-  @property
-  def is_emulator(self):
-    return _EMULATOR_RE.match(self._device_serial)
-
-  @property
-  def is_ready(self):
-    try:
-      return self.GetState() == _READY_STATE
-    except device_errors.CommandFailedError:
-      return False
diff --git a/third_party/catapult/devil/devil/android/sdk/adb_wrapper_devicetest.py b/third_party/catapult/devil/devil/android/sdk/adb_wrapper_devicetest.py
deleted file mode 100755
index d97d56a..0000000
--- a/third_party/catapult/devil/devil/android/sdk/adb_wrapper_devicetest.py
+++ /dev/null
@@ -1,118 +0,0 @@
-#!/usr/bin/env python
-
-# 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.
-
-"""Tests for the AdbWrapper class."""
-
-import os
-import tempfile
-import time
-import unittest
-
-from devil.android import device_test_case
-from devil.android import device_errors
-from devil.android.sdk import adb_wrapper
-
-
-class TestAdbWrapper(device_test_case.DeviceTestCase):
-
-  def setUp(self):
-    super(TestAdbWrapper, self).setUp()
-    self._adb = adb_wrapper.AdbWrapper(self.serial)
-    self._adb.WaitForDevice()
-
-  @staticmethod
-  def _MakeTempFile(contents):
-    """Make a temporary file with the given contents.
-
-    Args:
-      contents: string to write to the temporary file.
-
-    Returns:
-      The absolute path to the file.
-    """
-    fi, path = tempfile.mkstemp()
-    with os.fdopen(fi, 'wb') as f:
-      f.write(contents)
-    return path
-
-  def testShell(self):
-    output = self._adb.Shell('echo test', expect_status=0)
-    self.assertEqual(output.strip(), 'test')
-    output = self._adb.Shell('echo test')
-    self.assertEqual(output.strip(), 'test')
-    with self.assertRaises(device_errors.AdbCommandFailedError):
-      self._adb.Shell('echo test', expect_status=1)
-
-  @unittest.skip("https://github.com/catapult-project/catapult/issues/2574")
-  def testPersistentShell(self):
-    # We need to access the device serial number here in order
-    # to create the persistent shell.
-    serial = self._adb.GetDeviceSerial() # pylint: disable=protected-access
-    with self._adb.PersistentShell(serial) as pshell:
-      (res1, code1) = pshell.RunCommand('echo TEST')
-      (res2, code2) = pshell.RunCommand('echo TEST2')
-      self.assertEqual(len(res1), 1)
-      self.assertEqual(res1[0], 'TEST')
-      self.assertEqual(res2[-1], 'TEST2')
-      self.assertEqual(code1, 0)
-      self.assertEqual(code2, 0)
-
-  def testPushLsPull(self):
-    path = self._MakeTempFile('foo')
-    device_path = '/data/local/tmp/testfile.txt'
-    local_tmpdir = os.path.dirname(path)
-    self._adb.Push(path, device_path)
-    files = dict(self._adb.Ls('/data/local/tmp'))
-    self.assertTrue('testfile.txt' in files)
-    self.assertEquals(3, files['testfile.txt'].st_size)
-    self.assertEqual(self._adb.Shell('cat %s' % device_path), 'foo')
-    self._adb.Pull(device_path, local_tmpdir)
-    with open(os.path.join(local_tmpdir, 'testfile.txt'), 'r') as f:
-      self.assertEqual(f.read(), 'foo')
-
-  def testInstall(self):
-    path = self._MakeTempFile('foo')
-    with self.assertRaises(device_errors.AdbCommandFailedError):
-      self._adb.Install(path)
-
-  def testForward(self):
-    with self.assertRaises(device_errors.AdbCommandFailedError):
-      self._adb.Forward(0, 0)
-
-  def testUninstall(self):
-    with self.assertRaises(device_errors.AdbCommandFailedError):
-      self._adb.Uninstall('some.nonexistant.package')
-
-  def testRebootWaitForDevice(self):
-    self._adb.Reboot()
-    print 'waiting for device to reboot...'
-    while self._adb.GetState() == 'device':
-      time.sleep(1)
-    self._adb.WaitForDevice()
-    self.assertEqual(self._adb.GetState(), 'device')
-    print 'waiting for package manager...'
-    while True:
-      try:
-        android_path = self._adb.Shell('pm path android')
-      except device_errors.AdbShellCommandFailedError:
-        android_path = None
-      if android_path and 'package:' in android_path:
-        break
-      time.sleep(1)
-
-  def testRootRemount(self):
-    self._adb.Root()
-    while True:
-      try:
-        self._adb.Shell('start')
-        break
-      except device_errors.AdbCommandFailedError:
-        time.sleep(1)
-    self._adb.Remount()
-
-
-if __name__ == '__main__':
-  unittest.main()
diff --git a/third_party/catapult/devil/devil/android/sdk/adb_wrapper_test.py b/third_party/catapult/devil/devil/android/sdk/adb_wrapper_test.py
deleted file mode 100755
index ef08661..0000000
--- a/third_party/catapult/devil/devil/android/sdk/adb_wrapper_test.py
+++ /dev/null
@@ -1,59 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""
-Unit tests for some APIs with conditional logic in adb_wrapper.py
-"""
-
-import unittest
-
-from devil import devil_env
-from devil.android import device_errors
-from devil.android.sdk import adb_wrapper
-
-with devil_env.SysPath(devil_env.PYMOCK_PATH):
-  import mock  # pylint: disable=import-error
-
-
-class AdbWrapperTest(unittest.TestCase):
-  def setUp(self):
-    self.adb = adb_wrapper.AdbWrapper('ABC12345678')
-
-  def _MockRunDeviceAdbCmd(self, return_value):
-    return mock.patch.object(
-        self.adb,
-        '_RunDeviceAdbCmd',
-        mock.Mock(side_effect=None, return_value=return_value))
-
-  def testDisableVerityWhenDisabled(self):
-    with self._MockRunDeviceAdbCmd('Verity already disabled on /system'):
-      self.adb.DisableVerity()
-
-  def testDisableVerityWhenEnabled(self):
-    with self._MockRunDeviceAdbCmd(
-        'Verity disabled on /system\nNow reboot your device for settings to '
-        'take effect'):
-      self.adb.DisableVerity()
-
-  def testEnableVerityWhenEnabled(self):
-    with self._MockRunDeviceAdbCmd('Verity already enabled on /system'):
-      self.adb.EnableVerity()
-
-  def testEnableVerityWhenDisabled(self):
-    with self._MockRunDeviceAdbCmd(
-        'Verity enabled on /system\nNow reboot your device for settings to '
-        'take effect'):
-      self.adb.EnableVerity()
-
-  def testFailEnableVerity(self):
-    with self._MockRunDeviceAdbCmd('error: closed'):
-      self.assertRaises(
-          device_errors.AdbCommandFailedError, self.adb.EnableVerity)
-
-  def testFailDisableVerity(self):
-    with self._MockRunDeviceAdbCmd('error: closed'):
-      self.assertRaises(
-          device_errors.AdbCommandFailedError, self.adb.DisableVerity)
-
diff --git a/third_party/catapult/devil/devil/android/sdk/build_tools.py b/third_party/catapult/devil/devil/android/sdk/build_tools.py
deleted file mode 100644
index 99083d9..0000000
--- a/third_party/catapult/devil/devil/android/sdk/build_tools.py
+++ /dev/null
@@ -1,51 +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.
-
-import os
-
-from devil import devil_env
-from devil.utils import lazy
-
-with devil_env.SysPath(devil_env.DEPENDENCY_MANAGER_PATH):
-  import dependency_manager  # pylint: disable=import-error
-
-
-def GetPath(build_tool):
-  try:
-    return devil_env.config.LocalPath(build_tool)
-  except dependency_manager.NoPathFoundError:
-    pass
-
-  try:
-    return _PathInLocalSdk(build_tool)
-  except dependency_manager.NoPathFoundError:
-    pass
-
-  return devil_env.config.FetchPath(build_tool)
-
-
-def _PathInLocalSdk(build_tool):
-  build_tools_path = _build_tools_path.read()
-  return (os.path.join(build_tools_path, build_tool) if build_tools_path
-          else None)
-
-
-def _FindBuildTools():
-  android_sdk_path = devil_env.config.LocalPath('android_sdk')
-  if not android_sdk_path:
-    return None
-
-  build_tools_contents = os.listdir(
-      os.path.join(android_sdk_path, 'build-tools'))
-
-  if not build_tools_contents:
-    return None
-  else:
-    if len(build_tools_contents) > 1:
-      build_tools_contents.sort()
-    return os.path.join(android_sdk_path, 'build-tools',
-                        build_tools_contents[-1])
-
-
-_build_tools_path = lazy.WeakConstant(_FindBuildTools)
diff --git a/third_party/catapult/devil/devil/android/sdk/dexdump.py b/third_party/catapult/devil/devil/android/sdk/dexdump.py
deleted file mode 100644
index 992366e..0000000
--- a/third_party/catapult/devil/devil/android/sdk/dexdump.py
+++ /dev/null
@@ -1,31 +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.
-
-from devil.android.sdk import build_tools
-from devil.utils import cmd_helper
-from devil.utils import lazy
-
-
-_dexdump_path = lazy.WeakConstant(lambda: build_tools.GetPath('dexdump'))
-
-
-def DexDump(dexfiles, file_summary=False):
-  """A wrapper around the Android SDK's dexdump tool.
-
-  Args:
-    dexfiles: The dexfile or list of dex files to dump.
-    file_summary: Display summary information from the file header. (-f)
-
-  Returns:
-    An iterable over the output lines.
-  """
-  # TODO(jbudorick): Add support for more options as necessary.
-  if isinstance(dexfiles, basestring):
-    dexfiles = [dexfiles]
-  args = [_dexdump_path.read()] + dexfiles
-  if file_summary:
-    args.append('-f')
-
-  return cmd_helper.IterCmdOutputLines(args)
-
diff --git a/third_party/catapult/devil/devil/android/sdk/fastboot.py b/third_party/catapult/devil/devil/android/sdk/fastboot.py
deleted file mode 100644
index d7f9f62..0000000
--- a/third_party/catapult/devil/devil/android/sdk/fastboot.py
+++ /dev/null
@@ -1,98 +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.
-
-"""This module wraps Android's fastboot tool.
-
-This is a thin wrapper around the fastboot interface. Any additional complexity
-should be delegated to a higher level (ex. FastbootUtils).
-"""
-# pylint: disable=unused-argument
-
-from devil import devil_env
-from devil.android import decorators
-from devil.android import device_errors
-from devil.utils import cmd_helper
-from devil.utils import lazy
-
-_DEFAULT_TIMEOUT = 30
-_DEFAULT_RETRIES = 3
-_FLASH_TIMEOUT = _DEFAULT_TIMEOUT * 10
-
-
-class Fastboot(object):
-
-  _fastboot_path = lazy.WeakConstant(
-      lambda: devil_env.config.FetchPath('fastboot'))
-
-  def __init__(self, device_serial, default_timeout=_DEFAULT_TIMEOUT,
-               default_retries=_DEFAULT_RETRIES):
-    """Initializes the FastbootWrapper.
-
-    Args:
-      device_serial: The device serial number as a string.
-    """
-    if not device_serial:
-      raise ValueError('A device serial must be specified')
-    self._device_serial = str(device_serial)
-    self._default_timeout = default_timeout
-    self._default_retries = default_retries
-
-  def _RunFastbootCommand(self, cmd):
-    """Run a command line command using the fastboot android tool.
-
-    Args:
-      cmd: Command to run. Must be list of args, the first one being the command
-
-    Returns:
-      output of command.
-
-    Raises:
-      TypeError: If cmd is not of type list.
-    """
-    if type(cmd) == list:
-      cmd = [self._fastboot_path.read(), '-s', self._device_serial] + cmd
-    else:
-      raise TypeError(
-          'Command for _RunFastbootCommand must be a list.')
-    status, output = cmd_helper.GetCmdStatusAndOutput(cmd)
-    if int(status) != 0:
-      raise device_errors.FastbootCommandFailedError(
-          cmd, output, status, self._device_serial)
-    return output
-
-  @decorators.WithTimeoutAndRetriesDefaults(_FLASH_TIMEOUT, 0)
-  def Flash(self, partition, image, timeout=None, retries=None):
-    """Flash partition with img.
-
-    Args:
-      partition: Partition to be flashed.
-      image: location of image to flash with.
-    """
-    self._RunFastbootCommand(['flash', partition, image])
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def Devices(self, timeout=None, retries=None):
-    """Outputs list of devices in fastboot mode."""
-    output = self._RunFastbootCommand(['devices'])
-    return [line.split()[0] for line in output.splitlines()]
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def RebootBootloader(self, timeout=None, retries=None):
-    """Reboot from fastboot, into fastboot."""
-    self._RunFastbootCommand(['reboot-bootloader'])
-
-  @decorators.WithTimeoutAndRetriesDefaults(_FLASH_TIMEOUT, 0)
-  def Reboot(self, timeout=None, retries=None):
-    """Reboot from fastboot to normal usage"""
-    self._RunFastbootCommand(['reboot'])
-
-  @decorators.WithTimeoutAndRetriesFromInstance()
-  def SetOemOffModeCharge(self, value, timeout=None, retries=None):
-    """Sets off mode charging
-
-    Args:
-      value: boolean value to set off-mode-charging on or off.
-    """
-    self._RunFastbootCommand(
-        ['oem', 'off-mode-charge', str(int(value))])
diff --git a/third_party/catapult/devil/devil/android/sdk/gce_adb_wrapper.py b/third_party/catapult/devil/devil/android/sdk/gce_adb_wrapper.py
deleted file mode 100644
index 71600f4..0000000
--- a/third_party/catapult/devil/devil/android/sdk/gce_adb_wrapper.py
+++ /dev/null
@@ -1,154 +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.
-
-"""Provides a work around for various adb commands on android gce instances.
-
-Some adb commands don't work well when the device is a cloud vm, namely
-'push' and 'pull'. With gce instances, moving files through adb can be
-painfully slow and hit timeouts, so the methods here just use scp instead.
-"""
-# pylint: disable=unused-argument
-
-import logging
-import os
-import subprocess
-
-from devil.android import device_errors
-from devil.android.sdk import adb_wrapper
-from devil.utils import cmd_helper
-
-logger = logging.getLogger(__name__)
-
-
-class GceAdbWrapper(adb_wrapper.AdbWrapper):
-
-  def __init__(self, device_serial):
-    super(GceAdbWrapper, self).__init__(device_serial)
-    self._Connect()
-    self.Root()
-    self._instance_ip = self.Shell('getprop net.gce.ip').strip()
-
-  def _Connect(self, timeout=adb_wrapper.DEFAULT_TIMEOUT,
-               retries=adb_wrapper.DEFAULT_RETRIES):
-    """Connects ADB to the android gce instance."""
-    cmd = ['connect', self._device_serial]
-    output = self._RunAdbCmd(cmd, timeout=timeout, retries=retries)
-    if 'unable to connect' in output:
-      raise device_errors.AdbCommandFailedError(cmd, output)
-    self.WaitForDevice()
-
-  # override
-  def Root(self, **kwargs):
-    super(GceAdbWrapper, self).Root()
-    self._Connect()
-
-  # override
-  def Push(self, local, remote, **kwargs):
-    """Pushes an object from the host to the gce instance.
-
-    Args:
-      local: Path on the host filesystem.
-      remote: Path on the instance filesystem.
-    """
-    adb_wrapper.VerifyLocalFileExists(local)
-    if os.path.isdir(local):
-      self.Shell('mkdir -p %s' % cmd_helper.SingleQuote(remote))
-
-      # When the object to be pushed is a directory, adb merges the source dir
-      # with the destination dir. So if local is a dir, just scp its contents.
-      for f in os.listdir(local):
-        self._PushObject(os.path.join(local, f), os.path.join(remote, f))
-        self.Shell('chmod 777 %s' %
-                   cmd_helper.SingleQuote(os.path.join(remote, f)))
-    else:
-      parent_dir = remote[0:remote.rfind('/')]
-      if parent_dir:
-        self.Shell('mkdir -p %s' % cmd_helper.SingleQuote(parent_dir))
-      self._PushObject(local, remote)
-      self.Shell('chmod 777 %s' % cmd_helper.SingleQuote(remote))
-
-  def _PushObject(self, local, remote):
-    """Copies an object from the host to the gce instance using scp.
-
-    Args:
-      local: Path on the host filesystem.
-      remote: Path on the instance filesystem.
-    """
-    cmd = [
-        'scp',
-        '-r',
-        '-o', 'UserKnownHostsFile=/dev/null',
-        '-o', 'StrictHostKeyChecking=no',
-        local,
-        'root@%s:%s' % (self._instance_ip, remote)
-    ]
-    status, _ = cmd_helper.GetCmdStatusAndOutput(cmd)
-    if status:
-      raise device_errors.AdbCommandFailedError(
-          cmd, 'File not reachable on host: %s' % local,
-          device_serial=str(self))
-
-  # override
-  def Pull(self, remote, local, **kwargs):
-    """Pulls a file from the gce instance to the host.
-
-    Args:
-      remote: Path on the instance filesystem.
-      local: Path on the host filesystem.
-    """
-    cmd = [
-        'scp',
-        '-p',
-        '-r',
-        '-o', 'UserKnownHostsFile=/dev/null',
-        '-o', 'StrictHostKeyChecking=no',
-        'root@%s:%s' % (self._instance_ip, remote),
-        local,
-    ]
-    status, _ = cmd_helper.GetCmdStatusAndOutput(cmd)
-    if status:
-      raise device_errors.AdbCommandFailedError(
-          cmd, 'File not reachable on host: %s' % local,
-          device_serial=str(self))
-
-    try:
-      adb_wrapper.VerifyLocalFileExists(local)
-    except (subprocess.CalledProcessError, IOError):
-      logger.exception('Error when pulling files from android instance.')
-      raise device_errors.AdbCommandFailedError(
-          cmd, 'File not reachable on host: %s' % local,
-          device_serial=str(self))
-
-  # override
-  def Install(self, apk_path, forward_lock=False, reinstall=False,
-              sd_card=False, **kwargs):
-    """Installs an apk on the gce instance
-
-    Args:
-      apk_path: Host path to the APK file.
-      forward_lock: (optional) If set forward-locks the app.
-      reinstall: (optional) If set reinstalls the app, keeping its data.
-      sd_card: (optional) If set installs on the SD card.
-    """
-    adb_wrapper.VerifyLocalFileExists(apk_path)
-    cmd = ['install']
-    if forward_lock:
-      cmd.append('-l')
-    if reinstall:
-      cmd.append('-r')
-    if sd_card:
-      cmd.append('-s')
-    self.Push(apk_path, '/data/local/tmp/tmp.apk')
-    cmd = ['pm'] + cmd
-    cmd.append('/data/local/tmp/tmp.apk')
-    output = self.Shell(' '.join(cmd))
-    self.Shell('rm /data/local/tmp/tmp.apk')
-    if 'Success' not in output:
-      raise device_errors.AdbCommandFailedError(
-          cmd, output, device_serial=self._device_serial)
-
-  # override
-  @property
-  def is_emulator(self):
-    return True
diff --git a/third_party/catapult/devil/devil/android/sdk/intent.py b/third_party/catapult/devil/devil/android/sdk/intent.py
deleted file mode 100644
index cdefb46..0000000
--- a/third_party/catapult/devil/devil/android/sdk/intent.py
+++ /dev/null
@@ -1,129 +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.
-
-"""Manages intents and associated information.
-
-This is generally intended to be used with functions that calls Android's
-Am command.
-"""
-
-# Some common flag constants that can be used to construct intents.
-# Full list: http://developer.android.com/reference/android/content/Intent.html
-FLAG_ACTIVITY_CLEAR_TASK = 0x00008000
-FLAG_ACTIVITY_CLEAR_TOP = 0x04000000
-FLAG_ACTIVITY_NEW_TASK = 0x10000000
-FLAG_ACTIVITY_REORDER_TO_FRONT = 0x00020000
-FLAG_ACTIVITY_RESET_TASK_IF_NEEDED = 0x00200000
-
-
-def _bitwise_or(flags):
-  result = 0
-  for flag in flags:
-    result |= flag
-  return result
-
-
-class Intent(object):
-
-  def __init__(self, action='android.intent.action.VIEW', activity=None,
-               category=None, component=None, data=None, extras=None,
-               flags=None, package=None):
-    """Creates an Intent.
-
-    Args:
-      action: A string containing the action.
-      activity: A string that, with |package|, can be used to specify the
-                component.
-      category: A string or list containing any categories.
-      component: A string that specifies the component to send the intent to.
-      data: A string containing a data URI.
-      extras: A dict containing extra parameters to be passed along with the
-              intent.
-      flags: A sequence of flag constants to be passed with the intent.
-      package: A string that, with activity, can be used to specify the
-               component.
-    """
-    self._action = action
-    self._activity = activity
-    if isinstance(category, list) or category is None:
-      self._category = category
-    else:
-      self._category = [category]
-    self._component = component
-    self._data = data
-    self._extras = extras
-    self._flags = '0x%0.8x' % _bitwise_or(flags) if flags else None
-    self._package = package
-
-    if self._component and '/' in component:
-      self._package, self._activity = component.split('/', 1)
-    elif self._package and self._activity:
-      self._component = '%s/%s' % (package, activity)
-
-  @property
-  def action(self):
-    return self._action
-
-  @property
-  def activity(self):
-    return self._activity
-
-  @property
-  def category(self):
-    return self._category
-
-  @property
-  def component(self):
-    return self._component
-
-  @property
-  def data(self):
-    return self._data
-
-  @property
-  def extras(self):
-    return self._extras
-
-  @property
-  def flags(self):
-    return self._flags
-
-  @property
-  def package(self):
-    return self._package
-
-  @property
-  def am_args(self):
-    """Returns the intent as a list of arguments for the activity manager.
-
-    For details refer to the specification at:
-    - http://developer.android.com/tools/help/adb.html#IntentSpec
-    """
-    args = []
-    if self.action:
-      args.extend(['-a', self.action])
-    if self.data:
-      args.extend(['-d', self.data])
-    if self.category:
-      args.extend(arg for cat in self.category for arg in ('-c', cat))
-    if self.component:
-      args.extend(['-n', self.component])
-    if self.flags:
-      args.extend(['-f', self.flags])
-    if self.extras:
-      for key, value in self.extras.iteritems():
-        if value is None:
-          args.extend(['--esn', key])
-        elif isinstance(value, str):
-          args.extend(['--es', key, value])
-        elif isinstance(value, bool):
-          args.extend(['--ez', key, str(value)])
-        elif isinstance(value, int):
-          args.extend(['--ei', key, str(value)])
-        elif isinstance(value, float):
-          args.extend(['--ef', key, str(value)])
-        else:
-          raise NotImplementedError(
-              'Intent does not know how to pass %s extras' % type(value))
-    return args
diff --git a/third_party/catapult/devil/devil/android/sdk/keyevent.py b/third_party/catapult/devil/devil/android/sdk/keyevent.py
deleted file mode 100644
index 657dc96..0000000
--- a/third_party/catapult/devil/devil/android/sdk/keyevent.py
+++ /dev/null
@@ -1,63 +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.
-
-"""Android KeyEvent constants.
-
-http://developer.android.com/reference/android/view/KeyEvent.html
-"""
-
-KEYCODE_BACK = 4
-
-KEYCODE_0 = 7
-KEYCODE_1 = 8
-KEYCODE_2 = 9
-KEYCODE_3 = 10
-KEYCODE_4 = 11
-KEYCODE_5 = 12
-KEYCODE_6 = 13
-KEYCODE_7 = 14
-KEYCODE_8 = 15
-KEYCODE_9 = 16
-
-KEYCODE_DPAD_RIGHT = 22
-
-KEYCODE_POWER = 26
-
-KEYCODE_A = 29
-KEYCODE_B = 30
-KEYCODE_C = 31
-KEYCODE_D = 32
-KEYCODE_E = 33
-KEYCODE_F = 34
-KEYCODE_G = 35
-KEYCODE_H = 36
-KEYCODE_I = 37
-KEYCODE_J = 38
-KEYCODE_K = 39
-KEYCODE_L = 40
-KEYCODE_M = 41
-KEYCODE_N = 42
-KEYCODE_O = 43
-KEYCODE_P = 44
-KEYCODE_Q = 45
-KEYCODE_R = 46
-KEYCODE_S = 47
-KEYCODE_T = 48
-KEYCODE_U = 49
-KEYCODE_V = 50
-KEYCODE_W = 51
-KEYCODE_X = 52
-KEYCODE_Y = 53
-KEYCODE_Z = 54
-
-KEYCODE_PERIOD = 56
-
-KEYCODE_SPACE = 62
-
-KEYCODE_ENTER = 66
-KEYCODE_DEL = 67
-
-KEYCODE_MENU = 82
-
-KEYCODE_APP_SWITCH = 187
diff --git a/third_party/catapult/devil/devil/android/sdk/shared_prefs.py b/third_party/catapult/devil/devil/android/sdk/shared_prefs.py
deleted file mode 100644
index 2fa2e6a..0000000
--- a/third_party/catapult/devil/devil/android/sdk/shared_prefs.py
+++ /dev/null
@@ -1,420 +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.
-
-"""Helper object to read and modify Shared Preferences from Android apps.
-
-See e.g.:
-  http://developer.android.com/reference/android/content/SharedPreferences.html
-"""
-
-import logging
-import posixpath
-
-from devil.android import device_errors
-from devil.android.sdk import version_codes
-from xml.etree import ElementTree
-
-logger = logging.getLogger(__name__)
-
-
-_XML_DECLARATION = "<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n"
-
-
-class BasePref(object):
-  """Base class for getting/setting the value of a specific preference type.
-
-  Should not be instantiated directly. The SharedPrefs collection will
-  instantiate the appropriate subclasses, which directly manipulate the
-  underlying xml document, to parse and serialize values according to their
-  type.
-
-  Args:
-    elem: An xml ElementTree object holding the preference data.
-
-  Properties:
-    tag_name: A string with the tag that must be used for this preference type.
-  """
-  tag_name = None
-
-  def __init__(self, elem):
-    if elem.tag != type(self).tag_name:
-      raise TypeError('Property %r has type %r, but trying to access as %r' %
-                      (elem.get('name'), elem.tag, type(self).tag_name))
-    self._elem = elem
-
-  def __str__(self):
-    """Get the underlying xml element as a string."""
-    return ElementTree.tostring(self._elem)
-
-  def get(self):
-    """Get the value of this preference."""
-    return self._elem.get('value')
-
-  def set(self, value):
-    """Set from a value casted as a string."""
-    self._elem.set('value', str(value))
-
-  @property
-  def has_value(self):
-    """Check whether the element has a value."""
-    return self._elem.get('value') is not None
-
-
-class BooleanPref(BasePref):
-  """Class for getting/setting a preference with a boolean value.
-
-  The underlying xml element has the form, e.g.:
-      <boolean name="featureEnabled" value="false" />
-  """
-  tag_name = 'boolean'
-  VALUES = {'true': True, 'false': False}
-
-  def get(self):
-    """Get the value as a Python bool."""
-    return type(self).VALUES[super(BooleanPref, self).get()]
-
-  def set(self, value):
-    """Set from a value casted as a bool."""
-    super(BooleanPref, self).set('true' if value else 'false')
-
-
-class FloatPref(BasePref):
-  """Class for getting/setting a preference with a float value.
-
-  The underlying xml element has the form, e.g.:
-      <float name="someMetric" value="4.7" />
-  """
-  tag_name = 'float'
-
-  def get(self):
-    """Get the value as a Python float."""
-    return float(super(FloatPref, self).get())
-
-
-class IntPref(BasePref):
-  """Class for getting/setting a preference with an int value.
-
-  The underlying xml element has the form, e.g.:
-      <int name="aCounter" value="1234" />
-  """
-  tag_name = 'int'
-
-  def get(self):
-    """Get the value as a Python int."""
-    return int(super(IntPref, self).get())
-
-
-class LongPref(IntPref):
-  """Class for getting/setting a preference with a long value.
-
-  The underlying xml element has the form, e.g.:
-      <long name="aLongCounter" value="1234" />
-
-  We use the same implementation from IntPref.
-  """
-  tag_name = 'long'
-
-
-class StringPref(BasePref):
-  """Class for getting/setting a preference with a string value.
-
-  The underlying xml element has the form, e.g.:
-      <string name="someHashValue">249b3e5af13d4db2</string>
-  """
-  tag_name = 'string'
-
-  def get(self):
-    """Get the value as a Python string."""
-    return self._elem.text
-
-  def set(self, value):
-    """Set from a value casted as a string."""
-    self._elem.text = str(value)
-
-
-class StringSetPref(StringPref):
-  """Class for getting/setting a preference with a set of string values.
-
-  The underlying xml element has the form, e.g.:
-      <set name="managed_apps">
-          <string>com.mine.app1</string>
-          <string>com.mine.app2</string>
-          <string>com.mine.app3</string>
-      </set>
-  """
-  tag_name = 'set'
-
-  def get(self):
-    """Get a list with the string values contained."""
-    value = []
-    for child in self._elem:
-      assert child.tag == 'string'
-      value.append(child.text)
-    return value
-
-  def set(self, value):
-    """Set from a sequence of values, each casted as a string."""
-    for child in list(self._elem):
-      self._elem.remove(child)
-    for item in value:
-      ElementTree.SubElement(self._elem, 'string').text = str(item)
-
-
-_PREF_TYPES = {c.tag_name: c for c in [BooleanPref, FloatPref, IntPref,
-                                       LongPref, StringPref, StringSetPref]}
-
-
-class SharedPrefs(object):
-
-  def __init__(self, device, package, filename):
-    """Helper object to read and update "Shared Prefs" of Android apps.
-
-    Such files typically look like, e.g.:
-
-        <?xml version='1.0' encoding='utf-8' standalone='yes' ?>
-        <map>
-          <int name="databaseVersion" value="107" />
-          <boolean name="featureEnabled" value="false" />
-          <string name="someHashValue">249b3e5af13d4db2</string>
-        </map>
-
-    Example usage:
-
-        prefs = shared_prefs.SharedPrefs(device, 'com.my.app', 'my_prefs.xml')
-        prefs.Load()
-        prefs.GetString('someHashValue') # => '249b3e5af13d4db2'
-        prefs.SetInt('databaseVersion', 42)
-        prefs.Remove('featureEnabled')
-        prefs.Commit()
-
-    The object may also be used as a context manager to automatically load and
-    commit, respectively, upon entering and leaving the context.
-
-    Args:
-      device: A DeviceUtils object.
-      package: A string with the package name of the app that owns the shared
-        preferences file.
-      filename: A string with the name of the preferences file to read/write.
-    """
-    self._device = device
-    self._xml = None
-    self._package = package
-    self._filename = filename
-    self._path = '/data/data/%s/shared_prefs/%s' % (package, filename)
-    self._changed = False
-
-  def __repr__(self):
-    """Get a useful printable representation of the object."""
-    return '<{cls} file {filename} for {package} on {device}>'.format(
-      cls=type(self).__name__, filename=self.filename, package=self.package,
-      device=str(self._device))
-
-  def __str__(self):
-    """Get the underlying xml document as a string."""
-    return _XML_DECLARATION + ElementTree.tostring(self.xml)
-
-  @property
-  def package(self):
-    """Get the package name of the app that owns the shared preferences."""
-    return self._package
-
-  @property
-  def filename(self):
-    """Get the filename of the shared preferences file."""
-    return self._filename
-
-  @property
-  def path(self):
-    """Get the full path to the shared preferences file on the device."""
-    return self._path
-
-  @property
-  def changed(self):
-    """True if properties have changed and a commit would be needed."""
-    return self._changed
-
-  @property
-  def xml(self):
-    """Get the underlying xml document as an ElementTree object."""
-    if self._xml is None:
-      self._xml = ElementTree.Element('map')
-    return self._xml
-
-  def Load(self):
-    """Load the shared preferences file from the device.
-
-    A empty xml document, which may be modified and saved on |commit|, is
-    created if the file does not already exist.
-    """
-    if self._device.FileExists(self.path):
-      self._xml = ElementTree.fromstring(
-          self._device.ReadFile(self.path, as_root=True))
-      assert self._xml.tag == 'map'
-    else:
-      self._xml = None
-    self._changed = False
-
-  def Clear(self):
-    """Clear all of the preferences contained in this object."""
-    if self._xml is not None and len(self):  # only clear if not already empty
-      self._xml = None
-      self._changed = True
-
-  def Commit(self):
-    """Save the current set of preferences to the device.
-
-    Only actually saves if some preferences have been modified.
-    """
-    if not self.changed:
-      return
-    self._device.RunShellCommand(
-        ['mkdir', '-p', posixpath.dirname(self.path)],
-        as_root=True, check_return=True)
-    self._device.WriteFile(self.path, str(self), as_root=True)
-    # Creating the directory/file can cause issues with SELinux if they did
-    # not already exist. As a workaround, apply the package's security context
-    # to the shared_prefs directory, which mimics the behavior of a file
-    # created by the app itself
-    if self._device.build_version_sdk >= version_codes.MARSHMALLOW:
-      security_context = self._GetSecurityContext(self.package)
-      if security_context == None:
-        raise device_errors.CommandFailedError(
-            'Failed to get security context for %s' % self.package)
-      self._device.RunShellCommand(
-          ['chcon', '-R', security_context,
-           '/data/data/%s/shared_prefs' % self.package],
-          as_root=True, check_return=True)
-    self._device.KillAll(self.package, exact=True, as_root=True, quiet=True)
-    self._changed = False
-
-  def __len__(self):
-    """Get the number of preferences in this collection."""
-    return len(self.xml)
-
-  def PropertyType(self, key):
-    """Get the type (i.e. tag name) of a property in the collection."""
-    return self._GetChild(key).tag
-
-  def HasProperty(self, key):
-    try:
-      self._GetChild(key)
-      return True
-    except KeyError:
-      return False
-
-  def GetBoolean(self, key):
-    """Get a boolean property."""
-    return BooleanPref(self._GetChild(key)).get()
-
-  def SetBoolean(self, key, value):
-    """Set a boolean property."""
-    self._SetPrefValue(key, value, BooleanPref)
-
-  def GetFloat(self, key):
-    """Get a float property."""
-    return FloatPref(self._GetChild(key)).get()
-
-  def SetFloat(self, key, value):
-    """Set a float property."""
-    self._SetPrefValue(key, value, FloatPref)
-
-  def GetInt(self, key):
-    """Get an int property."""
-    return IntPref(self._GetChild(key)).get()
-
-  def SetInt(self, key, value):
-    """Set an int property."""
-    self._SetPrefValue(key, value, IntPref)
-
-  def GetLong(self, key):
-    """Get a long property."""
-    return LongPref(self._GetChild(key)).get()
-
-  def SetLong(self, key, value):
-    """Set a long property."""
-    self._SetPrefValue(key, value, LongPref)
-
-  def GetString(self, key):
-    """Get a string property."""
-    return StringPref(self._GetChild(key)).get()
-
-  def SetString(self, key, value):
-    """Set a string property."""
-    self._SetPrefValue(key, value, StringPref)
-
-  def GetStringSet(self, key):
-    """Get a string set property."""
-    return StringSetPref(self._GetChild(key)).get()
-
-  def SetStringSet(self, key, value):
-    """Set a string set property."""
-    self._SetPrefValue(key, value, StringSetPref)
-
-  def Remove(self, key):
-    """Remove a preference from the collection."""
-    self.xml.remove(self._GetChild(key))
-
-  def AsDict(self):
-    """Return the properties and their values as a dictionary."""
-    d = {}
-    for child in self.xml:
-      pref = _PREF_TYPES[child.tag](child)
-      d[child.get('name')] = pref.get()
-    return d
-
-  def __enter__(self):
-    """Load preferences file from the device when entering a context."""
-    self.Load()
-    return self
-
-  def __exit__(self, exc_type, _exc_value, _traceback):
-    """Save preferences file to the device when leaving a context."""
-    if not exc_type:
-      self.Commit()
-
-  def _GetChild(self, key):
-    """Get the underlying xml node that holds the property of a given key.
-
-    Raises:
-      KeyError when the key is not found in the collection.
-    """
-    for child in self.xml:
-      if child.get('name') == key:
-        return child
-    raise KeyError(key)
-
-  def _SetPrefValue(self, key, value, pref_cls):
-    """Set the value of a property.
-
-    Args:
-      key: The key of the property to set.
-      value: The new value of the property.
-      pref_cls: A subclass of BasePref used to access the property.
-
-    Raises:
-      TypeError when the key already exists but with a different type.
-    """
-    try:
-      pref = pref_cls(self._GetChild(key))
-      old_value = pref.get()
-    except KeyError:
-      pref = pref_cls(ElementTree.SubElement(
-          self.xml, pref_cls.tag_name, {'name': key}))
-      old_value = None
-    if old_value != value:
-      pref.set(value)
-      self._changed = True
-      logger.info('Setting property: %s', pref)
-
-  def _GetSecurityContext(self, package):
-    for line in self._device.RunShellCommand(['ls', '-Z', '/data/data/'],
-                                             as_root=True, check_return=True):
-      split_line = line.split()
-      # ls -Z output differs between Android versions, but the package is
-      # always last and the context always starts with "u:object"
-      if split_line[-1] == package:
-        for column in split_line:
-          if column.startswith('u:object'):
-            return column
-    return None
diff --git a/third_party/catapult/devil/devil/android/sdk/shared_prefs_test.py b/third_party/catapult/devil/devil/android/sdk/shared_prefs_test.py
deleted file mode 100755
index 4c31c56..0000000
--- a/third_party/catapult/devil/devil/android/sdk/shared_prefs_test.py
+++ /dev/null
@@ -1,171 +0,0 @@
-#!/usr/bin/env python
-# 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.
-
-"""
-Unit tests for the contents of shared_prefs.py (mostly SharedPrefs).
-"""
-
-import logging
-import unittest
-
-from devil import devil_env
-from devil.android import device_utils
-from devil.android.sdk import shared_prefs
-from devil.android.sdk import version_codes
-
-with devil_env.SysPath(devil_env.PYMOCK_PATH):
-  import mock  # pylint: disable=import-error
-
-
-def MockDeviceWithFiles(files=None):
-  if files is None:
-    files = {}
-
-  def file_exists(path):
-    return path in files
-
-  def write_file(path, contents, **_kwargs):
-    files[path] = contents
-
-  def read_file(path, **_kwargs):
-    return files[path]
-
-  device = mock.MagicMock(spec=device_utils.DeviceUtils)
-  device.FileExists = mock.Mock(side_effect=file_exists)
-  device.WriteFile = mock.Mock(side_effect=write_file)
-  device.ReadFile = mock.Mock(side_effect=read_file)
-  return device
-
-
-class SharedPrefsTest(unittest.TestCase):
-
-  def setUp(self):
-    self.device = MockDeviceWithFiles({
-      '/data/data/com.some.package/shared_prefs/prefs.xml':
-          "<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n"
-          '<map>\n'
-          '  <int name="databaseVersion" value="107" />\n'
-          '  <boolean name="featureEnabled" value="false" />\n'
-          '  <string name="someHashValue">249b3e5af13d4db2</string>\n'
-          '</map>'})
-    self.expected_data = {'databaseVersion': 107,
-                          'featureEnabled': False,
-                          'someHashValue': '249b3e5af13d4db2'}
-
-  def testPropertyLifetime(self):
-    prefs = shared_prefs.SharedPrefs(
-        self.device, 'com.some.package', 'prefs.xml')
-    self.assertEquals(len(prefs), 0)  # collection is empty before loading
-    prefs.SetInt('myValue', 444)
-    self.assertEquals(len(prefs), 1)
-    self.assertEquals(prefs.GetInt('myValue'), 444)
-    self.assertTrue(prefs.HasProperty('myValue'))
-    prefs.Remove('myValue')
-    self.assertEquals(len(prefs), 0)
-    self.assertFalse(prefs.HasProperty('myValue'))
-    with self.assertRaises(KeyError):
-      prefs.GetInt('myValue')
-
-  def testPropertyType(self):
-    prefs = shared_prefs.SharedPrefs(
-        self.device, 'com.some.package', 'prefs.xml')
-    prefs.SetInt('myValue', 444)
-    self.assertEquals(prefs.PropertyType('myValue'), 'int')
-    with self.assertRaises(TypeError):
-      prefs.GetString('myValue')
-    with self.assertRaises(TypeError):
-      prefs.SetString('myValue', 'hello')
-
-  def testLoad(self):
-    prefs = shared_prefs.SharedPrefs(
-        self.device, 'com.some.package', 'prefs.xml')
-    self.assertEquals(len(prefs), 0)  # collection is empty before loading
-    prefs.Load()
-    self.assertEquals(len(prefs), len(self.expected_data))
-    self.assertEquals(prefs.AsDict(), self.expected_data)
-    self.assertFalse(prefs.changed)
-
-  def testClear(self):
-    prefs = shared_prefs.SharedPrefs(
-        self.device, 'com.some.package', 'prefs.xml')
-    prefs.Load()
-    self.assertEquals(prefs.AsDict(), self.expected_data)
-    self.assertFalse(prefs.changed)
-    prefs.Clear()
-    self.assertEquals(len(prefs), 0)  # collection is empty now
-    self.assertTrue(prefs.changed)
-
-  def testCommit(self):
-    type(self.device).build_version_sdk = mock.PropertyMock(
-        return_value=version_codes.LOLLIPOP_MR1)
-    prefs = shared_prefs.SharedPrefs(
-        self.device, 'com.some.package', 'other_prefs.xml')
-    self.assertFalse(self.device.FileExists(prefs.path))  # file does not exist
-    prefs.Load()
-    self.assertEquals(len(prefs), 0)  # file did not exist, collection is empty
-    prefs.SetInt('magicNumber', 42)
-    prefs.SetFloat('myMetric', 3.14)
-    prefs.SetLong('bigNumner', 6000000000)
-    prefs.SetStringSet('apps', ['gmail', 'chrome', 'music'])
-    self.assertFalse(self.device.FileExists(prefs.path))  # still does not exist
-    self.assertTrue(prefs.changed)
-    prefs.Commit()
-    self.assertTrue(self.device.FileExists(prefs.path))  # should exist now
-    self.device.KillAll.assert_called_once_with(prefs.package, exact=True,
-                                                as_root=True, quiet=True)
-    self.assertFalse(prefs.changed)
-
-    prefs = shared_prefs.SharedPrefs(
-        self.device, 'com.some.package', 'other_prefs.xml')
-    self.assertEquals(len(prefs), 0)  # collection is empty before loading
-    prefs.Load()
-    self.assertEquals(prefs.AsDict(), {
-        'magicNumber': 42,
-        'myMetric': 3.14,
-        'bigNumner': 6000000000,
-        'apps': ['gmail', 'chrome', 'music']})  # data survived roundtrip
-
-  def testAsContextManager_onlyReads(self):
-    with shared_prefs.SharedPrefs(
-        self.device, 'com.some.package', 'prefs.xml') as prefs:
-      self.assertEquals(prefs.AsDict(), self.expected_data)  # loaded and ready
-    self.assertEquals(self.device.WriteFile.call_args_list, [])  # did not write
-
-  def testAsContextManager_readAndWrite(self):
-    type(self.device).build_version_sdk = mock.PropertyMock(
-        return_value=version_codes.LOLLIPOP_MR1)
-    with shared_prefs.SharedPrefs(
-        self.device, 'com.some.package', 'prefs.xml') as prefs:
-      prefs.SetBoolean('featureEnabled', True)
-      prefs.Remove('someHashValue')
-      prefs.SetString('newString', 'hello')
-
-    self.assertTrue(self.device.WriteFile.called)  # did write
-    with shared_prefs.SharedPrefs(
-        self.device, 'com.some.package', 'prefs.xml') as prefs:
-      # changes persisted
-      self.assertTrue(prefs.GetBoolean('featureEnabled'))
-      self.assertFalse(prefs.HasProperty('someHashValue'))
-      self.assertEquals(prefs.GetString('newString'), 'hello')
-      self.assertTrue(prefs.HasProperty('databaseVersion'))  # still there
-
-  def testAsContextManager_commitAborted(self):
-    with self.assertRaises(TypeError):
-      with shared_prefs.SharedPrefs(
-          self.device, 'com.some.package', 'prefs.xml') as prefs:
-        prefs.SetBoolean('featureEnabled', True)
-        prefs.Remove('someHashValue')
-        prefs.SetString('newString', 'hello')
-        prefs.SetInt('newString', 123)  # oops!
-
-    self.assertEquals(self.device.WriteFile.call_args_list, [])  # did not write
-    with shared_prefs.SharedPrefs(
-        self.device, 'com.some.package', 'prefs.xml') as prefs:
-      # contents were not modified
-      self.assertEquals(prefs.AsDict(), self.expected_data)
-
-if __name__ == '__main__':
-  logging.getLogger().setLevel(logging.DEBUG)
-  unittest.main(verbosity=2)
diff --git a/third_party/catapult/devil/devil/android/sdk/split_select.py b/third_party/catapult/devil/devil/android/sdk/split_select.py
deleted file mode 100644
index 6c3d231..0000000
--- a/third_party/catapult/devil/devil/android/sdk/split_select.py
+++ /dev/null
@@ -1,63 +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.
-
-"""This module wraps Android's split-select tool."""
-
-from devil.android.sdk import build_tools
-from devil.utils import cmd_helper
-from devil.utils import lazy
-
-
-_split_select_path = lazy.WeakConstant(
-    lambda: build_tools.GetPath('split-select'))
-
-
-def _RunSplitSelectCmd(args):
-  """Runs a split-select command.
-
-  Args:
-    args: A list of arguments for split-select.
-
-  Returns:
-    The output of the command.
-  """
-  cmd = [_split_select_path.read()] + args
-  status, output = cmd_helper.GetCmdStatusAndOutput(cmd)
-  if status != 0:
-    raise Exception('Failed running command "%s" with output "%s".' %
-                    (' '.join(cmd), output))
-  return output
-
-
-def _SplitConfig(device, allow_cached_props=False):
-  """Returns a config specifying which APK splits are required by the device.
-
-  Args:
-    device: A DeviceUtils object.
-    allow_cached_props: Whether to use cached values for device properties.
-  """
-  return ('%s-r%s-%s:%s' %
-          (device.GetLanguage(cache=allow_cached_props),
-           device.GetCountry(cache=allow_cached_props),
-           device.screen_density,
-           device.product_cpu_abi))
-
-
-def SelectSplits(device, base_apk, split_apks, allow_cached_props=False):
-  """Determines which APK splits the device requires.
-
-  Args:
-    device: A DeviceUtils object.
-    base_apk: The path of the base APK.
-    split_apks: A list of paths of APK splits.
-    allow_cached_props: Whether to use cached values for device properties.
-
-  Returns:
-    The list of APK splits that the device requires.
-  """
-  config = _SplitConfig(device, allow_cached_props=allow_cached_props)
-  args = ['--target', config, '--base', base_apk]
-  for split in split_apks:
-    args.extend(['--split', split])
-  return _RunSplitSelectCmd(args).splitlines()
diff --git a/third_party/catapult/devil/devil/android/sdk/test/data/push_directory/push_directory_contents.txt b/third_party/catapult/devil/devil/android/sdk/test/data/push_directory/push_directory_contents.txt
deleted file mode 100644
index 573df2e..0000000
--- a/third_party/catapult/devil/devil/android/sdk/test/data/push_directory/push_directory_contents.txt
+++ /dev/null
@@ -1 +0,0 @@
-Goodnight, moon.
diff --git a/third_party/catapult/devil/devil/android/sdk/test/data/push_file.txt b/third_party/catapult/devil/devil/android/sdk/test/data/push_file.txt
deleted file mode 100644
index af5626b..0000000
--- a/third_party/catapult/devil/devil/android/sdk/test/data/push_file.txt
+++ /dev/null
@@ -1 +0,0 @@
-Hello, world!
diff --git a/third_party/catapult/devil/devil/android/sdk/version_codes.py b/third_party/catapult/devil/devil/android/sdk/version_codes.py
deleted file mode 100644
index 3f03cba..0000000
--- a/third_party/catapult/devil/devil/android/sdk/version_codes.py
+++ /dev/null
@@ -1,20 +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.
-
-"""Android SDK version codes.
-
-http://developer.android.com/reference/android/os/Build.VERSION_CODES.html
-"""
-
-JELLY_BEAN = 16
-JELLY_BEAN_MR1 = 17
-JELLY_BEAN_MR2 = 18
-KITKAT = 19
-KITKAT_WATCH = 20
-LOLLIPOP = 21
-LOLLIPOP_MR1 = 22
-MARSHMALLOW = 23
-NOUGAT = 24
-NOUGAT_MR1 = 25
-
diff --git a/third_party/catapult/devil/devil/android/settings.py b/third_party/catapult/devil/devil/android/settings.py
deleted file mode 100644
index 886b266..0000000
--- a/third_party/catapult/devil/devil/android/settings.py
+++ /dev/null
@@ -1,273 +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.
-
-import logging
-
-logger = logging.getLogger(__name__)
-
-_LOCK_SCREEN_SETTINGS_PATH = '/data/system/locksettings.db'
-_ALTERNATE_LOCK_SCREEN_SETTINGS_PATH = (
-    '/data/data/com.android.providers.settings/databases/settings.db')
-PASSWORD_QUALITY_UNSPECIFIED = '0'
-_COMPATIBLE_BUILD_TYPES = ['userdebug', 'eng']
-
-
-ENABLE_LOCATION_SETTINGS = [
-  # Note that setting these in this order is required in order for all of
-  # them to take and stick through a reboot.
-  ('com.google.settings/partner', [
-    ('use_location_for_services', 1),
-  ]),
-  ('settings/secure', [
-    # Ensure Geolocation is enabled and allowed for tests.
-    ('location_providers_allowed', 'gps,network'),
-  ]),
-  ('com.google.settings/partner', [
-    ('network_location_opt_in', 1),
-  ])
-]
-
-DISABLE_LOCATION_SETTINGS = [
-  ('com.google.settings/partner', [
-    ('use_location_for_services', 0),
-  ]),
-  ('settings/secure', [
-    # Ensure Geolocation is disabled.
-    ('location_providers_allowed', ''),
-  ]),
-]
-
-ENABLE_MOCK_LOCATION_SETTINGS = [
-  ('settings/secure', [
-    ('mock_location', 1),
-  ]),
-]
-
-DISABLE_MOCK_LOCATION_SETTINGS = [
-  ('settings/secure', [
-    ('mock_location', 0),
-  ]),
-]
-
-DETERMINISTIC_DEVICE_SETTINGS = [
-  ('settings/global', [
-    ('assisted_gps_enabled', 0),
-
-    # Disable "auto time" and "auto time zone" to avoid network-provided time
-    # to overwrite the device's datetime and timezone synchronized from host
-    # when running tests later. See b/6569849.
-    ('auto_time', 0),
-    ('auto_time_zone', 0),
-
-    ('development_settings_enabled', 1),
-
-    # Flag for allowing ActivityManagerService to send ACTION_APP_ERROR intents
-    # on application crashes and ANRs. If this is disabled, the crash/ANR dialog
-    # will never display the "Report" button.
-    # Type: int ( 0 = disallow, 1 = allow )
-    ('send_action_app_error', 0),
-
-    ('stay_on_while_plugged_in', 3),
-
-    ('verifier_verify_adb_installs', 0),
-  ]),
-  ('settings/secure', [
-    ('allowed_geolocation_origins',
-        'http://www.google.co.uk http://www.google.com'),
-
-    # Ensure that we never get random dialogs like "Unfortunately the process
-    # android.process.acore has stopped", which steal the focus, and make our
-    # automation fail (because the dialog steals the focus then mistakenly
-    # receives the injected user input events).
-    ('anr_show_background', 0),
-
-    ('lockscreen.disabled', 1),
-
-    ('screensaver_enabled', 0),
-
-    ('skip_first_use_hints', 1),
-  ]),
-  ('settings/system', [
-    # Don't want devices to accidentally rotate the screen as that could
-    # affect performance measurements.
-    ('accelerometer_rotation', 0),
-
-    ('lockscreen.disabled', 1),
-
-    # Turn down brightness and disable auto-adjust so that devices run cooler.
-    ('screen_brightness', 5),
-    ('screen_brightness_mode', 0),
-
-    ('user_rotation', 0),
-  ]),
-]
-
-NETWORK_DISABLED_SETTINGS = [
-  ('settings/global', [
-    ('airplane_mode_on', 1),
-    ('wifi_on', 0),
-  ]),
-]
-
-
-class ContentSettings(dict):
-
-  """A dict interface to interact with device content settings.
-
-  System properties are key/value pairs as exposed by adb shell content.
-  """
-
-  def __init__(self, table, device):
-    super(ContentSettings, self).__init__()
-    self._table = table
-    self._device = device
-
-  @staticmethod
-  def _GetTypeBinding(value):
-    if isinstance(value, bool):
-      return 'b'
-    if isinstance(value, float):
-      return 'f'
-    if isinstance(value, int):
-      return 'i'
-    if isinstance(value, long):
-      return 'l'
-    if isinstance(value, str):
-      return 's'
-    raise ValueError('Unsupported type %s' % type(value))
-
-  def iteritems(self):
-    # Example row:
-    # 'Row: 0 _id=13, name=logging_id2, value=-1fccbaa546705b05'
-    for row in self._device.RunShellCommand(
-        ['content', 'query', '--uri', 'content://%s' % self._table],
-        check_return=True, as_root=True):
-      fields = row.split(', ')
-      key = None
-      value = None
-      for field in fields:
-        k, _, v = field.partition('=')
-        if k == 'name':
-          key = v
-        elif k == 'value':
-          value = v
-      if not key:
-        continue
-      if not value:
-        value = ''
-      yield key, value
-
-  def __getitem__(self, key):
-    return self._device.RunShellCommand(
-        ['content', 'query', '--uri', 'content://%s' % self._table,
-         '--where', "name='%s'" % key],
-        check_return=True, as_root=True).strip()
-
-  def __setitem__(self, key, value):
-    if key in self:
-      self._device.RunShellCommand(
-          ['content', 'update', '--uri', 'content://%s' % self._table,
-           '--bind', 'value:%s:%s' % (self._GetTypeBinding(value), value),
-           '--where', "name='%s'" % key],
-          check_return=True, as_root=True)
-    else:
-      self._device.RunShellCommand(
-          ['content', 'insert', '--uri', 'content://%s' % self._table,
-           '--bind', 'name:%s:%s' % (self._GetTypeBinding(key), key),
-           '--bind', 'value:%s:%s' % (self._GetTypeBinding(value), value)],
-          check_return=True, as_root=True)
-
-  def __delitem__(self, key):
-    self._device.RunShellCommand(
-        ['content', 'delete', '--uri', 'content://%s' % self._table,
-         '--bind', 'name:%s:%s' % (self._GetTypeBinding(key), key)],
-        check_return=True, as_root=True)
-
-
-def ConfigureContentSettings(device, desired_settings):
-  """Configures device content setings from a list.
-
-  Many settings are documented at:
-    http://developer.android.com/reference/android/provider/Settings.Global.html
-    http://developer.android.com/reference/android/provider/Settings.Secure.html
-    http://developer.android.com/reference/android/provider/Settings.System.html
-
-  Many others are undocumented.
-
-  Args:
-    device: A DeviceUtils instance for the device to configure.
-    desired_settings: A list of (table, [(key: value), ...]) for all
-        settings to configure.
-  """
-  for table, key_value in desired_settings:
-    settings = ContentSettings(table, device)
-    for key, value in key_value:
-      settings[key] = value
-    logger.info('\n%s %s', table, (80 - len(table)) * '-')
-    for key, value in sorted(settings.iteritems()):
-      logger.info('\t%s: %s', key, value)
-
-
-def SetLockScreenSettings(device):
-  """Sets lock screen settings on the device.
-
-  On certain device/Android configurations we need to disable the lock screen in
-  a different database. Additionally, the password type must be set to
-  DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED.
-  Lock screen settings are stored in sqlite on the device in:
-      /data/system/locksettings.db
-
-  IMPORTANT: The first column is used as a primary key so that all rows with the
-  same value for that column are removed from the table prior to inserting the
-  new values.
-
-  Args:
-    device: A DeviceUtils instance for the device to configure.
-
-  Raises:
-    Exception if the setting was not properly set.
-  """
-  if device.build_type not in _COMPATIBLE_BUILD_TYPES:
-    logger.warning('Unable to disable lockscreen on %s builds.',
-                   device.build_type)
-    return
-
-  def get_lock_settings(table):
-    return [(table, 'lockscreen.disabled', '1'),
-            (table, 'lockscreen.password_type', PASSWORD_QUALITY_UNSPECIFIED),
-            (table, 'lockscreen.password_type_alternate',
-             PASSWORD_QUALITY_UNSPECIFIED)]
-
-  if device.FileExists(_LOCK_SCREEN_SETTINGS_PATH):
-    db = _LOCK_SCREEN_SETTINGS_PATH
-    locksettings = get_lock_settings('locksettings')
-    columns = ['name', 'user', 'value']
-    generate_values = lambda k, v: [k, '0', v]
-  elif device.FileExists(_ALTERNATE_LOCK_SCREEN_SETTINGS_PATH):
-    db = _ALTERNATE_LOCK_SCREEN_SETTINGS_PATH
-    locksettings = get_lock_settings('secure') + get_lock_settings('system')
-    columns = ['name', 'value']
-    generate_values = lambda k, v: [k, v]
-  else:
-    logger.warning('Unable to find database file to set lock screen settings.')
-    return
-
-  for table, key, value in locksettings:
-    # Set the lockscreen setting for default user '0'
-    values = generate_values(key, value)
-
-    cmd = """begin transaction;
-delete from '%(table)s' where %(primary_key)s='%(primary_value)s';
-insert into '%(table)s' (%(columns)s) values (%(values)s);
-commit transaction;""" % {
-      'table': table,
-      'primary_key': columns[0],
-      'primary_value': values[0],
-      'columns': ', '.join(columns),
-      'values': ', '.join(["'%s'" % value for value in values])
-    }
-    output_msg = device.RunShellCommand(
-        ['sqlite3', db, cmd], check_return=True, as_root=True)
-    if output_msg:
-      logger.info(' '.join(output_msg))
diff --git a/third_party/catapult/devil/devil/android/tools/__init__.py b/third_party/catapult/devil/devil/android/tools/__init__.py
deleted file mode 100644
index 50b23df..0000000
--- a/third_party/catapult/devil/devil/android/tools/__init__.py
+++ /dev/null
@@ -1,3 +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.
diff --git a/third_party/catapult/devil/devil/android/tools/adb_run_shell_cmd.py b/third_party/catapult/devil/devil/android/tools/adb_run_shell_cmd.py
deleted file mode 100755
index 77b67e8..0000000
--- a/third_party/catapult/devil/devil/android/tools/adb_run_shell_cmd.py
+++ /dev/null
@@ -1,61 +0,0 @@
-#!/usr/bin/env python
-# 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.
-
-import argparse
-import json
-import os
-import sys
-
-if __name__ == '__main__':
-  sys.path.append(
-      os.path.abspath(os.path.join(os.path.dirname(__file__),
-                                   '..', '..', '..')))
-
-from devil.android import device_blacklist
-from devil.android import device_utils
-from devil.utils import run_tests_helper
-
-
-def main():
-  parser = argparse.ArgumentParser(
-      'Run an adb shell command on selected devices')
-  parser.add_argument('cmd', help='Adb shell command to run.', nargs="+")
-  parser.add_argument('-d', '--device', action='append', dest='devices',
-                      default=[],
-                      help='Device to run cmd on. Runs on all devices if not '
-                           'specified. Set multiple times for multiple devices')
-  parser.add_argument('-v', '--verbose', default=0, action='count',
-                      help='Verbose level (multiple times for more)')
-  parser.add_argument('--blacklist-file', help='Device blacklist file.')
-  parser.add_argument('--as-root', action='store_true', help='Run as root.')
-  parser.add_argument('--json-output',
-                      help='File to dump json output to.')
-  args = parser.parse_args()
-  run_tests_helper.SetLogLevel(args.verbose)
-
-  args.blacklist_file = device_blacklist.Blacklist(
-      args.blacklist_file) if args.blacklist_file else None
-  devices = device_utils.DeviceUtils.HealthyDevices(
-      blacklist=args.blacklist_file, device_arg=args.devices)
-
-  p_out = (device_utils.DeviceUtils.parallel(devices).RunShellCommand(
-      args.cmd, large_output=True, as_root=args.as_root, check_return=True)
-      .pGet(None))
-
-  data = {}
-  for device, output in zip(devices, p_out):
-    for line in output:
-      print '%s: %s' % (device, line)
-    data[str(device)] = output
-
-  if args.json_output:
-    with open(args.json_output, 'w') as f:
-      json.dump(data, f)
-
-  return 0
-
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/third_party/catapult/devil/devil/android/tools/cpufreq.py b/third_party/catapult/devil/devil/android/tools/cpufreq.py
deleted file mode 100755
index 97deaf0..0000000
--- a/third_party/catapult/devil/devil/android/tools/cpufreq.py
+++ /dev/null
@@ -1,87 +0,0 @@
-#! /usr/bin/env python
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""A script to manipulate device CPU frequency."""
-
-import argparse
-import os
-import pprint
-import sys
-
-if __name__ == '__main__':
-  sys.path.append(
-      os.path.abspath(os.path.join(os.path.dirname(__file__),
-                                   '..', '..', '..')))
-
-from devil import devil_env
-from devil.android import device_utils
-from devil.android.perf import perf_control
-from devil.utils import run_tests_helper
-
-
-def SetScalingGovernor(device, args):
-  p = perf_control.PerfControl(device)
-  p.SetScalingGovernor(args.governor)
-
-
-def GetScalingGovernor(device, _args):
-  p = perf_control.PerfControl(device)
-  for cpu, governor in p.GetScalingGovernor():
-    print '%s %s: %s' % (str(device), cpu, governor)
-
-
-def ListAvailableGovernors(device, _args):
-  p = perf_control.PerfControl(device)
-  for cpu, governors in p.ListAvailableGovernors():
-    print '%s %s: %s' % (str(device), cpu, pprint.pformat(governors))
-
-
-def main(raw_args):
-  parser = argparse.ArgumentParser()
-  parser.add_argument(
-      '--adb-path',
-      help='ADB binary path.')
-  parser.add_argument(
-      '--device', dest='devices', action='append', default=[],
-      help='Devices for which the governor should be set. Defaults to all.')
-  parser.add_argument(
-      '-v', '--verbose', action='count',
-      help='Log more.')
-
-  subparsers = parser.add_subparsers()
-
-  set_governor = subparsers.add_parser('set-governor')
-  set_governor.add_argument(
-      'governor',
-      help='Desired CPU governor.')
-  set_governor.set_defaults(func=SetScalingGovernor)
-
-  get_governor = subparsers.add_parser('get-governor')
-  get_governor.set_defaults(func=GetScalingGovernor)
-
-  list_governors = subparsers.add_parser('list-governors')
-  list_governors.set_defaults(func=ListAvailableGovernors)
-
-  args = parser.parse_args(raw_args)
-
-  run_tests_helper.SetLogLevel(args.verbose)
-
-  devil_dynamic_config = devil_env.EmptyConfig()
-  if args.adb_path:
-    devil_dynamic_config['dependencies'].update(
-        devil_env.LocalConfigItem(
-            'adb', devil_env.GetPlatform(), args.adb_path))
-  devil_env.config.Initialize(configs=[devil_dynamic_config])
-
-  devices = device_utils.DeviceUtils.HealthyDevices(device_arg=args.devices)
-
-  parallel_devices = device_utils.DeviceUtils.parallel(devices)
-  parallel_devices.pMap(args.func, args)
-
-  return 0
-
-
-if __name__ == '__main__':
-  sys.exit(main(sys.argv[1:]))
diff --git a/third_party/catapult/devil/devil/android/tools/device_monitor.py b/third_party/catapult/devil/devil/android/tools/device_monitor.py
deleted file mode 100755
index 49214a9..0000000
--- a/third_party/catapult/devil/devil/android/tools/device_monitor.py
+++ /dev/null
@@ -1,231 +0,0 @@
-#!/usr/bin/env python
-# 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.
-
-"""Launches a daemon to monitor android device temperatures & status.
-
-This script will repeatedly poll the given devices for their temperatures and
-status every 60 seconds and dump the stats to file on the host.
-"""
-
-import argparse
-import collections
-import json
-import logging
-import logging.handlers
-import os
-import re
-import socket
-import sys
-import time
-
-if __name__ == '__main__':
-  sys.path.append(
-      os.path.abspath(os.path.join(os.path.dirname(__file__),
-                                   '..', '..', '..')))
-
-from devil import devil_env
-from devil.android import battery_utils
-from devil.android import device_blacklist
-from devil.android import device_errors
-from devil.android import device_utils
-
-
-# Various names of sensors used to measure cpu temp
-CPU_TEMP_SENSORS = [
-  # most nexus devices
-  'tsens_tz_sensor0',
-  # android one
-  'mtktscpu',
-  # nexus 9
-  'CPU-therm',
-]
-
-DEVICE_FILE_VERSION = 1
-# TODO(bpastene): Remove the old file once sysmon has been updated to read the
-# new status file.
-DEVICE_FILES = [
-    os.path.join(os.path.expanduser('~'), 'android_device_status.json'),
-    os.path.join(
-        os.path.expanduser('~'), '.android',
-        '%s__android_device_status.json' % socket.gethostname().split('.')[0]
-    ),
-]
-
-MEM_INFO_REGEX = re.compile(r'.*?\:\s*(\d+)\s*kB') # ex: 'MemTotal:   185735 kB'
-
-
-def get_device_status(device):
-  """Polls the given device for various info.
-
-    Returns: A dict of the following format:
-    {
-      'battery': {
-        'level': 100,
-        'temperature': 123
-      },
-      'build': {
-        'build.id': 'ABC12D',
-        'product.device': 'chickenofthesea'
-      },
-      'mem': {
-        'avail': 1000000,
-        'total': 1234567,
-      },
-      'processes': 123,
-      'state': 'good',
-      'temp': {
-        'some_sensor': 30
-      },
-      'uptime': 1234.56,
-    }
-  """
-  status = collections.defaultdict(dict)
-
-  # Battery
-  battery = battery_utils.BatteryUtils(device)
-  battery_info = battery.GetBatteryInfo()
-  try:
-    level = int(battery_info.get('level'))
-  except (KeyError, TypeError, ValueError):
-    level = None
-  if level and level >= 0 and level <= 100:
-    status['battery']['level'] = level
-  try:
-    temperature = int(battery_info.get('temperature'))
-  except (KeyError, TypeError, ValueError):
-    temperature = None
-  if temperature:
-    status['battery']['temperature'] = temperature
-
-  # Build
-  status['build']['build.id'] = device.build_id
-  status['build']['product.device'] = device.build_product
-
-  # Memory
-  mem_info = ''
-  try:
-    mem_info = device.ReadFile('/proc/meminfo')
-  except device_errors.AdbShellCommandFailedError:
-    logging.exception('Unable to read /proc/meminfo')
-  for line in mem_info.splitlines():
-    match = MEM_INFO_REGEX.match(line)
-    if match:
-      try:
-        value = int(match.group(1))
-      except ValueError:
-        continue
-      key = line.split(':')[0].strip()
-      if 'MemTotal' == key:
-        status['mem']['total'] = value
-      elif 'MemFree' == key:
-        status['mem']['free'] = value
-
-  # Process
-  try:
-    # TODO(catapult:#3215): Migrate to device.GetPids()
-    lines = device.RunShellCommand(['ps'], check_return=True)
-    status['processes'] = len(lines) - 1 # Ignore the header row.
-  except device_errors.AdbShellCommandFailedError:
-    logging.exception('Unable to count process list.')
-
-  # CPU Temps
-  # Find a thermal sensor that matches one in CPU_TEMP_SENSORS and read its
-  # temperature.
-  files = []
-  try:
-    files = device.RunShellCommand(
-        'grep -lE "%s" /sys/class/thermal/thermal_zone*/type' % '|'.join(
-            CPU_TEMP_SENSORS), shell=True, check_return=True)
-  except device_errors.AdbShellCommandFailedError:
-    logging.exception('Unable to list thermal sensors.')
-  for f in files:
-    try:
-      sensor_name = device.ReadFile(f).strip()
-      temp = float(device.ReadFile(f[:-4] + 'temp').strip()) # s/type^/temp
-      status['temp'][sensor_name] = temp
-    except (device_errors.AdbShellCommandFailedError, ValueError):
-      logging.exception('Unable to read thermal sensor %s', f)
-
-  # Uptime
-  try:
-    uptimes = device.ReadFile('/proc/uptime').split()
-    status['uptime'] = float(uptimes[0]) # Take the first field (actual uptime)
-  except (device_errors.AdbShellCommandFailedError, ValueError):
-    logging.exception('Unable to read /proc/uptime')
-
-  status['state'] = 'available'
-  return status
-
-
-def get_all_status(blacklist):
-  status_dict = {
-      'version': DEVICE_FILE_VERSION,
-      'devices': {},
-  }
-
-  healthy_devices = device_utils.DeviceUtils.HealthyDevices(blacklist)
-  parallel_devices = device_utils.DeviceUtils.parallel(healthy_devices)
-  results = parallel_devices.pMap(get_device_status).pGet(None)
-
-  status_dict['devices'] = {
-      device.serial: result for device, result in zip(healthy_devices, results)
-  }
-
-  if blacklist:
-    for device, reason in blacklist.Read().iteritems():
-      status_dict['devices'][device] = {
-          'state': reason.get('reason', 'blacklisted')}
-
-  status_dict['timestamp'] = time.time()
-  return status_dict
-
-
-def main(argv):
-  """Launches the device monitor.
-
-  Polls the devices for their battery and cpu temperatures and scans the
-  blacklist file every 60 seconds and dumps the data to DEVICE_FILE.
-  """
-
-  parser = argparse.ArgumentParser(
-      description='Launches the device monitor.')
-  parser.add_argument('--adb-path', help='Path to adb binary.')
-  parser.add_argument('--blacklist-file', help='Path to device blacklist file.')
-  args = parser.parse_args(argv)
-
-  logger = logging.getLogger()
-  logger.setLevel(logging.DEBUG)
-  handler = logging.handlers.RotatingFileHandler(
-      '/tmp/device_monitor.log', maxBytes=10 * 1024 * 1024, backupCount=5)
-  fmt = logging.Formatter('%(asctime)s %(levelname)s %(message)s',
-                          datefmt='%y%m%d %H:%M:%S')
-  handler.setFormatter(fmt)
-  logger.addHandler(handler)
-
-  devil_dynamic_config = devil_env.EmptyConfig()
-  if args.adb_path:
-    devil_dynamic_config['dependencies'].update(
-        devil_env.LocalConfigItem(
-            'adb', devil_env.GetPlatform(), args.adb_path))
-
-  devil_env.config.Initialize(configs=[devil_dynamic_config])
-
-  blacklist = (device_blacklist.Blacklist(args.blacklist_file)
-               if args.blacklist_file else None)
-
-  logging.info('Device monitor running with pid %d, adb: %s, blacklist: %s',
-               os.getpid(), args.adb_path, args.blacklist_file)
-  while True:
-    start = time.time()
-    status_dict = get_all_status(blacklist)
-    for device_file in DEVICE_FILES:
-      with open(device_file, 'wb') as f:
-        json.dump(status_dict, f, indent=2, sort_keys=True)
-    logging.info('Got status of all devices in %.2fs.', time.time() - start)
-    time.sleep(60)
-
-
-if __name__ == '__main__':
-  sys.exit(main(sys.argv[1:]))
diff --git a/third_party/catapult/devil/devil/android/tools/device_monitor_test.py b/third_party/catapult/devil/devil/android/tools/device_monitor_test.py
deleted file mode 100755
index e39e324..0000000
--- a/third_party/catapult/devil/devil/android/tools/device_monitor_test.py
+++ /dev/null
@@ -1,168 +0,0 @@
-#!/usr/bin/env python
-# 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.
-
-import os
-import sys
-import unittest
-
-if __name__ == '__main__':
-  sys.path.append(
-        os.path.abspath(os.path.join(os.path.dirname(__file__),
-                                           '..', '..', '..')))
-
-from devil import devil_env
-from devil.android import device_errors
-from devil.android import device_utils
-from devil.android.tools import device_monitor
-
-with devil_env.SysPath(devil_env.PYMOCK_PATH):
-  import mock  # pylint: disable=import-error
-
-
-class DeviceMonitorTest(unittest.TestCase):
-
-  def setUp(self):
-    self.device = mock.Mock(spec=device_utils.DeviceUtils,
-        serial='device_cereal', build_id='abc123', build_product='clownfish')
-    self.file_contents = {
-        '/proc/meminfo': """
-                         MemTotal:        1234567 kB
-                         MemFree:         1000000 kB
-                         MemUsed:          234567 kB
-                         """,
-        '/sys/class/thermal/thermal_zone0/type': 'CPU-therm',
-        '/sys/class/thermal/thermal_zone0/temp': '30',
-        '/proc/uptime': '12345 99999',
-    }
-    self.device.ReadFile = mock.MagicMock(
-        side_effect=lambda file_name: self.file_contents[file_name])
-
-    self.cmd_outputs = {
-        'ps': ['headers', 'p1', 'p2', 'p3', 'p4', 'p5'],
-        'grep': ['/sys/class/thermal/thermal_zone0/type'],
-    }
-
-    def mock_run_shell(cmd, **_kwargs):
-      args = cmd.split() if isinstance(cmd, basestring) else cmd
-      try:
-        return self.cmd_outputs[args[0]]
-      except KeyError:
-        raise device_errors.AdbShellCommandFailedError(cmd, None, None)
-
-    self.device.RunShellCommand = mock.MagicMock(side_effect=mock_run_shell)
-
-    self.battery = mock.Mock()
-    self.battery.GetBatteryInfo = mock.MagicMock(
-        return_value={'level': '80', 'temperature': '123'})
-
-    self.expected_status = {
-      'device_cereal': {
-        'processes': 5,
-        'temp': {
-          'CPU-therm': 30.0
-         },
-         'battery': {
-           'temperature': 123,
-           'level': 80
-         },
-         'uptime': 12345.0,
-         'mem': {
-           'total': 1234567,
-           'free': 1000000
-         },
-         'build': {
-           'build.id': 'abc123',
-           'product.device': 'clownfish',
-         },
-         'state': 'available',
-      }
-    }
-
-  @mock.patch('devil.android.battery_utils.BatteryUtils')
-  @mock.patch('devil.android.device_utils.DeviceUtils.HealthyDevices')
-  def test_getStats(self, get_devices, get_battery):
-    get_devices.return_value = [self.device]
-    get_battery.return_value = self.battery
-
-    status = device_monitor.get_all_status(None)
-    self.assertEquals(self.expected_status, status['devices'])
-
-  @mock.patch('devil.android.battery_utils.BatteryUtils')
-  @mock.patch('devil.android.device_utils.DeviceUtils.HealthyDevices')
-  def test_getStatsNoBattery(self, get_devices, get_battery):
-    get_devices.return_value = [self.device]
-    get_battery.return_value = self.battery
-    broken_battery_info = mock.Mock()
-    broken_battery_info.GetBatteryInfo = mock.MagicMock(
-        return_value={'level': '-1', 'temperature': 'not_a_number'})
-    get_battery.return_value = broken_battery_info
-
-    # Should be same status dict but without battery stats.
-    expected_status_no_battery = self.expected_status.copy()
-    expected_status_no_battery['device_cereal'].pop('battery')
-
-    status = device_monitor.get_all_status(None)
-    self.assertEquals(expected_status_no_battery, status['devices'])
-
-  @mock.patch('devil.android.battery_utils.BatteryUtils')
-  @mock.patch('devil.android.device_utils.DeviceUtils.HealthyDevices')
-  def test_getStatsNoPs(self, get_devices, get_battery):
-    get_devices.return_value = [self.device]
-    get_battery.return_value = self.battery
-    del self.cmd_outputs['ps']  # Throw exception on run shell ps command.
-
-    # Should be same status dict but without process stats.
-    expected_status_no_ps = self.expected_status.copy()
-    expected_status_no_ps['device_cereal'].pop('processes')
-
-    status = device_monitor.get_all_status(None)
-    self.assertEquals(expected_status_no_ps, status['devices'])
-
-  @mock.patch('devil.android.battery_utils.BatteryUtils')
-  @mock.patch('devil.android.device_utils.DeviceUtils.HealthyDevices')
-  def test_getStatsNoSensors(self, get_devices, get_battery):
-    get_devices.return_value = [self.device]
-    get_battery.return_value = self.battery
-    del self.cmd_outputs['grep']  # Throw exception on run shell grep command.
-
-    # Should be same status dict but without temp stats.
-    expected_status_no_temp = self.expected_status.copy()
-    expected_status_no_temp['device_cereal'].pop('temp')
-
-    status = device_monitor.get_all_status(None)
-    self.assertEquals(expected_status_no_temp, status['devices'])
-
-  @mock.patch('devil.android.battery_utils.BatteryUtils')
-  @mock.patch('devil.android.device_utils.DeviceUtils.HealthyDevices')
-  def test_getStatsWithBlacklist(self, get_devices, get_battery):
-    get_devices.return_value = [self.device]
-    get_battery.return_value = self.battery
-    blacklist = mock.Mock()
-    blacklist.Read = mock.MagicMock(
-        return_value={'bad_device': {'reason': 'offline'}})
-
-    # Should be same status dict but with extra blacklisted device.
-    expected_status = self.expected_status.copy()
-    expected_status['bad_device'] = {'state': 'offline'}
-
-    status = device_monitor.get_all_status(blacklist)
-    self.assertEquals(expected_status, status['devices'])
-
-  @mock.patch('devil.android.battery_utils.BatteryUtils')
-  @mock.patch('devil.android.device_utils.DeviceUtils.HealthyDevices')
-  def test_brokenTempValue(self, get_devices, get_battery):
-    self.file_contents['/sys/class/thermal/thermal_zone0/temp'] = 'n0t a numb3r'
-    get_devices.return_value = [self.device]
-    get_battery.return_value = self.battery
-
-    expected_status_no_temp = self.expected_status.copy()
-    expected_status_no_temp['device_cereal'].pop('temp')
-
-    status = device_monitor.get_all_status(None)
-    self.assertEquals(self.expected_status, status['devices'])
-
-
-if __name__ == '__main__':
-  sys.exit(unittest.main())
diff --git a/third_party/catapult/devil/devil/android/tools/device_recovery.py b/third_party/catapult/devil/devil/android/tools/device_recovery.py
deleted file mode 100755
index 57857b1..0000000
--- a/third_party/catapult/devil/devil/android/tools/device_recovery.py
+++ /dev/null
@@ -1,208 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""A script to recover devices in a known bad state."""
-
-import argparse
-import logging
-import os
-import psutil
-import signal
-import sys
-
-if __name__ == '__main__':
-  sys.path.append(
-      os.path.abspath(os.path.join(os.path.dirname(__file__),
-                                   '..', '..', '..')))
-from devil import devil_env
-from devil.android import device_blacklist
-from devil.android import device_errors
-from devil.android import device_utils
-from devil.android.tools import device_status
-from devil.utils import lsusb
-# TODO(jbudorick): Resolve this after experimenting w/ disabling the USB reset.
-from devil.utils import reset_usb  # pylint: disable=unused-import
-from devil.utils import run_tests_helper
-
-logger = logging.getLogger(__name__)
-
-
-def KillAllAdb():
-  def get_all_adb():
-    for p in psutil.process_iter():
-      try:
-        if 'adb' in p.name:
-          yield p
-      except (psutil.NoSuchProcess, psutil.AccessDenied):
-        pass
-
-  for sig in [signal.SIGTERM, signal.SIGQUIT, signal.SIGKILL]:
-    for p in get_all_adb():
-      try:
-        logger.info('kill %d %d (%s [%s])', sig, p.pid, p.name,
-                    ' '.join(p.cmdline))
-        p.send_signal(sig)
-      except (psutil.NoSuchProcess, psutil.AccessDenied):
-        pass
-  for p in get_all_adb():
-    try:
-      logger.error('Unable to kill %d (%s [%s])', p.pid, p.name,
-                   ' '.join(p.cmdline))
-    except (psutil.NoSuchProcess, psutil.AccessDenied):
-      pass
-
-
-def RecoverDevice(device, blacklist, should_reboot=lambda device: True):
-  if device_status.IsBlacklisted(device.adb.GetDeviceSerial(),
-                                 blacklist):
-    logger.debug('%s is blacklisted, skipping recovery.', str(device))
-    return
-
-  if should_reboot(device):
-    try:
-      device.WaitUntilFullyBooted(retries=0)
-    except (device_errors.CommandTimeoutError,
-            device_errors.CommandFailedError):
-      logger.exception('Failure while waiting for %s. '
-                       'Attempting to recover.', str(device))
-    try:
-      try:
-        device.Reboot(block=False, timeout=5, retries=0)
-      except device_errors.CommandTimeoutError:
-        logger.warning('Timed out while attempting to reboot %s normally.'
-                       'Attempting alternative reboot.', str(device))
-        # The device drops offline before we can grab the exit code, so
-        # we don't check for status.
-        try:
-          device.adb.Root()
-        finally:
-          # We are already in a failure mode, attempt to reboot regardless of
-          # what device.adb.Root() returns. If the sysrq reboot fails an
-          # exception willbe thrown at that level.
-          device.adb.Shell('echo b > /proc/sysrq-trigger', expect_status=None,
-                           timeout=5, retries=0)
-    except device_errors.CommandFailedError:
-      logger.exception('Failed to reboot %s.', str(device))
-      if blacklist:
-        blacklist.Extend([device.adb.GetDeviceSerial()],
-                         reason='reboot_failure')
-    except device_errors.CommandTimeoutError:
-      logger.exception('Timed out while rebooting %s.', str(device))
-      if blacklist:
-        blacklist.Extend([device.adb.GetDeviceSerial()],
-                         reason='reboot_timeout')
-
-    try:
-      device.WaitUntilFullyBooted(
-          retries=0, timeout=device.REBOOT_DEFAULT_TIMEOUT)
-    except device_errors.CommandFailedError:
-      logger.exception('Failure while waiting for %s.', str(device))
-      if blacklist:
-        blacklist.Extend([device.adb.GetDeviceSerial()],
-                         reason='reboot_failure')
-    except device_errors.CommandTimeoutError:
-      logger.exception('Timed out while waiting for %s.', str(device))
-      if blacklist:
-        blacklist.Extend([device.adb.GetDeviceSerial()],
-                         reason='reboot_timeout')
-
-
-def RecoverDevices(devices, blacklist, enable_usb_reset=False):
-  """Attempts to recover any inoperable devices in the provided list.
-
-  Args:
-    devices: The list of devices to attempt to recover.
-    blacklist: The current device blacklist, which will be used then
-      reset.
-  """
-
-  statuses = device_status.DeviceStatus(devices, blacklist)
-
-  should_restart_usb = set(
-      status['serial'] for status in statuses
-      if (not status['usb_status']
-          or status['adb_status'] in ('offline', 'missing')))
-  should_restart_adb = should_restart_usb.union(set(
-      status['serial'] for status in statuses
-      if status['adb_status'] == 'unauthorized'))
-  should_reboot_device = should_restart_adb.union(set(
-      status['serial'] for status in statuses
-      if status['blacklisted']))
-
-  logger.debug('Should restart USB for:')
-  for d in should_restart_usb:
-    logger.debug('  %s', d)
-  logger.debug('Should restart ADB for:')
-  for d in should_restart_adb:
-    logger.debug('  %s', d)
-  logger.debug('Should reboot:')
-  for d in should_reboot_device:
-    logger.debug('  %s', d)
-
-  if blacklist:
-    blacklist.Reset()
-
-  if should_restart_adb:
-    KillAllAdb()
-  for serial in should_restart_usb:
-    try:
-      # TODO(crbug.com/642194): Resetting may be causing more harm
-      # (specifically, kernel panics) than it does good.
-      if enable_usb_reset:
-        reset_usb.reset_android_usb(serial)
-      else:
-        logger.warning('USB reset disabled for %s (crbug.com/642914)',
-                       serial)
-    except IOError:
-      logger.exception('Unable to reset USB for %s.', serial)
-      if blacklist:
-        blacklist.Extend([serial], reason='USB failure')
-    except device_errors.DeviceUnreachableError:
-      logger.exception('Unable to reset USB for %s.', serial)
-      if blacklist:
-        blacklist.Extend([serial], reason='offline')
-
-  device_utils.DeviceUtils.parallel(devices).pMap(
-      RecoverDevice, blacklist,
-      should_reboot=lambda device: device.serial in should_reboot_device)
-
-
-def main():
-  parser = argparse.ArgumentParser()
-  parser.add_argument('--adb-path',
-                      help='Absolute path to the adb binary to use.')
-  parser.add_argument('--blacklist-file', help='Device blacklist JSON file.')
-  parser.add_argument('--known-devices-file', action='append', default=[],
-                      dest='known_devices_files',
-                      help='Path to known device lists.')
-  parser.add_argument('--enable-usb-reset', action='store_true',
-                      help='Reset USB if necessary.')
-  parser.add_argument('-v', '--verbose', action='count', default=1,
-                      help='Log more information.')
-
-  args = parser.parse_args()
-  run_tests_helper.SetLogLevel(args.verbose)
-
-  devil_dynamic_config = devil_env.EmptyConfig()
-  if args.adb_path:
-    devil_dynamic_config['dependencies'].update(
-        devil_env.LocalConfigItem(
-            'adb', devil_env.GetPlatform(), args.adb_path))
-  devil_env.config.Initialize(configs=[devil_dynamic_config])
-
-  blacklist = (device_blacklist.Blacklist(args.blacklist_file)
-               if args.blacklist_file
-               else None)
-
-  expected_devices = device_status.GetExpectedDevices(args.known_devices_files)
-  usb_devices = set(lsusb.get_android_devices())
-  devices = [device_utils.DeviceUtils(s)
-             for s in expected_devices.union(usb_devices)]
-
-  RecoverDevices(devices, blacklist, enable_usb_reset=args.enable_usb_reset)
-
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/third_party/catapult/devil/devil/android/tools/device_status.py b/third_party/catapult/devil/devil/android/tools/device_status.py
deleted file mode 100755
index 167d66c..0000000
--- a/third_party/catapult/devil/devil/android/tools/device_status.py
+++ /dev/null
@@ -1,313 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""A script to keep track of devices across builds and report state."""
-
-import argparse
-import json
-import logging
-import os
-import re
-import sys
-
-if __name__ == '__main__':
-  sys.path.append(
-      os.path.abspath(os.path.join(os.path.dirname(__file__),
-                                   '..', '..', '..')))
-from devil import devil_env
-from devil.android import battery_utils
-from devil.android import device_blacklist
-from devil.android import device_errors
-from devil.android import device_list
-from devil.android import device_utils
-from devil.android.sdk import adb_wrapper
-from devil.constants import exit_codes
-from devil.utils import lsusb
-from devil.utils import run_tests_helper
-
-logger = logging.getLogger(__name__)
-
-_RE_DEVICE_ID = re.compile(r'Device ID = (\d+)')
-
-
-def IsBlacklisted(serial, blacklist):
-  return blacklist and serial in blacklist.Read()
-
-
-def _BatteryStatus(device, blacklist):
-  battery_info = {}
-  try:
-    battery = battery_utils.BatteryUtils(device)
-    battery_info = battery.GetBatteryInfo(timeout=5)
-    battery_level = int(battery_info.get('level', 100))
-
-    if battery_level < 15:
-      logger.error('Critically low battery level (%d)', battery_level)
-      battery = battery_utils.BatteryUtils(device)
-      if not battery.GetCharging():
-        battery.SetCharging(True)
-      if blacklist:
-        blacklist.Extend([device.adb.GetDeviceSerial()], reason='low_battery')
-
-  except device_errors.CommandFailedError:
-    logger.exception('Failed to get battery information for %s',
-                     str(device))
-
-  return battery_info
-
-
-def _IMEISlice(device):
-  imei_slice = ''
-  try:
-    for l in device.RunShellCommand(['dumpsys', 'iphonesubinfo'],
-                                    check_return=True, timeout=5):
-      m = _RE_DEVICE_ID.match(l)
-      if m:
-        imei_slice = m.group(1)[-6:]
-  except device_errors.CommandFailedError:
-    logger.exception('Failed to get IMEI slice for %s', str(device))
-
-  return imei_slice
-
-
-def DeviceStatus(devices, blacklist):
-  """Generates status information for the given devices.
-
-  Args:
-    devices: The devices to generate status for.
-    blacklist: The current device blacklist.
-  Returns:
-    A dict of the following form:
-    {
-      '<serial>': {
-        'serial': '<serial>',
-        'adb_status': str,
-        'usb_status': bool,
-        'blacklisted': bool,
-        # only if the device is connected and not blacklisted
-        'type': ro.build.product,
-        'build': ro.build.id,
-        'build_detail': ro.build.fingerprint,
-        'battery': {
-          ...
-        },
-        'imei_slice': str,
-        'wifi_ip': str,
-      },
-      ...
-    }
-  """
-  adb_devices = {
-    a[0].GetDeviceSerial(): a
-    for a in adb_wrapper.AdbWrapper.Devices(desired_state=None, long_list=True)
-  }
-  usb_devices = set(lsusb.get_android_devices())
-
-  def blacklisting_device_status(device):
-    serial = device.adb.GetDeviceSerial()
-    adb_status = (
-        adb_devices[serial][1] if serial in adb_devices
-        else 'missing')
-    usb_status = bool(serial in usb_devices)
-
-    device_status = {
-      'serial': serial,
-      'adb_status': adb_status,
-      'usb_status': usb_status,
-    }
-
-    if not IsBlacklisted(serial, blacklist):
-      if adb_status == 'device':
-        try:
-          build_product = device.build_product
-          build_id = device.build_id
-          build_fingerprint = device.build_fingerprint
-          build_description = device.build_description
-          wifi_ip = device.GetProp('dhcp.wlan0.ipaddress')
-          battery_info = _BatteryStatus(device, blacklist)
-          imei_slice = _IMEISlice(device)
-
-          if (device.product_name == 'mantaray' and
-              battery_info.get('AC powered', None) != 'true'):
-            logger.error('Mantaray device not connected to AC power.')
-
-          device_status.update({
-            'ro.build.product': build_product,
-            'ro.build.id': build_id,
-            'ro.build.fingerprint': build_fingerprint,
-            'ro.build.description': build_description,
-            'battery': battery_info,
-            'imei_slice': imei_slice,
-            'wifi_ip': wifi_ip,
-          })
-
-        except device_errors.CommandFailedError:
-          logger.exception('Failure while getting device status for %s.',
-                           str(device))
-          if blacklist:
-            blacklist.Extend([serial], reason='status_check_failure')
-
-        except device_errors.CommandTimeoutError:
-          logger.exception('Timeout while getting device status for %s.',
-                           str(device))
-          if blacklist:
-            blacklist.Extend([serial], reason='status_check_timeout')
-
-      elif blacklist:
-        blacklist.Extend([serial],
-                         reason=adb_status if usb_status else 'offline')
-
-    device_status['blacklisted'] = IsBlacklisted(serial, blacklist)
-
-    return device_status
-
-  parallel_devices = device_utils.DeviceUtils.parallel(devices)
-  statuses = parallel_devices.pMap(blacklisting_device_status).pGet(None)
-  return statuses
-
-
-def _LogStatuses(statuses):
-  # Log the state of all devices.
-  for status in statuses:
-    logger.info(status['serial'])
-    adb_status = status.get('adb_status')
-    blacklisted = status.get('blacklisted')
-    logger.info('  USB status: %s',
-                'online' if status.get('usb_status') else 'offline')
-    logger.info('  ADB status: %s', adb_status)
-    logger.info('  Blacklisted: %s', str(blacklisted))
-    if adb_status == 'device' and not blacklisted:
-      logger.info('  Device type: %s', status.get('ro.build.product'))
-      logger.info('  OS build: %s', status.get('ro.build.id'))
-      logger.info('  OS build fingerprint: %s',
-                  status.get('ro.build.fingerprint'))
-      logger.info('  Battery state:')
-      for k, v in status.get('battery', {}).iteritems():
-        logger.info('    %s: %s', k, v)
-      logger.info('  IMEI slice: %s', status.get('imei_slice'))
-      logger.info('  WiFi IP: %s', status.get('wifi_ip'))
-
-
-def _WriteBuildbotFile(file_path, statuses):
-  buildbot_path, _ = os.path.split(file_path)
-  if os.path.exists(buildbot_path):
-    with open(file_path, 'w') as f:
-      for status in statuses:
-        try:
-          if status['adb_status'] == 'device':
-            f.write('{serial} {adb_status} {build_product} {build_id} '
-                    '{temperature:.1f}C {level}%\n'.format(
-                serial=status['serial'],
-                adb_status=status['adb_status'],
-                build_product=status['type'],
-                build_id=status['build'],
-                temperature=float(status['battery']['temperature']) / 10,
-                level=status['battery']['level']
-            ))
-          elif status.get('usb_status', False):
-            f.write('{serial} {adb_status}\n'.format(
-                serial=status['serial'],
-                adb_status=status['adb_status']
-            ))
-          else:
-            f.write('{serial} offline\n'.format(
-                serial=status['serial']
-            ))
-        except Exception: # pylint: disable=broad-except
-          pass
-
-
-def GetExpectedDevices(known_devices_files):
-  expected_devices = set()
-  try:
-    for path in known_devices_files:
-      if os.path.exists(path):
-        expected_devices.update(device_list.GetPersistentDeviceList(path))
-      else:
-        logger.warning('Could not find known devices file: %s', path)
-  except IOError:
-    logger.warning('Problem reading %s, skipping.', path)
-
-  logger.info('Expected devices:')
-  for device in expected_devices:
-    logger.info('  %s', device)
-  return expected_devices
-
-
-def AddArguments(parser):
-  parser.add_argument('--json-output',
-                      help='Output JSON information into a specified file.')
-  parser.add_argument('--adb-path',
-                      help='Absolute path to the adb binary to use.')
-  parser.add_argument('--blacklist-file', help='Device blacklist JSON file.')
-  parser.add_argument('--known-devices-file', action='append', default=[],
-                      dest='known_devices_files',
-                      help='Path to known device lists.')
-  parser.add_argument('--buildbot-path', '-b',
-                      default='/home/chrome-bot/.adb_device_info',
-                      help='Absolute path to buildbot file location')
-  parser.add_argument('-v', '--verbose', action='count', default=1,
-                      help='Log more information.')
-  parser.add_argument('-w', '--overwrite-known-devices-files',
-                      action='store_true',
-                      help='If set, overwrites known devices files wiht new '
-                           'values.')
-
-def main():
-  parser = argparse.ArgumentParser()
-  AddArguments(parser)
-  args = parser.parse_args()
-
-  run_tests_helper.SetLogLevel(args.verbose)
-
-  devil_dynamic_config = devil_env.EmptyConfig()
-
-  if args.adb_path:
-    devil_dynamic_config['dependencies'].update(
-        devil_env.LocalConfigItem(
-            'adb', devil_env.GetPlatform(), args.adb_path))
-  devil_env.config.Initialize(configs=[devil_dynamic_config])
-
-  blacklist = (device_blacklist.Blacklist(args.blacklist_file)
-               if args.blacklist_file
-               else None)
-
-  expected_devices = GetExpectedDevices(args.known_devices_files)
-  usb_devices = set(lsusb.get_android_devices())
-  devices = [device_utils.DeviceUtils(s)
-             for s in expected_devices.union(usb_devices)]
-
-  statuses = DeviceStatus(devices, blacklist)
-
-  # Log the state of all devices.
-  _LogStatuses(statuses)
-
-  # Update the last devices file(s).
-  if args.overwrite_known_devices_files:
-    for path in args.known_devices_files:
-      device_list.WritePersistentDeviceList(
-          path, [status['serial'] for status in statuses])
-
-  # Write device info to file for buildbot info display.
-  _WriteBuildbotFile(args.buildbot_path, statuses)
-
-  # Dump the device statuses to JSON.
-  if args.json_output:
-    with open(args.json_output, 'wb') as f:
-      f.write(json.dumps(
-          statuses, indent=4, sort_keys=True, separators=(',', ': ')))
-
-  live_devices = [status['serial'] for status in statuses
-                  if (status['adb_status'] == 'device'
-                      and not IsBlacklisted(status['serial'], blacklist))]
-
-  # If all devices failed, or if there are no devices, it's an infra error.
-  if not live_devices:
-    logger.error('No available devices.')
-  return 0 if live_devices else exit_codes.INFRA
-
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/third_party/catapult/devil/devil/android/tools/flash_device.py b/third_party/catapult/devil/devil/android/tools/flash_device.py
deleted file mode 100755
index d13c1df..0000000
--- a/third_party/catapult/devil/devil/android/tools/flash_device.py
+++ /dev/null
@@ -1,70 +0,0 @@
-#!/usr/bin/env python
-# 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.
-
-import argparse
-import logging
-import os
-import sys
-
-if __name__ == '__main__':
-  sys.path.append(os.path.abspath(os.path.join(
-      os.path.dirname(__file__), '..', '..', '..')))
-from devil.android import device_blacklist
-from devil.android import device_utils
-from devil.android import fastboot_utils
-from devil.android.tools import script_common
-from devil.constants import exit_codes
-from devil.utils import run_tests_helper
-
-logger = logging.getLogger(__name__)
-
-
-def main():
-  parser = argparse.ArgumentParser()
-  parser.add_argument('build_path', help='Path to android build.')
-  parser.add_argument('-d', '--device', dest='devices', action='append',
-                      help='Device(s) to flash.')
-  parser.add_argument('-v', '--verbose', default=0, action='count',
-                      help='Verbose level (multiple times for more)')
-  parser.add_argument('-w', '--wipe', action='store_true',
-                       help='If set, wipes user data')
-  parser.add_argument('--blacklist-file', help='Device blacklist file.')
-  args = parser.parse_args()
-  run_tests_helper.SetLogLevel(args.verbose)
-
-  if args.blacklist_file:
-    blacklist = device_blacklist.Blacklist(args.blacklist_file).Read()
-    if blacklist:
-      logger.critical('Device(s) in blacklist, not flashing devices:')
-      for key in blacklist:
-        logger.critical('  %s', key)
-      return exit_codes.INFRA
-
-  flashed_devices = []
-  failed_devices = []
-
-  def flash(device):
-    fastboot = fastboot_utils.FastbootUtils(device)
-    try:
-      fastboot.FlashDevice(args.build_path, wipe=args.wipe)
-      flashed_devices.append(device)
-    except Exception:  # pylint: disable=broad-except
-      logger.exception('Device %s failed to flash.', str(device))
-      failed_devices.append(device)
-
-  devices = script_common.GetDevices(args.devices, args.blacklist_file)
-  device_utils.DeviceUtils.parallel(devices).pMap(flash)
-
-  if flashed_devices:
-    logger.info('The following devices were flashed:')
-    logger.info('  %s', ' '.join(str(d) for d in flashed_devices))
-  if failed_devices:
-    logger.critical('The following devices failed to flash:')
-    logger.critical('  %s', ' '.join(str(d) for d in failed_devices))
-    return exit_codes.INFRA
-  return 0
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/third_party/catapult/devil/devil/android/tools/keyboard.py b/third_party/catapult/devil/devil/android/tools/keyboard.py
deleted file mode 100755
index 31daf59..0000000
--- a/third_party/catapult/devil/devil/android/tools/keyboard.py
+++ /dev/null
@@ -1,129 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Use your keyboard as your phone's keyboard. Experimental."""
-
-import argparse
-import copy
-import os
-import sys
-import termios
-import tty
-
-if __name__ == '__main__':
-  sys.path.append(
-      os.path.abspath(os.path.join(os.path.dirname(__file__),
-                                   '..', '..', '..')))
-from devil import base_error
-from devil.android.sdk import keyevent
-from devil.android.tools import script_common
-from devil.utils import run_tests_helper
-
-
-_KEY_MAPPING = {
-  '\x08': keyevent.KEYCODE_DEL,
-  '\x0a': keyevent.KEYCODE_ENTER,
-  ' ': keyevent.KEYCODE_SPACE,
-  '.': keyevent.KEYCODE_PERIOD,
-  '0': keyevent.KEYCODE_0,
-  '1': keyevent.KEYCODE_1,
-  '2': keyevent.KEYCODE_2,
-  '3': keyevent.KEYCODE_3,
-  '4': keyevent.KEYCODE_4,
-  '5': keyevent.KEYCODE_5,
-  '6': keyevent.KEYCODE_6,
-  '7': keyevent.KEYCODE_7,
-  '8': keyevent.KEYCODE_8,
-  '9': keyevent.KEYCODE_9,
-  'a': keyevent.KEYCODE_A,
-  'b': keyevent.KEYCODE_B,
-  'c': keyevent.KEYCODE_C,
-  'd': keyevent.KEYCODE_D,
-  'e': keyevent.KEYCODE_E,
-  'f': keyevent.KEYCODE_F,
-  'g': keyevent.KEYCODE_G,
-  'h': keyevent.KEYCODE_H,
-  'i': keyevent.KEYCODE_I,
-  'j': keyevent.KEYCODE_J,
-  'k': keyevent.KEYCODE_K,
-  'l': keyevent.KEYCODE_L,
-  'm': keyevent.KEYCODE_M,
-  'n': keyevent.KEYCODE_N,
-  'o': keyevent.KEYCODE_O,
-  'p': keyevent.KEYCODE_P,
-  'q': keyevent.KEYCODE_Q,
-  'r': keyevent.KEYCODE_R,
-  's': keyevent.KEYCODE_S,
-  't': keyevent.KEYCODE_T,
-  'u': keyevent.KEYCODE_U,
-  'v': keyevent.KEYCODE_V,
-  'w': keyevent.KEYCODE_W,
-  'x': keyevent.KEYCODE_X,
-  'y': keyevent.KEYCODE_Y,
-  'z': keyevent.KEYCODE_Z,
-  '\x7f': keyevent.KEYCODE_DEL,
-}
-
-
-def Keyboard(device, stream_itr):
-  try:
-    for c in stream_itr:
-      k = _KEY_MAPPING.get(c)
-      if k:
-        device.SendKeyEvent(k)
-      else:
-        print
-        print '(No mapping for character 0x%x)' % ord(c)
-  except KeyboardInterrupt:
-    pass
-
-
-def AddArguments(parser):
-  parser.add_argument('-d', '--device', action='append', dest='devices',
-                      metavar='DEVICE', help='device serial')
-  parser.add_argument('-v', '--verbose', action='count', help='print more')
-
-
-class MultipleDevicesError(base_error.BaseError):
-  def __init__(self, devices):
-    super(MultipleDevicesError, self).__init__(
-        'More than one device found: %s' % ', '.join(str(d) for d in devices))
-
-
-def main(raw_args):
-  parser = argparse.ArgumentParser(
-      description="Use your keyboard as your phone's keyboard.")
-  AddArguments(parser)
-  args = parser.parse_args(raw_args)
-
-  run_tests_helper.SetLogLevel(args.verbose)
-
-  devices = script_common.GetDevices(args.devices, None)
-  if len(devices) > 1:
-    raise MultipleDevicesError(devices)
-
-  def next_char():
-    while True:
-      yield sys.stdin.read(1)
-
-  try:
-    fd = sys.stdin.fileno()
-
-    # See man 3 termios for more info on what this is doing.
-    old_attrs = termios.tcgetattr(fd)
-    new_attrs = copy.deepcopy(old_attrs)
-    new_attrs[tty.LFLAG] = new_attrs[tty.LFLAG] & ~(termios.ICANON)
-    new_attrs[tty.CC][tty.VMIN] = 1
-    new_attrs[tty.CC][tty.VTIME] = 0
-    termios.tcsetattr(fd, termios.TCSAFLUSH, new_attrs)
-
-    Keyboard(devices[0], next_char())
-  finally:
-    termios.tcsetattr(fd, termios.TCSAFLUSH, old_attrs)
-  return 0
-
-
-if __name__ == '__main__':
-  sys.exit(main(sys.argv[1:]))
diff --git a/third_party/catapult/devil/devil/android/tools/provision_devices.py b/third_party/catapult/devil/devil/android/tools/provision_devices.py
deleted file mode 100755
index 7374290..0000000
--- a/third_party/catapult/devil/devil/android/tools/provision_devices.py
+++ /dev/null
@@ -1,637 +0,0 @@
-#!/usr/bin/env python
-#
-# Copyright (c) 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.
-
-"""Provisions Android devices with settings required for bots.
-
-Usage:
-  ./provision_devices.py [-d <device serial number>]
-"""
-
-import argparse
-import datetime
-import json
-import logging
-import os
-import posixpath
-import re
-import sys
-import time
-
-# Import _strptime before threaded code. datetime.datetime.strptime is
-# threadsafe except for the initial import of the _strptime module.
-# See crbug.com/584730 and https://bugs.python.org/issue7980.
-import _strptime  # pylint: disable=unused-import
-
-if __name__ == '__main__':
-  sys.path.append(
-      os.path.abspath(os.path.join(os.path.dirname(__file__),
-                                   '..', '..', '..')))
-
-from devil import devil_env
-from devil.android import battery_utils
-from devil.android import device_blacklist
-from devil.android import device_errors
-from devil.android import device_temp_file
-from devil.android import device_utils
-from devil.android import settings
-from devil.android.constants import chrome
-from devil.android.sdk import adb_wrapper
-from devil.android.sdk import intent
-from devil.android.sdk import keyevent
-from devil.android.sdk import version_codes
-from devil.android.tools import script_common
-from devil.constants import exit_codes
-from devil.utils import run_tests_helper
-from devil.utils import timeout_retry
-
-logger = logging.getLogger(__name__)
-
-_SYSTEM_APP_DIRECTORIES = ['/system/app/', '/system/priv-app/']
-_SYSTEM_WEBVIEW_NAMES = ['webview', 'WebViewGoogle']
-_CHROME_PACKAGE_REGEX = re.compile('.*chrom.*')
-_TOMBSTONE_REGEX = re.compile('tombstone.*')
-
-
-class _DEFAULT_TIMEOUTS(object):
-  # L can take a while to reboot after a wipe.
-  LOLLIPOP = 600
-  PRE_LOLLIPOP = 180
-
-  HELP_TEXT = '{}s on L, {}s on pre-L'.format(LOLLIPOP, PRE_LOLLIPOP)
-
-
-class ProvisionStep(object):
-
-  def __init__(self, cmd, reboot=False):
-    self.cmd = cmd
-    self.reboot = reboot
-
-
-def ProvisionDevices(
-    devices,
-    blacklist_file,
-    adb_key_files=None,
-    disable_location=False,
-    disable_mock_location=False,
-    disable_network=False,
-    disable_system_chrome=False,
-    emulators=False,
-    enable_java_debug=False,
-    max_battery_temp=None,
-    min_battery_level=None,
-    output_device_blacklist=None,
-    reboot_timeout=None,
-    remove_system_webview=False,
-    system_app_remove_list=None,
-    wipe=True):
-  blacklist = (device_blacklist.Blacklist(blacklist_file)
-               if blacklist_file
-               else None)
-  system_app_remove_list = system_app_remove_list or []
-  try:
-    devices = script_common.GetDevices(devices, blacklist)
-  except device_errors.NoDevicesError:
-    logging.error('No available devices to provision.')
-    if blacklist:
-      logging.error('Local device blacklist: %s', blacklist.Read())
-    raise
-  devices = [d for d in devices
-             if not emulators or d.adb.is_emulator]
-  parallel_devices = device_utils.DeviceUtils.parallel(devices)
-
-  steps = []
-  if wipe:
-    steps += [ProvisionStep(lambda d: Wipe(d, adb_key_files), reboot=True)]
-  steps += [ProvisionStep(
-      lambda d: SetProperties(d, enable_java_debug, disable_location,
-                              disable_mock_location),
-      reboot=not emulators)]
-
-  if disable_network:
-    steps.append(ProvisionStep(DisableNetwork))
-
-  if disable_system_chrome:
-    steps.append(ProvisionStep(DisableSystemChrome))
-
-  if max_battery_temp:
-    steps.append(ProvisionStep(
-        lambda d: WaitForTemperature(d, max_battery_temp)))
-
-  if min_battery_level:
-    steps.append(ProvisionStep(
-        lambda d: WaitForCharge(d, min_battery_level)))
-
-  if remove_system_webview:
-    system_app_remove_list.extend(_SYSTEM_WEBVIEW_NAMES)
-
-  if system_app_remove_list:
-    steps.append(ProvisionStep(
-        lambda d: RemoveSystemApps(d, system_app_remove_list)))
-
-  steps.append(ProvisionStep(SetDate))
-  steps.append(ProvisionStep(CheckExternalStorage))
-
-  parallel_devices.pMap(ProvisionDevice, steps, blacklist, reboot_timeout)
-
-  blacklisted_devices = blacklist.Read() if blacklist else []
-  if output_device_blacklist:
-    with open(output_device_blacklist, 'w') as f:
-      json.dump(blacklisted_devices, f)
-  if all(d in blacklisted_devices for d in devices):
-    raise device_errors.NoDevicesError
-  return 0
-
-
-def ProvisionDevice(device, steps, blacklist, reboot_timeout=None):
-  try:
-    if not reboot_timeout:
-      if device.build_version_sdk >= version_codes.LOLLIPOP:
-        reboot_timeout = _DEFAULT_TIMEOUTS.LOLLIPOP
-      else:
-        reboot_timeout = _DEFAULT_TIMEOUTS.PRE_LOLLIPOP
-
-    for step in steps:
-      try:
-        device.WaitUntilFullyBooted(timeout=reboot_timeout, retries=0)
-      except device_errors.CommandTimeoutError:
-        logger.error('Device did not finish booting. Will try to reboot.')
-        device.Reboot(timeout=reboot_timeout)
-      step.cmd(device)
-      if step.reboot:
-        device.Reboot(False, retries=0)
-        device.adb.WaitForDevice()
-
-  except device_errors.CommandTimeoutError:
-    logger.exception('Timed out waiting for device %s. Adding to blacklist.',
-                     str(device))
-    if blacklist:
-      blacklist.Extend([str(device)], reason='provision_timeout')
-
-  except device_errors.CommandFailedError:
-    logger.exception('Failed to provision device %s. Adding to blacklist.',
-                     str(device))
-    if blacklist:
-      blacklist.Extend([str(device)], reason='provision_failure')
-
-
-def Wipe(device, adb_key_files=None):
-  if (device.IsUserBuild() or
-      device.build_version_sdk >= version_codes.MARSHMALLOW):
-    WipeChromeData(device)
-
-    package = "com.google.android.gms"
-    version_name = device.GetApplicationVersion(package)
-    logger.info("Version name for %s is %s", package, version_name)
-  else:
-    WipeDevice(device, adb_key_files)
-
-
-def WipeChromeData(device):
-  """Wipes chrome specific data from device
-
-  (1) uninstall any app whose name matches *chrom*, except
-      com.android.chrome, which is the chrome stable package. Doing so also
-      removes the corresponding dirs under /data/data/ and /data/app/
-  (2) remove any dir under /data/app-lib/ whose name matches *chrom*
-  (3) remove any files under /data/tombstones/ whose name matches "tombstone*"
-  (4) remove /data/local.prop if there is any
-  (5) remove /data/local/chrome-command-line if there is any
-  (6) remove anything under /data/local/.config/ if the dir exists
-      (this is telemetry related)
-  (7) remove anything under /data/local/tmp/
-
-  Arguments:
-    device: the device to wipe
-  """
-  try:
-    if device.IsUserBuild():
-      _UninstallIfMatch(device, _CHROME_PACKAGE_REGEX,
-                        chrome.PACKAGE_INFO['chrome_stable'].package)
-      device.RunShellCommand('rm -rf %s/*' % device.GetExternalStoragePath(),
-                             shell=True, check_return=True)
-      device.RunShellCommand('rm -rf /data/local/tmp/*',
-                             shell=True, check_return=True)
-    else:
-      device.EnableRoot()
-      _UninstallIfMatch(device, _CHROME_PACKAGE_REGEX,
-                        chrome.PACKAGE_INFO['chrome_stable'].package)
-      _WipeUnderDirIfMatch(device, '/data/app-lib/', _CHROME_PACKAGE_REGEX)
-      _WipeUnderDirIfMatch(device, '/data/tombstones/', _TOMBSTONE_REGEX)
-
-      _WipeFileOrDir(device, '/data/local.prop')
-      _WipeFileOrDir(device, '/data/local/chrome-command-line')
-      _WipeFileOrDir(device, '/data/local/.config/')
-      _WipeFileOrDir(device, '/data/local/tmp/')
-      device.RunShellCommand('rm -rf %s/*' % device.GetExternalStoragePath(),
-                             shell=True, check_return=True)
-  except device_errors.CommandFailedError:
-    logger.exception('Possible failure while wiping the device. '
-                     'Attempting to continue.')
-
-
-def _UninstallIfMatch(device, pattern, app_to_keep):
-  installed_packages = device.RunShellCommand(
-      ['pm', 'list', 'packages'], check_return=True)
-  installed_system_packages = [
-      pkg.split(':')[1] for pkg in device.RunShellCommand(
-          ['pm', 'list', 'packages', '-s'], check_return=True)]
-  for package_output in installed_packages:
-    package = package_output.split(":")[1]
-    if pattern.match(package) and not package == app_to_keep:
-      if not device.IsUserBuild() or package not in installed_system_packages:
-        device.Uninstall(package)
-
-
-def _WipeUnderDirIfMatch(device, path, pattern):
-  for filename in device.ListDirectory(path):
-    if pattern.match(filename):
-      _WipeFileOrDir(device, posixpath.join(path, filename))
-
-
-def _WipeFileOrDir(device, path):
-  if device.PathExists(path):
-    device.RunShellCommand(['rm', '-rf', path], check_return=True)
-
-
-def WipeDevice(device, adb_key_files):
-  """Wipes data from device, keeping only the adb_keys for authorization.
-
-  After wiping data on a device that has been authorized, adb can still
-  communicate with the device, but after reboot the device will need to be
-  re-authorized because the adb keys file is stored in /data/misc/adb/.
-  Thus, adb_keys file is rewritten so the device does not need to be
-  re-authorized.
-
-  Arguments:
-    device: the device to wipe
-  """
-  try:
-    device.EnableRoot()
-    device_authorized = device.FileExists(adb_wrapper.ADB_KEYS_FILE)
-    if device_authorized:
-      adb_keys = device.ReadFile(adb_wrapper.ADB_KEYS_FILE,
-                                 as_root=True).splitlines()
-    device.RunShellCommand(['wipe', 'data'],
-                           as_root=True, check_return=True)
-    device.adb.WaitForDevice()
-
-    if device_authorized:
-      adb_keys_set = set(adb_keys)
-      for adb_key_file in adb_key_files or []:
-        try:
-          with open(adb_key_file, 'r') as f:
-            adb_public_keys = f.readlines()
-          adb_keys_set.update(adb_public_keys)
-        except IOError:
-          logger.warning('Unable to find adb keys file %s.', adb_key_file)
-      _WriteAdbKeysFile(device, '\n'.join(adb_keys_set))
-  except device_errors.CommandFailedError:
-    logger.exception('Possible failure while wiping the device. '
-                     'Attempting to continue.')
-
-
-def _WriteAdbKeysFile(device, adb_keys_string):
-  dir_path = posixpath.dirname(adb_wrapper.ADB_KEYS_FILE)
-  device.RunShellCommand(['mkdir', '-p', dir_path],
-                         as_root=True, check_return=True)
-  device.RunShellCommand(['restorecon', dir_path],
-                         as_root=True, check_return=True)
-  device.WriteFile(adb_wrapper.ADB_KEYS_FILE, adb_keys_string, as_root=True)
-  device.RunShellCommand(['restorecon', adb_wrapper.ADB_KEYS_FILE],
-                         as_root=True, check_return=True)
-
-
-def SetProperties(device, enable_java_debug, disable_location,
-                  disable_mock_location):
-  try:
-    device.EnableRoot()
-  except device_errors.CommandFailedError as e:
-    logger.warning(str(e))
-
-  if not device.IsUserBuild():
-    _ConfigureLocalProperties(device, enable_java_debug)
-  else:
-    logger.warning('Cannot configure properties in user builds.')
-  settings.ConfigureContentSettings(
-      device, settings.DETERMINISTIC_DEVICE_SETTINGS)
-  if disable_location:
-    settings.ConfigureContentSettings(
-        device, settings.DISABLE_LOCATION_SETTINGS)
-  else:
-    settings.ConfigureContentSettings(
-        device, settings.ENABLE_LOCATION_SETTINGS)
-
-  if disable_mock_location:
-    settings.ConfigureContentSettings(
-        device, settings.DISABLE_MOCK_LOCATION_SETTINGS)
-  else:
-    settings.ConfigureContentSettings(
-        device, settings.ENABLE_MOCK_LOCATION_SETTINGS)
-
-  settings.SetLockScreenSettings(device)
-
-  # Some device types can momentarily disappear after setting properties.
-  device.adb.WaitForDevice()
-
-
-def DisableNetwork(device):
-  settings.ConfigureContentSettings(
-      device, settings.NETWORK_DISABLED_SETTINGS)
-  if device.build_version_sdk >= version_codes.MARSHMALLOW:
-    # Ensure that NFC is also switched off.
-    device.RunShellCommand(['svc', 'nfc', 'disable'],
-                           as_root=True, check_return=True)
-
-
-def DisableSystemChrome(device):
-  # The system chrome version on the device interferes with some tests.
-  device.RunShellCommand(['pm', 'disable', 'com.android.chrome'],
-                         check_return=True)
-
-
-def _RemoveSystemApp(device, system_app):
-  found_paths = []
-  for directory in _SYSTEM_APP_DIRECTORIES:
-    path = os.path.join(directory, system_app)
-    if device.PathExists(path):
-      found_paths.append(path)
-  if not found_paths:
-    logger.warning('Could not find install location for system app %s',
-                   system_app)
-  device.RemovePath(found_paths, force=True, recursive=True)
-
-def RemoveSystemApps(device, system_app_remove_list):
-  """Attempts to remove the provided system apps from the given device.
-
-  Arguments:
-    device: The device to remove the system apps from.
-    system_app_remove_list: A list of app names to remove, e.g.
-        ['WebViewGoogle', 'GoogleVrCore']
-  """
-  device.EnableRoot()
-  if device.HasRoot():
-    # Disable Marshmallow's Verity security feature
-    if device.build_version_sdk >= version_codes.MARSHMALLOW:
-      logger.info('Disabling Verity on %s', device.serial)
-      device.adb.DisableVerity()
-      device.Reboot()
-      device.WaitUntilFullyBooted()
-      device.EnableRoot()
-
-    device.adb.Remount()
-    device.RunShellCommand(['stop'], check_return=True)
-    for system_app in system_app_remove_list:
-      _RemoveSystemApp(device, system_app)
-    device.RunShellCommand(['start'], check_return=True)
-  else:
-    raise device_errors.CommandFailedError(
-        'Failed to remove system apps from non-rooted device', str(device))
-
-
-def _ConfigureLocalProperties(device, java_debug=True):
-  """Set standard readonly testing device properties prior to reboot."""
-  local_props = [
-      'persist.sys.usb.config=adb',
-      'ro.monkey=1',
-      'ro.test_harness=1',
-      'ro.audio.silent=1',
-      'ro.setupwizard.mode=DISABLED',
-      ]
-  if java_debug:
-    local_props.append(
-        '%s=all' % device_utils.DeviceUtils.JAVA_ASSERT_PROPERTY)
-    local_props.append('debug.checkjni=1')
-  try:
-    device.WriteFile(
-        device.LOCAL_PROPERTIES_PATH,
-        '\n'.join(local_props), as_root=True)
-    # Android will not respect the local props file if it is world writable.
-    device.RunShellCommand(
-        ['chmod', '644', device.LOCAL_PROPERTIES_PATH],
-        as_root=True, check_return=True)
-  except device_errors.CommandFailedError:
-    logger.exception('Failed to configure local properties.')
-
-
-def FinishProvisioning(device):
-  # The lockscreen can't be disabled on user builds, so send a keyevent
-  # to unlock it.
-  if device.IsUserBuild():
-    device.SendKeyEvent(keyevent.KEYCODE_MENU)
-
-
-def WaitForCharge(device, min_battery_level):
-  battery = battery_utils.BatteryUtils(device)
-  try:
-    battery.ChargeDeviceToLevel(min_battery_level)
-  except device_errors.DeviceChargingError:
-    device.Reboot()
-    battery.ChargeDeviceToLevel(min_battery_level)
-
-
-def WaitForTemperature(device, max_battery_temp):
-  try:
-    battery = battery_utils.BatteryUtils(device)
-    battery.LetBatteryCoolToTemperature(max_battery_temp)
-  except device_errors.CommandFailedError:
-    logger.exception('Unable to let battery cool to specified temperature.')
-
-
-def SetDate(device):
-  def _set_and_verify_date():
-    if device.build_version_sdk >= version_codes.MARSHMALLOW:
-      date_format = '%m%d%H%M%Y.%S'
-      set_date_command = ['date', '-u']
-      get_date_command = ['date', '-u']
-    else:
-      date_format = '%Y%m%d.%H%M%S'
-      set_date_command = ['date', '-s']
-      get_date_command = ['date']
-
-    # TODO(jbudorick): This is wrong on pre-M devices -- get/set are
-    # dealing in local time, but we're setting based on GMT.
-    strgmtime = time.strftime(date_format, time.gmtime())
-    set_date_command.append(strgmtime)
-    device.RunShellCommand(set_date_command, as_root=True, check_return=True)
-
-    get_date_command.append('+"%Y%m%d.%H%M%S"')
-    device_time = device.RunShellCommand(
-        get_date_command, check_return=True,
-        as_root=True, single_line=True).replace('"', '')
-    device_time = datetime.datetime.strptime(device_time, "%Y%m%d.%H%M%S")
-    correct_time = datetime.datetime.strptime(strgmtime, date_format)
-    tdelta = (correct_time - device_time).seconds
-    if tdelta <= 1:
-      logger.info('Date/time successfully set on %s', device)
-      return True
-    else:
-      logger.error('Date mismatch. Device: %s Correct: %s',
-                   device_time.isoformat(), correct_time.isoformat())
-      return False
-
-  # Sometimes the date is not set correctly on the devices. Retry on failure.
-  if device.IsUserBuild():
-    # TODO(bpastene): Figure out how to set the date & time on user builds.
-    pass
-  else:
-    if not timeout_retry.WaitFor(
-        _set_and_verify_date, wait_period=1, max_tries=2):
-      raise device_errors.CommandFailedError(
-          'Failed to set date & time.', device_serial=str(device))
-    device.EnableRoot()
-    device.BroadcastIntent(
-        intent.Intent(action='android.intent.action.TIME_SET'))
-
-
-def LogDeviceProperties(device):
-  props = device.RunShellCommand(['getprop'], check_return=True)
-  for prop in props:
-    logger.info('  %s', prop)
-
-
-def CheckExternalStorage(device):
-  """Checks that storage is writable and if not makes it writable.
-
-  Arguments:
-    device: The device to check.
-  """
-  try:
-    with device_temp_file.DeviceTempFile(
-        device.adb, suffix='.sh', dir=device.GetExternalStoragePath()) as f:
-      device.WriteFile(f.name, 'test')
-  except device_errors.CommandFailedError:
-    logger.info('External storage not writable. Remounting / as RW')
-    device.RunShellCommand(['mount', '-o', 'remount,rw', '/'],
-                           check_return=True, as_root=True)
-    device.EnableRoot()
-    with device_temp_file.DeviceTempFile(
-        device.adb, suffix='.sh', dir=device.GetExternalStoragePath()) as f:
-      device.WriteFile(f.name, 'test')
-
-
-def main(raw_args):
-  # Recommended options on perf bots:
-  # --disable-network
-  #     TODO(tonyg): We eventually want network on. However, currently radios
-  #     can cause perfbots to drain faster than they charge.
-  # --min-battery-level 95
-  #     Some perf bots run benchmarks with USB charging disabled which leads
-  #     to gradual draining of the battery. We must wait for a full charge
-  #     before starting a run in order to keep the devices online.
-
-  parser = argparse.ArgumentParser(
-      description='Provision Android devices with settings required for bots.')
-  parser.add_argument(
-      '--adb-key-files', type=str, nargs='+',
-      help='list of adb keys to push to device')
-  parser.add_argument(
-      '--adb-path',
-      help='Absolute path to the adb binary to use.')
-  parser.add_argument('--blacklist-file', help='Device blacklist JSON file.')
-  parser.add_argument(
-      '-d', '--device', metavar='SERIAL', action='append', dest='devices',
-      help='the serial number of the device to be provisioned '
-           '(the default is to provision all devices attached)')
-  parser.add_argument(
-      '--disable-location', action='store_true',
-      help='disable Google location services on devices')
-  parser.add_argument(
-      '--disable-mock-location', action='store_true', default=False,
-      help='Set ALLOW_MOCK_LOCATION to false')
-  parser.add_argument(
-      '--disable-network', action='store_true',
-      help='disable network access on devices')
-  parser.add_argument(
-      '--disable-java-debug', action='store_false',
-      dest='enable_java_debug', default=True,
-      help='disable Java property asserts and JNI checking')
-  parser.add_argument(
-      '--disable-system-chrome', action='store_true',
-      help='Disable the system chrome from devices.')
-  parser.add_argument(
-      '--emulators', action='store_true',
-      help='provision only emulators and ignore usb devices '
-           '(this will not wipe emulators)')
-  parser.add_argument(
-      '--max-battery-temp', type=int, metavar='NUM',
-      help='Wait for the battery to have this temp or lower.')
-  parser.add_argument(
-      '--min-battery-level', type=int, metavar='NUM',
-      help='wait for the device to reach this minimum battery'
-           ' level before trying to continue')
-  parser.add_argument(
-      '--output-device-blacklist',
-      help='Json file to output the device blacklist.')
-  parser.add_argument(
-      '--reboot-timeout', metavar='SECS', type=int,
-      help='when wiping the device, max number of seconds to'
-           ' wait after each reboot '
-           '(default: %s)' % _DEFAULT_TIMEOUTS.HELP_TEXT)
-  parser.add_argument(
-      '--remove-system-apps', nargs='*', dest='system_app_remove_list',
-      help='the names of system apps to remove')
-  parser.add_argument(
-      '--remove-system-webview', action='store_true',
-      help='Remove the system webview from devices.')
-  parser.add_argument(
-      '--skip-wipe', action='store_true', default=False,
-      help='do not wipe device data during provisioning')
-  parser.add_argument(
-      '-v', '--verbose', action='count', default=1,
-      help='Log more information.')
-
-  # No-op arguments for compatibility with build/android/provision_devices.py.
-  # TODO(jbudorick): Remove these once all callers have stopped using them.
-  parser.add_argument(
-      '--chrome-specific-wipe', action='store_true',
-      help=argparse.SUPPRESS)
-  parser.add_argument(
-      '--phase', action='append',
-      help=argparse.SUPPRESS)
-  parser.add_argument(
-      '-r', '--auto-reconnect', action='store_true',
-      help=argparse.SUPPRESS)
-  parser.add_argument(
-      '-t', '--target',
-      help=argparse.SUPPRESS)
-
-  args = parser.parse_args(raw_args)
-
-  run_tests_helper.SetLogLevel(args.verbose)
-
-  devil_dynamic_config = devil_env.EmptyConfig()
-  if args.adb_path:
-    devil_dynamic_config['dependencies'].update(
-        devil_env.LocalConfigItem(
-            'adb', devil_env.GetPlatform(), args.adb_path))
-
-  devil_env.config.Initialize(configs=[devil_dynamic_config])
-
-  try:
-    return ProvisionDevices(
-        args.devices,
-        args.blacklist_file,
-        adb_key_files=args.adb_key_files,
-        disable_location=args.disable_location,
-        disable_mock_location=args.disable_mock_location,
-        disable_network=args.disable_network,
-        disable_system_chrome=args.disable_system_chrome,
-        emulators=args.emulators,
-        enable_java_debug=args.enable_java_debug,
-        max_battery_temp=args.max_battery_temp,
-        min_battery_level=args.min_battery_level,
-        output_device_blacklist=args.output_device_blacklist,
-        reboot_timeout=args.reboot_timeout,
-        remove_system_webview=args.remove_system_webview,
-        system_app_remove_list=args.system_app_remove_list,
-        wipe=not args.skip_wipe and not args.emulators)
-  except (device_errors.DeviceUnreachableError, device_errors.NoDevicesError):
-    logging.exception('Unable to provision local devices.')
-    return exit_codes.INFRA
-
-
-if __name__ == '__main__':
-  sys.exit(main(sys.argv[1:]))
diff --git a/third_party/catapult/devil/devil/android/tools/screenshot.py b/third_party/catapult/devil/devil/android/tools/screenshot.py
deleted file mode 100755
index a264c4f..0000000
--- a/third_party/catapult/devil/devil/android/tools/screenshot.py
+++ /dev/null
@@ -1,59 +0,0 @@
-#!/usr/bin/env python
-# 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.
-
-"""Takes a screenshot from an Android device."""
-
-import argparse
-import logging
-import os
-import sys
-
-if __name__ == '__main__':
-  sys.path.append(os.path.abspath(os.path.join(
-      os.path.dirname(__file__), '..', '..', '..')))
-from devil.android import device_utils
-from devil.android.tools import script_common
-
-logger = logging.getLogger(__name__)
-
-
-def main():
-  # Parse options.
-  parser = argparse.ArgumentParser(description=__doc__)
-  parser.add_argument('-d', '--device', dest='devices', action='append',
-                      help='Serial number of Android device to use.')
-  parser.add_argument('--blacklist-file', help='Device blacklist JSON file.')
-  parser.add_argument('-f', '--file', metavar='FILE',
-                      help='Save result to file instead of generating a '
-                           'timestamped file name.')
-  parser.add_argument('-v', '--verbose', action='store_true',
-                      help='Verbose logging.')
-  parser.add_argument('host_file', nargs='?',
-                      help='File to which the screenshot will be saved.')
-
-  args = parser.parse_args()
-
-  host_file = args.host_file or args.file
-
-  if args.verbose:
-    logging.getLogger().setLevel(logging.DEBUG)
-
-  devices = script_common.GetDevices(args.devices, args.blacklist_file)
-
-  def screenshot(device):
-    f = None
-    if host_file:
-      root, ext = os.path.splitext(host_file)
-      f = '%s_%s%s' % (root, str(device), ext)
-    f = device.TakeScreenshot(f)
-    print 'Screenshot for device %s written to %s' % (
-        str(device), os.path.abspath(f))
-
-  device_utils.DeviceUtils.parallel(devices).pMap(screenshot)
-  return 0
-
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/third_party/catapult/devil/devil/android/tools/script_common.py b/third_party/catapult/devil/devil/android/tools/script_common.py
deleted file mode 100644
index f91ad5e..0000000
--- a/third_party/catapult/devil/devil/android/tools/script_common.py
+++ /dev/null
@@ -1,29 +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.
-
-from devil.android import device_blacklist
-from devil.android import device_errors
-from devil.android import device_utils
-
-
-def GetDevices(requested_devices, blacklist_file):
-  if not isinstance(blacklist_file, device_blacklist.Blacklist):
-    blacklist_file = (device_blacklist.Blacklist(blacklist_file)
-                      if blacklist_file
-                      else None)
-
-  devices = device_utils.DeviceUtils.HealthyDevices(blacklist_file)
-  if not devices:
-    raise device_errors.NoDevicesError()
-  elif requested_devices:
-    requested = set(requested_devices)
-    available = set(str(d) for d in devices)
-    missing = requested.difference(available)
-    if missing:
-      raise device_errors.DeviceUnreachableError(next(iter(missing)))
-    return sorted(device_utils.DeviceUtils(d)
-                  for d in available.intersection(requested))
-  else:
-    return devices
-
diff --git a/third_party/catapult/devil/devil/android/tools/script_common_test.py b/third_party/catapult/devil/devil/android/tools/script_common_test.py
deleted file mode 100755
index a226764..0000000
--- a/third_party/catapult/devil/devil/android/tools/script_common_test.py
+++ /dev/null
@@ -1,58 +0,0 @@
-#!/usr/bin/env python
-# 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.
-
-
-import sys
-import unittest
-
-from devil import devil_env
-from devil.android import device_errors
-from devil.android import device_utils
-from devil.android.tools import script_common
-
-with devil_env.SysPath(devil_env.PYMOCK_PATH):
-  import mock  # pylint: disable=import-error
-
-
-class ScriptCommonTest(unittest.TestCase):
-
-  def testGetDevices_noSpecs(self):
-    devices = [
-        device_utils.DeviceUtils('123'),
-        device_utils.DeviceUtils('456'),
-    ]
-    with mock.patch('devil.android.device_utils.DeviceUtils.HealthyDevices',
-                    return_value=devices):
-      self.assertEquals(
-          devices,
-          script_common.GetDevices(None, None))
-
-  def testGetDevices_withDevices(self):
-    devices = [
-        device_utils.DeviceUtils('123'),
-        device_utils.DeviceUtils('456'),
-    ]
-    with mock.patch('devil.android.device_utils.DeviceUtils.HealthyDevices',
-                    return_value=devices):
-      self.assertEquals(
-          [device_utils.DeviceUtils('456')],
-          script_common.GetDevices(['456'], None))
-
-  def testGetDevices_missingDevice(self):
-    with mock.patch('devil.android.device_utils.DeviceUtils.HealthyDevices',
-                    return_value=[device_utils.DeviceUtils('123')]):
-      with self.assertRaises(device_errors.DeviceUnreachableError):
-        script_common.GetDevices(['456'], None)
-
-  def testGetDevices_noDevices(self):
-    with mock.patch('devil.android.device_utils.DeviceUtils.HealthyDevices',
-                    return_value=[]):
-      with self.assertRaises(device_errors.NoDevicesError):
-        script_common.GetDevices(None, None)
-
-
-if __name__ == '__main__':
-  sys.exit(unittest.main())
-
diff --git a/third_party/catapult/devil/devil/android/tools/video_recorder.py b/third_party/catapult/devil/devil/android/tools/video_recorder.py
deleted file mode 100755
index a91e649..0000000
--- a/third_party/catapult/devil/devil/android/tools/video_recorder.py
+++ /dev/null
@@ -1,175 +0,0 @@
-#!/usr/bin/env python
-# 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.
-
-"""Captures a video from an Android device."""
-
-import argparse
-import logging
-import os
-import threading
-import time
-import sys
-
-if __name__ == '__main__':
-  sys.path.append(os.path.abspath(os.path.join(
-      os.path.dirname(__file__), '..', '..', '..')))
-from devil.android import device_signal
-from devil.android import device_utils
-from devil.android.tools import script_common
-from devil.utils import cmd_helper
-from devil.utils import reraiser_thread
-from devil.utils import timeout_retry
-
-logger = logging.getLogger(__name__)
-
-
-class VideoRecorder(object):
-  """Records a screen capture video from an Android Device (KitKat or newer)."""
-
-  def __init__(self, device, megabits_per_second=4, size=None,
-               rotate=False):
-    """Creates a VideoRecorder instance.
-
-    Args:
-      device: DeviceUtils instance.
-      host_file: Path to the video file to store on the host.
-      megabits_per_second: Video bitrate in megabits per second. Allowed range
-                           from 0.1 to 100 mbps.
-      size: Video frame size tuple (width, height) or None to use the device
-            default.
-      rotate: If True, the video will be rotated 90 degrees.
-    """
-    self._bit_rate = megabits_per_second * 1000 * 1000
-    self._device = device
-    self._device_file = (
-        '%s/screen-recording.mp4' % device.GetExternalStoragePath())
-    self._recorder_thread = None
-    self._rotate = rotate
-    self._size = size
-    self._started = threading.Event()
-
-  def __enter__(self):
-    self.Start()
-
-  def Start(self, timeout=None):
-    """Start recording video."""
-    def screenrecord_started():
-      return bool(self._device.GetPids('screenrecord'))
-
-    if screenrecord_started():
-      raise Exception("Can't run multiple concurrent video captures.")
-
-    self._started.clear()
-    self._recorder_thread = reraiser_thread.ReraiserThread(self._Record)
-    self._recorder_thread.start()
-    timeout_retry.WaitFor(
-        screenrecord_started, wait_period=1, max_tries=timeout)
-    self._started.wait(timeout)
-
-  def _Record(self):
-    cmd = ['screenrecord', '--verbose', '--bit-rate', str(self._bit_rate)]
-    if self._rotate:
-      cmd += ['--rotate']
-    if self._size:
-      cmd += ['--size', '%dx%d' % self._size]
-    cmd += [self._device_file]
-    for line in self._device.adb.IterShell(
-        ' '.join(cmd_helper.SingleQuote(i) for i in cmd), None):
-      if line.startswith('Content area is '):
-        self._started.set()
-
-  def __exit__(self, _exc_type, _exc_value, _traceback):
-    self.Stop()
-
-  def Stop(self):
-    """Stop recording video."""
-    if not self._device.KillAll('screenrecord', signum=device_signal.SIGINT,
-                                quiet=True):
-      logger.warning('Nothing to kill: screenrecord was not running')
-    self._recorder_thread.join()
-
-  def Pull(self, host_file=None):
-    """Pull resulting video file from the device.
-
-    Args:
-      host_file: Path to the video file to store on the host.
-    Returns:
-      Output video file name on the host.
-    """
-    # TODO(jbudorick): Merge filename generation with the logic for doing so in
-    # DeviceUtils.
-    host_file_name = (
-        host_file
-        or 'screen-recording-%s-%s.mp4' % (
-            str(self._device),
-            time.strftime('%Y%m%dT%H%M%S', time.localtime())))
-    host_file_name = os.path.abspath(host_file_name)
-    self._device.PullFile(self._device_file, host_file_name)
-    self._device.RemovePath(self._device_file, force=True)
-    return host_file_name
-
-
-def main():
-  # Parse options.
-  parser = argparse.ArgumentParser(description=__doc__)
-  parser.add_argument('-d', '--device', dest='devices', action='append',
-                      help='Serial number of Android device to use.')
-  parser.add_argument('--blacklist-file', help='Device blacklist JSON file.')
-  parser.add_argument('-f', '--file', metavar='FILE',
-                      help='Save result to file instead of generating a '
-                           'timestamped file name.')
-  parser.add_argument('-v', '--verbose', action='store_true',
-                      help='Verbose logging.')
-  parser.add_argument('-b', '--bitrate', default=4, type=float,
-                      help='Bitrate in megabits/s, from 0.1 to 100 mbps, '
-                           '%default mbps by default.')
-  parser.add_argument('-r', '--rotate', action='store_true',
-                      help='Rotate video by 90 degrees.')
-  parser.add_argument('-s', '--size', metavar='WIDTHxHEIGHT',
-                      help='Frame size to use instead of the device '
-                           'screen size.')
-  parser.add_argument('host_file', nargs='?',
-                      help='File to which the video capture will be written.')
-
-  args = parser.parse_args()
-
-  host_file = args.host_file or args.file
-
-  if args.verbose:
-    logging.getLogger().setLevel(logging.DEBUG)
-
-  size = (tuple(int(i) for i in args.size.split('x'))
-          if args.size
-          else None)
-
-  def record_video(device, stop_recording):
-    recorder = VideoRecorder(
-        device, megabits_per_second=args.bitrate, size=size, rotate=args.rotate)
-    with recorder:
-      stop_recording.wait()
-
-    f = None
-    if host_file:
-      root, ext = os.path.splitext(host_file)
-      f = '%s_%s%s' % (root, str(device), ext)
-    f = recorder.Pull(f)
-    print 'Video written to %s' % os.path.abspath(f)
-
-  parallel_devices = device_utils.DeviceUtils.parallel(
-      script_common.GetDevices(args.devices, args.blacklist_file),
-      async=True)
-  stop_recording = threading.Event()
-  running_recording = parallel_devices.pMap(record_video, stop_recording)
-  print 'Recording. Press Enter to stop.',
-  sys.stdout.flush()
-  raw_input()
-  stop_recording.set()
-
-  running_recording.pGet(None)
-  return 0
-
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/third_party/catapult/devil/devil/android/tools/wait_for_devices.py b/third_party/catapult/devil/devil/android/tools/wait_for_devices.py
deleted file mode 100755
index 4bde2cd..0000000
--- a/third_party/catapult/devil/devil/android/tools/wait_for_devices.py
+++ /dev/null
@@ -1,50 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Waits for the given devices to be available."""
-
-import argparse
-import os
-import sys
-
-if __name__ == '__main__':
-  sys.path.append(
-      os.path.abspath(os.path.join(os.path.dirname(__file__),
-                                   '..', '..', '..')))
-
-from devil import devil_env
-from devil.android import device_utils
-from devil.utils import run_tests_helper
-
-
-def main(raw_args):
-  parser = argparse.ArgumentParser()
-  parser.add_argument('-v', '--verbose', action='count', help='Log more.')
-  parser.add_argument('-t', '--timeout', default=30, type=int,
-                      help='Seconds to wait for the devices.')
-  parser.add_argument('--adb-path', help='ADB binary to use.')
-  parser.add_argument('device_serials', nargs='*', metavar='SERIAL',
-                      help='Serials of the devices to wait for.')
-
-  args = parser.parse_args(raw_args)
-
-  run_tests_helper.SetLogLevel(args.verbose)
-
-  devil_dynamic_config = devil_env.EmptyConfig()
-  if args.adb_path:
-    devil_dynamic_config['dependencies'].update(
-        devil_env.LocalConfigItem(
-            'adb', devil_env.GetPlatform(), args.adb_path))
-  devil_env.config.Initialize(configs=[devil_dynamic_config])
-
-  devices = device_utils.DeviceUtils.HealthyDevices(
-      device_arg=args.device_serials)
-  parallel_devices = device_utils.DeviceUtils.parallel(devices)
-  parallel_devices.WaitUntilFullyBooted(timeout=args.timeout)
-  return 0
-
-
-if __name__ == '__main__':
-  sys.exit(main(sys.argv[1:]))
diff --git a/third_party/catapult/devil/devil/android/valgrind_tools/__init__.py b/third_party/catapult/devil/devil/android/valgrind_tools/__init__.py
deleted file mode 100644
index 0182d4c..0000000
--- a/third_party/catapult/devil/devil/android/valgrind_tools/__init__.py
+++ /dev/null
@@ -1,21 +0,0 @@
-# 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.
-"""
-Classes in this package define additional actions that need to be taken to run a
-test under some kind of runtime error detection tool.
-
-The interface is intended to be used as follows.
-
-1. For tests that simply run a native process (i.e. no activity is spawned):
-
-Call tool.CopyFiles(device).
-Prepend test command line with tool.GetTestWrapper().
-
-2. For tests that spawn an activity:
-
-Call tool.CopyFiles(device).
-Call tool.SetupEnvironment().
-Run the test as usual.
-Call tool.CleanUpEnvironment().
-"""
diff --git a/third_party/catapult/devil/devil/android/valgrind_tools/base_tool.py b/third_party/catapult/devil/devil/android/valgrind_tools/base_tool.py
deleted file mode 100644
index 2e6e9af..0000000
--- a/third_party/catapult/devil/devil/android/valgrind_tools/base_tool.py
+++ /dev/null
@@ -1,53 +0,0 @@
-# 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.
-
-
-class BaseTool(object):
-  """A tool that does nothing."""
-  # pylint: disable=R0201
-
-  def __init__(self):
-    """Does nothing."""
-    pass
-
-  def GetTestWrapper(self):
-    """Returns a string that is to be prepended to the test command line."""
-    return ''
-
-  def GetUtilWrapper(self):
-    """Returns the wrapper name for the utilities.
-
-    Returns:
-       A string that is to be prepended to the command line of utility
-    processes (forwarder, etc.).
-    """
-    return ''
-
-  @classmethod
-  def CopyFiles(cls, device):
-    """Copies tool-specific files to the device, create directories, etc."""
-    pass
-
-  def SetupEnvironment(self):
-    """Sets up the system environment for a test.
-
-    This is a good place to set system properties.
-    """
-    pass
-
-  def CleanUpEnvironment(self):
-    """Cleans up environment."""
-    pass
-
-  def GetTimeoutScale(self):
-    """Returns a multiplier that should be applied to timeout values."""
-    return 1.0
-
-  def NeedsDebugInfo(self):
-    """Whether this tool requires debug info.
-
-    Returns:
-      True if this tool can not work with stripped binaries.
-    """
-    return False
diff --git a/third_party/catapult/devil/devil/base_error.py b/third_party/catapult/devil/devil/base_error.py
deleted file mode 100644
index 4b89661..0000000
--- a/third_party/catapult/devil/devil/base_error.py
+++ /dev/null
@@ -1,24 +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.
-
-
-class BaseError(Exception):
-  """Base error for all test runner errors."""
-
-  def __init__(self, message, is_infra_error=False):
-    super(BaseError, self).__init__(message)
-    self._is_infra_error = is_infra_error
-
-  def __eq__(self, other):
-    return (self.message == other.message
-            and self.is_infra_error == other.is_infra_error)
-
-  def __ne__(self, other):
-    return not self == other
-
-  @property
-  def is_infra_error(self):
-    """Property to indicate if error was caused by an infrastructure issue."""
-    return self._is_infra_error
-
diff --git a/third_party/catapult/devil/devil/constants/__init__.py b/third_party/catapult/devil/devil/constants/__init__.py
deleted file mode 100644
index 50b23df..0000000
--- a/third_party/catapult/devil/devil/constants/__init__.py
+++ /dev/null
@@ -1,3 +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.
diff --git a/third_party/catapult/devil/devil/constants/exit_codes.py b/third_party/catapult/devil/devil/constants/exit_codes.py
deleted file mode 100644
index aaeca4a..0000000
--- a/third_party/catapult/devil/devil/constants/exit_codes.py
+++ /dev/null
@@ -1,9 +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.
-
-"""Common exit codes used by devil."""
-
-ERROR = 1
-INFRA = 87
-WARNING = 88
diff --git a/third_party/catapult/devil/devil/devil_dependencies.json b/third_party/catapult/devil/devil/devil_dependencies.json
deleted file mode 100644
index bed6fe1..0000000
--- a/third_party/catapult/devil/devil/devil_dependencies.json
+++ /dev/null
@@ -1,127 +0,0 @@
-{
-  "config_type": "BaseConfig",
-  "dependencies": {
-    "aapt": {
-      "cloud_storage_base_folder": "binary_dependencies",
-      "cloud_storage_bucket": "chromium-telemetry",
-      "file_info": {
-        "linux2_x86_64": {
-          "cloud_storage_hash": "16ba3180141a2489d7ec99b39fd6e3434a9a373f",
-          "download_path": "../bin/deps/linux2/x86_64/bin/aapt"
-        }
-      }
-    },
-    "adb": {
-      "cloud_storage_base_folder": "binary_dependencies",
-      "cloud_storage_bucket": "chromium-telemetry",
-      "file_info": {
-        "linux2_x86_64": {
-          "cloud_storage_hash": "8bd43e3930f6eec643d5dc64cab9e5bb4ddf4909",
-          "download_path": "../bin/deps/linux2/x86_64/bin/adb"
-        }
-      }
-    },
-    "android_build_tools_libc++": {
-      "cloud_storage_base_folder": "binary_dependencies",
-      "cloud_storage_bucket": "chromium-telemetry",
-      "file_info": {
-        "linux2_x86_64": {
-          "cloud_storage_hash": "91cdce1e3bd81b2ac1fd380013896d0e2cdb40a0",
-          "download_path": "../bin/deps/linux2/x86_64/lib/libc++.so"
-        }
-      }
-    },
-    "chromium_commands": {
-      "cloud_storage_base_folder": "binary_dependencies",
-      "cloud_storage_bucket": "chromium-telemetry",
-      "file_info": {
-        "linux2_x86_64": {
-          "cloud_storage_hash": "4e22f641e4757309510e8d9f933f5aa504574ab6",
-          "download_path": "../bin/deps/linux2/x86_64/lib.java/chromium_commands.dex.jar"
-        }
-      }
-    },
-    "dexdump": {
-      "cloud_storage_base_folder": "binary_dependencies",
-      "cloud_storage_bucket": "chromium-telemetry",
-      "file_info": {
-        "linux2_x86_64": {
-          "cloud_storage_hash": "acfb10f7a868baf9bcf446a2d9f8ed6b5d52c3c6",
-          "download_path": "../bin/deps/linux2/x86_64/bin/dexdump"
-        }
-      }
-    },
-    "fastboot": {
-      "cloud_storage_base_folder": "binary_dependencies",
-      "cloud_storage_bucket": "chromium-telemetry",
-      "file_info": {
-        "linux2_x86_64": {
-          "cloud_storage_hash": "db9728166f182800eb9d09e9f036d56e105e8235",
-          "download_path": "../bin/deps/linux2/x86_64/bin/fastboot"
-        }
-      }
-    },
-    "forwarder_device": {
-      "cloud_storage_base_folder": "binary_dependencies",
-      "cloud_storage_bucket": "chromium-telemetry",
-      "file_info": {
-        "android_arm64-v8a": {
-          "cloud_storage_hash": "f222268d8442979240d1b18de00911a49e548daa",
-          "download_path": "../bin/deps/android/arm64-v8a/bin/forwarder_device"
-        },
-        "android_armeabi-v7a": {
-          "cloud_storage_hash": "c15267bf01c26eb0aea4f61c780bbba460c5c981",
-          "download_path": "../bin/deps/android/armeabi-v7a/bin/forwarder_device"
-        }
-      }
-    },
-    "forwarder_host": {
-      "cloud_storage_base_folder": "binary_dependencies",
-      "cloud_storage_bucket": "chromium-telemetry",
-      "file_info": {
-        "linux2_x86_64": {
-          "cloud_storage_hash": "8fe69994b670f028484eed475dbffc838c8a57f7",
-          "download_path": "../bin/deps/linux2/x86_64/forwarder_host"
-        }
-      }
-    },
-    "md5sum_device": {
-      "cloud_storage_base_folder": "binary_dependencies",
-      "cloud_storage_bucket": "chromium-telemetry",
-      "file_info": {
-        "android_arm64-v8a": {
-          "cloud_storage_hash": "4e7d2dedd9c6321fdc152b06869e09a3c5817904",
-          "download_path": "../bin/deps/android/arm64-v8a/bin/md5sum_device"
-        },
-        "android_armeabi-v7a": {
-          "cloud_storage_hash": "39fd90af0f8828202b687f7128393759181c5e2e",
-          "download_path": "../bin/deps/android/armeabi-v7a/bin/md5sum_device"
-        },
-        "android_x86": {
-          "cloud_storage_hash": "d5cf42ab5986a69c31c0177b0df499d6bf708df6",
-          "download_path": "../bin/deps/android/x86/bin/md5sum_device"
-        }
-      }
-    },
-    "md5sum_host": {
-      "cloud_storage_base_folder": "binary_dependencies",
-      "cloud_storage_bucket": "chromium-telemetry",
-      "file_info": {
-        "linux2_x86_64": {
-          "cloud_storage_hash": "4db5bd5e9bea8880d8bf2caa59d0efb0acc19f74",
-          "download_path": "../bin/deps/linux2/x86_64/bin/md5sum_host"
-        }
-      }
-    },
-    "split-select": {
-      "cloud_storage_base_folder": "binary_dependencies",
-      "cloud_storage_bucket": "chromium-telemetry",
-      "file_info": {
-        "linux2_x86_64": {
-          "cloud_storage_hash": "abb9753a8d3efeea4144e328933931729e01571c",
-          "download_path": "../bin/deps/linux2/x86_64/bin/split-select"
-        }
-      }
-    }
-  }
-}
\ No newline at end of file
diff --git a/third_party/catapult/devil/devil/devil_env.py b/third_party/catapult/devil/devil/devil_env.py
deleted file mode 100644
index aa4fe1e..0000000
--- a/third_party/catapult/devil/devil/devil_env.py
+++ /dev/null
@@ -1,194 +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.
-
-import contextlib
-import json
-import logging
-import os
-import platform
-import sys
-import tempfile
-import threading
-
-CATAPULT_ROOT_PATH = os.path.abspath(os.path.join(
-    os.path.dirname(__file__), '..', '..'))
-DEPENDENCY_MANAGER_PATH = os.path.join(
-    CATAPULT_ROOT_PATH, 'dependency_manager')
-PYMOCK_PATH = os.path.join(
-    CATAPULT_ROOT_PATH, 'third_party', 'mock')
-
-
-@contextlib.contextmanager
-def SysPath(path):
-  sys.path.append(path)
-  yield
-  if sys.path[-1] != path:
-    sys.path.remove(path)
-  else:
-    sys.path.pop()
-
-with SysPath(DEPENDENCY_MANAGER_PATH):
-  import dependency_manager  # pylint: disable=import-error
-
-_ANDROID_BUILD_TOOLS = {'aapt', 'dexdump', 'split-select'}
-
-_DEVIL_DEFAULT_CONFIG = os.path.abspath(os.path.join(
-    os.path.dirname(__file__), 'devil_dependencies.json'))
-
-_LEGACY_ENVIRONMENT_VARIABLES = {
-  'ADB_PATH': {
-    'dependency_name': 'adb',
-    'platform': 'linux2_x86_64',
-  },
-  'ANDROID_SDK_ROOT': {
-    'dependency_name': 'android_sdk',
-    'platform': 'linux2_x86_64',
-  },
-}
-
-
-def EmptyConfig():
-  return {
-    'config_type': 'BaseConfig',
-    'dependencies': {}
-  }
-
-
-def LocalConfigItem(dependency_name, dependency_platform, dependency_path):
-  if isinstance(dependency_path, basestring):
-    dependency_path = [dependency_path]
-  return {
-    dependency_name: {
-      'file_info': {
-        dependency_platform: {
-          'local_paths': dependency_path
-        },
-      },
-    },
-  }
-
-
-def _GetEnvironmentVariableConfig():
-  env_config = EmptyConfig()
-  path_config = (
-      (os.environ.get(k), v)
-      for k, v in _LEGACY_ENVIRONMENT_VARIABLES.iteritems())
-  path_config = ((p, c) for p, c in path_config if p)
-  for p, c in path_config:
-    env_config['dependencies'].update(
-        LocalConfigItem(c['dependency_name'], c['platform'], p))
-  return env_config
-
-
-class _Environment(object):
-
-  def __init__(self):
-    self._dm_init_lock = threading.Lock()
-    self._dm = None
-    self._logging_init_lock = threading.Lock()
-    self._logging_initialized = False
-
-  def Initialize(self, configs=None, config_files=None):
-    """Initialize devil's environment from configuration files.
-
-    This uses all configurations provided via |configs| and |config_files|
-    to determine the locations of devil's dependencies. Configurations should
-    all take the form described by py_utils.dependency_manager.BaseConfig.
-    If no configurations are provided, a default one will be used if available.
-
-    Args:
-      configs: An optional list of dict configurations.
-      config_files: An optional list of files to load
-    """
-
-    # Make sure we only initialize self._dm once.
-    with self._dm_init_lock:
-      if self._dm is None:
-        if configs is None:
-          configs = []
-
-        env_config = _GetEnvironmentVariableConfig()
-        if env_config:
-          configs.insert(0, env_config)
-        self._InitializeRecursive(
-            configs=configs,
-            config_files=config_files)
-        assert self._dm is not None, 'Failed to create dependency manager.'
-
-  def _InitializeRecursive(self, configs=None, config_files=None):
-    # This recurses through configs to create temporary files for each and
-    # take advantage of context managers to appropriately close those files.
-    # TODO(jbudorick): Remove this recursion if/when dependency_manager
-    # supports loading configurations directly from a dict.
-    if configs:
-      with tempfile.NamedTemporaryFile(delete=False) as next_config_file:
-        try:
-          next_config_file.write(json.dumps(configs[0]))
-          next_config_file.close()
-          self._InitializeRecursive(
-              configs=configs[1:],
-              config_files=[next_config_file.name] + (config_files or []))
-        finally:
-          if os.path.exists(next_config_file.name):
-            os.remove(next_config_file.name)
-    else:
-      config_files = config_files or []
-      if 'DEVIL_ENV_CONFIG' in os.environ:
-        config_files.append(os.environ.get('DEVIL_ENV_CONFIG'))
-      config_files.append(_DEVIL_DEFAULT_CONFIG)
-
-      self._dm = dependency_manager.DependencyManager(
-          [dependency_manager.BaseConfig(c) for c in config_files])
-
-  def InitializeLogging(self, log_level, formatter=None, handler=None):
-    if self._logging_initialized:
-      return
-
-    with self._logging_init_lock:
-      if self._logging_initialized:
-        return
-
-      formatter = formatter or logging.Formatter(
-          '%(threadName)-4s  %(message)s')
-      handler = handler or logging.StreamHandler(sys.stdout)
-      handler.setFormatter(formatter)
-
-      devil_logger = logging.getLogger('devil')
-      devil_logger.setLevel(log_level)
-      devil_logger.propagate = False
-      devil_logger.addHandler(handler)
-
-      import py_utils.cloud_storage
-      lock_logger = py_utils.cloud_storage.logger
-      lock_logger.setLevel(log_level)
-      lock_logger.propagate = False
-      lock_logger.addHandler(handler)
-
-      self._logging_initialized = True
-
-  def FetchPath(self, dependency, arch=None, device=None):
-    if self._dm is None:
-      self.Initialize()
-    if dependency in _ANDROID_BUILD_TOOLS:
-      self.FetchPath('android_build_tools_libc++', arch=arch, device=device)
-    return self._dm.FetchPath(dependency, GetPlatform(arch, device))
-
-  def LocalPath(self, dependency, arch=None, device=None):
-    if self._dm is None:
-      self.Initialize()
-    return self._dm.LocalPath(dependency, GetPlatform(arch, device))
-
-  def PrefetchPaths(self, dependencies=None, arch=None, device=None):
-    return self._dm.PrefetchPaths(
-        GetPlatform(arch, device), dependencies=dependencies)
-
-
-def GetPlatform(arch=None, device=None):
-  if arch or device:
-    return 'android_%s' % (arch or device.product_cpu_abi)
-  return '%s_%s' % (sys.platform, platform.machine())
-
-
-config = _Environment()
-
diff --git a/third_party/catapult/devil/devil/devil_env_test.py b/third_party/catapult/devil/devil/devil_env_test.py
deleted file mode 100755
index e78221a..0000000
--- a/third_party/catapult/devil/devil/devil_env_test.py
+++ /dev/null
@@ -1,63 +0,0 @@
-#!/usr/bin/env python
-# 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.
-
-# pylint: disable=protected-access
-
-import logging
-import sys
-import unittest
-
-from devil import devil_env
-
-_sys_path_before = list(sys.path)
-with devil_env.SysPath(devil_env.PYMOCK_PATH):
-  _sys_path_with_pymock = list(sys.path)
-  import mock  # pylint: disable=import-error
-_sys_path_after = list(sys.path)
-
-
-class DevilEnvTest(unittest.TestCase):
-
-  def testSysPath(self):
-    self.assertEquals(_sys_path_before, _sys_path_after)
-    self.assertEquals(
-        _sys_path_before + [devil_env.PYMOCK_PATH],
-        _sys_path_with_pymock)
-
-  def testGetEnvironmentVariableConfig_configType(self):
-    with mock.patch('os.environ.get',
-                    mock.Mock(side_effect=lambda _env_var: None)):
-      env_config = devil_env._GetEnvironmentVariableConfig()
-    self.assertEquals('BaseConfig', env_config.get('config_type'))
-
-  def testGetEnvironmentVariableConfig_noEnv(self):
-    with mock.patch('os.environ.get',
-                    mock.Mock(side_effect=lambda _env_var: None)):
-      env_config = devil_env._GetEnvironmentVariableConfig()
-    self.assertEquals({}, env_config.get('dependencies'))
-
-  def testGetEnvironmentVariableConfig_adbPath(self):
-    def mock_environment(env_var):
-      return '/my/fake/adb/path' if env_var == 'ADB_PATH' else None
-
-    with mock.patch('os.environ.get',
-                    mock.Mock(side_effect=mock_environment)):
-      env_config = devil_env._GetEnvironmentVariableConfig()
-    self.assertEquals(
-        {
-          'adb': {
-            'file_info': {
-              'linux2_x86_64': {
-                'local_paths': ['/my/fake/adb/path'],
-              },
-            },
-          },
-        },
-        env_config.get('dependencies'))
-
-
-if __name__ == '__main__':
-  logging.getLogger().setLevel(logging.DEBUG)
-  unittest.main(verbosity=2)
diff --git a/third_party/catapult/devil/devil/utils/__init__.py b/third_party/catapult/devil/devil/utils/__init__.py
deleted file mode 100644
index ff84988..0000000
--- a/third_party/catapult/devil/devil/utils/__init__.py
+++ /dev/null
@@ -1,23 +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.
-
-import os
-import sys
-
-def _JoinPath(*path_parts):
-  return os.path.abspath(os.path.join(*path_parts))
-
-
-def _AddDirToPythonPath(*path_parts):
-  path = _JoinPath(*path_parts)
-  if os.path.isdir(path) and path not in sys.path:
-    # Some call sites that use Telemetry assume that sys.path[0] is the
-    # directory containing the script, so we add these extra paths to right
-    # after sys.path[0].
-    sys.path.insert(1, path)
-
-_CATAPULT_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)),
-                             os.path.pardir, os.path.pardir, os.path.pardir)
-
-_AddDirToPythonPath(_CATAPULT_DIR, 'common', 'battor')
diff --git a/third_party/catapult/devil/devil/utils/battor_device_mapping.py b/third_party/catapult/devil/devil/utils/battor_device_mapping.py
deleted file mode 100755
index 8cabb83..0000000
--- a/third_party/catapult/devil/devil/utils/battor_device_mapping.py
+++ /dev/null
@@ -1,309 +0,0 @@
-#!/usr/bin/python
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-
-'''
-This script provides tools to map BattOrs to phones.
-
-Phones are identified by the following string:
-
-"Phone serial number" - Serial number of the phone. This can be
-obtained via 'adb devices' or 'usb-devices', and is not expected
-to change for a given phone.
-
-BattOrs are identified by the following two strings:
-
-"BattOr serial number" - Serial number of the BattOr. This can be
-obtained via 'usb-devices', and is not expected to change for
-a given BattOr.
-
-"BattOr path" - The path of the form '/dev/ttyUSB*' that is used
-to communicate with the BattOr (the battor_agent binary takes
-this BattOr path as a parameter). The BattOr path is frequently
-reassigned by the OS, most often when the device is disconnected
-and then reconnected. Thus, the BattOr path cannot be expected
-to be stable.
-
-In a typical application, the user will require the BattOr path
-for the BattOr that is plugged into a given phone. For instance,
-the user will be running tracing on a particular phone, and will
-need to know which BattOr path to use to communicate with the BattOr
-to get the corresponding power trace.
-
-Getting this mapping requires two steps: (1) determining the
-mapping between phone serial numbers and BattOr serial numbers, and
-(2) getting the BattOr path corresponding to a given BattOr serial
-number.
-
-For step (1), we generate a JSON file giving this mapping. This
-JSON file consists of a list of items of the following form:
-[{'phone': <phone serial 1>, 'battor': <battor serial 1>},
-{'phone': <phone serial 2>, 'battor': <battor serial 2>}, ...]
-
-The default way to generate this JSON file is using the function
-GenerateSerialMapFile, which generates a mapping based on assuming
-that the system has two identical USB hubs connected to it, and
-the phone plugged into physical port number 1 on one hub corresponds
-to the BattOr plugged into physical port number 1 on the other hub,
-and similarly with physical port numbers 2, 3, etc. This generates
-the map file based on the structure at the time GenerateSerialMapFile called.
-Note that after the map file is generated, port numbers are no longer used;
-the user could move around the devices in the ports without affecting
-which phone goes with which BattOr. (Thus, if the user wanted to update the
-mapping to match the new port connections, the user would have to
-re-generate this file.)
-
-The script update_mapping.py will do this updating from the command line.
-
-If the user wanted to specify a custom mapping, the user could instead
-create the JSON file manually. (In this case, hubs would not be necessary
-and the physical ports connected would be irrelevant.)
-
-Step (2) is conducted through the function GetBattOrPathFromPhoneSerial,
-which takes a serial number mapping generated via step (1) and a phone
-serial number, then gets the corresponding BattOr serial number from the
-map and determines its BattOr path (e.g. /dev/ttyUSB0). Since BattOr paths
-can change if devices are connected and disconnected (even if connected
-or disconnected via the same port) this function should be called to
-determine the BattOr path every time before connecting to the BattOr.
-
-Note that if there is only one BattOr connected to the system, then
-GetBattOrPathFromPhoneSerial will always return that BattOr and will ignore
-the mapping file. Thus, if the user never has more than one BattOr connected
-to the system, the user will not need to generate mapping files.
-'''
-
-
-import json
-import collections
-
-from battor import battor_error
-from devil.utils import find_usb_devices
-from devil.utils import usb_hubs
-
-
-def GetBattOrList(device_tree_map):
-  return [x for x in find_usb_devices.GetTTYList()
-          if IsBattOr(x, device_tree_map)]
-
-
-def IsBattOr(tty_string, device_tree_map):
-  (bus, device) = find_usb_devices.GetBusDeviceFromTTY(tty_string)
-  node = device_tree_map[bus].FindDeviceNumber(device)
-  return '0403:6001' in node.desc
-
-
-def GetBattOrSerialNumbers(device_tree_map):
-  for x in find_usb_devices.GetTTYList():
-    if IsBattOr(x, device_tree_map):
-      (bus, device) = find_usb_devices.GetBusDeviceFromTTY(x)
-      devnode = device_tree_map[bus].FindDeviceNumber(device)
-      yield devnode.serial
-
-
-def ReadSerialMapFile(filename):
-  """Reads JSON file giving phone-to-battor serial number map.
-
-  Parses a JSON file consisting of a list of items of the following form:
-  [{'phone': <phone serial 1>, 'battor': <battor serial 1>},
-  {'phone': <phone serial 2>, 'battor': <battor serial 2>}, ...]
-
-  indicating which phone serial numbers should be matched with
-  which BattOr serial numbers. Returns dictionary of the form:
-
-  {<phone serial 1>: <BattOr serial 1>,
-   <phone serial 2>: <BattOr serial 2>}
-
-  Args:
-      filename: Name of file to read.
-  """
-  result = {}
-  with open(filename, 'r') as infile:
-    in_dict = json.load(infile)
-  for x in in_dict:
-    result[x['phone']] = x['battor']
-  return result
-
-def WriteSerialMapFile(filename, serial_map):
-  """Writes a map of phone serial numbers to BattOr serial numbers to file.
-
-  Writes a JSON file consisting of a list of items of the following form:
-  [{'phone': <phone serial 1>, 'battor': <battor serial 1>},
-  {'phone': <phone serial 2>, 'battor': <battor serial 2>}, ...]
-
-  indicating which phone serial numbers should be matched with
-  which BattOr serial numbers. Mapping is based on the physical port numbers
-  of the hubs that the BattOrs and phones are connected to.
-
-  Args:
-      filename: Name of file to write.
-      serial_map: Serial map {phone: battor}
-  """
-  result = []
-  for (phone, battor) in serial_map.iteritems():
-    result.append({'phone': phone, 'battor': battor})
-  with open(filename, 'w') as outfile:
-    json.dump(result, outfile)
-
-def GenerateSerialMap(hub_types=None):
-  """Generates a map of phone serial numbers to BattOr serial numbers.
-
-  Generates a dict of:
-  {<phone serial 1>: <battor serial 1>,
-   <phone serial 2>: <battor serial 2>}
-  indicating which phone serial numbers should be matched with
-  which BattOr serial numbers. Mapping is based on the physical port numbers
-  of the hubs that the BattOrs and phones are connected to.
-
-  Args:
-      hub_types: List of hub types to check for. If not specified, checks
-      for all defined hub types. (see usb_hubs.py for details)
-  """
-  if hub_types:
-    hub_types = [usb_hubs.GetHubType(x) for x in hub_types]
-  else:
-    hub_types = usb_hubs.ALL_HUBS
-
-  devtree = find_usb_devices.GetBusNumberToDeviceTreeMap()
-
-  # List of serial numbers in the system that represent BattOrs.
-  battor_serials = list(GetBattOrSerialNumbers(devtree))
-
-  # If there's only one BattOr in the system, then a serial number ma
-  # is not necessary.
-  if len(battor_serials) == 1:
-    return {}
-
-  # List of dictionaries, one for each hub, that maps the physical
-  # port number to the serial number of that hub. For instance, in a 2
-  # hub system, this could return [{1:'ab', 2:'cd'}, {1:'jkl', 2:'xyz'}]
-  # where 'ab' and 'cd' are the phone serial numbers and 'jkl' and 'xyz'
-  # are the BattOr serial numbers.
-  port_to_serial = find_usb_devices.GetAllPhysicalPortToSerialMaps(
-      hub_types, device_tree_map=devtree)
-
-  class serials(object):
-    def __init__(self):
-      self.phone = None
-      self.battor = None
-
-  # Map of {physical port number: [phone serial #, BattOr serial #]. This
-  # map is populated by executing the code below. For instance, in the above
-  # example, after the code below is executed, port_to_devices would equal
-  # {1: ['ab', 'jkl'], 2: ['cd', 'xyz']}
-  port_to_devices = collections.defaultdict(serials)
-  for hub in port_to_serial:
-    for (port, serial) in hub.iteritems():
-      if serial in battor_serials:
-        if port_to_devices[port].battor is not None:
-          raise battor_error.BattOrError('Multiple BattOrs on same port number')
-        else:
-          port_to_devices[port].battor = serial
-      else:
-        if port_to_devices[port].phone is not None:
-          raise battor_error.BattOrError('Multiple phones on same port number')
-        else:
-          port_to_devices[port].phone = serial
-
-  # Turn the port_to_devices map into a map of the form
-  # {phone serial number: BattOr serial number}.
-  result = {}
-  for pair in port_to_devices.values():
-    if pair.phone is None:
-      continue
-    if pair.battor is None:
-      raise battor_error.BattOrError(
-          'Phone detected with no corresponding BattOr')
-    result[pair.phone] = pair.battor
-  return result
-
-def GenerateSerialMapFile(filename, hub_types=None):
-  """Generates a serial map file and writes it."""
-  WriteSerialMapFile(filename, GenerateSerialMap(hub_types))
-
-def _PhoneToPathMap(serial, serial_map, devtree):
-  """Maps phone serial number to TTY path, assuming serial map is provided."""
-  try:
-    battor_serial = serial_map[serial]
-  except KeyError:
-    raise battor_error.BattOrError('Serial number not found in serial map.')
-  for tree in devtree.values():
-    for node in tree.AllNodes():
-      if isinstance(node, find_usb_devices.USBDeviceNode):
-        if node.serial == battor_serial:
-          bus_device_to_tty = find_usb_devices.GetBusDeviceToTTYMap()
-          bus_device = (node.bus_num, node.device_num)
-          try:
-            return bus_device_to_tty[bus_device]
-          except KeyError:
-            raise battor_error.BattOrError(
-                'Device with given serial number not a BattOr '
-                '(does not have TTY path)')
-
-
-def GetBattOrPathFromPhoneSerial(serial, serial_map=None,
-                                 serial_map_file=None):
-  """Gets the TTY path (e.g. '/dev/ttyUSB0')  to communicate with the BattOr.
-
-  (1) If serial_map is given, it is treated as a dictionary mapping
-  phone serial numbers to BattOr serial numbers. This function will get the
-  TTY path for the given BattOr serial number.
-
-  (2) If serial_map_file is given, it is treated as the name of a
-  phone-to-BattOr mapping file (generated with GenerateSerialMapFile)
-  and this will be loaded and used as the dict to map port numbers to
-  BattOr serial numbers.
-
-  You can only give one of serial_map and serial_map_file.
-
-  Args:
-    serial: Serial number of phone connected on the same physical port that
-    the BattOr is connected to.
-    serial_map: Map of phone serial numbers to BattOr serial numbers, given
-    as a dictionary.
-    serial_map_file: Map of phone serial numbers to BattOr serial numbers,
-    given as a file.
-    hub_types: List of hub types to check for. Used only if serial_map_file
-    is None.
-
-  Returns:
-    Device string used to communicate with device.
-
-  Raises:
-    ValueError: If serial number is not given.
-    BattOrError: If BattOr not found or unexpected USB topology.
-  """
-  # If there's only one BattOr connected to the system, just use that one.
-  # This allows for use on, e.g., a developer's workstation with no hubs.
-  devtree = find_usb_devices.GetBusNumberToDeviceTreeMap()
-  all_battors = GetBattOrList(devtree)
-  if len(all_battors) == 1:
-    return '/dev/' + all_battors[0]
-
-  if not serial:
-    raise battor_error.BattOrError(
-        'Two or more BattOrs connected, no serial provided')
-
-  if serial_map and serial_map_file:
-    raise ValueError('Cannot specify both serial_map and serial_map_file')
-
-  if serial_map_file:
-    serial_map = ReadSerialMapFile(serial_map_file)
-
-  tty_string = _PhoneToPathMap(serial, serial_map, devtree)
-
-  if not tty_string:
-    raise battor_error.BattOrError(
-        'No device with given serial number detected.')
-
-  if IsBattOr(tty_string, devtree):
-    return '/dev/' + tty_string
-  else:
-    raise battor_error.BattOrError(
-        'Device with given serial number is not a BattOr.')
-
-if __name__ == '__main__':
-  # Main function for testing purposes
-  print GenerateSerialMap()
diff --git a/third_party/catapult/devil/devil/utils/cmd_helper.py b/third_party/catapult/devil/devil/utils/cmd_helper.py
deleted file mode 100644
index 06c105f..0000000
--- a/third_party/catapult/devil/devil/utils/cmd_helper.py
+++ /dev/null
@@ -1,394 +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.
-
-"""A wrapper for subprocess to make calling shell commands easier."""
-
-import logging
-import os
-import pipes
-import select
-import signal
-import string
-import StringIO
-import subprocess
-import sys
-import time
-
-# fcntl is not available on Windows.
-try:
-  import fcntl
-except ImportError:
-  fcntl = None
-
-logger = logging.getLogger(__name__)
-
-_SafeShellChars = frozenset(string.ascii_letters + string.digits + '@%_-+=:,./')
-
-
-def SingleQuote(s):
-  """Return an shell-escaped version of the string using single quotes.
-
-  Reliably quote a string which may contain unsafe characters (e.g. space,
-  quote, or other special characters such as '$').
-
-  The returned value can be used in a shell command line as one token that gets
-  to be interpreted literally.
-
-  Args:
-    s: The string to quote.
-
-  Return:
-    The string quoted using single quotes.
-  """
-  return pipes.quote(s)
-
-
-def DoubleQuote(s):
-  """Return an shell-escaped version of the string using double quotes.
-
-  Reliably quote a string which may contain unsafe characters (e.g. space
-  or quote characters), while retaining some shell features such as variable
-  interpolation.
-
-  The returned value can be used in a shell command line as one token that gets
-  to be further interpreted by the shell.
-
-  The set of characters that retain their special meaning may depend on the
-  shell implementation. This set usually includes: '$', '`', '\', '!', '*',
-  and '@'.
-
-  Args:
-    s: The string to quote.
-
-  Return:
-    The string quoted using double quotes.
-  """
-  if not s:
-    return '""'
-  elif all(c in _SafeShellChars for c in s):
-    return s
-  else:
-    return '"' + s.replace('"', '\\"') + '"'
-
-
-def ShrinkToSnippet(cmd_parts, var_name, var_value):
-  """Constructs a shell snippet for a command using a variable to shrink it.
-
-  Takes into account all quoting that needs to happen.
-
-  Args:
-    cmd_parts: A list of command arguments.
-    var_name: The variable that holds var_value.
-    var_value: The string to replace in cmd_parts with $var_name
-
-  Returns:
-    A shell snippet that does not include setting the variable.
-  """
-  def shrink(value):
-    parts = (x and SingleQuote(x) for x in value.split(var_value))
-    with_substitutions = ('"$%s"' % var_name).join(parts)
-    return with_substitutions or "''"
-
-  return ' '.join(shrink(part) for part in cmd_parts)
-
-
-def Popen(args, stdout=None, stderr=None, shell=None, cwd=None, env=None):
-  # preexec_fn isn't supported on windows.
-  if sys.platform == 'win32':
-    preexec_fn = None
-  else:
-    preexec_fn = lambda: signal.signal(signal.SIGPIPE, signal.SIG_DFL)
-
-  return subprocess.Popen(
-      args=args, cwd=cwd, stdout=stdout, stderr=stderr,
-      shell=shell, close_fds=True, env=env, preexec_fn=preexec_fn)
-
-
-def Call(args, stdout=None, stderr=None, shell=None, cwd=None, env=None):
-  pipe = Popen(args, stdout=stdout, stderr=stderr, shell=shell, cwd=cwd,
-               env=env)
-  pipe.communicate()
-  return pipe.wait()
-
-
-def RunCmd(args, cwd=None):
-  """Opens a subprocess to execute a program and returns its return value.
-
-  Args:
-    args: A string or a sequence of program arguments. The program to execute is
-      the string or the first item in the args sequence.
-    cwd: If not None, the subprocess's current directory will be changed to
-      |cwd| before it's executed.
-
-  Returns:
-    Return code from the command execution.
-  """
-  logger.info(str(args) + ' ' + (cwd or ''))
-  return Call(args, cwd=cwd)
-
-
-def GetCmdOutput(args, cwd=None, shell=False):
-  """Open a subprocess to execute a program and returns its output.
-
-  Args:
-    args: A string or a sequence of program arguments. The program to execute is
-      the string or the first item in the args sequence.
-    cwd: If not None, the subprocess's current directory will be changed to
-      |cwd| before it's executed.
-    shell: Whether to execute args as a shell command.
-
-  Returns:
-    Captures and returns the command's stdout.
-    Prints the command's stderr to logger (which defaults to stdout).
-  """
-  (_, output) = GetCmdStatusAndOutput(args, cwd, shell)
-  return output
-
-
-def _ValidateAndLogCommand(args, cwd, shell):
-  if isinstance(args, basestring):
-    if not shell:
-      raise Exception('string args must be run with shell=True')
-  else:
-    if shell:
-      raise Exception('array args must be run with shell=False')
-    args = ' '.join(SingleQuote(c) for c in args)
-  if cwd is None:
-    cwd = ''
-  else:
-    cwd = ':' + cwd
-  logger.info('[host]%s> %s', cwd, args)
-  return args
-
-
-def GetCmdStatusAndOutput(args, cwd=None, shell=False):
-  """Executes a subprocess and returns its exit code and output.
-
-  Args:
-    args: A string or a sequence of program arguments. The program to execute is
-      the string or the first item in the args sequence.
-    cwd: If not None, the subprocess's current directory will be changed to
-      |cwd| before it's executed.
-    shell: Whether to execute args as a shell command. Must be True if args
-      is a string and False if args is a sequence.
-
-  Returns:
-    The 2-tuple (exit code, output).
-  """
-  status, stdout, stderr = GetCmdStatusOutputAndError(
-      args, cwd=cwd, shell=shell)
-
-  if stderr:
-    logger.critical('STDERR: %s', stderr)
-  logger.debug('STDOUT: %s%s', stdout[:4096].rstrip(),
-               '<truncated>' if len(stdout) > 4096 else '')
-  return (status, stdout)
-
-
-def GetCmdStatusOutputAndError(args, cwd=None, shell=False):
-  """Executes a subprocess and returns its exit code, output, and errors.
-
-  Args:
-    args: A string or a sequence of program arguments. The program to execute is
-      the string or the first item in the args sequence.
-    cwd: If not None, the subprocess's current directory will be changed to
-      |cwd| before it's executed.
-    shell: Whether to execute args as a shell command. Must be True if args
-      is a string and False if args is a sequence.
-
-  Returns:
-    The 2-tuple (exit code, output).
-  """
-  _ValidateAndLogCommand(args, cwd, shell)
-  pipe = Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE,
-               shell=shell, cwd=cwd)
-  stdout, stderr = pipe.communicate()
-  return (pipe.returncode, stdout, stderr)
-
-
-class TimeoutError(Exception):
-  """Module-specific timeout exception."""
-
-  def __init__(self, output=None):
-    super(TimeoutError, self).__init__()
-    self._output = output
-
-  @property
-  def output(self):
-    return self._output
-
-
-def _IterProcessStdout(process, iter_timeout=None, timeout=None,
-                       buffer_size=4096, poll_interval=1):
-  """Iterate over a process's stdout.
-
-  This is intentionally not public.
-
-  Args:
-    process: The process in question.
-    iter_timeout: An optional length of time, in seconds, to wait in
-      between each iteration. If no output is received in the given
-      time, this generator will yield None.
-    timeout: An optional length of time, in seconds, during which
-      the process must finish. If it fails to do so, a TimeoutError
-      will be raised.
-    buffer_size: The maximum number of bytes to read (and thus yield) at once.
-    poll_interval: The length of time to wait in calls to `select.select`.
-      If iter_timeout is set, the remaining length of time in the iteration
-      may take precedence.
-  Raises:
-    TimeoutError: if timeout is set and the process does not complete.
-  Yields:
-    basestrings of data or None.
-  """
-
-  assert fcntl, 'fcntl module is required'
-  try:
-    # Enable non-blocking reads from the child's stdout.
-    child_fd = process.stdout.fileno()
-    fl = fcntl.fcntl(child_fd, fcntl.F_GETFL)
-    fcntl.fcntl(child_fd, fcntl.F_SETFL, fl | os.O_NONBLOCK)
-
-    end_time = (time.time() + timeout) if timeout else None
-    iter_end_time = (time.time() + iter_timeout) if iter_timeout else None
-
-    while True:
-      if end_time and time.time() > end_time:
-        raise TimeoutError()
-      if iter_end_time and time.time() > iter_end_time:
-        yield None
-        iter_end_time = time.time() + iter_timeout
-
-      if iter_end_time:
-        iter_aware_poll_interval = min(
-            poll_interval,
-            max(0, iter_end_time - time.time()))
-      else:
-        iter_aware_poll_interval = poll_interval
-
-      read_fds, _, _ = select.select(
-          [child_fd], [], [], iter_aware_poll_interval)
-      if child_fd in read_fds:
-        data = os.read(child_fd, buffer_size)
-        if not data:
-          break
-        yield data
-      if process.poll() is not None:
-        break
-  finally:
-    try:
-      if process.returncode is None:
-        # Make sure the process doesn't stick around if we fail with an
-        # exception.
-        process.kill()
-    except OSError:
-      pass
-    process.wait()
-
-
-def GetCmdStatusAndOutputWithTimeout(args, timeout, cwd=None, shell=False,
-                                     logfile=None):
-  """Executes a subprocess with a timeout.
-
-  Args:
-    args: List of arguments to the program, the program to execute is the first
-      element.
-    timeout: the timeout in seconds or None to wait forever.
-    cwd: If not None, the subprocess's current directory will be changed to
-      |cwd| before it's executed.
-    shell: Whether to execute args as a shell command. Must be True if args
-      is a string and False if args is a sequence.
-    logfile: Optional file-like object that will receive output from the
-      command as it is running.
-
-  Returns:
-    The 2-tuple (exit code, output).
-  Raises:
-    TimeoutError on timeout.
-  """
-  _ValidateAndLogCommand(args, cwd, shell)
-  output = StringIO.StringIO()
-  process = Popen(args, cwd=cwd, shell=shell, stdout=subprocess.PIPE,
-                  stderr=subprocess.STDOUT)
-  try:
-    for data in _IterProcessStdout(process, timeout=timeout):
-      if logfile:
-        logfile.write(data)
-      output.write(data)
-  except TimeoutError:
-    raise TimeoutError(output.getvalue())
-
-  str_output = output.getvalue()
-  logger.debug('STDOUT+STDERR: %s%s', str_output[:4096].rstrip(),
-               '<truncated>' if len(str_output) > 4096 else '')
-  return process.returncode, str_output
-
-
-def IterCmdOutputLines(args, iter_timeout=None, timeout=None, cwd=None,
-                       shell=False, check_status=True):
-  """Executes a subprocess and continuously yields lines from its output.
-
-  Args:
-    args: List of arguments to the program, the program to execute is the first
-      element.
-    iter_timeout: Timeout for each iteration, in seconds.
-    timeout: Timeout for the entire command, in seconds.
-    cwd: If not None, the subprocess's current directory will be changed to
-      |cwd| before it's executed.
-    shell: Whether to execute args as a shell command. Must be True if args
-      is a string and False if args is a sequence.
-    check_status: A boolean indicating whether to check the exit status of the
-      process after all output has been read.
-  Yields:
-    The output of the subprocess, line by line.
-
-  Raises:
-    CalledProcessError if check_status is True and the process exited with a
-      non-zero exit status.
-  """
-  cmd = _ValidateAndLogCommand(args, cwd, shell)
-  process = Popen(args, cwd=cwd, shell=shell, stdout=subprocess.PIPE,
-                  stderr=subprocess.STDOUT)
-  return _IterCmdOutputLines(
-      process, cmd, iter_timeout=iter_timeout, timeout=timeout,
-      check_status=check_status)
-
-def _IterCmdOutputLines(process, cmd, iter_timeout=None, timeout=None,
-                        check_status=True):
-  buffer_output = ''
-
-  iter_end = None
-  cur_iter_timeout = None
-  if iter_timeout:
-    iter_end = time.time() + iter_timeout
-    cur_iter_timeout = iter_timeout
-
-  for data in _IterProcessStdout(process, iter_timeout=cur_iter_timeout,
-                                 timeout=timeout):
-    if iter_timeout:
-      # Check whether the current iteration has timed out.
-      cur_iter_timeout = iter_end - time.time()
-      if data is None or cur_iter_timeout < 0:
-        yield None
-        iter_end = time.time() + iter_timeout
-        continue
-    else:
-      assert data is not None, (
-          'Iteration received no data despite no iter_timeout being set. '
-          'cmd: %s' % cmd)
-
-    # Construct lines to yield from raw data.
-    buffer_output += data
-    has_incomplete_line = buffer_output[-1] not in '\r\n'
-    lines = buffer_output.splitlines()
-    buffer_output = lines.pop() if has_incomplete_line else ''
-    for line in lines:
-      yield line
-      if iter_timeout:
-        iter_end = time.time() + iter_timeout
-
-  if buffer_output:
-    yield buffer_output
-  if check_status and process.returncode:
-    raise subprocess.CalledProcessError(process.returncode, cmd)
diff --git a/third_party/catapult/devil/devil/utils/cmd_helper_test.py b/third_party/catapult/devil/devil/utils/cmd_helper_test.py
deleted file mode 100755
index 783c413..0000000
--- a/third_party/catapult/devil/devil/utils/cmd_helper_test.py
+++ /dev/null
@@ -1,262 +0,0 @@
-#!/usr/bin/env python
-# 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.
-
-"""Tests for the cmd_helper module."""
-
-import unittest
-import subprocess
-import time
-
-from devil import devil_env
-from devil.utils import cmd_helper
-
-with devil_env.SysPath(devil_env.PYMOCK_PATH):
-  import mock  # pylint: disable=import-error
-
-
-class CmdHelperSingleQuoteTest(unittest.TestCase):
-
-  def testSingleQuote_basic(self):
-    self.assertEquals('hello',
-                      cmd_helper.SingleQuote('hello'))
-
-  def testSingleQuote_withSpaces(self):
-    self.assertEquals("'hello world'",
-                      cmd_helper.SingleQuote('hello world'))
-
-  def testSingleQuote_withUnsafeChars(self):
-    self.assertEquals("""'hello'"'"'; rm -rf /'""",
-                      cmd_helper.SingleQuote("hello'; rm -rf /"))
-
-  def testSingleQuote_dontExpand(self):
-    test_string = 'hello $TEST_VAR'
-    cmd = 'TEST_VAR=world; echo %s' % cmd_helper.SingleQuote(test_string)
-    self.assertEquals(test_string,
-                      cmd_helper.GetCmdOutput(cmd, shell=True).rstrip())
-
-
-class CmdHelperDoubleQuoteTest(unittest.TestCase):
-
-  def testDoubleQuote_basic(self):
-    self.assertEquals('hello',
-                      cmd_helper.DoubleQuote('hello'))
-
-  def testDoubleQuote_withSpaces(self):
-    self.assertEquals('"hello world"',
-                      cmd_helper.DoubleQuote('hello world'))
-
-  def testDoubleQuote_withUnsafeChars(self):
-    self.assertEquals('''"hello\\"; rm -rf /"''',
-                      cmd_helper.DoubleQuote('hello"; rm -rf /'))
-
-  def testSingleQuote_doExpand(self):
-    test_string = 'hello $TEST_VAR'
-    cmd = 'TEST_VAR=world; echo %s' % cmd_helper.DoubleQuote(test_string)
-    self.assertEquals('hello world',
-                      cmd_helper.GetCmdOutput(cmd, shell=True).rstrip())
-
-
-class CmdHelperShinkToSnippetTest(unittest.TestCase):
-
-  def testShrinkToSnippet_noArgs(self):
-    self.assertEquals('foo',
-        cmd_helper.ShrinkToSnippet(['foo'], 'a', 'bar'))
-    self.assertEquals("'foo foo'",
-        cmd_helper.ShrinkToSnippet(['foo foo'], 'a', 'bar'))
-    self.assertEquals('"$a"\' bar\'',
-        cmd_helper.ShrinkToSnippet(['foo bar'], 'a', 'foo'))
-    self.assertEquals('\'foo \'"$a"',
-        cmd_helper.ShrinkToSnippet(['foo bar'], 'a', 'bar'))
-    self.assertEquals('foo"$a"',
-        cmd_helper.ShrinkToSnippet(['foobar'], 'a', 'bar'))
-
-  def testShrinkToSnippet_singleArg(self):
-    self.assertEquals("foo ''",
-        cmd_helper.ShrinkToSnippet(['foo', ''], 'a', 'bar'))
-    self.assertEquals("foo foo",
-        cmd_helper.ShrinkToSnippet(['foo', 'foo'], 'a', 'bar'))
-    self.assertEquals('"$a" "$a"',
-        cmd_helper.ShrinkToSnippet(['foo', 'foo'], 'a', 'foo'))
-    self.assertEquals('foo "$a""$a"',
-        cmd_helper.ShrinkToSnippet(['foo', 'barbar'], 'a', 'bar'))
-    self.assertEquals('foo "$a"\' \'"$a"',
-        cmd_helper.ShrinkToSnippet(['foo', 'bar bar'], 'a', 'bar'))
-    self.assertEquals('foo "$a""$a"\' \'',
-        cmd_helper.ShrinkToSnippet(['foo', 'barbar '], 'a', 'bar'))
-    self.assertEquals('foo \' \'"$a""$a"\' \'',
-        cmd_helper.ShrinkToSnippet(['foo', ' barbar '], 'a', 'bar'))
-
-
-_DEFAULT = 'DEFAULT'
-
-
-class _ProcessOutputEvent(object):
-
-  def __init__(self, select_fds=_DEFAULT, read_contents=None, ts=_DEFAULT):
-    self.select_fds = select_fds
-    self.read_contents = read_contents
-    self.ts = ts
-
-
-class _MockProcess(object):
-
-  def __init__(self, output_sequence=None, return_value=0):
-
-    # Arbitrary.
-    fake_stdout_fileno = 25
-
-    self.mock_proc = mock.MagicMock(spec=subprocess.Popen)
-    self.mock_proc.stdout = mock.MagicMock()
-    self.mock_proc.stdout.fileno = mock.MagicMock(
-        return_value=fake_stdout_fileno)
-    self.mock_proc.returncode = None
-
-    self._return_value = return_value
-
-    # This links the behavior of os.read, select.select, time.time, and
-    # <process>.poll. The output sequence can be thought of as a list of
-    # return values for select.select with corresponding return values for
-    # the other calls at any time between that select call and the following
-    # one. We iterate through the sequence only on calls to select.select.
-    #
-    # os.read is a special case, though, where we only return a given chunk
-    # of data *once* after a given call to select.
-
-    if not output_sequence:
-      output_sequence = []
-
-    # Use an leading element to make the iteration logic work.
-    initial_seq_element = _ProcessOutputEvent(
-        _DEFAULT, '',
-        output_sequence[0].ts if output_sequence else _DEFAULT)
-    output_sequence.insert(0, initial_seq_element)
-
-    for o in output_sequence:
-      if o.select_fds == _DEFAULT:
-        if o.read_contents is None:
-          o.select_fds = []
-        else:
-          o.select_fds = [fake_stdout_fileno]
-      if o.ts == _DEFAULT:
-        o.ts = time.time()
-    self._output_sequence = output_sequence
-
-    self._output_seq_index = 0
-    self._read_flags = [False] * len(output_sequence)
-
-    def read_side_effect(*_args, **_kwargs):
-      if self._read_flags[self._output_seq_index]:
-        return None
-      self._read_flags[self._output_seq_index] = True
-      return self._output_sequence[self._output_seq_index].read_contents
-
-    def select_side_effect(*_args, **_kwargs):
-      if self._output_seq_index is None:
-        self._output_seq_index = 0
-      else:
-        self._output_seq_index += 1
-      return (self._output_sequence[self._output_seq_index].select_fds,
-              None, None)
-
-    def time_side_effect(*_args, **_kwargs):
-      return self._output_sequence[self._output_seq_index].ts
-
-    def poll_side_effect(*_args, **_kwargs):
-      if self._output_seq_index >= len(self._output_sequence) - 1:
-        self.mock_proc.returncode = self._return_value
-      return self.mock_proc.returncode
-
-    mock_read = mock.MagicMock(side_effect=read_side_effect)
-    mock_select = mock.MagicMock(side_effect=select_side_effect)
-    mock_time = mock.MagicMock(side_effect=time_side_effect)
-    self.mock_proc.poll = mock.MagicMock(side_effect=poll_side_effect)
-
-    # Set up but *do not start* the mocks.
-    self._mocks = [
-      mock.patch('fcntl.fcntl'),
-      mock.patch('os.read', new=mock_read),
-      mock.patch('select.select', new=mock_select),
-      mock.patch('time.time', new=mock_time),
-    ]
-
-  def __enter__(self):
-    for m in self._mocks:
-      m.__enter__()
-    return self.mock_proc
-
-  def __exit__(self, exc_type, exc_val, exc_tb):
-    for m in reversed(self._mocks):
-      m.__exit__(exc_type, exc_val, exc_tb)
-
-
-class CmdHelperIterCmdOutputLinesTest(unittest.TestCase):
-  """Test IterCmdOutputLines with some calls to the unix 'seq' command."""
-
-  # This calls _IterCmdOutputLines rather than IterCmdOutputLines s.t. it
-  # can mock the process.
-  # pylint: disable=protected-access
-
-  _SIMPLE_OUTPUT_SEQUENCE = [
-    _ProcessOutputEvent(read_contents='1\n2\n'),
-  ]
-
-  def testIterCmdOutputLines_success(self):
-    with _MockProcess(
-        output_sequence=self._SIMPLE_OUTPUT_SEQUENCE) as mock_proc:
-      for num, line in enumerate(
-          cmd_helper._IterCmdOutputLines(mock_proc, 'mock_proc'), 1):
-        self.assertEquals(num, int(line))
-
-  def testIterCmdOutputLines_exitStatusFail(self):
-    with self.assertRaises(subprocess.CalledProcessError):
-      with _MockProcess(output_sequence=self._SIMPLE_OUTPUT_SEQUENCE,
-                        return_value=1) as mock_proc:
-        for num, line in enumerate(
-            cmd_helper._IterCmdOutputLines(mock_proc, 'mock_proc'), 1):
-          self.assertEquals(num, int(line))
-        # after reading all the output we get an exit status of 1
-
-  def testIterCmdOutputLines_exitStatusIgnored(self):
-    with _MockProcess(output_sequence=self._SIMPLE_OUTPUT_SEQUENCE,
-                      return_value=1) as mock_proc:
-      for num, line in enumerate(
-          cmd_helper._IterCmdOutputLines(
-              mock_proc, 'mock_proc', check_status=False),
-          1):
-        self.assertEquals(num, int(line))
-
-  def testIterCmdOutputLines_exitStatusSkipped(self):
-    with _MockProcess(output_sequence=self._SIMPLE_OUTPUT_SEQUENCE,
-                      return_value=1) as mock_proc:
-      for num, line in enumerate(
-          cmd_helper._IterCmdOutputLines(mock_proc, 'mock_proc'), 1):
-        self.assertEquals(num, int(line))
-        # no exception will be raised because we don't attempt to read past
-        # the end of the output and, thus, the status never gets checked
-        if num == 2:
-          break
-
-  def testIterCmdOutputLines_delay(self):
-    output_sequence = [
-      _ProcessOutputEvent(read_contents='1\n2\n', ts=1),
-      _ProcessOutputEvent(read_contents=None, ts=2),
-      _ProcessOutputEvent(read_contents='Awake', ts=10),
-    ]
-    with _MockProcess(output_sequence=output_sequence) as mock_proc:
-      for num, line in enumerate(
-          cmd_helper._IterCmdOutputLines(mock_proc, 'mock_proc',
-                                         iter_timeout=5), 1):
-        if num <= 2:
-          self.assertEquals(num, int(line))
-        elif num == 3:
-          self.assertEquals(None, line)
-        elif num == 4:
-          self.assertEquals('Awake', line)
-        else:
-          self.fail()
-
-
-if __name__ == '__main__':
-  unittest.main()
diff --git a/third_party/catapult/devil/devil/utils/file_utils.py b/third_party/catapult/devil/devil/utils/file_utils.py
deleted file mode 100644
index dc5a9ef..0000000
--- a/third_party/catapult/devil/devil/utils/file_utils.py
+++ /dev/null
@@ -1,31 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import os
-
-
-def MergeFiles(dest_file, source_files):
-  """Merge list of files into single destination file.
-
-  Args:
-    dest_file: File to be written to.
-    source_files: List of files to be merged. Will be merged in the order they
-        appear in the list.
-  """
-  if not os.path.exists(os.path.dirname(dest_file)):
-    os.makedirs(os.path.dirname(dest_file))
-  try:
-    with open(dest_file, 'w') as dest_f:
-      for source_file in source_files:
-        with open(source_file, 'r') as source_f:
-          dest_f.write(source_f.read())
-  except Exception as e:  # pylint: disable=broad-except
-    # Something went wrong when creating dest_file. Cleaning up.
-    try:
-      os.remove(dest_file)
-    except OSError:
-      pass
-    raise e
-
-
diff --git a/third_party/catapult/devil/devil/utils/find_usb_devices.py b/third_party/catapult/devil/devil/utils/find_usb_devices.py
deleted file mode 100755
index 0e0f4d5..0000000
--- a/third_party/catapult/devil/devil/utils/find_usb_devices.py
+++ /dev/null
@@ -1,532 +0,0 @@
-#!/usr/bin/python
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import re
-import sys
-import argparse
-
-from devil.utils import cmd_helper
-from devil.utils import usb_hubs
-from devil.utils import lsusb
-
-# Note: In the documentation below, "virtual port" refers to the port number
-# as observed by the system (e.g. by usb-devices) and "physical port" refers
-# to the physical numerical label on the physical port e.g. on a USB hub.
-# The mapping between virtual and physical ports is not always the identity
-# (e.g. the port labeled "1" on a USB hub does not always show up as "port 1"
-# when you plug something into it) but, as far as we are aware, the mapping
-# between virtual and physical ports is always the same for a given
-# model of USB hub. When "port number" is referenced without specifying, it
-# means the virtual port number.
-
-
-# Wrapper functions for system commands to get output. These are in wrapper
-# functions so that they can be more easily mocked-out for tests.
-def _GetParsedLSUSBOutput():
-  return lsusb.lsusb()
-
-
-def _GetUSBDevicesOutput():
-  return cmd_helper.GetCmdOutput(['usb-devices'])
-
-
-def _GetTtyUSBInfo(tty_string):
-  cmd = ['udevadm', 'info', '--name=/dev/' + tty_string, '--attribute-walk']
-  return cmd_helper.GetCmdOutput(cmd)
-
-
-def _GetCommList():
-  return cmd_helper.GetCmdOutput('ls /dev', shell=True)
-
-
-def GetTTYList():
-  return [x for x in _GetCommList().splitlines() if 'ttyUSB' in x]
-
-
-# Class to identify nodes in the USB topology. USB topology is organized as
-# a tree.
-class USBNode(object):
-  def __init__(self):
-    self._port_to_node = {}
-
-  @property
-  def desc(self):
-    raise NotImplementedError
-
-  @property
-  def info(self):
-    raise NotImplementedError
-
-  @property
-  def device_num(self):
-    raise NotImplementedError
-
-  @property
-  def bus_num(self):
-    raise NotImplementedError
-
-  def HasPort(self, port):
-    """Determines if this device has a device connected to the given port."""
-    return port in self._port_to_node
-
-  def PortToDevice(self, port):
-    """Gets the device connected to the given port on this device."""
-    return self._port_to_node[port]
-
-  def Display(self, port_chain='', info=False):
-    """Displays information about this node and its descendants.
-
-    Output format is, e.g. 1:3:3:Device 42 (ID 1234:5678 Some Device)
-    meaning that from the bus, if you look at the device connected
-    to port 1, then the device connected to port 3 of that,
-    then the device connected to port 3 of that, you get the device
-    assigned device number 42, which is Some Device. Note that device
-    numbers will be reassigned whenever a connected device is powercycled
-    or reinserted, but port numbers stay the same as long as the device
-    is reinserted back into the same physical port.
-
-    Args:
-      port_chain: [string] Chain of ports from bus to this node (e.g. '2:4:')
-      info: [bool] Whether to display detailed info as well.
-    """
-    raise NotImplementedError
-
-  def AddChild(self, port, device):
-    """Adds child to the device tree.
-
-    Args:
-      port: [int] Port number of the device.
-      device: [USBDeviceNode] Device to add.
-
-    Raises:
-      ValueError: If device already has a child at the given port.
-    """
-    if self.HasPort(port):
-      raise ValueError('Duplicate port number')
-    else:
-      self._port_to_node[port] = device
-
-  def AllNodes(self):
-    """Generator that yields this node and all of its descendants.
-
-    Yields:
-      [USBNode] First this node, then each of its descendants (recursively)
-    """
-    yield self
-    for child_node in self._port_to_node.values():
-      for descendant_node in child_node.AllNodes():
-        yield descendant_node
-
-  def FindDeviceNumber(self, findnum):
-    """Find device with given number in tree
-
-    Searches the portion of the device tree rooted at this node for
-    a device with the given device number.
-
-    Args:
-      findnum: [int] Device number to search for.
-
-    Returns:
-      [USBDeviceNode] Node that is found.
-    """
-    for node in self.AllNodes():
-      if node.device_num == findnum:
-        return node
-    return None
-
-
-class USBDeviceNode(USBNode):
-  def __init__(self, bus_num=0, device_num=0, serial=None, info=None):
-    """Class that represents a device in USB tree.
-
-    Args:
-      bus_num: [int] Bus number that this node is attached to.
-      device_num: [int] Device number of this device (or 0, if this is a bus)
-      serial: [string] Serial number.
-      info: [dict] Map giving detailed device info.
-    """
-    super(USBDeviceNode, self).__init__()
-    self._bus_num = bus_num
-    self._device_num = device_num
-    self._serial = serial
-    self._info = {} if info is None else info
-
-  #override
-  @property
-  def desc(self):
-    return self._info.get('desc')
-
-  #override
-  @property
-  def info(self):
-    return self._info
-
-  #override
-  @property
-  def device_num(self):
-    return self._device_num
-
-  #override
-  @property
-  def bus_num(self):
-    return self._bus_num
-
-  @property
-  def serial(self):
-    return self._serial
-
-  @serial.setter
-  def serial(self, serial):
-    self._serial = serial
-
-  #override
-  def Display(self, port_chain='', info=False):
-    print '%s Device %d (%s)' % (port_chain, self.device_num, self.desc)
-    if info:
-      print self.info
-    for (port, device) in self._port_to_node.iteritems():
-      device.Display('%s%d:' % (port_chain, port), info=info)
-
-
-class USBBusNode(USBNode):
-  def __init__(self, bus_num=0):
-    """Class that represents a node (either a bus or device) in USB tree.
-
-    Args:
-      is_bus: [bool] If true, node is bus; if not, node is device.
-      bus_num: [int] Bus number that this node is attached to.
-      device_num: [int] Device number of this device (or 0, if this is a bus)
-      desc: [string] Short description of device.
-      serial: [string] Serial number.
-      info: [dict] Map giving detailed device info.
-      port_to_dev: [dict(int:USBDeviceNode)]
-          Maps port # to device connected to port.
-    """
-    super(USBBusNode, self).__init__()
-    self._bus_num = bus_num
-
-  #override
-  @property
-  def desc(self):
-    return 'BUS %d' % self._bus_num
-
-  #override
-  @property
-  def info(self):
-    return {}
-
-  #override
-  @property
-  def device_num(self):
-    return -1
-
-  #override
-  @property
-  def bus_num(self):
-    return self._bus_num
-
-  #override
-  def Display(self, port_chain='', info=False):
-    print "=== %s ===" % self.desc
-    for (port, device) in self._port_to_node.iteritems():
-      device.Display('%s%d:' % (port_chain, port), info=info)
-
-
-_T_LINE_REGEX = re.compile(r'T:  Bus=(?P<bus>\d{2}) Lev=(?P<lev>\d{2}) '
-                           r'Prnt=(?P<prnt>\d{2,3}) Port=(?P<port>\d{2}) '
-                           r'Cnt=(?P<cnt>\d{2}) Dev#=(?P<dev>.{3}) .*')
-
-_S_LINE_REGEX = re.compile(r'S:  SerialNumber=(?P<serial>.*)')
-_LSUSB_BUS_DEVICE_RE = re.compile(r'^Bus (\d{3}) Device (\d{3}): (.*)')
-
-
-def GetBusNumberToDeviceTreeMap(fast=True):
-  """Gets devices currently attached.
-
-  Args:
-    fast [bool]: whether to do it fast (only get description, not
-    the whole dictionary, from lsusb)
-
-  Returns:
-    map of {bus number: bus object}
-    where the bus object has all the devices attached to it in a tree.
-  """
-  if fast:
-    info_map = {}
-    for line in lsusb.raw_lsusb().splitlines():
-      match = _LSUSB_BUS_DEVICE_RE.match(line)
-      if match:
-        info_map[(int(match.group(1)), int(match.group(2)))] = (
-          {'desc':match.group(3)})
-  else:
-    info_map = {((int(line['bus']), int(line['device']))): line
-                for line in _GetParsedLSUSBOutput()}
-
-
-  tree = {}
-  bus_num = -1
-  for line in _GetUSBDevicesOutput().splitlines():
-    match = _T_LINE_REGEX.match(line)
-    if match:
-      bus_num = int(match.group('bus'))
-      parent_num = int(match.group('prnt'))
-      # usb-devices starts counting ports from 0, so add 1
-      port_num = int(match.group('port')) + 1
-      device_num = int(match.group('dev'))
-
-      # create new bus if necessary
-      if bus_num not in tree:
-        tree[bus_num] = USBBusNode(bus_num=bus_num)
-
-      # create the new device
-      new_device = USBDeviceNode(bus_num=bus_num,
-                                 device_num=device_num,
-                                 info=info_map.get((bus_num, device_num),
-                                                   {'desc': 'NOT AVAILABLE'}))
-
-      # add device to bus
-      if parent_num != 0:
-        tree[bus_num].FindDeviceNumber(parent_num).AddChild(
-            port_num, new_device)
-      else:
-        tree[bus_num].AddChild(port_num, new_device)
-
-    match = _S_LINE_REGEX.match(line)
-    if match:
-      if bus_num == -1:
-        raise ValueError('S line appears before T line in input file')
-      # put the serial number in the device
-      tree[bus_num].FindDeviceNumber(device_num).serial = match.group('serial')
-
-  return tree
-
-
-def GetHubsOnBus(bus, hub_types):
-  """Scans for all hubs on a bus of given hub types.
-
-  Args:
-    bus: [USBNode] Bus object.
-    hub_types: [iterable(usb_hubs.HubType)] Possible types of hubs.
-
-  Yields:
-    Sequence of tuples representing (hub, type of hub)
-  """
-  for device in bus.AllNodes():
-    for hub_type in hub_types:
-      if hub_type.IsType(device):
-        yield (device, hub_type)
-
-
-def GetPhysicalPortToNodeMap(hub, hub_type):
-  """Gets physical-port:node mapping for a given hub.
-  Args:
-    hub: [USBNode] Hub to get map for.
-    hub_type: [usb_hubs.HubType] Which type of hub it is.
-
-  Returns:
-    Dict of {physical port: node}
-  """
-  port_device = hub_type.GetPhysicalPortToNodeTuples(hub)
-  return {port: device for (port, device) in port_device}
-
-
-def GetPhysicalPortToBusDeviceMap(hub, hub_type):
-  """Gets physical-port:(bus#, device#) mapping for a given hub.
-  Args:
-    hub: [USBNode] Hub to get map for.
-    hub_type: [usb_hubs.HubType] Which type of hub it is.
-
-  Returns:
-    Dict of {physical port: (bus number, device number)}
-  """
-  port_device = hub_type.GetPhysicalPortToNodeTuples(hub)
-  return {port: (device.bus_num, device.device_num)
-          for (port, device) in port_device}
-
-
-def GetPhysicalPortToSerialMap(hub, hub_type):
-  """Gets physical-port:serial# mapping for a given hub.
-
-  Args:
-    hub: [USBNode] Hub to get map for.
-    hub_type: [usb_hubs.HubType] Which type of hub it is.
-
-  Returns:
-    Dict of {physical port: serial number)}
-  """
-  port_device = hub_type.GetPhysicalPortToNodeTuples(hub)
-  return {port: device.serial
-          for (port, device) in port_device
-          if device.serial}
-
-
-def GetPhysicalPortToTTYMap(device, hub_type):
-  """Gets physical-port:tty-string mapping for a given hub.
-  Args:
-    hub: [USBNode] Hub to get map for.
-    hub_type: [usb_hubs.HubType] Which type of hub it is.
-
-  Returns:
-    Dict of {physical port: tty-string)}
-  """
-  port_device = hub_type.GetPhysicalPortToNodeTuples(device)
-  bus_device_to_tty = GetBusDeviceToTTYMap()
-  return {port: bus_device_to_tty[(device.bus_num, device.device_num)]
-          for (port, device) in port_device
-          if (device.bus_num, device.device_num) in bus_device_to_tty}
-
-
-def CollectHubMaps(hub_types, map_func, device_tree_map=None, fast=False):
-  """Runs a function on all hubs in the system and collects their output.
-
-  Args:
-    hub_types: [usb_hubs.HubType] List of possible hub types.
-    map_func: [string] Function to run on each hub.
-    device_tree: Previously constructed device tree map, if any.
-    fast: Whether to construct device tree fast, if not already provided
-
-  Yields:
-    Sequence of dicts of {physical port: device} where the type of
-    device depends on the ident keyword. Each dict is a separate hub.
-  """
-  if device_tree_map is None:
-    device_tree_map = GetBusNumberToDeviceTreeMap(fast=fast)
-  for bus in device_tree_map.values():
-    for (hub, hub_type) in GetHubsOnBus(bus, hub_types):
-      yield map_func(hub, hub_type)
-
-
-def GetAllPhysicalPortToNodeMaps(hub_types, **kwargs):
-  return CollectHubMaps(hub_types, GetPhysicalPortToNodeMap, **kwargs)
-
-
-def GetAllPhysicalPortToBusDeviceMaps(hub_types, **kwargs):
-  return CollectHubMaps(hub_types, GetPhysicalPortToBusDeviceMap, **kwargs)
-
-
-def GetAllPhysicalPortToSerialMaps(hub_types, **kwargs):
-  return CollectHubMaps(hub_types, GetPhysicalPortToSerialMap, **kwargs)
-
-
-def GetAllPhysicalPortToTTYMaps(hub_types, **kwargs):
-  return CollectHubMaps(hub_types, GetPhysicalPortToTTYMap, **kwargs)
-
-
-_BUS_NUM_REGEX = re.compile(r'.*ATTRS{busnum}=="(\d*)".*')
-_DEVICE_NUM_REGEX = re.compile(r'.*ATTRS{devnum}=="(\d*)".*')
-
-
-def GetBusDeviceFromTTY(tty_string):
-  """Gets bus and device number connected to a ttyUSB port.
-
-  Args:
-    tty_string: [String] Identifier for ttyUSB (e.g. 'ttyUSB0')
-
-  Returns:
-    Tuple (bus, device) giving device connected to that ttyUSB.
-
-  Raises:
-    ValueError: If bus and device information could not be found.
-  """
-  bus_num = None
-  device_num = None
-  # Expected output of GetCmdOutput should be something like:
-  # looking at device /devices/something/.../.../...
-  # KERNELS="ttyUSB0"
-  # SUBSYSTEMS=...
-  # DRIVERS=...
-  # ATTRS{foo}=...
-  # ATTRS{bar}=...
-  # ...
-  for line in _GetTtyUSBInfo(tty_string).splitlines():
-    bus_match = _BUS_NUM_REGEX.match(line)
-    device_match = _DEVICE_NUM_REGEX.match(line)
-    if bus_match and bus_num == None:
-      bus_num = int(bus_match.group(1))
-    if device_match and device_num == None:
-      device_num = int(device_match.group(1))
-  if bus_num is None or device_num is None:
-    raise ValueError('Info not found')
-  return (bus_num, device_num)
-
-
-def GetBusDeviceToTTYMap():
-  """Gets all mappings from (bus, device) to ttyUSB string.
-
-  Gets mapping from (bus, device) to ttyUSB string (e.g. 'ttyUSB0'),
-  for all ttyUSB strings currently active.
-
-  Returns:
-    [dict] Dict that maps (bus, device) to ttyUSB string
-  """
-  result = {}
-  for tty in GetTTYList():
-    result[GetBusDeviceFromTTY(tty)] = tty
-  return result
-
-
-# This dictionary described the mapping between physical and
-# virtual ports on a Plugable 7-Port Hub (model USB2-HUB7BC).
-# Keys are the virtual ports, values are the physical port.
-# The entry 4:{1:4, 2:3, 3:2, 4:1} indicates that virtual port
-# 4 connects to another 'virtual' hub that itself has the
-# virtual-to-physical port mapping {1:4, 2:3, 3:2, 4:1}.
-
-
-def TestUSBTopologyScript():
-  """Test display and hub identification."""
-  # Identification criteria for Plugable 7-Port Hub
-  print '==== USB TOPOLOGY SCRIPT TEST ===='
-
-  # Display devices
-  print '==== DEVICE DISPLAY ===='
-  device_trees = GetBusNumberToDeviceTreeMap()
-  for device_tree in device_trees.values():
-    device_tree.Display()
-  print
-
-  # Display TTY information about devices plugged into hubs.
-  print '==== TTY INFORMATION ===='
-  for port_map in GetAllPhysicalPortToTTYMaps(
-      usb_hubs.ALL_HUBS, device_tree_map=device_trees):
-    print port_map
-  print
-
-  # Display serial number information about devices plugged into hubs.
-  print '==== SERIAL NUMBER INFORMATION ===='
-  for port_map in GetAllPhysicalPortToSerialMaps(
-      usb_hubs.ALL_HUBS, device_tree_map=device_trees):
-    print port_map
-
-
-  return 0
-
-
-def parse_options(argv):
-  """Parses and checks the command-line options.
-
-  Returns:
-    A tuple containing the options structure and a list of categories to
-    be traced.
-  """
-  USAGE = '''./find_usb_devices [--help]
-    This script shows the mapping between USB devices and port numbers.
-    Clients are not intended to call this script from the command line.
-    Clients are intended to call the functions in this script directly.
-    For instance, GetAllPhysicalPortToSerialMaps(...)
-    Running this script with --help will display this message.
-    Running this script without --help will display information about
-    devices attached, TTY mapping, and serial number mapping,
-    for testing purposes. See design document for API documentation.
-  '''
-  parser = argparse.ArgumentParser(usage=USAGE)
-  return parser.parse_args(argv[1:])
-
-def main():
-  parse_options(sys.argv)
-  TestUSBTopologyScript()
-
-if __name__ == "__main__":
-  sys.exit(main())
diff --git a/third_party/catapult/devil/devil/utils/find_usb_devices_test.py b/third_party/catapult/devil/devil/utils/find_usb_devices_test.py
deleted file mode 100755
index e8b00c8..0000000
--- a/third_party/catapult/devil/devil/utils/find_usb_devices_test.py
+++ /dev/null
@@ -1,379 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# pylint: disable=protected-access
-
-"""
-Unit tests for the contents of find_usb_devices.py.
-
-Device tree for these tests is as follows:
-Bus 001:
-1: Device 011 "foo"
-2: Device 012 "bar"
-3: Device 013 "baz"
-
-Bus 002:
-1: Device 011 "quux"
-2: Device 020 "My Test HUB" #hub 1
-2:1: Device 021 "battor_p7_h1_t0" #physical port 7 on hub 1, on ttyUSB0
-2:3: Device 022 "battor_p5_h1_t1" #physical port 5 on hub 1, on ttyUSB1
-2:4: Device 023 "My Test Internal HUB" #internal section of hub 1
-2:4:2: Device 024 "battor_p3_h1_t2" #physical port 3 on hub 1, on ttyUSB2
-2:4:3: Device 026 "Not a Battery Monitor" #physical port 1 on hub 1, on ttyUSB3
-2:4:4: Device 025 "battor_p1_h1_t3" #physical port 1 on hub 1, on ttyUSB3
-3: Device 100 "My Test HUB" #hub 2
-3:4: Device 101 "My Test Internal HUB" #internal section of hub 2
-3:4:4: Device 102 "battor_p1_h2_t4" #physical port 1 on hub 2, on ttyusb4
-"""
-
-import logging
-import os
-import unittest
-
-from devil import devil_env
-from devil.utils import battor_device_mapping
-from devil.utils import find_usb_devices
-from devil.utils import lsusb
-from devil.utils import usb_hubs
-
-with devil_env.SysPath(devil_env.PYMOCK_PATH):
-  import mock # pylint: disable=import-error
-
-# Output of lsusb.lsusb().
-# We just test that the dictionary is working by creating an
-# "ID number" equal to (bus_num*1000)+device_num and seeing if
-# it is picked up correctly. Also we test the description
-
-DEVLIST = [(1, 11, 'foo'),
-           (1, 12, 'bar'),
-           (1, 13, 'baz'),
-           (2, 11, 'quux'),
-           (2, 20, 'My Test HUB'),
-           (2, 21, 'ID 0403:6001 battor_p7_h1_t0'),
-           (2, 22, 'ID 0403:6001 battor_p5_h1_t1'),
-           (2, 23, 'My Test Internal HUB'),
-           (2, 24, 'ID 0403:6001 battor_p3_h1_t2'),
-           (2, 25, 'ID 0403:6001 battor_p1_h1_t3'),
-           (2, 26, 'Not a Battery Monitor'),
-           (2, 100, 'My Test HUB'),
-           (2, 101, 'My Test Internal HUB'),
-           (2, 102, 'ID 0403:6001 battor_p1_h1_t4')]
-
-LSUSB_OUTPUT = [
-  {'bus': b, 'device': d, 'desc': t, 'id': (1000*b)+d}
-       for (b, d, t) in DEVLIST]
-
-
-# Note: "Lev", "Cnt", "Spd", and "MxCh" are not used by parser,
-# so we just leave them as zeros here. Also note that the port
-# numbers reported here start at 0, so they're 1 less than the
-# port numbers reported elsewhere.
-USB_DEVICES_OUTPUT = '''
-T:  Bus=01 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 11 Spd=000 MxCh=00
-S:  SerialNumber=FooSerial
-T:  Bus=01 Lev=00 Prnt=00 Port=01 Cnt=00 Dev#= 12 Spd=000 MxCh=00
-S:  SerialNumber=BarSerial
-T:  Bus=01 Lev=00 Prnt=00 Port=02 Cnt=00 Dev#= 13 Spd=000 MxCh=00
-S:  SerialNumber=BazSerial
-
-T:  Bus=02 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 11 Spd=000 MxCh=00
-
-T:  Bus=02 Lev=00 Prnt=00 Port=01 Cnt=00 Dev#= 20 Spd=000 MxCh=00
-T:  Bus=02 Lev=00 Prnt=20 Port=00 Cnt=00 Dev#= 21 Spd=000 MxCh=00
-S:  SerialNumber=BattOr0
-T:  Bus=02 Lev=00 Prnt=20 Port=02 Cnt=00 Dev#= 22 Spd=000 MxCh=00
-S:  SerialNumber=BattOr1
-T:  Bus=02 Lev=00 Prnt=20 Port=03 Cnt=00 Dev#= 23 Spd=000 MxCh=00
-T:  Bus=02 Lev=00 Prnt=23 Port=01 Cnt=00 Dev#= 24 Spd=000 MxCh=00
-S:  SerialNumber=BattOr2
-T:  Bus=02 Lev=00 Prnt=23 Port=03 Cnt=00 Dev#= 25 Spd=000 MxCh=00
-S:  SerialNumber=BattOr3
-T:  Bus=02 Lev=00 Prnt=23 Port=02 Cnt=00 Dev#= 26 Spd=000 MxCh=00
-
-T:  Bus=02 Lev=00 Prnt=00 Port=02 Cnt=00 Dev#=100 Spd=000 MxCh=00
-T:  Bus=02 Lev=00 Prnt=100 Port=03 Cnt=00 Dev#=101 Spd=000 MxCh=00
-T:  Bus=02 Lev=00 Prnt=101 Port=03 Cnt=00 Dev#=102 Spd=000 MxCh=00
-'''
-
-RAW_LSUSB_OUTPUT = '''
-Bus 001 Device 011: FAST foo
-Bus 001 Device 012: FAST bar
-Bus 001 Device 013: baz
-Bus 002 Device 011: quux
-Bus 002 Device 020: My Test HUB
-Bus 002 Device 021: ID 0403:6001 battor_p7_h1_t0
-Bus 002 Device 022: ID 0403:6001 battor_p5_h1_t1
-Bus 002 Device 023: My Test Internal HUB
-Bus 002 Device 024: ID 0403:6001 battor_p3_h1_t2
-Bus 002 Device 025: ID 0403:6001 battor_p1_h1_t3
-Bus 002 Device 026: Not a Battery Monitor
-Bus 002 Device 100: My Test HUB
-Bus 002 Device 101: My Test Internal HUB
-Bus 002 Device 102: ID 0403:6001 battor_p1_h1_t4
-'''
-
-LIST_TTY_OUTPUT = '''
-ttyUSB0
-Something-else-0
-ttyUSB1
-ttyUSB2
-Something-else-1
-ttyUSB3
-ttyUSB4
-Something-else-2
-ttyUSB5
-'''
-
-# Note: The real output will have multiple lines with
-# ATTRS{busnum} and ATTRS{devnum}, but only the first
-# one counts. Thus the test output duplicates this.
-UDEVADM_USBTTY0_OUTPUT = '''
-ATTRS{busnum}=="2"
-ATTRS{devnum}=="21"
-ATTRS{busnum}=="0"
-ATTRS{devnum}=="0"
-'''
-
-UDEVADM_USBTTY1_OUTPUT = '''
-ATTRS{busnum}=="2"
-ATTRS{devnum}=="22"
-ATTRS{busnum}=="0"
-ATTRS{devnum}=="0"
-'''
-
-UDEVADM_USBTTY2_OUTPUT = '''
-ATTRS{busnum}=="2"
-ATTRS{devnum}=="24"
-ATTRS{busnum}=="0"
-ATTRS{devnum}=="0"
-'''
-
-UDEVADM_USBTTY3_OUTPUT = '''
-ATTRS{busnum}=="2"
-ATTRS{devnum}=="25"
-ATTRS{busnum}=="0"
-ATTRS{devnum}=="0"
-'''
-
-UDEVADM_USBTTY4_OUTPUT = '''
-ATTRS{busnum}=="2"
-ATTRS{devnum}=="102"
-ATTRS{busnum}=="0"
-ATTRS{devnum}=="0"
-'''
-
-UDEVADM_USBTTY5_OUTPUT = '''
-ATTRS{busnum}=="2"
-ATTRS{devnum}=="26"
-ATTRS{busnum}=="0"
-ATTRS{devnum}=="0"
-'''
-
-UDEVADM_OUTPUT_DICT = {
-  'ttyUSB0': UDEVADM_USBTTY0_OUTPUT,
-  'ttyUSB1': UDEVADM_USBTTY1_OUTPUT,
-  'ttyUSB2': UDEVADM_USBTTY2_OUTPUT,
-  'ttyUSB3': UDEVADM_USBTTY3_OUTPUT,
-  'ttyUSB4': UDEVADM_USBTTY4_OUTPUT,
-  'ttyUSB5': UDEVADM_USBTTY5_OUTPUT}
-
-# Identification criteria for Plugable 7-Port Hub
-def isTestHub(node):
-  """Check if a node is a Plugable 7-Port Hub
-  (Model USB2-HUB7BC)
-  The topology of this device is a 4-port hub,
-  with another 4-port hub connected on port 4.
-  """
-  if not isinstance(node, find_usb_devices.USBDeviceNode):
-    return False
-  if 'Test HUB' not in node.desc:
-    return False
-  if not node.HasPort(4):
-    return False
-  return 'Test Internal HUB' in node.PortToDevice(4).desc
-
-TEST_HUB = usb_hubs.HubType(isTestHub,
-                            {1:7,
-                             2:6,
-                             3:5,
-                             4:{1:4, 2:3, 3:2, 4:1}})
-
-class USBScriptTest(unittest.TestCase):
-  def setUp(self):
-    find_usb_devices._GetTtyUSBInfo = mock.Mock(
-        side_effect=lambda x: UDEVADM_OUTPUT_DICT[x])
-    find_usb_devices._GetParsedLSUSBOutput = mock.Mock(
-        return_value=LSUSB_OUTPUT)
-    find_usb_devices._GetUSBDevicesOutput = mock.Mock(
-        return_value=USB_DEVICES_OUTPUT)
-    find_usb_devices._GetCommList = mock.Mock(
-        return_value=LIST_TTY_OUTPUT)
-    lsusb.raw_lsusb = mock.Mock(
-        return_value=RAW_LSUSB_OUTPUT)
-
-  def testIsBattOr(self):
-    bd = find_usb_devices.GetBusNumberToDeviceTreeMap()
-    self.assertTrue(battor_device_mapping.IsBattOr('ttyUSB3', bd))
-    self.assertFalse(battor_device_mapping.IsBattOr('ttyUSB5', bd))
-
-  def testGetBattOrs(self):
-    bd = find_usb_devices.GetBusNumberToDeviceTreeMap()
-    self.assertEquals(battor_device_mapping.GetBattOrList(bd),
-                          ['ttyUSB0', 'ttyUSB1', 'ttyUSB2',
-                           'ttyUSB3', 'ttyUSB4'])
-
-  def testGetTTYDevices(self):
-    pp = find_usb_devices.GetAllPhysicalPortToTTYMaps([TEST_HUB])
-    result = list(pp)
-    self.assertEquals(result[0], {7:'ttyUSB0',
-                                  5:'ttyUSB1',
-                                  3:'ttyUSB2',
-                                  2:'ttyUSB5',
-                                  1:'ttyUSB3'})
-    self.assertEquals(result[1], {1:'ttyUSB4'})
-
-  def testGetPortDeviceMapping(self):
-    pp = find_usb_devices.GetAllPhysicalPortToBusDeviceMaps([TEST_HUB])
-    result = list(pp)
-    self.assertEquals(result[0], {7:(2, 21),
-                                  5:(2, 22),
-                                  3:(2, 24),
-                                  2:(2, 26),
-                                  1:(2, 25)})
-    self.assertEquals(result[1], {1:(2, 102)})
-
-  def testGetSerialMapping(self):
-    pp = find_usb_devices.GetAllPhysicalPortToSerialMaps([TEST_HUB])
-    result = list(pp)
-    self.assertEquals(result[0], {7:'BattOr0',
-                                  5:'BattOr1',
-                                  3:'BattOr2',
-                                  1:'BattOr3'})
-    self.assertEquals(result[1], {})
-
-  def testFastDeviceDescriptions(self):
-    bd = find_usb_devices.GetBusNumberToDeviceTreeMap()
-    dev_foo = bd[1].FindDeviceNumber(11)
-    dev_bar = bd[1].FindDeviceNumber(12)
-    dev_battor_p7_h1_t0 = bd[2].FindDeviceNumber(21)
-    self.assertEquals(dev_foo.desc, 'FAST foo')
-    self.assertEquals(dev_bar.desc, 'FAST bar')
-    self.assertEquals(dev_battor_p7_h1_t0.desc,
-        'ID 0403:6001 battor_p7_h1_t0')
-
-  def testDeviceDescriptions(self):
-    bd = find_usb_devices.GetBusNumberToDeviceTreeMap(fast=False)
-    dev_foo = bd[1].FindDeviceNumber(11)
-    dev_bar = bd[1].FindDeviceNumber(12)
-    dev_battor_p7_h1_t0 = bd[2].FindDeviceNumber(21)
-    self.assertEquals(dev_foo.desc, 'foo')
-    self.assertEquals(dev_bar.desc, 'bar')
-    self.assertEquals(dev_battor_p7_h1_t0.desc,
-        'ID 0403:6001 battor_p7_h1_t0')
-
-  def testDeviceInformation(self):
-    bd = find_usb_devices.GetBusNumberToDeviceTreeMap(fast=False)
-    dev_foo = bd[1].FindDeviceNumber(11)
-    dev_bar = bd[1].FindDeviceNumber(12)
-    dev_battor_p7_h1_t0 = bd[2].FindDeviceNumber(21)
-    self.assertEquals(dev_foo.info['id'], 1011)
-    self.assertEquals(dev_bar.info['id'], 1012)
-    self.assertEquals(dev_battor_p7_h1_t0.info['id'], 2021)
-
-  def testSerialNumber(self):
-    bd = find_usb_devices.GetBusNumberToDeviceTreeMap(fast=False)
-    dev_foo = bd[1].FindDeviceNumber(11)
-    dev_bar = bd[1].FindDeviceNumber(12)
-    dev_battor_p7_h1_t0 = bd[2].FindDeviceNumber(21)
-    self.assertEquals(dev_foo.serial, 'FooSerial')
-    self.assertEquals(dev_bar.serial, 'BarSerial')
-    self.assertEquals(dev_battor_p7_h1_t0.serial, 'BattOr0')
-
-  def testBattOrDictMapping(self):
-    map_dict = {'Phone1':'BattOr1', 'Phone2':'BattOr2', 'Phone3':'BattOr3'}
-    a1 = battor_device_mapping.GetBattOrPathFromPhoneSerial(
-             'Phone1', serial_map=map_dict)
-    a2 = battor_device_mapping.GetBattOrPathFromPhoneSerial(
-             'Phone2', serial_map=map_dict)
-    a3 = battor_device_mapping.GetBattOrPathFromPhoneSerial(
-             'Phone3', serial_map=map_dict)
-    self.assertEquals(a1, '/dev/ttyUSB1')
-    self.assertEquals(a2, '/dev/ttyUSB2')
-    self.assertEquals(a3, '/dev/ttyUSB3')
-
-  def testBattOrDictFromFileMapping(self):
-    try:
-      map_dict = {'Phone1':'BattOr1', 'Phone2':'BattOr2', 'Phone3':'BattOr3'}
-      curr_dir = os.path.dirname(os.path.realpath(__file__))
-      filename = os.path.join(curr_dir, 'test', 'data', 'test_write_map.json')
-      battor_device_mapping.WriteSerialMapFile(filename, map_dict)
-      a1 = battor_device_mapping.GetBattOrPathFromPhoneSerial(
-               'Phone1', serial_map_file=filename)
-      a2 = battor_device_mapping.GetBattOrPathFromPhoneSerial(
-               'Phone2', serial_map_file=filename)
-      a3 = battor_device_mapping.GetBattOrPathFromPhoneSerial(
-               'Phone3', serial_map_file=filename)
-    finally:
-      os.remove(filename)
-    self.assertEquals(a1, '/dev/ttyUSB1')
-    self.assertEquals(a2, '/dev/ttyUSB2')
-    self.assertEquals(a3, '/dev/ttyUSB3')
-
-  def testReadSerialMapFile(self):
-    curr_dir = os.path.dirname(os.path.realpath(__file__))
-    map_dict = battor_device_mapping.ReadSerialMapFile(
-        os.path.join(curr_dir, 'test', 'data', 'test_serial_map.json'))
-    self.assertEquals(len(map_dict.keys()), 3)
-    self.assertEquals(map_dict['Phone1'], 'BattOr1')
-    self.assertEquals(map_dict['Phone2'], 'BattOr2')
-    self.assertEquals(map_dict['Phone3'], 'BattOr3')
-
-original_PPTSM = find_usb_devices.GetAllPhysicalPortToSerialMaps
-original_PPTTM = find_usb_devices.GetAllPhysicalPortToTTYMaps
-original_GBL = battor_device_mapping.GetBattOrList
-original_GBNDM = find_usb_devices.GetBusNumberToDeviceTreeMap
-original_IB = battor_device_mapping.IsBattOr
-original_GBSM = battor_device_mapping.GetBattOrSerialNumbers
-
-def setup_battor_test(serial, tty, battor, bser=None):
-  serial_mapper = mock.Mock(return_value=serial)
-  tty_mapper = mock.Mock(return_value=tty)
-  battor_lister = mock.Mock(return_value=battor)
-  devtree = mock.Mock(return_value=None)
-  is_battor = mock.Mock(side_effect=lambda x, y: x in battor)
-  battor_serials = mock.Mock(return_value=bser)
-  find_usb_devices.GetAllPhysicalPortToSerialMaps = serial_mapper
-  find_usb_devices.GetAllPhysicalPortToTTYMaps = tty_mapper
-  battor_device_mapping.GetBattOrList = battor_lister
-  find_usb_devices.GetBusNumberToDeviceTreeMap = devtree
-  battor_device_mapping.IsBattOr = is_battor
-  battor_device_mapping.GetBattOrSerialNumbers = battor_serials
-
-class BattOrMappingTest(unittest.TestCase):
-  def tearDown(self):
-    find_usb_devices.GetAllPhysicalPortToSerialMaps = original_PPTSM
-    find_usb_devices.GetAllPhysicalPortToTTYMaps = original_PPTTM
-    battor_device_mapping.GetBattOrList = original_GBL
-    find_usb_devices.GetBusNumberToDeviceTreeMap = original_GBNDM
-    battor_device_mapping.IsBattOr = original_IB
-    battor_device_mapping.GetBattOrSerialNumbers = original_GBSM
-
-  def test_generate_serial_map(self):
-    setup_battor_test([{1:'Phn1', 2:'Phn2', 3:'Phn3'},
-                       {1:'Bat1', 2:'Bat2', 3:'Bat3'}],
-                      [{},
-                       {1:'ttyUSB0', 2:'ttyUSB1', 3:'ttyUSB2'}],
-                      ['ttyUSB0', 'ttyUSB1', 'ttyUSB2'],
-                      ['Bat1', 'Bat2', 'Bat3'])
-    result = battor_device_mapping.GenerateSerialMap()
-    self.assertEqual(len(result), 3)
-    self.assertEqual(result['Phn1'], 'Bat1')
-    self.assertEqual(result['Phn2'], 'Bat2')
-    self.assertEqual(result['Phn3'], 'Bat3')
-
-
-if __name__ == "__main__":
-  logging.getLogger().setLevel(logging.DEBUG)
-  unittest.main(verbosity=2)
diff --git a/third_party/catapult/devil/devil/utils/geometry.py b/third_party/catapult/devil/devil/utils/geometry.py
deleted file mode 100644
index da21770..0000000
--- a/third_party/catapult/devil/devil/utils/geometry.py
+++ /dev/null
@@ -1,75 +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.
-
-"""Objects for convenient manipulation of points and other surface areas."""
-
-import collections
-
-
-class Point(collections.namedtuple('Point', ['x', 'y'])):
-  """Object to represent an (x, y) point on a surface.
-
-  Args:
-    x, y: Two numeric coordinates that define the point.
-  """
-  __slots__ = ()
-
-  def __str__(self):
-    """Get a useful string representation of the object."""
-    return '(%s, %s)' % (self.x, self.y)
-
-  def __add__(self, other):
-    """Sum of two points, e.g. p + q."""
-    if isinstance(other, Point):
-      return Point(self.x + other.x, self.y + other.y)
-    else:
-      return NotImplemented
-
-  def __mul__(self, factor):
-    """Multiplication on the right is not implemented."""
-    # This overrides the default behaviour of a tuple multiplied by a constant
-    # on the right, which does not make sense for a Point.
-    return NotImplemented
-
-  def __rmul__(self, factor):
-    """Multiply a point by a scalar factor on the left, e.g. 2 * p."""
-    return Point(factor * self.x, factor * self.y)
-
-
-class Rectangle(
-    collections.namedtuple('Rectangle', ['top_left', 'bottom_right'])):
-  """Object to represent a rectangle on a surface.
-
-  Args:
-    top_left: A pair of (left, top) coordinates. Might be given as a Point
-      or as a two-element sequence (list, tuple, etc.).
-    bottom_right: A pair (right, bottom) coordinates.
-  """
-  __slots__ = ()
-
-  def __new__(cls, top_left, bottom_right):
-    if not isinstance(top_left, Point):
-      top_left = Point(*top_left)
-    if not isinstance(bottom_right, Point):
-      bottom_right = Point(*bottom_right)
-    return super(Rectangle, cls).__new__(cls, top_left, bottom_right)
-
-  def __str__(self):
-    """Get a useful string representation of the object."""
-    return '[%s, %s]' % (self.top_left, self.bottom_right)
-
-  @property
-  def center(self):
-    """Get the point at the center of the rectangle."""
-    return 0.5 * (self.top_left + self.bottom_right)
-
-  @classmethod
-  def FromDict(cls, d):
-    """Create a rectangle object from a dictionary.
-
-    Args:
-      d: A dictionary (or mapping) of the form, e.g., {'top': 0, 'left': 0,
-         'bottom': 1, 'right': 1}.
-    """
-    return cls(Point(d['left'], d['top']), Point(d['right'], d['bottom']))
diff --git a/third_party/catapult/devil/devil/utils/geometry_test.py b/third_party/catapult/devil/devil/utils/geometry_test.py
deleted file mode 100644
index af69442..0000000
--- a/third_party/catapult/devil/devil/utils/geometry_test.py
+++ /dev/null
@@ -1,61 +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.
-
-"""Tests for the geometry module."""
-
-import unittest
-
-from devil.utils import geometry as g
-
-
-class PointTest(unittest.TestCase):
-
-  def testStr(self):
-    p = g.Point(1, 2)
-    self.assertEquals(str(p), '(1, 2)')
-
-  def testAdd(self):
-    p = g.Point(1, 2)
-    q = g.Point(3, 4)
-    r = g.Point(4, 6)
-    self.assertEquals(p + q, r)
-
-  def testAdd_TypeErrorWithInvalidOperands(self):
-    # pylint: disable=pointless-statement
-    p = g.Point(1, 2)
-    with self.assertRaises(TypeError):
-      p + 4  # Can't add point and scalar.
-    with self.assertRaises(TypeError):
-      4 + p  # Can't add scalar and point.
-
-  def testMult(self):
-    p = g.Point(1, 2)
-    r = g.Point(2, 4)
-    self.assertEquals(2 * p, r)  # Multiply by scalar on the left.
-
-  def testMult_TypeErrorWithInvalidOperands(self):
-    # pylint: disable=pointless-statement
-    p = g.Point(1, 2)
-    q = g.Point(2, 4)
-    with self.assertRaises(TypeError):
-      p * q  # Can't multiply points.
-    with self.assertRaises(TypeError):
-      p * 4  # Can't multiply by a scalar on the right.
-
-
-class RectangleTest(unittest.TestCase):
-
-  def testStr(self):
-    r = g.Rectangle(g.Point(0, 1), g.Point(2, 3))
-    self.assertEquals(str(r), '[(0, 1), (2, 3)]')
-
-  def testCenter(self):
-    r = g.Rectangle(g.Point(0, 1), g.Point(2, 3))
-    c = g.Point(1, 2)
-    self.assertEquals(r.center, c)
-
-  def testFromJson(self):
-    r1 = g.Rectangle(g.Point(0, 1), g.Point(2, 3))
-    r2 = g.Rectangle.FromDict({'top': 1, 'left': 0, 'bottom': 3, 'right': 2})
-    self.assertEquals(r1, r2)
diff --git a/third_party/catapult/devil/devil/utils/host_utils.py b/third_party/catapult/devil/devil/utils/host_utils.py
deleted file mode 100644
index 580721f..0000000
--- a/third_party/catapult/devil/devil/utils/host_utils.py
+++ /dev/null
@@ -1,16 +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.
-
-import os
-
-
-def GetRecursiveDiskUsage(path):
-  """Returns the disk usage in bytes of |path|. Similar to `du -sb |path|`."""
-  running_size = os.path.getsize(path)
-  if os.path.isdir(path):
-    for root, dirs, files in os.walk(path):
-      running_size += sum([os.path.getsize(os.path.join(root, f))
-                           for f in files + dirs])
-  return running_size
-
diff --git a/third_party/catapult/devil/devil/utils/lazy/__init__.py b/third_party/catapult/devil/devil/utils/lazy/__init__.py
deleted file mode 100644
index 3cc56c0..0000000
--- a/third_party/catapult/devil/devil/utils/lazy/__init__.py
+++ /dev/null
@@ -1,5 +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.
-
-from devil.utils.lazy.weak_constant import WeakConstant
diff --git a/third_party/catapult/devil/devil/utils/lazy/weak_constant.py b/third_party/catapult/devil/devil/utils/lazy/weak_constant.py
deleted file mode 100644
index 3558f29..0000000
--- a/third_party/catapult/devil/devil/utils/lazy/weak_constant.py
+++ /dev/null
@@ -1,29 +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.
-
-import threading
-
-
-class WeakConstant(object):
-  """A thread-safe, lazily initialized object.
-
-  This does not support modification after initialization. The intended
-  constant nature of the object is not enforced, though, hence the "weak".
-  """
-
-  def __init__(self, initializer):
-    self._initialized = False
-    self._initializer = initializer
-    self._lock = threading.Lock()
-    self._val = None
-
-  def read(self):
-    """Get the object, creating it if necessary."""
-    if self._initialized:
-      return self._val
-    with self._lock:
-      if not self._initialized:
-        self._val = self._initializer()
-        self._initialized = True
-    return self._val
diff --git a/third_party/catapult/devil/devil/utils/lsusb.py b/third_party/catapult/devil/devil/utils/lsusb.py
deleted file mode 100644
index 6cbf256..0000000
--- a/third_party/catapult/devil/devil/utils/lsusb.py
+++ /dev/null
@@ -1,174 +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.
-
-import logging
-import re
-
-from devil.utils import cmd_helper
-
-logger = logging.getLogger(__name__)
-
-_COULDNT_OPEN_ERROR_RE = re.compile(r'Couldn\'t open device.*')
-_INDENTATION_RE = re.compile(r'^( *)')
-_LSUSB_BUS_DEVICE_RE = re.compile(r'^Bus (\d{3}) Device (\d{3}): (.*)')
-_LSUSB_ENTRY_RE = re.compile(r'^ *([^ ]+) +([^ ]+) *([^ ].*)?$')
-_LSUSB_GROUP_RE = re.compile(r'^ *([^ ]+.*):$')
-
-
-def _lsusbv_on_device(bus_id, dev_id):
-  """Calls lsusb -v on device."""
-  _, raw_output = cmd_helper.GetCmdStatusAndOutputWithTimeout(
-      ['lsusb', '-v', '-s', '%s:%s' % (bus_id, dev_id)], timeout=10)
-
-  device = {'bus': bus_id, 'device': dev_id}
-  depth_stack = [device]
-
-  # This builds a nested dict -- a tree, basically -- that corresponds
-  # to the lsusb output. It looks first for a line containing
-  #
-  #   "Bus <bus number> Device <device number>: ..."
-  #
-  # and uses that to create the root node. It then parses all remaining
-  # lines as a tree, with the indentation level determining the
-  # depth of the new node.
-  #
-  # This expects two kinds of lines:
-  #   - "groups", which take the form
-  #       "<Group name>:"
-  #     and typically have children, and
-  #   - "entries", which take the form
-  #       "<entry name>   <entry value>  <possible entry description>"
-  #     and typically do not have children (but can).
-  #
-  # This maintains a stack containing all current ancestor nodes in
-  # order to add new nodes to the proper place in the tree.
-  # The stack is added to when a new node is parsed. Nodes are removed
-  # from the stack when they are either at the same indentation level as
-  # or a deeper indentation level than the current line.
-  #
-  # e.g. the following lsusb output:
-  #
-  # Bus 123 Device 456: School bus
-  # Device Descriptor:
-  #   bDeviceClass 5 Actual School Bus
-  #   Configuration Descriptor:
-  #     bLength 20 Rows
-  #
-  # would produce the following dict:
-  #
-  # {
-  #   'bus': 123,
-  #   'device': 456,
-  #   'desc': 'School bus',
-  #   'Device Descriptor': {
-  #     'bDeviceClass': {
-  #       '_value': '5',
-  #       '_desc': 'Actual School Bus',
-  #     },
-  #     'Configuration Descriptor': {
-  #       'bLength': {
-  #         '_value': '20',
-  #         '_desc': 'Rows',
-  #       },
-  #     },
-  #   }
-  # }
-  for line in raw_output.splitlines():
-    # Ignore blank lines.
-    if not line:
-      continue
-    # Filter out error mesage about opening device.
-    if _COULDNT_OPEN_ERROR_RE.match(line):
-      continue
-    # Find start of device information.
-    m = _LSUSB_BUS_DEVICE_RE.match(line)
-    if m:
-      if m.group(1) != bus_id:
-        logger.warning(
-            'Expected bus_id value: %r, seen %r', bus_id, m.group(1))
-      if m.group(2) != dev_id:
-        logger.warning(
-            'Expected dev_id value: %r, seen %r', dev_id, m.group(2))
-      device['desc'] = m.group(3)
-      continue
-
-    # Skip any lines that aren't indented, as they're not part of the
-    # device descriptor.
-    indent_match = _INDENTATION_RE.match(line)
-    if not indent_match:
-      continue
-
-    # Determine the indentation depth.
-    depth = 1 + len(indent_match.group(1)) / 2
-    if depth > len(depth_stack):
-      logger.error(
-          'lsusb parsing error: unexpected indentation: "%s"', line)
-      continue
-
-    # Pop everything off the depth stack that isn't a parent of
-    # this element.
-    while depth < len(depth_stack):
-      depth_stack.pop()
-
-    cur = depth_stack[-1]
-
-    m = _LSUSB_GROUP_RE.match(line)
-    if m:
-      new_group = {}
-      cur[m.group(1)] = new_group
-      depth_stack.append(new_group)
-      continue
-
-    m = _LSUSB_ENTRY_RE.match(line)
-    if m:
-      new_entry = {
-        '_value': m.group(2),
-        '_desc': m.group(3),
-      }
-      cur[m.group(1)] = new_entry
-      depth_stack.append(new_entry)
-      continue
-
-    logger.error('lsusb parsing error: unrecognized line: "%s"', line)
-
-  return device
-
-def lsusb():
-  """Call lsusb and return the parsed output."""
-  _, lsusb_list_output = cmd_helper.GetCmdStatusAndOutputWithTimeout(
-      ['lsusb'], timeout=10)
-  devices = []
-  for line in lsusb_list_output.splitlines():
-    m = _LSUSB_BUS_DEVICE_RE.match(line)
-    if m:
-      bus_num = m.group(1)
-      dev_num = m.group(2)
-      try:
-        devices.append(_lsusbv_on_device(bus_num, dev_num))
-      except cmd_helper.TimeoutError:
-        # Will be blacklisted if it is in expected device file, but times out.
-        logger.info('lsusb -v %s:%s timed out.', bus_num, dev_num)
-  return devices
-
-def raw_lsusb():
-  return cmd_helper.GetCmdOutput(['lsusb'])
-
-def get_lsusb_serial(device):
-  try:
-    return device['Device Descriptor']['iSerial']['_desc']
-  except KeyError:
-    return None
-
-def _is_android_device(device):
-  try:
-    # Hubs are not android devices.
-    if device['Device Descriptor']['bDeviceClass']['_value'] == '9':
-      return False
-  except KeyError:
-    pass
-  return get_lsusb_serial(device) is not None
-
-def get_android_devices():
-  android_devices = (d for d in lsusb() if _is_android_device(d))
-  return [get_lsusb_serial(d) for d in android_devices]
diff --git a/third_party/catapult/devil/devil/utils/lsusb_test.py b/third_party/catapult/devil/devil/utils/lsusb_test.py
deleted file mode 100755
index f381e72..0000000
--- a/third_party/catapult/devil/devil/utils/lsusb_test.py
+++ /dev/null
@@ -1,250 +0,0 @@
-#!/usr/bin/env python
-# 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.
-
-"""Tests for the cmd_helper module."""
-
-import unittest
-
-from devil import devil_env
-from devil.utils import lsusb
-from devil.utils import mock_calls
-
-with devil_env.SysPath(devil_env.PYMOCK_PATH):
-  import mock # pylint: disable=import-error
-
-RAW_OUTPUT = """
-Bus 003 Device 007: ID 18d1:4ee2 Google Inc. Nexus 4 (debug)
-Device Descriptor:
-  bLength                18
-  bDescriptorType         1
-  bcdUSB               2.00
-  bDeviceClass            0 (Defined at Interface level)
-  bDeviceSubClass         0
-  bDeviceProtocol         0
-  bMaxPacketSize0        64
-  idVendor           0x18d1 Google Inc.
-  idProduct          0x4ee2 Nexus 4 (debug)
-  bcdDevice            2.28
-  iManufacturer           1 LGE
-  iProduct                2 Nexus 4
-  iSerial                 3 01d2450ea194a93b
-  bNumConfigurations      1
-  Configuration Descriptor:
-    bLength                 9
-    bDescriptorType         2
-    wTotalLength           62
-    bNumInterfaces          2
-    bConfigurationValue     1
-    iConfiguration          0
-    bmAttributes         0x80
-      (Bus Powered)
-    MaxPower              500mA
-    Interface Descriptor:
-      bLength                 9
-      bDescriptorType         4
-      bInterfaceNumber        0
-      bAlternateSetting       0
-      bNumEndpoints           3
-      bInterfaceClass       255 Vendor Specific Class
-      bInterfaceSubClass    255 Vendor Specific Subclass
-      bInterfaceProtocol      0
-      iInterface              4 MTP
-      Endpoint Descriptor:
-        bLength                 7
-        bDescriptorType         5
-        bEndpointAddress     0x81  EP 1 IN
-        bmAttributes            2
-          Transfer Type            Bulk
-          Synch Type               None
-          Usage Type               Data
-        wMaxPacketSize     0x0040  1x 64 bytes
-        bInterval               0
-      Endpoint Descriptor:
-        bLength                 7
-        bDescriptorType         5
-        bEndpointAddress     0x01  EP 1 OUT
-        bmAttributes            2
-          Transfer Type            Bulk
-          Synch Type               None
-          Usage Type               Data
-        wMaxPacketSize     0x0040  1x 64 bytes
-        bInterval               0
-      Endpoint Descriptor:
-        bLength                 7
-        bDescriptorType         5
-        bEndpointAddress     0x82  EP 2 IN
-        bmAttributes            3
-          Transfer Type            Interrupt
-          Synch Type               None
-          Usage Type               Data
-        wMaxPacketSize     0x001c  1x 28 bytes
-        bInterval               6
-    Interface Descriptor:
-      bLength                 9
-      bDescriptorType         4
-      bInterfaceNumber        1
-      bAlternateSetting       0
-      bNumEndpoints           2
-      bInterfaceClass       255 Vendor Specific Class
-      bInterfaceSubClass     66
-      bInterfaceProtocol      1
-      iInterface              0
-      Endpoint Descriptor:
-        bLength                 7
-        bDescriptorType         5
-        bEndpointAddress     0x83  EP 3 IN
-        bmAttributes            2
-          Transfer Type            Bulk
-          Synch Type               None
-          Usage Type               Data
-        wMaxPacketSize     0x0040  1x 64 bytes
-        bInterval               0
-      Endpoint Descriptor:
-        bLength                 7
-        bDescriptorType         5
-        bEndpointAddress     0x02  EP 2 OUT
-        bmAttributes            2
-          Transfer Type            Bulk
-          Synch Type               None
-          Usage Type               Data
-        wMaxPacketSize     0x0040  1x 64 bytes
-        bInterval               0
-Device Qualifier (for other device speed):
-  bLength                10
-  bDescriptorType         6
-  bcdUSB               2.00
-  bDeviceClass            0 (Defined at Interface level)
-  bDeviceSubClass         0
-  bDeviceProtocol         0
-  bMaxPacketSize0        64
-  bNumConfigurations      1
-Device Status:     0x0000
-  (Bus Powered)
-"""
-DEVICE_LIST = 'Bus 003 Device 007: ID 18d1:4ee2 Google Inc. Nexus 4 (debug)'
-
-EXPECTED_RESULT = {
-    'device': '007',
-    'bus': '003',
-    'desc': 'ID 18d1:4ee2 Google Inc. Nexus 4 (debug)',
-    'Device': {
-        '_value': 'Status:',
-        '_desc': '0x0000',
-        '(Bus': {
-            '_value': 'Powered)',
-            '_desc': None
-        }
-    },
-    'Device Descriptor': {
-        'bLength': {'_value': '18', '_desc': None},
-        'bcdDevice': {'_value': '2.28', '_desc': None},
-        'bDeviceSubClass': {'_value': '0', '_desc': None},
-        'idVendor': {'_value': '0x18d1', '_desc': 'Google Inc.'},
-        'bcdUSB': {'_value': '2.00', '_desc': None},
-        'bDeviceProtocol': {'_value': '0', '_desc': None},
-        'bDescriptorType': {'_value': '1', '_desc': None},
-        'Configuration Descriptor': {
-            'bLength': {'_value': '9', '_desc': None},
-            'wTotalLength': {'_value': '62', '_desc': None},
-            'bConfigurationValue': {'_value': '1', '_desc': None},
-            'Interface Descriptor': {
-                'bLength': {'_value': '9', '_desc': None},
-                'bAlternateSetting': {'_value': '0', '_desc': None},
-                'bInterfaceNumber': {'_value': '1', '_desc': None},
-                'bNumEndpoints': {'_value': '2', '_desc': None},
-                'bDescriptorType': {'_value': '4', '_desc': None},
-                'bInterfaceSubClass': {'_value': '66', '_desc': None},
-                'bInterfaceClass': {
-                    '_value': '255',
-                    '_desc': 'Vendor Specific Class'
-                },
-                'bInterfaceProtocol': {'_value': '1', '_desc': None},
-                'Endpoint Descriptor': {
-                    'bLength': {'_value': '7', '_desc': None},
-                    'bEndpointAddress': {'_value': '0x02', '_desc': 'EP 2 OUT'},
-                    'bInterval': {'_value': '0', '_desc': None},
-                    'bDescriptorType': {'_value': '5', '_desc': None},
-                    'bmAttributes': {
-                        '_value': '2',
-                        'Transfer': {'_value': 'Type', '_desc': 'Bulk'},
-                        'Usage': {'_value': 'Type', '_desc': 'Data'},
-                        '_desc': None,
-                        'Synch': {'_value': 'Type', '_desc': 'None'}
-                    },
-                    'wMaxPacketSize': {
-                        '_value': '0x0040',
-                        '_desc': '1x 64 bytes'
-                    }
-                },
-                'iInterface': {'_value': '0', '_desc': None}
-            },
-            'bDescriptorType': {'_value': '2', '_desc': None},
-            'iConfiguration': {'_value': '0', '_desc': None},
-            'bmAttributes': {
-                '_value': '0x80',
-                '_desc': None,
-                '(Bus': {'_value': 'Powered)', '_desc': None}
-            },
-            'bNumInterfaces': {'_value': '2', '_desc': None},
-            'MaxPower': {'_value': '500mA', '_desc': None}
-        },
-        'iSerial': {'_value': '3', '_desc': '01d2450ea194a93b'},
-        'idProduct': {'_value': '0x4ee2', '_desc': 'Nexus 4 (debug)'},
-        'iManufacturer': {'_value': '1', '_desc': 'LGE'},
-        'bDeviceClass': {
-            '_value': '0',
-            '_desc': '(Defined at Interface level)'
-        },
-        'iProduct': {'_value': '2', '_desc': 'Nexus 4'},
-        'bMaxPacketSize0': {'_value': '64', '_desc': None},
-        'bNumConfigurations': {'_value': '1', '_desc': None}
-    },
-    'Device Qualifier (for other device speed)': {
-        'bLength': {'_value': '10', '_desc': None},
-        'bNumConfigurations': {'_value': '1', '_desc': None},
-        'bDeviceSubClass': {'_value': '0', '_desc': None},
-        'bcdUSB': {'_value': '2.00', '_desc': None},
-        'bDeviceProtocol': {'_value': '0', '_desc': None},
-        'bDescriptorType': {'_value': '6', '_desc': None},
-        'bDeviceClass': {
-            '_value': '0',
-            '_desc': '(Defined at Interface level)'
-        },
-        'bMaxPacketSize0': {'_value': '64', '_desc': None}
-    }
-}
-
-
-class LsusbTest(mock_calls.TestCase):
-  """Test Lsusb parsing."""
-
-  def testLsusb(self):
-    with self.assertCalls(
-        (mock.call.devil.utils.cmd_helper.GetCmdStatusAndOutputWithTimeout(
-            ['lsusb'], timeout=10), (None, DEVICE_LIST)),
-        (mock.call.devil.utils.cmd_helper.GetCmdStatusAndOutputWithTimeout(
-          ['lsusb', '-v', '-s', '003:007'], timeout=10), (None, RAW_OUTPUT))):
-      self.assertDictEqual(lsusb.lsusb().pop(), EXPECTED_RESULT)
-
-  def testGetSerial(self):
-    with self.assertCalls(
-        (mock.call.devil.utils.cmd_helper.GetCmdStatusAndOutputWithTimeout(
-            ['lsusb'], timeout=10), (None, DEVICE_LIST)),
-        (mock.call.devil.utils.cmd_helper.GetCmdStatusAndOutputWithTimeout(
-          ['lsusb', '-v', '-s', '003:007'], timeout=10), (None, RAW_OUTPUT))):
-      self.assertEqual(lsusb.get_android_devices(), ['01d2450ea194a93b'])
-
-  def testGetLsusbSerial(self):
-    with self.assertCalls(
-        (mock.call.devil.utils.cmd_helper.GetCmdStatusAndOutputWithTimeout(
-            ['lsusb'], timeout=10), (None, DEVICE_LIST)),
-        (mock.call.devil.utils.cmd_helper.GetCmdStatusAndOutputWithTimeout(
-          ['lsusb', '-v', '-s', '003:007'], timeout=10), (None, RAW_OUTPUT))):
-      out = lsusb.lsusb().pop()
-      self.assertEqual(lsusb.get_lsusb_serial(out), '01d2450ea194a93b')
-
-
-if __name__ == '__main__':
-  unittest.main()
diff --git a/third_party/catapult/devil/devil/utils/markdown.py b/third_party/catapult/devil/devil/utils/markdown.py
deleted file mode 100755
index 54e7ed5..0000000
--- a/third_party/catapult/devil/devil/utils/markdown.py
+++ /dev/null
@@ -1,320 +0,0 @@
-#! /usr/bin/env python
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import argparse
-import imp
-import os
-import re
-import sys
-import textwrap
-import types
-
-# A markdown code block template: https://goo.gl/9EsyRi
-_CODE_BLOCK_FORMAT = '''```{language}
-{code}
-```
-'''
-
-_DEVIL_ROOT = os.path.abspath(os.path.join(
-    os.path.dirname(__file__), '..', '..'))
-
-
-def md_bold(raw_text):
-  """Returns markdown-formatted bold text."""
-  return '**%s**' % md_escape(raw_text, characters='*')
-
-
-def md_code(raw_text, language):
-  """Returns a markdown-formatted code block in the given language."""
-  return _CODE_BLOCK_FORMAT.format(
-      language=language or '',
-      code=md_escape(raw_text, characters='`'))
-
-
-def md_escape(raw_text, characters='*_'):
-  """Escapes * and _."""
-  def escape_char(m):
-    return '\\%s' % m.group(0)
-  pattern = '[%s]' % re.escape(characters)
-  return re.sub(pattern, escape_char, raw_text)
-
-
-def md_heading(raw_text, level):
-  """Returns markdown-formatted heading."""
-  adjusted_level = min(max(level, 0), 6)
-  return '%s%s%s' % (
-      '#' * adjusted_level, ' ' if adjusted_level > 0 else '', raw_text)
-
-
-def md_inline_code(raw_text):
-  """Returns markdown-formatted inline code."""
-  return '`%s`' % md_escape(raw_text, characters='`')
-
-
-def md_italic(raw_text):
-  """Returns markdown-formatted italic text."""
-  return '*%s*' % md_escape(raw_text, characters='*')
-
-
-def md_link(link_text, link_target):
-  """returns a markdown-formatted link."""
-  return '[%s](%s)' % (
-      md_escape(link_text, characters=']'),
-      md_escape(link_target, characters=')'))
-
-
-class MarkdownHelpFormatter(argparse.HelpFormatter):
-  """A really bare-bones argparse help formatter that generates valid markdown.
-
-  This will generate something like:
-
-  usage
-
-  # **section heading**:
-
-  ## **--argument-one**
-
-  ```
-  argument-one help text
-  ```
-
-  """
-
-  #override
-  def _format_usage(self, usage, actions, groups, prefix):
-    usage_text = super(MarkdownHelpFormatter, self)._format_usage(
-        usage, actions, groups, prefix)
-    return md_code(usage_text, language=None)
-
-  #override
-  def format_help(self):
-    self._root_section.heading = md_heading(self._prog, level=1)
-    return super(MarkdownHelpFormatter, self).format_help()
-
-  #override
-  def start_section(self, heading):
-    super(MarkdownHelpFormatter, self).start_section(
-        md_heading(heading, level=2))
-
-  #override
-  def _format_action(self, action):
-    lines = []
-    action_header = self._format_action_invocation(action)
-    lines.append(md_heading(action_header, level=3))
-    if action.help:
-      lines.append(md_code(self._expand_help(action), language=None))
-    lines.extend(['', ''])
-    return '\n'.join(lines)
-
-
-class MarkdownHelpAction(argparse.Action):
-  def __init__(self, option_strings,
-               dest=argparse.SUPPRESS, default=argparse.SUPPRESS,
-               **kwargs):
-    super(MarkdownHelpAction, self).__init__(
-        option_strings=option_strings,
-        dest=dest,
-        default=default,
-        nargs=0,
-        **kwargs)
-
-  def __call__(self, parser, namespace, values, option_string=None):
-    parser.formatter_class = MarkdownHelpFormatter
-    parser.print_help()
-    parser.exit()
-
-
-def add_md_help_argument(parser):
-  """Adds --md-help to the given argparse.ArgumentParser.
-
-  Running a script with --md-help will print the help text for that script
-  as valid markdown.
-
-  Args:
-    parser: The ArgumentParser to which --md-help should be added.
-  """
-  parser.add_argument('--md-help', action=MarkdownHelpAction,
-                      help='print Markdown-formatted help text and exit.')
-
-
-def load_module_from_path(module_path):
-  """Load a module given only the path name.
-
-  Also loads package modules as necessary.
-
-  Args:
-    module_path: An absolute path to a python module.
-  Returns:
-    The module object for the given path.
-  """
-  module_names = [os.path.splitext(os.path.basename(module_path))[0]]
-  d = os.path.dirname(module_path)
-
-  while os.path.exists(os.path.join(d, '__init__.py')):
-    module_names.append(os.path.basename(d))
-    d = os.path.dirname(d)
-
-  d = [d]
-
-  module = None
-  full_module_name = ''
-  for package_name in reversed(module_names):
-    if module:
-      d = module.__path__
-      full_module_name += '.'
-    r = imp.find_module(package_name, d)
-    full_module_name += package_name
-    module = imp.load_module(full_module_name, *r)
-  return module
-
-
-def md_module(module_obj, module_path=None, module_link=None):
-  """Write markdown documentation for a class.
-
-  Documents public classes and functions.
-
-  Args:
-    class_obj: a types.TypeType object for the class that should be
-      documented.
-  Returns:
-    A list of markdown-formatted lines.
-  """
-  def should_doc(name):
-    return (type(module_obj.__dict__[name]) != types.ModuleType
-            and not name.startswith('_'))
-
-  stuff_to_doc = sorted(
-    obj for name, obj in module_obj.__dict__.iteritems()
-    if should_doc(name))
-
-  classes_to_doc = []
-  functions_to_doc = []
-
-  for s in stuff_to_doc:
-    if type(s) == types.TypeType:
-      classes_to_doc.append(s)
-    elif type(s) == types.FunctionType:
-      functions_to_doc.append(s)
-
-  command = ['devil/utils/markdown.py']
-  if module_link:
-    command.extend(['--module-link', module_link])
-  if module_path:
-    command.append(os.path.relpath(module_path, _DEVIL_ROOT))
-
-  heading_text = module_obj.__name__
-  if module_link:
-    heading_text = md_link(heading_text, module_link)
-
-  content = [
-      md_heading(heading_text, level=1),
-      '',
-      md_italic('This page was autogenerated by %s'
-          % md_inline_code(' '.join(command))),
-      '',
-  ]
-
-  for c in classes_to_doc:
-    content += md_class(c)
-  for f in functions_to_doc:
-    content += md_function(f)
-
-  print '\n'.join(content)
-
-  return 0
-
-
-def md_class(class_obj):
-  """Write markdown documentation for a class.
-
-  Documents public methods. Does not currently document subclasses.
-
-  Args:
-    class_obj: a types.TypeType object for the class that should be
-      documented.
-  Returns:
-    A list of markdown-formatted lines.
-  """
-  content = [md_heading(md_escape(class_obj.__name__), level=2)]
-  content.append('')
-  if class_obj.__doc__:
-    content.extend(md_docstring(class_obj.__doc__))
-
-  def should_doc(name, obj):
-    return (type(obj) == types.FunctionType
-            and (name.startswith('__') or not name.startswith('_')))
-
-  methods_to_doc = sorted(
-      obj for name, obj in class_obj.__dict__.iteritems()
-      if should_doc(name, obj))
-
-  for m in methods_to_doc:
-    content.extend(md_function(m, class_obj=class_obj))
-
-  return content
-
-
-def md_docstring(docstring):
-  """Write a markdown-formatted docstring.
-
-  Returns:
-    A list of markdown-formatted lines.
-  """
-  content = []
-  lines = textwrap.dedent(docstring).splitlines()
-  content.append(md_escape(lines[0]))
-  lines = lines[1:]
-  while lines and (not lines[0] or lines[0].isspace()):
-    lines = lines[1:]
-
-  if not all(l.isspace() for l in lines):
-    content.append(md_code('\n'.join(lines), language=None))
-    content.append('')
-  return content
-
-
-def md_function(func_obj, class_obj=None):
-  """Write markdown documentation for a function.
-
-  Args:
-    func_obj: a types.FunctionType object for the function that should be
-      documented.
-  Returns:
-    A list of markdown-formatted lines.
-  """
-  if class_obj:
-    heading_text = '%s.%s' % (class_obj.__name__, func_obj.__name__)
-  else:
-    heading_text = func_obj.__name__
-  content = [md_heading(md_escape(heading_text), level=3)]
-  content.append('')
-
-  if func_obj.__doc__:
-    content.extend(md_docstring(func_obj.__doc__))
-
-  return content
-
-
-def main(raw_args):
-  """Write markdown documentation for the module at the provided path.
-
-  Args:
-    raw_args: the raw command-line args. Usually sys.argv[1:].
-  Returns:
-    An integer exit code. 0 for success, non-zero for failure.
-  """
-  parser = argparse.ArgumentParser()
-  parser.add_argument('--module-link')
-  parser.add_argument('module_path', type=os.path.realpath)
-  args = parser.parse_args(raw_args)
-
-  return md_module(
-      load_module_from_path(args.module_path),
-      module_link=args.module_link)
-
-
-if __name__ == '__main__':
-  sys.exit(main(sys.argv[1:]))
-
diff --git a/third_party/catapult/devil/devil/utils/markdown_test.py b/third_party/catapult/devil/devil/utils/markdown_test.py
deleted file mode 100755
index 323776c..0000000
--- a/third_party/catapult/devil/devil/utils/markdown_test.py
+++ /dev/null
@@ -1,121 +0,0 @@
-#! /usr/bin/env python
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import os
-import sys
-import textwrap
-import unittest
-
-if __name__ == '__main__':
-  sys.path.append(
-      os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..')))
-
-from devil.utils import markdown
-
-
-class MarkdownTest(unittest.TestCase):
-
-  def testBold(self):
-    raw = 'foo'
-    self.assertEquals('**foo**', markdown.md_bold(raw))
-
-  def testBoldContainsStars(self):
-    raw = '*foo*'
-    self.assertEquals('**\\*foo\\***', markdown.md_bold(raw))
-
-  def testCode(self):
-    raw = textwrap.dedent("""\
-        class MarkdownTest(unittest.TestCase):
-          def testCode(self):
-            pass""")
-
-    expected = textwrap.dedent("""\
-        ```python
-        class MarkdownTest(unittest.TestCase):
-          def testCode(self):
-            pass
-        ```
-        """)
-    actual = markdown.md_code(raw, language='python')
-    self.assertEquals(expected, actual)
-
-  def testCodeContainsTicks(self):
-    raw = textwrap.dedent("""\
-        This is sample markdown.
-        ```c
-        // This is a sample code block.
-        int main(int argc, char** argv) {
-          return 0;
-        }
-        ```""")
-
-    expected = textwrap.dedent("""\
-        ```
-        This is sample markdown.
-        \\`\\`\\`c
-        // This is a sample code block.
-        int main(int argc, char** argv) {
-          return 0;
-        }
-        \\`\\`\\`
-        ```
-        """)
-    actual = markdown.md_code(raw, language=None)
-    self.assertEquals(expected, actual)
-
-  def testEscape(self):
-    raw = 'text_with_underscores *and stars*'
-    expected = 'text\\_with\\_underscores \\*and stars\\*'
-    actual = markdown.md_escape(raw)
-    self.assertEquals(expected, actual)
-
-  def testHeading1(self):
-    raw = 'Heading 1'
-    self.assertEquals('# Heading 1', markdown.md_heading(raw, level=1))
-
-  def testHeading5(self):
-    raw = 'Heading 5'
-    self.assertEquals('##### Heading 5', markdown.md_heading(raw, level=5))
-
-  def testHeading10(self):
-    raw = 'Heading 10'
-    self.assertEquals('###### Heading 10', markdown.md_heading(raw, level=10))
-
-  def testInlineCode(self):
-    raw = 'devil.utils.markdown_test'
-    self.assertEquals(
-        '`devil.utils.markdown_test`', markdown.md_inline_code(raw))
-
-  def testInlineCodeContainsTicks(self):
-    raw = 'this contains `backticks`'
-    self.assertEquals(
-        '`this contains \\`backticks\\``', markdown.md_inline_code(raw))
-
-  def testItalic(self):
-    raw = 'bar'
-    self.assertEquals('*bar*', markdown.md_italic(raw))
-
-  def testItalicContainsStars(self):
-    raw = '*bar*'
-    self.assertEquals('*\\*bar\\**', markdown.md_italic(raw))
-
-  def testLink(self):
-    link_text = 'Devil home'
-    link_target = (
-        'https://github.com/catapult-project/catapult/tree/master/devil')
-    expected = (
-        '[Devil home]'
-        '(https://github.com/catapult-project/catapult/tree/master/devil)')
-    self.assertEquals(expected, markdown.md_link(link_text, link_target))
-
-  def testLinkTextContainsBracket(self):
-    link_text = 'foo [] bar'
-    link_target = 'https://www.google.com'
-    expected = '[foo [\\] bar](https://www.google.com)'
-    self.assertEquals(expected, markdown.md_link(link_text, link_target))
-
-
-if __name__ == '__main__':
-  unittest.main(verbosity=2)
diff --git a/third_party/catapult/devil/devil/utils/mock_calls.py b/third_party/catapult/devil/devil/utils/mock_calls.py
deleted file mode 100644
index 5ae951e..0000000
--- a/third_party/catapult/devil/devil/utils/mock_calls.py
+++ /dev/null
@@ -1,180 +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.
-
-"""
-A test facility to assert call sequences while mocking their behavior.
-"""
-
-import unittest
-
-from devil import devil_env
-
-with devil_env.SysPath(devil_env.PYMOCK_PATH):
-  import mock  # pylint: disable=import-error
-
-
-class TestCase(unittest.TestCase):
-  """Adds assertCalls to TestCase objects."""
-  class _AssertCalls(object):
-
-    def __init__(self, test_case, expected_calls, watched):
-      def call_action(pair):
-        if isinstance(pair, type(mock.call)):
-          return (pair, None)
-        else:
-          return pair
-
-      def do_check(call):
-        def side_effect(*args, **kwargs):
-          received_call = call(*args, **kwargs)
-          self._test_case.assertTrue(
-              self._expected_calls,
-              msg=('Unexpected call: %s' % str(received_call)))
-          expected_call, action = self._expected_calls.pop(0)
-          self._test_case.assertTrue(
-              received_call == expected_call,
-              msg=('Expected call mismatch:\n'
-                   '  expected: %s\n'
-                   '  received: %s\n'
-                   % (str(expected_call), str(received_call))))
-          if callable(action):
-            return action(*args, **kwargs)
-          else:
-            return action
-        return side_effect
-
-      self._test_case = test_case
-      self._expected_calls = [call_action(pair) for pair in expected_calls]
-      watched = watched.copy()  # do not pollute the caller's dict
-      watched.update((call.parent.name, call.parent)
-                     for call, _ in self._expected_calls)
-      self._patched = [test_case.patch_call(call, side_effect=do_check(call))
-                       for call in watched.itervalues()]
-
-    def __enter__(self):
-      for patch in self._patched:
-        patch.__enter__()
-      return self
-
-    def __exit__(self, exc_type, exc_val, exc_tb):
-      for patch in self._patched:
-        patch.__exit__(exc_type, exc_val, exc_tb)
-      if exc_type is None:
-        missing = ''.join('  expected: %s\n' % str(call)
-                          for call, _ in self._expected_calls)
-        self._test_case.assertFalse(
-            missing,
-            msg='Expected calls not found:\n' + missing)
-
-  def __init__(self, *args, **kwargs):
-    super(TestCase, self).__init__(*args, **kwargs)
-    self.call = mock.call.self
-    self._watched = {}
-
-  def call_target(self, call):
-    """Resolve a self.call instance to the target it represents.
-
-    Args:
-      call: a self.call instance, e.g. self.call.adb.Shell
-
-    Returns:
-      The target object represented by the call, e.g. self.adb.Shell
-
-    Raises:
-      ValueError if the path of the call does not start with "self", i.e. the
-          target of the call is external to the self object.
-      AttributeError if the path of the call does not specify a valid
-          chain of attributes (without any calls) starting from "self".
-    """
-    path = call.name.split('.')
-    if path.pop(0) != 'self':
-      raise ValueError("Target %r outside of 'self' object" % call.name)
-    target = self
-    for attr in path:
-      target = getattr(target, attr)
-    return target
-
-  def patch_call(self, call, **kwargs):
-    """Patch the target of a mock.call instance.
-
-    Args:
-      call: a mock.call instance identifying a target to patch
-      Extra keyword arguments are processed by mock.patch
-
-    Returns:
-      A context manager to mock/unmock the target of the call
-    """
-    if call.name.startswith('self.'):
-      target = self.call_target(call.parent)
-      _, attribute = call.name.rsplit('.', 1)
-      if (hasattr(type(target), attribute)
-          and isinstance(getattr(type(target), attribute), property)):
-        return mock.patch.object(
-            type(target), attribute, new_callable=mock.PropertyMock, **kwargs)
-      else:
-        return mock.patch.object(target, attribute, **kwargs)
-    else:
-      return mock.patch(call.name, **kwargs)
-
-  def watchCalls(self, calls):
-    """Add calls to the set of watched calls.
-
-    Args:
-      calls: a sequence of mock.call instances identifying targets to watch
-    """
-    self._watched.update((call.name, call) for call in calls)
-
-  def watchMethodCalls(self, call, ignore=None):
-    """Watch all public methods of the target identified by a self.call.
-
-    Args:
-      call: a self.call instance indetifying an object
-      ignore: a list of public methods to ignore when watching for calls
-    """
-    target = self.call_target(call)
-    if ignore is None:
-      ignore = []
-    self.watchCalls(getattr(call, method)
-                    for method in dir(target.__class__)
-                    if not method.startswith('_') and not method in ignore)
-
-  def clearWatched(self):
-    """Clear the set of watched calls."""
-    self._watched = {}
-
-  def assertCalls(self, *calls):
-    """A context manager to assert that a sequence of calls is made.
-
-    During the assertion, a number of functions and methods will be "watched",
-    and any calls made to them is expected to appear---in the exact same order,
-    and with the exact same arguments---as specified by the argument |calls|.
-
-    By default, the targets of all expected calls are watched. Further targets
-    to watch may be added using watchCalls and watchMethodCalls.
-
-    Optionaly, each call may be accompanied by an action. If the action is a
-    (non-callable) value, this value will be used as the return value given to
-    the caller when the matching call is found. Alternatively, if the action is
-    a callable, the action will be then called with the same arguments as the
-    intercepted call, so that it can provide a return value or perform other
-    side effects. If the action is missing, a return value of None is assumed.
-
-    Note that mock.Mock objects are often convenient to use as a callable
-    action, e.g. to raise exceptions or return other objects which are
-    themselves callable.
-
-    Args:
-      calls: each argument is either a pair (expected_call, action) or just an
-          expected_call, where expected_call is a mock.call instance.
-
-    Raises:
-      AssertionError if the watched targets do not receive the exact sequence
-          of calls specified. Missing calls, extra calls, and calls with
-          mismatching arguments, all cause the assertion to fail.
-    """
-    return self._AssertCalls(self, calls, self._watched)
-
-  def assertCall(self, call, action=None):
-    return self.assertCalls((call, action))
-
diff --git a/third_party/catapult/devil/devil/utils/mock_calls_test.py b/third_party/catapult/devil/devil/utils/mock_calls_test.py
deleted file mode 100755
index 8eb4fc9..0000000
--- a/third_party/catapult/devil/devil/utils/mock_calls_test.py
+++ /dev/null
@@ -1,173 +0,0 @@
-#!/usr/bin/env python
-# 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.
-
-"""
-Unit tests for the contents of mock_calls.py.
-"""
-
-import logging
-import os
-import unittest
-
-from devil import devil_env
-from devil.android.sdk import version_codes
-from devil.utils import mock_calls
-
-with devil_env.SysPath(devil_env.PYMOCK_PATH):
-  import mock  # pylint: disable=import-error
-
-
-class _DummyAdb(object):
-
-  def __str__(self):
-    return '0123456789abcdef'
-
-  def Push(self, host_path, device_path):
-    logging.debug('(device %s) pushing %r to %r', self, host_path, device_path)
-
-  def IsOnline(self):
-    logging.debug('(device %s) checking device online', self)
-    return True
-
-  def Shell(self, cmd):
-    logging.debug('(device %s) running command %r', self, cmd)
-    return "nice output\n"
-
-  def Reboot(self):
-    logging.debug('(device %s) rebooted!', self)
-
-  @property
-  def build_version_sdk(self):
-    logging.debug('(device %s) getting build_version_sdk', self)
-    return version_codes.LOLLIPOP
-
-
-class TestCaseWithAssertCallsTest(mock_calls.TestCase):
-
-  def setUp(self):
-    self.adb = _DummyAdb()
-
-  def ShellError(self):
-    def action(cmd):
-      raise ValueError('(device %s) command %r is not nice' % (self.adb, cmd))
-    return action
-
-  def get_answer(self):
-    logging.debug("called 'get_answer' of %r object", self)
-    return 42
-
-  def echo(self, thing):
-    logging.debug("called 'echo' of %r object", self)
-    return thing
-
-  def testCallTarget_succeds(self):
-    self.assertEquals(self.adb.Shell,
-                      self.call_target(self.call.adb.Shell))
-
-  def testCallTarget_failsExternal(self):
-    with self.assertRaises(ValueError):
-      self.call_target(mock.call.sys.getcwd)
-
-  def testCallTarget_failsUnknownAttribute(self):
-    with self.assertRaises(AttributeError):
-      self.call_target(self.call.adb.Run)
-
-  def testCallTarget_failsIntermediateCalls(self):
-    with self.assertRaises(AttributeError):
-      self.call_target(self.call.adb.RunShell('cmd').append)
-
-  def testPatchCall_method(self):
-    self.assertEquals(42, self.get_answer())
-    with self.patch_call(self.call.get_answer, return_value=123):
-      self.assertEquals(123, self.get_answer())
-    self.assertEquals(42, self.get_answer())
-
-  def testPatchCall_attribute_method(self):
-    with self.patch_call(self.call.adb.Shell, return_value='hello'):
-      self.assertEquals('hello', self.adb.Shell('echo hello'))
-
-  def testPatchCall_global(self):
-    with self.patch_call(mock.call.os.getcwd, return_value='/some/path'):
-      self.assertEquals('/some/path', os.getcwd())
-
-  def testPatchCall_withSideEffect(self):
-    with self.patch_call(self.call.adb.Shell, side_effect=ValueError):
-      with self.assertRaises(ValueError):
-        self.adb.Shell('echo hello')
-
-  def testPatchCall_property(self):
-    self.assertEquals(version_codes.LOLLIPOP, self.adb.build_version_sdk)
-    with self.patch_call(
-        self.call.adb.build_version_sdk,
-        return_value=version_codes.KITKAT):
-      self.assertEquals(version_codes.KITKAT, self.adb.build_version_sdk)
-    self.assertEquals(version_codes.LOLLIPOP, self.adb.build_version_sdk)
-
-  def testAssertCalls_succeeds_simple(self):
-    self.assertEquals(42, self.get_answer())
-    with self.assertCall(self.call.get_answer(), 123):
-      self.assertEquals(123, self.get_answer())
-    self.assertEquals(42, self.get_answer())
-
-  def testAssertCalls_succeeds_multiple(self):
-    with self.assertCalls(
-        (mock.call.os.getcwd(), '/some/path'),
-        (self.call.echo('hello'), 'hello'),
-        (self.call.get_answer(), 11),
-        self.call.adb.Push('this_file', 'that_file'),
-        (self.call.get_answer(), 12)):
-      self.assertEquals(os.getcwd(), '/some/path')
-      self.assertEquals('hello', self.echo('hello'))
-      self.assertEquals(11, self.get_answer())
-      self.adb.Push('this_file', 'that_file')
-      self.assertEquals(12, self.get_answer())
-
-  def testAsserCalls_succeeds_withAction(self):
-    with self.assertCall(
-        self.call.adb.Shell('echo hello'), self.ShellError()):
-      with self.assertRaises(ValueError):
-        self.adb.Shell('echo hello')
-
-  def testAssertCalls_fails_tooManyCalls(self):
-    with self.assertRaises(AssertionError):
-      with self.assertCalls(self.call.adb.IsOnline()):
-        self.adb.IsOnline()
-        self.adb.IsOnline()
-
-  def testAssertCalls_fails_tooFewCalls(self):
-    with self.assertRaises(AssertionError):
-      with self.assertCalls(self.call.adb.IsOnline()):
-        pass
-
-  def testAssertCalls_succeeds_extraCalls(self):
-    # we are not watching Reboot, so the assertion succeeds
-    with self.assertCalls(self.call.adb.IsOnline()):
-      self.adb.IsOnline()
-      self.adb.Reboot()
-
-  def testAssertCalls_fails_extraCalls(self):
-    self.watchCalls([self.call.adb.Reboot])
-    # this time we are also watching Reboot, so the assertion fails
-    with self.assertRaises(AssertionError):
-      with self.assertCalls(self.call.adb.IsOnline()):
-        self.adb.IsOnline()
-        self.adb.Reboot()
-
-  def testAssertCalls_succeeds_NoCalls(self):
-    self.watchMethodCalls(self.call.adb)  # we are watching all adb methods
-    with self.assertCalls():
-      pass
-
-  def testAssertCalls_fails_NoCalls(self):
-    self.watchMethodCalls(self.call.adb)
-    with self.assertRaises(AssertionError):
-      with self.assertCalls():
-        self.adb.IsOnline()
-
-
-if __name__ == '__main__':
-  logging.getLogger().setLevel(logging.DEBUG)
-  unittest.main(verbosity=2)
-
diff --git a/third_party/catapult/devil/devil/utils/parallelizer.py b/third_party/catapult/devil/devil/utils/parallelizer.py
deleted file mode 100644
index 3599525..0000000
--- a/third_party/catapult/devil/devil/utils/parallelizer.py
+++ /dev/null
@@ -1,238 +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.
-
-""" Wrapper that allows method execution in parallel.
-
-This class wraps a list of objects of the same type, emulates their
-interface, and executes any functions called on the objects in parallel
-in ReraiserThreads.
-
-This means that, given a list of objects:
-
-  class Foo:
-    def __init__(self):
-      self.baz = Baz()
-
-    def bar(self, my_param):
-      // do something
-
-  list_of_foos = [Foo(1), Foo(2), Foo(3)]
-
-we can take a sequential operation on that list of objects:
-
-  for f in list_of_foos:
-    f.bar('Hello')
-
-and run it in parallel across all of the objects:
-
-  Parallelizer(list_of_foos).bar('Hello')
-
-It can also handle (non-method) attributes of objects, so that this:
-
-  for f in list_of_foos:
-    f.baz.myBazMethod()
-
-can be run in parallel with:
-
-  Parallelizer(list_of_foos).baz.myBazMethod()
-
-Because it emulates the interface of the wrapped objects, a Parallelizer
-can be passed to a method or function that takes objects of that type:
-
-  def DoesSomethingWithFoo(the_foo):
-    the_foo.bar('Hello')
-    the_foo.bar('world')
-    the_foo.baz.myBazMethod
-
-  DoesSomethingWithFoo(Parallelizer(list_of_foos))
-
-Note that this class spins up a thread for each object. Using this class
-to parallelize operations that are already fast will incur a net performance
-penalty.
-
-"""
-# pylint: disable=protected-access
-
-from devil.utils import reraiser_thread
-from devil.utils import watchdog_timer
-
-_DEFAULT_TIMEOUT = 30
-_DEFAULT_RETRIES = 3
-
-
-class Parallelizer(object):
-  """Allows parallel execution of method calls across a group of objects."""
-
-  def __init__(self, objs):
-    self._orig_objs = objs
-    self._objs = objs
-
-  def __getattr__(self, name):
-    """Emulate getting the |name| attribute of |self|.
-
-    Args:
-      name: The name of the attribute to retrieve.
-    Returns:
-      A Parallelizer emulating the |name| attribute of |self|.
-    """
-    self.pGet(None)
-
-    r = type(self)(self._orig_objs)
-    r._objs = [getattr(o, name) for o in self._objs]
-    return r
-
-  def __getitem__(self, index):
-    """Emulate getting the value of |self| at |index|.
-
-    Returns:
-      A Parallelizer emulating the value of |self| at |index|.
-    """
-    self.pGet(None)
-
-    r = type(self)(self._orig_objs)
-    r._objs = [o[index] for o in self._objs]
-    return r
-
-  def __call__(self, *args, **kwargs):
-    """Emulate calling |self| with |args| and |kwargs|.
-
-    Note that this call is asynchronous. Call pFinish on the return value to
-    block until the call finishes.
-
-    Returns:
-      A Parallelizer wrapping the ReraiserThreadGroup running the call in
-      parallel.
-    Raises:
-      AttributeError if the wrapped objects aren't callable.
-    """
-    self.pGet(None)
-
-    for o in self._objs:
-      if not callable(o):
-        raise AttributeError("'%s' is not callable" % o.__name__)
-
-    r = type(self)(self._orig_objs)
-    r._objs = reraiser_thread.ReraiserThreadGroup(
-        [reraiser_thread.ReraiserThread(
-            o, args=args, kwargs=kwargs,
-            name='%s.%s' % (str(d), o.__name__))
-         for d, o in zip(self._orig_objs, self._objs)])
-    r._objs.StartAll()  # pylint: disable=W0212
-    return r
-
-  def pFinish(self, timeout):
-    """Finish any outstanding asynchronous operations.
-
-    Args:
-      timeout: The maximum number of seconds to wait for an individual
-               result to return, or None to wait forever.
-    Returns:
-      self, now emulating the return values.
-    """
-    self._assertNoShadow('pFinish')
-    if isinstance(self._objs, reraiser_thread.ReraiserThreadGroup):
-      self._objs.JoinAll()
-      self._objs = self._objs.GetAllReturnValues(
-          watchdog_timer.WatchdogTimer(timeout))
-    return self
-
-  def pGet(self, timeout):
-    """Get the current wrapped objects.
-
-    Args:
-      timeout: Same as |pFinish|.
-    Returns:
-      A list of the results, in order of the provided devices.
-    Raises:
-      Any exception raised by any of the called functions.
-    """
-    self._assertNoShadow('pGet')
-    self.pFinish(timeout)
-    return self._objs
-
-  def pMap(self, f, *args, **kwargs):
-    """Map a function across the current wrapped objects in parallel.
-
-    This calls f(o, *args, **kwargs) for each o in the set of wrapped objects.
-
-    Note that this call is asynchronous. Call pFinish on the return value to
-    block until the call finishes.
-
-    Args:
-      f: The function to call.
-      args: The positional args to pass to f.
-      kwargs: The keyword args to pass to f.
-    Returns:
-      A Parallelizer wrapping the ReraiserThreadGroup running the map in
-      parallel.
-    """
-    self._assertNoShadow('pMap')
-    r = type(self)(self._orig_objs)
-    r._objs = reraiser_thread.ReraiserThreadGroup(
-        [reraiser_thread.ReraiserThread(
-            f, args=tuple([o] + list(args)), kwargs=kwargs,
-            name='%s(%s)' % (f.__name__, d))
-         for d, o in zip(self._orig_objs, self._objs)])
-    r._objs.StartAll()  # pylint: disable=W0212
-    return r
-
-  def _assertNoShadow(self, attr_name):
-    """Ensures that |attr_name| isn't shadowing part of the wrapped obejcts.
-
-    If the wrapped objects _do_ have an |attr_name| attribute, it will be
-    inaccessible to clients.
-
-    Args:
-      attr_name: The attribute to check.
-    Raises:
-      AssertionError if the wrapped objects have an attribute named 'attr_name'
-      or '_assertNoShadow'.
-    """
-    if isinstance(self._objs, reraiser_thread.ReraiserThreadGroup):
-      assert not hasattr(self._objs, '_assertNoShadow')
-      assert not hasattr(self._objs, attr_name)
-    else:
-      assert not any(hasattr(o, '_assertNoShadow') for o in self._objs)
-      assert not any(hasattr(o, attr_name) for o in self._objs)
-
-
-class SyncParallelizer(Parallelizer):
-  """A Parallelizer that blocks on function calls."""
-
-  # override
-  def __call__(self, *args, **kwargs):
-    """Emulate calling |self| with |args| and |kwargs|.
-
-    Note that this call is synchronous.
-
-    Returns:
-      A Parallelizer emulating the value returned from calling |self| with
-      |args| and |kwargs|.
-    Raises:
-      AttributeError if the wrapped objects aren't callable.
-    """
-    r = super(SyncParallelizer, self).__call__(*args, **kwargs)
-    r.pFinish(None)
-    return r
-
-  # override
-  def pMap(self, f, *args, **kwargs):
-    """Map a function across the current wrapped objects in parallel.
-
-    This calls f(o, *args, **kwargs) for each o in the set of wrapped objects.
-
-    Note that this call is synchronous.
-
-    Args:
-      f: The function to call.
-      args: The positional args to pass to f.
-      kwargs: The keyword args to pass to f.
-    Returns:
-      A Parallelizer wrapping the ReraiserThreadGroup running the map in
-      parallel.
-    """
-    r = super(SyncParallelizer, self).pMap(f, *args, **kwargs)
-    r.pFinish(None)
-    return r
-
diff --git a/third_party/catapult/devil/devil/utils/parallelizer_test.py b/third_party/catapult/devil/devil/utils/parallelizer_test.py
deleted file mode 100644
index 32ff7ec..0000000
--- a/third_party/catapult/devil/devil/utils/parallelizer_test.py
+++ /dev/null
@@ -1,162 +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.
-
-"""Unit tests for the contents of parallelizer.py."""
-
-# pylint: disable=W0212
-# pylint: disable=W0613
-
-import os
-import tempfile
-import time
-import unittest
-
-from devil.utils import parallelizer
-
-
-class ParallelizerTestObject(object):
-  """Class used to test parallelizer.Parallelizer."""
-
-  parallel = parallelizer.Parallelizer
-
-  def __init__(self, thing, completion_file_name=None):
-    self._thing = thing
-    self._completion_file_name = completion_file_name
-    self.helper = ParallelizerTestObjectHelper(thing)
-
-  @staticmethod
-  def doReturn(what):
-    return what
-
-  @classmethod
-  def doRaise(cls, what):
-    raise what
-
-  def doSetTheThing(self, new_thing):
-    self._thing = new_thing
-
-  def doReturnTheThing(self):
-    return self._thing
-
-  def doRaiseTheThing(self):
-    raise self._thing
-
-  def doRaiseIfExceptionElseSleepFor(self, sleep_duration):
-    if isinstance(self._thing, Exception):
-      raise self._thing
-    time.sleep(sleep_duration)
-    self._write_completion_file()
-    return self._thing
-
-  def _write_completion_file(self):
-    if self._completion_file_name and len(self._completion_file_name):
-      with open(self._completion_file_name, 'w+b') as completion_file:
-        completion_file.write('complete')
-
-  def __getitem__(self, index):
-    return self._thing[index]
-
-  def __str__(self):
-    return type(self).__name__
-
-
-class ParallelizerTestObjectHelper(object):
-
-  def __init__(self, thing):
-    self._thing = thing
-
-  def doReturnStringThing(self):
-    return str(self._thing)
-
-
-class ParallelizerTest(unittest.TestCase):
-
-  def testInitEmptyList(self):
-    r = parallelizer.Parallelizer([]).replace('a', 'b').pGet(0.1)
-    self.assertEquals([], r)
-
-  def testMethodCall(self):
-    test_data = ['abc_foo', 'def_foo', 'ghi_foo']
-    expected = ['abc_bar', 'def_bar', 'ghi_bar']
-    r = parallelizer.Parallelizer(test_data).replace('_foo', '_bar').pGet(0.1)
-    self.assertEquals(expected, r)
-
-  def testMutate(self):
-    devices = [ParallelizerTestObject(True) for _ in xrange(0, 10)]
-    self.assertTrue(all(d.doReturnTheThing() for d in devices))
-    ParallelizerTestObject.parallel(devices).doSetTheThing(False).pFinish(1)
-    self.assertTrue(not any(d.doReturnTheThing() for d in devices))
-
-  def testAllReturn(self):
-    devices = [ParallelizerTestObject(True) for _ in xrange(0, 10)]
-    results = ParallelizerTestObject.parallel(
-        devices).doReturnTheThing().pGet(1)
-    self.assertTrue(isinstance(results, list))
-    self.assertEquals(10, len(results))
-    self.assertTrue(all(results))
-
-  def testAllRaise(self):
-    devices = [ParallelizerTestObject(Exception('thing %d' % i))
-               for i in xrange(0, 10)]
-    p = ParallelizerTestObject.parallel(devices).doRaiseTheThing()
-    with self.assertRaises(Exception):
-      p.pGet(1)
-
-  def testOneFailOthersComplete(self):
-    parallel_device_count = 10
-    exception_index = 7
-    exception_msg = 'thing %d' % exception_index
-
-    try:
-      completion_files = [tempfile.NamedTemporaryFile(delete=False)
-                          for _ in xrange(0, parallel_device_count)]
-      devices = [
-          ParallelizerTestObject(
-              i if i != exception_index else Exception(exception_msg),
-              completion_files[i].name)
-          for i in xrange(0, parallel_device_count)]
-      for f in completion_files:
-        f.close()
-      p = ParallelizerTestObject.parallel(devices)
-      with self.assertRaises(Exception) as e:
-        p.doRaiseIfExceptionElseSleepFor(2).pGet(3)
-      self.assertTrue(exception_msg in str(e.exception))
-      for i in xrange(0, parallel_device_count):
-        with open(completion_files[i].name) as f:
-          if i == exception_index:
-            self.assertEquals('', f.read())
-          else:
-            self.assertEquals('complete', f.read())
-    finally:
-      for f in completion_files:
-        os.remove(f.name)
-
-  def testReusable(self):
-    devices = [ParallelizerTestObject(True) for _ in xrange(0, 10)]
-    p = ParallelizerTestObject.parallel(devices)
-    results = p.doReturn(True).pGet(1)
-    self.assertTrue(all(results))
-    results = p.doReturn(True).pGet(1)
-    self.assertTrue(all(results))
-    with self.assertRaises(Exception):
-      results = p.doRaise(Exception('reusableTest')).pGet(1)
-
-  def testContained(self):
-    devices = [ParallelizerTestObject(i) for i in xrange(0, 10)]
-    results = (ParallelizerTestObject.parallel(devices).helper
-        .doReturnStringThing().pGet(1))
-    self.assertTrue(isinstance(results, list))
-    self.assertEquals(10, len(results))
-    for i in xrange(0, 10):
-      self.assertEquals(str(i), results[i])
-
-  def testGetItem(self):
-    devices = [ParallelizerTestObject(range(i, i + 10)) for i in xrange(0, 10)]
-    results = ParallelizerTestObject.parallel(devices)[9].pGet(1)
-    self.assertEquals(range(9, 19), results)
-
-
-if __name__ == '__main__':
-  unittest.main(verbosity=2)
-
diff --git a/third_party/catapult/devil/devil/utils/reraiser_thread.py b/third_party/catapult/devil/devil/utils/reraiser_thread.py
deleted file mode 100644
index 56d95f3..0000000
--- a/third_party/catapult/devil/devil/utils/reraiser_thread.py
+++ /dev/null
@@ -1,228 +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.
-
-"""Thread and ThreadGroup that reraise exceptions on the main thread."""
-# pylint: disable=W0212
-
-import logging
-import sys
-import threading
-import time
-import traceback
-
-from devil.utils import watchdog_timer
-
-
-class TimeoutError(Exception):
-  """Module-specific timeout exception."""
-  pass
-
-
-def LogThreadStack(thread, error_log_func=logging.critical):
-  """Log the stack for the given thread.
-
-  Args:
-    thread: a threading.Thread instance.
-    error_log_func: Logging function when logging errors.
-  """
-  stack = sys._current_frames()[thread.ident]
-  error_log_func('*' * 80)
-  error_log_func('Stack dump for thread %r', thread.name)
-  error_log_func('*' * 80)
-  for filename, lineno, name, line in traceback.extract_stack(stack):
-    error_log_func('File: "%s", line %d, in %s', filename, lineno, name)
-    if line:
-      error_log_func('  %s', line.strip())
-  error_log_func('*' * 80)
-
-
-class ReraiserThread(threading.Thread):
-  """Thread class that can reraise exceptions."""
-
-  def __init__(self, func, args=None, kwargs=None, name=None):
-    """Initialize thread.
-
-    Args:
-      func: callable to call on a new thread.
-      args: list of positional arguments for callable, defaults to empty.
-      kwargs: dictionary of keyword arguments for callable, defaults to empty.
-      name: thread name, defaults to Thread-N.
-    """
-    if not name and func.__name__ != '<lambda>':
-      name = func.__name__
-    super(ReraiserThread, self).__init__(name=name)
-    if not args:
-      args = []
-    if not kwargs:
-      kwargs = {}
-    self.daemon = True
-    self._func = func
-    self._args = args
-    self._kwargs = kwargs
-    self._ret = None
-    self._exc_info = None
-    self._thread_group = None
-
-  def ReraiseIfException(self):
-    """Reraise exception if an exception was raised in the thread."""
-    if self._exc_info:
-      raise self._exc_info[0], self._exc_info[1], self._exc_info[2]
-
-  def GetReturnValue(self):
-    """Reraise exception if present, otherwise get the return value."""
-    self.ReraiseIfException()
-    return self._ret
-
-  # override
-  def run(self):
-    """Overrides Thread.run() to add support for reraising exceptions."""
-    try:
-      self._ret = self._func(*self._args, **self._kwargs)
-    except:  # pylint: disable=W0702
-      self._exc_info = sys.exc_info()
-
-
-class ReraiserThreadGroup(object):
-  """A group of ReraiserThread objects."""
-
-  def __init__(self, threads=None):
-    """Initialize thread group.
-
-    Args:
-      threads: a list of ReraiserThread objects; defaults to empty.
-    """
-    self._threads = []
-    # Set when a thread from one group has called JoinAll on another. It is used
-    # to detect when a there is a TimeoutRetryThread active that links to the
-    # current thread.
-    self.blocked_parent_thread_group = None
-    if threads:
-      for thread in threads:
-        self.Add(thread)
-
-  def Add(self, thread):
-    """Add a thread to the group.
-
-    Args:
-      thread: a ReraiserThread object.
-    """
-    assert thread._thread_group is None
-    thread._thread_group = self
-    self._threads.append(thread)
-
-  def StartAll(self, will_block=False):
-    """Start all threads.
-
-    Args:
-      will_block: Whether the calling thread will subsequently block on this
-        thread group. Causes the active ReraiserThreadGroup (if there is one)
-        to be marked as blocking on this thread group.
-    """
-    if will_block:
-      # Multiple threads blocking on the same outer thread should not happen in
-      # practice.
-      assert not self.blocked_parent_thread_group
-      self.blocked_parent_thread_group = CurrentThreadGroup()
-    for thread in self._threads:
-      thread.start()
-
-  def _JoinAll(self, watcher=None, timeout=None):
-    """Join all threads without stack dumps.
-
-    Reraises exceptions raised by the child threads and supports breaking
-    immediately on exceptions raised on the main thread.
-
-    Args:
-      watcher: Watchdog object providing the thread timeout. If none is
-          provided, the thread will never be timed out.
-      timeout: An optional number of seconds to wait before timing out the join
-          operation. This will not time out the threads.
-    """
-    if watcher is None:
-      watcher = watchdog_timer.WatchdogTimer(None)
-    alive_threads = self._threads[:]
-    end_time = (time.time() + timeout) if timeout else None
-    try:
-      while alive_threads and (end_time is None or end_time > time.time()):
-        for thread in alive_threads[:]:
-          if watcher.IsTimedOut():
-            raise TimeoutError('Timed out waiting for %d of %d threads.' %
-                               (len(alive_threads), len(self._threads)))
-          # Allow the main thread to periodically check for interrupts.
-          thread.join(0.1)
-          if not thread.isAlive():
-            alive_threads.remove(thread)
-      # All threads are allowed to complete before reraising exceptions.
-      for thread in self._threads:
-        thread.ReraiseIfException()
-    finally:
-      self.blocked_parent_thread_group = None
-
-  def IsAlive(self):
-    """Check whether any of the threads are still alive.
-
-    Returns:
-      Whether any of the threads are still alive.
-    """
-    return any(t.isAlive() for t in self._threads)
-
-  def JoinAll(self, watcher=None, timeout=None,
-              error_log_func=logging.critical):
-    """Join all threads.
-
-    Reraises exceptions raised by the child threads and supports breaking
-    immediately on exceptions raised on the main thread. Unfinished threads'
-    stacks will be logged on watchdog timeout.
-
-    Args:
-      watcher: Watchdog object providing the thread timeout. If none is
-          provided, the thread will never be timed out.
-      timeout: An optional number of seconds to wait before timing out the join
-          operation. This will not time out the threads.
-      error_log_func: Logging function when logging errors.
-    """
-    try:
-      self._JoinAll(watcher, timeout)
-    except TimeoutError:
-      error_log_func('Timed out. Dumping threads.')
-      for thread in (t for t in self._threads if t.isAlive()):
-        LogThreadStack(thread, error_log_func=error_log_func)
-      raise
-
-  def GetAllReturnValues(self, watcher=None):
-    """Get all return values, joining all threads if necessary.
-
-    Args:
-      watcher: same as in |JoinAll|. Only used if threads are alive.
-    """
-    if any([t.isAlive() for t in self._threads]):
-      self.JoinAll(watcher)
-    return [t.GetReturnValue() for t in self._threads]
-
-
-def CurrentThreadGroup():
-  """Returns the ReraiserThreadGroup that owns the running thread.
-
-  Returns:
-    The current thread group, otherwise None.
-  """
-  current_thread = threading.current_thread()
-  if isinstance(current_thread, ReraiserThread):
-    return current_thread._thread_group  # pylint: disable=no-member
-  return None
-
-
-def RunAsync(funcs, watcher=None):
-  """Executes the given functions in parallel and returns their results.
-
-  Args:
-    funcs: List of functions to perform on their own threads.
-    watcher: Watchdog object providing timeout, by default waits forever.
-
-  Returns:
-    A list of return values in the order of the given functions.
-  """
-  thread_group = ReraiserThreadGroup(ReraiserThread(f) for f in funcs)
-  thread_group.StartAll(will_block=True)
-  return thread_group.GetAllReturnValues(watcher=watcher)
diff --git a/third_party/catapult/devil/devil/utils/reraiser_thread_unittest.py b/third_party/catapult/devil/devil/utils/reraiser_thread_unittest.py
deleted file mode 100644
index e3c4e6b..0000000
--- a/third_party/catapult/devil/devil/utils/reraiser_thread_unittest.py
+++ /dev/null
@@ -1,117 +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.
-
-"""Unittests for reraiser_thread.py."""
-
-import threading
-import unittest
-
-from devil.utils import reraiser_thread
-from devil.utils import watchdog_timer
-
-
-class TestException(Exception):
-  pass
-
-
-class TestReraiserThread(unittest.TestCase):
-  """Tests for reraiser_thread.ReraiserThread."""
-
-  def testNominal(self):
-    result = [None, None]
-
-    def f(a, b=None):
-      result[0] = a
-      result[1] = b
-
-    thread = reraiser_thread.ReraiserThread(f, [1], {'b': 2})
-    thread.start()
-    thread.join()
-    self.assertEqual(result[0], 1)
-    self.assertEqual(result[1], 2)
-
-  def testRaise(self):
-    def f():
-      raise TestException
-
-    thread = reraiser_thread.ReraiserThread(f)
-    thread.start()
-    thread.join()
-    with self.assertRaises(TestException):
-      thread.ReraiseIfException()
-
-
-class TestReraiserThreadGroup(unittest.TestCase):
-  """Tests for reraiser_thread.ReraiserThreadGroup."""
-
-  def testInit(self):
-    ran = [False] * 5
-
-    def f(i):
-      ran[i] = True
-
-    group = reraiser_thread.ReraiserThreadGroup(
-      [reraiser_thread.ReraiserThread(f, args=[i]) for i in range(5)])
-    group.StartAll()
-    group.JoinAll()
-    for v in ran:
-      self.assertTrue(v)
-
-  def testAdd(self):
-    ran = [False] * 5
-
-    def f(i):
-      ran[i] = True
-
-    group = reraiser_thread.ReraiserThreadGroup()
-    for i in xrange(5):
-      group.Add(reraiser_thread.ReraiserThread(f, args=[i]))
-    group.StartAll()
-    group.JoinAll()
-    for v in ran:
-      self.assertTrue(v)
-
-  def testJoinRaise(self):
-    def f():
-      raise TestException
-    group = reraiser_thread.ReraiserThreadGroup(
-      [reraiser_thread.ReraiserThread(f) for _ in xrange(5)])
-    group.StartAll()
-    with self.assertRaises(TestException):
-      group.JoinAll()
-
-  def testJoinTimeout(self):
-    def f():
-      pass
-    event = threading.Event()
-
-    def g():
-      event.wait()
-    group = reraiser_thread.ReraiserThreadGroup(
-        [reraiser_thread.ReraiserThread(g),
-         reraiser_thread.ReraiserThread(f)])
-    group.StartAll()
-    with self.assertRaises(reraiser_thread.TimeoutError):
-      group.JoinAll(watchdog_timer.WatchdogTimer(0.01))
-    event.set()
-
-
-class TestRunAsync(unittest.TestCase):
-  """Tests for reraiser_thread.RunAsync."""
-
-  def testNoArgs(self):
-    results = reraiser_thread.RunAsync([])
-    self.assertEqual([], results)
-
-  def testOneArg(self):
-    results = reraiser_thread.RunAsync([lambda: 1])
-    self.assertEqual([1], results)
-
-  def testTwoArgs(self):
-    a, b = reraiser_thread.RunAsync((lambda: 1, lambda: 2))
-    self.assertEqual(1, a)
-    self.assertEqual(2, b)
-
-if __name__ == '__main__':
-  unittest.main()
diff --git a/third_party/catapult/devil/devil/utils/reset_usb.py b/third_party/catapult/devil/devil/utils/reset_usb.py
deleted file mode 100755
index 0335227..0000000
--- a/third_party/catapult/devil/devil/utils/reset_usb.py
+++ /dev/null
@@ -1,111 +0,0 @@
-#!/usr/bin/env python
-# 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.
-
-import argparse
-import fcntl
-import logging
-import os
-import re
-import sys
-
-if __name__ == '__main__':
-  sys.path.append(
-      os.path.abspath(os.path.join(os.path.dirname(__file__),
-                                   '..', '..')))
-
-from devil.android import device_errors
-from devil.utils import lsusb
-from devil.utils import run_tests_helper
-
-logger = logging.getLogger(__name__)
-
-_INDENTATION_RE = re.compile(r'^( *)')
-_LSUSB_BUS_DEVICE_RE = re.compile(r'^Bus (\d{3}) Device (\d{3}):')
-_LSUSB_ENTRY_RE = re.compile(r'^ *([^ ]+) +([^ ]+) *([^ ].*)?$')
-_LSUSB_GROUP_RE = re.compile(r'^ *([^ ]+.*):$')
-
-_USBDEVFS_RESET = ord('U') << 8 | 20
-
-
-def reset_usb(bus, device):
-  """Reset the USB device with the given bus and device."""
-  usb_file_path = '/dev/bus/usb/%03d/%03d' % (bus, device)
-  with open(usb_file_path, 'w') as usb_file:
-    logger.debug('fcntl.ioctl(%s, %d)', usb_file_path, _USBDEVFS_RESET)
-    fcntl.ioctl(usb_file, _USBDEVFS_RESET)
-
-
-def reset_android_usb(serial):
-  """Reset the USB device for the given Android device."""
-  lsusb_info = lsusb.lsusb()
-
-  bus = None
-  device = None
-  for device_info in lsusb_info:
-    device_serial = lsusb.get_lsusb_serial(device_info)
-    if device_serial == serial:
-      bus = int(device_info.get('bus'))
-      device = int(device_info.get('device'))
-
-  if bus and device:
-    reset_usb(bus, device)
-  else:
-    raise device_errors.DeviceUnreachableError(
-        'Unable to determine bus(%s) or device(%s) for device %s'
-         % (bus, device, serial))
-
-
-def reset_all_android_devices():
-  """Reset all USB devices that look like an Android device."""
-  _reset_all_matching(lambda i: bool(lsusb.get_lsusb_serial(i)))
-
-
-def _reset_all_matching(condition):
-  lsusb_info = lsusb.lsusb()
-  for device_info in lsusb_info:
-    if int(device_info.get('device')) != 1 and condition(device_info):
-      bus = int(device_info.get('bus'))
-      device = int(device_info.get('device'))
-      try:
-        reset_usb(bus, device)
-        serial = lsusb.get_lsusb_serial(device_info)
-        if serial:
-          logger.info(
-              'Reset USB device (bus: %03d, device: %03d, serial: %s)',
-              bus, device, serial)
-        else:
-          logger.info(
-              'Reset USB device (bus: %03d, device: %03d)',
-              bus, device)
-      except IOError:
-        logger.error(
-            'Failed to reset USB device (bus: %03d, device: %03d)',
-            bus, device)
-
-
-def main():
-  parser = argparse.ArgumentParser()
-  parser.add_argument('-v', '--verbose', action='count')
-  parser.add_argument('-s', '--serial')
-  parser.add_argument('--bus', type=int)
-  parser.add_argument('--device', type=int)
-  args = parser.parse_args()
-
-  run_tests_helper.SetLogLevel(args.verbose)
-
-  if args.serial:
-    reset_android_usb(args.serial)
-  elif args.bus and args.device:
-    reset_usb(args.bus, args.device)
-  else:
-    parser.error('Unable to determine target. '
-                 'Specify --serial or BOTH --bus and --device.')
-
-  return 0
-
-
-if __name__ == '__main__':
-  sys.exit(main())
-
diff --git a/third_party/catapult/devil/devil/utils/run_tests_helper.py b/third_party/catapult/devil/devil/utils/run_tests_helper.py
deleted file mode 100644
index 7df2da6..0000000
--- a/third_party/catapult/devil/devil/utils/run_tests_helper.py
+++ /dev/null
@@ -1,44 +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.
-
-"""Helper functions common to native, java and host-driven test runners."""
-
-import logging
-import sys
-import time
-
-
-class CustomFormatter(logging.Formatter):
-  """Custom log formatter."""
-
-  # override
-  def __init__(self, fmt='%(threadName)-4s  %(message)s'):
-    # Can't use super() because in older Python versions logging.Formatter does
-    # not inherit from object.
-    logging.Formatter.__init__(self, fmt=fmt)
-    self._creation_time = time.time()
-
-  # override
-  def format(self, record):
-    # Can't use super() because in older Python versions logging.Formatter does
-    # not inherit from object.
-    msg = logging.Formatter.format(self, record)
-    if 'MainThread' in msg[:19]:
-      msg = msg.replace('MainThread', 'Main', 1)
-    timediff = time.time() - self._creation_time
-    return '%s %8.3fs %s' % (record.levelname[0], timediff, msg)
-
-
-def SetLogLevel(verbose_count):
-  """Sets log level as |verbose_count|."""
-  log_level = logging.WARNING  # Default.
-  if verbose_count == 1:
-    log_level = logging.INFO
-  elif verbose_count >= 2:
-    log_level = logging.DEBUG
-  logger = logging.getLogger()
-  logger.setLevel(log_level)
-  custom_handler = logging.StreamHandler(sys.stdout)
-  custom_handler.setFormatter(CustomFormatter())
-  logging.getLogger().addHandler(custom_handler)
diff --git a/third_party/catapult/devil/devil/utils/signal_handler.py b/third_party/catapult/devil/devil/utils/signal_handler.py
deleted file mode 100644
index 1230f8d..0000000
--- a/third_party/catapult/devil/devil/utils/signal_handler.py
+++ /dev/null
@@ -1,48 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import contextlib
-import signal
-
-
-@contextlib.contextmanager
-def SignalHandler(signalnum, handler):
-  """Sets the signal handler for the given signal in the wrapped context.
-
-  Args:
-    signum: The signal for which a handler should be added.
-    additional_handler: The handler to add.
-  """
-  existing_handler = signal.getsignal(signalnum)
-
-  try:
-    signal.signal(signalnum, handler)
-    yield
-  finally:
-    signal.signal(signalnum, existing_handler)
-
-
-@contextlib.contextmanager
-def AddSignalHandler(signalnum, additional_handler):
-  """Adds a signal handler for the given signal in the wrapped context.
-
-  This runs the new handler after any existing handler rather than
-  replacing the existing handler.
-
-  Args:
-    signum: The signal for which a handler should be added.
-    additional_handler: The handler to add.
-  """
-  existing_handler = signal.getsignal(signalnum)
-
-  def handler(signum, frame):
-    if callable(existing_handler):
-      existing_handler(signum, frame)
-    additional_handler(signum, frame)
-
-  try:
-    signal.signal(signalnum, handler)
-    yield
-  finally:
-    signal.signal(signalnum, existing_handler)
diff --git a/third_party/catapult/devil/devil/utils/test/data/test_serial_map.json b/third_party/catapult/devil/devil/utils/test/data/test_serial_map.json
deleted file mode 100644
index f068281..0000000
--- a/third_party/catapult/devil/devil/utils/test/data/test_serial_map.json
+++ /dev/null
@@ -1 +0,0 @@
-[{"phone": "Phone1", "battor": "BattOr1"}, {"phone": "Phone2", "battor": "BattOr2"}, {"phone": "Phone3", "battor": "BattOr3"}]
diff --git a/third_party/catapult/devil/devil/utils/timeout_retry.py b/third_party/catapult/devil/devil/utils/timeout_retry.py
deleted file mode 100644
index d230462..0000000
--- a/third_party/catapult/devil/devil/utils/timeout_retry.py
+++ /dev/null
@@ -1,175 +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.
-
-"""A utility to run functions with timeouts and retries."""
-# pylint: disable=W0702
-
-import logging
-import threading
-import time
-
-from devil.utils import reraiser_thread
-from devil.utils import watchdog_timer
-
-logger = logging.getLogger(__name__)
-
-
-class TimeoutRetryThreadGroup(reraiser_thread.ReraiserThreadGroup):
-
-  def __init__(self, timeout, threads=None):
-    super(TimeoutRetryThreadGroup, self).__init__(threads)
-    self._watcher = watchdog_timer.WatchdogTimer(timeout)
-
-  def GetWatcher(self):
-    """Returns the watchdog keeping track of this thread's time."""
-    return self._watcher
-
-  def GetElapsedTime(self):
-    return self._watcher.GetElapsed()
-
-  def GetRemainingTime(self, required=0, msg=None):
-    """Get the remaining time before the thread times out.
-
-    Useful to send as the |timeout| parameter of async IO operations.
-
-    Args:
-      required: minimum amount of time that will be required to complete, e.g.,
-        some sleep or IO operation.
-      msg: error message to show if timing out.
-
-    Returns:
-      The number of seconds remaining before the thread times out, or None
-      if the thread never times out.
-
-    Raises:
-      reraiser_thread.TimeoutError if the remaining time is less than the
-        required time.
-    """
-    remaining = self._watcher.GetRemaining()
-    if remaining is not None and remaining < required:
-      if msg is None:
-        msg = 'Timeout expired'
-      if remaining > 0:
-        msg += (', wait of %.1f secs required but only %.1f secs left'
-                % (required, remaining))
-      raise reraiser_thread.TimeoutError(msg)
-    return remaining
-
-
-def CurrentTimeoutThreadGroup():
-  """Returns the thread group that owns or is blocked on the active thread.
-
-  Returns:
-    Returns None if no TimeoutRetryThreadGroup is tracking the current thread.
-  """
-  thread_group = reraiser_thread.CurrentThreadGroup()
-  while thread_group:
-    if isinstance(thread_group, TimeoutRetryThreadGroup):
-      return thread_group
-    thread_group = thread_group.blocked_parent_thread_group
-  return None
-
-
-def WaitFor(condition, wait_period=5, max_tries=None):
-  """Wait for a condition to become true.
-
-  Repeatedly call the function condition(), with no arguments, until it returns
-  a true value.
-
-  If called within a TimeoutRetryThreadGroup, it cooperates nicely with it.
-
-  Args:
-    condition: function with the condition to check
-    wait_period: number of seconds to wait before retrying to check the
-      condition
-    max_tries: maximum number of checks to make, the default tries forever
-      or until the TimeoutRetryThreadGroup expires.
-
-  Returns:
-    The true value returned by the condition, or None if the condition was
-    not met after max_tries.
-
-  Raises:
-    reraiser_thread.TimeoutError: if the current thread is a
-      TimeoutRetryThreadGroup and the timeout expires.
-  """
-  condition_name = condition.__name__
-  timeout_thread_group = CurrentTimeoutThreadGroup()
-  while max_tries is None or max_tries > 0:
-    result = condition()
-    if max_tries is not None:
-      max_tries -= 1
-    msg = ['condition', repr(condition_name), 'met' if result else 'not met']
-    if timeout_thread_group:
-      # pylint: disable=no-member
-      msg.append('(%.1fs)' % timeout_thread_group.GetElapsedTime())
-    logger.info(' '.join(msg))
-    if result:
-      return result
-    if timeout_thread_group:
-      # pylint: disable=no-member
-      timeout_thread_group.GetRemainingTime(wait_period,
-          msg='Timed out waiting for %r' % condition_name)
-    time.sleep(wait_period)
-  return None
-
-
-def AlwaysRetry(_exception):
-  return True
-
-
-def Run(func, timeout, retries, args=None, kwargs=None, desc=None,
-        error_log_func=logging.critical, retry_if_func=AlwaysRetry):
-  """Runs the passed function in a separate thread with timeouts and retries.
-
-  Args:
-    func: the function to be wrapped.
-    timeout: the timeout in seconds for each try.
-    retries: the number of retries.
-    args: list of positional args to pass to |func|.
-    kwargs: dictionary of keyword args to pass to |func|.
-    desc: An optional description of |func| used in logging. If omitted,
-      |func.__name__| will be used.
-    error_log_func: Logging function when logging errors.
-    retry_if_func: Unary callable that takes an exception and returns
-      whether |func| should be retried. Defaults to always retrying.
-
-  Returns:
-    The return value of func(*args, **kwargs).
-  """
-  if not args:
-    args = []
-  if not kwargs:
-    kwargs = {}
-  if not desc:
-    desc = func.__name__
-
-  num_try = 1
-  while True:
-    thread_name = 'TimeoutThread-%d-for-%s' % (num_try,
-                                               threading.current_thread().name)
-    child_thread = reraiser_thread.ReraiserThread(lambda: func(*args, **kwargs),
-                                                  name=thread_name)
-    try:
-      thread_group = TimeoutRetryThreadGroup(timeout, threads=[child_thread])
-      thread_group.StartAll(will_block=True)
-      while True:
-        thread_group.JoinAll(watcher=thread_group.GetWatcher(), timeout=60,
-                             error_log_func=error_log_func)
-        if thread_group.IsAlive():
-          logger.info('Still working on %s', desc)
-        else:
-          return thread_group.GetAllReturnValues()[0]
-    except reraiser_thread.TimeoutError as e:
-      # Timeouts already get their stacks logged.
-      if num_try > retries or not retry_if_func(e):
-        raise
-      # Do not catch KeyboardInterrupt.
-    except Exception as e:  # pylint: disable=broad-except
-      if num_try > retries or not retry_if_func(e):
-        raise
-      error_log_func(
-          '(%s) Exception on %s, attempt %d of %d: %r',
-          thread_name, desc, num_try, retries + 1, e)
-    num_try += 1
diff --git a/third_party/catapult/devil/devil/utils/timeout_retry_unittest.py b/third_party/catapult/devil/devil/utils/timeout_retry_unittest.py
deleted file mode 100755
index 0eeb31a..0000000
--- a/third_party/catapult/devil/devil/utils/timeout_retry_unittest.py
+++ /dev/null
@@ -1,79 +0,0 @@
-#!/usr/bin/python
-# 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.
-
-"""Unittests for timeout_and_retry.py."""
-
-import logging
-import time
-import unittest
-
-from devil.utils import reraiser_thread
-from devil.utils import timeout_retry
-
-
-_DEFAULT_TIMEOUT = .1
-
-
-class TestException(Exception):
-  pass
-
-
-def _CountTries(tries):
-  tries[0] += 1
-  raise TestException
-
-
-class TestRun(unittest.TestCase):
-  """Tests for timeout_retry.Run."""
-
-  def testRun(self):
-    self.assertTrue(timeout_retry.Run(
-        lambda x: x, 30, 3, [True], {}))
-
-  def testTimeout(self):
-    tries = [0]
-
-    def _sleep():
-      tries[0] += 1
-      time.sleep(1)
-
-    self.assertRaises(
-        reraiser_thread.TimeoutError, timeout_retry.Run, _sleep, .01, 1,
-        error_log_func=logging.debug)
-    self.assertEqual(tries[0], 2)
-
-  def testRetries(self):
-    tries = [0]
-    self.assertRaises(
-        TestException, timeout_retry.Run, lambda: _CountTries(tries),
-        _DEFAULT_TIMEOUT, 3, error_log_func=logging.debug)
-    self.assertEqual(tries[0], 4)
-
-  def testNoRetries(self):
-    tries = [0]
-    self.assertRaises(
-        TestException, timeout_retry.Run, lambda: _CountTries(tries),
-        _DEFAULT_TIMEOUT, 0, error_log_func=logging.debug)
-    self.assertEqual(tries[0], 1)
-
-  def testReturnValue(self):
-    self.assertTrue(timeout_retry.Run(lambda: True, _DEFAULT_TIMEOUT, 3))
-
-  def testCurrentTimeoutThreadGroup(self):
-    def InnerFunc():
-      current_thread_group = timeout_retry.CurrentTimeoutThreadGroup()
-      self.assertIsNotNone(current_thread_group)
-
-      def InnerInnerFunc():
-        self.assertEqual(current_thread_group,
-                         timeout_retry.CurrentTimeoutThreadGroup())
-        return True
-      return reraiser_thread.RunAsync((InnerInnerFunc,))[0]
-
-    self.assertTrue(timeout_retry.Run(InnerFunc, _DEFAULT_TIMEOUT, 3))
-
-
-if __name__ == '__main__':
-  unittest.main()
diff --git a/third_party/catapult/devil/devil/utils/update_mapping.py b/third_party/catapult/devil/devil/utils/update_mapping.py
deleted file mode 100755
index 6666b9b..0000000
--- a/third_party/catapult/devil/devil/utils/update_mapping.py
+++ /dev/null
@@ -1,47 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import argparse
-import sys
-
-from devil.utils import battor_device_mapping
-
-def parse_options():
-  """Parses and checks the command-line options.
-
-  Returns:
-    A tuple containing the options structure.
-  """
-  usage = 'Usage: ./update_mapping.py [options]'
-  desc = ('Example: ./update_mapping.py -o mapping.json.\n'
-  'This script generates and stores a file that gives the\n'
-  'mapping between phone serial numbers and BattOr serial numbers\n'
-  'Mapping is based on which physical ports on the USB hubs the\n'
-  'devices are plugged in to. For instance, if there are two hubs,\n'
-  'the phone connected to port N on the first hub is mapped to the\n'
-  'BattOr connected to port N on the second hub, for each N.')
-  parser = argparse.ArgumentParser(usage=usage, description=desc)
-  parser.add_argument('-o', '--output', dest='out_file',
-                      default='mapping.json', type=str,
-                      action='store', help='mapping file name')
-  parser.add_argument('-u', '--hub', dest='hub_types',
-                      action='append', choices=['plugable_7port',
-                                                'plugable_7port_usb3_part2',
-                                                'plugable_7port_usb3_part3'],
-                      help='USB hub types.')
-  options = parser.parse_args()
-  if not options.hub_types:
-    options.hub_types = ['plugable_7port', 'plugable_7port_usb3_part2',
-                         'plugable_7port_usb3_part3']
-  return options
-
-def main():
-  options = parse_options()
-  battor_device_mapping.GenerateSerialMapFile(options.out_file,
-                                              options.hub_types)
-
-if __name__ == "__main__":
-  sys.exit(main())
diff --git a/third_party/catapult/devil/devil/utils/usb_hubs.py b/third_party/catapult/devil/devil/utils/usb_hubs.py
deleted file mode 100644
index 1b9566a..0000000
--- a/third_party/catapult/devil/devil/utils/usb_hubs.py
+++ /dev/null
@@ -1,165 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-PLUGABLE_7PORT_LAYOUT = {1:7,
-                         2:6,
-                         3:5,
-                         4:{1:4, 2:3, 3:2, 4:1}}
-
-PLUGABLE_7PORT_USB3_LAYOUT = {1:{1:1, 2:2, 3:3, 4:4},
-                              2:5,
-                              3:6,
-                              4:7}
-
-KEEDOX_LAYOUT = {1:1,
-                 2:2,
-                 3:3,
-                 4:{1:4, 2:5, 3:6, 4:7}}
-
-class HubType(object):
-  def __init__(self, id_func, port_mapping):
-    """Defines a type of hub.
-
-    Args:
-      id_func: [USBNode -> bool] is a function that can be run on a node
-        to determine if the node represents this type of hub.
-      port_mapping: [dict(int:(int|dict))] maps virtual to physical port
-        numbers. For instance, {3:1, 1:2, 2:3} means that virtual port 3
-        corresponds to physical port 1, virtual port 1 corresponds to physical
-        port 2, and virtual port 2 corresponds to physical port 3. In the
-        case of hubs with "internal" topology, this is represented by nested
-        maps. For instance, {1:{1:1,2:2},2:{1:3,2:4}} means, e.g. that the
-        device plugged into physical port 3 will show up as being connected
-        to port 1, on a device which is connected to port 2 on the hub.
-    """
-    self._id_func = id_func
-    # v2p = "virtual to physical" ports
-    self._v2p_port = port_mapping
-
-  def IsType(self, node):
-    """Determines if the given Node is a hub of this type.
-
-    Args:
-      node: [USBNode] Node to check.
-    """
-    return self._id_func(node)
-
-  def GetPhysicalPortToNodeTuples(self, node):
-    """Gets devices connected to the physical ports on a hub of this type.
-
-    Args:
-      node: [USBNode] Node representing a hub of this type.
-
-    Yields:
-      A series of (int, USBNode) tuples giving a physical port
-      and the USBNode connected to it.
-
-    Raises:
-      ValueError: If the given node isn't a hub of this type.
-    """
-    if self.IsType(node):
-      for res in self._GppHelper(node, self._v2p_port):
-        yield res
-    else:
-      raise ValueError('Node must be a hub of this type')
-
-  def _GppHelper(self, node, mapping):
-    """Helper function for GetPhysicalPortToNodeMap.
-
-    Gets devices connected to physical ports, based on device tree
-    rooted at the given node and the mapping between virtual and physical
-    ports.
-
-    Args:
-      node: [USBNode] Root of tree to search for devices.
-      mapping: [dict] Mapping between virtual and physical ports.
-
-    Yields:
-      A series of (int, USBNode) tuples giving a physical port
-      and the Node connected to it.
-    """
-    for (virtual, physical) in mapping.iteritems():
-      if node.HasPort(virtual):
-        if isinstance(physical, dict):
-          for res in self._GppHelper(node.PortToDevice(virtual), physical):
-            yield res
-        else:
-          yield (physical, node.PortToDevice(virtual))
-
-def _is_plugable_7port_hub(node):
-  """Check if a node is a Plugable 7-Port Hub
-  (Model USB2-HUB7BC)
-  The topology of this device is a 4-port hub,
-  with another 4-port hub connected on port 4.
-  """
-  if '1a40:0101' not in node.desc:
-    return False
-  if not node.HasPort(4):
-    return False
-  return '1a40:0101' in node.PortToDevice(4).desc
-
-# Plugable 7-Port USB-3 Hubs show up twice in the USB devices list; they have
-# two different "branches", one which has USB2 devices and one which has
-# USB3 devices. The "part2" is the "USB-2" branch of the hub, the
-# "part3" is the "USB-3" branch of the hub.
-
-def _is_plugable_7port_usb3_part2_hub(node):
-  """Check if a node is the "USB2 branch" of
-  a Plugable 7-Port USB-3 Hub (Model USB3-HUB7BC)
-  The topology of this device is a 4-port hub,
-  with another 4-port hub connected on port 1.
-  """
-  if '2109:2811' not in node.desc:
-    return False
-  if not node.HasPort(1):
-    return False
-  return '2109:2811' in node.PortToDevice(1).desc
-
-def _is_plugable_7port_usb3_part3_hub(node):
-  """Check if a node is the "USB3 branch" of
-  a Plugable 7-Port USB-3 Hub (Model USB3-HUB7BC)
-  The topology of this device is a 4-port hub,
-  with another 4-port hub connected on port 1.
-  """
-  if '2109:8110' not in node.desc:
-    return False
-  if not node.HasPort(1):
-    return False
-  return '2109:8110' in node.PortToDevice(1).desc
-
-def _is_keedox_hub(node):
-  """Check if a node is a Keedox hub.
-  The topology of this device is a 4-port hub,
-  with another 4-port hub connected on port 4.
-  """
-  if '0bda:5411' not in node.desc:
-    return False
-  if not node.HasPort(4):
-    return False
-  return '0bda:5411' in node.PortToDevice(4).desc
-
-
-PLUGABLE_7PORT = HubType(_is_plugable_7port_hub, PLUGABLE_7PORT_LAYOUT)
-PLUGABLE_7PORT_USB3_PART2 = HubType(_is_plugable_7port_usb3_part2_hub,
-                                    PLUGABLE_7PORT_USB3_LAYOUT)
-PLUGABLE_7PORT_USB3_PART3 = HubType(_is_plugable_7port_usb3_part3_hub,
-                                    PLUGABLE_7PORT_USB3_LAYOUT)
-KEEDOX = HubType(_is_keedox_hub, KEEDOX_LAYOUT)
-
-ALL_HUBS = [PLUGABLE_7PORT,
-            PLUGABLE_7PORT_USB3_PART2,
-            PLUGABLE_7PORT_USB3_PART3,
-            KEEDOX]
-
-def GetHubType(type_name):
-  if type_name == 'plugable_7port':
-    return PLUGABLE_7PORT
-  if type_name == 'plugable_7port_usb3_part2':
-    return PLUGABLE_7PORT_USB3_PART2
-  if type_name == 'plugable_7port_usb3_part3':
-    return PLUGABLE_7PORT_USB3_PART3
-  if type_name == 'keedox':
-    return KEEDOX
-  else:
-    raise ValueError('Invalid hub type')
diff --git a/third_party/catapult/devil/devil/utils/watchdog_timer.py b/third_party/catapult/devil/devil/utils/watchdog_timer.py
deleted file mode 100644
index 2f4c464..0000000
--- a/third_party/catapult/devil/devil/utils/watchdog_timer.py
+++ /dev/null
@@ -1,47 +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.
-
-"""WatchdogTimer timeout objects."""
-
-import time
-
-
-class WatchdogTimer(object):
-  """A resetable timeout-based watchdog.
-
-  This object is threadsafe.
-  """
-
-  def __init__(self, timeout):
-    """Initializes the watchdog.
-
-    Args:
-      timeout: The timeout in seconds. If timeout is None it will never timeout.
-    """
-    self._start_time = time.time()
-    self._timeout = timeout
-
-  def Reset(self):
-    """Resets the timeout countdown."""
-    self._start_time = time.time()
-
-  def GetElapsed(self):
-    """Returns the elapsed time of the watchdog."""
-    return time.time() - self._start_time
-
-  def GetRemaining(self):
-    """Returns the remaining time of the watchdog."""
-    if self._timeout:
-      return self._timeout - self.GetElapsed()
-    else:
-      return None
-
-  def IsTimedOut(self):
-    """Whether the watchdog has timed out.
-
-    Returns:
-      True if the watchdog has timed out, False otherwise.
-    """
-    remaining = self.GetRemaining()
-    return remaining is not None and remaining < 0
diff --git a/third_party/catapult/devil/devil/utils/zip_utils.py b/third_party/catapult/devil/devil/utils/zip_utils.py
deleted file mode 100644
index eaa6a2d..0000000
--- a/third_party/catapult/devil/devil/utils/zip_utils.py
+++ /dev/null
@@ -1,33 +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.
-
-import logging
-import os
-import zipfile
-
-logger = logging.getLogger(__name__)
-
-
-def WriteToZipFile(zip_file, path, arc_path):
-  """Recursively write |path| to |zip_file| as |arc_path|.
-
-  zip_file: An open instance of zipfile.ZipFile.
-  path: An absolute path to the file or directory to be zipped.
-  arc_path: A relative path within the zip file to which the file or directory
-    located at |path| should be written.
-  """
-  if os.path.isdir(path):
-    for dir_path, _, file_names in os.walk(path):
-      dir_arc_path = os.path.join(arc_path, os.path.relpath(dir_path, path))
-      logger.debug('dir:  %s -> %s', dir_path, dir_arc_path)
-      zip_file.write(dir_path, dir_arc_path, zipfile.ZIP_STORED)
-      for f in file_names:
-        file_path = os.path.join(dir_path, f)
-        file_arc_path = os.path.join(dir_arc_path, f)
-        logger.debug('file: %s -> %s', file_path, file_arc_path)
-        zip_file.write(file_path, file_arc_path, zipfile.ZIP_DEFLATED)
-  else:
-    logger.debug('file: %s -> %s', path, arc_path)
-    zip_file.write(path, arc_path, zipfile.ZIP_DEFLATED)
-
diff --git a/third_party/catapult/devil/docs/adb_wrapper.md b/third_party/catapult/devil/docs/adb_wrapper.md
deleted file mode 100644
index a8dc3b0..0000000
--- a/third_party/catapult/devil/docs/adb_wrapper.md
+++ /dev/null
@@ -1,388 +0,0 @@
-# [devil.android.sdk.adb_wrapper](https://github.com/catapult-project/catapult/blob/master/devil/devil/android/sdk/adb_wrapper.py)
-
-*This page was autogenerated by `devil/utils/markdown.py --module-link https://github.com/catapult-project/catapult/blob/master/devil/devil/android/sdk/adb_wrapper.py`*
-
-## DeviceStat
-
-DeviceStat(st\_mode, st\_size, st\_time)
-### DeviceStat.\_\_repr\_\_
-
-Return a nicely formatted representation string
-### DeviceStat.\_\_getnewargs\_\_
-
-Return self as a plain tuple.  Used by copy and pickle.
-### DeviceStat.\_\_getstate\_\_
-
-Exclude the OrderedDict from pickling
-## AdbWrapper
-
-A wrapper around a local Android Debug Bridge executable.
-### AdbWrapper.GetDeviceSerial
-
-Gets the device serial number associated with this object.
-```
-    Returns:
-      Device serial number as a string.
-```
-
-
-### AdbWrapper.Push
-
-Pushes a file from the host to the device.
-```
-    Args:
-      local: Path on the host filesystem.
-      remote: Path on the device filesystem.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-```
-
-
-### AdbWrapper.Pull
-
-Pulls a file from the device to the host.
-```
-    Args:
-      remote: Path on the device filesystem.
-      local: Path on the host filesystem.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-```
-
-
-### AdbWrapper.Shell
-
-Runs a shell command on the device.
-```
-    Args:
-      command: A string with the shell command to run.
-      expect_status: (optional) Check that the command's exit status matches
-        this value. Default is 0. If set to None the test is skipped.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-
-    Returns:
-      The output of the shell command as a string.
-
-    Raises:
-      device_errors.AdbCommandFailedError: If the exit status doesn't match
-        |expect_status|.
-```
-
-
-### AdbWrapper.IterShell
-
-Runs a shell command and returns an iterator over its output lines.
-```
-    Args:
-      command: A string with the shell command to run.
-      timeout: Timeout in seconds.
-
-    Yields:
-      The output of the command line by line.
-```
-
-
-### AdbWrapper.Ls
-
-List the contents of a directory on the device.
-```
-    Args:
-      path: Path on the device filesystem.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-
-    Returns:
-      A list of pairs (filename, stat) for each file found in the directory,
-      where the stat object has the properties: st_mode, st_size, and st_time.
-
-    Raises:
-      AdbCommandFailedError if |path| does not specify a valid and accessible
-          directory in the device, or the output of "adb ls" command is less
-          than four columns
-```
-
-
-### AdbWrapper.Logcat
-
-Get an iterable over the logcat output.
-```
-    Args:
-      clear: If true, clear the logcat.
-      dump: If true, dump the current logcat contents.
-      filter_specs: If set, a list of specs to filter the logcat.
-      logcat_format: If set, the format in which the logcat should be output.
-        Options include "brief", "process", "tag", "thread", "raw", "time",
-        "threadtime", and "long"
-      ring_buffer: If set, a list of alternate ring buffers to request.
-        Options include "main", "system", "radio", "events", "crash" or "all".
-        The default is equivalent to ["main", "system", "crash"].
-      iter_timeout: If set and neither clear nor dump is set, the number of
-        seconds to wait between iterations. If no line is found before the
-        given number of seconds elapses, the iterable will yield None.
-      timeout: (optional) If set, timeout per try in seconds. If clear or dump
-        is set, defaults to DEFAULT_TIMEOUT.
-      retries: (optional) If clear or dump is set, the number of retries to
-        attempt. Otherwise, does nothing.
-
-    Yields:
-      logcat output line by line.
-```
-
-
-### AdbWrapper.Forward
-
-Forward socket connections from the local socket to the remote socket.
-```
-    Sockets are specified by one of:
-      tcp:<port>
-      localabstract:<unix domain socket name>
-      localreserved:<unix domain socket name>
-      localfilesystem:<unix domain socket name>
-      dev:<character device name>
-      jdwp:<process pid> (remote only)
-
-    Args:
-      local: The host socket.
-      remote: The device socket.
-      allow_rebind: A boolean indicating whether adb may rebind a local socket;
-        otherwise, the default, an exception is raised if the local socket is
-        already being forwarded.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-```
-
-
-### AdbWrapper.ForwardRemove
-
-Remove a forward socket connection.
-```
-    Args:
-      local: The host socket.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-```
-
-
-### AdbWrapper.ForwardList
-
-List all currently forwarded socket connections.
-```
-    Args:
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-    Returns:
-      The output of adb forward --list as a string.
-```
-
-
-### AdbWrapper.JDWP
-
-List of PIDs of processes hosting a JDWP transport.
-```
-    Args:
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-
-    Returns:
-      A list of PIDs as strings.
-```
-
-
-### AdbWrapper.Install
-
-Install an apk on the device.
-```
-    Args:
-      apk_path: Host path to the APK file.
-      forward_lock: (optional) If set forward-locks the app.
-      allow_downgrade: (optional) If set, allows for downgrades.
-      reinstall: (optional) If set reinstalls the app, keeping its data.
-      sd_card: (optional) If set installs on the SD card.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-```
-
-
-### AdbWrapper.InstallMultiple
-
-Install an apk with splits on the device.
-```
-    Args:
-      apk_paths: Host path to the APK file.
-      forward_lock: (optional) If set forward-locks the app.
-      reinstall: (optional) If set reinstalls the app, keeping its data.
-      sd_card: (optional) If set installs on the SD card.
-      allow_downgrade: (optional) Allow versionCode downgrade.
-      partial: (optional) Package ID if apk_paths doesn't include all .apks.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-```
-
-
-### AdbWrapper.Uninstall
-
-Remove the app |package| from the device.
-```
-    Args:
-      package: The package to uninstall.
-      keep_data: (optional) If set keep the data and cache directories.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-```
-
-
-### AdbWrapper.Backup
-
-Write an archive of the device's data to |path|.
-```
-    Args:
-      path: Local path to store the backup file.
-      packages: List of to packages to be backed up.
-      apk: (optional) If set include the .apk files in the archive.
-      shared: (optional) If set buckup the device's SD card.
-      nosystem: (optional) If set exclude system applications.
-      include_all: (optional) If set back up all installed applications and
-        |packages| is optional.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-```
-
-
-### AdbWrapper.Restore
-
-Restore device contents from the backup archive.
-```
-    Args:
-      path: Host path to the backup archive.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-```
-
-
-### AdbWrapper.WaitForDevice
-
-Block until the device is online.
-```
-    Args:
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-```
-
-
-### AdbWrapper.GetState
-
-Get device state.
-```
-    Args:
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-
-    Returns:
-      One of 'offline', 'bootloader', or 'device'.
-```
-
-
-### AdbWrapper.GetDevPath
-
-Gets the device path.
-```
-    Args:
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-
-    Returns:
-      The device path (e.g. usb:3-4)
-```
-
-
-### AdbWrapper.Remount
-
-Remounts the /system partition on the device read-write.
-### AdbWrapper.Reboot
-
-Reboots the device.
-```
-    Args:
-      to_bootloader: (optional) If set reboots to the bootloader.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-```
-
-
-### AdbWrapper.Root
-
-Restarts the adbd daemon with root permissions, if possible.
-```
-    Args:
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-```
-
-
-### AdbWrapper.Emu
-
-Runs an emulator console command.
-```
-    See http://developer.android.com/tools/devices/emulator.html#console
-
-    Args:
-      cmd: The command to run on the emulator console.
-      timeout: (optional) Timeout per try in seconds.
-      retries: (optional) Number of retries to attempt.
-
-    Returns:
-      The output of the emulator console command.
-```
-
-
-### AdbWrapper.DisableVerity
-
-Disable Marshmallow's Verity security feature
-### AdbWrapper.EnableVerity
-
-Enable Marshmallow's Verity security feature
-### AdbWrapper.\_\_init\_\_
-
-Initializes the AdbWrapper.
-```
-    Args:
-      device_serial: The device serial number as a string.
-```
-
-
-### AdbWrapper.\_\_eq\_\_
-
-Consider instances equal if they refer to the same device.
-```
-    Args:
-      other: The instance to compare equality with.
-
-    Returns:
-      True if the instances are considered equal, false otherwise.
-```
-
-
-### AdbWrapper.\_\_str\_\_
-
-The string representation of an instance.
-```
-    Returns:
-      The device serial number as a string.
-```
-
-
-### AdbWrapper.\_\_repr\_\_
-
-### VerifyLocalFileExists
-
-Verifies a local file exists.
-```
-  Args:
-    path: Path to the local file.
-
-  Raises:
-    IOError: If the file doesn't exist.
-```
-
-
diff --git a/third_party/catapult/devil/docs/device_blacklist.md b/third_party/catapult/devil/docs/device_blacklist.md
deleted file mode 100644
index c6eed51..0000000
--- a/third_party/catapult/devil/docs/device_blacklist.md
+++ /dev/null
@@ -1,59 +0,0 @@
-<!-- Copyright 2016 The Chromium Authors. All rights reserved.
-     Use of this source code is governed by a BSD-style license that can be
-     found in the LICENSE file.
--->
-
-# Devil: Device Blacklist
-
-## What is it?
-
-The device blacklist is a per-run list of devices detected to be in a known bad
-state along with the reason they are suspected of being in a bad state (offline,
-not responding, etc). It is stored as a json file. This gets reset every run
-during the device recovery step (currently part of `bb_device_status_check`).
-
-## Bots
-
-On bots, this is normally found at `//out/bad_devices.json`. If you are having
-problems with blacklisted devices locally even though a device is in a good
-state, you can safely delete this file.
-
-# Tools for interacting with device black list.
-
-You can interact with the device blacklist via [devil.android.device\_blacklist](https://cs.chromium.org/chromium/src/third_party/catapult/devil/devil/android/device_blacklist.py).
-This allows for any interaction you would need with a device blacklist:
-
-  - Reading
-  - Writing
-  - Extending
-  - Resetting
-
-An example usecase of this is:
-```python
-from devil.android import device_blacklist
-
-blacklist = device_blacklist.Blacklist(blacklist_path)
-blacklisted_devices = blacklist.Read()
-for device in blacklisted_devices:
-  print 'Device %s is blacklisted' % device
-blacklist.Reset()
-new_blacklist = {'device_id1': {'timestamp': ts, 'reason': reason}}
-blacklist.Write(new_blacklist)
-blacklist.Extend([device_2, device_3], reason='Reason for blacklisting')
-```
-
-
-## Where it is used.
-
-The blacklist file path is passed directly to the following scripts in chromium:
-
-  - [test\_runner.py](https://cs.chromium.org/chromium/src/build/android/test_runner.py)
-  - [provision\_devices.py](https://cs.chromium.org/chromium/src/build/android/provision_devices.py)
-  - [bb\_device\_status\_check.py](https://cs.chromium.org/chromium/src/build/android/buildbot/bb_device_status_check.py)
-
-The blacklist is also used in the following scripts:
-
-  - [device\_status.py](https://cs.chromium.org/chromium/src/third_party/catapult/devil/devil/android/tools/device_status.py)
-  - [device\_recovery.py](https://cs.chromium.org/chromium/src/third_party/catapult/devil/devil/android/tools/device_recovery.py)
-
-
diff --git a/third_party/catapult/devil/docs/device_utils.md b/third_party/catapult/devil/docs/device_utils.md
deleted file mode 100644
index b281b26..0000000
--- a/third_party/catapult/devil/docs/device_utils.md
+++ /dev/null
@@ -1,1041 +0,0 @@
-# [devil.android.device_utils](https://github.com/catapult-project/catapult/blob/master/devil/devil/android/device_utils.py)
-
-*This page was autogenerated by `devil/utils/markdown.py --module-link https://github.com/catapult-project/catapult/blob/master/devil/devil/android/device_utils.py`*
-
-## DeviceUtils
-
-### DeviceUtils.\_\_init\_\_
-
-DeviceUtils constructor.
-```
-    Args:
-      device: Either a device serial, an existing AdbWrapper instance, or an
-        an existing AndroidCommands instance.
-      enable_device_files_cache: For PushChangedFiles(), cache checksums of
-        pushed files rather than recomputing them on a subsequent call.
-      default_timeout: An integer containing the default number of seconds to
-        wait for an operation to complete if no explicit value is provided.
-      default_retries: An integer containing the default number or times an
-        operation should be retried on failure if no explicit value is provided.
-```
-
-
-### DeviceUtils.\_\_eq\_\_
-
-Checks whether |other| refers to the same device as |self|.
-```
-    Args:
-      other: The object to compare to. This can be a basestring, an instance
-        of adb_wrapper.AdbWrapper, or an instance of DeviceUtils.
-    Returns:
-      Whether |other| refers to the same device as |self|.
-```
-
-
-### DeviceUtils.\_\_lt\_\_
-
-Compares two instances of DeviceUtils.
-```
-    This merely compares their serial numbers.
-
-    Args:
-      other: The instance of DeviceUtils to compare to.
-    Returns:
-      Whether |self| is less than |other|.
-```
-
-
-### DeviceUtils.\_\_str\_\_
-
-Returns the device serial.
-### DeviceUtils.NeedsSU
-
-Checks whether 'su' is needed to access protected resources.
-```
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      True if 'su' is available on the device and is needed to to access
-        protected resources; False otherwise if either 'su' is not available
-        (e.g. because the device has a user build), or not needed (because adbd
-        already has root privileges).
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.IsOnline
-
-Checks whether the device is online.
-```
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      True if the device is online, False otherwise.
-
-    Raises:
-      CommandTimeoutError on timeout.
-```
-
-
-### DeviceUtils.HasRoot
-
-Checks whether or not adbd has root privileges.
-```
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      True if adbd has root privileges, False otherwise.
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.EnableRoot
-
-Restarts adbd with root privileges.
-```
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandFailedError if root could not be enabled.
-      CommandTimeoutError on timeout.
-```
-
-
-### DeviceUtils.IsUserBuild
-
-Checks whether or not the device is running a user build.
-```
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      True if the device is running a user build, False otherwise (i.e. if
-        it's running a userdebug build).
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.GetExternalStoragePath
-
-Get the device's path to its SD card.
-```
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      The device's path to its SD card.
-
-    Raises:
-      CommandFailedError if the external storage path could not be determined.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.GetApplicationPaths
-
-Get the paths of the installed apks on the device for the given package.
-```
-    Args:
-      package: Name of the package.
-
-    Returns:
-      List of paths to the apks on the device for the given package.
-```
-
-
-### DeviceUtils.GetApplicationVersion
-
-Get the version name of a package installed on the device.
-```
-    Args:
-      package: Name of the package.
-
-    Returns:
-      A string with the version name or None if the package is not found
-      on the device.
-```
-
-
-### DeviceUtils.GetApplicationDataDirectory
-
-Get the data directory on the device for the given package.
-```
-    Args:
-      package: Name of the package.
-
-    Returns:
-      The package's data directory.
-    Raises:
-      CommandFailedError if the package's data directory can't be found,
-        whether because it's not installed or otherwise.
-```
-
-
-### DeviceUtils.WaitUntilFullyBooted
-
-Wait for the device to fully boot.
-```
-    This means waiting for the device to boot, the package manager to be
-    available, and the SD card to be ready. It can optionally mean waiting
-    for wifi to come up, too.
-
-    Args:
-      wifi: A boolean indicating if we should wait for wifi to come up or not.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandFailedError on failure.
-      CommandTimeoutError if one of the component waits times out.
-      DeviceUnreachableError if the device becomes unresponsive.
-```
-
-
-### DeviceUtils.Reboot
-
-Reboot the device.
-```
-    Args:
-      block: A boolean indicating if we should wait for the reboot to complete.
-      wifi: A boolean indicating if we should wait for wifi to be enabled after
-        the reboot. The option has no effect unless |block| is also True.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.Install
-
-Install an APK.
-```
-    Noop if an identical APK is already installed.
-
-    Args:
-      apk: An ApkHelper instance or string containing the path to the APK.
-      allow_downgrade: A boolean indicating if we should allow downgrades.
-      reinstall: A boolean indicating if we should keep any existing app data.
-      permissions: Set of permissions to set. If not set, finds permissions with
-          apk helper. To set no permissions, pass [].
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandFailedError if the installation fails.
-      CommandTimeoutError if the installation times out.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.InstallSplitApk
-
-Install a split APK.
-```
-    Noop if all of the APK splits are already installed.
-
-    Args:
-      base_apk: An ApkHelper instance or string containing the path to the base
-          APK.
-      split_apks: A list of strings of paths of all of the APK splits.
-      allow_downgrade: A boolean indicating if we should allow downgrades.
-      reinstall: A boolean indicating if we should keep any existing app data.
-      allow_cached_props: Whether to use cached values for device properties.
-      permissions: Set of permissions to set. If not set, finds permissions with
-          apk helper. To set no permissions, pass [].
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandFailedError if the installation fails.
-      CommandTimeoutError if the installation times out.
-      DeviceUnreachableError on missing device.
-      DeviceVersionError if device SDK is less than Android L.
-```
-
-
-### DeviceUtils.Uninstall
-
-Remove the app |package\_name| from the device.
-```
-    This is a no-op if the app is not already installed.
-
-    Args:
-      package_name: The package to uninstall.
-      keep_data: (optional) Whether to keep the data and cache directories.
-      timeout: Timeout in seconds.
-      retries: Number of retries.
-
-    Raises:
-      CommandFailedError if the uninstallation fails.
-      CommandTimeoutError if the uninstallation times out.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.RunShellCommand
-
-Run an ADB shell command.
-```
-    The command to run |cmd| should be a sequence of program arguments or else
-    a single string.
-
-    When |cmd| is a sequence, it is assumed to contain the name of the command
-    to run followed by its arguments. In this case, arguments are passed to the
-    command exactly as given, without any further processing by the shell. This
-    allows to easily pass arguments containing spaces or special characters
-    without having to worry about getting quoting right. Whenever possible, it
-    is recomended to pass |cmd| as a sequence.
-
-    When |cmd| is given as a string, it will be interpreted and run by the
-    shell on the device.
-
-    This behaviour is consistent with that of command runners in cmd_helper as
-    well as Python's own subprocess.Popen.
-
-    TODO(perezju) Change the default of |check_return| to True when callers
-      have switched to the new behaviour.
-
-    Args:
-      cmd: A string with the full command to run on the device, or a sequence
-        containing the command and its arguments.
-      check_return: A boolean indicating whether or not the return code should
-        be checked.
-      cwd: The device directory in which the command should be run.
-      env: The environment variables with which the command should be run.
-      run_as: A string containing the package as which the command should be
-        run.
-      as_root: A boolean indicating whether the shell command should be run
-        with root privileges.
-      single_line: A boolean indicating if only a single line of output is
-        expected.
-      large_output: Uses a work-around for large shell command output. Without
-        this large output will be truncated.
-      raw_output: Whether to only return the raw output
-          (no splitting into lines).
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      If single_line is False, the output of the command as a list of lines,
-      otherwise, a string with the unique line of output emmited by the command
-      (with the optional newline at the end stripped).
-
-    Raises:
-      AdbCommandFailedError if check_return is True and the exit code of
-        the command run on the device is non-zero.
-      CommandFailedError if single_line is True but the output contains two or
-        more lines.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.KillAll
-
-Kill all processes with the given name on the device.
-```
-    Args:
-      process_name: A string containing the name of the process to kill.
-      exact: A boolean indicating whether to kill all processes matching
-             the string |process_name| exactly, or all of those which contain
-             |process_name| as a substring. Defaults to False.
-      signum: An integer containing the signal number to send to kill. Defaults
-              to SIGKILL (9).
-      as_root: A boolean indicating whether the kill should be executed with
-               root privileges.
-      blocking: A boolean indicating whether we should wait until all processes
-                with the given |process_name| are dead.
-      quiet: A boolean indicating whether to ignore the fact that no processes
-             to kill were found.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      The number of processes attempted to kill.
-
-    Raises:
-      CommandFailedError if no process was killed and |quiet| is False.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.StartActivity
-
-Start package's activity on the device.
-```
-    Args:
-      intent_obj: An Intent object to send.
-      blocking: A boolean indicating whether we should wait for the activity to
-                finish launching.
-      trace_file_name: If present, a string that both indicates that we want to
-                       profile the activity and contains the path to which the
-                       trace should be saved.
-      force_stop: A boolean indicating whether we should stop the activity
-                  before starting it.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandFailedError if the activity could not be started.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.StartInstrumentation
-
-### DeviceUtils.BroadcastIntent
-
-Send a broadcast intent.
-```
-    Args:
-      intent: An Intent to broadcast.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.GoHome
-
-Return to the home screen and obtain launcher focus.
-```
-    This command launches the home screen and attempts to obtain
-    launcher focus until the timeout is reached.
-
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.ForceStop
-
-Close the application.
-```
-    Args:
-      package: A string containing the name of the package to stop.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.ClearApplicationState
-
-Clear all state for the given package.
-```
-    Args:
-      package: A string containing the name of the package to stop.
-      permissions: List of permissions to set after clearing data.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.SendKeyEvent
-
-Sends a keycode to the device.
-```
-    See the devil.android.sdk.keyevent module for suitable keycode values.
-
-    Args:
-      keycode: A integer keycode to send to the device.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.PushChangedFiles
-
-Push files to the device, skipping files that don't need updating.
-```
-    When a directory is pushed, it is traversed recursively on the host and
-    all files in it are pushed to the device as needed.
-    Additionally, if delete_device_stale option is True,
-    files that exist on the device but don't exist on the host are deleted.
-
-    Args:
-      host_device_tuples: A list of (host_path, device_path) tuples, where
-        |host_path| is an absolute path of a file or directory on the host
-        that should be minimially pushed to the device, and |device_path| is
-        an absolute path of the destination on the device.
-      timeout: timeout in seconds
-      retries: number of retries
-      delete_device_stale: option to delete stale files on device
-
-    Raises:
-      CommandFailedError on failure.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.FileExists
-
-Checks whether the given file exists on the device.
-```
-    Arguments are the same as PathExists.
-```
-
-
-### DeviceUtils.PathExists
-
-Checks whether the given path(s) exists on the device.
-```
-    Args:
-      device_path: A string containing the absolute path to the file on the
-                   device, or an iterable of paths to check.
-      as_root: Whether root permissions should be use to check for the existence
-               of the given path(s).
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      True if the all given paths exist on the device, False otherwise.
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.RemovePath
-
-Removes the given path(s) from the device.
-```
-    Args:
-      device_path: A string containing the absolute path to the file on the
-                   device, or an iterable of paths to check.
-      force: Whether to remove the path(s) with force (-f).
-      recursive: Whether to remove any directories in the path(s) recursively.
-      as_root: Whether root permissions should be use to remove the given
-               path(s).
-      timeout: timeout in seconds
-      retries: number of retries
-```
-
-
-### DeviceUtils.PullFile
-
-Pull a file from the device.
-```
-    Args:
-      device_path: A string containing the absolute path of the file to pull
-                   from the device.
-      host_path: A string containing the absolute path of the destination on
-                 the host.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandFailedError on failure.
-      CommandTimeoutError on timeout.
-```
-
-
-### DeviceUtils.ReadFile
-
-Reads the contents of a file from the device.
-```
-    Args:
-      device_path: A string containing the absolute path of the file to read
-                   from the device.
-      as_root: A boolean indicating whether the read should be executed with
-               root privileges.
-      force_pull: A boolean indicating whether to force the operation to be
-          performed by pulling a file from the device. The default is, when the
-          contents are short, to retrieve the contents using cat instead.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      The contents of |device_path| as a string. Contents are intepreted using
-      universal newlines, so the caller will see them encoded as '
-'. Also,
-      all lines will be terminated.
-
-    Raises:
-      AdbCommandFailedError if the file can't be read.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.WriteFile
-
-Writes |contents| to a file on the device.
-```
-    Args:
-      device_path: A string containing the absolute path to the file to write
-          on the device.
-      contents: A string containing the data to write to the device.
-      as_root: A boolean indicating whether the write should be executed with
-          root privileges (if available).
-      force_push: A boolean indicating whether to force the operation to be
-          performed by pushing a file to the device. The default is, when the
-          contents are short, to pass the contents using a shell script instead.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandFailedError if the file could not be written on the device.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.ListDirectory
-
-List all files on a device directory.
-```
-    Mirroring os.listdir (and most client expectations) the resulting list
-    does not include the special entries '.' and '..' even if they are present
-    in the directory.
-
-    Args:
-      device_path: A string containing the path of the directory on the device
-                   to list.
-      as_root: A boolean indicating whether the to use root privileges to list
-               the directory contents.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      A list of filenames for all entries contained in the directory.
-
-    Raises:
-      AdbCommandFailedError if |device_path| does not specify a valid and
-          accessible directory in the device.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.StatDirectory
-
-List file and stat info for all entries on a device directory.
-```
-    Implementation notes: this is currently implemented by parsing the output
-    of 'ls -a -l' on the device. Whether possible and convenient, we attempt to
-    make parsing strict and return values mirroring those of the standard |os|
-    and |stat| Python modules.
-
-    Mirroring os.listdir (and most client expectations) the resulting list
-    does not include the special entries '.' and '..' even if they are present
-    in the directory.
-
-    Args:
-      device_path: A string containing the path of the directory on the device
-                   to list.
-      as_root: A boolean indicating whether the to use root privileges to list
-               the directory contents.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      A list of dictionaries, each containing the following keys:
-        filename: A string with the file name.
-        st_mode: File permissions, use the stat module to interpret these.
-        st_nlink: Number of hard links (may be missing).
-        st_owner: A string with the user name of the owner.
-        st_group: A string with the group name of the owner.
-        st_rdev_pair: Device type as (major, minior) (only if inode device).
-        st_size: Size of file, in bytes (may be missing for non-regular files).
-        st_mtime: Time of most recent modification, in seconds since epoch
-          (although resolution is in minutes).
-        symbolic_link_to: If entry is a symbolic link, path where it points to;
-          missing otherwise.
-
-    Raises:
-      AdbCommandFailedError if |device_path| does not specify a valid and
-          accessible directory in the device.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.StatPath
-
-Get the stat attributes of a file or directory on the device.
-```
-    Args:
-      device_path: A string containing the path of a file or directory from
-                   which to get attributes.
-      as_root: A boolean indicating whether the to use root privileges to
-               access the file information.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      A dictionary with the stat info collected; see StatDirectory for details.
-
-    Raises:
-      CommandFailedError if device_path cannot be found on the device.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.FileSize
-
-Get the size of a file on the device.
-```
-    Note: This is implemented by parsing the output of the 'ls' command on
-    the device. On some Android versions, when passing a directory or special
-    file, the size is *not* reported and this function will throw an exception.
-
-    Args:
-      device_path: A string containing the path of a file on the device.
-      as_root: A boolean indicating whether the to use root privileges to
-               access the file information.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      The size of the file in bytes.
-
-    Raises:
-      CommandFailedError if device_path cannot be found on the device, or
-        its size cannot be determited for some reason.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.GetLanguage
-
-Returns the language setting on the device.
-```
-    Args:
-      cache: Whether to use cached properties when available.
-```
-
-
-### DeviceUtils.SetJavaAsserts
-
-Enables or disables Java asserts.
-```
-    Args:
-      enabled: A boolean indicating whether Java asserts should be enabled
-               or disabled.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      True if the device-side property changed and a restart is required as a
-      result, False otherwise.
-
-    Raises:
-      CommandTimeoutError on timeout.
-```
-
-
-### DeviceUtils.GetCountry
-
-Returns the country setting on the device.
-```
-    Args:
-      cache: Whether to use cached properties when available.
-```
-
-
-### DeviceUtils.GetProp
-
-Gets a property from the device.
-```
-    Args:
-      property_name: A string containing the name of the property to get from
-                     the device.
-      cache: Whether to use cached properties when available.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      The value of the device's |property_name| property.
-
-    Raises:
-      CommandTimeoutError on timeout.
-```
-
-
-### DeviceUtils.SetProp
-
-Sets a property on the device.
-```
-    Args:
-      property_name: A string containing the name of the property to set on
-                     the device.
-      value: A string containing the value to set to the property on the
-             device.
-      check: A boolean indicating whether to check that the property was
-             successfully set on the device.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandFailedError if check is true and the property was not correctly
-        set on the device (e.g. because it is not rooted).
-      CommandTimeoutError on timeout.
-```
-
-
-### DeviceUtils.GetABI
-
-Gets the device main ABI.
-```
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      The device's main ABI name.
-
-    Raises:
-      CommandTimeoutError on timeout.
-```
-
-
-### DeviceUtils.GetPids
-
-Returns the PIDs of processes with the given name.
-```
-    Note that the |process_name| is often the package name.
-
-    Args:
-      process_name: A string containing the process name to get the PIDs for.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      A dict mapping process name to a list of PIDs for each process that
-      contained the provided |process_name|.
-
-    Raises:
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.GetEnforce
-
-Get the current mode of SELinux.
-```
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      True (enforcing), False (permissive), or None (disabled).
-
-    Raises:
-      CommandFailedError on failure.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.SetEnforce
-
-Modify the mode SELinux is running in.
-```
-    Args:
-      enabled: a boolean indicating whether to put SELinux in encorcing mode
-               (if True), or permissive mode (otherwise).
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Raises:
-      CommandFailedError on failure.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.TakeScreenshot
-
-Takes a screenshot of the device.
-```
-    Args:
-      host_path: A string containing the path on the host to save the
-                 screenshot to. If None, a file name in the current
-                 directory will be generated.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      The name of the file on the host to which the screenshot was saved.
-
-    Raises:
-      CommandFailedError on failure.
-      CommandTimeoutError on timeout.
-      DeviceUnreachableError on missing device.
-```
-
-
-### DeviceUtils.GetMemoryUsageForPid
-
-Gets the memory usage for the given PID.
-```
-    Args:
-      pid: PID of the process.
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      A dict containing memory usage statistics for the PID. May include:
-        Size, Rss, Pss, Shared_Clean, Shared_Dirty, Private_Clean,
-        Private_Dirty, VmHWM
-
-    Raises:
-      CommandTimeoutError on timeout.
-```
-
-
-### DeviceUtils.DismissCrashDialogIfNeeded
-
-Dismiss the error/ANR dialog if present.
-```
-    Returns: Name of the crashed package if a dialog is focused,
-             None otherwise.
-```
-
-
-### DeviceUtils.GetLogcatMonitor
-
-Returns a new LogcatMonitor associated with this device.
-```
-    Parameters passed to this function are passed directly to
-    |logcat_monitor.LogcatMonitor| and are documented there.
-```
-
-
-### DeviceUtils.GetClientCache
-
-Returns client cache.
-### DeviceUtils.LoadCacheData
-
-Initializes the cache from data created using DumpCacheData.
-```
-    The cache is used only if its token matches the one found on the device.
-    This prevents a stale cache from being used (which can happen when sharing
-    devices).
-
-    Args:
-      data: A previously serialized cache (string).
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      Whether the cache was loaded.
-```
-
-
-### DeviceUtils.DumpCacheData
-
-Dumps the current cache state to a string.
-```
-    Args:
-      timeout: timeout in seconds
-      retries: number of retries
-
-    Returns:
-      A serialized cache as a string.
-```
-
-
-### DeviceUtils.RestartAdbd
-
-### DeviceUtils.GrantPermissions
-
-### DeviceUtils.IsScreenOn
-
-Determines if screen is on.
-```
-    Dumpsys input_method exposes screen on/off state. Below is an explination of
-    the states.
-
-    Pre-L:
-      On: mScreenOn=true
-      Off: mScreenOn=false
-    L+:
-      On: mInteractive=true
-      Off: mInteractive=false
-
-    Returns:
-      True if screen is on, false if it is off.
-
-    Raises:
-      device_errors.CommandFailedError: If screen state cannot be found.
-```
-
-
-### DeviceUtils.SetScreen
-
-Turns screen on and off.
-```
-    Args:
-      on: bool to decide state to switch to. True = on False = off.
-```
-
-
-### GetAVDs
-
-Returns a list of Android Virtual Devices.
-```
-  Returns:
-    A list containing the configured AVDs.
-```
-
-
-### RestartServer
-
-Restarts the adb server.
-```
-  Raises:
-    CommandFailedError if we fail to kill or restart the server.
-```
-
-
diff --git a/third_party/catapult/devil/docs/markdown.md b/third_party/catapult/devil/docs/markdown.md
deleted file mode 100644
index 957dba7..0000000
--- a/third_party/catapult/devil/docs/markdown.md
+++ /dev/null
@@ -1,139 +0,0 @@
-# [devil.utils.markdown](https://github.com/catapult-project/catapult/blob/master/devil/devil/utils/markdown.py)
-
-*This page was autogenerated by `devil/utils/markdown.py --module-link https://github.com/catapult-project/catapult/blob/master/devil/devil/utils/markdown.py`*
-
-## MarkdownHelpAction
-
-### MarkdownHelpAction.\_\_init\_\_
-
-### MarkdownHelpAction.\_\_call\_\_
-
-## MarkdownHelpFormatter
-
-A really bare-bones argparse help formatter that generates valid markdown.
-```
-  This will generate something like:
-
-  usage
-
-  # **section heading**:
-
-  ## **--argument-one**
-
-  \`\`\`
-  argument-one help text
-  \`\`\`
-
-```
-
-
-### MarkdownHelpFormatter.format\_help
-
-### MarkdownHelpFormatter.start\_section
-
-### md\_bold
-
-Returns markdown-formatted bold text.
-### md\_code
-
-Returns a markdown-formatted code block in the given language.
-### md\_escape
-
-Escapes \* and \_.
-### md\_heading
-
-Returns markdown-formatted heading.
-### md\_inline\_code
-
-Returns markdown-formatted inline code.
-### md\_italic
-
-Returns markdown-formatted italic text.
-### md\_link
-
-returns a markdown-formatted link.
-### add\_md\_help\_argument
-
-Adds --md-help to the given argparse.ArgumentParser.
-```
-  Running a script with --md-help will print the help text for that script
-  as valid markdown.
-
-  Args:
-    parser: The ArgumentParser to which --md-help should be added.
-```
-
-
-### load\_module\_from\_path
-
-Load a module given only the path name.
-```
-  Also loads package modules as necessary.
-
-  Args:
-    module_path: An absolute path to a python module.
-  Returns:
-    The module object for the given path.
-```
-
-
-### md\_module
-
-Write markdown documentation for a class.
-```
-  Documents public classes and functions.
-
-  Args:
-    class_obj: a types.TypeType object for the class that should be
-      documented.
-  Returns:
-    A list of markdown-formatted lines.
-```
-
-
-### md\_class
-
-Write markdown documentation for a class.
-```
-  Documents public methods. Does not currently document subclasses.
-
-  Args:
-    class_obj: a types.TypeType object for the class that should be
-      documented.
-  Returns:
-    A list of markdown-formatted lines.
-```
-
-
-### md\_docstring
-
-Write a markdown-formatted docstring.
-```
-  Returns:
-    A list of markdown-formatted lines.
-```
-
-
-### md\_function
-
-Write markdown documentation for a function.
-```
-  Args:
-    func_obj: a types.FunctionType object for the function that should be
-      documented.
-  Returns:
-    A list of markdown-formatted lines.
-```
-
-
-### main
-
-Write markdown documentation for the module at the provided path.
-```
-  Args:
-    raw_args: the raw command-line args. Usually sys.argv[1:].
-  Returns:
-    An integer exit code. 0 for success, non-zero for failure.
-```
-
-
diff --git a/third_party/catapult/devil/docs/persistent_device_list.md b/third_party/catapult/devil/docs/persistent_device_list.md
deleted file mode 100644
index d08d9a9..0000000
--- a/third_party/catapult/devil/docs/persistent_device_list.md
+++ /dev/null
@@ -1,41 +0,0 @@
-<!-- Copyright 2016 The Chromium Authors. All rights reserved.
-     Use of this source code is governed by a BSD-style license that can be
-     found in the LICENSE file.
--->
-
-# Devil: Persistent Device List
-
-## What is it?
-
-A persistent device list that stores all expected devices between builds. It
-is used by the perf test runner in order to properly shard tests by device
-affinity. This is important because the same performance test can yield
-meaningfully different results when run on different devices.
-
-## Bots
-
-The list is usually located at one of these locations:
-
-  - `/b/build/site_config/.known_devices`.
-  - `~/.android`.
-
-Look at recipes listed below in order to find more up to date location.
-
-## Local Runs
-
-The persistent device list is unnecessary for local runs. It is only used on the
-bots that upload data to the perf dashboard.
-
-## Where it is used
-
-The persistent device list is used in performance test recipes via
-[api.chromium\_tests.steps.DynamicPerfTests](https://cs.chromium.org/chromium/build/scripts/slave/recipe_modules/chromium_tests/steps.py?q=DynamicPerfTests).
-For example, the [android/perf](https://cs.chromium.org/chromium/build/scripts/slave/recipes/android/perf.py) recipe uses it like this:
-
-```python
-dynamic_perf_tests = api.chromium_tests.steps.DynamicPerfTests(
-    builder['perf_id'], 'android', None,
-    known_devices_file=builder.get('known_devices_file', None))
-dynamic_perf_tests.run(api, None)
-```
-
diff --git a/third_party/catapult/devil/pylintrc b/third_party/catapult/devil/pylintrc
deleted file mode 100644
index 7e024a2..0000000
--- a/third_party/catapult/devil/pylintrc
+++ /dev/null
@@ -1,68 +0,0 @@
-[MESSAGES CONTROL]
-
-# Disable the message, report, category or checker with the given id(s).
-# TODO: Shrink this list to as small as possible.
-disable=
-  design,
-  similarities,
-
-  bad-continuation,
-  fixme,
-  import-error,
-  invalid-name,
-  locally-disabled,
-  locally-enabled,
-  missing-docstring,
-  star-args,
-
-
-[REPORTS]
-
-# Don't write out full reports, just messages.
-reports=no
-
-
-[BASIC]
-
-# Regular expression which should only match correct function names.
-function-rgx=^(?:(?P<exempt>setUp|tearDown|setUpModule|tearDownModule)|(?P<camel_case>_?[A-Z][a-zA-Z0-9]*))$
-
-# Regular expression which should only match correct method names.
-method-rgx=^(?:(?P<exempt>_[a-z0-9_]+__|get|post|runTest|setUp|tearDown|setUpTestCase|tearDownTestCase|setupSelf|tearDownClass|setUpClass)|(?P<camel_case>(_{0,2}|test|assert)[A-Z][a-zA-Z0-9_]*))$
-
-# Regular expression which should only match correct argument names.
-argument-rgx=^[a-z][a-z0-9_]*$
-
-# Regular expression which should only match correct variable names.
-variable-rgx=^[a-z][a-z0-9_]*$
-
-# Good variable names which should always be accepted, separated by a comma.
-good-names=main,_
-
-# List of builtins function names that should not be used, separated by a comma.
-bad-functions=apply,input,reduce
-
-
-[VARIABLES]
-
-# Tells wether we should check for unused import in __init__ files.
-init-import=no
-
-# A regular expression matching names used for dummy variables (i.e. not used).
-dummy-variables-rgx=^_.*$|dummy
-
-
-[TYPECHECK]
-
-# Tells wether missing members accessed in mixin class should be ignored. A
-# mixin class is detected if its name ends with "mixin" (case insensitive).
-ignore-mixin-members=yes
-
-
-[FORMAT]
-
-# Maximum number of lines in a module.
-max-module-lines=10000
-
-# We use two spaces for indents, instead of the usual four spaces or tab.
-indent-string='  '
diff --git a/third_party/jinja2/AUTHORS b/third_party/jinja2/AUTHORS
deleted file mode 100644
index 943f625..0000000
--- a/third_party/jinja2/AUTHORS
+++ /dev/null
@@ -1,33 +0,0 @@
-Jinja is written and maintained by the Jinja Team and various
-contributors:
-
-Lead Developer:
-
-- Armin Ronacher <armin.ronacher@active-4.com>
-
-Developers:
-
-- Christoph Hack
-- Georg Brandl
-
-Contributors:
-
-- Bryan McLemore
-- Mickaël Guérin <kael@crocobox.org>
-- Cameron Knight
-- Lawrence Journal-World.
-- David Cramer
-
-Patches and suggestions:
-
-- Ronny Pfannschmidt
-- Axel Böhm
-- Alexey Melchakov
-- Bryan McLemore
-- Clovis Fabricio (nosklo)
-- Cameron Knight
-- Peter van Dijk (Habbie)
-- Stefan Ebner
-- Rene Leonhardt
-- Thomas Waldmann
-- Cory Benfield (Lukasa)
diff --git a/third_party/jinja2/Jinja2-2.8.tar.gz.md5 b/third_party/jinja2/Jinja2-2.8.tar.gz.md5
deleted file mode 100644
index a0eb1b2..0000000
--- a/third_party/jinja2/Jinja2-2.8.tar.gz.md5
+++ /dev/null
@@ -1 +0,0 @@
-edb51693fe22c53cee5403775c71a99e  Jinja2-2.8.tar.gz
diff --git a/third_party/jinja2/Jinja2-2.8.tar.gz.sha512 b/third_party/jinja2/Jinja2-2.8.tar.gz.sha512
deleted file mode 100644
index 88e4ea6..0000000
--- a/third_party/jinja2/Jinja2-2.8.tar.gz.sha512
+++ /dev/null
@@ -1 +0,0 @@
-2e80d6d9ad10dafcce1e6dd24493f5dffc43a17f71a30a650415638e12d3a3891738ebacc569701129214026d062d91a2b10e4f7a2c7b85d801dde26ded1bebb  Jinja2-2.8.tar.gz
diff --git a/third_party/jinja2/LICENSE b/third_party/jinja2/LICENSE
deleted file mode 100644
index 31bf900..0000000
--- a/third_party/jinja2/LICENSE
+++ /dev/null
@@ -1,31 +0,0 @@
-Copyright (c) 2009 by the Jinja Team, see AUTHORS for more details.
-
-Some rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-
-    * Redistributions in binary form must reproduce the above
-      copyright notice, this list of conditions and the following
-      disclaimer in the documentation and/or other materials provided
-      with the distribution.
-
-    * The names of the contributors may not be used to endorse or
-      promote products derived from this software without specific
-      prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/third_party/jinja2/README.chromium b/third_party/jinja2/README.chromium
deleted file mode 100644
index 684ff8e..0000000
--- a/third_party/jinja2/README.chromium
+++ /dev/null
@@ -1,25 +0,0 @@
-Name: Jinja2 Python Template Engine
-Short Name: jinja2
-URL: http://jinja.pocoo.org/
-Version: 2.8
-License: BSD 3-clause License
-License File: NOT_SHIPPED
-Security Critical: no
-
-Description:
-Template engine for code generation in Blink.
-
-Source: https://pypi.python.org/packages/f2/2f/0b98b06a345a761bec91a079ccae392d282690c2d8272e708f4d10829e22/Jinja2-2.8.tar.gz
-MD5: edb51693fe22c53cee5403775c71a99e
-SHA-1: 4a33c1a0fd585eba2507e8c274a9cd113b1d13ab
-
-Local Modifications:
-This only includes the jinja2 directory from the tarball and the LICENSE and
-AUTHORS files. Unit tests (testsuite directory) have been removed.
-Additional chromium-specific files are:
-* README.chromium (this file)
-* OWNERS
-* install script (get_jinja2.sh)
-* files of hashes (MD5 is also posted on website, SHA-512 computed locally).
-Script checks hash then unpacks archive and installs desired files.
-Retrieve or update by executing jinja2/get_jinja2.sh from third_party.
diff --git a/third_party/jinja2/__init__.py b/third_party/jinja2/__init__.py
deleted file mode 100644
index 029fb2e..0000000
--- a/third_party/jinja2/__init__.py
+++ /dev/null
@@ -1,70 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    jinja2
-    ~~~~~~
-
-    Jinja2 is a template engine written in pure Python.  It provides a
-    Django inspired non-XML syntax but supports inline expressions and
-    an optional sandboxed environment.
-
-    Nutshell
-    --------
-
-    Here a small example of a Jinja2 template::
-
-        {% extends 'base.html' %}
-        {% block title %}Memberlist{% endblock %}
-        {% block content %}
-          <ul>
-          {% for user in users %}
-            <li><a href="{{ user.url }}">{{ user.username }}</a></li>
-          {% endfor %}
-          </ul>
-        {% endblock %}
-
-
-    :copyright: (c) 2010 by the Jinja Team.
-    :license: BSD, see LICENSE for more details.
-"""
-__docformat__ = 'restructuredtext en'
-__version__ = '2.8'
-
-# high level interface
-from jinja2.environment import Environment, Template
-
-# loaders
-from jinja2.loaders import BaseLoader, FileSystemLoader, PackageLoader, \
-     DictLoader, FunctionLoader, PrefixLoader, ChoiceLoader, \
-     ModuleLoader
-
-# bytecode caches
-from jinja2.bccache import BytecodeCache, FileSystemBytecodeCache, \
-     MemcachedBytecodeCache
-
-# undefined types
-from jinja2.runtime import Undefined, DebugUndefined, StrictUndefined, \
-     make_logging_undefined
-
-# exceptions
-from jinja2.exceptions import TemplateError, UndefinedError, \
-     TemplateNotFound, TemplatesNotFound, TemplateSyntaxError, \
-     TemplateAssertionError
-
-# decorators and public utilities
-from jinja2.filters import environmentfilter, contextfilter, \
-     evalcontextfilter
-from jinja2.utils import Markup, escape, clear_caches, \
-     environmentfunction, evalcontextfunction, contextfunction, \
-     is_undefined
-
-__all__ = [
-    'Environment', 'Template', 'BaseLoader', 'FileSystemLoader',
-    'PackageLoader', 'DictLoader', 'FunctionLoader', 'PrefixLoader',
-    'ChoiceLoader', 'BytecodeCache', 'FileSystemBytecodeCache',
-    'MemcachedBytecodeCache', 'Undefined', 'DebugUndefined',
-    'StrictUndefined', 'TemplateError', 'UndefinedError', 'TemplateNotFound',
-    'TemplatesNotFound', 'TemplateSyntaxError', 'TemplateAssertionError',
-    'ModuleLoader', 'environmentfilter', 'contextfilter', 'Markup', 'escape',
-    'environmentfunction', 'contextfunction', 'clear_caches', 'is_undefined',
-    'evalcontextfilter', 'evalcontextfunction', 'make_logging_undefined',
-]
diff --git a/third_party/jinja2/_compat.py b/third_party/jinja2/_compat.py
deleted file mode 100644
index 143962f..0000000
--- a/third_party/jinja2/_compat.py
+++ /dev/null
@@ -1,111 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    jinja2._compat
-    ~~~~~~~~~~~~~~
-
-    Some py2/py3 compatibility support based on a stripped down
-    version of six so we don't have to depend on a specific version
-    of it.
-
-    :copyright: Copyright 2013 by the Jinja team, see AUTHORS.
-    :license: BSD, see LICENSE for details.
-"""
-import sys
-
-PY2 = sys.version_info[0] == 2
-PYPY = hasattr(sys, 'pypy_translation_info')
-_identity = lambda x: x
-
-
-if not PY2:
-    unichr = chr
-    range_type = range
-    text_type = str
-    string_types = (str,)
-    integer_types = (int,)
-
-    iterkeys = lambda d: iter(d.keys())
-    itervalues = lambda d: iter(d.values())
-    iteritems = lambda d: iter(d.items())
-
-    import pickle
-    from io import BytesIO, StringIO
-    NativeStringIO = StringIO
-
-    def reraise(tp, value, tb=None):
-        if value.__traceback__ is not tb:
-            raise value.with_traceback(tb)
-        raise value
-
-    ifilter = filter
-    imap = map
-    izip = zip
-    intern = sys.intern
-
-    implements_iterator = _identity
-    implements_to_string = _identity
-    encode_filename = _identity
-    get_next = lambda x: x.__next__
-
-else:
-    unichr = unichr
-    text_type = unicode
-    range_type = xrange
-    string_types = (str, unicode)
-    integer_types = (int, long)
-
-    iterkeys = lambda d: d.iterkeys()
-    itervalues = lambda d: d.itervalues()
-    iteritems = lambda d: d.iteritems()
-
-    import cPickle as pickle
-    from cStringIO import StringIO as BytesIO, StringIO
-    NativeStringIO = BytesIO
-
-    exec('def reraise(tp, value, tb=None):\n raise tp, value, tb')
-
-    from itertools import imap, izip, ifilter
-    intern = intern
-
-    def implements_iterator(cls):
-        cls.next = cls.__next__
-        del cls.__next__
-        return cls
-
-    def implements_to_string(cls):
-        cls.__unicode__ = cls.__str__
-        cls.__str__ = lambda x: x.__unicode__().encode('utf-8')
-        return cls
-
-    get_next = lambda x: x.next
-
-    def encode_filename(filename):
-        if isinstance(filename, unicode):
-            return filename.encode('utf-8')
-        return filename
-
-
-def with_metaclass(meta, *bases):
-    # This requires a bit of explanation: the basic idea is to make a
-    # dummy metaclass for one level of class instanciation that replaces
-    # itself with the actual metaclass.  Because of internal type checks
-    # we also need to make sure that we downgrade the custom metaclass
-    # for one level to something closer to type (that's why __call__ and
-    # __init__ comes back from type etc.).
-    #
-    # This has the advantage over six.with_metaclass in that it does not
-    # introduce dummy classes into the final MRO.
-    class metaclass(meta):
-        __call__ = type.__call__
-        __init__ = type.__init__
-        def __new__(cls, name, this_bases, d):
-            if this_bases is None:
-                return type.__new__(cls, name, (), d)
-            return meta(name, bases, d)
-    return metaclass('temporary_class', None, {})
-
-
-try:
-    from urllib.parse import quote_from_bytes as url_quote
-except ImportError:
-    from urllib import quote as url_quote
diff --git a/third_party/jinja2/_stringdefs.py b/third_party/jinja2/_stringdefs.py
deleted file mode 100644
index da5830e..0000000
--- a/third_party/jinja2/_stringdefs.py
+++ /dev/null
@@ -1,132 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    jinja2._stringdefs
-    ~~~~~~~~~~~~~~~~~~
-
-    Strings of all Unicode characters of a certain category.
-    Used for matching in Unicode-aware languages. Run to regenerate.
-
-    Inspired by chartypes_create.py from the MoinMoin project, original
-    implementation from Pygments.
-
-    :copyright: Copyright 2006-2009 by the Jinja team, see AUTHORS.
-    :license: BSD, see LICENSE for details.
-"""
-
-from jinja2._compat import unichr
-
-Cc = u'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f'
-
-Cf = u'\xad\u0600\u0601\u0602\u0603\u06dd\u070f\u17b4\u17b5\u200b\u200c\u200d\u200e\u200f\u202a\u202b\u202c\u202d\u202e\u2060\u2061\u2062\u2063\u206a\u206b\u206c\u206d\u206e\u206f\ufeff\ufff9\ufffa\ufffb'
-
-Cn = u'\u0242\u0243\u0244\u0245\u0246\u0247\u0248\u0249\u024a\u024b\u024c\u024d\u024e\u024f\u0370\u0371\u0372\u0373\u0376\u0377\u0378\u0379\u037b\u037c\u037d\u037f\u0380\u0381\u0382\u0383\u038b\u038d\u03a2\u03cf\u0487\u04cf\u04fa\u04fb\u04fc\u04fd\u04fe\u04ff\u0510\u0511\u0512\u0513\u0514\u0515\u0516\u0517\u0518\u0519\u051a\u051b\u051c\u051d\u051e\u051f\u0520\u0521\u0522\u0523\u0524\u0525\u0526\u0527\u0528\u0529\u052a\u052b\u052c\u052d\u052e\u052f\u0530\u0557\u0558\u0560\u0588\u058b\u058c\u058d\u058e\u058f\u0590\u05ba\u05c8\u05c9\u05ca\u05cb\u05cc\u05cd\u05ce\u05cf\u05eb\u05ec\u05ed\u05ee\u05ef\u05f5\u05f6\u05f7\u05f8\u05f9\u05fa\u05fb\u05fc\u05fd\u05fe\u05ff\u0604\u0605\u0606\u0607\u0608\u0609\u060a\u0616\u0617\u0618\u0619\u061a\u061c\u061d\u0620\u063b\u063c\u063d\u063e\u063f\u065f\u070e\u074b\u074c\u076e\u076f\u0770\u0771\u0772\u0773\u0774\u0775\u0776\u0777\u0778\u0779\u077a\u077b\u077c\u077d\u077e\u077f\u07b2\u07b3\u07b4\u07b5\u07b6\u07b7\u07b8\u07b9\u07ba\u07bb\u07bc\u07bd\u07be\u07bf\u07c0\u07c1\u07c2\u07c3\u07c4\u07c5\u07c6\u07c7\u07c8\u07c9\u07ca\u07cb\u07cc\u07cd\u07ce\u07cf\u07d0\u07d1\u07d2\u07d3\u07d4\u07d5\u07d6\u07d7\u07d8\u07d9\u07da\u07db\u07dc\u07dd\u07de\u07df\u07e0\u07e1\u07e2\u07e3\u07e4\u07e5\u07e6\u07e7\u07e8\u07e9\u07ea\u07eb\u07ec\u07ed\u07ee\u07ef\u07f0\u07f1\u07f2\u07f3\u07f4\u07f5\u07f6\u07f7\u07f8\u07f9\u07fa\u07fb\u07fc\u07fd\u07fe\u07ff\u0800\u0801\u0802\u0803\u0804\u0805\u0806\u0807\u0808\u0809\u080a\u080b\u080c\u080d\u080e\u080f\u0810\u0811\u0812\u0813\u0814\u0815\u0816\u0817\u0818\u0819\u081a\u081b\u081c\u081d\u081e\u081f\u0820\u0821\u0822\u0823\u0824\u0825\u0826\u0827\u0828\u0829\u082a\u082b\u082c\u082d\u082e\u082f\u0830\u0831\u0832\u0833\u0834\u0835\u0836\u0837\u0838\u0839\u083a\u083b\u083c\u083d\u083e\u083f\u0840\u0841\u0842\u0843\u0844\u0845\u0846\u0847\u0848\u0849\u084a\u084b\u084c\u084d\u084e\u084f\u0850\u0851\u0852\u0853\u0854\u0855\u0856\u0857\u0858\u0859\u085a\u085b\u085c\u085d\u085e\u085f\u0860\u0861\u0862\u0863\u0864\u0865\u0866\u0867\u0868\u0869\u086a\u086b\u086c\u086d\u086e\u086f\u0870\u0871\u0872\u0873\u0874\u0875\u0876\u0877\u0878\u0879\u087a\u087b\u087c\u087d\u087e\u087f\u0880\u0881\u0882\u0883\u0884\u0885\u0886\u0887\u0888\u0889\u088a\u088b\u088c\u088d\u088e\u088f\u0890\u0891\u0892\u0893\u0894\u0895\u0896\u0897\u0898\u0899\u089a\u089b\u089c\u089d\u089e\u089f\u08a0\u08a1\u08a2\u08a3\u08a4\u08a5\u08a6\u08a7\u08a8\u08a9\u08aa\u08ab\u08ac\u08ad\u08ae\u08af\u08b0\u08b1\u08b2\u08b3\u08b4\u08b5\u08b6\u08b7\u08b8\u08b9\u08ba\u08bb\u08bc\u08bd\u08be\u08bf\u08c0\u08c1\u08c2\u08c3\u08c4\u08c5\u08c6\u08c7\u08c8\u08c9\u08ca\u08cb\u08cc\u08cd\u08ce\u08cf\u08d0\u08d1\u08d2\u08d3\u08d4\u08d5\u08d6\u08d7\u08d8\u08d9\u08da\u08db\u08dc\u08dd\u08de\u08df\u08e0\u08e1\u08e2\u08e3\u08e4\u08e5\u08e6\u08e7\u08e8\u08e9\u08ea\u08eb\u08ec\u08ed\u08ee\u08ef\u08f0\u08f1\u08f2\u08f3\u08f4\u08f5\u08f6\u08f7\u08f8\u08f9\u08fa\u08fb\u08fc\u08fd\u08fe\u08ff\u0900\u093a\u093b\u094e\u094f\u0955\u0956\u0957\u0971\u0972\u0973\u0974\u0975\u0976\u0977\u0978\u0979\u097a\u097b\u097c\u097e\u097f\u0980\u0984\u098d\u098e\u0991\u0992\u09a9\u09b1\u09b3\u09b4\u09b5\u09ba\u09bb\u09c5\u09c6\u09c9\u09ca\u09cf\u09d0\u09d1\u09d2\u09d3\u09d4\u09d5\u09d6\u09d8\u09d9\u09da\u09db\u09de\u09e4\u09e5\u09fb\u09fc\u09fd\u09fe\u09ff\u0a00\u0a04\u0a0b\u0a0c\u0a0d\u0a0e\u0a11\u0a12\u0a29\u0a31\u0a34\u0a37\u0a3a\u0a3b\u0a3d\u0a43\u0a44\u0a45\u0a46\u0a49\u0a4a\u0a4e\u0a4f\u0a50\u0a51\u0a52\u0a53\u0a54\u0a55\u0a56\u0a57\u0a58\u0a5d\u0a5f\u0a60\u0a61\u0a62\u0a63\u0a64\u0a65\u0a75\u0a76\u0a77\u0a78\u0a79\u0a7a\u0a7b\u0a7c\u0a7d\u0a7e\u0a7f\u0a80\u0a84\u0a8e\u0a92\u0aa9\u0ab1\u0ab4\u0aba\u0abb\u0ac6\u0aca\u0ace\u0acf\u0ad1\u0ad2\u0ad3\u0ad4\u0ad5\u0ad6\u0ad7\u0ad8\u0ad9\u0ada\u0adb\u0adc\u0add\u0ade\u0adf\u0ae4\u0ae5\u0af0\u0af2\u0af3\u0af4\u0af5\u0af6\u0af7\u0af8\u0af9\u0afa\u0afb\u0afc\u0afd\u0afe\u0aff\u0b00\u0b04\u0b0d\u0b0e\u0b11\u0b12\u0b29\u0b31\u0b34\u0b3a\u0b3b\u0b44\u0b45\u0b46\u0b49\u0b4a\u0b4e\u0b4f\u0b50\u0b51\u0b52\u0b53\u0b54\u0b55\u0b58\u0b59\u0b5a\u0b5b\u0b5e\u0b62\u0b63\u0b64\u0b65\u0b72\u0b73\u0b74\u0b75\u0b76\u0b77\u0b78\u0b79\u0b7a\u0b7b\u0b7c\u0b7d\u0b7e\u0b7f\u0b80\u0b81\u0b84\u0b8b\u0b8c\u0b8d\u0b91\u0b96\u0b97\u0b98\u0b9b\u0b9d\u0ba0\u0ba1\u0ba2\u0ba5\u0ba6\u0ba7\u0bab\u0bac\u0bad\u0bba\u0bbb\u0bbc\u0bbd\u0bc3\u0bc4\u0bc5\u0bc9\u0bce\u0bcf\u0bd0\u0bd1\u0bd2\u0bd3\u0bd4\u0bd5\u0bd6\u0bd8\u0bd9\u0bda\u0bdb\u0bdc\u0bdd\u0bde\u0bdf\u0be0\u0be1\u0be2\u0be3\u0be4\u0be5\u0bfb\u0bfc\u0bfd\u0bfe\u0bff\u0c00\u0c04\u0c0d\u0c11\u0c29\u0c34\u0c3a\u0c3b\u0c3c\u0c3d\u0c45\u0c49\u0c4e\u0c4f\u0c50\u0c51\u0c52\u0c53\u0c54\u0c57\u0c58\u0c59\u0c5a\u0c5b\u0c5c\u0c5d\u0c5e\u0c5f\u0c62\u0c63\u0c64\u0c65\u0c70\u0c71\u0c72\u0c73\u0c74\u0c75\u0c76\u0c77\u0c78\u0c79\u0c7a\u0c7b\u0c7c\u0c7d\u0c7e\u0c7f\u0c80\u0c81\u0c84\u0c8d\u0c91\u0ca9\u0cb4\u0cba\u0cbb\u0cc5\u0cc9\u0cce\u0ccf\u0cd0\u0cd1\u0cd2\u0cd3\u0cd4\u0cd7\u0cd8\u0cd9\u0cda\u0cdb\u0cdc\u0cdd\u0cdf\u0ce2\u0ce3\u0ce4\u0ce5\u0cf0\u0cf1\u0cf2\u0cf3\u0cf4\u0cf5\u0cf6\u0cf7\u0cf8\u0cf9\u0cfa\u0cfb\u0cfc\u0cfd\u0cfe\u0cff\u0d00\u0d01\u0d04\u0d0d\u0d11\u0d29\u0d3a\u0d3b\u0d3c\u0d3d\u0d44\u0d45\u0d49\u0d4e\u0d4f\u0d50\u0d51\u0d52\u0d53\u0d54\u0d55\u0d56\u0d58\u0d59\u0d5a\u0d5b\u0d5c\u0d5d\u0d5e\u0d5f\u0d62\u0d63\u0d64\u0d65\u0d70\u0d71\u0d72\u0d73\u0d74\u0d75\u0d76\u0d77\u0d78\u0d79\u0d7a\u0d7b\u0d7c\u0d7d\u0d7e\u0d7f\u0d80\u0d81\u0d84\u0d97\u0d98\u0d99\u0db2\u0dbc\u0dbe\u0dbf\u0dc7\u0dc8\u0dc9\u0dcb\u0dcc\u0dcd\u0dce\u0dd5\u0dd7\u0de0\u0de1\u0de2\u0de3\u0de4\u0de5\u0de6\u0de7\u0de8\u0de9\u0dea\u0deb\u0dec\u0ded\u0dee\u0def\u0df0\u0df1\u0df5\u0df6\u0df7\u0df8\u0df9\u0dfa\u0dfb\u0dfc\u0dfd\u0dfe\u0dff\u0e00\u0e3b\u0e3c\u0e3d\u0e3e\u0e5c\u0e5d\u0e5e\u0e5f\u0e60\u0e61\u0e62\u0e63\u0e64\u0e65\u0e66\u0e67\u0e68\u0e69\u0e6a\u0e6b\u0e6c\u0e6d\u0e6e\u0e6f\u0e70\u0e71\u0e72\u0e73\u0e74\u0e75\u0e76\u0e77\u0e78\u0e79\u0e7a\u0e7b\u0e7c\u0e7d\u0e7e\u0e7f\u0e80\u0e83\u0e85\u0e86\u0e89\u0e8b\u0e8c\u0e8e\u0e8f\u0e90\u0e91\u0e92\u0e93\u0e98\u0ea0\u0ea4\u0ea6\u0ea8\u0ea9\u0eac\u0eba\u0ebe\u0ebf\u0ec5\u0ec7\u0ece\u0ecf\u0eda\u0edb\u0ede\u0edf\u0ee0\u0ee1\u0ee2\u0ee3\u0ee4\u0ee5\u0ee6\u0ee7\u0ee8\u0ee9\u0eea\u0eeb\u0eec\u0eed\u0eee\u0eef\u0ef0\u0ef1\u0ef2\u0ef3\u0ef4\u0ef5\u0ef6\u0ef7\u0ef8\u0ef9\u0efa\u0efb\u0efc\u0efd\u0efe\u0eff\u0f48\u0f6b\u0f6c\u0f6d\u0f6e\u0f6f\u0f70\u0f8c\u0f8d\u0f8e\u0f8f\u0f98\u0fbd\u0fcd\u0fce\u0fd2\u0fd3\u0fd4\u0fd5\u0fd6\u0fd7\u0fd8\u0fd9\u0fda\u0fdb\u0fdc\u0fdd\u0fde\u0fdf\u0fe0\u0fe1\u0fe2\u0fe3\u0fe4\u0fe5\u0fe6\u0fe7\u0fe8\u0fe9\u0fea\u0feb\u0fec\u0fed\u0fee\u0fef\u0ff0\u0ff1\u0ff2\u0ff3\u0ff4\u0ff5\u0ff6\u0ff7\u0ff8\u0ff9\u0ffa\u0ffb\u0ffc\u0ffd\u0ffe\u0fff\u1022\u1028\u102b\u1033\u1034\u1035\u103a\u103b\u103c\u103d\u103e\u103f\u105a\u105b\u105c\u105d\u105e\u105f\u1060\u1061\u1062\u1063\u1064\u1065\u1066\u1067\u1068\u1069\u106a\u106b\u106c\u106d\u106e\u106f\u1070\u1071\u1072\u1073\u1074\u1075\u1076\u1077\u1078\u1079\u107a\u107b\u107c\u107d\u107e\u107f\u1080\u1081\u1082\u1083\u1084\u1085\u1086\u1087\u1088\u1089\u108a\u108b\u108c\u108d\u108e\u108f\u1090\u1091\u1092\u1093\u1094\u1095\u1096\u1097\u1098\u1099\u109a\u109b\u109c\u109d\u109e\u109f\u10c6\u10c7\u10c8\u10c9\u10ca\u10cb\u10cc\u10cd\u10ce\u10cf\u10fd\u10fe\u10ff\u115a\u115b\u115c\u115d\u115e\u11a3\u11a4\u11a5\u11a6\u11a7\u11fa\u11fb\u11fc\u11fd\u11fe\u11ff\u1249\u124e\u124f\u1257\u1259\u125e\u125f\u1289\u128e\u128f\u12b1\u12b6\u12b7\u12bf\u12c1\u12c6\u12c7\u12d7\u1311\u1316\u1317\u135b\u135c\u135d\u135e\u137d\u137e\u137f\u139a\u139b\u139c\u139d\u139e\u139f\u13f5\u13f6\u13f7\u13f8\u13f9\u13fa\u13fb\u13fc\u13fd\u13fe\u13ff\u1400\u1677\u1678\u1679\u167a\u167b\u167c\u167d\u167e\u167f\u169d\u169e\u169f\u16f1\u16f2\u16f3\u16f4\u16f5\u16f6\u16f7\u16f8\u16f9\u16fa\u16fb\u16fc\u16fd\u16fe\u16ff\u170d\u1715\u1716\u1717\u1718\u1719\u171a\u171b\u171c\u171d\u171e\u171f\u1737\u1738\u1739\u173a\u173b\u173c\u173d\u173e\u173f\u1754\u1755\u1756\u1757\u1758\u1759\u175a\u175b\u175c\u175d\u175e\u175f\u176d\u1771\u1774\u1775\u1776\u1777\u1778\u1779\u177a\u177b\u177c\u177d\u177e\u177f\u17de\u17df\u17ea\u17eb\u17ec\u17ed\u17ee\u17ef\u17fa\u17fb\u17fc\u17fd\u17fe\u17ff\u180f\u181a\u181b\u181c\u181d\u181e\u181f\u1878\u1879\u187a\u187b\u187c\u187d\u187e\u187f\u18aa\u18ab\u18ac\u18ad\u18ae\u18af\u18b0\u18b1\u18b2\u18b3\u18b4\u18b5\u18b6\u18b7\u18b8\u18b9\u18ba\u18bb\u18bc\u18bd\u18be\u18bf\u18c0\u18c1\u18c2\u18c3\u18c4\u18c5\u18c6\u18c7\u18c8\u18c9\u18ca\u18cb\u18cc\u18cd\u18ce\u18cf\u18d0\u18d1\u18d2\u18d3\u18d4\u18d5\u18d6\u18d7\u18d8\u18d9\u18da\u18db\u18dc\u18dd\u18de\u18df\u18e0\u18e1\u18e2\u18e3\u18e4\u18e5\u18e6\u18e7\u18e8\u18e9\u18ea\u18eb\u18ec\u18ed\u18ee\u18ef\u18f0\u18f1\u18f2\u18f3\u18f4\u18f5\u18f6\u18f7\u18f8\u18f9\u18fa\u18fb\u18fc\u18fd\u18fe\u18ff\u191d\u191e\u191f\u192c\u192d\u192e\u192f\u193c\u193d\u193e\u193f\u1941\u1942\u1943\u196e\u196f\u1975\u1976\u1977\u1978\u1979\u197a\u197b\u197c\u197d\u197e\u197f\u19aa\u19ab\u19ac\u19ad\u19ae\u19af\u19ca\u19cb\u19cc\u19cd\u19ce\u19cf\u19da\u19db\u19dc\u19dd\u1a1c\u1a1d\u1a20\u1a21\u1a22\u1a23\u1a24\u1a25\u1a26\u1a27\u1a28\u1a29\u1a2a\u1a2b\u1a2c\u1a2d\u1a2e\u1a2f\u1a30\u1a31\u1a32\u1a33\u1a34\u1a35\u1a36\u1a37\u1a38\u1a39\u1a3a\u1a3b\u1a3c\u1a3d\u1a3e\u1a3f\u1a40\u1a41\u1a42\u1a43\u1a44\u1a45\u1a46\u1a47\u1a48\u1a49\u1a4a\u1a4b\u1a4c\u1a4d\u1a4e\u1a4f\u1a50\u1a51\u1a52\u1a53\u1a54\u1a55\u1a56\u1a57\u1a58\u1a59\u1a5a\u1a5b\u1a5c\u1a5d\u1a5e\u1a5f\u1a60\u1a61\u1a62\u1a63\u1a64\u1a65\u1a66\u1a67\u1a68\u1a69\u1a6a\u1a6b\u1a6c\u1a6d\u1a6e\u1a6f\u1a70\u1a71\u1a72\u1a73\u1a74\u1a75\u1a76\u1a77\u1a78\u1a79\u1a7a\u1a7b\u1a7c\u1a7d\u1a7e\u1a7f\u1a80\u1a81\u1a82\u1a83\u1a84\u1a85\u1a86\u1a87\u1a88\u1a89\u1a8a\u1a8b\u1a8c\u1a8d\u1a8e\u1a8f\u1a90\u1a91\u1a92\u1a93\u1a94\u1a95\u1a96\u1a97\u1a98\u1a99\u1a9a\u1a9b\u1a9c\u1a9d\u1a9e\u1a9f\u1aa0\u1aa1\u1aa2\u1aa3\u1aa4\u1aa5\u1aa6\u1aa7\u1aa8\u1aa9\u1aaa\u1aab\u1aac\u1aad\u1aae\u1aaf\u1ab0\u1ab1\u1ab2\u1ab3\u1ab4\u1ab5\u1ab6\u1ab7\u1ab8\u1ab9\u1aba\u1abb\u1abc\u1abd\u1abe\u1abf\u1ac0\u1ac1\u1ac2\u1ac3\u1ac4\u1ac5\u1ac6\u1ac7\u1ac8\u1ac9\u1aca\u1acb\u1acc\u1acd\u1ace\u1acf\u1ad0\u1ad1\u1ad2\u1ad3\u1ad4\u1ad5\u1ad6\u1ad7\u1ad8\u1ad9\u1ada\u1adb\u1adc\u1add\u1ade\u1adf\u1ae0\u1ae1\u1ae2\u1ae3\u1ae4\u1ae5\u1ae6\u1ae7\u1ae8\u1ae9\u1aea\u1aeb\u1aec\u1aed\u1aee\u1aef\u1af0\u1af1\u1af2\u1af3\u1af4\u1af5\u1af6\u1af7\u1af8\u1af9\u1afa\u1afb\u1afc\u1afd\u1afe\u1aff\u1b00\u1b01\u1b02\u1b03\u1b04\u1b05\u1b06\u1b07\u1b08\u1b09\u1b0a\u1b0b\u1b0c\u1b0d\u1b0e\u1b0f\u1b10\u1b11\u1b12\u1b13\u1b14\u1b15\u1b16\u1b17\u1b18\u1b19\u1b1a\u1b1b\u1b1c\u1b1d\u1b1e\u1b1f\u1b20\u1b21\u1b22\u1b23\u1b24\u1b25\u1b26\u1b27\u1b28\u1b29\u1b2a\u1b2b\u1b2c\u1b2d\u1b2e\u1b2f\u1b30\u1b31\u1b32\u1b33\u1b34\u1b35\u1b36\u1b37\u1b38\u1b39\u1b3a\u1b3b\u1b3c\u1b3d\u1b3e\u1b3f\u1b40\u1b41\u1b42\u1b43\u1b44\u1b45\u1b46\u1b47\u1b48\u1b49\u1b4a\u1b4b\u1b4c\u1b4d\u1b4e\u1b4f\u1b50\u1b51\u1b52\u1b53\u1b54\u1b55\u1b56\u1b57\u1b58\u1b59\u1b5a\u1b5b\u1b5c\u1b5d\u1b5e\u1b5f\u1b60\u1b61\u1b62\u1b63\u1b64\u1b65\u1b66\u1b67\u1b68\u1b69\u1b6a\u1b6b\u1b6c\u1b6d\u1b6e\u1b6f\u1b70\u1b71\u1b72\u1b73\u1b74\u1b75\u1b76\u1b77\u1b78\u1b79\u1b7a\u1b7b\u1b7c\u1b7d\u1b7e\u1b7f\u1b80\u1b81\u1b82\u1b83\u1b84\u1b85\u1b86\u1b87\u1b88\u1b89\u1b8a\u1b8b\u1b8c\u1b8d\u1b8e\u1b8f\u1b90\u1b91\u1b92\u1b93\u1b94\u1b95\u1b96\u1b97\u1b98\u1b99\u1b9a\u1b9b\u1b9c\u1b9d\u1b9e\u1b9f\u1ba0\u1ba1\u1ba2\u1ba3\u1ba4\u1ba5\u1ba6\u1ba7\u1ba8\u1ba9\u1baa\u1bab\u1bac\u1bad\u1bae\u1baf\u1bb0\u1bb1\u1bb2\u1bb3\u1bb4\u1bb5\u1bb6\u1bb7\u1bb8\u1bb9\u1bba\u1bbb\u1bbc\u1bbd\u1bbe\u1bbf\u1bc0\u1bc1\u1bc2\u1bc3\u1bc4\u1bc5\u1bc6\u1bc7\u1bc8\u1bc9\u1bca\u1bcb\u1bcc\u1bcd\u1bce\u1bcf\u1bd0\u1bd1\u1bd2\u1bd3\u1bd4\u1bd5\u1bd6\u1bd7\u1bd8\u1bd9\u1bda\u1bdb\u1bdc\u1bdd\u1bde\u1bdf\u1be0\u1be1\u1be2\u1be3\u1be4\u1be5\u1be6\u1be7\u1be8\u1be9\u1bea\u1beb\u1bec\u1bed\u1bee\u1bef\u1bf0\u1bf1\u1bf2\u1bf3\u1bf4\u1bf5\u1bf6\u1bf7\u1bf8\u1bf9\u1bfa\u1bfb\u1bfc\u1bfd\u1bfe\u1bff\u1c00\u1c01\u1c02\u1c03\u1c04\u1c05\u1c06\u1c07\u1c08\u1c09\u1c0a\u1c0b\u1c0c\u1c0d\u1c0e\u1c0f\u1c10\u1c11\u1c12\u1c13\u1c14\u1c15\u1c16\u1c17\u1c18\u1c19\u1c1a\u1c1b\u1c1c\u1c1d\u1c1e\u1c1f\u1c20\u1c21\u1c22\u1c23\u1c24\u1c25\u1c26\u1c27\u1c28\u1c29\u1c2a\u1c2b\u1c2c\u1c2d\u1c2e\u1c2f\u1c30\u1c31\u1c32\u1c33\u1c34\u1c35\u1c36\u1c37\u1c38\u1c39\u1c3a\u1c3b\u1c3c\u1c3d\u1c3e\u1c3f\u1c40\u1c41\u1c42\u1c43\u1c44\u1c45\u1c46\u1c47\u1c48\u1c49\u1c4a\u1c4b\u1c4c\u1c4d\u1c4e\u1c4f\u1c50\u1c51\u1c52\u1c53\u1c54\u1c55\u1c56\u1c57\u1c58\u1c59\u1c5a\u1c5b\u1c5c\u1c5d\u1c5e\u1c5f\u1c60\u1c61\u1c62\u1c63\u1c64\u1c65\u1c66\u1c67\u1c68\u1c69\u1c6a\u1c6b\u1c6c\u1c6d\u1c6e\u1c6f\u1c70\u1c71\u1c72\u1c73\u1c74\u1c75\u1c76\u1c77\u1c78\u1c79\u1c7a\u1c7b\u1c7c\u1c7d\u1c7e\u1c7f\u1c80\u1c81\u1c82\u1c83\u1c84\u1c85\u1c86\u1c87\u1c88\u1c89\u1c8a\u1c8b\u1c8c\u1c8d\u1c8e\u1c8f\u1c90\u1c91\u1c92\u1c93\u1c94\u1c95\u1c96\u1c97\u1c98\u1c99\u1c9a\u1c9b\u1c9c\u1c9d\u1c9e\u1c9f\u1ca0\u1ca1\u1ca2\u1ca3\u1ca4\u1ca5\u1ca6\u1ca7\u1ca8\u1ca9\u1caa\u1cab\u1cac\u1cad\u1cae\u1caf\u1cb0\u1cb1\u1cb2\u1cb3\u1cb4\u1cb5\u1cb6\u1cb7\u1cb8\u1cb9\u1cba\u1cbb\u1cbc\u1cbd\u1cbe\u1cbf\u1cc0\u1cc1\u1cc2\u1cc3\u1cc4\u1cc5\u1cc6\u1cc7\u1cc8\u1cc9\u1cca\u1ccb\u1ccc\u1ccd\u1cce\u1ccf\u1cd0\u1cd1\u1cd2\u1cd3\u1cd4\u1cd5\u1cd6\u1cd7\u1cd8\u1cd9\u1cda\u1cdb\u1cdc\u1cdd\u1cde\u1cdf\u1ce0\u1ce1\u1ce2\u1ce3\u1ce4\u1ce5\u1ce6\u1ce7\u1ce8\u1ce9\u1cea\u1ceb\u1cec\u1ced\u1cee\u1cef\u1cf0\u1cf1\u1cf2\u1cf3\u1cf4\u1cf5\u1cf6\u1cf7\u1cf8\u1cf9\u1cfa\u1cfb\u1cfc\u1cfd\u1cfe\u1cff\u1dc4\u1dc5\u1dc6\u1dc7\u1dc8\u1dc9\u1dca\u1dcb\u1dcc\u1dcd\u1dce\u1dcf\u1dd0\u1dd1\u1dd2\u1dd3\u1dd4\u1dd5\u1dd6\u1dd7\u1dd8\u1dd9\u1dda\u1ddb\u1ddc\u1ddd\u1dde\u1ddf\u1de0\u1de1\u1de2\u1de3\u1de4\u1de5\u1de6\u1de7\u1de8\u1de9\u1dea\u1deb\u1dec\u1ded\u1dee\u1def\u1df0\u1df1\u1df2\u1df3\u1df4\u1df5\u1df6\u1df7\u1df8\u1df9\u1dfa\u1dfb\u1dfc\u1dfd\u1dfe\u1dff\u1e9c\u1e9d\u1e9e\u1e9f\u1efa\u1efb\u1efc\u1efd\u1efe\u1eff\u1f16\u1f17\u1f1e\u1f1f\u1f46\u1f47\u1f4e\u1f4f\u1f58\u1f5a\u1f5c\u1f5e\u1f7e\u1f7f\u1fb5\u1fc5\u1fd4\u1fd5\u1fdc\u1ff0\u1ff1\u1ff5\u1fff\u2064\u2065\u2066\u2067\u2068\u2069\u2072\u2073\u208f\u2095\u2096\u2097\u2098\u2099\u209a\u209b\u209c\u209d\u209e\u209f\u20b6\u20b7\u20b8\u20b9\u20ba\u20bb\u20bc\u20bd\u20be\u20bf\u20c0\u20c1\u20c2\u20c3\u20c4\u20c5\u20c6\u20c7\u20c8\u20c9\u20ca\u20cb\u20cc\u20cd\u20ce\u20cf\u20ec\u20ed\u20ee\u20ef\u20f0\u20f1\u20f2\u20f3\u20f4\u20f5\u20f6\u20f7\u20f8\u20f9\u20fa\u20fb\u20fc\u20fd\u20fe\u20ff\u214d\u214e\u214f\u2150\u2151\u2152\u2184\u2185\u2186\u2187\u2188\u2189\u218a\u218b\u218c\u218d\u218e\u218f\u23dc\u23dd\u23de\u23df\u23e0\u23e1\u23e2\u23e3\u23e4\u23e5\u23e6\u23e7\u23e8\u23e9\u23ea\u23eb\u23ec\u23ed\u23ee\u23ef\u23f0\u23f1\u23f2\u23f3\u23f4\u23f5\u23f6\u23f7\u23f8\u23f9\u23fa\u23fb\u23fc\u23fd\u23fe\u23ff\u2427\u2428\u2429\u242a\u242b\u242c\u242d\u242e\u242f\u2430\u2431\u2432\u2433\u2434\u2435\u2436\u2437\u2438\u2439\u243a\u243b\u243c\u243d\u243e\u243f\u244b\u244c\u244d\u244e\u244f\u2450\u2451\u2452\u2453\u2454\u2455\u2456\u2457\u2458\u2459\u245a\u245b\u245c\u245d\u245e\u245f\u269d\u269e\u269f\u26b2\u26b3\u26b4\u26b5\u26b6\u26b7\u26b8\u26b9\u26ba\u26bb\u26bc\u26bd\u26be\u26bf\u26c0\u26c1\u26c2\u26c3\u26c4\u26c5\u26c6\u26c7\u26c8\u26c9\u26ca\u26cb\u26cc\u26cd\u26ce\u26cf\u26d0\u26d1\u26d2\u26d3\u26d4\u26d5\u26d6\u26d7\u26d8\u26d9\u26da\u26db\u26dc\u26dd\u26de\u26df\u26e0\u26e1\u26e2\u26e3\u26e4\u26e5\u26e6\u26e7\u26e8\u26e9\u26ea\u26eb\u26ec\u26ed\u26ee\u26ef\u26f0\u26f1\u26f2\u26f3\u26f4\u26f5\u26f6\u26f7\u26f8\u26f9\u26fa\u26fb\u26fc\u26fd\u26fe\u26ff\u2700\u2705\u270a\u270b\u2728\u274c\u274e\u2753\u2754\u2755\u2757\u275f\u2760\u2795\u2796\u2797\u27b0\u27bf\u27c7\u27c8\u27c9\u27ca\u27cb\u27cc\u27cd\u27ce\u27cf\u27ec\u27ed\u27ee\u27ef\u2b14\u2b15\u2b16\u2b17\u2b18\u2b19\u2b1a\u2b1b\u2b1c\u2b1d\u2b1e\u2b1f\u2b20\u2b21\u2b22\u2b23\u2b24\u2b25\u2b26\u2b27\u2b28\u2b29\u2b2a\u2b2b\u2b2c\u2b2d\u2b2e\u2b2f\u2b30\u2b31\u2b32\u2b33\u2b34\u2b35\u2b36\u2b37\u2b38\u2b39\u2b3a\u2b3b\u2b3c\u2b3d\u2b3e\u2b3f\u2b40\u2b41\u2b42\u2b43\u2b44\u2b45\u2b46\u2b47\u2b48\u2b49\u2b4a\u2b4b\u2b4c\u2b4d\u2b4e\u2b4f\u2b50\u2b51\u2b52\u2b53\u2b54\u2b55\u2b56\u2b57\u2b58\u2b59\u2b5a\u2b5b\u2b5c\u2b5d\u2b5e\u2b5f\u2b60\u2b61\u2b62\u2b63\u2b64\u2b65\u2b66\u2b67\u2b68\u2b69\u2b6a\u2b6b\u2b6c\u2b6d\u2b6e\u2b6f\u2b70\u2b71\u2b72\u2b73\u2b74\u2b75\u2b76\u2b77\u2b78\u2b79\u2b7a\u2b7b\u2b7c\u2b7d\u2b7e\u2b7f\u2b80\u2b81\u2b82\u2b83\u2b84\u2b85\u2b86\u2b87\u2b88\u2b89\u2b8a\u2b8b\u2b8c\u2b8d\u2b8e\u2b8f\u2b90\u2b91\u2b92\u2b93\u2b94\u2b95\u2b96\u2b97\u2b98\u2b99\u2b9a\u2b9b\u2b9c\u2b9d\u2b9e\u2b9f\u2ba0\u2ba1\u2ba2\u2ba3\u2ba4\u2ba5\u2ba6\u2ba7\u2ba8\u2ba9\u2baa\u2bab\u2bac\u2bad\u2bae\u2baf\u2bb0\u2bb1\u2bb2\u2bb3\u2bb4\u2bb5\u2bb6\u2bb7\u2bb8\u2bb9\u2bba\u2bbb\u2bbc\u2bbd\u2bbe\u2bbf\u2bc0\u2bc1\u2bc2\u2bc3\u2bc4\u2bc5\u2bc6\u2bc7\u2bc8\u2bc9\u2bca\u2bcb\u2bcc\u2bcd\u2bce\u2bcf\u2bd0\u2bd1\u2bd2\u2bd3\u2bd4\u2bd5\u2bd6\u2bd7\u2bd8\u2bd9\u2bda\u2bdb\u2bdc\u2bdd\u2bde\u2bdf\u2be0\u2be1\u2be2\u2be3\u2be4\u2be5\u2be6\u2be7\u2be8\u2be9\u2bea\u2beb\u2bec\u2bed\u2bee\u2bef\u2bf0\u2bf1\u2bf2\u2bf3\u2bf4\u2bf5\u2bf6\u2bf7\u2bf8\u2bf9\u2bfa\u2bfb\u2bfc\u2bfd\u2bfe\u2bff\u2c2f\u2c5f\u2c60\u2c61\u2c62\u2c63\u2c64\u2c65\u2c66\u2c67\u2c68\u2c69\u2c6a\u2c6b\u2c6c\u2c6d\u2c6e\u2c6f\u2c70\u2c71\u2c72\u2c73\u2c74\u2c75\u2c76\u2c77\u2c78\u2c79\u2c7a\u2c7b\u2c7c\u2c7d\u2c7e\u2c7f\u2ceb\u2cec\u2ced\u2cee\u2cef\u2cf0\u2cf1\u2cf2\u2cf3\u2cf4\u2cf5\u2cf6\u2cf7\u2cf8\u2d26\u2d27\u2d28\u2d29\u2d2a\u2d2b\u2d2c\u2d2d\u2d2e\u2d2f\u2d66\u2d67\u2d68\u2d69\u2d6a\u2d6b\u2d6c\u2d6d\u2d6e\u2d70\u2d71\u2d72\u2d73\u2d74\u2d75\u2d76\u2d77\u2d78\u2d79\u2d7a\u2d7b\u2d7c\u2d7d\u2d7e\u2d7f\u2d97\u2d98\u2d99\u2d9a\u2d9b\u2d9c\u2d9d\u2d9e\u2d9f\u2da7\u2daf\u2db7\u2dbf\u2dc7\u2dcf\u2dd7\u2ddf\u2de0\u2de1\u2de2\u2de3\u2de4\u2de5\u2de6\u2de7\u2de8\u2de9\u2dea\u2deb\u2dec\u2ded\u2dee\u2def\u2df0\u2df1\u2df2\u2df3\u2df4\u2df5\u2df6\u2df7\u2df8\u2df9\u2dfa\u2dfb\u2dfc\u2dfd\u2dfe\u2dff\u2e18\u2e19\u2e1a\u2e1b\u2e1e\u2e1f\u2e20\u2e21\u2e22\u2e23\u2e24\u2e25\u2e26\u2e27\u2e28\u2e29\u2e2a\u2e2b\u2e2c\u2e2d\u2e2e\u2e2f\u2e30\u2e31\u2e32\u2e33\u2e34\u2e35\u2e36\u2e37\u2e38\u2e39\u2e3a\u2e3b\u2e3c\u2e3d\u2e3e\u2e3f\u2e40\u2e41\u2e42\u2e43\u2e44\u2e45\u2e46\u2e47\u2e48\u2e49\u2e4a\u2e4b\u2e4c\u2e4d\u2e4e\u2e4f\u2e50\u2e51\u2e52\u2e53\u2e54\u2e55\u2e56\u2e57\u2e58\u2e59\u2e5a\u2e5b\u2e5c\u2e5d\u2e5e\u2e5f\u2e60\u2e61\u2e62\u2e63\u2e64\u2e65\u2e66\u2e67\u2e68\u2e69\u2e6a\u2e6b\u2e6c\u2e6d\u2e6e\u2e6f\u2e70\u2e71\u2e72\u2e73\u2e74\u2e75\u2e76\u2e77\u2e78\u2e79\u2e7a\u2e7b\u2e7c\u2e7d\u2e7e\u2e7f\u2e9a\u2ef4\u2ef5\u2ef6\u2ef7\u2ef8\u2ef9\u2efa\u2efb\u2efc\u2efd\u2efe\u2eff\u2fd6\u2fd7\u2fd8\u2fd9\u2fda\u2fdb\u2fdc\u2fdd\u2fde\u2fdf\u2fe0\u2fe1\u2fe2\u2fe3\u2fe4\u2fe5\u2fe6\u2fe7\u2fe8\u2fe9\u2fea\u2feb\u2fec\u2fed\u2fee\u2fef\u2ffc\u2ffd\u2ffe\u2fff\u3040\u3097\u3098\u3100\u3101\u3102\u3103\u3104\u312d\u312e\u312f\u3130\u318f\u31b8\u31b9\u31ba\u31bb\u31bc\u31bd\u31be\u31bf\u31d0\u31d1\u31d2\u31d3\u31d4\u31d5\u31d6\u31d7\u31d8\u31d9\u31da\u31db\u31dc\u31dd\u31de\u31df\u31e0\u31e1\u31e2\u31e3\u31e4\u31e5\u31e6\u31e7\u31e8\u31e9\u31ea\u31eb\u31ec\u31ed\u31ee\u31ef\u321f\u3244\u3245\u3246\u3247\u3248\u3249\u324a\u324b\u324c\u324d\u324e\u324f\u32ff\u4db6\u4db7\u4db8\u4db9\u4dba\u4dbb\u4dbc\u4dbd\u4dbe\u4dbf\u9fbc\u9fbd\u9fbe\u9fbf\u9fc0\u9fc1\u9fc2\u9fc3\u9fc4\u9fc5\u9fc6\u9fc7\u9fc8\u9fc9\u9fca\u9fcb\u9fcc\u9fcd\u9fce\u9fcf\u9fd0\u9fd1\u9fd2\u9fd3\u9fd4\u9fd5\u9fd6\u9fd7\u9fd8\u9fd9\u9fda\u9fdb\u9fdc\u9fdd\u9fde\u9fdf\u9fe0\u9fe1\u9fe2\u9fe3\u9fe4\u9fe5\u9fe6\u9fe7\u9fe8\u9fe9\u9fea\u9feb\u9fec\u9fed\u9fee\u9fef\u9ff0\u9ff1\u9ff2\u9ff3\u9ff4\u9ff5\u9ff6\u9ff7\u9ff8\u9ff9\u9ffa\u9ffb\u9ffc\u9ffd\u9ffe\u9fff\ua48d\ua48e\ua48f\ua4c7\ua4c8\ua4c9\ua4ca\ua4cb\ua4cc\ua4cd\ua4ce\ua4cf\ua4d0\ua4d1\ua4d2\ua4d3\ua4d4\ua4d5\ua4d6\ua4d7\ua4d8\ua4d9\ua4da\ua4db\ua4dc\ua4dd\ua4de\ua4df\ua4e0\ua4e1\ua4e2\ua4e3\ua4e4\ua4e5\ua4e6\ua4e7\ua4e8\ua4e9\ua4ea\ua4eb\ua4ec\ua4ed\ua4ee\ua4ef\ua4f0\ua4f1\ua4f2\ua4f3\ua4f4\ua4f5\ua4f6\ua4f7\ua4f8\ua4f9\ua4fa\ua4fb\ua4fc\ua4fd\ua4fe\ua4ff\ua500\ua501\ua502\ua503\ua504\ua505\ua506\ua507\ua508\ua509\ua50a\ua50b\ua50c\ua50d\ua50e\ua50f\ua510\ua511\ua512\ua513\ua514\ua515\ua516\ua517\ua518\ua519\ua51a\ua51b\ua51c\ua51d\ua51e\ua51f\ua520\ua521\ua522\ua523\ua524\ua525\ua526\ua527\ua528\ua529\ua52a\ua52b\ua52c\ua52d\ua52e\ua52f\ua530\ua531\ua532\ua533\ua534\ua535\ua536\ua537\ua538\ua539\ua53a\ua53b\ua53c\ua53d\ua53e\ua53f\ua540\ua541\ua542\ua543\ua544\ua545\ua546\ua547\ua548\ua549\ua54a\ua54b\ua54c\ua54d\ua54e\ua54f\ua550\ua551\ua552\ua553\ua554\ua555\ua556\ua557\ua558\ua559\ua55a\ua55b\ua55c\ua55d\ua55e\ua55f\ua560\ua561\ua562\ua563\ua564\ua565\ua566\ua567\ua568\ua569\ua56a\ua56b\ua56c\ua56d\ua56e\ua56f\ua570\ua571\ua572\ua573\ua574\ua575\ua576\ua577\ua578\ua579\ua57a\ua57b\ua57c\ua57d\ua57e\ua57f\ua580\ua581\ua582\ua583\ua584\ua585\ua586\ua587\ua588\ua589\ua58a\ua58b\ua58c\ua58d\ua58e\ua58f\ua590\ua591\ua592\ua593\ua594\ua595\ua596\ua597\ua598\ua599\ua59a\ua59b\ua59c\ua59d\ua59e\ua59f\ua5a0\ua5a1\ua5a2\ua5a3\ua5a4\ua5a5\ua5a6\ua5a7\ua5a8\ua5a9\ua5aa\ua5ab\ua5ac\ua5ad\ua5ae\ua5af\ua5b0\ua5b1\ua5b2\ua5b3\ua5b4\ua5b5\ua5b6\ua5b7\ua5b8\ua5b9\ua5ba\ua5bb\ua5bc\ua5bd\ua5be\ua5bf\ua5c0\ua5c1\ua5c2\ua5c3\ua5c4\ua5c5\ua5c6\ua5c7\ua5c8\ua5c9\ua5ca\ua5cb\ua5cc\ua5cd\ua5ce\ua5cf\ua5d0\ua5d1\ua5d2\ua5d3\ua5d4\ua5d5\ua5d6\ua5d7\ua5d8\ua5d9\ua5da\ua5db\ua5dc\ua5dd\ua5de\ua5df\ua5e0\ua5e1\ua5e2\ua5e3\ua5e4\ua5e5\ua5e6\ua5e7\ua5e8\ua5e9\ua5ea\ua5eb\ua5ec\ua5ed\ua5ee\ua5ef\ua5f0\ua5f1\ua5f2\ua5f3\ua5f4\ua5f5\ua5f6\ua5f7\ua5f8\ua5f9\ua5fa\ua5fb\ua5fc\ua5fd\ua5fe\ua5ff\ua600\ua601\ua602\ua603\ua604\ua605\ua606\ua607\ua608\ua609\ua60a\ua60b\ua60c\ua60d\ua60e\ua60f\ua610\ua611\ua612\ua613\ua614\ua615\ua616\ua617\ua618\ua619\ua61a\ua61b\ua61c\ua61d\ua61e\ua61f\ua620\ua621\ua622\ua623\ua624\ua625\ua626\ua627\ua628\ua629\ua62a\ua62b\ua62c\ua62d\ua62e\ua62f\ua630\ua631\ua632\ua633\ua634\ua635\ua636\ua637\ua638\ua639\ua63a\ua63b\ua63c\ua63d\ua63e\ua63f\ua640\ua641\ua642\ua643\ua644\ua645\ua646\ua647\ua648\ua649\ua64a\ua64b\ua64c\ua64d\ua64e\ua64f\ua650\ua651\ua652\ua653\ua654\ua655\ua656\ua657\ua658\ua659\ua65a\ua65b\ua65c\ua65d\ua65e\ua65f\ua660\ua661\ua662\ua663\ua664\ua665\ua666\ua667\ua668\ua669\ua66a\ua66b\ua66c\ua66d\ua66e\ua66f\ua670\ua671\ua672\ua673\ua674\ua675\ua676\ua677\ua678\ua679\ua67a\ua67b\ua67c\ua67d\ua67e\ua67f\ua680\ua681\ua682\ua683\ua684\ua685\ua686\ua687\ua688\ua689\ua68a\ua68b\ua68c\ua68d\ua68e\ua68f\ua690\ua691\ua692\ua693\ua694\ua695\ua696\ua697\ua698\ua699\ua69a\ua69b\ua69c\ua69d\ua69e\ua69f\ua6a0\ua6a1\ua6a2\ua6a3\ua6a4\ua6a5\ua6a6\ua6a7\ua6a8\ua6a9\ua6aa\ua6ab\ua6ac\ua6ad\ua6ae\ua6af\ua6b0\ua6b1\ua6b2\ua6b3\ua6b4\ua6b5\ua6b6\ua6b7\ua6b8\ua6b9\ua6ba\ua6bb\ua6bc\ua6bd\ua6be\ua6bf\ua6c0\ua6c1\ua6c2\ua6c3\ua6c4\ua6c5\ua6c6\ua6c7\ua6c8\ua6c9\ua6ca\ua6cb\ua6cc\ua6cd\ua6ce\ua6cf\ua6d0\ua6d1\ua6d2\ua6d3\ua6d4\ua6d5\ua6d6\ua6d7\ua6d8\ua6d9\ua6da\ua6db\ua6dc\ua6dd\ua6de\ua6df\ua6e0\ua6e1\ua6e2\ua6e3\ua6e4\ua6e5\ua6e6\ua6e7\ua6e8\ua6e9\ua6ea\ua6eb\ua6ec\ua6ed\ua6ee\ua6ef\ua6f0\ua6f1\ua6f2\ua6f3\ua6f4\ua6f5\ua6f6\ua6f7\ua6f8\ua6f9\ua6fa\ua6fb\ua6fc\ua6fd\ua6fe\ua6ff\ua717\ua718\ua719\ua71a\ua71b\ua71c\ua71d\ua71e\ua71f\ua720\ua721\ua722\ua723\ua724\ua725\ua726\ua727\ua728\ua729\ua72a\ua72b\ua72c\ua72d\ua72e\ua72f\ua730\ua731\ua732\ua733\ua734\ua735\ua736\ua737\ua738\ua739\ua73a\ua73b\ua73c\ua73d\ua73e\ua73f\ua740\ua741\ua742\ua743\ua744\ua745\ua746\ua747\ua748\ua749\ua74a\ua74b\ua74c\ua74d\ua74e\ua74f\ua750\ua751\ua752\ua753\ua754\ua755\ua756\ua757\ua758\ua759\ua75a\ua75b\ua75c\ua75d\ua75e\ua75f\ua760\ua761\ua762\ua763\ua764\ua765\ua766\ua767\ua768\ua769\ua76a\ua76b\ua76c\ua76d\ua76e\ua76f\ua770\ua771\ua772\ua773\ua774\ua775\ua776\ua777\ua778\ua779\ua77a\ua77b\ua77c\ua77d\ua77e\ua77f\ua780\ua781\ua782\ua783\ua784\ua785\ua786\ua787\ua788\ua789\ua78a\ua78b\ua78c\ua78d\ua78e\ua78f\ua790\ua791\ua792\ua793\ua794\ua795\ua796\ua797\ua798\ua799\ua79a\ua79b\ua79c\ua79d\ua79e\ua79f\ua7a0\ua7a1\ua7a2\ua7a3\ua7a4\ua7a5\ua7a6\ua7a7\ua7a8\ua7a9\ua7aa\ua7ab\ua7ac\ua7ad\ua7ae\ua7af\ua7b0\ua7b1\ua7b2\ua7b3\ua7b4\ua7b5\ua7b6\ua7b7\ua7b8\ua7b9\ua7ba\ua7bb\ua7bc\ua7bd\ua7be\ua7bf\ua7c0\ua7c1\ua7c2\ua7c3\ua7c4\ua7c5\ua7c6\ua7c7\ua7c8\ua7c9\ua7ca\ua7cb\ua7cc\ua7cd\ua7ce\ua7cf\ua7d0\ua7d1\ua7d2\ua7d3\ua7d4\ua7d5\ua7d6\ua7d7\ua7d8\ua7d9\ua7da\ua7db\ua7dc\ua7dd\ua7de\ua7df\ua7e0\ua7e1\ua7e2\ua7e3\ua7e4\ua7e5\ua7e6\ua7e7\ua7e8\ua7e9\ua7ea\ua7eb\ua7ec\ua7ed\ua7ee\ua7ef\ua7f0\ua7f1\ua7f2\ua7f3\ua7f4\ua7f5\ua7f6\ua7f7\ua7f8\ua7f9\ua7fa\ua7fb\ua7fc\ua7fd\ua7fe\ua7ff\ua82c\ua82d\ua82e\ua82f\ua830\ua831\ua832\ua833\ua834\ua835\ua836\ua837\ua838\ua839\ua83a\ua83b\ua83c\ua83d\ua83e\ua83f\ua840\ua841\ua842\ua843\ua844\ua845\ua846\ua847\ua848\ua849\ua84a\ua84b\ua84c\ua84d\ua84e\ua84f\ua850\ua851\ua852\ua853\ua854\ua855\ua856\ua857\ua858\ua859\ua85a\ua85b\ua85c\ua85d\ua85e\ua85f\ua860\ua861\ua862\ua863\ua864\ua865\ua866\ua867\ua868\ua869\ua86a\ua86b\ua86c\ua86d\ua86e\ua86f\ua870\ua871\ua872\ua873\ua874\ua875\ua876\ua877\ua878\ua879\ua87a\ua87b\ua87c\ua87d\ua87e\ua87f\ua880\ua881\ua882\ua883\ua884\ua885\ua886\ua887\ua888\ua889\ua88a\ua88b\ua88c\ua88d\ua88e\ua88f\ua890\ua891\ua892\ua893\ua894\ua895\ua896\ua897\ua898\ua899\ua89a\ua89b\ua89c\ua89d\ua89e\ua89f\ua8a0\ua8a1\ua8a2\ua8a3\ua8a4\ua8a5\ua8a6\ua8a7\ua8a8\ua8a9\ua8aa\ua8ab\ua8ac\ua8ad\ua8ae\ua8af\ua8b0\ua8b1\ua8b2\ua8b3\ua8b4\ua8b5\ua8b6\ua8b7\ua8b8\ua8b9\ua8ba\ua8bb\ua8bc\ua8bd\ua8be\ua8bf\ua8c0\ua8c1\ua8c2\ua8c3\ua8c4\ua8c5\ua8c6\ua8c7\ua8c8\ua8c9\ua8ca\ua8cb\ua8cc\ua8cd\ua8ce\ua8cf\ua8d0\ua8d1\ua8d2\ua8d3\ua8d4\ua8d5\ua8d6\ua8d7\ua8d8\ua8d9\ua8da\ua8db\ua8dc\ua8dd\ua8de\ua8df\ua8e0\ua8e1\ua8e2\ua8e3\ua8e4\ua8e5\ua8e6\ua8e7\ua8e8\ua8e9\ua8ea\ua8eb\ua8ec\ua8ed\ua8ee\ua8ef\ua8f0\ua8f1\ua8f2\ua8f3\ua8f4\ua8f5\ua8f6\ua8f7\ua8f8\ua8f9\ua8fa\ua8fb\ua8fc\ua8fd\ua8fe\ua8ff\ua900\ua901\ua902\ua903\ua904\ua905\ua906\ua907\ua908\ua909\ua90a\ua90b\ua90c\ua90d\ua90e\ua90f\ua910\ua911\ua912\ua913\ua914\ua915\ua916\ua917\ua918\ua919\ua91a\ua91b\ua91c\ua91d\ua91e\ua91f\ua920\ua921\ua922\ua923\ua924\ua925\ua926\ua927\ua928\ua929\ua92a\ua92b\ua92c\ua92d\ua92e\ua92f\ua930\ua931\ua932\ua933\ua934\ua935\ua936\ua937\ua938\ua939\ua93a\ua93b\ua93c\ua93d\ua93e\ua93f\ua940\ua941\ua942\ua943\ua944\ua945\ua946\ua947\ua948\ua949\ua94a\ua94b\ua94c\ua94d\ua94e\ua94f\ua950\ua951\ua952\ua953\ua954\ua955\ua956\ua957\ua958\ua959\ua95a\ua95b\ua95c\ua95d\ua95e\ua95f\ua960\ua961\ua962\ua963\ua964\ua965\ua966\ua967\ua968\ua969\ua96a\ua96b\ua96c\ua96d\ua96e\ua96f\ua970\ua971\ua972\ua973\ua974\ua975\ua976\ua977\ua978\ua979\ua97a\ua97b\ua97c\ua97d\ua97e\ua97f\ua980\ua981\ua982\ua983\ua984\ua985\ua986\ua987\ua988\ua989\ua98a\ua98b\ua98c\ua98d\ua98e\ua98f\ua990\ua991\ua992\ua993\ua994\ua995\ua996\ua997\ua998\ua999\ua99a\ua99b\ua99c\ua99d\ua99e\ua99f\ua9a0\ua9a1\ua9a2\ua9a3\ua9a4\ua9a5\ua9a6\ua9a7\ua9a8\ua9a9\ua9aa\ua9ab\ua9ac\ua9ad\ua9ae\ua9af\ua9b0\ua9b1\ua9b2\ua9b3\ua9b4\ua9b5\ua9b6\ua9b7\ua9b8\ua9b9\ua9ba\ua9bb\ua9bc\ua9bd\ua9be\ua9bf\ua9c0\ua9c1\ua9c2\ua9c3\ua9c4\ua9c5\ua9c6\ua9c7\ua9c8\ua9c9\ua9ca\ua9cb\ua9cc\ua9cd\ua9ce\ua9cf\ua9d0\ua9d1\ua9d2\ua9d3\ua9d4\ua9d5\ua9d6\ua9d7\ua9d8\ua9d9\ua9da\ua9db\ua9dc\ua9dd\ua9de\ua9df\ua9e0\ua9e1\ua9e2\ua9e3\ua9e4\ua9e5\ua9e6\ua9e7\ua9e8\ua9e9\ua9ea\ua9eb\ua9ec\ua9ed\ua9ee\ua9ef\ua9f0\ua9f1\ua9f2\ua9f3\ua9f4\ua9f5\ua9f6\ua9f7\ua9f8\ua9f9\ua9fa\ua9fb\ua9fc\ua9fd\ua9fe\ua9ff\uaa00\uaa01\uaa02\uaa03\uaa04\uaa05\uaa06\uaa07\uaa08\uaa09\uaa0a\uaa0b\uaa0c\uaa0d\uaa0e\uaa0f\uaa10\uaa11\uaa12\uaa13\uaa14\uaa15\uaa16\uaa17\uaa18\uaa19\uaa1a\uaa1b\uaa1c\uaa1d\uaa1e\uaa1f\uaa20\uaa21\uaa22\uaa23\uaa24\uaa25\uaa26\uaa27\uaa28\uaa29\uaa2a\uaa2b\uaa2c\uaa2d\uaa2e\uaa2f\uaa30\uaa31\uaa32\uaa33\uaa34\uaa35\uaa36\uaa37\uaa38\uaa39\uaa3a\uaa3b\uaa3c\uaa3d\uaa3e\uaa3f\uaa40\uaa41\uaa42\uaa43\uaa44\uaa45\uaa46\uaa47\uaa48\uaa49\uaa4a\uaa4b\uaa4c\uaa4d\uaa4e\uaa4f\uaa50\uaa51\uaa52\uaa53\uaa54\uaa55\uaa56\uaa57\uaa58\uaa59\uaa5a\uaa5b\uaa5c\uaa5d\uaa5e\uaa5f\uaa60\uaa61\uaa62\uaa63\uaa64\uaa65\uaa66\uaa67\uaa68\uaa69\uaa6a\uaa6b\uaa6c\uaa6d\uaa6e\uaa6f\uaa70\uaa71\uaa72\uaa73\uaa74\uaa75\uaa76\uaa77\uaa78\uaa79\uaa7a\uaa7b\uaa7c\uaa7d\uaa7e\uaa7f\uaa80\uaa81\uaa82\uaa83\uaa84\uaa85\uaa86\uaa87\uaa88\uaa89\uaa8a\uaa8b\uaa8c\uaa8d\uaa8e\uaa8f\uaa90\uaa91\uaa92\uaa93\uaa94\uaa95\uaa96\uaa97\uaa98\uaa99\uaa9a\uaa9b\uaa9c\uaa9d\uaa9e\uaa9f\uaaa0\uaaa1\uaaa2\uaaa3\uaaa4\uaaa5\uaaa6\uaaa7\uaaa8\uaaa9\uaaaa\uaaab\uaaac\uaaad\uaaae\uaaaf\uaab0\uaab1\uaab2\uaab3\uaab4\uaab5\uaab6\uaab7\uaab8\uaab9\uaaba\uaabb\uaabc\uaabd\uaabe\uaabf\uaac0\uaac1\uaac2\uaac3\uaac4\uaac5\uaac6\uaac7\uaac8\uaac9\uaaca\uaacb\uaacc\uaacd\uaace\uaacf\uaad0\uaad1\uaad2\uaad3\uaad4\uaad5\uaad6\uaad7\uaad8\uaad9\uaada\uaadb\uaadc\uaadd\uaade\uaadf\uaae0\uaae1\uaae2\uaae3\uaae4\uaae5\uaae6\uaae7\uaae8\uaae9\uaaea\uaaeb\uaaec\uaaed\uaaee\uaaef\uaaf0\uaaf1\uaaf2\uaaf3\uaaf4\uaaf5\uaaf6\uaaf7\uaaf8\uaaf9\uaafa\uaafb\uaafc\uaafd\uaafe\uaaff\uab00\uab01\uab02\uab03\uab04\uab05\uab06\uab07\uab08\uab09\uab0a\uab0b\uab0c\uab0d\uab0e\uab0f\uab10\uab11\uab12\uab13\uab14\uab15\uab16\uab17\uab18\uab19\uab1a\uab1b\uab1c\uab1d\uab1e\uab1f\uab20\uab21\uab22\uab23\uab24\uab25\uab26\uab27\uab28\uab29\uab2a\uab2b\uab2c\uab2d\uab2e\uab2f\uab30\uab31\uab32\uab33\uab34\uab35\uab36\uab37\uab38\uab39\uab3a\uab3b\uab3c\uab3d\uab3e\uab3f\uab40\uab41\uab42\uab43\uab44\uab45\uab46\uab47\uab48\uab49\uab4a\uab4b\uab4c\uab4d\uab4e\uab4f\uab50\uab51\uab52\uab53\uab54\uab55\uab56\uab57\uab58\uab59\uab5a\uab5b\uab5c\uab5d\uab5e\uab5f\uab60\uab61\uab62\uab63\uab64\uab65\uab66\uab67\uab68\uab69\uab6a\uab6b\uab6c\uab6d\uab6e\uab6f\uab70\uab71\uab72\uab73\uab74\uab75\uab76\uab77\uab78\uab79\uab7a\uab7b\uab7c\uab7d\uab7e\uab7f\uab80\uab81\uab82\uab83\uab84\uab85\uab86\uab87\uab88\uab89\uab8a\uab8b\uab8c\uab8d\uab8e\uab8f\uab90\uab91\uab92\uab93\uab94\uab95\uab96\uab97\uab98\uab99\uab9a\uab9b\uab9c\uab9d\uab9e\uab9f\uaba0\uaba1\uaba2\uaba3\uaba4\uaba5\uaba6\uaba7\uaba8\uaba9\uabaa\uabab\uabac\uabad\uabae\uabaf\uabb0\uabb1\uabb2\uabb3\uabb4\uabb5\uabb6\uabb7\uabb8\uabb9\uabba\uabbb\uabbc\uabbd\uabbe\uabbf\uabc0\uabc1\uabc2\uabc3\uabc4\uabc5\uabc6\uabc7\uabc8\uabc9\uabca\uabcb\uabcc\uabcd\uabce\uabcf\uabd0\uabd1\uabd2\uabd3\uabd4\uabd5\uabd6\uabd7\uabd8\uabd9\uabda\uabdb\uabdc\uabdd\uabde\uabdf\uabe0\uabe1\uabe2\uabe3\uabe4\uabe5\uabe6\uabe7\uabe8\uabe9\uabea\uabeb\uabec\uabed\uabee\uabef\uabf0\uabf1\uabf2\uabf3\uabf4\uabf5\uabf6\uabf7\uabf8\uabf9\uabfa\uabfb\uabfc\uabfd\uabfe\uabff\ud7a4\ud7a5\ud7a6\ud7a7\ud7a8\ud7a9\ud7aa\ud7ab\ud7ac\ud7ad\ud7ae\ud7af\ud7b0\ud7b1\ud7b2\ud7b3\ud7b4\ud7b5\ud7b6\ud7b7\ud7b8\ud7b9\ud7ba\ud7bb\ud7bc\ud7bd\ud7be\ud7bf\ud7c0\ud7c1\ud7c2\ud7c3\ud7c4\ud7c5\ud7c6\ud7c7\ud7c8\ud7c9\ud7ca\ud7cb\ud7cc\ud7cd\ud7ce\ud7cf\ud7d0\ud7d1\ud7d2\ud7d3\ud7d4\ud7d5\ud7d6\ud7d7\ud7d8\ud7d9\ud7da\ud7db\ud7dc\ud7dd\ud7de\ud7df\ud7e0\ud7e1\ud7e2\ud7e3\ud7e4\ud7e5\ud7e6\ud7e7\ud7e8\ud7e9\ud7ea\ud7eb\ud7ec\ud7ed\ud7ee\ud7ef\ud7f0\ud7f1\ud7f2\ud7f3\ud7f4\ud7f5\ud7f6\ud7f7\ud7f8\ud7f9\ud7fa\ud7fb\ud7fc\ud7fd\ud7fe\ud7ff\ufa2e\ufa2f\ufa6b\ufa6c\ufa6d\ufa6e\ufa6f\ufada\ufadb\ufadc\ufadd\ufade\ufadf\ufae0\ufae1\ufae2\ufae3\ufae4\ufae5\ufae6\ufae7\ufae8\ufae9\ufaea\ufaeb\ufaec\ufaed\ufaee\ufaef\ufaf0\ufaf1\ufaf2\ufaf3\ufaf4\ufaf5\ufaf6\ufaf7\ufaf8\ufaf9\ufafa\ufafb\ufafc\ufafd\ufafe\ufaff\ufb07\ufb08\ufb09\ufb0a\ufb0b\ufb0c\ufb0d\ufb0e\ufb0f\ufb10\ufb11\ufb12\ufb18\ufb19\ufb1a\ufb1b\ufb1c\ufb37\ufb3d\ufb3f\ufb42\ufb45\ufbb2\ufbb3\ufbb4\ufbb5\ufbb6\ufbb7\ufbb8\ufbb9\ufbba\ufbbb\ufbbc\ufbbd\ufbbe\ufbbf\ufbc0\ufbc1\ufbc2\ufbc3\ufbc4\ufbc5\ufbc6\ufbc7\ufbc8\ufbc9\ufbca\ufbcb\ufbcc\ufbcd\ufbce\ufbcf\ufbd0\ufbd1\ufbd2\ufd40\ufd41\ufd42\ufd43\ufd44\ufd45\ufd46\ufd47\ufd48\ufd49\ufd4a\ufd4b\ufd4c\ufd4d\ufd4e\ufd4f\ufd90\ufd91\ufdc8\ufdc9\ufdca\ufdcb\ufdcc\ufdcd\ufdce\ufdcf\ufdd0\ufdd1\ufdd2\ufdd3\ufdd4\ufdd5\ufdd6\ufdd7\ufdd8\ufdd9\ufdda\ufddb\ufddc\ufddd\ufdde\ufddf\ufde0\ufde1\ufde2\ufde3\ufde4\ufde5\ufde6\ufde7\ufde8\ufde9\ufdea\ufdeb\ufdec\ufded\ufdee\ufdef\ufdfe\ufdff\ufe1a\ufe1b\ufe1c\ufe1d\ufe1e\ufe1f\ufe24\ufe25\ufe26\ufe27\ufe28\ufe29\ufe2a\ufe2b\ufe2c\ufe2d\ufe2e\ufe2f\ufe53\ufe67\ufe6c\ufe6d\ufe6e\ufe6f\ufe75\ufefd\ufefe\uff00\uffbf\uffc0\uffc1\uffc8\uffc9\uffd0\uffd1\uffd8\uffd9\uffdd\uffde\uffdf\uffe7\uffef\ufff0\ufff1\ufff2\ufff3\ufff4\ufff5\ufff6\ufff7\ufff8\ufffe'
-
-Co = u'\ue000\ue001\ue002\ue003\ue004\ue005\ue006\ue007\ue008\ue009\ue00a\ue00b\ue00c\ue00d\ue00e\ue00f\ue010\ue011\ue012\ue013\ue014\ue015\ue016\ue017\ue018\ue019\ue01a\ue01b\ue01c\ue01d\ue01e\ue01f\ue020\ue021\ue022\ue023\ue024\ue025\ue026\ue027\ue028\ue029\ue02a\ue02b\ue02c\ue02d\ue02e\ue02f\ue030\ue031\ue032\ue033\ue034\ue035\ue036\ue037\ue038\ue039\ue03a\ue03b\ue03c\ue03d\ue03e\ue03f\ue040\ue041\ue042\ue043\ue044\ue045\ue046\ue047\ue048\ue049\ue04a\ue04b\ue04c\ue04d\ue04e\ue04f\ue050\ue051\ue052\ue053\ue054\ue055\ue056\ue057\ue058\ue059\ue05a\ue05b\ue05c\ue05d\ue05e\ue05f\ue060\ue061\ue062\ue063\ue064\ue065\ue066\ue067\ue068\ue069\ue06a\ue06b\ue06c\ue06d\ue06e\ue06f\ue070\ue071\ue072\ue073\ue074\ue075\ue076\ue077\ue078\ue079\ue07a\ue07b\ue07c\ue07d\ue07e\ue07f\ue080\ue081\ue082\ue083\ue084\ue085\ue086\ue087\ue088\ue089\ue08a\ue08b\ue08c\ue08d\ue08e\ue08f\ue090\ue091\ue092\ue093\ue094\ue095\ue096\ue097\ue098\ue099\ue09a\ue09b\ue09c\ue09d\ue09e\ue09f\ue0a0\ue0a1\ue0a2\ue0a3\ue0a4\ue0a5\ue0a6\ue0a7\ue0a8\ue0a9\ue0aa\ue0ab\ue0ac\ue0ad\ue0ae\ue0af\ue0b0\ue0b1\ue0b2\ue0b3\ue0b4\ue0b5\ue0b6\ue0b7\ue0b8\ue0b9\ue0ba\ue0bb\ue0bc\ue0bd\ue0be\ue0bf\ue0c0\ue0c1\ue0c2\ue0c3\ue0c4\ue0c5\ue0c6\ue0c7\ue0c8\ue0c9\ue0ca\ue0cb\ue0cc\ue0cd\ue0ce\ue0cf\ue0d0\ue0d1\ue0d2\ue0d3\ue0d4\ue0d5\ue0d6\ue0d7\ue0d8\ue0d9\ue0da\ue0db\ue0dc\ue0dd\ue0de\ue0df\ue0e0\ue0e1\ue0e2\ue0e3\ue0e4\ue0e5\ue0e6\ue0e7\ue0e8\ue0e9\ue0ea\ue0eb\ue0ec\ue0ed\ue0ee\ue0ef\ue0f0\ue0f1\ue0f2\ue0f3\ue0f4\ue0f5\ue0f6\ue0f7\ue0f8\ue0f9\ue0fa\ue0fb\ue0fc\ue0fd\ue0fe\ue0ff\ue100\ue101\ue102\ue103\ue104\ue105\ue106\ue107\ue108\ue109\ue10a\ue10b\ue10c\ue10d\ue10e\ue10f\ue110\ue111\ue112\ue113\ue114\ue115\ue116\ue117\ue118\ue119\ue11a\ue11b\ue11c\ue11d\ue11e\ue11f\ue120\ue121\ue122\ue123\ue124\ue125\ue126\ue127\ue128\ue129\ue12a\ue12b\ue12c\ue12d\ue12e\ue12f\ue130\ue131\ue132\ue133\ue134\ue135\ue136\ue137\ue138\ue139\ue13a\ue13b\ue13c\ue13d\ue13e\ue13f\ue140\ue141\ue142\ue143\ue144\ue145\ue146\ue147\ue148\ue149\ue14a\ue14b\ue14c\ue14d\ue14e\ue14f\ue150\ue151\ue152\ue153\ue154\ue155\ue156\ue157\ue158\ue159\ue15a\ue15b\ue15c\ue15d\ue15e\ue15f\ue160\ue161\ue162\ue163\ue164\ue165\ue166\ue167\ue168\ue169\ue16a\ue16b\ue16c\ue16d\ue16e\ue16f\ue170\ue171\ue172\ue173\ue174\ue175\ue176\ue177\ue178\ue179\ue17a\ue17b\ue17c\ue17d\ue17e\ue17f\ue180\ue181\ue182\ue183\ue184\ue185\ue186\ue187\ue188\ue189\ue18a\ue18b\ue18c\ue18d\ue18e\ue18f\ue190\ue191\ue192\ue193\ue194\ue195\ue196\ue197\ue198\ue199\ue19a\ue19b\ue19c\ue19d\ue19e\ue19f\ue1a0\ue1a1\ue1a2\ue1a3\ue1a4\ue1a5\ue1a6\ue1a7\ue1a8\ue1a9\ue1aa\ue1ab\ue1ac\ue1ad\ue1ae\ue1af\ue1b0\ue1b1\ue1b2\ue1b3\ue1b4\ue1b5\ue1b6\ue1b7\ue1b8\ue1b9\ue1ba\ue1bb\ue1bc\ue1bd\ue1be\ue1bf\ue1c0\ue1c1\ue1c2\ue1c3\ue1c4\ue1c5\ue1c6\ue1c7\ue1c8\ue1c9\ue1ca\ue1cb\ue1cc\ue1cd\ue1ce\ue1cf\ue1d0\ue1d1\ue1d2\ue1d3\ue1d4\ue1d5\ue1d6\ue1d7\ue1d8\ue1d9\ue1da\ue1db\ue1dc\ue1dd\ue1de\ue1df\ue1e0\ue1e1\ue1e2\ue1e3\ue1e4\ue1e5\ue1e6\ue1e7\ue1e8\ue1e9\ue1ea\ue1eb\ue1ec\ue1ed\ue1ee\ue1ef\ue1f0\ue1f1\ue1f2\ue1f3\ue1f4\ue1f5\ue1f6\ue1f7\ue1f8\ue1f9\ue1fa\ue1fb\ue1fc\ue1fd\ue1fe\ue1ff\ue200\ue201\ue202\ue203\ue204\ue205\ue206\ue207\ue208\ue209\ue20a\ue20b\ue20c\ue20d\ue20e\ue20f\ue210\ue211\ue212\ue213\ue214\ue215\ue216\ue217\ue218\ue219\ue21a\ue21b\ue21c\ue21d\ue21e\ue21f\ue220\ue221\ue222\ue223\ue224\ue225\ue226\ue227\ue228\ue229\ue22a\ue22b\ue22c\ue22d\ue22e\ue22f\ue230\ue231\ue232\ue233\ue234\ue235\ue236\ue237\ue238\ue239\ue23a\ue23b\ue23c\ue23d\ue23e\ue23f\ue240\ue241\ue242\ue243\ue244\ue245\ue246\ue247\ue248\ue249\ue24a\ue24b\ue24c\ue24d\ue24e\ue24f\ue250\ue251\ue252\ue253\ue254\ue255\ue256\ue257\ue258\ue259\ue25a\ue25b\ue25c\ue25d\ue25e\ue25f\ue260\ue261\ue262\ue263\ue264\ue265\ue266\ue267\ue268\ue269\ue26a\ue26b\ue26c\ue26d\ue26e\ue26f\ue270\ue271\ue272\ue273\ue274\ue275\ue276\ue277\ue278\ue279\ue27a\ue27b\ue27c\ue27d\ue27e\ue27f\ue280\ue281\ue282\ue283\ue284\ue285\ue286\ue287\ue288\ue289\ue28a\ue28b\ue28c\ue28d\ue28e\ue28f\ue290\ue291\ue292\ue293\ue294\ue295\ue296\ue297\ue298\ue299\ue29a\ue29b\ue29c\ue29d\ue29e\ue29f\ue2a0\ue2a1\ue2a2\ue2a3\ue2a4\ue2a5\ue2a6\ue2a7\ue2a8\ue2a9\ue2aa\ue2ab\ue2ac\ue2ad\ue2ae\ue2af\ue2b0\ue2b1\ue2b2\ue2b3\ue2b4\ue2b5\ue2b6\ue2b7\ue2b8\ue2b9\ue2ba\ue2bb\ue2bc\ue2bd\ue2be\ue2bf\ue2c0\ue2c1\ue2c2\ue2c3\ue2c4\ue2c5\ue2c6\ue2c7\ue2c8\ue2c9\ue2ca\ue2cb\ue2cc\ue2cd\ue2ce\ue2cf\ue2d0\ue2d1\ue2d2\ue2d3\ue2d4\ue2d5\ue2d6\ue2d7\ue2d8\ue2d9\ue2da\ue2db\ue2dc\ue2dd\ue2de\ue2df\ue2e0\ue2e1\ue2e2\ue2e3\ue2e4\ue2e5\ue2e6\ue2e7\ue2e8\ue2e9\ue2ea\ue2eb\ue2ec\ue2ed\ue2ee\ue2ef\ue2f0\ue2f1\ue2f2\ue2f3\ue2f4\ue2f5\ue2f6\ue2f7\ue2f8\ue2f9\ue2fa\ue2fb\ue2fc\ue2fd\ue2fe\ue2ff\ue300\ue301\ue302\ue303\ue304\ue305\ue306\ue307\ue308\ue309\ue30a\ue30b\ue30c\ue30d\ue30e\ue30f\ue310\ue311\ue312\ue313\ue314\ue315\ue316\ue317\ue318\ue319\ue31a\ue31b\ue31c\ue31d\ue31e\ue31f\ue320\ue321\ue322\ue323\ue324\ue325\ue326\ue327\ue328\ue329\ue32a\ue32b\ue32c\ue32d\ue32e\ue32f\ue330\ue331\ue332\ue333\ue334\ue335\ue336\ue337\ue338\ue339\ue33a\ue33b\ue33c\ue33d\ue33e\ue33f\ue340\ue341\ue342\ue343\ue344\ue345\ue346\ue347\ue348\ue349\ue34a\ue34b\ue34c\ue34d\ue34e\ue34f\ue350\ue351\ue352\ue353\ue354\ue355\ue356\ue357\ue358\ue359\ue35a\ue35b\ue35c\ue35d\ue35e\ue35f\ue360\ue361\ue362\ue363\ue364\ue365\ue366\ue367\ue368\ue369\ue36a\ue36b\ue36c\ue36d\ue36e\ue36f\ue370\ue371\ue372\ue373\ue374\ue375\ue376\ue377\ue378\ue379\ue37a\ue37b\ue37c\ue37d\ue37e\ue37f\ue380\ue381\ue382\ue383\ue384\ue385\ue386\ue387\ue388\ue389\ue38a\ue38b\ue38c\ue38d\ue38e\ue38f\ue390\ue391\ue392\ue393\ue394\ue395\ue396\ue397\ue398\ue399\ue39a\ue39b\ue39c\ue39d\ue39e\ue39f\ue3a0\ue3a1\ue3a2\ue3a3\ue3a4\ue3a5\ue3a6\ue3a7\ue3a8\ue3a9\ue3aa\ue3ab\ue3ac\ue3ad\ue3ae\ue3af\ue3b0\ue3b1\ue3b2\ue3b3\ue3b4\ue3b5\ue3b6\ue3b7\ue3b8\ue3b9\ue3ba\ue3bb\ue3bc\ue3bd\ue3be\ue3bf\ue3c0\ue3c1\ue3c2\ue3c3\ue3c4\ue3c5\ue3c6\ue3c7\ue3c8\ue3c9\ue3ca\ue3cb\ue3cc\ue3cd\ue3ce\ue3cf\ue3d0\ue3d1\ue3d2\ue3d3\ue3d4\ue3d5\ue3d6\ue3d7\ue3d8\ue3d9\ue3da\ue3db\ue3dc\ue3dd\ue3de\ue3df\ue3e0\ue3e1\ue3e2\ue3e3\ue3e4\ue3e5\ue3e6\ue3e7\ue3e8\ue3e9\ue3ea\ue3eb\ue3ec\ue3ed\ue3ee\ue3ef\ue3f0\ue3f1\ue3f2\ue3f3\ue3f4\ue3f5\ue3f6\ue3f7\ue3f8\ue3f9\ue3fa\ue3fb\ue3fc\ue3fd\ue3fe\ue3ff\ue400\ue401\ue402\ue403\ue404\ue405\ue406\ue407\ue408\ue409\ue40a\ue40b\ue40c\ue40d\ue40e\ue40f\ue410\ue411\ue412\ue413\ue414\ue415\ue416\ue417\ue418\ue419\ue41a\ue41b\ue41c\ue41d\ue41e\ue41f\ue420\ue421\ue422\ue423\ue424\ue425\ue426\ue427\ue428\ue429\ue42a\ue42b\ue42c\ue42d\ue42e\ue42f\ue430\ue431\ue432\ue433\ue434\ue435\ue436\ue437\ue438\ue439\ue43a\ue43b\ue43c\ue43d\ue43e\ue43f\ue440\ue441\ue442\ue443\ue444\ue445\ue446\ue447\ue448\ue449\ue44a\ue44b\ue44c\ue44d\ue44e\ue44f\ue450\ue451\ue452\ue453\ue454\ue455\ue456\ue457\ue458\ue459\ue45a\ue45b\ue45c\ue45d\ue45e\ue45f\ue460\ue461\ue462\ue463\ue464\ue465\ue466\ue467\ue468\ue469\ue46a\ue46b\ue46c\ue46d\ue46e\ue46f\ue470\ue471\ue472\ue473\ue474\ue475\ue476\ue477\ue478\ue479\ue47a\ue47b\ue47c\ue47d\ue47e\ue47f\ue480\ue481\ue482\ue483\ue484\ue485\ue486\ue487\ue488\ue489\ue48a\ue48b\ue48c\ue48d\ue48e\ue48f\ue490\ue491\ue492\ue493\ue494\ue495\ue496\ue497\ue498\ue499\ue49a\ue49b\ue49c\ue49d\ue49e\ue49f\ue4a0\ue4a1\ue4a2\ue4a3\ue4a4\ue4a5\ue4a6\ue4a7\ue4a8\ue4a9\ue4aa\ue4ab\ue4ac\ue4ad\ue4ae\ue4af\ue4b0\ue4b1\ue4b2\ue4b3\ue4b4\ue4b5\ue4b6\ue4b7\ue4b8\ue4b9\ue4ba\ue4bb\ue4bc\ue4bd\ue4be\ue4bf\ue4c0\ue4c1\ue4c2\ue4c3\ue4c4\ue4c5\ue4c6\ue4c7\ue4c8\ue4c9\ue4ca\ue4cb\ue4cc\ue4cd\ue4ce\ue4cf\ue4d0\ue4d1\ue4d2\ue4d3\ue4d4\ue4d5\ue4d6\ue4d7\ue4d8\ue4d9\ue4da\ue4db\ue4dc\ue4dd\ue4de\ue4df\ue4e0\ue4e1\ue4e2\ue4e3\ue4e4\ue4e5\ue4e6\ue4e7\ue4e8\ue4e9\ue4ea\ue4eb\ue4ec\ue4ed\ue4ee\ue4ef\ue4f0\ue4f1\ue4f2\ue4f3\ue4f4\ue4f5\ue4f6\ue4f7\ue4f8\ue4f9\ue4fa\ue4fb\ue4fc\ue4fd\ue4fe\ue4ff\ue500\ue501\ue502\ue503\ue504\ue505\ue506\ue507\ue508\ue509\ue50a\ue50b\ue50c\ue50d\ue50e\ue50f\ue510\ue511\ue512\ue513\ue514\ue515\ue516\ue517\ue518\ue519\ue51a\ue51b\ue51c\ue51d\ue51e\ue51f\ue520\ue521\ue522\ue523\ue524\ue525\ue526\ue527\ue528\ue529\ue52a\ue52b\ue52c\ue52d\ue52e\ue52f\ue530\ue531\ue532\ue533\ue534\ue535\ue536\ue537\ue538\ue539\ue53a\ue53b\ue53c\ue53d\ue53e\ue53f\ue540\ue541\ue542\ue543\ue544\ue545\ue546\ue547\ue548\ue549\ue54a\ue54b\ue54c\ue54d\ue54e\ue54f\ue550\ue551\ue552\ue553\ue554\ue555\ue556\ue557\ue558\ue559\ue55a\ue55b\ue55c\ue55d\ue55e\ue55f\ue560\ue561\ue562\ue563\ue564\ue565\ue566\ue567\ue568\ue569\ue56a\ue56b\ue56c\ue56d\ue56e\ue56f\ue570\ue571\ue572\ue573\ue574\ue575\ue576\ue577\ue578\ue579\ue57a\ue57b\ue57c\ue57d\ue57e\ue57f\ue580\ue581\ue582\ue583\ue584\ue585\ue586\ue587\ue588\ue589\ue58a\ue58b\ue58c\ue58d\ue58e\ue58f\ue590\ue591\ue592\ue593\ue594\ue595\ue596\ue597\ue598\ue599\ue59a\ue59b\ue59c\ue59d\ue59e\ue59f\ue5a0\ue5a1\ue5a2\ue5a3\ue5a4\ue5a5\ue5a6\ue5a7\ue5a8\ue5a9\ue5aa\ue5ab\ue5ac\ue5ad\ue5ae\ue5af\ue5b0\ue5b1\ue5b2\ue5b3\ue5b4\ue5b5\ue5b6\ue5b7\ue5b8\ue5b9\ue5ba\ue5bb\ue5bc\ue5bd\ue5be\ue5bf\ue5c0\ue5c1\ue5c2\ue5c3\ue5c4\ue5c5\ue5c6\ue5c7\ue5c8\ue5c9\ue5ca\ue5cb\ue5cc\ue5cd\ue5ce\ue5cf\ue5d0\ue5d1\ue5d2\ue5d3\ue5d4\ue5d5\ue5d6\ue5d7\ue5d8\ue5d9\ue5da\ue5db\ue5dc\ue5dd\ue5de\ue5df\ue5e0\ue5e1\ue5e2\ue5e3\ue5e4\ue5e5\ue5e6\ue5e7\ue5e8\ue5e9\ue5ea\ue5eb\ue5ec\ue5ed\ue5ee\ue5ef\ue5f0\ue5f1\ue5f2\ue5f3\ue5f4\ue5f5\ue5f6\ue5f7\ue5f8\ue5f9\ue5fa\ue5fb\ue5fc\ue5fd\ue5fe\ue5ff\ue600\ue601\ue602\ue603\ue604\ue605\ue606\ue607\ue608\ue609\ue60a\ue60b\ue60c\ue60d\ue60e\ue60f\ue610\ue611\ue612\ue613\ue614\ue615\ue616\ue617\ue618\ue619\ue61a\ue61b\ue61c\ue61d\ue61e\ue61f\ue620\ue621\ue622\ue623\ue624\ue625\ue626\ue627\ue628\ue629\ue62a\ue62b\ue62c\ue62d\ue62e\ue62f\ue630\ue631\ue632\ue633\ue634\ue635\ue636\ue637\ue638\ue639\ue63a\ue63b\ue63c\ue63d\ue63e\ue63f\ue640\ue641\ue642\ue643\ue644\ue645\ue646\ue647\ue648\ue649\ue64a\ue64b\ue64c\ue64d\ue64e\ue64f\ue650\ue651\ue652\ue653\ue654\ue655\ue656\ue657\ue658\ue659\ue65a\ue65b\ue65c\ue65d\ue65e\ue65f\ue660\ue661\ue662\ue663\ue664\ue665\ue666\ue667\ue668\ue669\ue66a\ue66b\ue66c\ue66d\ue66e\ue66f\ue670\ue671\ue672\ue673\ue674\ue675\ue676\ue677\ue678\ue679\ue67a\ue67b\ue67c\ue67d\ue67e\ue67f\ue680\ue681\ue682\ue683\ue684\ue685\ue686\ue687\ue688\ue689\ue68a\ue68b\ue68c\ue68d\ue68e\ue68f\ue690\ue691\ue692\ue693\ue694\ue695\ue696\ue697\ue698\ue699\ue69a\ue69b\ue69c\ue69d\ue69e\ue69f\ue6a0\ue6a1\ue6a2\ue6a3\ue6a4\ue6a5\ue6a6\ue6a7\ue6a8\ue6a9\ue6aa\ue6ab\ue6ac\ue6ad\ue6ae\ue6af\ue6b0\ue6b1\ue6b2\ue6b3\ue6b4\ue6b5\ue6b6\ue6b7\ue6b8\ue6b9\ue6ba\ue6bb\ue6bc\ue6bd\ue6be\ue6bf\ue6c0\ue6c1\ue6c2\ue6c3\ue6c4\ue6c5\ue6c6\ue6c7\ue6c8\ue6c9\ue6ca\ue6cb\ue6cc\ue6cd\ue6ce\ue6cf\ue6d0\ue6d1\ue6d2\ue6d3\ue6d4\ue6d5\ue6d6\ue6d7\ue6d8\ue6d9\ue6da\ue6db\ue6dc\ue6dd\ue6de\ue6df\ue6e0\ue6e1\ue6e2\ue6e3\ue6e4\ue6e5\ue6e6\ue6e7\ue6e8\ue6e9\ue6ea\ue6eb\ue6ec\ue6ed\ue6ee\ue6ef\ue6f0\ue6f1\ue6f2\ue6f3\ue6f4\ue6f5\ue6f6\ue6f7\ue6f8\ue6f9\ue6fa\ue6fb\ue6fc\ue6fd\ue6fe\ue6ff\ue700\ue701\ue702\ue703\ue704\ue705\ue706\ue707\ue708\ue709\ue70a\ue70b\ue70c\ue70d\ue70e\ue70f\ue710\ue711\ue712\ue713\ue714\ue715\ue716\ue717\ue718\ue719\ue71a\ue71b\ue71c\ue71d\ue71e\ue71f\ue720\ue721\ue722\ue723\ue724\ue725\ue726\ue727\ue728\ue729\ue72a\ue72b\ue72c\ue72d\ue72e\ue72f\ue730\ue731\ue732\ue733\ue734\ue735\ue736\ue737\ue738\ue739\ue73a\ue73b\ue73c\ue73d\ue73e\ue73f\ue740\ue741\ue742\ue743\ue744\ue745\ue746\ue747\ue748\ue749\ue74a\ue74b\ue74c\ue74d\ue74e\ue74f\ue750\ue751\ue752\ue753\ue754\ue755\ue756\ue757\ue758\ue759\ue75a\ue75b\ue75c\ue75d\ue75e\ue75f\ue760\ue761\ue762\ue763\ue764\ue765\ue766\ue767\ue768\ue769\ue76a\ue76b\ue76c\ue76d\ue76e\ue76f\ue770\ue771\ue772\ue773\ue774\ue775\ue776\ue777\ue778\ue779\ue77a\ue77b\ue77c\ue77d\ue77e\ue77f\ue780\ue781\ue782\ue783\ue784\ue785\ue786\ue787\ue788\ue789\ue78a\ue78b\ue78c\ue78d\ue78e\ue78f\ue790\ue791\ue792\ue793\ue794\ue795\ue796\ue797\ue798\ue799\ue79a\ue79b\ue79c\ue79d\ue79e\ue79f\ue7a0\ue7a1\ue7a2\ue7a3\ue7a4\ue7a5\ue7a6\ue7a7\ue7a8\ue7a9\ue7aa\ue7ab\ue7ac\ue7ad\ue7ae\ue7af\ue7b0\ue7b1\ue7b2\ue7b3\ue7b4\ue7b5\ue7b6\ue7b7\ue7b8\ue7b9\ue7ba\ue7bb\ue7bc\ue7bd\ue7be\ue7bf\ue7c0\ue7c1\ue7c2\ue7c3\ue7c4\ue7c5\ue7c6\ue7c7\ue7c8\ue7c9\ue7ca\ue7cb\ue7cc\ue7cd\ue7ce\ue7cf\ue7d0\ue7d1\ue7d2\ue7d3\ue7d4\ue7d5\ue7d6\ue7d7\ue7d8\ue7d9\ue7da\ue7db\ue7dc\ue7dd\ue7de\ue7df\ue7e0\ue7e1\ue7e2\ue7e3\ue7e4\ue7e5\ue7e6\ue7e7\ue7e8\ue7e9\ue7ea\ue7eb\ue7ec\ue7ed\ue7ee\ue7ef\ue7f0\ue7f1\ue7f2\ue7f3\ue7f4\ue7f5\ue7f6\ue7f7\ue7f8\ue7f9\ue7fa\ue7fb\ue7fc\ue7fd\ue7fe\ue7ff\ue800\ue801\ue802\ue803\ue804\ue805\ue806\ue807\ue808\ue809\ue80a\ue80b\ue80c\ue80d\ue80e\ue80f\ue810\ue811\ue812\ue813\ue814\ue815\ue816\ue817\ue818\ue819\ue81a\ue81b\ue81c\ue81d\ue81e\ue81f\ue820\ue821\ue822\ue823\ue824\ue825\ue826\ue827\ue828\ue829\ue82a\ue82b\ue82c\ue82d\ue82e\ue82f\ue830\ue831\ue832\ue833\ue834\ue835\ue836\ue837\ue838\ue839\ue83a\ue83b\ue83c\ue83d\ue83e\ue83f\ue840\ue841\ue842\ue843\ue844\ue845\ue846\ue847\ue848\ue849\ue84a\ue84b\ue84c\ue84d\ue84e\ue84f\ue850\ue851\ue852\ue853\ue854\ue855\ue856\ue857\ue858\ue859\ue85a\ue85b\ue85c\ue85d\ue85e\ue85f\ue860\ue861\ue862\ue863\ue864\ue865\ue866\ue867\ue868\ue869\ue86a\ue86b\ue86c\ue86d\ue86e\ue86f\ue870\ue871\ue872\ue873\ue874\ue875\ue876\ue877\ue878\ue879\ue87a\ue87b\ue87c\ue87d\ue87e\ue87f\ue880\ue881\ue882\ue883\ue884\ue885\ue886\ue887\ue888\ue889\ue88a\ue88b\ue88c\ue88d\ue88e\ue88f\ue890\ue891\ue892\ue893\ue894\ue895\ue896\ue897\ue898\ue899\ue89a\ue89b\ue89c\ue89d\ue89e\ue89f\ue8a0\ue8a1\ue8a2\ue8a3\ue8a4\ue8a5\ue8a6\ue8a7\ue8a8\ue8a9\ue8aa\ue8ab\ue8ac\ue8ad\ue8ae\ue8af\ue8b0\ue8b1\ue8b2\ue8b3\ue8b4\ue8b5\ue8b6\ue8b7\ue8b8\ue8b9\ue8ba\ue8bb\ue8bc\ue8bd\ue8be\ue8bf\ue8c0\ue8c1\ue8c2\ue8c3\ue8c4\ue8c5\ue8c6\ue8c7\ue8c8\ue8c9\ue8ca\ue8cb\ue8cc\ue8cd\ue8ce\ue8cf\ue8d0\ue8d1\ue8d2\ue8d3\ue8d4\ue8d5\ue8d6\ue8d7\ue8d8\ue8d9\ue8da\ue8db\ue8dc\ue8dd\ue8de\ue8df\ue8e0\ue8e1\ue8e2\ue8e3\ue8e4\ue8e5\ue8e6\ue8e7\ue8e8\ue8e9\ue8ea\ue8eb\ue8ec\ue8ed\ue8ee\ue8ef\ue8f0\ue8f1\ue8f2\ue8f3\ue8f4\ue8f5\ue8f6\ue8f7\ue8f8\ue8f9\ue8fa\ue8fb\ue8fc\ue8fd\ue8fe\ue8ff\ue900\ue901\ue902\ue903\ue904\ue905\ue906\ue907\ue908\ue909\ue90a\ue90b\ue90c\ue90d\ue90e\ue90f\ue910\ue911\ue912\ue913\ue914\ue915\ue916\ue917\ue918\ue919\ue91a\ue91b\ue91c\ue91d\ue91e\ue91f\ue920\ue921\ue922\ue923\ue924\ue925\ue926\ue927\ue928\ue929\ue92a\ue92b\ue92c\ue92d\ue92e\ue92f\ue930\ue931\ue932\ue933\ue934\ue935\ue936\ue937\ue938\ue939\ue93a\ue93b\ue93c\ue93d\ue93e\ue93f\ue940\ue941\ue942\ue943\ue944\ue945\ue946\ue947\ue948\ue949\ue94a\ue94b\ue94c\ue94d\ue94e\ue94f\ue950\ue951\ue952\ue953\ue954\ue955\ue956\ue957\ue958\ue959\ue95a\ue95b\ue95c\ue95d\ue95e\ue95f\ue960\ue961\ue962\ue963\ue964\ue965\ue966\ue967\ue968\ue969\ue96a\ue96b\ue96c\ue96d\ue96e\ue96f\ue970\ue971\ue972\ue973\ue974\ue975\ue976\ue977\ue978\ue979\ue97a\ue97b\ue97c\ue97d\ue97e\ue97f\ue980\ue981\ue982\ue983\ue984\ue985\ue986\ue987\ue988\ue989\ue98a\ue98b\ue98c\ue98d\ue98e\ue98f\ue990\ue991\ue992\ue993\ue994\ue995\ue996\ue997\ue998\ue999\ue99a\ue99b\ue99c\ue99d\ue99e\ue99f\ue9a0\ue9a1\ue9a2\ue9a3\ue9a4\ue9a5\ue9a6\ue9a7\ue9a8\ue9a9\ue9aa\ue9ab\ue9ac\ue9ad\ue9ae\ue9af\ue9b0\ue9b1\ue9b2\ue9b3\ue9b4\ue9b5\ue9b6\ue9b7\ue9b8\ue9b9\ue9ba\ue9bb\ue9bc\ue9bd\ue9be\ue9bf\ue9c0\ue9c1\ue9c2\ue9c3\ue9c4\ue9c5\ue9c6\ue9c7\ue9c8\ue9c9\ue9ca\ue9cb\ue9cc\ue9cd\ue9ce\ue9cf\ue9d0\ue9d1\ue9d2\ue9d3\ue9d4\ue9d5\ue9d6\ue9d7\ue9d8\ue9d9\ue9da\ue9db\ue9dc\ue9dd\ue9de\ue9df\ue9e0\ue9e1\ue9e2\ue9e3\ue9e4\ue9e5\ue9e6\ue9e7\ue9e8\ue9e9\ue9ea\ue9eb\ue9ec\ue9ed\ue9ee\ue9ef\ue9f0\ue9f1\ue9f2\ue9f3\ue9f4\ue9f5\ue9f6\ue9f7\ue9f8\ue9f9\ue9fa\ue9fb\ue9fc\ue9fd\ue9fe\ue9ff\uea00\uea01\uea02\uea03\uea04\uea05\uea06\uea07\uea08\uea09\uea0a\uea0b\uea0c\uea0d\uea0e\uea0f\uea10\uea11\uea12\uea13\uea14\uea15\uea16\uea17\uea18\uea19\uea1a\uea1b\uea1c\uea1d\uea1e\uea1f\uea20\uea21\uea22\uea23\uea24\uea25\uea26\uea27\uea28\uea29\uea2a\uea2b\uea2c\uea2d\uea2e\uea2f\uea30\uea31\uea32\uea33\uea34\uea35\uea36\uea37\uea38\uea39\uea3a\uea3b\uea3c\uea3d\uea3e\uea3f\uea40\uea41\uea42\uea43\uea44\uea45\uea46\uea47\uea48\uea49\uea4a\uea4b\uea4c\uea4d\uea4e\uea4f\uea50\uea51\uea52\uea53\uea54\uea55\uea56\uea57\uea58\uea59\uea5a\uea5b\uea5c\uea5d\uea5e\uea5f\uea60\uea61\uea62\uea63\uea64\uea65\uea66\uea67\uea68\uea69\uea6a\uea6b\uea6c\uea6d\uea6e\uea6f\uea70\uea71\uea72\uea73\uea74\uea75\uea76\uea77\uea78\uea79\uea7a\uea7b\uea7c\uea7d\uea7e\uea7f\uea80\uea81\uea82\uea83\uea84\uea85\uea86\uea87\uea88\uea89\uea8a\uea8b\uea8c\uea8d\uea8e\uea8f\uea90\uea91\uea92\uea93\uea94\uea95\uea96\uea97\uea98\uea99\uea9a\uea9b\uea9c\uea9d\uea9e\uea9f\ueaa0\ueaa1\ueaa2\ueaa3\ueaa4\ueaa5\ueaa6\ueaa7\ueaa8\ueaa9\ueaaa\ueaab\ueaac\ueaad\ueaae\ueaaf\ueab0\ueab1\ueab2\ueab3\ueab4\ueab5\ueab6\ueab7\ueab8\ueab9\ueaba\ueabb\ueabc\ueabd\ueabe\ueabf\ueac0\ueac1\ueac2\ueac3\ueac4\ueac5\ueac6\ueac7\ueac8\ueac9\ueaca\ueacb\ueacc\ueacd\ueace\ueacf\uead0\uead1\uead2\uead3\uead4\uead5\uead6\uead7\uead8\uead9\ueada\ueadb\ueadc\ueadd\ueade\ueadf\ueae0\ueae1\ueae2\ueae3\ueae4\ueae5\ueae6\ueae7\ueae8\ueae9\ueaea\ueaeb\ueaec\ueaed\ueaee\ueaef\ueaf0\ueaf1\ueaf2\ueaf3\ueaf4\ueaf5\ueaf6\ueaf7\ueaf8\ueaf9\ueafa\ueafb\ueafc\ueafd\ueafe\ueaff\ueb00\ueb01\ueb02\ueb03\ueb04\ueb05\ueb06\ueb07\ueb08\ueb09\ueb0a\ueb0b\ueb0c\ueb0d\ueb0e\ueb0f\ueb10\ueb11\ueb12\ueb13\ueb14\ueb15\ueb16\ueb17\ueb18\ueb19\ueb1a\ueb1b\ueb1c\ueb1d\ueb1e\ueb1f\ueb20\ueb21\ueb22\ueb23\ueb24\ueb25\ueb26\ueb27\ueb28\ueb29\ueb2a\ueb2b\ueb2c\ueb2d\ueb2e\ueb2f\ueb30\ueb31\ueb32\ueb33\ueb34\ueb35\ueb36\ueb37\ueb38\ueb39\ueb3a\ueb3b\ueb3c\ueb3d\ueb3e\ueb3f\ueb40\ueb41\ueb42\ueb43\ueb44\ueb45\ueb46\ueb47\ueb48\ueb49\ueb4a\ueb4b\ueb4c\ueb4d\ueb4e\ueb4f\ueb50\ueb51\ueb52\ueb53\ueb54\ueb55\ueb56\ueb57\ueb58\ueb59\ueb5a\ueb5b\ueb5c\ueb5d\ueb5e\ueb5f\ueb60\ueb61\ueb62\ueb63\ueb64\ueb65\ueb66\ueb67\ueb68\ueb69\ueb6a\ueb6b\ueb6c\ueb6d\ueb6e\ueb6f\ueb70\ueb71\ueb72\ueb73\ueb74\ueb75\ueb76\ueb77\ueb78\ueb79\ueb7a\ueb7b\ueb7c\ueb7d\ueb7e\ueb7f\ueb80\ueb81\ueb82\ueb83\ueb84\ueb85\ueb86\ueb87\ueb88\ueb89\ueb8a\ueb8b\ueb8c\ueb8d\ueb8e\ueb8f\ueb90\ueb91\ueb92\ueb93\ueb94\ueb95\ueb96\ueb97\ueb98\ueb99\ueb9a\ueb9b\ueb9c\ueb9d\ueb9e\ueb9f\ueba0\ueba1\ueba2\ueba3\ueba4\ueba5\ueba6\ueba7\ueba8\ueba9\uebaa\uebab\uebac\uebad\uebae\uebaf\uebb0\uebb1\uebb2\uebb3\uebb4\uebb5\uebb6\uebb7\uebb8\uebb9\uebba\uebbb\uebbc\uebbd\uebbe\uebbf\uebc0\uebc1\uebc2\uebc3\uebc4\uebc5\uebc6\uebc7\uebc8\uebc9\uebca\uebcb\uebcc\uebcd\uebce\uebcf\uebd0\uebd1\uebd2\uebd3\uebd4\uebd5\uebd6\uebd7\uebd8\uebd9\uebda\uebdb\uebdc\uebdd\uebde\uebdf\uebe0\uebe1\uebe2\uebe3\uebe4\uebe5\uebe6\uebe7\uebe8\uebe9\uebea\uebeb\uebec\uebed\uebee\uebef\uebf0\uebf1\uebf2\uebf3\uebf4\uebf5\uebf6\uebf7\uebf8\uebf9\uebfa\uebfb\uebfc\uebfd\uebfe\uebff\uec00\uec01\uec02\uec03\uec04\uec05\uec06\uec07\uec08\uec09\uec0a\uec0b\uec0c\uec0d\uec0e\uec0f\uec10\uec11\uec12\uec13\uec14\uec15\uec16\uec17\uec18\uec19\uec1a\uec1b\uec1c\uec1d\uec1e\uec1f\uec20\uec21\uec22\uec23\uec24\uec25\uec26\uec27\uec28\uec29\uec2a\uec2b\uec2c\uec2d\uec2e\uec2f\uec30\uec31\uec32\uec33\uec34\uec35\uec36\uec37\uec38\uec39\uec3a\uec3b\uec3c\uec3d\uec3e\uec3f\uec40\uec41\uec42\uec43\uec44\uec45\uec46\uec47\uec48\uec49\uec4a\uec4b\uec4c\uec4d\uec4e\uec4f\uec50\uec51\uec52\uec53\uec54\uec55\uec56\uec57\uec58\uec59\uec5a\uec5b\uec5c\uec5d\uec5e\uec5f\uec60\uec61\uec62\uec63\uec64\uec65\uec66\uec67\uec68\uec69\uec6a\uec6b\uec6c\uec6d\uec6e\uec6f\uec70\uec71\uec72\uec73\uec74\uec75\uec76\uec77\uec78\uec79\uec7a\uec7b\uec7c\uec7d\uec7e\uec7f\uec80\uec81\uec82\uec83\uec84\uec85\uec86\uec87\uec88\uec89\uec8a\uec8b\uec8c\uec8d\uec8e\uec8f\uec90\uec91\uec92\uec93\uec94\uec95\uec96\uec97\uec98\uec99\uec9a\uec9b\uec9c\uec9d\uec9e\uec9f\ueca0\ueca1\ueca2\ueca3\ueca4\ueca5\ueca6\ueca7\ueca8\ueca9\uecaa\uecab\uecac\uecad\uecae\uecaf\uecb0\uecb1\uecb2\uecb3\uecb4\uecb5\uecb6\uecb7\uecb8\uecb9\uecba\uecbb\uecbc\uecbd\uecbe\uecbf\uecc0\uecc1\uecc2\uecc3\uecc4\uecc5\uecc6\uecc7\uecc8\uecc9\uecca\ueccb\ueccc\ueccd\uecce\ueccf\uecd0\uecd1\uecd2\uecd3\uecd4\uecd5\uecd6\uecd7\uecd8\uecd9\uecda\uecdb\uecdc\uecdd\uecde\uecdf\uece0\uece1\uece2\uece3\uece4\uece5\uece6\uece7\uece8\uece9\uecea\ueceb\uecec\ueced\uecee\uecef\uecf0\uecf1\uecf2\uecf3\uecf4\uecf5\uecf6\uecf7\uecf8\uecf9\uecfa\uecfb\uecfc\uecfd\uecfe\uecff\ued00\ued01\ued02\ued03\ued04\ued05\ued06\ued07\ued08\ued09\ued0a\ued0b\ued0c\ued0d\ued0e\ued0f\ued10\ued11\ued12\ued13\ued14\ued15\ued16\ued17\ued18\ued19\ued1a\ued1b\ued1c\ued1d\ued1e\ued1f\ued20\ued21\ued22\ued23\ued24\ued25\ued26\ued27\ued28\ued29\ued2a\ued2b\ued2c\ued2d\ued2e\ued2f\ued30\ued31\ued32\ued33\ued34\ued35\ued36\ued37\ued38\ued39\ued3a\ued3b\ued3c\ued3d\ued3e\ued3f\ued40\ued41\ued42\ued43\ued44\ued45\ued46\ued47\ued48\ued49\ued4a\ued4b\ued4c\ued4d\ued4e\ued4f\ued50\ued51\ued52\ued53\ued54\ued55\ued56\ued57\ued58\ued59\ued5a\ued5b\ued5c\ued5d\ued5e\ued5f\ued60\ued61\ued62\ued63\ued64\ued65\ued66\ued67\ued68\ued69\ued6a\ued6b\ued6c\ued6d\ued6e\ued6f\ued70\ued71\ued72\ued73\ued74\ued75\ued76\ued77\ued78\ued79\ued7a\ued7b\ued7c\ued7d\ued7e\ued7f\ued80\ued81\ued82\ued83\ued84\ued85\ued86\ued87\ued88\ued89\ued8a\ued8b\ued8c\ued8d\ued8e\ued8f\ued90\ued91\ued92\ued93\ued94\ued95\ued96\ued97\ued98\ued99\ued9a\ued9b\ued9c\ued9d\ued9e\ued9f\ueda0\ueda1\ueda2\ueda3\ueda4\ueda5\ueda6\ueda7\ueda8\ueda9\uedaa\uedab\uedac\uedad\uedae\uedaf\uedb0\uedb1\uedb2\uedb3\uedb4\uedb5\uedb6\uedb7\uedb8\uedb9\uedba\uedbb\uedbc\uedbd\uedbe\uedbf\uedc0\uedc1\uedc2\uedc3\uedc4\uedc5\uedc6\uedc7\uedc8\uedc9\uedca\uedcb\uedcc\uedcd\uedce\uedcf\uedd0\uedd1\uedd2\uedd3\uedd4\uedd5\uedd6\uedd7\uedd8\uedd9\uedda\ueddb\ueddc\ueddd\uedde\ueddf\uede0\uede1\uede2\uede3\uede4\uede5\uede6\uede7\uede8\uede9\uedea\uedeb\uedec\ueded\uedee\uedef\uedf0\uedf1\uedf2\uedf3\uedf4\uedf5\uedf6\uedf7\uedf8\uedf9\uedfa\uedfb\uedfc\uedfd\uedfe\uedff\uee00\uee01\uee02\uee03\uee04\uee05\uee06\uee07\uee08\uee09\uee0a\uee0b\uee0c\uee0d\uee0e\uee0f\uee10\uee11\uee12\uee13\uee14\uee15\uee16\uee17\uee18\uee19\uee1a\uee1b\uee1c\uee1d\uee1e\uee1f\uee20\uee21\uee22\uee23\uee24\uee25\uee26\uee27\uee28\uee29\uee2a\uee2b\uee2c\uee2d\uee2e\uee2f\uee30\uee31\uee32\uee33\uee34\uee35\uee36\uee37\uee38\uee39\uee3a\uee3b\uee3c\uee3d\uee3e\uee3f\uee40\uee41\uee42\uee43\uee44\uee45\uee46\uee47\uee48\uee49\uee4a\uee4b\uee4c\uee4d\uee4e\uee4f\uee50\uee51\uee52\uee53\uee54\uee55\uee56\uee57\uee58\uee59\uee5a\uee5b\uee5c\uee5d\uee5e\uee5f\uee60\uee61\uee62\uee63\uee64\uee65\uee66\uee67\uee68\uee69\uee6a\uee6b\uee6c\uee6d\uee6e\uee6f\uee70\uee71\uee72\uee73\uee74\uee75\uee76\uee77\uee78\uee79\uee7a\uee7b\uee7c\uee7d\uee7e\uee7f\uee80\uee81\uee82\uee83\uee84\uee85\uee86\uee87\uee88\uee89\uee8a\uee8b\uee8c\uee8d\uee8e\uee8f\uee90\uee91\uee92\uee93\uee94\uee95\uee96\uee97\uee98\uee99\uee9a\uee9b\uee9c\uee9d\uee9e\uee9f\ueea0\ueea1\ueea2\ueea3\ueea4\ueea5\ueea6\ueea7\ueea8\ueea9\ueeaa\ueeab\ueeac\ueead\ueeae\ueeaf\ueeb0\ueeb1\ueeb2\ueeb3\ueeb4\ueeb5\ueeb6\ueeb7\ueeb8\ueeb9\ueeba\ueebb\ueebc\ueebd\ueebe\ueebf\ueec0\ueec1\ueec2\ueec3\ueec4\ueec5\ueec6\ueec7\ueec8\ueec9\ueeca\ueecb\ueecc\ueecd\ueece\ueecf\ueed0\ueed1\ueed2\ueed3\ueed4\ueed5\ueed6\ueed7\ueed8\ueed9\ueeda\ueedb\ueedc\ueedd\ueede\ueedf\ueee0\ueee1\ueee2\ueee3\ueee4\ueee5\ueee6\ueee7\ueee8\ueee9\ueeea\ueeeb\ueeec\ueeed\ueeee\ueeef\ueef0\ueef1\ueef2\ueef3\ueef4\ueef5\ueef6\ueef7\ueef8\ueef9\ueefa\ueefb\ueefc\ueefd\ueefe\ueeff\uef00\uef01\uef02\uef03\uef04\uef05\uef06\uef07\uef08\uef09\uef0a\uef0b\uef0c\uef0d\uef0e\uef0f\uef10\uef11\uef12\uef13\uef14\uef15\uef16\uef17\uef18\uef19\uef1a\uef1b\uef1c\uef1d\uef1e\uef1f\uef20\uef21\uef22\uef23\uef24\uef25\uef26\uef27\uef28\uef29\uef2a\uef2b\uef2c\uef2d\uef2e\uef2f\uef30\uef31\uef32\uef33\uef34\uef35\uef36\uef37\uef38\uef39\uef3a\uef3b\uef3c\uef3d\uef3e\uef3f\uef40\uef41\uef42\uef43\uef44\uef45\uef46\uef47\uef48\uef49\uef4a\uef4b\uef4c\uef4d\uef4e\uef4f\uef50\uef51\uef52\uef53\uef54\uef55\uef56\uef57\uef58\uef59\uef5a\uef5b\uef5c\uef5d\uef5e\uef5f\uef60\uef61\uef62\uef63\uef64\uef65\uef66\uef67\uef68\uef69\uef6a\uef6b\uef6c\uef6d\uef6e\uef6f\uef70\uef71\uef72\uef73\uef74\uef75\uef76\uef77\uef78\uef79\uef7a\uef7b\uef7c\uef7d\uef7e\uef7f\uef80\uef81\uef82\uef83\uef84\uef85\uef86\uef87\uef88\uef89\uef8a\uef8b\uef8c\uef8d\uef8e\uef8f\uef90\uef91\uef92\uef93\uef94\uef95\uef96\uef97\uef98\uef99\uef9a\uef9b\uef9c\uef9d\uef9e\uef9f\uefa0\uefa1\uefa2\uefa3\uefa4\uefa5\uefa6\uefa7\uefa8\uefa9\uefaa\uefab\uefac\uefad\uefae\uefaf\uefb0\uefb1\uefb2\uefb3\uefb4\uefb5\uefb6\uefb7\uefb8\uefb9\uefba\uefbb\uefbc\uefbd\uefbe\uefbf\uefc0\uefc1\uefc2\uefc3\uefc4\uefc5\uefc6\uefc7\uefc8\uefc9\uefca\uefcb\uefcc\uefcd\uefce\uefcf\uefd0\uefd1\uefd2\uefd3\uefd4\uefd5\uefd6\uefd7\uefd8\uefd9\uefda\uefdb\uefdc\uefdd\uefde\uefdf\uefe0\uefe1\uefe2\uefe3\uefe4\uefe5\uefe6\uefe7\uefe8\uefe9\uefea\uefeb\uefec\uefed\uefee\uefef\ueff0\ueff1\ueff2\ueff3\ueff4\ueff5\ueff6\ueff7\ueff8\ueff9\ueffa\ueffb\ueffc\ueffd\ueffe\uefff\uf000\uf001\uf002\uf003\uf004\uf005\uf006\uf007\uf008\uf009\uf00a\uf00b\uf00c\uf00d\uf00e\uf00f\uf010\uf011\uf012\uf013\uf014\uf015\uf016\uf017\uf018\uf019\uf01a\uf01b\uf01c\uf01d\uf01e\uf01f\uf020\uf021\uf022\uf023\uf024\uf025\uf026\uf027\uf028\uf029\uf02a\uf02b\uf02c\uf02d\uf02e\uf02f\uf030\uf031\uf032\uf033\uf034\uf035\uf036\uf037\uf038\uf039\uf03a\uf03b\uf03c\uf03d\uf03e\uf03f\uf040\uf041\uf042\uf043\uf044\uf045\uf046\uf047\uf048\uf049\uf04a\uf04b\uf04c\uf04d\uf04e\uf04f\uf050\uf051\uf052\uf053\uf054\uf055\uf056\uf057\uf058\uf059\uf05a\uf05b\uf05c\uf05d\uf05e\uf05f\uf060\uf061\uf062\uf063\uf064\uf065\uf066\uf067\uf068\uf069\uf06a\uf06b\uf06c\uf06d\uf06e\uf06f\uf070\uf071\uf072\uf073\uf074\uf075\uf076\uf077\uf078\uf079\uf07a\uf07b\uf07c\uf07d\uf07e\uf07f\uf080\uf081\uf082\uf083\uf084\uf085\uf086\uf087\uf088\uf089\uf08a\uf08b\uf08c\uf08d\uf08e\uf08f\uf090\uf091\uf092\uf093\uf094\uf095\uf096\uf097\uf098\uf099\uf09a\uf09b\uf09c\uf09d\uf09e\uf09f\uf0a0\uf0a1\uf0a2\uf0a3\uf0a4\uf0a5\uf0a6\uf0a7\uf0a8\uf0a9\uf0aa\uf0ab\uf0ac\uf0ad\uf0ae\uf0af\uf0b0\uf0b1\uf0b2\uf0b3\uf0b4\uf0b5\uf0b6\uf0b7\uf0b8\uf0b9\uf0ba\uf0bb\uf0bc\uf0bd\uf0be\uf0bf\uf0c0\uf0c1\uf0c2\uf0c3\uf0c4\uf0c5\uf0c6\uf0c7\uf0c8\uf0c9\uf0ca\uf0cb\uf0cc\uf0cd\uf0ce\uf0cf\uf0d0\uf0d1\uf0d2\uf0d3\uf0d4\uf0d5\uf0d6\uf0d7\uf0d8\uf0d9\uf0da\uf0db\uf0dc\uf0dd\uf0de\uf0df\uf0e0\uf0e1\uf0e2\uf0e3\uf0e4\uf0e5\uf0e6\uf0e7\uf0e8\uf0e9\uf0ea\uf0eb\uf0ec\uf0ed\uf0ee\uf0ef\uf0f0\uf0f1\uf0f2\uf0f3\uf0f4\uf0f5\uf0f6\uf0f7\uf0f8\uf0f9\uf0fa\uf0fb\uf0fc\uf0fd\uf0fe\uf0ff\uf100\uf101\uf102\uf103\uf104\uf105\uf106\uf107\uf108\uf109\uf10a\uf10b\uf10c\uf10d\uf10e\uf10f\uf110\uf111\uf112\uf113\uf114\uf115\uf116\uf117\uf118\uf119\uf11a\uf11b\uf11c\uf11d\uf11e\uf11f\uf120\uf121\uf122\uf123\uf124\uf125\uf126\uf127\uf128\uf129\uf12a\uf12b\uf12c\uf12d\uf12e\uf12f\uf130\uf131\uf132\uf133\uf134\uf135\uf136\uf137\uf138\uf139\uf13a\uf13b\uf13c\uf13d\uf13e\uf13f\uf140\uf141\uf142\uf143\uf144\uf145\uf146\uf147\uf148\uf149\uf14a\uf14b\uf14c\uf14d\uf14e\uf14f\uf150\uf151\uf152\uf153\uf154\uf155\uf156\uf157\uf158\uf159\uf15a\uf15b\uf15c\uf15d\uf15e\uf15f\uf160\uf161\uf162\uf163\uf164\uf165\uf166\uf167\uf168\uf169\uf16a\uf16b\uf16c\uf16d\uf16e\uf16f\uf170\uf171\uf172\uf173\uf174\uf175\uf176\uf177\uf178\uf179\uf17a\uf17b\uf17c\uf17d\uf17e\uf17f\uf180\uf181\uf182\uf183\uf184\uf185\uf186\uf187\uf188\uf189\uf18a\uf18b\uf18c\uf18d\uf18e\uf18f\uf190\uf191\uf192\uf193\uf194\uf195\uf196\uf197\uf198\uf199\uf19a\uf19b\uf19c\uf19d\uf19e\uf19f\uf1a0\uf1a1\uf1a2\uf1a3\uf1a4\uf1a5\uf1a6\uf1a7\uf1a8\uf1a9\uf1aa\uf1ab\uf1ac\uf1ad\uf1ae\uf1af\uf1b0\uf1b1\uf1b2\uf1b3\uf1b4\uf1b5\uf1b6\uf1b7\uf1b8\uf1b9\uf1ba\uf1bb\uf1bc\uf1bd\uf1be\uf1bf\uf1c0\uf1c1\uf1c2\uf1c3\uf1c4\uf1c5\uf1c6\uf1c7\uf1c8\uf1c9\uf1ca\uf1cb\uf1cc\uf1cd\uf1ce\uf1cf\uf1d0\uf1d1\uf1d2\uf1d3\uf1d4\uf1d5\uf1d6\uf1d7\uf1d8\uf1d9\uf1da\uf1db\uf1dc\uf1dd\uf1de\uf1df\uf1e0\uf1e1\uf1e2\uf1e3\uf1e4\uf1e5\uf1e6\uf1e7\uf1e8\uf1e9\uf1ea\uf1eb\uf1ec\uf1ed\uf1ee\uf1ef\uf1f0\uf1f1\uf1f2\uf1f3\uf1f4\uf1f5\uf1f6\uf1f7\uf1f8\uf1f9\uf1fa\uf1fb\uf1fc\uf1fd\uf1fe\uf1ff\uf200\uf201\uf202\uf203\uf204\uf205\uf206\uf207\uf208\uf209\uf20a\uf20b\uf20c\uf20d\uf20e\uf20f\uf210\uf211\uf212\uf213\uf214\uf215\uf216\uf217\uf218\uf219\uf21a\uf21b\uf21c\uf21d\uf21e\uf21f\uf220\uf221\uf222\uf223\uf224\uf225\uf226\uf227\uf228\uf229\uf22a\uf22b\uf22c\uf22d\uf22e\uf22f\uf230\uf231\uf232\uf233\uf234\uf235\uf236\uf237\uf238\uf239\uf23a\uf23b\uf23c\uf23d\uf23e\uf23f\uf240\uf241\uf242\uf243\uf244\uf245\uf246\uf247\uf248\uf249\uf24a\uf24b\uf24c\uf24d\uf24e\uf24f\uf250\uf251\uf252\uf253\uf254\uf255\uf256\uf257\uf258\uf259\uf25a\uf25b\uf25c\uf25d\uf25e\uf25f\uf260\uf261\uf262\uf263\uf264\uf265\uf266\uf267\uf268\uf269\uf26a\uf26b\uf26c\uf26d\uf26e\uf26f\uf270\uf271\uf272\uf273\uf274\uf275\uf276\uf277\uf278\uf279\uf27a\uf27b\uf27c\uf27d\uf27e\uf27f\uf280\uf281\uf282\uf283\uf284\uf285\uf286\uf287\uf288\uf289\uf28a\uf28b\uf28c\uf28d\uf28e\uf28f\uf290\uf291\uf292\uf293\uf294\uf295\uf296\uf297\uf298\uf299\uf29a\uf29b\uf29c\uf29d\uf29e\uf29f\uf2a0\uf2a1\uf2a2\uf2a3\uf2a4\uf2a5\uf2a6\uf2a7\uf2a8\uf2a9\uf2aa\uf2ab\uf2ac\uf2ad\uf2ae\uf2af\uf2b0\uf2b1\uf2b2\uf2b3\uf2b4\uf2b5\uf2b6\uf2b7\uf2b8\uf2b9\uf2ba\uf2bb\uf2bc\uf2bd\uf2be\uf2bf\uf2c0\uf2c1\uf2c2\uf2c3\uf2c4\uf2c5\uf2c6\uf2c7\uf2c8\uf2c9\uf2ca\uf2cb\uf2cc\uf2cd\uf2ce\uf2cf\uf2d0\uf2d1\uf2d2\uf2d3\uf2d4\uf2d5\uf2d6\uf2d7\uf2d8\uf2d9\uf2da\uf2db\uf2dc\uf2dd\uf2de\uf2df\uf2e0\uf2e1\uf2e2\uf2e3\uf2e4\uf2e5\uf2e6\uf2e7\uf2e8\uf2e9\uf2ea\uf2eb\uf2ec\uf2ed\uf2ee\uf2ef\uf2f0\uf2f1\uf2f2\uf2f3\uf2f4\uf2f5\uf2f6\uf2f7\uf2f8\uf2f9\uf2fa\uf2fb\uf2fc\uf2fd\uf2fe\uf2ff\uf300\uf301\uf302\uf303\uf304\uf305\uf306\uf307\uf308\uf309\uf30a\uf30b\uf30c\uf30d\uf30e\uf30f\uf310\uf311\uf312\uf313\uf314\uf315\uf316\uf317\uf318\uf319\uf31a\uf31b\uf31c\uf31d\uf31e\uf31f\uf320\uf321\uf322\uf323\uf324\uf325\uf326\uf327\uf328\uf329\uf32a\uf32b\uf32c\uf32d\uf32e\uf32f\uf330\uf331\uf332\uf333\uf334\uf335\uf336\uf337\uf338\uf339\uf33a\uf33b\uf33c\uf33d\uf33e\uf33f\uf340\uf341\uf342\uf343\uf344\uf345\uf346\uf347\uf348\uf349\uf34a\uf34b\uf34c\uf34d\uf34e\uf34f\uf350\uf351\uf352\uf353\uf354\uf355\uf356\uf357\uf358\uf359\uf35a\uf35b\uf35c\uf35d\uf35e\uf35f\uf360\uf361\uf362\uf363\uf364\uf365\uf366\uf367\uf368\uf369\uf36a\uf36b\uf36c\uf36d\uf36e\uf36f\uf370\uf371\uf372\uf373\uf374\uf375\uf376\uf377\uf378\uf379\uf37a\uf37b\uf37c\uf37d\uf37e\uf37f\uf380\uf381\uf382\uf383\uf384\uf385\uf386\uf387\uf388\uf389\uf38a\uf38b\uf38c\uf38d\uf38e\uf38f\uf390\uf391\uf392\uf393\uf394\uf395\uf396\uf397\uf398\uf399\uf39a\uf39b\uf39c\uf39d\uf39e\uf39f\uf3a0\uf3a1\uf3a2\uf3a3\uf3a4\uf3a5\uf3a6\uf3a7\uf3a8\uf3a9\uf3aa\uf3ab\uf3ac\uf3ad\uf3ae\uf3af\uf3b0\uf3b1\uf3b2\uf3b3\uf3b4\uf3b5\uf3b6\uf3b7\uf3b8\uf3b9\uf3ba\uf3bb\uf3bc\uf3bd\uf3be\uf3bf\uf3c0\uf3c1\uf3c2\uf3c3\uf3c4\uf3c5\uf3c6\uf3c7\uf3c8\uf3c9\uf3ca\uf3cb\uf3cc\uf3cd\uf3ce\uf3cf\uf3d0\uf3d1\uf3d2\uf3d3\uf3d4\uf3d5\uf3d6\uf3d7\uf3d8\uf3d9\uf3da\uf3db\uf3dc\uf3dd\uf3de\uf3df\uf3e0\uf3e1\uf3e2\uf3e3\uf3e4\uf3e5\uf3e6\uf3e7\uf3e8\uf3e9\uf3ea\uf3eb\uf3ec\uf3ed\uf3ee\uf3ef\uf3f0\uf3f1\uf3f2\uf3f3\uf3f4\uf3f5\uf3f6\uf3f7\uf3f8\uf3f9\uf3fa\uf3fb\uf3fc\uf3fd\uf3fe\uf3ff\uf400\uf401\uf402\uf403\uf404\uf405\uf406\uf407\uf408\uf409\uf40a\uf40b\uf40c\uf40d\uf40e\uf40f\uf410\uf411\uf412\uf413\uf414\uf415\uf416\uf417\uf418\uf419\uf41a\uf41b\uf41c\uf41d\uf41e\uf41f\uf420\uf421\uf422\uf423\uf424\uf425\uf426\uf427\uf428\uf429\uf42a\uf42b\uf42c\uf42d\uf42e\uf42f\uf430\uf431\uf432\uf433\uf434\uf435\uf436\uf437\uf438\uf439\uf43a\uf43b\uf43c\uf43d\uf43e\uf43f\uf440\uf441\uf442\uf443\uf444\uf445\uf446\uf447\uf448\uf449\uf44a\uf44b\uf44c\uf44d\uf44e\uf44f\uf450\uf451\uf452\uf453\uf454\uf455\uf456\uf457\uf458\uf459\uf45a\uf45b\uf45c\uf45d\uf45e\uf45f\uf460\uf461\uf462\uf463\uf464\uf465\uf466\uf467\uf468\uf469\uf46a\uf46b\uf46c\uf46d\uf46e\uf46f\uf470\uf471\uf472\uf473\uf474\uf475\uf476\uf477\uf478\uf479\uf47a\uf47b\uf47c\uf47d\uf47e\uf47f\uf480\uf481\uf482\uf483\uf484\uf485\uf486\uf487\uf488\uf489\uf48a\uf48b\uf48c\uf48d\uf48e\uf48f\uf490\uf491\uf492\uf493\uf494\uf495\uf496\uf497\uf498\uf499\uf49a\uf49b\uf49c\uf49d\uf49e\uf49f\uf4a0\uf4a1\uf4a2\uf4a3\uf4a4\uf4a5\uf4a6\uf4a7\uf4a8\uf4a9\uf4aa\uf4ab\uf4ac\uf4ad\uf4ae\uf4af\uf4b0\uf4b1\uf4b2\uf4b3\uf4b4\uf4b5\uf4b6\uf4b7\uf4b8\uf4b9\uf4ba\uf4bb\uf4bc\uf4bd\uf4be\uf4bf\uf4c0\uf4c1\uf4c2\uf4c3\uf4c4\uf4c5\uf4c6\uf4c7\uf4c8\uf4c9\uf4ca\uf4cb\uf4cc\uf4cd\uf4ce\uf4cf\uf4d0\uf4d1\uf4d2\uf4d3\uf4d4\uf4d5\uf4d6\uf4d7\uf4d8\uf4d9\uf4da\uf4db\uf4dc\uf4dd\uf4de\uf4df\uf4e0\uf4e1\uf4e2\uf4e3\uf4e4\uf4e5\uf4e6\uf4e7\uf4e8\uf4e9\uf4ea\uf4eb\uf4ec\uf4ed\uf4ee\uf4ef\uf4f0\uf4f1\uf4f2\uf4f3\uf4f4\uf4f5\uf4f6\uf4f7\uf4f8\uf4f9\uf4fa\uf4fb\uf4fc\uf4fd\uf4fe\uf4ff\uf500\uf501\uf502\uf503\uf504\uf505\uf506\uf507\uf508\uf509\uf50a\uf50b\uf50c\uf50d\uf50e\uf50f\uf510\uf511\uf512\uf513\uf514\uf515\uf516\uf517\uf518\uf519\uf51a\uf51b\uf51c\uf51d\uf51e\uf51f\uf520\uf521\uf522\uf523\uf524\uf525\uf526\uf527\uf528\uf529\uf52a\uf52b\uf52c\uf52d\uf52e\uf52f\uf530\uf531\uf532\uf533\uf534\uf535\uf536\uf537\uf538\uf539\uf53a\uf53b\uf53c\uf53d\uf53e\uf53f\uf540\uf541\uf542\uf543\uf544\uf545\uf546\uf547\uf548\uf549\uf54a\uf54b\uf54c\uf54d\uf54e\uf54f\uf550\uf551\uf552\uf553\uf554\uf555\uf556\uf557\uf558\uf559\uf55a\uf55b\uf55c\uf55d\uf55e\uf55f\uf560\uf561\uf562\uf563\uf564\uf565\uf566\uf567\uf568\uf569\uf56a\uf56b\uf56c\uf56d\uf56e\uf56f\uf570\uf571\uf572\uf573\uf574\uf575\uf576\uf577\uf578\uf579\uf57a\uf57b\uf57c\uf57d\uf57e\uf57f\uf580\uf581\uf582\uf583\uf584\uf585\uf586\uf587\uf588\uf589\uf58a\uf58b\uf58c\uf58d\uf58e\uf58f\uf590\uf591\uf592\uf593\uf594\uf595\uf596\uf597\uf598\uf599\uf59a\uf59b\uf59c\uf59d\uf59e\uf59f\uf5a0\uf5a1\uf5a2\uf5a3\uf5a4\uf5a5\uf5a6\uf5a7\uf5a8\uf5a9\uf5aa\uf5ab\uf5ac\uf5ad\uf5ae\uf5af\uf5b0\uf5b1\uf5b2\uf5b3\uf5b4\uf5b5\uf5b6\uf5b7\uf5b8\uf5b9\uf5ba\uf5bb\uf5bc\uf5bd\uf5be\uf5bf\uf5c0\uf5c1\uf5c2\uf5c3\uf5c4\uf5c5\uf5c6\uf5c7\uf5c8\uf5c9\uf5ca\uf5cb\uf5cc\uf5cd\uf5ce\uf5cf\uf5d0\uf5d1\uf5d2\uf5d3\uf5d4\uf5d5\uf5d6\uf5d7\uf5d8\uf5d9\uf5da\uf5db\uf5dc\uf5dd\uf5de\uf5df\uf5e0\uf5e1\uf5e2\uf5e3\uf5e4\uf5e5\uf5e6\uf5e7\uf5e8\uf5e9\uf5ea\uf5eb\uf5ec\uf5ed\uf5ee\uf5ef\uf5f0\uf5f1\uf5f2\uf5f3\uf5f4\uf5f5\uf5f6\uf5f7\uf5f8\uf5f9\uf5fa\uf5fb\uf5fc\uf5fd\uf5fe\uf5ff\uf600\uf601\uf602\uf603\uf604\uf605\uf606\uf607\uf608\uf609\uf60a\uf60b\uf60c\uf60d\uf60e\uf60f\uf610\uf611\uf612\uf613\uf614\uf615\uf616\uf617\uf618\uf619\uf61a\uf61b\uf61c\uf61d\uf61e\uf61f\uf620\uf621\uf622\uf623\uf624\uf625\uf626\uf627\uf628\uf629\uf62a\uf62b\uf62c\uf62d\uf62e\uf62f\uf630\uf631\uf632\uf633\uf634\uf635\uf636\uf637\uf638\uf639\uf63a\uf63b\uf63c\uf63d\uf63e\uf63f\uf640\uf641\uf642\uf643\uf644\uf645\uf646\uf647\uf648\uf649\uf64a\uf64b\uf64c\uf64d\uf64e\uf64f\uf650\uf651\uf652\uf653\uf654\uf655\uf656\uf657\uf658\uf659\uf65a\uf65b\uf65c\uf65d\uf65e\uf65f\uf660\uf661\uf662\uf663\uf664\uf665\uf666\uf667\uf668\uf669\uf66a\uf66b\uf66c\uf66d\uf66e\uf66f\uf670\uf671\uf672\uf673\uf674\uf675\uf676\uf677\uf678\uf679\uf67a\uf67b\uf67c\uf67d\uf67e\uf67f\uf680\uf681\uf682\uf683\uf684\uf685\uf686\uf687\uf688\uf689\uf68a\uf68b\uf68c\uf68d\uf68e\uf68f\uf690\uf691\uf692\uf693\uf694\uf695\uf696\uf697\uf698\uf699\uf69a\uf69b\uf69c\uf69d\uf69e\uf69f\uf6a0\uf6a1\uf6a2\uf6a3\uf6a4\uf6a5\uf6a6\uf6a7\uf6a8\uf6a9\uf6aa\uf6ab\uf6ac\uf6ad\uf6ae\uf6af\uf6b0\uf6b1\uf6b2\uf6b3\uf6b4\uf6b5\uf6b6\uf6b7\uf6b8\uf6b9\uf6ba\uf6bb\uf6bc\uf6bd\uf6be\uf6bf\uf6c0\uf6c1\uf6c2\uf6c3\uf6c4\uf6c5\uf6c6\uf6c7\uf6c8\uf6c9\uf6ca\uf6cb\uf6cc\uf6cd\uf6ce\uf6cf\uf6d0\uf6d1\uf6d2\uf6d3\uf6d4\uf6d5\uf6d6\uf6d7\uf6d8\uf6d9\uf6da\uf6db\uf6dc\uf6dd\uf6de\uf6df\uf6e0\uf6e1\uf6e2\uf6e3\uf6e4\uf6e5\uf6e6\uf6e7\uf6e8\uf6e9\uf6ea\uf6eb\uf6ec\uf6ed\uf6ee\uf6ef\uf6f0\uf6f1\uf6f2\uf6f3\uf6f4\uf6f5\uf6f6\uf6f7\uf6f8\uf6f9\uf6fa\uf6fb\uf6fc\uf6fd\uf6fe\uf6ff\uf700\uf701\uf702\uf703\uf704\uf705\uf706\uf707\uf708\uf709\uf70a\uf70b\uf70c\uf70d\uf70e\uf70f\uf710\uf711\uf712\uf713\uf714\uf715\uf716\uf717\uf718\uf719\uf71a\uf71b\uf71c\uf71d\uf71e\uf71f\uf720\uf721\uf722\uf723\uf724\uf725\uf726\uf727\uf728\uf729\uf72a\uf72b\uf72c\uf72d\uf72e\uf72f\uf730\uf731\uf732\uf733\uf734\uf735\uf736\uf737\uf738\uf739\uf73a\uf73b\uf73c\uf73d\uf73e\uf73f\uf740\uf741\uf742\uf743\uf744\uf745\uf746\uf747\uf748\uf749\uf74a\uf74b\uf74c\uf74d\uf74e\uf74f\uf750\uf751\uf752\uf753\uf754\uf755\uf756\uf757\uf758\uf759\uf75a\uf75b\uf75c\uf75d\uf75e\uf75f\uf760\uf761\uf762\uf763\uf764\uf765\uf766\uf767\uf768\uf769\uf76a\uf76b\uf76c\uf76d\uf76e\uf76f\uf770\uf771\uf772\uf773\uf774\uf775\uf776\uf777\uf778\uf779\uf77a\uf77b\uf77c\uf77d\uf77e\uf77f\uf780\uf781\uf782\uf783\uf784\uf785\uf786\uf787\uf788\uf789\uf78a\uf78b\uf78c\uf78d\uf78e\uf78f\uf790\uf791\uf792\uf793\uf794\uf795\uf796\uf797\uf798\uf799\uf79a\uf79b\uf79c\uf79d\uf79e\uf79f\uf7a0\uf7a1\uf7a2\uf7a3\uf7a4\uf7a5\uf7a6\uf7a7\uf7a8\uf7a9\uf7aa\uf7ab\uf7ac\uf7ad\uf7ae\uf7af\uf7b0\uf7b1\uf7b2\uf7b3\uf7b4\uf7b5\uf7b6\uf7b7\uf7b8\uf7b9\uf7ba\uf7bb\uf7bc\uf7bd\uf7be\uf7bf\uf7c0\uf7c1\uf7c2\uf7c3\uf7c4\uf7c5\uf7c6\uf7c7\uf7c8\uf7c9\uf7ca\uf7cb\uf7cc\uf7cd\uf7ce\uf7cf\uf7d0\uf7d1\uf7d2\uf7d3\uf7d4\uf7d5\uf7d6\uf7d7\uf7d8\uf7d9\uf7da\uf7db\uf7dc\uf7dd\uf7de\uf7df\uf7e0\uf7e1\uf7e2\uf7e3\uf7e4\uf7e5\uf7e6\uf7e7\uf7e8\uf7e9\uf7ea\uf7eb\uf7ec\uf7ed\uf7ee\uf7ef\uf7f0\uf7f1\uf7f2\uf7f3\uf7f4\uf7f5\uf7f6\uf7f7\uf7f8\uf7f9\uf7fa\uf7fb\uf7fc\uf7fd\uf7fe\uf7ff\uf800\uf801\uf802\uf803\uf804\uf805\uf806\uf807\uf808\uf809\uf80a\uf80b\uf80c\uf80d\uf80e\uf80f\uf810\uf811\uf812\uf813\uf814\uf815\uf816\uf817\uf818\uf819\uf81a\uf81b\uf81c\uf81d\uf81e\uf81f\uf820\uf821\uf822\uf823\uf824\uf825\uf826\uf827\uf828\uf829\uf82a\uf82b\uf82c\uf82d\uf82e\uf82f\uf830\uf831\uf832\uf833\uf834\uf835\uf836\uf837\uf838\uf839\uf83a\uf83b\uf83c\uf83d\uf83e\uf83f\uf840\uf841\uf842\uf843\uf844\uf845\uf846\uf847\uf848\uf849\uf84a\uf84b\uf84c\uf84d\uf84e\uf84f\uf850\uf851\uf852\uf853\uf854\uf855\uf856\uf857\uf858\uf859\uf85a\uf85b\uf85c\uf85d\uf85e\uf85f\uf860\uf861\uf862\uf863\uf864\uf865\uf866\uf867\uf868\uf869\uf86a\uf86b\uf86c\uf86d\uf86e\uf86f\uf870\uf871\uf872\uf873\uf874\uf875\uf876\uf877\uf878\uf879\uf87a\uf87b\uf87c\uf87d\uf87e\uf87f\uf880\uf881\uf882\uf883\uf884\uf885\uf886\uf887\uf888\uf889\uf88a\uf88b\uf88c\uf88d\uf88e\uf88f\uf890\uf891\uf892\uf893\uf894\uf895\uf896\uf897\uf898\uf899\uf89a\uf89b\uf89c\uf89d\uf89e\uf89f\uf8a0\uf8a1\uf8a2\uf8a3\uf8a4\uf8a5\uf8a6\uf8a7\uf8a8\uf8a9\uf8aa\uf8ab\uf8ac\uf8ad\uf8ae\uf8af\uf8b0\uf8b1\uf8b2\uf8b3\uf8b4\uf8b5\uf8b6\uf8b7\uf8b8\uf8b9\uf8ba\uf8bb\uf8bc\uf8bd\uf8be\uf8bf\uf8c0\uf8c1\uf8c2\uf8c3\uf8c4\uf8c5\uf8c6\uf8c7\uf8c8\uf8c9\uf8ca\uf8cb\uf8cc\uf8cd\uf8ce\uf8cf\uf8d0\uf8d1\uf8d2\uf8d3\uf8d4\uf8d5\uf8d6\uf8d7\uf8d8\uf8d9\uf8da\uf8db\uf8dc\uf8dd\uf8de\uf8df\uf8e0\uf8e1\uf8e2\uf8e3\uf8e4\uf8e5\uf8e6\uf8e7\uf8e8\uf8e9\uf8ea\uf8eb\uf8ec\uf8ed\uf8ee\uf8ef\uf8f0\uf8f1\uf8f2\uf8f3\uf8f4\uf8f5\uf8f6\uf8f7\uf8f8\uf8f9\uf8fa\uf8fb\uf8fc\uf8fd\uf8fe\uf8ff'
-
-try:
-    Cs = eval(r"'\ud800\ud801\ud802\ud803\ud804\ud805\ud806\ud807\ud808\ud809\ud80a\ud80b\ud80c\ud80d\ud80e\ud80f\ud810\ud811\ud812\ud813\ud814\ud815\ud816\ud817\ud818\ud819\ud81a\ud81b\ud81c\ud81d\ud81e\ud81f\ud820\ud821\ud822\ud823\ud824\ud825\ud826\ud827\ud828\ud829\ud82a\ud82b\ud82c\ud82d\ud82e\ud82f\ud830\ud831\ud832\ud833\ud834\ud835\ud836\ud837\ud838\ud839\ud83a\ud83b\ud83c\ud83d\ud83e\ud83f\ud840\ud841\ud842\ud843\ud844\ud845\ud846\ud847\ud848\ud849\ud84a\ud84b\ud84c\ud84d\ud84e\ud84f\ud850\ud851\ud852\ud853\ud854\ud855\ud856\ud857\ud858\ud859\ud85a\ud85b\ud85c\ud85d\ud85e\ud85f\ud860\ud861\ud862\ud863\ud864\ud865\ud866\ud867\ud868\ud869\ud86a\ud86b\ud86c\ud86d\ud86e\ud86f\ud870\ud871\ud872\ud873\ud874\ud875\ud876\ud877\ud878\ud879\ud87a\ud87b\ud87c\ud87d\ud87e\ud87f\ud880\ud881\ud882\ud883\ud884\ud885\ud886\ud887\ud888\ud889\ud88a\ud88b\ud88c\ud88d\ud88e\ud88f\ud890\ud891\ud892\ud893\ud894\ud895\ud896\ud897\ud898\ud899\ud89a\ud89b\ud89c\ud89d\ud89e\ud89f\ud8a0\ud8a1\ud8a2\ud8a3\ud8a4\ud8a5\ud8a6\ud8a7\ud8a8\ud8a9\ud8aa\ud8ab\ud8ac\ud8ad\ud8ae\ud8af\ud8b0\ud8b1\ud8b2\ud8b3\ud8b4\ud8b5\ud8b6\ud8b7\ud8b8\ud8b9\ud8ba\ud8bb\ud8bc\ud8bd\ud8be\ud8bf\ud8c0\ud8c1\ud8c2\ud8c3\ud8c4\ud8c5\ud8c6\ud8c7\ud8c8\ud8c9\ud8ca\ud8cb\ud8cc\ud8cd\ud8ce\ud8cf\ud8d0\ud8d1\ud8d2\ud8d3\ud8d4\ud8d5\ud8d6\ud8d7\ud8d8\ud8d9\ud8da\ud8db\ud8dc\ud8dd\ud8de\ud8df\ud8e0\ud8e1\ud8e2\ud8e3\ud8e4\ud8e5\ud8e6\ud8e7\ud8e8\ud8e9\ud8ea\ud8eb\ud8ec\ud8ed\ud8ee\ud8ef\ud8f0\ud8f1\ud8f2\ud8f3\ud8f4\ud8f5\ud8f6\ud8f7\ud8f8\ud8f9\ud8fa\ud8fb\ud8fc\ud8fd\ud8fe\ud8ff\ud900\ud901\ud902\ud903\ud904\ud905\ud906\ud907\ud908\ud909\ud90a\ud90b\ud90c\ud90d\ud90e\ud90f\ud910\ud911\ud912\ud913\ud914\ud915\ud916\ud917\ud918\ud919\ud91a\ud91b\ud91c\ud91d\ud91e\ud91f\ud920\ud921\ud922\ud923\ud924\ud925\ud926\ud927\ud928\ud929\ud92a\ud92b\ud92c\ud92d\ud92e\ud92f\ud930\ud931\ud932\ud933\ud934\ud935\ud936\ud937\ud938\ud939\ud93a\ud93b\ud93c\ud93d\ud93e\ud93f\ud940\ud941\ud942\ud943\ud944\ud945\ud946\ud947\ud948\ud949\ud94a\ud94b\ud94c\ud94d\ud94e\ud94f\ud950\ud951\ud952\ud953\ud954\ud955\ud956\ud957\ud958\ud959\ud95a\ud95b\ud95c\ud95d\ud95e\ud95f\ud960\ud961\ud962\ud963\ud964\ud965\ud966\ud967\ud968\ud969\ud96a\ud96b\ud96c\ud96d\ud96e\ud96f\ud970\ud971\ud972\ud973\ud974\ud975\ud976\ud977\ud978\ud979\ud97a\ud97b\ud97c\ud97d\ud97e\ud97f\ud980\ud981\ud982\ud983\ud984\ud985\ud986\ud987\ud988\ud989\ud98a\ud98b\ud98c\ud98d\ud98e\ud98f\ud990\ud991\ud992\ud993\ud994\ud995\ud996\ud997\ud998\ud999\ud99a\ud99b\ud99c\ud99d\ud99e\ud99f\ud9a0\ud9a1\ud9a2\ud9a3\ud9a4\ud9a5\ud9a6\ud9a7\ud9a8\ud9a9\ud9aa\ud9ab\ud9ac\ud9ad\ud9ae\ud9af\ud9b0\ud9b1\ud9b2\ud9b3\ud9b4\ud9b5\ud9b6\ud9b7\ud9b8\ud9b9\ud9ba\ud9bb\ud9bc\ud9bd\ud9be\ud9bf\ud9c0\ud9c1\ud9c2\ud9c3\ud9c4\ud9c5\ud9c6\ud9c7\ud9c8\ud9c9\ud9ca\ud9cb\ud9cc\ud9cd\ud9ce\ud9cf\ud9d0\ud9d1\ud9d2\ud9d3\ud9d4\ud9d5\ud9d6\ud9d7\ud9d8\ud9d9\ud9da\ud9db\ud9dc\ud9dd\ud9de\ud9df\ud9e0\ud9e1\ud9e2\ud9e3\ud9e4\ud9e5\ud9e6\ud9e7\ud9e8\ud9e9\ud9ea\ud9eb\ud9ec\ud9ed\ud9ee\ud9ef\ud9f0\ud9f1\ud9f2\ud9f3\ud9f4\ud9f5\ud9f6\ud9f7\ud9f8\ud9f9\ud9fa\ud9fb\ud9fc\ud9fd\ud9fe\ud9ff\uda00\uda01\uda02\uda03\uda04\uda05\uda06\uda07\uda08\uda09\uda0a\uda0b\uda0c\uda0d\uda0e\uda0f\uda10\uda11\uda12\uda13\uda14\uda15\uda16\uda17\uda18\uda19\uda1a\uda1b\uda1c\uda1d\uda1e\uda1f\uda20\uda21\uda22\uda23\uda24\uda25\uda26\uda27\uda28\uda29\uda2a\uda2b\uda2c\uda2d\uda2e\uda2f\uda30\uda31\uda32\uda33\uda34\uda35\uda36\uda37\uda38\uda39\uda3a\uda3b\uda3c\uda3d\uda3e\uda3f\uda40\uda41\uda42\uda43\uda44\uda45\uda46\uda47\uda48\uda49\uda4a\uda4b\uda4c\uda4d\uda4e\uda4f\uda50\uda51\uda52\uda53\uda54\uda55\uda56\uda57\uda58\uda59\uda5a\uda5b\uda5c\uda5d\uda5e\uda5f\uda60\uda61\uda62\uda63\uda64\uda65\uda66\uda67\uda68\uda69\uda6a\uda6b\uda6c\uda6d\uda6e\uda6f\uda70\uda71\uda72\uda73\uda74\uda75\uda76\uda77\uda78\uda79\uda7a\uda7b\uda7c\uda7d\uda7e\uda7f\uda80\uda81\uda82\uda83\uda84\uda85\uda86\uda87\uda88\uda89\uda8a\uda8b\uda8c\uda8d\uda8e\uda8f\uda90\uda91\uda92\uda93\uda94\uda95\uda96\uda97\uda98\uda99\uda9a\uda9b\uda9c\uda9d\uda9e\uda9f\udaa0\udaa1\udaa2\udaa3\udaa4\udaa5\udaa6\udaa7\udaa8\udaa9\udaaa\udaab\udaac\udaad\udaae\udaaf\udab0\udab1\udab2\udab3\udab4\udab5\udab6\udab7\udab8\udab9\udaba\udabb\udabc\udabd\udabe\udabf\udac0\udac1\udac2\udac3\udac4\udac5\udac6\udac7\udac8\udac9\udaca\udacb\udacc\udacd\udace\udacf\udad0\udad1\udad2\udad3\udad4\udad5\udad6\udad7\udad8\udad9\udada\udadb\udadc\udadd\udade\udadf\udae0\udae1\udae2\udae3\udae4\udae5\udae6\udae7\udae8\udae9\udaea\udaeb\udaec\udaed\udaee\udaef\udaf0\udaf1\udaf2\udaf3\udaf4\udaf5\udaf6\udaf7\udaf8\udaf9\udafa\udafb\udafc\udafd\udafe\udaff\udb00\udb01\udb02\udb03\udb04\udb05\udb06\udb07\udb08\udb09\udb0a\udb0b\udb0c\udb0d\udb0e\udb0f\udb10\udb11\udb12\udb13\udb14\udb15\udb16\udb17\udb18\udb19\udb1a\udb1b\udb1c\udb1d\udb1e\udb1f\udb20\udb21\udb22\udb23\udb24\udb25\udb26\udb27\udb28\udb29\udb2a\udb2b\udb2c\udb2d\udb2e\udb2f\udb30\udb31\udb32\udb33\udb34\udb35\udb36\udb37\udb38\udb39\udb3a\udb3b\udb3c\udb3d\udb3e\udb3f\udb40\udb41\udb42\udb43\udb44\udb45\udb46\udb47\udb48\udb49\udb4a\udb4b\udb4c\udb4d\udb4e\udb4f\udb50\udb51\udb52\udb53\udb54\udb55\udb56\udb57\udb58\udb59\udb5a\udb5b\udb5c\udb5d\udb5e\udb5f\udb60\udb61\udb62\udb63\udb64\udb65\udb66\udb67\udb68\udb69\udb6a\udb6b\udb6c\udb6d\udb6e\udb6f\udb70\udb71\udb72\udb73\udb74\udb75\udb76\udb77\udb78\udb79\udb7a\udb7b\udb7c\udb7d\udb7e\udb7f\udb80\udb81\udb82\udb83\udb84\udb85\udb86\udb87\udb88\udb89\udb8a\udb8b\udb8c\udb8d\udb8e\udb8f\udb90\udb91\udb92\udb93\udb94\udb95\udb96\udb97\udb98\udb99\udb9a\udb9b\udb9c\udb9d\udb9e\udb9f\udba0\udba1\udba2\udba3\udba4\udba5\udba6\udba7\udba8\udba9\udbaa\udbab\udbac\udbad\udbae\udbaf\udbb0\udbb1\udbb2\udbb3\udbb4\udbb5\udbb6\udbb7\udbb8\udbb9\udbba\udbbb\udbbc\udbbd\udbbe\udbbf\udbc0\udbc1\udbc2\udbc3\udbc4\udbc5\udbc6\udbc7\udbc8\udbc9\udbca\udbcb\udbcc\udbcd\udbce\udbcf\udbd0\udbd1\udbd2\udbd3\udbd4\udbd5\udbd6\udbd7\udbd8\udbd9\udbda\udbdb\udbdc\udbdd\udbde\udbdf\udbe0\udbe1\udbe2\udbe3\udbe4\udbe5\udbe6\udbe7\udbe8\udbe9\udbea\udbeb\udbec\udbed\udbee\udbef\udbf0\udbf1\udbf2\udbf3\udbf4\udbf5\udbf6\udbf7\udbf8\udbf9\udbfa\udbfb\udbfc\udbfd\udbfe\U0010fc00\udc01\udc02\udc03\udc04\udc05\udc06\udc07\udc08\udc09\udc0a\udc0b\udc0c\udc0d\udc0e\udc0f\udc10\udc11\udc12\udc13\udc14\udc15\udc16\udc17\udc18\udc19\udc1a\udc1b\udc1c\udc1d\udc1e\udc1f\udc20\udc21\udc22\udc23\udc24\udc25\udc26\udc27\udc28\udc29\udc2a\udc2b\udc2c\udc2d\udc2e\udc2f\udc30\udc31\udc32\udc33\udc34\udc35\udc36\udc37\udc38\udc39\udc3a\udc3b\udc3c\udc3d\udc3e\udc3f\udc40\udc41\udc42\udc43\udc44\udc45\udc46\udc47\udc48\udc49\udc4a\udc4b\udc4c\udc4d\udc4e\udc4f\udc50\udc51\udc52\udc53\udc54\udc55\udc56\udc57\udc58\udc59\udc5a\udc5b\udc5c\udc5d\udc5e\udc5f\udc60\udc61\udc62\udc63\udc64\udc65\udc66\udc67\udc68\udc69\udc6a\udc6b\udc6c\udc6d\udc6e\udc6f\udc70\udc71\udc72\udc73\udc74\udc75\udc76\udc77\udc78\udc79\udc7a\udc7b\udc7c\udc7d\udc7e\udc7f\udc80\udc81\udc82\udc83\udc84\udc85\udc86\udc87\udc88\udc89\udc8a\udc8b\udc8c\udc8d\udc8e\udc8f\udc90\udc91\udc92\udc93\udc94\udc95\udc96\udc97\udc98\udc99\udc9a\udc9b\udc9c\udc9d\udc9e\udc9f\udca0\udca1\udca2\udca3\udca4\udca5\udca6\udca7\udca8\udca9\udcaa\udcab\udcac\udcad\udcae\udcaf\udcb0\udcb1\udcb2\udcb3\udcb4\udcb5\udcb6\udcb7\udcb8\udcb9\udcba\udcbb\udcbc\udcbd\udcbe\udcbf\udcc0\udcc1\udcc2\udcc3\udcc4\udcc5\udcc6\udcc7\udcc8\udcc9\udcca\udccb\udccc\udccd\udcce\udccf\udcd0\udcd1\udcd2\udcd3\udcd4\udcd5\udcd6\udcd7\udcd8\udcd9\udcda\udcdb\udcdc\udcdd\udcde\udcdf\udce0\udce1\udce2\udce3\udce4\udce5\udce6\udce7\udce8\udce9\udcea\udceb\udcec\udced\udcee\udcef\udcf0\udcf1\udcf2\udcf3\udcf4\udcf5\udcf6\udcf7\udcf8\udcf9\udcfa\udcfb\udcfc\udcfd\udcfe\udcff\udd00\udd01\udd02\udd03\udd04\udd05\udd06\udd07\udd08\udd09\udd0a\udd0b\udd0c\udd0d\udd0e\udd0f\udd10\udd11\udd12\udd13\udd14\udd15\udd16\udd17\udd18\udd19\udd1a\udd1b\udd1c\udd1d\udd1e\udd1f\udd20\udd21\udd22\udd23\udd24\udd25\udd26\udd27\udd28\udd29\udd2a\udd2b\udd2c\udd2d\udd2e\udd2f\udd30\udd31\udd32\udd33\udd34\udd35\udd36\udd37\udd38\udd39\udd3a\udd3b\udd3c\udd3d\udd3e\udd3f\udd40\udd41\udd42\udd43\udd44\udd45\udd46\udd47\udd48\udd49\udd4a\udd4b\udd4c\udd4d\udd4e\udd4f\udd50\udd51\udd52\udd53\udd54\udd55\udd56\udd57\udd58\udd59\udd5a\udd5b\udd5c\udd5d\udd5e\udd5f\udd60\udd61\udd62\udd63\udd64\udd65\udd66\udd67\udd68\udd69\udd6a\udd6b\udd6c\udd6d\udd6e\udd6f\udd70\udd71\udd72\udd73\udd74\udd75\udd76\udd77\udd78\udd79\udd7a\udd7b\udd7c\udd7d\udd7e\udd7f\udd80\udd81\udd82\udd83\udd84\udd85\udd86\udd87\udd88\udd89\udd8a\udd8b\udd8c\udd8d\udd8e\udd8f\udd90\udd91\udd92\udd93\udd94\udd95\udd96\udd97\udd98\udd99\udd9a\udd9b\udd9c\udd9d\udd9e\udd9f\udda0\udda1\udda2\udda3\udda4\udda5\udda6\udda7\udda8\udda9\uddaa\uddab\uddac\uddad\uddae\uddaf\uddb0\uddb1\uddb2\uddb3\uddb4\uddb5\uddb6\uddb7\uddb8\uddb9\uddba\uddbb\uddbc\uddbd\uddbe\uddbf\uddc0\uddc1\uddc2\uddc3\uddc4\uddc5\uddc6\uddc7\uddc8\uddc9\uddca\uddcb\uddcc\uddcd\uddce\uddcf\uddd0\uddd1\uddd2\uddd3\uddd4\uddd5\uddd6\uddd7\uddd8\uddd9\uddda\udddb\udddc\udddd\uddde\udddf\udde0\udde1\udde2\udde3\udde4\udde5\udde6\udde7\udde8\udde9\uddea\uddeb\uddec\udded\uddee\uddef\uddf0\uddf1\uddf2\uddf3\uddf4\uddf5\uddf6\uddf7\uddf8\uddf9\uddfa\uddfb\uddfc\uddfd\uddfe\uddff\ude00\ude01\ude02\ude03\ude04\ude05\ude06\ude07\ude08\ude09\ude0a\ude0b\ude0c\ude0d\ude0e\ude0f\ude10\ude11\ude12\ude13\ude14\ude15\ude16\ude17\ude18\ude19\ude1a\ude1b\ude1c\ude1d\ude1e\ude1f\ude20\ude21\ude22\ude23\ude24\ude25\ude26\ude27\ude28\ude29\ude2a\ude2b\ude2c\ude2d\ude2e\ude2f\ude30\ude31\ude32\ude33\ude34\ude35\ude36\ude37\ude38\ude39\ude3a\ude3b\ude3c\ude3d\ude3e\ude3f\ude40\ude41\ude42\ude43\ude44\ude45\ude46\ude47\ude48\ude49\ude4a\ude4b\ude4c\ude4d\ude4e\ude4f\ude50\ude51\ude52\ude53\ude54\ude55\ude56\ude57\ude58\ude59\ude5a\ude5b\ude5c\ude5d\ude5e\ude5f\ude60\ude61\ude62\ude63\ude64\ude65\ude66\ude67\ude68\ude69\ude6a\ude6b\ude6c\ude6d\ude6e\ude6f\ude70\ude71\ude72\ude73\ude74\ude75\ude76\ude77\ude78\ude79\ude7a\ude7b\ude7c\ude7d\ude7e\ude7f\ude80\ude81\ude82\ude83\ude84\ude85\ude86\ude87\ude88\ude89\ude8a\ude8b\ude8c\ude8d\ude8e\ude8f\ude90\ude91\ude92\ude93\ude94\ude95\ude96\ude97\ude98\ude99\ude9a\ude9b\ude9c\ude9d\ude9e\ude9f\udea0\udea1\udea2\udea3\udea4\udea5\udea6\udea7\udea8\udea9\udeaa\udeab\udeac\udead\udeae\udeaf\udeb0\udeb1\udeb2\udeb3\udeb4\udeb5\udeb6\udeb7\udeb8\udeb9\udeba\udebb\udebc\udebd\udebe\udebf\udec0\udec1\udec2\udec3\udec4\udec5\udec6\udec7\udec8\udec9\udeca\udecb\udecc\udecd\udece\udecf\uded0\uded1\uded2\uded3\uded4\uded5\uded6\uded7\uded8\uded9\udeda\udedb\udedc\udedd\udede\udedf\udee0\udee1\udee2\udee3\udee4\udee5\udee6\udee7\udee8\udee9\udeea\udeeb\udeec\udeed\udeee\udeef\udef0\udef1\udef2\udef3\udef4\udef5\udef6\udef7\udef8\udef9\udefa\udefb\udefc\udefd\udefe\udeff\udf00\udf01\udf02\udf03\udf04\udf05\udf06\udf07\udf08\udf09\udf0a\udf0b\udf0c\udf0d\udf0e\udf0f\udf10\udf11\udf12\udf13\udf14\udf15\udf16\udf17\udf18\udf19\udf1a\udf1b\udf1c\udf1d\udf1e\udf1f\udf20\udf21\udf22\udf23\udf24\udf25\udf26\udf27\udf28\udf29\udf2a\udf2b\udf2c\udf2d\udf2e\udf2f\udf30\udf31\udf32\udf33\udf34\udf35\udf36\udf37\udf38\udf39\udf3a\udf3b\udf3c\udf3d\udf3e\udf3f\udf40\udf41\udf42\udf43\udf44\udf45\udf46\udf47\udf48\udf49\udf4a\udf4b\udf4c\udf4d\udf4e\udf4f\udf50\udf51\udf52\udf53\udf54\udf55\udf56\udf57\udf58\udf59\udf5a\udf5b\udf5c\udf5d\udf5e\udf5f\udf60\udf61\udf62\udf63\udf64\udf65\udf66\udf67\udf68\udf69\udf6a\udf6b\udf6c\udf6d\udf6e\udf6f\udf70\udf71\udf72\udf73\udf74\udf75\udf76\udf77\udf78\udf79\udf7a\udf7b\udf7c\udf7d\udf7e\udf7f\udf80\udf81\udf82\udf83\udf84\udf85\udf86\udf87\udf88\udf89\udf8a\udf8b\udf8c\udf8d\udf8e\udf8f\udf90\udf91\udf92\udf93\udf94\udf95\udf96\udf97\udf98\udf99\udf9a\udf9b\udf9c\udf9d\udf9e\udf9f\udfa0\udfa1\udfa2\udfa3\udfa4\udfa5\udfa6\udfa7\udfa8\udfa9\udfaa\udfab\udfac\udfad\udfae\udfaf\udfb0\udfb1\udfb2\udfb3\udfb4\udfb5\udfb6\udfb7\udfb8\udfb9\udfba\udfbb\udfbc\udfbd\udfbe\udfbf\udfc0\udfc1\udfc2\udfc3\udfc4\udfc5\udfc6\udfc7\udfc8\udfc9\udfca\udfcb\udfcc\udfcd\udfce\udfcf\udfd0\udfd1\udfd2\udfd3\udfd4\udfd5\udfd6\udfd7\udfd8\udfd9\udfda\udfdb\udfdc\udfdd\udfde\udfdf\udfe0\udfe1\udfe2\udfe3\udfe4\udfe5\udfe6\udfe7\udfe8\udfe9\udfea\udfeb\udfec\udfed\udfee\udfef\udff0\udff1\udff2\udff3\udff4\udff5\udff6\udff7\udff8\udff9\udffa\udffb\udffc\udffd\udffe\udfff'")
-except UnicodeDecodeError:
-    Cs = '' # Jython can't handle isolated surrogates
-
-Ll = u'abcdefghijklmnopqrstuvwxyz\xaa\xb5\xba\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff\u0101\u0103\u0105\u0107\u0109\u010b\u010d\u010f\u0111\u0113\u0115\u0117\u0119\u011b\u011d\u011f\u0121\u0123\u0125\u0127\u0129\u012b\u012d\u012f\u0131\u0133\u0135\u0137\u0138\u013a\u013c\u013e\u0140\u0142\u0144\u0146\u0148\u0149\u014b\u014d\u014f\u0151\u0153\u0155\u0157\u0159\u015b\u015d\u015f\u0161\u0163\u0165\u0167\u0169\u016b\u016d\u016f\u0171\u0173\u0175\u0177\u017a\u017c\u017e\u017f\u0180\u0183\u0185\u0188\u018c\u018d\u0192\u0195\u0199\u019a\u019b\u019e\u01a1\u01a3\u01a5\u01a8\u01aa\u01ab\u01ad\u01b0\u01b4\u01b6\u01b9\u01ba\u01bd\u01be\u01bf\u01c6\u01c9\u01cc\u01ce\u01d0\u01d2\u01d4\u01d6\u01d8\u01da\u01dc\u01dd\u01df\u01e1\u01e3\u01e5\u01e7\u01e9\u01eb\u01ed\u01ef\u01f0\u01f3\u01f5\u01f9\u01fb\u01fd\u01ff\u0201\u0203\u0205\u0207\u0209\u020b\u020d\u020f\u0211\u0213\u0215\u0217\u0219\u021b\u021d\u021f\u0221\u0223\u0225\u0227\u0229\u022b\u022d\u022f\u0231\u0233\u0234\u0235\u0236\u0237\u0238\u0239\u023c\u023f\u0240\u0250\u0251\u0252\u0253\u0254\u0255\u0256\u0257\u0258\u0259\u025a\u025b\u025c\u025d\u025e\u025f\u0260\u0261\u0262\u0263\u0264\u0265\u0266\u0267\u0268\u0269\u026a\u026b\u026c\u026d\u026e\u026f\u0270\u0271\u0272\u0273\u0274\u0275\u0276\u0277\u0278\u0279\u027a\u027b\u027c\u027d\u027e\u027f\u0280\u0281\u0282\u0283\u0284\u0285\u0286\u0287\u0288\u0289\u028a\u028b\u028c\u028d\u028e\u028f\u0290\u0291\u0292\u0293\u0294\u0295\u0296\u0297\u0298\u0299\u029a\u029b\u029c\u029d\u029e\u029f\u02a0\u02a1\u02a2\u02a3\u02a4\u02a5\u02a6\u02a7\u02a8\u02a9\u02aa\u02ab\u02ac\u02ad\u02ae\u02af\u0390\u03ac\u03ad\u03ae\u03af\u03b0\u03b1\u03b2\u03b3\u03b4\u03b5\u03b6\u03b7\u03b8\u03b9\u03ba\u03bb\u03bc\u03bd\u03be\u03bf\u03c0\u03c1\u03c2\u03c3\u03c4\u03c5\u03c6\u03c7\u03c8\u03c9\u03ca\u03cb\u03cc\u03cd\u03ce\u03d0\u03d1\u03d5\u03d6\u03d7\u03d9\u03db\u03dd\u03df\u03e1\u03e3\u03e5\u03e7\u03e9\u03eb\u03ed\u03ef\u03f0\u03f1\u03f2\u03f3\u03f5\u03f8\u03fb\u03fc\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u0439\u043a\u043b\u043c\u043d\u043e\u043f\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044a\u044b\u044c\u044d\u044e\u044f\u0450\u0451\u0452\u0453\u0454\u0455\u0456\u0457\u0458\u0459\u045a\u045b\u045c\u045d\u045e\u045f\u0461\u0463\u0465\u0467\u0469\u046b\u046d\u046f\u0471\u0473\u0475\u0477\u0479\u047b\u047d\u047f\u0481\u048b\u048d\u048f\u0491\u0493\u0495\u0497\u0499\u049b\u049d\u049f\u04a1\u04a3\u04a5\u04a7\u04a9\u04ab\u04ad\u04af\u04b1\u04b3\u04b5\u04b7\u04b9\u04bb\u04bd\u04bf\u04c2\u04c4\u04c6\u04c8\u04ca\u04cc\u04ce\u04d1\u04d3\u04d5\u04d7\u04d9\u04db\u04dd\u04df\u04e1\u04e3\u04e5\u04e7\u04e9\u04eb\u04ed\u04ef\u04f1\u04f3\u04f5\u04f7\u04f9\u0501\u0503\u0505\u0507\u0509\u050b\u050d\u050f\u0561\u0562\u0563\u0564\u0565\u0566\u0567\u0568\u0569\u056a\u056b\u056c\u056d\u056e\u056f\u0570\u0571\u0572\u0573\u0574\u0575\u0576\u0577\u0578\u0579\u057a\u057b\u057c\u057d\u057e\u057f\u0580\u0581\u0582\u0583\u0584\u0585\u0586\u0587\u1d00\u1d01\u1d02\u1d03\u1d04\u1d05\u1d06\u1d07\u1d08\u1d09\u1d0a\u1d0b\u1d0c\u1d0d\u1d0e\u1d0f\u1d10\u1d11\u1d12\u1d13\u1d14\u1d15\u1d16\u1d17\u1d18\u1d19\u1d1a\u1d1b\u1d1c\u1d1d\u1d1e\u1d1f\u1d20\u1d21\u1d22\u1d23\u1d24\u1d25\u1d26\u1d27\u1d28\u1d29\u1d2a\u1d2b\u1d62\u1d63\u1d64\u1d65\u1d66\u1d67\u1d68\u1d69\u1d6a\u1d6b\u1d6c\u1d6d\u1d6e\u1d6f\u1d70\u1d71\u1d72\u1d73\u1d74\u1d75\u1d76\u1d77\u1d79\u1d7a\u1d7b\u1d7c\u1d7d\u1d7e\u1d7f\u1d80\u1d81\u1d82\u1d83\u1d84\u1d85\u1d86\u1d87\u1d88\u1d89\u1d8a\u1d8b\u1d8c\u1d8d\u1d8e\u1d8f\u1d90\u1d91\u1d92\u1d93\u1d94\u1d95\u1d96\u1d97\u1d98\u1d99\u1d9a\u1e01\u1e03\u1e05\u1e07\u1e09\u1e0b\u1e0d\u1e0f\u1e11\u1e13\u1e15\u1e17\u1e19\u1e1b\u1e1d\u1e1f\u1e21\u1e23\u1e25\u1e27\u1e29\u1e2b\u1e2d\u1e2f\u1e31\u1e33\u1e35\u1e37\u1e39\u1e3b\u1e3d\u1e3f\u1e41\u1e43\u1e45\u1e47\u1e49\u1e4b\u1e4d\u1e4f\u1e51\u1e53\u1e55\u1e57\u1e59\u1e5b\u1e5d\u1e5f\u1e61\u1e63\u1e65\u1e67\u1e69\u1e6b\u1e6d\u1e6f\u1e71\u1e73\u1e75\u1e77\u1e79\u1e7b\u1e7d\u1e7f\u1e81\u1e83\u1e85\u1e87\u1e89\u1e8b\u1e8d\u1e8f\u1e91\u1e93\u1e95\u1e96\u1e97\u1e98\u1e99\u1e9a\u1e9b\u1ea1\u1ea3\u1ea5\u1ea7\u1ea9\u1eab\u1ead\u1eaf\u1eb1\u1eb3\u1eb5\u1eb7\u1eb9\u1ebb\u1ebd\u1ebf\u1ec1\u1ec3\u1ec5\u1ec7\u1ec9\u1ecb\u1ecd\u1ecf\u1ed1\u1ed3\u1ed5\u1ed7\u1ed9\u1edb\u1edd\u1edf\u1ee1\u1ee3\u1ee5\u1ee7\u1ee9\u1eeb\u1eed\u1eef\u1ef1\u1ef3\u1ef5\u1ef7\u1ef9\u1f00\u1f01\u1f02\u1f03\u1f04\u1f05\u1f06\u1f07\u1f10\u1f11\u1f12\u1f13\u1f14\u1f15\u1f20\u1f21\u1f22\u1f23\u1f24\u1f25\u1f26\u1f27\u1f30\u1f31\u1f32\u1f33\u1f34\u1f35\u1f36\u1f37\u1f40\u1f41\u1f42\u1f43\u1f44\u1f45\u1f50\u1f51\u1f52\u1f53\u1f54\u1f55\u1f56\u1f57\u1f60\u1f61\u1f62\u1f63\u1f64\u1f65\u1f66\u1f67\u1f70\u1f71\u1f72\u1f73\u1f74\u1f75\u1f76\u1f77\u1f78\u1f79\u1f7a\u1f7b\u1f7c\u1f7d\u1f80\u1f81\u1f82\u1f83\u1f84\u1f85\u1f86\u1f87\u1f90\u1f91\u1f92\u1f93\u1f94\u1f95\u1f96\u1f97\u1fa0\u1fa1\u1fa2\u1fa3\u1fa4\u1fa5\u1fa6\u1fa7\u1fb0\u1fb1\u1fb2\u1fb3\u1fb4\u1fb6\u1fb7\u1fbe\u1fc2\u1fc3\u1fc4\u1fc6\u1fc7\u1fd0\u1fd1\u1fd2\u1fd3\u1fd6\u1fd7\u1fe0\u1fe1\u1fe2\u1fe3\u1fe4\u1fe5\u1fe6\u1fe7\u1ff2\u1ff3\u1ff4\u1ff6\u1ff7\u2071\u207f\u210a\u210e\u210f\u2113\u212f\u2134\u2139\u213c\u213d\u2146\u2147\u2148\u2149\u2c30\u2c31\u2c32\u2c33\u2c34\u2c35\u2c36\u2c37\u2c38\u2c39\u2c3a\u2c3b\u2c3c\u2c3d\u2c3e\u2c3f\u2c40\u2c41\u2c42\u2c43\u2c44\u2c45\u2c46\u2c47\u2c48\u2c49\u2c4a\u2c4b\u2c4c\u2c4d\u2c4e\u2c4f\u2c50\u2c51\u2c52\u2c53\u2c54\u2c55\u2c56\u2c57\u2c58\u2c59\u2c5a\u2c5b\u2c5c\u2c5d\u2c5e\u2c81\u2c83\u2c85\u2c87\u2c89\u2c8b\u2c8d\u2c8f\u2c91\u2c93\u2c95\u2c97\u2c99\u2c9b\u2c9d\u2c9f\u2ca1\u2ca3\u2ca5\u2ca7\u2ca9\u2cab\u2cad\u2caf\u2cb1\u2cb3\u2cb5\u2cb7\u2cb9\u2cbb\u2cbd\u2cbf\u2cc1\u2cc3\u2cc5\u2cc7\u2cc9\u2ccb\u2ccd\u2ccf\u2cd1\u2cd3\u2cd5\u2cd7\u2cd9\u2cdb\u2cdd\u2cdf\u2ce1\u2ce3\u2ce4\u2d00\u2d01\u2d02\u2d03\u2d04\u2d05\u2d06\u2d07\u2d08\u2d09\u2d0a\u2d0b\u2d0c\u2d0d\u2d0e\u2d0f\u2d10\u2d11\u2d12\u2d13\u2d14\u2d15\u2d16\u2d17\u2d18\u2d19\u2d1a\u2d1b\u2d1c\u2d1d\u2d1e\u2d1f\u2d20\u2d21\u2d22\u2d23\u2d24\u2d25\ufb00\ufb01\ufb02\ufb03\ufb04\ufb05\ufb06\ufb13\ufb14\ufb15\ufb16\ufb17\uff41\uff42\uff43\uff44\uff45\uff46\uff47\uff48\uff49\uff4a\uff4b\uff4c\uff4d\uff4e\uff4f\uff50\uff51\uff52\uff53\uff54\uff55\uff56\uff57\uff58\uff59\uff5a'
-
-Lm = u'\u02b0\u02b1\u02b2\u02b3\u02b4\u02b5\u02b6\u02b7\u02b8\u02b9\u02ba\u02bb\u02bc\u02bd\u02be\u02bf\u02c0\u02c1\u02c6\u02c7\u02c8\u02c9\u02ca\u02cb\u02cc\u02cd\u02ce\u02cf\u02d0\u02d1\u02e0\u02e1\u02e2\u02e3\u02e4\u02ee\u037a\u0559\u0640\u06e5\u06e6\u0e46\u0ec6\u10fc\u17d7\u1843\u1d2c\u1d2d\u1d2e\u1d2f\u1d30\u1d31\u1d32\u1d33\u1d34\u1d35\u1d36\u1d37\u1d38\u1d39\u1d3a\u1d3b\u1d3c\u1d3d\u1d3e\u1d3f\u1d40\u1d41\u1d42\u1d43\u1d44\u1d45\u1d46\u1d47\u1d48\u1d49\u1d4a\u1d4b\u1d4c\u1d4d\u1d4e\u1d4f\u1d50\u1d51\u1d52\u1d53\u1d54\u1d55\u1d56\u1d57\u1d58\u1d59\u1d5a\u1d5b\u1d5c\u1d5d\u1d5e\u1d5f\u1d60\u1d61\u1d78\u1d9b\u1d9c\u1d9d\u1d9e\u1d9f\u1da0\u1da1\u1da2\u1da3\u1da4\u1da5\u1da6\u1da7\u1da8\u1da9\u1daa\u1dab\u1dac\u1dad\u1dae\u1daf\u1db0\u1db1\u1db2\u1db3\u1db4\u1db5\u1db6\u1db7\u1db8\u1db9\u1dba\u1dbb\u1dbc\u1dbd\u1dbe\u1dbf\u2090\u2091\u2092\u2093\u2094\u2d6f\u3005\u3031\u3032\u3033\u3034\u3035\u303b\u309d\u309e\u30fc\u30fd\u30fe\ua015\uff70\uff9e\uff9f'
-
-Lo = u'\u01bb\u01c0\u01c1\u01c2\u01c3\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u05d9\u05da\u05db\u05dc\u05dd\u05de\u05df\u05e0\u05e1\u05e2\u05e3\u05e4\u05e5\u05e6\u05e7\u05e8\u05e9\u05ea\u05f0\u05f1\u05f2\u0621\u0622\u0623\u0624\u0625\u0626\u0627\u0628\u0629\u062a\u062b\u062c\u062d\u062e\u062f\u0630\u0631\u0632\u0633\u0634\u0635\u0636\u0637\u0638\u0639\u063a\u0641\u0642\u0643\u0644\u0645\u0646\u0647\u0648\u0649\u064a\u066e\u066f\u0671\u0672\u0673\u0674\u0675\u0676\u0677\u0678\u0679\u067a\u067b\u067c\u067d\u067e\u067f\u0680\u0681\u0682\u0683\u0684\u0685\u0686\u0687\u0688\u0689\u068a\u068b\u068c\u068d\u068e\u068f\u0690\u0691\u0692\u0693\u0694\u0695\u0696\u0697\u0698\u0699\u069a\u069b\u069c\u069d\u069e\u069f\u06a0\u06a1\u06a2\u06a3\u06a4\u06a5\u06a6\u06a7\u06a8\u06a9\u06aa\u06ab\u06ac\u06ad\u06ae\u06af\u06b0\u06b1\u06b2\u06b3\u06b4\u06b5\u06b6\u06b7\u06b8\u06b9\u06ba\u06bb\u06bc\u06bd\u06be\u06bf\u06c0\u06c1\u06c2\u06c3\u06c4\u06c5\u06c6\u06c7\u06c8\u06c9\u06ca\u06cb\u06cc\u06cd\u06ce\u06cf\u06d0\u06d1\u06d2\u06d3\u06d5\u06ee\u06ef\u06fa\u06fb\u06fc\u06ff\u0710\u0712\u0713\u0714\u0715\u0716\u0717\u0718\u0719\u071a\u071b\u071c\u071d\u071e\u071f\u0720\u0721\u0722\u0723\u0724\u0725\u0726\u0727\u0728\u0729\u072a\u072b\u072c\u072d\u072e\u072f\u074d\u074e\u074f\u0750\u0751\u0752\u0753\u0754\u0755\u0756\u0757\u0758\u0759\u075a\u075b\u075c\u075d\u075e\u075f\u0760\u0761\u0762\u0763\u0764\u0765\u0766\u0767\u0768\u0769\u076a\u076b\u076c\u076d\u0780\u0781\u0782\u0783\u0784\u0785\u0786\u0787\u0788\u0789\u078a\u078b\u078c\u078d\u078e\u078f\u0790\u0791\u0792\u0793\u0794\u0795\u0796\u0797\u0798\u0799\u079a\u079b\u079c\u079d\u079e\u079f\u07a0\u07a1\u07a2\u07a3\u07a4\u07a5\u07b1\u0904\u0905\u0906\u0907\u0908\u0909\u090a\u090b\u090c\u090d\u090e\u090f\u0910\u0911\u0912\u0913\u0914\u0915\u0916\u0917\u0918\u0919\u091a\u091b\u091c\u091d\u091e\u091f\u0920\u0921\u0922\u0923\u0924\u0925\u0926\u0927\u0928\u0929\u092a\u092b\u092c\u092d\u092e\u092f\u0930\u0931\u0932\u0933\u0934\u0935\u0936\u0937\u0938\u0939\u093d\u0950\u0958\u0959\u095a\u095b\u095c\u095d\u095e\u095f\u0960\u0961\u097d\u0985\u0986\u0987\u0988\u0989\u098a\u098b\u098c\u098f\u0990\u0993\u0994\u0995\u0996\u0997\u0998\u0999\u099a\u099b\u099c\u099d\u099e\u099f\u09a0\u09a1\u09a2\u09a3\u09a4\u09a5\u09a6\u09a7\u09a8\u09aa\u09ab\u09ac\u09ad\u09ae\u09af\u09b0\u09b2\u09b6\u09b7\u09b8\u09b9\u09bd\u09ce\u09dc\u09dd\u09df\u09e0\u09e1\u09f0\u09f1\u0a05\u0a06\u0a07\u0a08\u0a09\u0a0a\u0a0f\u0a10\u0a13\u0a14\u0a15\u0a16\u0a17\u0a18\u0a19\u0a1a\u0a1b\u0a1c\u0a1d\u0a1e\u0a1f\u0a20\u0a21\u0a22\u0a23\u0a24\u0a25\u0a26\u0a27\u0a28\u0a2a\u0a2b\u0a2c\u0a2d\u0a2e\u0a2f\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59\u0a5a\u0a5b\u0a5c\u0a5e\u0a72\u0a73\u0a74\u0a85\u0a86\u0a87\u0a88\u0a89\u0a8a\u0a8b\u0a8c\u0a8d\u0a8f\u0a90\u0a91\u0a93\u0a94\u0a95\u0a96\u0a97\u0a98\u0a99\u0a9a\u0a9b\u0a9c\u0a9d\u0a9e\u0a9f\u0aa0\u0aa1\u0aa2\u0aa3\u0aa4\u0aa5\u0aa6\u0aa7\u0aa8\u0aaa\u0aab\u0aac\u0aad\u0aae\u0aaf\u0ab0\u0ab2\u0ab3\u0ab5\u0ab6\u0ab7\u0ab8\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0b05\u0b06\u0b07\u0b08\u0b09\u0b0a\u0b0b\u0b0c\u0b0f\u0b10\u0b13\u0b14\u0b15\u0b16\u0b17\u0b18\u0b19\u0b1a\u0b1b\u0b1c\u0b1d\u0b1e\u0b1f\u0b20\u0b21\u0b22\u0b23\u0b24\u0b25\u0b26\u0b27\u0b28\u0b2a\u0b2b\u0b2c\u0b2d\u0b2e\u0b2f\u0b30\u0b32\u0b33\u0b35\u0b36\u0b37\u0b38\u0b39\u0b3d\u0b5c\u0b5d\u0b5f\u0b60\u0b61\u0b71\u0b83\u0b85\u0b86\u0b87\u0b88\u0b89\u0b8a\u0b8e\u0b8f\u0b90\u0b92\u0b93\u0b94\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8\u0ba9\u0baa\u0bae\u0baf\u0bb0\u0bb1\u0bb2\u0bb3\u0bb4\u0bb5\u0bb6\u0bb7\u0bb8\u0bb9\u0c05\u0c06\u0c07\u0c08\u0c09\u0c0a\u0c0b\u0c0c\u0c0e\u0c0f\u0c10\u0c12\u0c13\u0c14\u0c15\u0c16\u0c17\u0c18\u0c19\u0c1a\u0c1b\u0c1c\u0c1d\u0c1e\u0c1f\u0c20\u0c21\u0c22\u0c23\u0c24\u0c25\u0c26\u0c27\u0c28\u0c2a\u0c2b\u0c2c\u0c2d\u0c2e\u0c2f\u0c30\u0c31\u0c32\u0c33\u0c35\u0c36\u0c37\u0c38\u0c39\u0c60\u0c61\u0c85\u0c86\u0c87\u0c88\u0c89\u0c8a\u0c8b\u0c8c\u0c8e\u0c8f\u0c90\u0c92\u0c93\u0c94\u0c95\u0c96\u0c97\u0c98\u0c99\u0c9a\u0c9b\u0c9c\u0c9d\u0c9e\u0c9f\u0ca0\u0ca1\u0ca2\u0ca3\u0ca4\u0ca5\u0ca6\u0ca7\u0ca8\u0caa\u0cab\u0cac\u0cad\u0cae\u0caf\u0cb0\u0cb1\u0cb2\u0cb3\u0cb5\u0cb6\u0cb7\u0cb8\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0d05\u0d06\u0d07\u0d08\u0d09\u0d0a\u0d0b\u0d0c\u0d0e\u0d0f\u0d10\u0d12\u0d13\u0d14\u0d15\u0d16\u0d17\u0d18\u0d19\u0d1a\u0d1b\u0d1c\u0d1d\u0d1e\u0d1f\u0d20\u0d21\u0d22\u0d23\u0d24\u0d25\u0d26\u0d27\u0d28\u0d2a\u0d2b\u0d2c\u0d2d\u0d2e\u0d2f\u0d30\u0d31\u0d32\u0d33\u0d34\u0d35\u0d36\u0d37\u0d38\u0d39\u0d60\u0d61\u0d85\u0d86\u0d87\u0d88\u0d89\u0d8a\u0d8b\u0d8c\u0d8d\u0d8e\u0d8f\u0d90\u0d91\u0d92\u0d93\u0d94\u0d95\u0d96\u0d9a\u0d9b\u0d9c\u0d9d\u0d9e\u0d9f\u0da0\u0da1\u0da2\u0da3\u0da4\u0da5\u0da6\u0da7\u0da8\u0da9\u0daa\u0dab\u0dac\u0dad\u0dae\u0daf\u0db0\u0db1\u0db3\u0db4\u0db5\u0db6\u0db7\u0db8\u0db9\u0dba\u0dbb\u0dbd\u0dc0\u0dc1\u0dc2\u0dc3\u0dc4\u0dc5\u0dc6\u0e01\u0e02\u0e03\u0e04\u0e05\u0e06\u0e07\u0e08\u0e09\u0e0a\u0e0b\u0e0c\u0e0d\u0e0e\u0e0f\u0e10\u0e11\u0e12\u0e13\u0e14\u0e15\u0e16\u0e17\u0e18\u0e19\u0e1a\u0e1b\u0e1c\u0e1d\u0e1e\u0e1f\u0e20\u0e21\u0e22\u0e23\u0e24\u0e25\u0e26\u0e27\u0e28\u0e29\u0e2a\u0e2b\u0e2c\u0e2d\u0e2e\u0e2f\u0e30\u0e32\u0e33\u0e40\u0e41\u0e42\u0e43\u0e44\u0e45\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94\u0e95\u0e96\u0e97\u0e99\u0e9a\u0e9b\u0e9c\u0e9d\u0e9e\u0e9f\u0ea1\u0ea2\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead\u0eae\u0eaf\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0\u0ec1\u0ec2\u0ec3\u0ec4\u0edc\u0edd\u0f00\u0f40\u0f41\u0f42\u0f43\u0f44\u0f45\u0f46\u0f47\u0f49\u0f4a\u0f4b\u0f4c\u0f4d\u0f4e\u0f4f\u0f50\u0f51\u0f52\u0f53\u0f54\u0f55\u0f56\u0f57\u0f58\u0f59\u0f5a\u0f5b\u0f5c\u0f5d\u0f5e\u0f5f\u0f60\u0f61\u0f62\u0f63\u0f64\u0f65\u0f66\u0f67\u0f68\u0f69\u0f6a\u0f88\u0f89\u0f8a\u0f8b\u1000\u1001\u1002\u1003\u1004\u1005\u1006\u1007\u1008\u1009\u100a\u100b\u100c\u100d\u100e\u100f\u1010\u1011\u1012\u1013\u1014\u1015\u1016\u1017\u1018\u1019\u101a\u101b\u101c\u101d\u101e\u101f\u1020\u1021\u1023\u1024\u1025\u1026\u1027\u1029\u102a\u1050\u1051\u1052\u1053\u1054\u1055\u10d0\u10d1\u10d2\u10d3\u10d4\u10d5\u10d6\u10d7\u10d8\u10d9\u10da\u10db\u10dc\u10dd\u10de\u10df\u10e0\u10e1\u10e2\u10e3\u10e4\u10e5\u10e6\u10e7\u10e8\u10e9\u10ea\u10eb\u10ec\u10ed\u10ee\u10ef\u10f0\u10f1\u10f2\u10f3\u10f4\u10f5\u10f6\u10f7\u10f8\u10f9\u10fa\u1100\u1101\u1102\u1103\u1104\u1105\u1106\u1107\u1108\u1109\u110a\u110b\u110c\u110d\u110e\u110f\u1110\u1111\u1112\u1113\u1114\u1115\u1116\u1117\u1118\u1119\u111a\u111b\u111c\u111d\u111e\u111f\u1120\u1121\u1122\u1123\u1124\u1125\u1126\u1127\u1128\u1129\u112a\u112b\u112c\u112d\u112e\u112f\u1130\u1131\u1132\u1133\u1134\u1135\u1136\u1137\u1138\u1139\u113a\u113b\u113c\u113d\u113e\u113f\u1140\u1141\u1142\u1143\u1144\u1145\u1146\u1147\u1148\u1149\u114a\u114b\u114c\u114d\u114e\u114f\u1150\u1151\u1152\u1153\u1154\u1155\u1156\u1157\u1158\u1159\u115f\u1160\u1161\u1162\u1163\u1164\u1165\u1166\u1167\u1168\u1169\u116a\u116b\u116c\u116d\u116e\u116f\u1170\u1171\u1172\u1173\u1174\u1175\u1176\u1177\u1178\u1179\u117a\u117b\u117c\u117d\u117e\u117f\u1180\u1181\u1182\u1183\u1184\u1185\u1186\u1187\u1188\u1189\u118a\u118b\u118c\u118d\u118e\u118f\u1190\u1191\u1192\u1193\u1194\u1195\u1196\u1197\u1198\u1199\u119a\u119b\u119c\u119d\u119e\u119f\u11a0\u11a1\u11a2\u11a8\u11a9\u11aa\u11ab\u11ac\u11ad\u11ae\u11af\u11b0\u11b1\u11b2\u11b3\u11b4\u11b5\u11b6\u11b7\u11b8\u11b9\u11ba\u11bb\u11bc\u11bd\u11be\u11bf\u11c0\u11c1\u11c2\u11c3\u11c4\u11c5\u11c6\u11c7\u11c8\u11c9\u11ca\u11cb\u11cc\u11cd\u11ce\u11cf\u11d0\u11d1\u11d2\u11d3\u11d4\u11d5\u11d6\u11d7\u11d8\u11d9\u11da\u11db\u11dc\u11dd\u11de\u11df\u11e0\u11e1\u11e2\u11e3\u11e4\u11e5\u11e6\u11e7\u11e8\u11e9\u11ea\u11eb\u11ec\u11ed\u11ee\u11ef\u11f0\u11f1\u11f2\u11f3\u11f4\u11f5\u11f6\u11f7\u11f8\u11f9\u1200\u1201\u1202\u1203\u1204\u1205\u1206\u1207\u1208\u1209\u120a\u120b\u120c\u120d\u120e\u120f\u1210\u1211\u1212\u1213\u1214\u1215\u1216\u1217\u1218\u1219\u121a\u121b\u121c\u121d\u121e\u121f\u1220\u1221\u1222\u1223\u1224\u1225\u1226\u1227\u1228\u1229\u122a\u122b\u122c\u122d\u122e\u122f\u1230\u1231\u1232\u1233\u1234\u1235\u1236\u1237\u1238\u1239\u123a\u123b\u123c\u123d\u123e\u123f\u1240\u1241\u1242\u1243\u1244\u1245\u1246\u1247\u1248\u124a\u124b\u124c\u124d\u1250\u1251\u1252\u1253\u1254\u1255\u1256\u1258\u125a\u125b\u125c\u125d\u1260\u1261\u1262\u1263\u1264\u1265\u1266\u1267\u1268\u1269\u126a\u126b\u126c\u126d\u126e\u126f\u1270\u1271\u1272\u1273\u1274\u1275\u1276\u1277\u1278\u1279\u127a\u127b\u127c\u127d\u127e\u127f\u1280\u1281\u1282\u1283\u1284\u1285\u1286\u1287\u1288\u128a\u128b\u128c\u128d\u1290\u1291\u1292\u1293\u1294\u1295\u1296\u1297\u1298\u1299\u129a\u129b\u129c\u129d\u129e\u129f\u12a0\u12a1\u12a2\u12a3\u12a4\u12a5\u12a6\u12a7\u12a8\u12a9\u12aa\u12ab\u12ac\u12ad\u12ae\u12af\u12b0\u12b2\u12b3\u12b4\u12b5\u12b8\u12b9\u12ba\u12bb\u12bc\u12bd\u12be\u12c0\u12c2\u12c3\u12c4\u12c5\u12c8\u12c9\u12ca\u12cb\u12cc\u12cd\u12ce\u12cf\u12d0\u12d1\u12d2\u12d3\u12d4\u12d5\u12d6\u12d8\u12d9\u12da\u12db\u12dc\u12dd\u12de\u12df\u12e0\u12e1\u12e2\u12e3\u12e4\u12e5\u12e6\u12e7\u12e8\u12e9\u12ea\u12eb\u12ec\u12ed\u12ee\u12ef\u12f0\u12f1\u12f2\u12f3\u12f4\u12f5\u12f6\u12f7\u12f8\u12f9\u12fa\u12fb\u12fc\u12fd\u12fe\u12ff\u1300\u1301\u1302\u1303\u1304\u1305\u1306\u1307\u1308\u1309\u130a\u130b\u130c\u130d\u130e\u130f\u1310\u1312\u1313\u1314\u1315\u1318\u1319\u131a\u131b\u131c\u131d\u131e\u131f\u1320\u1321\u1322\u1323\u1324\u1325\u1326\u1327\u1328\u1329\u132a\u132b\u132c\u132d\u132e\u132f\u1330\u1331\u1332\u1333\u1334\u1335\u1336\u1337\u1338\u1339\u133a\u133b\u133c\u133d\u133e\u133f\u1340\u1341\u1342\u1343\u1344\u1345\u1346\u1347\u1348\u1349\u134a\u134b\u134c\u134d\u134e\u134f\u1350\u1351\u1352\u1353\u1354\u1355\u1356\u1357\u1358\u1359\u135a\u1380\u1381\u1382\u1383\u1384\u1385\u1386\u1387\u1388\u1389\u138a\u138b\u138c\u138d\u138e\u138f\u13a0\u13a1\u13a2\u13a3\u13a4\u13a5\u13a6\u13a7\u13a8\u13a9\u13aa\u13ab\u13ac\u13ad\u13ae\u13af\u13b0\u13b1\u13b2\u13b3\u13b4\u13b5\u13b6\u13b7\u13b8\u13b9\u13ba\u13bb\u13bc\u13bd\u13be\u13bf\u13c0\u13c1\u13c2\u13c3\u13c4\u13c5\u13c6\u13c7\u13c8\u13c9\u13ca\u13cb\u13cc\u13cd\u13ce\u13cf\u13d0\u13d1\u13d2\u13d3\u13d4\u13d5\u13d6\u13d7\u13d8\u13d9\u13da\u13db\u13dc\u13dd\u13de\u13df\u13e0\u13e1\u13e2\u13e3\u13e4\u13e5\u13e6\u13e7\u13e8\u13e9\u13ea\u13eb\u13ec\u13ed\u13ee\u13ef\u13f0\u13f1\u13f2\u13f3\u13f4\u1401\u1402\u1403\u1404\u1405\u1406\u1407\u1408\u1409\u140a\u140b\u140c\u140d\u140e\u140f\u1410\u1411\u1412\u1413\u1414\u1415\u1416\u1417\u1418\u1419\u141a\u141b\u141c\u141d\u141e\u141f\u1420\u1421\u1422\u1423\u1424\u1425\u1426\u1427\u1428\u1429\u142a\u142b\u142c\u142d\u142e\u142f\u1430\u1431\u1432\u1433\u1434\u1435\u1436\u1437\u1438\u1439\u143a\u143b\u143c\u143d\u143e\u143f\u1440\u1441\u1442\u1443\u1444\u1445\u1446\u1447\u1448\u1449\u144a\u144b\u144c\u144d\u144e\u144f\u1450\u1451\u1452\u1453\u1454\u1455\u1456\u1457\u1458\u1459\u145a\u145b\u145c\u145d\u145e\u145f\u1460\u1461\u1462\u1463\u1464\u1465\u1466\u1467\u1468\u1469\u146a\u146b\u146c\u146d\u146e\u146f\u1470\u1471\u1472\u1473\u1474\u1475\u1476\u1477\u1478\u1479\u147a\u147b\u147c\u147d\u147e\u147f\u1480\u1481\u1482\u1483\u1484\u1485\u1486\u1487\u1488\u1489\u148a\u148b\u148c\u148d\u148e\u148f\u1490\u1491\u1492\u1493\u1494\u1495\u1496\u1497\u1498\u1499\u149a\u149b\u149c\u149d\u149e\u149f\u14a0\u14a1\u14a2\u14a3\u14a4\u14a5\u14a6\u14a7\u14a8\u14a9\u14aa\u14ab\u14ac\u14ad\u14ae\u14af\u14b0\u14b1\u14b2\u14b3\u14b4\u14b5\u14b6\u14b7\u14b8\u14b9\u14ba\u14bb\u14bc\u14bd\u14be\u14bf\u14c0\u14c1\u14c2\u14c3\u14c4\u14c5\u14c6\u14c7\u14c8\u14c9\u14ca\u14cb\u14cc\u14cd\u14ce\u14cf\u14d0\u14d1\u14d2\u14d3\u14d4\u14d5\u14d6\u14d7\u14d8\u14d9\u14da\u14db\u14dc\u14dd\u14de\u14df\u14e0\u14e1\u14e2\u14e3\u14e4\u14e5\u14e6\u14e7\u14e8\u14e9\u14ea\u14eb\u14ec\u14ed\u14ee\u14ef\u14f0\u14f1\u14f2\u14f3\u14f4\u14f5\u14f6\u14f7\u14f8\u14f9\u14fa\u14fb\u14fc\u14fd\u14fe\u14ff\u1500\u1501\u1502\u1503\u1504\u1505\u1506\u1507\u1508\u1509\u150a\u150b\u150c\u150d\u150e\u150f\u1510\u1511\u1512\u1513\u1514\u1515\u1516\u1517\u1518\u1519\u151a\u151b\u151c\u151d\u151e\u151f\u1520\u1521\u1522\u1523\u1524\u1525\u1526\u1527\u1528\u1529\u152a\u152b\u152c\u152d\u152e\u152f\u1530\u1531\u1532\u1533\u1534\u1535\u1536\u1537\u1538\u1539\u153a\u153b\u153c\u153d\u153e\u153f\u1540\u1541\u1542\u1543\u1544\u1545\u1546\u1547\u1548\u1549\u154a\u154b\u154c\u154d\u154e\u154f\u1550\u1551\u1552\u1553\u1554\u1555\u1556\u1557\u1558\u1559\u155a\u155b\u155c\u155d\u155e\u155f\u1560\u1561\u1562\u1563\u1564\u1565\u1566\u1567\u1568\u1569\u156a\u156b\u156c\u156d\u156e\u156f\u1570\u1571\u1572\u1573\u1574\u1575\u1576\u1577\u1578\u1579\u157a\u157b\u157c\u157d\u157e\u157f\u1580\u1581\u1582\u1583\u1584\u1585\u1586\u1587\u1588\u1589\u158a\u158b\u158c\u158d\u158e\u158f\u1590\u1591\u1592\u1593\u1594\u1595\u1596\u1597\u1598\u1599\u159a\u159b\u159c\u159d\u159e\u159f\u15a0\u15a1\u15a2\u15a3\u15a4\u15a5\u15a6\u15a7\u15a8\u15a9\u15aa\u15ab\u15ac\u15ad\u15ae\u15af\u15b0\u15b1\u15b2\u15b3\u15b4\u15b5\u15b6\u15b7\u15b8\u15b9\u15ba\u15bb\u15bc\u15bd\u15be\u15bf\u15c0\u15c1\u15c2\u15c3\u15c4\u15c5\u15c6\u15c7\u15c8\u15c9\u15ca\u15cb\u15cc\u15cd\u15ce\u15cf\u15d0\u15d1\u15d2\u15d3\u15d4\u15d5\u15d6\u15d7\u15d8\u15d9\u15da\u15db\u15dc\u15dd\u15de\u15df\u15e0\u15e1\u15e2\u15e3\u15e4\u15e5\u15e6\u15e7\u15e8\u15e9\u15ea\u15eb\u15ec\u15ed\u15ee\u15ef\u15f0\u15f1\u15f2\u15f3\u15f4\u15f5\u15f6\u15f7\u15f8\u15f9\u15fa\u15fb\u15fc\u15fd\u15fe\u15ff\u1600\u1601\u1602\u1603\u1604\u1605\u1606\u1607\u1608\u1609\u160a\u160b\u160c\u160d\u160e\u160f\u1610\u1611\u1612\u1613\u1614\u1615\u1616\u1617\u1618\u1619\u161a\u161b\u161c\u161d\u161e\u161f\u1620\u1621\u1622\u1623\u1624\u1625\u1626\u1627\u1628\u1629\u162a\u162b\u162c\u162d\u162e\u162f\u1630\u1631\u1632\u1633\u1634\u1635\u1636\u1637\u1638\u1639\u163a\u163b\u163c\u163d\u163e\u163f\u1640\u1641\u1642\u1643\u1644\u1645\u1646\u1647\u1648\u1649\u164a\u164b\u164c\u164d\u164e\u164f\u1650\u1651\u1652\u1653\u1654\u1655\u1656\u1657\u1658\u1659\u165a\u165b\u165c\u165d\u165e\u165f\u1660\u1661\u1662\u1663\u1664\u1665\u1666\u1667\u1668\u1669\u166a\u166b\u166c\u166f\u1670\u1671\u1672\u1673\u1674\u1675\u1676\u1681\u1682\u1683\u1684\u1685\u1686\u1687\u1688\u1689\u168a\u168b\u168c\u168d\u168e\u168f\u1690\u1691\u1692\u1693\u1694\u1695\u1696\u1697\u1698\u1699\u169a\u16a0\u16a1\u16a2\u16a3\u16a4\u16a5\u16a6\u16a7\u16a8\u16a9\u16aa\u16ab\u16ac\u16ad\u16ae\u16af\u16b0\u16b1\u16b2\u16b3\u16b4\u16b5\u16b6\u16b7\u16b8\u16b9\u16ba\u16bb\u16bc\u16bd\u16be\u16bf\u16c0\u16c1\u16c2\u16c3\u16c4\u16c5\u16c6\u16c7\u16c8\u16c9\u16ca\u16cb\u16cc\u16cd\u16ce\u16cf\u16d0\u16d1\u16d2\u16d3\u16d4\u16d5\u16d6\u16d7\u16d8\u16d9\u16da\u16db\u16dc\u16dd\u16de\u16df\u16e0\u16e1\u16e2\u16e3\u16e4\u16e5\u16e6\u16e7\u16e8\u16e9\u16ea\u1700\u1701\u1702\u1703\u1704\u1705\u1706\u1707\u1708\u1709\u170a\u170b\u170c\u170e\u170f\u1710\u1711\u1720\u1721\u1722\u1723\u1724\u1725\u1726\u1727\u1728\u1729\u172a\u172b\u172c\u172d\u172e\u172f\u1730\u1731\u1740\u1741\u1742\u1743\u1744\u1745\u1746\u1747\u1748\u1749\u174a\u174b\u174c\u174d\u174e\u174f\u1750\u1751\u1760\u1761\u1762\u1763\u1764\u1765\u1766\u1767\u1768\u1769\u176a\u176b\u176c\u176e\u176f\u1770\u1780\u1781\u1782\u1783\u1784\u1785\u1786\u1787\u1788\u1789\u178a\u178b\u178c\u178d\u178e\u178f\u1790\u1791\u1792\u1793\u1794\u1795\u1796\u1797\u1798\u1799\u179a\u179b\u179c\u179d\u179e\u179f\u17a0\u17a1\u17a2\u17a3\u17a4\u17a5\u17a6\u17a7\u17a8\u17a9\u17aa\u17ab\u17ac\u17ad\u17ae\u17af\u17b0\u17b1\u17b2\u17b3\u17dc\u1820\u1821\u1822\u1823\u1824\u1825\u1826\u1827\u1828\u1829\u182a\u182b\u182c\u182d\u182e\u182f\u1830\u1831\u1832\u1833\u1834\u1835\u1836\u1837\u1838\u1839\u183a\u183b\u183c\u183d\u183e\u183f\u1840\u1841\u1842\u1844\u1845\u1846\u1847\u1848\u1849\u184a\u184b\u184c\u184d\u184e\u184f\u1850\u1851\u1852\u1853\u1854\u1855\u1856\u1857\u1858\u1859\u185a\u185b\u185c\u185d\u185e\u185f\u1860\u1861\u1862\u1863\u1864\u1865\u1866\u1867\u1868\u1869\u186a\u186b\u186c\u186d\u186e\u186f\u1870\u1871\u1872\u1873\u1874\u1875\u1876\u1877\u1880\u1881\u1882\u1883\u1884\u1885\u1886\u1887\u1888\u1889\u188a\u188b\u188c\u188d\u188e\u188f\u1890\u1891\u1892\u1893\u1894\u1895\u1896\u1897\u1898\u1899\u189a\u189b\u189c\u189d\u189e\u189f\u18a0\u18a1\u18a2\u18a3\u18a4\u18a5\u18a6\u18a7\u18a8\u1900\u1901\u1902\u1903\u1904\u1905\u1906\u1907\u1908\u1909\u190a\u190b\u190c\u190d\u190e\u190f\u1910\u1911\u1912\u1913\u1914\u1915\u1916\u1917\u1918\u1919\u191a\u191b\u191c\u1950\u1951\u1952\u1953\u1954\u1955\u1956\u1957\u1958\u1959\u195a\u195b\u195c\u195d\u195e\u195f\u1960\u1961\u1962\u1963\u1964\u1965\u1966\u1967\u1968\u1969\u196a\u196b\u196c\u196d\u1970\u1971\u1972\u1973\u1974\u1980\u1981\u1982\u1983\u1984\u1985\u1986\u1987\u1988\u1989\u198a\u198b\u198c\u198d\u198e\u198f\u1990\u1991\u1992\u1993\u1994\u1995\u1996\u1997\u1998\u1999\u199a\u199b\u199c\u199d\u199e\u199f\u19a0\u19a1\u19a2\u19a3\u19a4\u19a5\u19a6\u19a7\u19a8\u19a9\u19c1\u19c2\u19c3\u19c4\u19c5\u19c6\u19c7\u1a00\u1a01\u1a02\u1a03\u1a04\u1a05\u1a06\u1a07\u1a08\u1a09\u1a0a\u1a0b\u1a0c\u1a0d\u1a0e\u1a0f\u1a10\u1a11\u1a12\u1a13\u1a14\u1a15\u1a16\u2135\u2136\u2137\u2138\u2d30\u2d31\u2d32\u2d33\u2d34\u2d35\u2d36\u2d37\u2d38\u2d39\u2d3a\u2d3b\u2d3c\u2d3d\u2d3e\u2d3f\u2d40\u2d41\u2d42\u2d43\u2d44\u2d45\u2d46\u2d47\u2d48\u2d49\u2d4a\u2d4b\u2d4c\u2d4d\u2d4e\u2d4f\u2d50\u2d51\u2d52\u2d53\u2d54\u2d55\u2d56\u2d57\u2d58\u2d59\u2d5a\u2d5b\u2d5c\u2d5d\u2d5e\u2d5f\u2d60\u2d61\u2d62\u2d63\u2d64\u2d65\u2d80\u2d81\u2d82\u2d83\u2d84\u2d85\u2d86\u2d87\u2d88\u2d89\u2d8a\u2d8b\u2d8c\u2d8d\u2d8e\u2d8f\u2d90\u2d91\u2d92\u2d93\u2d94\u2d95\u2d96\u2da0\u2da1\u2da2\u2da3\u2da4\u2da5\u2da6\u2da8\u2da9\u2daa\u2dab\u2dac\u2dad\u2dae\u2db0\u2db1\u2db2\u2db3\u2db4\u2db5\u2db6\u2db8\u2db9\u2dba\u2dbb\u2dbc\u2dbd\u2dbe\u2dc0\u2dc1\u2dc2\u2dc3\u2dc4\u2dc5\u2dc6\u2dc8\u2dc9\u2dca\u2dcb\u2dcc\u2dcd\u2dce\u2dd0\u2dd1\u2dd2\u2dd3\u2dd4\u2dd5\u2dd6\u2dd8\u2dd9\u2dda\u2ddb\u2ddc\u2ddd\u2dde\u3006\u303c\u3041\u3042\u3043\u3044\u3045\u3046\u3047\u3048\u3049\u304a\u304b\u304c\u304d\u304e\u304f\u3050\u3051\u3052\u3053\u3054\u3055\u3056\u3057\u3058\u3059\u305a\u305b\u305c\u305d\u305e\u305f\u3060\u3061\u3062\u3063\u3064\u3065\u3066\u3067\u3068\u3069\u306a\u306b\u306c\u306d\u306e\u306f\u3070\u3071\u3072\u3073\u3074\u3075\u3076\u3077\u3078\u3079\u307a\u307b\u307c\u307d\u307e\u307f\u3080\u3081\u3082\u3083\u3084\u3085\u3086\u3087\u3088\u3089\u308a\u308b\u308c\u308d\u308e\u308f\u3090\u3091\u3092\u3093\u3094\u3095\u3096\u309f\u30a1\u30a2\u30a3\u30a4\u30a5\u30a6\u30a7\u30a8\u30a9\u30aa\u30ab\u30ac\u30ad\u30ae\u30af\u30b0\u30b1\u30b2\u30b3\u30b4\u30b5\u30b6\u30b7\u30b8\u30b9\u30ba\u30bb\u30bc\u30bd\u30be\u30bf\u30c0\u30c1\u30c2\u30c3\u30c4\u30c5\u30c6\u30c7\u30c8\u30c9\u30ca\u30cb\u30cc\u30cd\u30ce\u30cf\u30d0\u30d1\u30d2\u30d3\u30d4\u30d5\u30d6\u30d7\u30d8\u30d9\u30da\u30db\u30dc\u30dd\u30de\u30df\u30e0\u30e1\u30e2\u30e3\u30e4\u30e5\u30e6\u30e7\u30e8\u30e9\u30ea\u30eb\u30ec\u30ed\u30ee\u30ef\u30f0\u30f1\u30f2\u30f3\u30f4\u30f5\u30f6\u30f7\u30f8\u30f9\u30fa\u30ff\u3105\u3106\u3107\u3108\u3109\u310a\u310b\u310c\u310d\u310e\u310f\u3110\u3111\u3112\u3113\u3114\u3115\u3116\u3117\u3118\u3119\u311a\u311b\u311c\u311d\u311e\u311f\u3120\u3121\u3122\u3123\u3124\u3125\u3126\u3127\u3128\u3129\u312a\u312b\u312c\u3131\u3132\u3133\u3134\u3135\u3136\u3137\u3138\u3139\u313a\u313b\u313c\u313d\u313e\u313f\u3140\u3141\u3142\u3143\u3144\u3145\u3146\u3147\u3148\u3149\u314a\u314b\u314c\u314d\u314e\u314f\u3150\u3151\u3152\u3153\u3154\u3155\u3156\u3157\u3158\u3159\u315a\u315b\u315c\u315d\u315e\u315f\u3160\u3161\u3162\u3163\u3164\u3165\u3166\u3167\u3168\u3169\u316a\u316b\u316c\u316d\u316e\u316f\u3170\u3171\u3172\u3173\u3174\u3175\u3176\u3177\u3178\u3179\u317a\u317b\u317c\u317d\u317e\u317f\u3180\u3181\u3182\u3183\u3184\u3185\u3186\u3187\u3188\u3189\u318a\u318b\u318c\u318d\u318e\u31a0\u31a1\u31a2\u31a3\u31a4\u31a5\u31a6\u31a7\u31a8\u31a9\u31aa\u31ab\u31ac\u31ad\u31ae\u31af\u31b0\u31b1\u31b2\u31b3\u31b4\u31b5\u31b6\u31b7\u31f0\u31f1\u31f2\u31f3\u31f4\u31f5\u31f6\u31f7\u31f8\u31f9\u31fa\u31fb\u31fc\u31fd\u31fe\u31ff\u3400\u3401\u3402\u3403\u3404\u3405\u3406\u3407\u3408\u3409\u340a\u340b\u340c\u340d\u340e\u340f\u3410\u3411\u3412\u3413\u3414\u3415\u3416\u3417\u3418\u3419\u341a\u341b\u341c\u341d\u341e\u341f\u3420\u3421\u3422\u3423\u3424\u3425\u3426\u3427\u3428\u3429\u342a\u342b\u342c\u342d\u342e\u342f\u3430\u3431\u3432\u3433\u3434\u3435\u3436\u3437\u3438\u3439\u343a\u343b\u343c\u343d\u343e\u343f\u3440\u3441\u3442\u3443\u3444\u3445\u3446\u3447\u3448\u3449\u344a\u344b\u344c\u344d\u344e\u344f\u3450\u3451\u3452\u3453\u3454\u3455\u3456\u3457\u3458\u3459\u345a\u345b\u345c\u345d\u345e\u345f\u3460\u3461\u3462\u3463\u3464\u3465\u3466\u3467\u3468\u3469\u346a\u346b\u346c\u346d\u346e\u346f\u3470\u3471\u3472\u3473\u3474\u3475\u3476\u3477\u3478\u3479\u347a\u347b\u347c\u347d\u347e\u347f\u3480\u3481\u3482\u3483\u3484\u3485\u3486\u3487\u3488\u3489\u348a\u348b\u348c\u348d\u348e\u348f\u3490\u3491\u3492\u3493\u3494\u3495\u3496\u3497\u3498\u3499\u349a\u349b\u349c\u349d\u349e\u349f\u34a0\u34a1\u34a2\u34a3\u34a4\u34a5\u34a6\u34a7\u34a8\u34a9\u34aa\u34ab\u34ac\u34ad\u34ae\u34af\u34b0\u34b1\u34b2\u34b3\u34b4\u34b5\u34b6\u34b7\u34b8\u34b9\u34ba\u34bb\u34bc\u34bd\u34be\u34bf\u34c0\u34c1\u34c2\u34c3\u34c4\u34c5\u34c6\u34c7\u34c8\u34c9\u34ca\u34cb\u34cc\u34cd\u34ce\u34cf\u34d0\u34d1\u34d2\u34d3\u34d4\u34d5\u34d6\u34d7\u34d8\u34d9\u34da\u34db\u34dc\u34dd\u34de\u34df\u34e0\u34e1\u34e2\u34e3\u34e4\u34e5\u34e6\u34e7\u34e8\u34e9\u34ea\u34eb\u34ec\u34ed\u34ee\u34ef\u34f0\u34f1\u34f2\u34f3\u34f4\u34f5\u34f6\u34f7\u34f8\u34f9\u34fa\u34fb\u34fc\u34fd\u34fe\u34ff\u3500\u3501\u3502\u3503\u3504\u3505\u3506\u3507\u3508\u3509\u350a\u350b\u350c\u350d\u350e\u350f\u3510\u3511\u3512\u3513\u3514\u3515\u3516\u3517\u3518\u3519\u351a\u351b\u351c\u351d\u351e\u351f\u3520\u3521\u3522\u3523\u3524\u3525\u3526\u3527\u3528\u3529\u352a\u352b\u352c\u352d\u352e\u352f\u3530\u3531\u3532\u3533\u3534\u3535\u3536\u3537\u3538\u3539\u353a\u353b\u353c\u353d\u353e\u353f\u3540\u3541\u3542\u3543\u3544\u3545\u3546\u3547\u3548\u3549\u354a\u354b\u354c\u354d\u354e\u354f\u3550\u3551\u3552\u3553\u3554\u3555\u3556\u3557\u3558\u3559\u355a\u355b\u355c\u355d\u355e\u355f\u3560\u3561\u3562\u3563\u3564\u3565\u3566\u3567\u3568\u3569\u356a\u356b\u356c\u356d\u356e\u356f\u3570\u3571\u3572\u3573\u3574\u3575\u3576\u3577\u3578\u3579\u357a\u357b\u357c\u357d\u357e\u357f\u3580\u3581\u3582\u3583\u3584\u3585\u3586\u3587\u3588\u3589\u358a\u358b\u358c\u358d\u358e\u358f\u3590\u3591\u3592\u3593\u3594\u3595\u3596\u3597\u3598\u3599\u359a\u359b\u359c\u359d\u359e\u359f\u35a0\u35a1\u35a2\u35a3\u35a4\u35a5\u35a6\u35a7\u35a8\u35a9\u35aa\u35ab\u35ac\u35ad\u35ae\u35af\u35b0\u35b1\u35b2\u35b3\u35b4\u35b5\u35b6\u35b7\u35b8\u35b9\u35ba\u35bb\u35bc\u35bd\u35be\u35bf\u35c0\u35c1\u35c2\u35c3\u35c4\u35c5\u35c6\u35c7\u35c8\u35c9\u35ca\u35cb\u35cc\u35cd\u35ce\u35cf\u35d0\u35d1\u35d2\u35d3\u35d4\u35d5\u35d6\u35d7\u35d8\u35d9\u35da\u35db\u35dc\u35dd\u35de\u35df\u35e0\u35e1\u35e2\u35e3\u35e4\u35e5\u35e6\u35e7\u35e8\u35e9\u35ea\u35eb\u35ec\u35ed\u35ee\u35ef\u35f0\u35f1\u35f2\u35f3\u35f4\u35f5\u35f6\u35f7\u35f8\u35f9\u35fa\u35fb\u35fc\u35fd\u35fe\u35ff\u3600\u3601\u3602\u3603\u3604\u3605\u3606\u3607\u3608\u3609\u360a\u360b\u360c\u360d\u360e\u360f\u3610\u3611\u3612\u3613\u3614\u3615\u3616\u3617\u3618\u3619\u361a\u361b\u361c\u361d\u361e\u361f\u3620\u3621\u3622\u3623\u3624\u3625\u3626\u3627\u3628\u3629\u362a\u362b\u362c\u362d\u362e\u362f\u3630\u3631\u3632\u3633\u3634\u3635\u3636\u3637\u3638\u3639\u363a\u363b\u363c\u363d\u363e\u363f\u3640\u3641\u3642\u3643\u3644\u3645\u3646\u3647\u3648\u3649\u364a\u364b\u364c\u364d\u364e\u364f\u3650\u3651\u3652\u3653\u3654\u3655\u3656\u3657\u3658\u3659\u365a\u365b\u365c\u365d\u365e\u365f\u3660\u3661\u3662\u3663\u3664\u3665\u3666\u3667\u3668\u3669\u366a\u366b\u366c\u366d\u366e\u366f\u3670\u3671\u3672\u3673\u3674\u3675\u3676\u3677\u3678\u3679\u367a\u367b\u367c\u367d\u367e\u367f\u3680\u3681\u3682\u3683\u3684\u3685\u3686\u3687\u3688\u3689\u368a\u368b\u368c\u368d\u368e\u368f\u3690\u3691\u3692\u3693\u3694\u3695\u3696\u3697\u3698\u3699\u369a\u369b\u369c\u369d\u369e\u369f\u36a0\u36a1\u36a2\u36a3\u36a4\u36a5\u36a6\u36a7\u36a8\u36a9\u36aa\u36ab\u36ac\u36ad\u36ae\u36af\u36b0\u36b1\u36b2\u36b3\u36b4\u36b5\u36b6\u36b7\u36b8\u36b9\u36ba\u36bb\u36bc\u36bd\u36be\u36bf\u36c0\u36c1\u36c2\u36c3\u36c4\u36c5\u36c6\u36c7\u36c8\u36c9\u36ca\u36cb\u36cc\u36cd\u36ce\u36cf\u36d0\u36d1\u36d2\u36d3\u36d4\u36d5\u36d6\u36d7\u36d8\u36d9\u36da\u36db\u36dc\u36dd\u36de\u36df\u36e0\u36e1\u36e2\u36e3\u36e4\u36e5\u36e6\u36e7\u36e8\u36e9\u36ea\u36eb\u36ec\u36ed\u36ee\u36ef\u36f0\u36f1\u36f2\u36f3\u36f4\u36f5\u36f6\u36f7\u36f8\u36f9\u36fa\u36fb\u36fc\u36fd\u36fe\u36ff\u3700\u3701\u3702\u3703\u3704\u3705\u3706\u3707\u3708\u3709\u370a\u370b\u370c\u370d\u370e\u370f\u3710\u3711\u3712\u3713\u3714\u3715\u3716\u3717\u3718\u3719\u371a\u371b\u371c\u371d\u371e\u371f\u3720\u3721\u3722\u3723\u3724\u3725\u3726\u3727\u3728\u3729\u372a\u372b\u372c\u372d\u372e\u372f\u3730\u3731\u3732\u3733\u3734\u3735\u3736\u3737\u3738\u3739\u373a\u373b\u373c\u373d\u373e\u373f\u3740\u3741\u3742\u3743\u3744\u3745\u3746\u3747\u3748\u3749\u374a\u374b\u374c\u374d\u374e\u374f\u3750\u3751\u3752\u3753\u3754\u3755\u3756\u3757\u3758\u3759\u375a\u375b\u375c\u375d\u375e\u375f\u3760\u3761\u3762\u3763\u3764\u3765\u3766\u3767\u3768\u3769\u376a\u376b\u376c\u376d\u376e\u376f\u3770\u3771\u3772\u3773\u3774\u3775\u3776\u3777\u3778\u3779\u377a\u377b\u377c\u377d\u377e\u377f\u3780\u3781\u3782\u3783\u3784\u3785\u3786\u3787\u3788\u3789\u378a\u378b\u378c\u378d\u378e\u378f\u3790\u3791\u3792\u3793\u3794\u3795\u3796\u3797\u3798\u3799\u379a\u379b\u379c\u379d\u379e\u379f\u37a0\u37a1\u37a2\u37a3\u37a4\u37a5\u37a6\u37a7\u37a8\u37a9\u37aa\u37ab\u37ac\u37ad\u37ae\u37af\u37b0\u37b1\u37b2\u37b3\u37b4\u37b5\u37b6\u37b7\u37b8\u37b9\u37ba\u37bb\u37bc\u37bd\u37be\u37bf\u37c0\u37c1\u37c2\u37c3\u37c4\u37c5\u37c6\u37c7\u37c8\u37c9\u37ca\u37cb\u37cc\u37cd\u37ce\u37cf\u37d0\u37d1\u37d2\u37d3\u37d4\u37d5\u37d6\u37d7\u37d8\u37d9\u37da\u37db\u37dc\u37dd\u37de\u37df\u37e0\u37e1\u37e2\u37e3\u37e4\u37e5\u37e6\u37e7\u37e8\u37e9\u37ea\u37eb\u37ec\u37ed\u37ee\u37ef\u37f0\u37f1\u37f2\u37f3\u37f4\u37f5\u37f6\u37f7\u37f8\u37f9\u37fa\u37fb\u37fc\u37fd\u37fe\u37ff\u3800\u3801\u3802\u3803\u3804\u3805\u3806\u3807\u3808\u3809\u380a\u380b\u380c\u380d\u380e\u380f\u3810\u3811\u3812\u3813\u3814\u3815\u3816\u3817\u3818\u3819\u381a\u381b\u381c\u381d\u381e\u381f\u3820\u3821\u3822\u3823\u3824\u3825\u3826\u3827\u3828\u3829\u382a\u382b\u382c\u382d\u382e\u382f\u3830\u3831\u3832\u3833\u3834\u3835\u3836\u3837\u3838\u3839\u383a\u383b\u383c\u383d\u383e\u383f\u3840\u3841\u3842\u3843\u3844\u3845\u3846\u3847\u3848\u3849\u384a\u384b\u384c\u384d\u384e\u384f\u3850\u3851\u3852\u3853\u3854\u3855\u3856\u3857\u3858\u3859\u385a\u385b\u385c\u385d\u385e\u385f\u3860\u3861\u3862\u3863\u3864\u3865\u3866\u3867\u3868\u3869\u386a\u386b\u386c\u386d\u386e\u386f\u3870\u3871\u3872\u3873\u3874\u3875\u3876\u3877\u3878\u3879\u387a\u387b\u387c\u387d\u387e\u387f\u3880\u3881\u3882\u3883\u3884\u3885\u3886\u3887\u3888\u3889\u388a\u388b\u388c\u388d\u388e\u388f\u3890\u3891\u3892\u3893\u3894\u3895\u3896\u3897\u3898\u3899\u389a\u389b\u389c\u389d\u389e\u389f\u38a0\u38a1\u38a2\u38a3\u38a4\u38a5\u38a6\u38a7\u38a8\u38a9\u38aa\u38ab\u38ac\u38ad\u38ae\u38af\u38b0\u38b1\u38b2\u38b3\u38b4\u38b5\u38b6\u38b7\u38b8\u38b9\u38ba\u38bb\u38bc\u38bd\u38be\u38bf\u38c0\u38c1\u38c2\u38c3\u38c4\u38c5\u38c6\u38c7\u38c8\u38c9\u38ca\u38cb\u38cc\u38cd\u38ce\u38cf\u38d0\u38d1\u38d2\u38d3\u38d4\u38d5\u38d6\u38d7\u38d8\u38d9\u38da\u38db\u38dc\u38dd\u38de\u38df\u38e0\u38e1\u38e2\u38e3\u38e4\u38e5\u38e6\u38e7\u38e8\u38e9\u38ea\u38eb\u38ec\u38ed\u38ee\u38ef\u38f0\u38f1\u38f2\u38f3\u38f4\u38f5\u38f6\u38f7\u38f8\u38f9\u38fa\u38fb\u38fc\u38fd\u38fe\u38ff\u3900\u3901\u3902\u3903\u3904\u3905\u3906\u3907\u3908\u3909\u390a\u390b\u390c\u390d\u390e\u390f\u3910\u3911\u3912\u3913\u3914\u3915\u3916\u3917\u3918\u3919\u391a\u391b\u391c\u391d\u391e\u391f\u3920\u3921\u3922\u3923\u3924\u3925\u3926\u3927\u3928\u3929\u392a\u392b\u392c\u392d\u392e\u392f\u3930\u3931\u3932\u3933\u3934\u3935\u3936\u3937\u3938\u3939\u393a\u393b\u393c\u393d\u393e\u393f\u3940\u3941\u3942\u3943\u3944\u3945\u3946\u3947\u3948\u3949\u394a\u394b\u394c\u394d\u394e\u394f\u3950\u3951\u3952\u3953\u3954\u3955\u3956\u3957\u3958\u3959\u395a\u395b\u395c\u395d\u395e\u395f\u3960\u3961\u3962\u3963\u3964\u3965\u3966\u3967\u3968\u3969\u396a\u396b\u396c\u396d\u396e\u396f\u3970\u3971\u3972\u3973\u3974\u3975\u3976\u3977\u3978\u3979\u397a\u397b\u397c\u397d\u397e\u397f\u3980\u3981\u3982\u3983\u3984\u3985\u3986\u3987\u3988\u3989\u398a\u398b\u398c\u398d\u398e\u398f\u3990\u3991\u3992\u3993\u3994\u3995\u3996\u3997\u3998\u3999\u399a\u399b\u399c\u399d\u399e\u399f\u39a0\u39a1\u39a2\u39a3\u39a4\u39a5\u39a6\u39a7\u39a8\u39a9\u39aa\u39ab\u39ac\u39ad\u39ae\u39af\u39b0\u39b1\u39b2\u39b3\u39b4\u39b5\u39b6\u39b7\u39b8\u39b9\u39ba\u39bb\u39bc\u39bd\u39be\u39bf\u39c0\u39c1\u39c2\u39c3\u39c4\u39c5\u39c6\u39c7\u39c8\u39c9\u39ca\u39cb\u39cc\u39cd\u39ce\u39cf\u39d0\u39d1\u39d2\u39d3\u39d4\u39d5\u39d6\u39d7\u39d8\u39d9\u39da\u39db\u39dc\u39dd\u39de\u39df\u39e0\u39e1\u39e2\u39e3\u39e4\u39e5\u39e6\u39e7\u39e8\u39e9\u39ea\u39eb\u39ec\u39ed\u39ee\u39ef\u39f0\u39f1\u39f2\u39f3\u39f4\u39f5\u39f6\u39f7\u39f8\u39f9\u39fa\u39fb\u39fc\u39fd\u39fe\u39ff\u3a00\u3a01\u3a02\u3a03\u3a04\u3a05\u3a06\u3a07\u3a08\u3a09\u3a0a\u3a0b\u3a0c\u3a0d\u3a0e\u3a0f\u3a10\u3a11\u3a12\u3a13\u3a14\u3a15\u3a16\u3a17\u3a18\u3a19\u3a1a\u3a1b\u3a1c\u3a1d\u3a1e\u3a1f\u3a20\u3a21\u3a22\u3a23\u3a24\u3a25\u3a26\u3a27\u3a28\u3a29\u3a2a\u3a2b\u3a2c\u3a2d\u3a2e\u3a2f\u3a30\u3a31\u3a32\u3a33\u3a34\u3a35\u3a36\u3a37\u3a38\u3a39\u3a3a\u3a3b\u3a3c\u3a3d\u3a3e\u3a3f\u3a40\u3a41\u3a42\u3a43\u3a44\u3a45\u3a46\u3a47\u3a48\u3a49\u3a4a\u3a4b\u3a4c\u3a4d\u3a4e\u3a4f\u3a50\u3a51\u3a52\u3a53\u3a54\u3a55\u3a56\u3a57\u3a58\u3a59\u3a5a\u3a5b\u3a5c\u3a5d\u3a5e\u3a5f\u3a60\u3a61\u3a62\u3a63\u3a64\u3a65\u3a66\u3a67\u3a68\u3a69\u3a6a\u3a6b\u3a6c\u3a6d\u3a6e\u3a6f\u3a70\u3a71\u3a72\u3a73\u3a74\u3a75\u3a76\u3a77\u3a78\u3a79\u3a7a\u3a7b\u3a7c\u3a7d\u3a7e\u3a7f\u3a80\u3a81\u3a82\u3a83\u3a84\u3a85\u3a86\u3a87\u3a88\u3a89\u3a8a\u3a8b\u3a8c\u3a8d\u3a8e\u3a8f\u3a90\u3a91\u3a92\u3a93\u3a94\u3a95\u3a96\u3a97\u3a98\u3a99\u3a9a\u3a9b\u3a9c\u3a9d\u3a9e\u3a9f\u3aa0\u3aa1\u3aa2\u3aa3\u3aa4\u3aa5\u3aa6\u3aa7\u3aa8\u3aa9\u3aaa\u3aab\u3aac\u3aad\u3aae\u3aaf\u3ab0\u3ab1\u3ab2\u3ab3\u3ab4\u3ab5\u3ab6\u3ab7\u3ab8\u3ab9\u3aba\u3abb\u3abc\u3abd\u3abe\u3abf\u3ac0\u3ac1\u3ac2\u3ac3\u3ac4\u3ac5\u3ac6\u3ac7\u3ac8\u3ac9\u3aca\u3acb\u3acc\u3acd\u3ace\u3acf\u3ad0\u3ad1\u3ad2\u3ad3\u3ad4\u3ad5\u3ad6\u3ad7\u3ad8\u3ad9\u3ada\u3adb\u3adc\u3add\u3ade\u3adf\u3ae0\u3ae1\u3ae2\u3ae3\u3ae4\u3ae5\u3ae6\u3ae7\u3ae8\u3ae9\u3aea\u3aeb\u3aec\u3aed\u3aee\u3aef\u3af0\u3af1\u3af2\u3af3\u3af4\u3af5\u3af6\u3af7\u3af8\u3af9\u3afa\u3afb\u3afc\u3afd\u3afe\u3aff\u3b00\u3b01\u3b02\u3b03\u3b04\u3b05\u3b06\u3b07\u3b08\u3b09\u3b0a\u3b0b\u3b0c\u3b0d\u3b0e\u3b0f\u3b10\u3b11\u3b12\u3b13\u3b14\u3b15\u3b16\u3b17\u3b18\u3b19\u3b1a\u3b1b\u3b1c\u3b1d\u3b1e\u3b1f\u3b20\u3b21\u3b22\u3b23\u3b24\u3b25\u3b26\u3b27\u3b28\u3b29\u3b2a\u3b2b\u3b2c\u3b2d\u3b2e\u3b2f\u3b30\u3b31\u3b32\u3b33\u3b34\u3b35\u3b36\u3b37\u3b38\u3b39\u3b3a\u3b3b\u3b3c\u3b3d\u3b3e\u3b3f\u3b40\u3b41\u3b42\u3b43\u3b44\u3b45\u3b46\u3b47\u3b48\u3b49\u3b4a\u3b4b\u3b4c\u3b4d\u3b4e\u3b4f\u3b50\u3b51\u3b52\u3b53\u3b54\u3b55\u3b56\u3b57\u3b58\u3b59\u3b5a\u3b5b\u3b5c\u3b5d\u3b5e\u3b5f\u3b60\u3b61\u3b62\u3b63\u3b64\u3b65\u3b66\u3b67\u3b68\u3b69\u3b6a\u3b6b\u3b6c\u3b6d\u3b6e\u3b6f\u3b70\u3b71\u3b72\u3b73\u3b74\u3b75\u3b76\u3b77\u3b78\u3b79\u3b7a\u3b7b\u3b7c\u3b7d\u3b7e\u3b7f\u3b80\u3b81\u3b82\u3b83\u3b84\u3b85\u3b86\u3b87\u3b88\u3b89\u3b8a\u3b8b\u3b8c\u3b8d\u3b8e\u3b8f\u3b90\u3b91\u3b92\u3b93\u3b94\u3b95\u3b96\u3b97\u3b98\u3b99\u3b9a\u3b9b\u3b9c\u3b9d\u3b9e\u3b9f\u3ba0\u3ba1\u3ba2\u3ba3\u3ba4\u3ba5\u3ba6\u3ba7\u3ba8\u3ba9\u3baa\u3bab\u3bac\u3bad\u3bae\u3baf\u3bb0\u3bb1\u3bb2\u3bb3\u3bb4\u3bb5\u3bb6\u3bb7\u3bb8\u3bb9\u3bba\u3bbb\u3bbc\u3bbd\u3bbe\u3bbf\u3bc0\u3bc1\u3bc2\u3bc3\u3bc4\u3bc5\u3bc6\u3bc7\u3bc8\u3bc9\u3bca\u3bcb\u3bcc\u3bcd\u3bce\u3bcf\u3bd0\u3bd1\u3bd2\u3bd3\u3bd4\u3bd5\u3bd6\u3bd7\u3bd8\u3bd9\u3bda\u3bdb\u3bdc\u3bdd\u3bde\u3bdf\u3be0\u3be1\u3be2\u3be3\u3be4\u3be5\u3be6\u3be7\u3be8\u3be9\u3bea\u3beb\u3bec\u3bed\u3bee\u3bef\u3bf0\u3bf1\u3bf2\u3bf3\u3bf4\u3bf5\u3bf6\u3bf7\u3bf8\u3bf9\u3bfa\u3bfb\u3bfc\u3bfd\u3bfe\u3bff\u3c00\u3c01\u3c02\u3c03\u3c04\u3c05\u3c06\u3c07\u3c08\u3c09\u3c0a\u3c0b\u3c0c\u3c0d\u3c0e\u3c0f\u3c10\u3c11\u3c12\u3c13\u3c14\u3c15\u3c16\u3c17\u3c18\u3c19\u3c1a\u3c1b\u3c1c\u3c1d\u3c1e\u3c1f\u3c20\u3c21\u3c22\u3c23\u3c24\u3c25\u3c26\u3c27\u3c28\u3c29\u3c2a\u3c2b\u3c2c\u3c2d\u3c2e\u3c2f\u3c30\u3c31\u3c32\u3c33\u3c34\u3c35\u3c36\u3c37\u3c38\u3c39\u3c3a\u3c3b\u3c3c\u3c3d\u3c3e\u3c3f\u3c40\u3c41\u3c42\u3c43\u3c44\u3c45\u3c46\u3c47\u3c48\u3c49\u3c4a\u3c4b\u3c4c\u3c4d\u3c4e\u3c4f\u3c50\u3c51\u3c52\u3c53\u3c54\u3c55\u3c56\u3c57\u3c58\u3c59\u3c5a\u3c5b\u3c5c\u3c5d\u3c5e\u3c5f\u3c60\u3c61\u3c62\u3c63\u3c64\u3c65\u3c66\u3c67\u3c68\u3c69\u3c6a\u3c6b\u3c6c\u3c6d\u3c6e\u3c6f\u3c70\u3c71\u3c72\u3c73\u3c74\u3c75\u3c76\u3c77\u3c78\u3c79\u3c7a\u3c7b\u3c7c\u3c7d\u3c7e\u3c7f\u3c80\u3c81\u3c82\u3c83\u3c84\u3c85\u3c86\u3c87\u3c88\u3c89\u3c8a\u3c8b\u3c8c\u3c8d\u3c8e\u3c8f\u3c90\u3c91\u3c92\u3c93\u3c94\u3c95\u3c96\u3c97\u3c98\u3c99\u3c9a\u3c9b\u3c9c\u3c9d\u3c9e\u3c9f\u3ca0\u3ca1\u3ca2\u3ca3\u3ca4\u3ca5\u3ca6\u3ca7\u3ca8\u3ca9\u3caa\u3cab\u3cac\u3cad\u3cae\u3caf\u3cb0\u3cb1\u3cb2\u3cb3\u3cb4\u3cb5\u3cb6\u3cb7\u3cb8\u3cb9\u3cba\u3cbb\u3cbc\u3cbd\u3cbe\u3cbf\u3cc0\u3cc1\u3cc2\u3cc3\u3cc4\u3cc5\u3cc6\u3cc7\u3cc8\u3cc9\u3cca\u3ccb\u3ccc\u3ccd\u3cce\u3ccf\u3cd0\u3cd1\u3cd2\u3cd3\u3cd4\u3cd5\u3cd6\u3cd7\u3cd8\u3cd9\u3cda\u3cdb\u3cdc\u3cdd\u3cde\u3cdf\u3ce0\u3ce1\u3ce2\u3ce3\u3ce4\u3ce5\u3ce6\u3ce7\u3ce8\u3ce9\u3cea\u3ceb\u3cec\u3ced\u3cee\u3cef\u3cf0\u3cf1\u3cf2\u3cf3\u3cf4\u3cf5\u3cf6\u3cf7\u3cf8\u3cf9\u3cfa\u3cfb\u3cfc\u3cfd\u3cfe\u3cff\u3d00\u3d01\u3d02\u3d03\u3d04\u3d05\u3d06\u3d07\u3d08\u3d09\u3d0a\u3d0b\u3d0c\u3d0d\u3d0e\u3d0f\u3d10\u3d11\u3d12\u3d13\u3d14\u3d15\u3d16\u3d17\u3d18\u3d19\u3d1a\u3d1b\u3d1c\u3d1d\u3d1e\u3d1f\u3d20\u3d21\u3d22\u3d23\u3d24\u3d25\u3d26\u3d27\u3d28\u3d29\u3d2a\u3d2b\u3d2c\u3d2d\u3d2e\u3d2f\u3d30\u3d31\u3d32\u3d33\u3d34\u3d35\u3d36\u3d37\u3d38\u3d39\u3d3a\u3d3b\u3d3c\u3d3d\u3d3e\u3d3f\u3d40\u3d41\u3d42\u3d43\u3d44\u3d45\u3d46\u3d47\u3d48\u3d49\u3d4a\u3d4b\u3d4c\u3d4d\u3d4e\u3d4f\u3d50\u3d51\u3d52\u3d53\u3d54\u3d55\u3d56\u3d57\u3d58\u3d59\u3d5a\u3d5b\u3d5c\u3d5d\u3d5e\u3d5f\u3d60\u3d61\u3d62\u3d63\u3d64\u3d65\u3d66\u3d67\u3d68\u3d69\u3d6a\u3d6b\u3d6c\u3d6d\u3d6e\u3d6f\u3d70\u3d71\u3d72\u3d73\u3d74\u3d75\u3d76\u3d77\u3d78\u3d79\u3d7a\u3d7b\u3d7c\u3d7d\u3d7e\u3d7f\u3d80\u3d81\u3d82\u3d83\u3d84\u3d85\u3d86\u3d87\u3d88\u3d89\u3d8a\u3d8b\u3d8c\u3d8d\u3d8e\u3d8f\u3d90\u3d91\u3d92\u3d93\u3d94\u3d95\u3d96\u3d97\u3d98\u3d99\u3d9a\u3d9b\u3d9c\u3d9d\u3d9e\u3d9f\u3da0\u3da1\u3da2\u3da3\u3da4\u3da5\u3da6\u3da7\u3da8\u3da9\u3daa\u3dab\u3dac\u3dad\u3dae\u3daf\u3db0\u3db1\u3db2\u3db3\u3db4\u3db5\u3db6\u3db7\u3db8\u3db9\u3dba\u3dbb\u3dbc\u3dbd\u3dbe\u3dbf\u3dc0\u3dc1\u3dc2\u3dc3\u3dc4\u3dc5\u3dc6\u3dc7\u3dc8\u3dc9\u3dca\u3dcb\u3dcc\u3dcd\u3dce\u3dcf\u3dd0\u3dd1\u3dd2\u3dd3\u3dd4\u3dd5\u3dd6\u3dd7\u3dd8\u3dd9\u3dda\u3ddb\u3ddc\u3ddd\u3dde\u3ddf\u3de0\u3de1\u3de2\u3de3\u3de4\u3de5\u3de6\u3de7\u3de8\u3de9\u3dea\u3deb\u3dec\u3ded\u3dee\u3def\u3df0\u3df1\u3df2\u3df3\u3df4\u3df5\u3df6\u3df7\u3df8\u3df9\u3dfa\u3dfb\u3dfc\u3dfd\u3dfe\u3dff\u3e00\u3e01\u3e02\u3e03\u3e04\u3e05\u3e06\u3e07\u3e08\u3e09\u3e0a\u3e0b\u3e0c\u3e0d\u3e0e\u3e0f\u3e10\u3e11\u3e12\u3e13\u3e14\u3e15\u3e16\u3e17\u3e18\u3e19\u3e1a\u3e1b\u3e1c\u3e1d\u3e1e\u3e1f\u3e20\u3e21\u3e22\u3e23\u3e24\u3e25\u3e26\u3e27\u3e28\u3e29\u3e2a\u3e2b\u3e2c\u3e2d\u3e2e\u3e2f\u3e30\u3e31\u3e32\u3e33\u3e34\u3e35\u3e36\u3e37\u3e38\u3e39\u3e3a\u3e3b\u3e3c\u3e3d\u3e3e\u3e3f\u3e40\u3e41\u3e42\u3e43\u3e44\u3e45\u3e46\u3e47\u3e48\u3e49\u3e4a\u3e4b\u3e4c\u3e4d\u3e4e\u3e4f\u3e50\u3e51\u3e52\u3e53\u3e54\u3e55\u3e56\u3e57\u3e58\u3e59\u3e5a\u3e5b\u3e5c\u3e5d\u3e5e\u3e5f\u3e60\u3e61\u3e62\u3e63\u3e64\u3e65\u3e66\u3e67\u3e68\u3e69\u3e6a\u3e6b\u3e6c\u3e6d\u3e6e\u3e6f\u3e70\u3e71\u3e72\u3e73\u3e74\u3e75\u3e76\u3e77\u3e78\u3e79\u3e7a\u3e7b\u3e7c\u3e7d\u3e7e\u3e7f\u3e80\u3e81\u3e82\u3e83\u3e84\u3e85\u3e86\u3e87\u3e88\u3e89\u3e8a\u3e8b\u3e8c\u3e8d\u3e8e\u3e8f\u3e90\u3e91\u3e92\u3e93\u3e94\u3e95\u3e96\u3e97\u3e98\u3e99\u3e9a\u3e9b\u3e9c\u3e9d\u3e9e\u3e9f\u3ea0\u3ea1\u3ea2\u3ea3\u3ea4\u3ea5\u3ea6\u3ea7\u3ea8\u3ea9\u3eaa\u3eab\u3eac\u3ead\u3eae\u3eaf\u3eb0\u3eb1\u3eb2\u3eb3\u3eb4\u3eb5\u3eb6\u3eb7\u3eb8\u3eb9\u3eba\u3ebb\u3ebc\u3ebd\u3ebe\u3ebf\u3ec0\u3ec1\u3ec2\u3ec3\u3ec4\u3ec5\u3ec6\u3ec7\u3ec8\u3ec9\u3eca\u3ecb\u3ecc\u3ecd\u3ece\u3ecf\u3ed0\u3ed1\u3ed2\u3ed3\u3ed4\u3ed5\u3ed6\u3ed7\u3ed8\u3ed9\u3eda\u3edb\u3edc\u3edd\u3ede\u3edf\u3ee0\u3ee1\u3ee2\u3ee3\u3ee4\u3ee5\u3ee6\u3ee7\u3ee8\u3ee9\u3eea\u3eeb\u3eec\u3eed\u3eee\u3eef\u3ef0\u3ef1\u3ef2\u3ef3\u3ef4\u3ef5\u3ef6\u3ef7\u3ef8\u3ef9\u3efa\u3efb\u3efc\u3efd\u3efe\u3eff\u3f00\u3f01\u3f02\u3f03\u3f04\u3f05\u3f06\u3f07\u3f08\u3f09\u3f0a\u3f0b\u3f0c\u3f0d\u3f0e\u3f0f\u3f10\u3f11\u3f12\u3f13\u3f14\u3f15\u3f16\u3f17\u3f18\u3f19\u3f1a\u3f1b\u3f1c\u3f1d\u3f1e\u3f1f\u3f20\u3f21\u3f22\u3f23\u3f24\u3f25\u3f26\u3f27\u3f28\u3f29\u3f2a\u3f2b\u3f2c\u3f2d\u3f2e\u3f2f\u3f30\u3f31\u3f32\u3f33\u3f34\u3f35\u3f36\u3f37\u3f38\u3f39\u3f3a\u3f3b\u3f3c\u3f3d\u3f3e\u3f3f\u3f40\u3f41\u3f42\u3f43\u3f44\u3f45\u3f46\u3f47\u3f48\u3f49\u3f4a\u3f4b\u3f4c\u3f4d\u3f4e\u3f4f\u3f50\u3f51\u3f52\u3f53\u3f54\u3f55\u3f56\u3f57\u3f58\u3f59\u3f5a\u3f5b\u3f5c\u3f5d\u3f5e\u3f5f\u3f60\u3f61\u3f62\u3f63\u3f64\u3f65\u3f66\u3f67\u3f68\u3f69\u3f6a\u3f6b\u3f6c\u3f6d\u3f6e\u3f6f\u3f70\u3f71\u3f72\u3f73\u3f74\u3f75\u3f76\u3f77\u3f78\u3f79\u3f7a\u3f7b\u3f7c\u3f7d\u3f7e\u3f7f\u3f80\u3f81\u3f82\u3f83\u3f84\u3f85\u3f86\u3f87\u3f88\u3f89\u3f8a\u3f8b\u3f8c\u3f8d\u3f8e\u3f8f\u3f90\u3f91\u3f92\u3f93\u3f94\u3f95\u3f96\u3f97\u3f98\u3f99\u3f9a\u3f9b\u3f9c\u3f9d\u3f9e\u3f9f\u3fa0\u3fa1\u3fa2\u3fa3\u3fa4\u3fa5\u3fa6\u3fa7\u3fa8\u3fa9\u3faa\u3fab\u3fac\u3fad\u3fae\u3faf\u3fb0\u3fb1\u3fb2\u3fb3\u3fb4\u3fb5\u3fb6\u3fb7\u3fb8\u3fb9\u3fba\u3fbb\u3fbc\u3fbd\u3fbe\u3fbf\u3fc0\u3fc1\u3fc2\u3fc3\u3fc4\u3fc5\u3fc6\u3fc7\u3fc8\u3fc9\u3fca\u3fcb\u3fcc\u3fcd\u3fce\u3fcf\u3fd0\u3fd1\u3fd2\u3fd3\u3fd4\u3fd5\u3fd6\u3fd7\u3fd8\u3fd9\u3fda\u3fdb\u3fdc\u3fdd\u3fde\u3fdf\u3fe0\u3fe1\u3fe2\u3fe3\u3fe4\u3fe5\u3fe6\u3fe7\u3fe8\u3fe9\u3fea\u3feb\u3fec\u3fed\u3fee\u3fef\u3ff0\u3ff1\u3ff2\u3ff3\u3ff4\u3ff5\u3ff6\u3ff7\u3ff8\u3ff9\u3ffa\u3ffb\u3ffc\u3ffd\u3ffe\u3fff\u4000\u4001\u4002\u4003\u4004\u4005\u4006\u4007\u4008\u4009\u400a\u400b\u400c\u400d\u400e\u400f\u4010\u4011\u4012\u4013\u4014\u4015\u4016\u4017\u4018\u4019\u401a\u401b\u401c\u401d\u401e\u401f\u4020\u4021\u4022\u4023\u4024\u4025\u4026\u4027\u4028\u4029\u402a\u402b\u402c\u402d\u402e\u402f\u4030\u4031\u4032\u4033\u4034\u4035\u4036\u4037\u4038\u4039\u403a\u403b\u403c\u403d\u403e\u403f\u4040\u4041\u4042\u4043\u4044\u4045\u4046\u4047\u4048\u4049\u404a\u404b\u404c\u404d\u404e\u404f\u4050\u4051\u4052\u4053\u4054\u4055\u4056\u4057\u4058\u4059\u405a\u405b\u405c\u405d\u405e\u405f\u4060\u4061\u4062\u4063\u4064\u4065\u4066\u4067\u4068\u4069\u406a\u406b\u406c\u406d\u406e\u406f\u4070\u4071\u4072\u4073\u4074\u4075\u4076\u4077\u4078\u4079\u407a\u407b\u407c\u407d\u407e\u407f\u4080\u4081\u4082\u4083\u4084\u4085\u4086\u4087\u4088\u4089\u408a\u408b\u408c\u408d\u408e\u408f\u4090\u4091\u4092\u4093\u4094\u4095\u4096\u4097\u4098\u4099\u409a\u409b\u409c\u409d\u409e\u409f\u40a0\u40a1\u40a2\u40a3\u40a4\u40a5\u40a6\u40a7\u40a8\u40a9\u40aa\u40ab\u40ac\u40ad\u40ae\u40af\u40b0\u40b1\u40b2\u40b3\u40b4\u40b5\u40b6\u40b7\u40b8\u40b9\u40ba\u40bb\u40bc\u40bd\u40be\u40bf\u40c0\u40c1\u40c2\u40c3\u40c4\u40c5\u40c6\u40c7\u40c8\u40c9\u40ca\u40cb\u40cc\u40cd\u40ce\u40cf\u40d0\u40d1\u40d2\u40d3\u40d4\u40d5\u40d6\u40d7\u40d8\u40d9\u40da\u40db\u40dc\u40dd\u40de\u40df\u40e0\u40e1\u40e2\u40e3\u40e4\u40e5\u40e6\u40e7\u40e8\u40e9\u40ea\u40eb\u40ec\u40ed\u40ee\u40ef\u40f0\u40f1\u40f2\u40f3\u40f4\u40f5\u40f6\u40f7\u40f8\u40f9\u40fa\u40fb\u40fc\u40fd\u40fe\u40ff\u4100\u4101\u4102\u4103\u4104\u4105\u4106\u4107\u4108\u4109\u410a\u410b\u410c\u410d\u410e\u410f\u4110\u4111\u4112\u4113\u4114\u4115\u4116\u4117\u4118\u4119\u411a\u411b\u411c\u411d\u411e\u411f\u4120\u4121\u4122\u4123\u4124\u4125\u4126\u4127\u4128\u4129\u412a\u412b\u412c\u412d\u412e\u412f\u4130\u4131\u4132\u4133\u4134\u4135\u4136\u4137\u4138\u4139\u413a\u413b\u413c\u413d\u413e\u413f\u4140\u4141\u4142\u4143\u4144\u4145\u4146\u4147\u4148\u4149\u414a\u414b\u414c\u414d\u414e\u414f\u4150\u4151\u4152\u4153\u4154\u4155\u4156\u4157\u4158\u4159\u415a\u415b\u415c\u415d\u415e\u415f\u4160\u4161\u4162\u4163\u4164\u4165\u4166\u4167\u4168\u4169\u416a\u416b\u416c\u416d\u416e\u416f\u4170\u4171\u4172\u4173\u4174\u4175\u4176\u4177\u4178\u4179\u417a\u417b\u417c\u417d\u417e\u417f\u4180\u4181\u4182\u4183\u4184\u4185\u4186\u4187\u4188\u4189\u418a\u418b\u418c\u418d\u418e\u418f\u4190\u4191\u4192\u4193\u4194\u4195\u4196\u4197\u4198\u4199\u419a\u419b\u419c\u419d\u419e\u419f\u41a0\u41a1\u41a2\u41a3\u41a4\u41a5\u41a6\u41a7\u41a8\u41a9\u41aa\u41ab\u41ac\u41ad\u41ae\u41af\u41b0\u41b1\u41b2\u41b3\u41b4\u41b5\u41b6\u41b7\u41b8\u41b9\u41ba\u41bb\u41bc\u41bd\u41be\u41bf\u41c0\u41c1\u41c2\u41c3\u41c4\u41c5\u41c6\u41c7\u41c8\u41c9\u41ca\u41cb\u41cc\u41cd\u41ce\u41cf\u41d0\u41d1\u41d2\u41d3\u41d4\u41d5\u41d6\u41d7\u41d8\u41d9\u41da\u41db\u41dc\u41dd\u41de\u41df\u41e0\u41e1\u41e2\u41e3\u41e4\u41e5\u41e6\u41e7\u41e8\u41e9\u41ea\u41eb\u41ec\u41ed\u41ee\u41ef\u41f0\u41f1\u41f2\u41f3\u41f4\u41f5\u41f6\u41f7\u41f8\u41f9\u41fa\u41fb\u41fc\u41fd\u41fe\u41ff\u4200\u4201\u4202\u4203\u4204\u4205\u4206\u4207\u4208\u4209\u420a\u420b\u420c\u420d\u420e\u420f\u4210\u4211\u4212\u4213\u4214\u4215\u4216\u4217\u4218\u4219\u421a\u421b\u421c\u421d\u421e\u421f\u4220\u4221\u4222\u4223\u4224\u4225\u4226\u4227\u4228\u4229\u422a\u422b\u422c\u422d\u422e\u422f\u4230\u4231\u4232\u4233\u4234\u4235\u4236\u4237\u4238\u4239\u423a\u423b\u423c\u423d\u423e\u423f\u4240\u4241\u4242\u4243\u4244\u4245\u4246\u4247\u4248\u4249\u424a\u424b\u424c\u424d\u424e\u424f\u4250\u4251\u4252\u4253\u4254\u4255\u4256\u4257\u4258\u4259\u425a\u425b\u425c\u425d\u425e\u425f\u4260\u4261\u4262\u4263\u4264\u4265\u4266\u4267\u4268\u4269\u426a\u426b\u426c\u426d\u426e\u426f\u4270\u4271\u4272\u4273\u4274\u4275\u4276\u4277\u4278\u4279\u427a\u427b\u427c\u427d\u427e\u427f\u4280\u4281\u4282\u4283\u4284\u4285\u4286\u4287\u4288\u4289\u428a\u428b\u428c\u428d\u428e\u428f\u4290\u4291\u4292\u4293\u4294\u4295\u4296\u4297\u4298\u4299\u429a\u429b\u429c\u429d\u429e\u429f\u42a0\u42a1\u42a2\u42a3\u42a4\u42a5\u42a6\u42a7\u42a8\u42a9\u42aa\u42ab\u42ac\u42ad\u42ae\u42af\u42b0\u42b1\u42b2\u42b3\u42b4\u42b5\u42b6\u42b7\u42b8\u42b9\u42ba\u42bb\u42bc\u42bd\u42be\u42bf\u42c0\u42c1\u42c2\u42c3\u42c4\u42c5\u42c6\u42c7\u42c8\u42c9\u42ca\u42cb\u42cc\u42cd\u42ce\u42cf\u42d0\u42d1\u42d2\u42d3\u42d4\u42d5\u42d6\u42d7\u42d8\u42d9\u42da\u42db\u42dc\u42dd\u42de\u42df\u42e0\u42e1\u42e2\u42e3\u42e4\u42e5\u42e6\u42e7\u42e8\u42e9\u42ea\u42eb\u42ec\u42ed\u42ee\u42ef\u42f0\u42f1\u42f2\u42f3\u42f4\u42f5\u42f6\u42f7\u42f8\u42f9\u42fa\u42fb\u42fc\u42fd\u42fe\u42ff\u4300\u4301\u4302\u4303\u4304\u4305\u4306\u4307\u4308\u4309\u430a\u430b\u430c\u430d\u430e\u430f\u4310\u4311\u4312\u4313\u4314\u4315\u4316\u4317\u4318\u4319\u431a\u431b\u431c\u431d\u431e\u431f\u4320\u4321\u4322\u4323\u4324\u4325\u4326\u4327\u4328\u4329\u432a\u432b\u432c\u432d\u432e\u432f\u4330\u4331\u4332\u4333\u4334\u4335\u4336\u4337\u4338\u4339\u433a\u433b\u433c\u433d\u433e\u433f\u4340\u4341\u4342\u4343\u4344\u4345\u4346\u4347\u4348\u4349\u434a\u434b\u434c\u434d\u434e\u434f\u4350\u4351\u4352\u4353\u4354\u4355\u4356\u4357\u4358\u4359\u435a\u435b\u435c\u435d\u435e\u435f\u4360\u4361\u4362\u4363\u4364\u4365\u4366\u4367\u4368\u4369\u436a\u436b\u436c\u436d\u436e\u436f\u4370\u4371\u4372\u4373\u4374\u4375\u4376\u4377\u4378\u4379\u437a\u437b\u437c\u437d\u437e\u437f\u4380\u4381\u4382\u4383\u4384\u4385\u4386\u4387\u4388\u4389\u438a\u438b\u438c\u438d\u438e\u438f\u4390\u4391\u4392\u4393\u4394\u4395\u4396\u4397\u4398\u4399\u439a\u439b\u439c\u439d\u439e\u439f\u43a0\u43a1\u43a2\u43a3\u43a4\u43a5\u43a6\u43a7\u43a8\u43a9\u43aa\u43ab\u43ac\u43ad\u43ae\u43af\u43b0\u43b1\u43b2\u43b3\u43b4\u43b5\u43b6\u43b7\u43b8\u43b9\u43ba\u43bb\u43bc\u43bd\u43be\u43bf\u43c0\u43c1\u43c2\u43c3\u43c4\u43c5\u43c6\u43c7\u43c8\u43c9\u43ca\u43cb\u43cc\u43cd\u43ce\u43cf\u43d0\u43d1\u43d2\u43d3\u43d4\u43d5\u43d6\u43d7\u43d8\u43d9\u43da\u43db\u43dc\u43dd\u43de\u43df\u43e0\u43e1\u43e2\u43e3\u43e4\u43e5\u43e6\u43e7\u43e8\u43e9\u43ea\u43eb\u43ec\u43ed\u43ee\u43ef\u43f0\u43f1\u43f2\u43f3\u43f4\u43f5\u43f6\u43f7\u43f8\u43f9\u43fa\u43fb\u43fc\u43fd\u43fe\u43ff\u4400\u4401\u4402\u4403\u4404\u4405\u4406\u4407\u4408\u4409\u440a\u440b\u440c\u440d\u440e\u440f\u4410\u4411\u4412\u4413\u4414\u4415\u4416\u4417\u4418\u4419\u441a\u441b\u441c\u441d\u441e\u441f\u4420\u4421\u4422\u4423\u4424\u4425\u4426\u4427\u4428\u4429\u442a\u442b\u442c\u442d\u442e\u442f\u4430\u4431\u4432\u4433\u4434\u4435\u4436\u4437\u4438\u4439\u443a\u443b\u443c\u443d\u443e\u443f\u4440\u4441\u4442\u4443\u4444\u4445\u4446\u4447\u4448\u4449\u444a\u444b\u444c\u444d\u444e\u444f\u4450\u4451\u4452\u4453\u4454\u4455\u4456\u4457\u4458\u4459\u445a\u445b\u445c\u445d\u445e\u445f\u4460\u4461\u4462\u4463\u4464\u4465\u4466\u4467\u4468\u4469\u446a\u446b\u446c\u446d\u446e\u446f\u4470\u4471\u4472\u4473\u4474\u4475\u4476\u4477\u4478\u4479\u447a\u447b\u447c\u447d\u447e\u447f\u4480\u4481\u4482\u4483\u4484\u4485\u4486\u4487\u4488\u4489\u448a\u448b\u448c\u448d\u448e\u448f\u4490\u4491\u4492\u4493\u4494\u4495\u4496\u4497\u4498\u4499\u449a\u449b\u449c\u449d\u449e\u449f\u44a0\u44a1\u44a2\u44a3\u44a4\u44a5\u44a6\u44a7\u44a8\u44a9\u44aa\u44ab\u44ac\u44ad\u44ae\u44af\u44b0\u44b1\u44b2\u44b3\u44b4\u44b5\u44b6\u44b7\u44b8\u44b9\u44ba\u44bb\u44bc\u44bd\u44be\u44bf\u44c0\u44c1\u44c2\u44c3\u44c4\u44c5\u44c6\u44c7\u44c8\u44c9\u44ca\u44cb\u44cc\u44cd\u44ce\u44cf\u44d0\u44d1\u44d2\u44d3\u44d4\u44d5\u44d6\u44d7\u44d8\u44d9\u44da\u44db\u44dc\u44dd\u44de\u44df\u44e0\u44e1\u44e2\u44e3\u44e4\u44e5\u44e6\u44e7\u44e8\u44e9\u44ea\u44eb\u44ec\u44ed\u44ee\u44ef\u44f0\u44f1\u44f2\u44f3\u44f4\u44f5\u44f6\u44f7\u44f8\u44f9\u44fa\u44fb\u44fc\u44fd\u44fe\u44ff\u4500\u4501\u4502\u4503\u4504\u4505\u4506\u4507\u4508\u4509\u450a\u450b\u450c\u450d\u450e\u450f\u4510\u4511\u4512\u4513\u4514\u4515\u4516\u4517\u4518\u4519\u451a\u451b\u451c\u451d\u451e\u451f\u4520\u4521\u4522\u4523\u4524\u4525\u4526\u4527\u4528\u4529\u452a\u452b\u452c\u452d\u452e\u452f\u4530\u4531\u4532\u4533\u4534\u4535\u4536\u4537\u4538\u4539\u453a\u453b\u453c\u453d\u453e\u453f\u4540\u4541\u4542\u4543\u4544\u4545\u4546\u4547\u4548\u4549\u454a\u454b\u454c\u454d\u454e\u454f\u4550\u4551\u4552\u4553\u4554\u4555\u4556\u4557\u4558\u4559\u455a\u455b\u455c\u455d\u455e\u455f\u4560\u4561\u4562\u4563\u4564\u4565\u4566\u4567\u4568\u4569\u456a\u456b\u456c\u456d\u456e\u456f\u4570\u4571\u4572\u4573\u4574\u4575\u4576\u4577\u4578\u4579\u457a\u457b\u457c\u457d\u457e\u457f\u4580\u4581\u4582\u4583\u4584\u4585\u4586\u4587\u4588\u4589\u458a\u458b\u458c\u458d\u458e\u458f\u4590\u4591\u4592\u4593\u4594\u4595\u4596\u4597\u4598\u4599\u459a\u459b\u459c\u459d\u459e\u459f\u45a0\u45a1\u45a2\u45a3\u45a4\u45a5\u45a6\u45a7\u45a8\u45a9\u45aa\u45ab\u45ac\u45ad\u45ae\u45af\u45b0\u45b1\u45b2\u45b3\u45b4\u45b5\u45b6\u45b7\u45b8\u45b9\u45ba\u45bb\u45bc\u45bd\u45be\u45bf\u45c0\u45c1\u45c2\u45c3\u45c4\u45c5\u45c6\u45c7\u45c8\u45c9\u45ca\u45cb\u45cc\u45cd\u45ce\u45cf\u45d0\u45d1\u45d2\u45d3\u45d4\u45d5\u45d6\u45d7\u45d8\u45d9\u45da\u45db\u45dc\u45dd\u45de\u45df\u45e0\u45e1\u45e2\u45e3\u45e4\u45e5\u45e6\u45e7\u45e8\u45e9\u45ea\u45eb\u45ec\u45ed\u45ee\u45ef\u45f0\u45f1\u45f2\u45f3\u45f4\u45f5\u45f6\u45f7\u45f8\u45f9\u45fa\u45fb\u45fc\u45fd\u45fe\u45ff\u4600\u4601\u4602\u4603\u4604\u4605\u4606\u4607\u4608\u4609\u460a\u460b\u460c\u460d\u460e\u460f\u4610\u4611\u4612\u4613\u4614\u4615\u4616\u4617\u4618\u4619\u461a\u461b\u461c\u461d\u461e\u461f\u4620\u4621\u4622\u4623\u4624\u4625\u4626\u4627\u4628\u4629\u462a\u462b\u462c\u462d\u462e\u462f\u4630\u4631\u4632\u4633\u4634\u4635\u4636\u4637\u4638\u4639\u463a\u463b\u463c\u463d\u463e\u463f\u4640\u4641\u4642\u4643\u4644\u4645\u4646\u4647\u4648\u4649\u464a\u464b\u464c\u464d\u464e\u464f\u4650\u4651\u4652\u4653\u4654\u4655\u4656\u4657\u4658\u4659\u465a\u465b\u465c\u465d\u465e\u465f\u4660\u4661\u4662\u4663\u4664\u4665\u4666\u4667\u4668\u4669\u466a\u466b\u466c\u466d\u466e\u466f\u4670\u4671\u4672\u4673\u4674\u4675\u4676\u4677\u4678\u4679\u467a\u467b\u467c\u467d\u467e\u467f\u4680\u4681\u4682\u4683\u4684\u4685\u4686\u4687\u4688\u4689\u468a\u468b\u468c\u468d\u468e\u468f\u4690\u4691\u4692\u4693\u4694\u4695\u4696\u4697\u4698\u4699\u469a\u469b\u469c\u469d\u469e\u469f\u46a0\u46a1\u46a2\u46a3\u46a4\u46a5\u46a6\u46a7\u46a8\u46a9\u46aa\u46ab\u46ac\u46ad\u46ae\u46af\u46b0\u46b1\u46b2\u46b3\u46b4\u46b5\u46b6\u46b7\u46b8\u46b9\u46ba\u46bb\u46bc\u46bd\u46be\u46bf\u46c0\u46c1\u46c2\u46c3\u46c4\u46c5\u46c6\u46c7\u46c8\u46c9\u46ca\u46cb\u46cc\u46cd\u46ce\u46cf\u46d0\u46d1\u46d2\u46d3\u46d4\u46d5\u46d6\u46d7\u46d8\u46d9\u46da\u46db\u46dc\u46dd\u46de\u46df\u46e0\u46e1\u46e2\u46e3\u46e4\u46e5\u46e6\u46e7\u46e8\u46e9\u46ea\u46eb\u46ec\u46ed\u46ee\u46ef\u46f0\u46f1\u46f2\u46f3\u46f4\u46f5\u46f6\u46f7\u46f8\u46f9\u46fa\u46fb\u46fc\u46fd\u46fe\u46ff\u4700\u4701\u4702\u4703\u4704\u4705\u4706\u4707\u4708\u4709\u470a\u470b\u470c\u470d\u470e\u470f\u4710\u4711\u4712\u4713\u4714\u4715\u4716\u4717\u4718\u4719\u471a\u471b\u471c\u471d\u471e\u471f\u4720\u4721\u4722\u4723\u4724\u4725\u4726\u4727\u4728\u4729\u472a\u472b\u472c\u472d\u472e\u472f\u4730\u4731\u4732\u4733\u4734\u4735\u4736\u4737\u4738\u4739\u473a\u473b\u473c\u473d\u473e\u473f\u4740\u4741\u4742\u4743\u4744\u4745\u4746\u4747\u4748\u4749\u474a\u474b\u474c\u474d\u474e\u474f\u4750\u4751\u4752\u4753\u4754\u4755\u4756\u4757\u4758\u4759\u475a\u475b\u475c\u475d\u475e\u475f\u4760\u4761\u4762\u4763\u4764\u4765\u4766\u4767\u4768\u4769\u476a\u476b\u476c\u476d\u476e\u476f\u4770\u4771\u4772\u4773\u4774\u4775\u4776\u4777\u4778\u4779\u477a\u477b\u477c\u477d\u477e\u477f\u4780\u4781\u4782\u4783\u4784\u4785\u4786\u4787\u4788\u4789\u478a\u478b\u478c\u478d\u478e\u478f\u4790\u4791\u4792\u4793\u4794\u4795\u4796\u4797\u4798\u4799\u479a\u479b\u479c\u479d\u479e\u479f\u47a0\u47a1\u47a2\u47a3\u47a4\u47a5\u47a6\u47a7\u47a8\u47a9\u47aa\u47ab\u47ac\u47ad\u47ae\u47af\u47b0\u47b1\u47b2\u47b3\u47b4\u47b5\u47b6\u47b7\u47b8\u47b9\u47ba\u47bb\u47bc\u47bd\u47be\u47bf\u47c0\u47c1\u47c2\u47c3\u47c4\u47c5\u47c6\u47c7\u47c8\u47c9\u47ca\u47cb\u47cc\u47cd\u47ce\u47cf\u47d0\u47d1\u47d2\u47d3\u47d4\u47d5\u47d6\u47d7\u47d8\u47d9\u47da\u47db\u47dc\u47dd\u47de\u47df\u47e0\u47e1\u47e2\u47e3\u47e4\u47e5\u47e6\u47e7\u47e8\u47e9\u47ea\u47eb\u47ec\u47ed\u47ee\u47ef\u47f0\u47f1\u47f2\u47f3\u47f4\u47f5\u47f6\u47f7\u47f8\u47f9\u47fa\u47fb\u47fc\u47fd\u47fe\u47ff\u4800\u4801\u4802\u4803\u4804\u4805\u4806\u4807\u4808\u4809\u480a\u480b\u480c\u480d\u480e\u480f\u4810\u4811\u4812\u4813\u4814\u4815\u4816\u4817\u4818\u4819\u481a\u481b\u481c\u481d\u481e\u481f\u4820\u4821\u4822\u4823\u4824\u4825\u4826\u4827\u4828\u4829\u482a\u482b\u482c\u482d\u482e\u482f\u4830\u4831\u4832\u4833\u4834\u4835\u4836\u4837\u4838\u4839\u483a\u483b\u483c\u483d\u483e\u483f\u4840\u4841\u4842\u4843\u4844\u4845\u4846\u4847\u4848\u4849\u484a\u484b\u484c\u484d\u484e\u484f\u4850\u4851\u4852\u4853\u4854\u4855\u4856\u4857\u4858\u4859\u485a\u485b\u485c\u485d\u485e\u485f\u4860\u4861\u4862\u4863\u4864\u4865\u4866\u4867\u4868\u4869\u486a\u486b\u486c\u486d\u486e\u486f\u4870\u4871\u4872\u4873\u4874\u4875\u4876\u4877\u4878\u4879\u487a\u487b\u487c\u487d\u487e\u487f\u4880\u4881\u4882\u4883\u4884\u4885\u4886\u4887\u4888\u4889\u488a\u488b\u488c\u488d\u488e\u488f\u4890\u4891\u4892\u4893\u4894\u4895\u4896\u4897\u4898\u4899\u489a\u489b\u489c\u489d\u489e\u489f\u48a0\u48a1\u48a2\u48a3\u48a4\u48a5\u48a6\u48a7\u48a8\u48a9\u48aa\u48ab\u48ac\u48ad\u48ae\u48af\u48b0\u48b1\u48b2\u48b3\u48b4\u48b5\u48b6\u48b7\u48b8\u48b9\u48ba\u48bb\u48bc\u48bd\u48be\u48bf\u48c0\u48c1\u48c2\u48c3\u48c4\u48c5\u48c6\u48c7\u48c8\u48c9\u48ca\u48cb\u48cc\u48cd\u48ce\u48cf\u48d0\u48d1\u48d2\u48d3\u48d4\u48d5\u48d6\u48d7\u48d8\u48d9\u48da\u48db\u48dc\u48dd\u48de\u48df\u48e0\u48e1\u48e2\u48e3\u48e4\u48e5\u48e6\u48e7\u48e8\u48e9\u48ea\u48eb\u48ec\u48ed\u48ee\u48ef\u48f0\u48f1\u48f2\u48f3\u48f4\u48f5\u48f6\u48f7\u48f8\u48f9\u48fa\u48fb\u48fc\u48fd\u48fe\u48ff\u4900\u4901\u4902\u4903\u4904\u4905\u4906\u4907\u4908\u4909\u490a\u490b\u490c\u490d\u490e\u490f\u4910\u4911\u4912\u4913\u4914\u4915\u4916\u4917\u4918\u4919\u491a\u491b\u491c\u491d\u491e\u491f\u4920\u4921\u4922\u4923\u4924\u4925\u4926\u4927\u4928\u4929\u492a\u492b\u492c\u492d\u492e\u492f\u4930\u4931\u4932\u4933\u4934\u4935\u4936\u4937\u4938\u4939\u493a\u493b\u493c\u493d\u493e\u493f\u4940\u4941\u4942\u4943\u4944\u4945\u4946\u4947\u4948\u4949\u494a\u494b\u494c\u494d\u494e\u494f\u4950\u4951\u4952\u4953\u4954\u4955\u4956\u4957\u4958\u4959\u495a\u495b\u495c\u495d\u495e\u495f\u4960\u4961\u4962\u4963\u4964\u4965\u4966\u4967\u4968\u4969\u496a\u496b\u496c\u496d\u496e\u496f\u4970\u4971\u4972\u4973\u4974\u4975\u4976\u4977\u4978\u4979\u497a\u497b\u497c\u497d\u497e\u497f\u4980\u4981\u4982\u4983\u4984\u4985\u4986\u4987\u4988\u4989\u498a\u498b\u498c\u498d\u498e\u498f\u4990\u4991\u4992\u4993\u4994\u4995\u4996\u4997\u4998\u4999\u499a\u499b\u499c\u499d\u499e\u499f\u49a0\u49a1\u49a2\u49a3\u49a4\u49a5\u49a6\u49a7\u49a8\u49a9\u49aa\u49ab\u49ac\u49ad\u49ae\u49af\u49b0\u49b1\u49b2\u49b3\u49b4\u49b5\u49b6\u49b7\u49b8\u49b9\u49ba\u49bb\u49bc\u49bd\u49be\u49bf\u49c0\u49c1\u49c2\u49c3\u49c4\u49c5\u49c6\u49c7\u49c8\u49c9\u49ca\u49cb\u49cc\u49cd\u49ce\u49cf\u49d0\u49d1\u49d2\u49d3\u49d4\u49d5\u49d6\u49d7\u49d8\u49d9\u49da\u49db\u49dc\u49dd\u49de\u49df\u49e0\u49e1\u49e2\u49e3\u49e4\u49e5\u49e6\u49e7\u49e8\u49e9\u49ea\u49eb\u49ec\u49ed\u49ee\u49ef\u49f0\u49f1\u49f2\u49f3\u49f4\u49f5\u49f6\u49f7\u49f8\u49f9\u49fa\u49fb\u49fc\u49fd\u49fe\u49ff\u4a00\u4a01\u4a02\u4a03\u4a04\u4a05\u4a06\u4a07\u4a08\u4a09\u4a0a\u4a0b\u4a0c\u4a0d\u4a0e\u4a0f\u4a10\u4a11\u4a12\u4a13\u4a14\u4a15\u4a16\u4a17\u4a18\u4a19\u4a1a\u4a1b\u4a1c\u4a1d\u4a1e\u4a1f\u4a20\u4a21\u4a22\u4a23\u4a24\u4a25\u4a26\u4a27\u4a28\u4a29\u4a2a\u4a2b\u4a2c\u4a2d\u4a2e\u4a2f\u4a30\u4a31\u4a32\u4a33\u4a34\u4a35\u4a36\u4a37\u4a38\u4a39\u4a3a\u4a3b\u4a3c\u4a3d\u4a3e\u4a3f\u4a40\u4a41\u4a42\u4a43\u4a44\u4a45\u4a46\u4a47\u4a48\u4a49\u4a4a\u4a4b\u4a4c\u4a4d\u4a4e\u4a4f\u4a50\u4a51\u4a52\u4a53\u4a54\u4a55\u4a56\u4a57\u4a58\u4a59\u4a5a\u4a5b\u4a5c\u4a5d\u4a5e\u4a5f\u4a60\u4a61\u4a62\u4a63\u4a64\u4a65\u4a66\u4a67\u4a68\u4a69\u4a6a\u4a6b\u4a6c\u4a6d\u4a6e\u4a6f\u4a70\u4a71\u4a72\u4a73\u4a74\u4a75\u4a76\u4a77\u4a78\u4a79\u4a7a\u4a7b\u4a7c\u4a7d\u4a7e\u4a7f\u4a80\u4a81\u4a82\u4a83\u4a84\u4a85\u4a86\u4a87\u4a88\u4a89\u4a8a\u4a8b\u4a8c\u4a8d\u4a8e\u4a8f\u4a90\u4a91\u4a92\u4a93\u4a94\u4a95\u4a96\u4a97\u4a98\u4a99\u4a9a\u4a9b\u4a9c\u4a9d\u4a9e\u4a9f\u4aa0\u4aa1\u4aa2\u4aa3\u4aa4\u4aa5\u4aa6\u4aa7\u4aa8\u4aa9\u4aaa\u4aab\u4aac\u4aad\u4aae\u4aaf\u4ab0\u4ab1\u4ab2\u4ab3\u4ab4\u4ab5\u4ab6\u4ab7\u4ab8\u4ab9\u4aba\u4abb\u4abc\u4abd\u4abe\u4abf\u4ac0\u4ac1\u4ac2\u4ac3\u4ac4\u4ac5\u4ac6\u4ac7\u4ac8\u4ac9\u4aca\u4acb\u4acc\u4acd\u4ace\u4acf\u4ad0\u4ad1\u4ad2\u4ad3\u4ad4\u4ad5\u4ad6\u4ad7\u4ad8\u4ad9\u4ada\u4adb\u4adc\u4add\u4ade\u4adf\u4ae0\u4ae1\u4ae2\u4ae3\u4ae4\u4ae5\u4ae6\u4ae7\u4ae8\u4ae9\u4aea\u4aeb\u4aec\u4aed\u4aee\u4aef\u4af0\u4af1\u4af2\u4af3\u4af4\u4af5\u4af6\u4af7\u4af8\u4af9\u4afa\u4afb\u4afc\u4afd\u4afe\u4aff\u4b00\u4b01\u4b02\u4b03\u4b04\u4b05\u4b06\u4b07\u4b08\u4b09\u4b0a\u4b0b\u4b0c\u4b0d\u4b0e\u4b0f\u4b10\u4b11\u4b12\u4b13\u4b14\u4b15\u4b16\u4b17\u4b18\u4b19\u4b1a\u4b1b\u4b1c\u4b1d\u4b1e\u4b1f\u4b20\u4b21\u4b22\u4b23\u4b24\u4b25\u4b26\u4b27\u4b28\u4b29\u4b2a\u4b2b\u4b2c\u4b2d\u4b2e\u4b2f\u4b30\u4b31\u4b32\u4b33\u4b34\u4b35\u4b36\u4b37\u4b38\u4b39\u4b3a\u4b3b\u4b3c\u4b3d\u4b3e\u4b3f\u4b40\u4b41\u4b42\u4b43\u4b44\u4b45\u4b46\u4b47\u4b48\u4b49\u4b4a\u4b4b\u4b4c\u4b4d\u4b4e\u4b4f\u4b50\u4b51\u4b52\u4b53\u4b54\u4b55\u4b56\u4b57\u4b58\u4b59\u4b5a\u4b5b\u4b5c\u4b5d\u4b5e\u4b5f\u4b60\u4b61\u4b62\u4b63\u4b64\u4b65\u4b66\u4b67\u4b68\u4b69\u4b6a\u4b6b\u4b6c\u4b6d\u4b6e\u4b6f\u4b70\u4b71\u4b72\u4b73\u4b74\u4b75\u4b76\u4b77\u4b78\u4b79\u4b7a\u4b7b\u4b7c\u4b7d\u4b7e\u4b7f\u4b80\u4b81\u4b82\u4b83\u4b84\u4b85\u4b86\u4b87\u4b88\u4b89\u4b8a\u4b8b\u4b8c\u4b8d\u4b8e\u4b8f\u4b90\u4b91\u4b92\u4b93\u4b94\u4b95\u4b96\u4b97\u4b98\u4b99\u4b9a\u4b9b\u4b9c\u4b9d\u4b9e\u4b9f\u4ba0\u4ba1\u4ba2\u4ba3\u4ba4\u4ba5\u4ba6\u4ba7\u4ba8\u4ba9\u4baa\u4bab\u4bac\u4bad\u4bae\u4baf\u4bb0\u4bb1\u4bb2\u4bb3\u4bb4\u4bb5\u4bb6\u4bb7\u4bb8\u4bb9\u4bba\u4bbb\u4bbc\u4bbd\u4bbe\u4bbf\u4bc0\u4bc1\u4bc2\u4bc3\u4bc4\u4bc5\u4bc6\u4bc7\u4bc8\u4bc9\u4bca\u4bcb\u4bcc\u4bcd\u4bce\u4bcf\u4bd0\u4bd1\u4bd2\u4bd3\u4bd4\u4bd5\u4bd6\u4bd7\u4bd8\u4bd9\u4bda\u4bdb\u4bdc\u4bdd\u4bde\u4bdf\u4be0\u4be1\u4be2\u4be3\u4be4\u4be5\u4be6\u4be7\u4be8\u4be9\u4bea\u4beb\u4bec\u4bed\u4bee\u4bef\u4bf0\u4bf1\u4bf2\u4bf3\u4bf4\u4bf5\u4bf6\u4bf7\u4bf8\u4bf9\u4bfa\u4bfb\u4bfc\u4bfd\u4bfe\u4bff\u4c00\u4c01\u4c02\u4c03\u4c04\u4c05\u4c06\u4c07\u4c08\u4c09\u4c0a\u4c0b\u4c0c\u4c0d\u4c0e\u4c0f\u4c10\u4c11\u4c12\u4c13\u4c14\u4c15\u4c16\u4c17\u4c18\u4c19\u4c1a\u4c1b\u4c1c\u4c1d\u4c1e\u4c1f\u4c20\u4c21\u4c22\u4c23\u4c24\u4c25\u4c26\u4c27\u4c28\u4c29\u4c2a\u4c2b\u4c2c\u4c2d\u4c2e\u4c2f\u4c30\u4c31\u4c32\u4c33\u4c34\u4c35\u4c36\u4c37\u4c38\u4c39\u4c3a\u4c3b\u4c3c\u4c3d\u4c3e\u4c3f\u4c40\u4c41\u4c42\u4c43\u4c44\u4c45\u4c46\u4c47\u4c48\u4c49\u4c4a\u4c4b\u4c4c\u4c4d\u4c4e\u4c4f\u4c50\u4c51\u4c52\u4c53\u4c54\u4c55\u4c56\u4c57\u4c58\u4c59\u4c5a\u4c5b\u4c5c\u4c5d\u4c5e\u4c5f\u4c60\u4c61\u4c62\u4c63\u4c64\u4c65\u4c66\u4c67\u4c68\u4c69\u4c6a\u4c6b\u4c6c\u4c6d\u4c6e\u4c6f\u4c70\u4c71\u4c72\u4c73\u4c74\u4c75\u4c76\u4c77\u4c78\u4c79\u4c7a\u4c7b\u4c7c\u4c7d\u4c7e\u4c7f\u4c80\u4c81\u4c82\u4c83\u4c84\u4c85\u4c86\u4c87\u4c88\u4c89\u4c8a\u4c8b\u4c8c\u4c8d\u4c8e\u4c8f\u4c90\u4c91\u4c92\u4c93\u4c94\u4c95\u4c96\u4c97\u4c98\u4c99\u4c9a\u4c9b\u4c9c\u4c9d\u4c9e\u4c9f\u4ca0\u4ca1\u4ca2\u4ca3\u4ca4\u4ca5\u4ca6\u4ca7\u4ca8\u4ca9\u4caa\u4cab\u4cac\u4cad\u4cae\u4caf\u4cb0\u4cb1\u4cb2\u4cb3\u4cb4\u4cb5\u4cb6\u4cb7\u4cb8\u4cb9\u4cba\u4cbb\u4cbc\u4cbd\u4cbe\u4cbf\u4cc0\u4cc1\u4cc2\u4cc3\u4cc4\u4cc5\u4cc6\u4cc7\u4cc8\u4cc9\u4cca\u4ccb\u4ccc\u4ccd\u4cce\u4ccf\u4cd0\u4cd1\u4cd2\u4cd3\u4cd4\u4cd5\u4cd6\u4cd7\u4cd8\u4cd9\u4cda\u4cdb\u4cdc\u4cdd\u4cde\u4cdf\u4ce0\u4ce1\u4ce2\u4ce3\u4ce4\u4ce5\u4ce6\u4ce7\u4ce8\u4ce9\u4cea\u4ceb\u4cec\u4ced\u4cee\u4cef\u4cf0\u4cf1\u4cf2\u4cf3\u4cf4\u4cf5\u4cf6\u4cf7\u4cf8\u4cf9\u4cfa\u4cfb\u4cfc\u4cfd\u4cfe\u4cff\u4d00\u4d01\u4d02\u4d03\u4d04\u4d05\u4d06\u4d07\u4d08\u4d09\u4d0a\u4d0b\u4d0c\u4d0d\u4d0e\u4d0f\u4d10\u4d11\u4d12\u4d13\u4d14\u4d15\u4d16\u4d17\u4d18\u4d19\u4d1a\u4d1b\u4d1c\u4d1d\u4d1e\u4d1f\u4d20\u4d21\u4d22\u4d23\u4d24\u4d25\u4d26\u4d27\u4d28\u4d29\u4d2a\u4d2b\u4d2c\u4d2d\u4d2e\u4d2f\u4d30\u4d31\u4d32\u4d33\u4d34\u4d35\u4d36\u4d37\u4d38\u4d39\u4d3a\u4d3b\u4d3c\u4d3d\u4d3e\u4d3f\u4d40\u4d41\u4d42\u4d43\u4d44\u4d45\u4d46\u4d47\u4d48\u4d49\u4d4a\u4d4b\u4d4c\u4d4d\u4d4e\u4d4f\u4d50\u4d51\u4d52\u4d53\u4d54\u4d55\u4d56\u4d57\u4d58\u4d59\u4d5a\u4d5b\u4d5c\u4d5d\u4d5e\u4d5f\u4d60\u4d61\u4d62\u4d63\u4d64\u4d65\u4d66\u4d67\u4d68\u4d69\u4d6a\u4d6b\u4d6c\u4d6d\u4d6e\u4d6f\u4d70\u4d71\u4d72\u4d73\u4d74\u4d75\u4d76\u4d77\u4d78\u4d79\u4d7a\u4d7b\u4d7c\u4d7d\u4d7e\u4d7f\u4d80\u4d81\u4d82\u4d83\u4d84\u4d85\u4d86\u4d87\u4d88\u4d89\u4d8a\u4d8b\u4d8c\u4d8d\u4d8e\u4d8f\u4d90\u4d91\u4d92\u4d93\u4d94\u4d95\u4d96\u4d97\u4d98\u4d99\u4d9a\u4d9b\u4d9c\u4d9d\u4d9e\u4d9f\u4da0\u4da1\u4da2\u4da3\u4da4\u4da5\u4da6\u4da7\u4da8\u4da9\u4daa\u4dab\u4dac\u4dad\u4dae\u4daf\u4db0\u4db1\u4db2\u4db3\u4db4\u4db5\u4e00\u4e01\u4e02\u4e03\u4e04\u4e05\u4e06\u4e07\u4e08\u4e09\u4e0a\u4e0b\u4e0c\u4e0d\u4e0e\u4e0f\u4e10\u4e11\u4e12\u4e13\u4e14\u4e15\u4e16\u4e17\u4e18\u4e19\u4e1a\u4e1b\u4e1c\u4e1d\u4e1e\u4e1f\u4e20\u4e21\u4e22\u4e23\u4e24\u4e25\u4e26\u4e27\u4e28\u4e29\u4e2a\u4e2b\u4e2c\u4e2d\u4e2e\u4e2f\u4e30\u4e31\u4e32\u4e33\u4e34\u4e35\u4e36\u4e37\u4e38\u4e39\u4e3a\u4e3b\u4e3c\u4e3d\u4e3e\u4e3f\u4e40\u4e41\u4e42\u4e43\u4e44\u4e45\u4e46\u4e47\u4e48\u4e49\u4e4a\u4e4b\u4e4c\u4e4d\u4e4e\u4e4f\u4e50\u4e51\u4e52\u4e53\u4e54\u4e55\u4e56\u4e57\u4e58\u4e59\u4e5a\u4e5b\u4e5c\u4e5d\u4e5e\u4e5f\u4e60\u4e61\u4e62\u4e63\u4e64\u4e65\u4e66\u4e67\u4e68\u4e69\u4e6a\u4e6b\u4e6c\u4e6d\u4e6e\u4e6f\u4e70\u4e71\u4e72\u4e73\u4e74\u4e75\u4e76\u4e77\u4e78\u4e79\u4e7a\u4e7b\u4e7c\u4e7d\u4e7e\u4e7f\u4e80\u4e81\u4e82\u4e83\u4e84\u4e85\u4e86\u4e87\u4e88\u4e89\u4e8a\u4e8b\u4e8c\u4e8d\u4e8e\u4e8f\u4e90\u4e91\u4e92\u4e93\u4e94\u4e95\u4e96\u4e97\u4e98\u4e99\u4e9a\u4e9b\u4e9c\u4e9d\u4e9e\u4e9f\u4ea0\u4ea1\u4ea2\u4ea3\u4ea4\u4ea5\u4ea6\u4ea7\u4ea8\u4ea9\u4eaa\u4eab\u4eac\u4ead\u4eae\u4eaf\u4eb0\u4eb1\u4eb2\u4eb3\u4eb4\u4eb5\u4eb6\u4eb7\u4eb8\u4eb9\u4eba\u4ebb\u4ebc\u4ebd\u4ebe\u4ebf\u4ec0\u4ec1\u4ec2\u4ec3\u4ec4\u4ec5\u4ec6\u4ec7\u4ec8\u4ec9\u4eca\u4ecb\u4ecc\u4ecd\u4ece\u4ecf\u4ed0\u4ed1\u4ed2\u4ed3\u4ed4\u4ed5\u4ed6\u4ed7\u4ed8\u4ed9\u4eda\u4edb\u4edc\u4edd\u4ede\u4edf\u4ee0\u4ee1\u4ee2\u4ee3\u4ee4\u4ee5\u4ee6\u4ee7\u4ee8\u4ee9\u4eea\u4eeb\u4eec\u4eed\u4eee\u4eef\u4ef0\u4ef1\u4ef2\u4ef3\u4ef4\u4ef5\u4ef6\u4ef7\u4ef8\u4ef9\u4efa\u4efb\u4efc\u4efd\u4efe\u4eff\u4f00\u4f01\u4f02\u4f03\u4f04\u4f05\u4f06\u4f07\u4f08\u4f09\u4f0a\u4f0b\u4f0c\u4f0d\u4f0e\u4f0f\u4f10\u4f11\u4f12\u4f13\u4f14\u4f15\u4f16\u4f17\u4f18\u4f19\u4f1a\u4f1b\u4f1c\u4f1d\u4f1e\u4f1f\u4f20\u4f21\u4f22\u4f23\u4f24\u4f25\u4f26\u4f27\u4f28\u4f29\u4f2a\u4f2b\u4f2c\u4f2d\u4f2e\u4f2f\u4f30\u4f31\u4f32\u4f33\u4f34\u4f35\u4f36\u4f37\u4f38\u4f39\u4f3a\u4f3b\u4f3c\u4f3d\u4f3e\u4f3f\u4f40\u4f41\u4f42\u4f43\u4f44\u4f45\u4f46\u4f47\u4f48\u4f49\u4f4a\u4f4b\u4f4c\u4f4d\u4f4e\u4f4f\u4f50\u4f51\u4f52\u4f53\u4f54\u4f55\u4f56\u4f57\u4f58\u4f59\u4f5a\u4f5b\u4f5c\u4f5d\u4f5e\u4f5f\u4f60\u4f61\u4f62\u4f63\u4f64\u4f65\u4f66\u4f67\u4f68\u4f69\u4f6a\u4f6b\u4f6c\u4f6d\u4f6e\u4f6f\u4f70\u4f71\u4f72\u4f73\u4f74\u4f75\u4f76\u4f77\u4f78\u4f79\u4f7a\u4f7b\u4f7c\u4f7d\u4f7e\u4f7f\u4f80\u4f81\u4f82\u4f83\u4f84\u4f85\u4f86\u4f87\u4f88\u4f89\u4f8a\u4f8b\u4f8c\u4f8d\u4f8e\u4f8f\u4f90\u4f91\u4f92\u4f93\u4f94\u4f95\u4f96\u4f97\u4f98\u4f99\u4f9a\u4f9b\u4f9c\u4f9d\u4f9e\u4f9f\u4fa0\u4fa1\u4fa2\u4fa3\u4fa4\u4fa5\u4fa6\u4fa7\u4fa8\u4fa9\u4faa\u4fab\u4fac\u4fad\u4fae\u4faf\u4fb0\u4fb1\u4fb2\u4fb3\u4fb4\u4fb5\u4fb6\u4fb7\u4fb8\u4fb9\u4fba\u4fbb\u4fbc\u4fbd\u4fbe\u4fbf\u4fc0\u4fc1\u4fc2\u4fc3\u4fc4\u4fc5\u4fc6\u4fc7\u4fc8\u4fc9\u4fca\u4fcb\u4fcc\u4fcd\u4fce\u4fcf\u4fd0\u4fd1\u4fd2\u4fd3\u4fd4\u4fd5\u4fd6\u4fd7\u4fd8\u4fd9\u4fda\u4fdb\u4fdc\u4fdd\u4fde\u4fdf\u4fe0\u4fe1\u4fe2\u4fe3\u4fe4\u4fe5\u4fe6\u4fe7\u4fe8\u4fe9\u4fea\u4feb\u4fec\u4fed\u4fee\u4fef\u4ff0\u4ff1\u4ff2\u4ff3\u4ff4\u4ff5\u4ff6\u4ff7\u4ff8\u4ff9\u4ffa\u4ffb\u4ffc\u4ffd\u4ffe\u4fff\u5000\u5001\u5002\u5003\u5004\u5005\u5006\u5007\u5008\u5009\u500a\u500b\u500c\u500d\u500e\u500f\u5010\u5011\u5012\u5013\u5014\u5015\u5016\u5017\u5018\u5019\u501a\u501b\u501c\u501d\u501e\u501f\u5020\u5021\u5022\u5023\u5024\u5025\u5026\u5027\u5028\u5029\u502a\u502b\u502c\u502d\u502e\u502f\u5030\u5031\u5032\u5033\u5034\u5035\u5036\u5037\u5038\u5039\u503a\u503b\u503c\u503d\u503e\u503f\u5040\u5041\u5042\u5043\u5044\u5045\u5046\u5047\u5048\u5049\u504a\u504b\u504c\u504d\u504e\u504f\u5050\u5051\u5052\u5053\u5054\u5055\u5056\u5057\u5058\u5059\u505a\u505b\u505c\u505d\u505e\u505f\u5060\u5061\u5062\u5063\u5064\u5065\u5066\u5067\u5068\u5069\u506a\u506b\u506c\u506d\u506e\u506f\u5070\u5071\u5072\u5073\u5074\u5075\u5076\u5077\u5078\u5079\u507a\u507b\u507c\u507d\u507e\u507f\u5080\u5081\u5082\u5083\u5084\u5085\u5086\u5087\u5088\u5089\u508a\u508b\u508c\u508d\u508e\u508f\u5090\u5091\u5092\u5093\u5094\u5095\u5096\u5097\u5098\u5099\u509a\u509b\u509c\u509d\u509e\u509f\u50a0\u50a1\u50a2\u50a3\u50a4\u50a5\u50a6\u50a7\u50a8\u50a9\u50aa\u50ab\u50ac\u50ad\u50ae\u50af\u50b0\u50b1\u50b2\u50b3\u50b4\u50b5\u50b6\u50b7\u50b8\u50b9\u50ba\u50bb\u50bc\u50bd\u50be\u50bf\u50c0\u50c1\u50c2\u50c3\u50c4\u50c5\u50c6\u50c7\u50c8\u50c9\u50ca\u50cb\u50cc\u50cd\u50ce\u50cf\u50d0\u50d1\u50d2\u50d3\u50d4\u50d5\u50d6\u50d7\u50d8\u50d9\u50da\u50db\u50dc\u50dd\u50de\u50df\u50e0\u50e1\u50e2\u50e3\u50e4\u50e5\u50e6\u50e7\u50e8\u50e9\u50ea\u50eb\u50ec\u50ed\u50ee\u50ef\u50f0\u50f1\u50f2\u50f3\u50f4\u50f5\u50f6\u50f7\u50f8\u50f9\u50fa\u50fb\u50fc\u50fd\u50fe\u50ff\u5100\u5101\u5102\u5103\u5104\u5105\u5106\u5107\u5108\u5109\u510a\u510b\u510c\u510d\u510e\u510f\u5110\u5111\u5112\u5113\u5114\u5115\u5116\u5117\u5118\u5119\u511a\u511b\u511c\u511d\u511e\u511f\u5120\u5121\u5122\u5123\u5124\u5125\u5126\u5127\u5128\u5129\u512a\u512b\u512c\u512d\u512e\u512f\u5130\u5131\u5132\u5133\u5134\u5135\u5136\u5137\u5138\u5139\u513a\u513b\u513c\u513d\u513e\u513f\u5140\u5141\u5142\u5143\u5144\u5145\u5146\u5147\u5148\u5149\u514a\u514b\u514c\u514d\u514e\u514f\u5150\u5151\u5152\u5153\u5154\u5155\u5156\u5157\u5158\u5159\u515a\u515b\u515c\u515d\u515e\u515f\u5160\u5161\u5162\u5163\u5164\u5165\u5166\u5167\u5168\u5169\u516a\u516b\u516c\u516d\u516e\u516f\u5170\u5171\u5172\u5173\u5174\u5175\u5176\u5177\u5178\u5179\u517a\u517b\u517c\u517d\u517e\u517f\u5180\u5181\u5182\u5183\u5184\u5185\u5186\u5187\u5188\u5189\u518a\u518b\u518c\u518d\u518e\u518f\u5190\u5191\u5192\u5193\u5194\u5195\u5196\u5197\u5198\u5199\u519a\u519b\u519c\u519d\u519e\u519f\u51a0\u51a1\u51a2\u51a3\u51a4\u51a5\u51a6\u51a7\u51a8\u51a9\u51aa\u51ab\u51ac\u51ad\u51ae\u51af\u51b0\u51b1\u51b2\u51b3\u51b4\u51b5\u51b6\u51b7\u51b8\u51b9\u51ba\u51bb\u51bc\u51bd\u51be\u51bf\u51c0\u51c1\u51c2\u51c3\u51c4\u51c5\u51c6\u51c7\u51c8\u51c9\u51ca\u51cb\u51cc\u51cd\u51ce\u51cf\u51d0\u51d1\u51d2\u51d3\u51d4\u51d5\u51d6\u51d7\u51d8\u51d9\u51da\u51db\u51dc\u51dd\u51de\u51df\u51e0\u51e1\u51e2\u51e3\u51e4\u51e5\u51e6\u51e7\u51e8\u51e9\u51ea\u51eb\u51ec\u51ed\u51ee\u51ef\u51f0\u51f1\u51f2\u51f3\u51f4\u51f5\u51f6\u51f7\u51f8\u51f9\u51fa\u51fb\u51fc\u51fd\u51fe\u51ff\u5200\u5201\u5202\u5203\u5204\u5205\u5206\u5207\u5208\u5209\u520a\u520b\u520c\u520d\u520e\u520f\u5210\u5211\u5212\u5213\u5214\u5215\u5216\u5217\u5218\u5219\u521a\u521b\u521c\u521d\u521e\u521f\u5220\u5221\u5222\u5223\u5224\u5225\u5226\u5227\u5228\u5229\u522a\u522b\u522c\u522d\u522e\u522f\u5230\u5231\u5232\u5233\u5234\u5235\u5236\u5237\u5238\u5239\u523a\u523b\u523c\u523d\u523e\u523f\u5240\u5241\u5242\u5243\u5244\u5245\u5246\u5247\u5248\u5249\u524a\u524b\u524c\u524d\u524e\u524f\u5250\u5251\u5252\u5253\u5254\u5255\u5256\u5257\u5258\u5259\u525a\u525b\u525c\u525d\u525e\u525f\u5260\u5261\u5262\u5263\u5264\u5265\u5266\u5267\u5268\u5269\u526a\u526b\u526c\u526d\u526e\u526f\u5270\u5271\u5272\u5273\u5274\u5275\u5276\u5277\u5278\u5279\u527a\u527b\u527c\u527d\u527e\u527f\u5280\u5281\u5282\u5283\u5284\u5285\u5286\u5287\u5288\u5289\u528a\u528b\u528c\u528d\u528e\u528f\u5290\u5291\u5292\u5293\u5294\u5295\u5296\u5297\u5298\u5299\u529a\u529b\u529c\u529d\u529e\u529f\u52a0\u52a1\u52a2\u52a3\u52a4\u52a5\u52a6\u52a7\u52a8\u52a9\u52aa\u52ab\u52ac\u52ad\u52ae\u52af\u52b0\u52b1\u52b2\u52b3\u52b4\u52b5\u52b6\u52b7\u52b8\u52b9\u52ba\u52bb\u52bc\u52bd\u52be\u52bf\u52c0\u52c1\u52c2\u52c3\u52c4\u52c5\u52c6\u52c7\u52c8\u52c9\u52ca\u52cb\u52cc\u52cd\u52ce\u52cf\u52d0\u52d1\u52d2\u52d3\u52d4\u52d5\u52d6\u52d7\u52d8\u52d9\u52da\u52db\u52dc\u52dd\u52de\u52df\u52e0\u52e1\u52e2\u52e3\u52e4\u52e5\u52e6\u52e7\u52e8\u52e9\u52ea\u52eb\u52ec\u52ed\u52ee\u52ef\u52f0\u52f1\u52f2\u52f3\u52f4\u52f5\u52f6\u52f7\u52f8\u52f9\u52fa\u52fb\u52fc\u52fd\u52fe\u52ff\u5300\u5301\u5302\u5303\u5304\u5305\u5306\u5307\u5308\u5309\u530a\u530b\u530c\u530d\u530e\u530f\u5310\u5311\u5312\u5313\u5314\u5315\u5316\u5317\u5318\u5319\u531a\u531b\u531c\u531d\u531e\u531f\u5320\u5321\u5322\u5323\u5324\u5325\u5326\u5327\u5328\u5329\u532a\u532b\u532c\u532d\u532e\u532f\u5330\u5331\u5332\u5333\u5334\u5335\u5336\u5337\u5338\u5339\u533a\u533b\u533c\u533d\u533e\u533f\u5340\u5341\u5342\u5343\u5344\u5345\u5346\u5347\u5348\u5349\u534a\u534b\u534c\u534d\u534e\u534f\u5350\u5351\u5352\u5353\u5354\u5355\u5356\u5357\u5358\u5359\u535a\u535b\u535c\u535d\u535e\u535f\u5360\u5361\u5362\u5363\u5364\u5365\u5366\u5367\u5368\u5369\u536a\u536b\u536c\u536d\u536e\u536f\u5370\u5371\u5372\u5373\u5374\u5375\u5376\u5377\u5378\u5379\u537a\u537b\u537c\u537d\u537e\u537f\u5380\u5381\u5382\u5383\u5384\u5385\u5386\u5387\u5388\u5389\u538a\u538b\u538c\u538d\u538e\u538f\u5390\u5391\u5392\u5393\u5394\u5395\u5396\u5397\u5398\u5399\u539a\u539b\u539c\u539d\u539e\u539f\u53a0\u53a1\u53a2\u53a3\u53a4\u53a5\u53a6\u53a7\u53a8\u53a9\u53aa\u53ab\u53ac\u53ad\u53ae\u53af\u53b0\u53b1\u53b2\u53b3\u53b4\u53b5\u53b6\u53b7\u53b8\u53b9\u53ba\u53bb\u53bc\u53bd\u53be\u53bf\u53c0\u53c1\u53c2\u53c3\u53c4\u53c5\u53c6\u53c7\u53c8\u53c9\u53ca\u53cb\u53cc\u53cd\u53ce\u53cf\u53d0\u53d1\u53d2\u53d3\u53d4\u53d5\u53d6\u53d7\u53d8\u53d9\u53da\u53db\u53dc\u53dd\u53de\u53df\u53e0\u53e1\u53e2\u53e3\u53e4\u53e5\u53e6\u53e7\u53e8\u53e9\u53ea\u53eb\u53ec\u53ed\u53ee\u53ef\u53f0\u53f1\u53f2\u53f3\u53f4\u53f5\u53f6\u53f7\u53f8\u53f9\u53fa\u53fb\u53fc\u53fd\u53fe\u53ff\u5400\u5401\u5402\u5403\u5404\u5405\u5406\u5407\u5408\u5409\u540a\u540b\u540c\u540d\u540e\u540f\u5410\u5411\u5412\u5413\u5414\u5415\u5416\u5417\u5418\u5419\u541a\u541b\u541c\u541d\u541e\u541f\u5420\u5421\u5422\u5423\u5424\u5425\u5426\u5427\u5428\u5429\u542a\u542b\u542c\u542d\u542e\u542f\u5430\u5431\u5432\u5433\u5434\u5435\u5436\u5437\u5438\u5439\u543a\u543b\u543c\u543d\u543e\u543f\u5440\u5441\u5442\u5443\u5444\u5445\u5446\u5447\u5448\u5449\u544a\u544b\u544c\u544d\u544e\u544f\u5450\u5451\u5452\u5453\u5454\u5455\u5456\u5457\u5458\u5459\u545a\u545b\u545c\u545d\u545e\u545f\u5460\u5461\u5462\u5463\u5464\u5465\u5466\u5467\u5468\u5469\u546a\u546b\u546c\u546d\u546e\u546f\u5470\u5471\u5472\u5473\u5474\u5475\u5476\u5477\u5478\u5479\u547a\u547b\u547c\u547d\u547e\u547f\u5480\u5481\u5482\u5483\u5484\u5485\u5486\u5487\u5488\u5489\u548a\u548b\u548c\u548d\u548e\u548f\u5490\u5491\u5492\u5493\u5494\u5495\u5496\u5497\u5498\u5499\u549a\u549b\u549c\u549d\u549e\u549f\u54a0\u54a1\u54a2\u54a3\u54a4\u54a5\u54a6\u54a7\u54a8\u54a9\u54aa\u54ab\u54ac\u54ad\u54ae\u54af\u54b0\u54b1\u54b2\u54b3\u54b4\u54b5\u54b6\u54b7\u54b8\u54b9\u54ba\u54bb\u54bc\u54bd\u54be\u54bf\u54c0\u54c1\u54c2\u54c3\u54c4\u54c5\u54c6\u54c7\u54c8\u54c9\u54ca\u54cb\u54cc\u54cd\u54ce\u54cf\u54d0\u54d1\u54d2\u54d3\u54d4\u54d5\u54d6\u54d7\u54d8\u54d9\u54da\u54db\u54dc\u54dd\u54de\u54df\u54e0\u54e1\u54e2\u54e3\u54e4\u54e5\u54e6\u54e7\u54e8\u54e9\u54ea\u54eb\u54ec\u54ed\u54ee\u54ef\u54f0\u54f1\u54f2\u54f3\u54f4\u54f5\u54f6\u54f7\u54f8\u54f9\u54fa\u54fb\u54fc\u54fd\u54fe\u54ff\u5500\u5501\u5502\u5503\u5504\u5505\u5506\u5507\u5508\u5509\u550a\u550b\u550c\u550d\u550e\u550f\u5510\u5511\u5512\u5513\u5514\u5515\u5516\u5517\u5518\u5519\u551a\u551b\u551c\u551d\u551e\u551f\u5520\u5521\u5522\u5523\u5524\u5525\u5526\u5527\u5528\u5529\u552a\u552b\u552c\u552d\u552e\u552f\u5530\u5531\u5532\u5533\u5534\u5535\u5536\u5537\u5538\u5539\u553a\u553b\u553c\u553d\u553e\u553f\u5540\u5541\u5542\u5543\u5544\u5545\u5546\u5547\u5548\u5549\u554a\u554b\u554c\u554d\u554e\u554f\u5550\u5551\u5552\u5553\u5554\u5555\u5556\u5557\u5558\u5559\u555a\u555b\u555c\u555d\u555e\u555f\u5560\u5561\u5562\u5563\u5564\u5565\u5566\u5567\u5568\u5569\u556a\u556b\u556c\u556d\u556e\u556f\u5570\u5571\u5572\u5573\u5574\u5575\u5576\u5577\u5578\u5579\u557a\u557b\u557c\u557d\u557e\u557f\u5580\u5581\u5582\u5583\u5584\u5585\u5586\u5587\u5588\u5589\u558a\u558b\u558c\u558d\u558e\u558f\u5590\u5591\u5592\u5593\u5594\u5595\u5596\u5597\u5598\u5599\u559a\u559b\u559c\u559d\u559e\u559f\u55a0\u55a1\u55a2\u55a3\u55a4\u55a5\u55a6\u55a7\u55a8\u55a9\u55aa\u55ab\u55ac\u55ad\u55ae\u55af\u55b0\u55b1\u55b2\u55b3\u55b4\u55b5\u55b6\u55b7\u55b8\u55b9\u55ba\u55bb\u55bc\u55bd\u55be\u55bf\u55c0\u55c1\u55c2\u55c3\u55c4\u55c5\u55c6\u55c7\u55c8\u55c9\u55ca\u55cb\u55cc\u55cd\u55ce\u55cf\u55d0\u55d1\u55d2\u55d3\u55d4\u55d5\u55d6\u55d7\u55d8\u55d9\u55da\u55db\u55dc\u55dd\u55de\u55df\u55e0\u55e1\u55e2\u55e3\u55e4\u55e5\u55e6\u55e7\u55e8\u55e9\u55ea\u55eb\u55ec\u55ed\u55ee\u55ef\u55f0\u55f1\u55f2\u55f3\u55f4\u55f5\u55f6\u55f7\u55f8\u55f9\u55fa\u55fb\u55fc\u55fd\u55fe\u55ff\u5600\u5601\u5602\u5603\u5604\u5605\u5606\u5607\u5608\u5609\u560a\u560b\u560c\u560d\u560e\u560f\u5610\u5611\u5612\u5613\u5614\u5615\u5616\u5617\u5618\u5619\u561a\u561b\u561c\u561d\u561e\u561f\u5620\u5621\u5622\u5623\u5624\u5625\u5626\u5627\u5628\u5629\u562a\u562b\u562c\u562d\u562e\u562f\u5630\u5631\u5632\u5633\u5634\u5635\u5636\u5637\u5638\u5639\u563a\u563b\u563c\u563d\u563e\u563f\u5640\u5641\u5642\u5643\u5644\u5645\u5646\u5647\u5648\u5649\u564a\u564b\u564c\u564d\u564e\u564f\u5650\u5651\u5652\u5653\u5654\u5655\u5656\u5657\u5658\u5659\u565a\u565b\u565c\u565d\u565e\u565f\u5660\u5661\u5662\u5663\u5664\u5665\u5666\u5667\u5668\u5669\u566a\u566b\u566c\u566d\u566e\u566f\u5670\u5671\u5672\u5673\u5674\u5675\u5676\u5677\u5678\u5679\u567a\u567b\u567c\u567d\u567e\u567f\u5680\u5681\u5682\u5683\u5684\u5685\u5686\u5687\u5688\u5689\u568a\u568b\u568c\u568d\u568e\u568f\u5690\u5691\u5692\u5693\u5694\u5695\u5696\u5697\u5698\u5699\u569a\u569b\u569c\u569d\u569e\u569f\u56a0\u56a1\u56a2\u56a3\u56a4\u56a5\u56a6\u56a7\u56a8\u56a9\u56aa\u56ab\u56ac\u56ad\u56ae\u56af\u56b0\u56b1\u56b2\u56b3\u56b4\u56b5\u56b6\u56b7\u56b8\u56b9\u56ba\u56bb\u56bc\u56bd\u56be\u56bf\u56c0\u56c1\u56c2\u56c3\u56c4\u56c5\u56c6\u56c7\u56c8\u56c9\u56ca\u56cb\u56cc\u56cd\u56ce\u56cf\u56d0\u56d1\u56d2\u56d3\u56d4\u56d5\u56d6\u56d7\u56d8\u56d9\u56da\u56db\u56dc\u56dd\u56de\u56df\u56e0\u56e1\u56e2\u56e3\u56e4\u56e5\u56e6\u56e7\u56e8\u56e9\u56ea\u56eb\u56ec\u56ed\u56ee\u56ef\u56f0\u56f1\u56f2\u56f3\u56f4\u56f5\u56f6\u56f7\u56f8\u56f9\u56fa\u56fb\u56fc\u56fd\u56fe\u56ff\u5700\u5701\u5702\u5703\u5704\u5705\u5706\u5707\u5708\u5709\u570a\u570b\u570c\u570d\u570e\u570f\u5710\u5711\u5712\u5713\u5714\u5715\u5716\u5717\u5718\u5719\u571a\u571b\u571c\u571d\u571e\u571f\u5720\u5721\u5722\u5723\u5724\u5725\u5726\u5727\u5728\u5729\u572a\u572b\u572c\u572d\u572e\u572f\u5730\u5731\u5732\u5733\u5734\u5735\u5736\u5737\u5738\u5739\u573a\u573b\u573c\u573d\u573e\u573f\u5740\u5741\u5742\u5743\u5744\u5745\u5746\u5747\u5748\u5749\u574a\u574b\u574c\u574d\u574e\u574f\u5750\u5751\u5752\u5753\u5754\u5755\u5756\u5757\u5758\u5759\u575a\u575b\u575c\u575d\u575e\u575f\u5760\u5761\u5762\u5763\u5764\u5765\u5766\u5767\u5768\u5769\u576a\u576b\u576c\u576d\u576e\u576f\u5770\u5771\u5772\u5773\u5774\u5775\u5776\u5777\u5778\u5779\u577a\u577b\u577c\u577d\u577e\u577f\u5780\u5781\u5782\u5783\u5784\u5785\u5786\u5787\u5788\u5789\u578a\u578b\u578c\u578d\u578e\u578f\u5790\u5791\u5792\u5793\u5794\u5795\u5796\u5797\u5798\u5799\u579a\u579b\u579c\u579d\u579e\u579f\u57a0\u57a1\u57a2\u57a3\u57a4\u57a5\u57a6\u57a7\u57a8\u57a9\u57aa\u57ab\u57ac\u57ad\u57ae\u57af\u57b0\u57b1\u57b2\u57b3\u57b4\u57b5\u57b6\u57b7\u57b8\u57b9\u57ba\u57bb\u57bc\u57bd\u57be\u57bf\u57c0\u57c1\u57c2\u57c3\u57c4\u57c5\u57c6\u57c7\u57c8\u57c9\u57ca\u57cb\u57cc\u57cd\u57ce\u57cf\u57d0\u57d1\u57d2\u57d3\u57d4\u57d5\u57d6\u57d7\u57d8\u57d9\u57da\u57db\u57dc\u57dd\u57de\u57df\u57e0\u57e1\u57e2\u57e3\u57e4\u57e5\u57e6\u57e7\u57e8\u57e9\u57ea\u57eb\u57ec\u57ed\u57ee\u57ef\u57f0\u57f1\u57f2\u57f3\u57f4\u57f5\u57f6\u57f7\u57f8\u57f9\u57fa\u57fb\u57fc\u57fd\u57fe\u57ff\u5800\u5801\u5802\u5803\u5804\u5805\u5806\u5807\u5808\u5809\u580a\u580b\u580c\u580d\u580e\u580f\u5810\u5811\u5812\u5813\u5814\u5815\u5816\u5817\u5818\u5819\u581a\u581b\u581c\u581d\u581e\u581f\u5820\u5821\u5822\u5823\u5824\u5825\u5826\u5827\u5828\u5829\u582a\u582b\u582c\u582d\u582e\u582f\u5830\u5831\u5832\u5833\u5834\u5835\u5836\u5837\u5838\u5839\u583a\u583b\u583c\u583d\u583e\u583f\u5840\u5841\u5842\u5843\u5844\u5845\u5846\u5847\u5848\u5849\u584a\u584b\u584c\u584d\u584e\u584f\u5850\u5851\u5852\u5853\u5854\u5855\u5856\u5857\u5858\u5859\u585a\u585b\u585c\u585d\u585e\u585f\u5860\u5861\u5862\u5863\u5864\u5865\u5866\u5867\u5868\u5869\u586a\u586b\u586c\u586d\u586e\u586f\u5870\u5871\u5872\u5873\u5874\u5875\u5876\u5877\u5878\u5879\u587a\u587b\u587c\u587d\u587e\u587f\u5880\u5881\u5882\u5883\u5884\u5885\u5886\u5887\u5888\u5889\u588a\u588b\u588c\u588d\u588e\u588f\u5890\u5891\u5892\u5893\u5894\u5895\u5896\u5897\u5898\u5899\u589a\u589b\u589c\u589d\u589e\u589f\u58a0\u58a1\u58a2\u58a3\u58a4\u58a5\u58a6\u58a7\u58a8\u58a9\u58aa\u58ab\u58ac\u58ad\u58ae\u58af\u58b0\u58b1\u58b2\u58b3\u58b4\u58b5\u58b6\u58b7\u58b8\u58b9\u58ba\u58bb\u58bc\u58bd\u58be\u58bf\u58c0\u58c1\u58c2\u58c3\u58c4\u58c5\u58c6\u58c7\u58c8\u58c9\u58ca\u58cb\u58cc\u58cd\u58ce\u58cf\u58d0\u58d1\u58d2\u58d3\u58d4\u58d5\u58d6\u58d7\u58d8\u58d9\u58da\u58db\u58dc\u58dd\u58de\u58df\u58e0\u58e1\u58e2\u58e3\u58e4\u58e5\u58e6\u58e7\u58e8\u58e9\u58ea\u58eb\u58ec\u58ed\u58ee\u58ef\u58f0\u58f1\u58f2\u58f3\u58f4\u58f5\u58f6\u58f7\u58f8\u58f9\u58fa\u58fb\u58fc\u58fd\u58fe\u58ff\u5900\u5901\u5902\u5903\u5904\u5905\u5906\u5907\u5908\u5909\u590a\u590b\u590c\u590d\u590e\u590f\u5910\u5911\u5912\u5913\u5914\u5915\u5916\u5917\u5918\u5919\u591a\u591b\u591c\u591d\u591e\u591f\u5920\u5921\u5922\u5923\u5924\u5925\u5926\u5927\u5928\u5929\u592a\u592b\u592c\u592d\u592e\u592f\u5930\u5931\u5932\u5933\u5934\u5935\u5936\u5937\u5938\u5939\u593a\u593b\u593c\u593d\u593e\u593f\u5940\u5941\u5942\u5943\u5944\u5945\u5946\u5947\u5948\u5949\u594a\u594b\u594c\u594d\u594e\u594f\u5950\u5951\u5952\u5953\u5954\u5955\u5956\u5957\u5958\u5959\u595a\u595b\u595c\u595d\u595e\u595f\u5960\u5961\u5962\u5963\u5964\u5965\u5966\u5967\u5968\u5969\u596a\u596b\u596c\u596d\u596e\u596f\u5970\u5971\u5972\u5973\u5974\u5975\u5976\u5977\u5978\u5979\u597a\u597b\u597c\u597d\u597e\u597f\u5980\u5981\u5982\u5983\u5984\u5985\u5986\u5987\u5988\u5989\u598a\u598b\u598c\u598d\u598e\u598f\u5990\u5991\u5992\u5993\u5994\u5995\u5996\u5997\u5998\u5999\u599a\u599b\u599c\u599d\u599e\u599f\u59a0\u59a1\u59a2\u59a3\u59a4\u59a5\u59a6\u59a7\u59a8\u59a9\u59aa\u59ab\u59ac\u59ad\u59ae\u59af\u59b0\u59b1\u59b2\u59b3\u59b4\u59b5\u59b6\u59b7\u59b8\u59b9\u59ba\u59bb\u59bc\u59bd\u59be\u59bf\u59c0\u59c1\u59c2\u59c3\u59c4\u59c5\u59c6\u59c7\u59c8\u59c9\u59ca\u59cb\u59cc\u59cd\u59ce\u59cf\u59d0\u59d1\u59d2\u59d3\u59d4\u59d5\u59d6\u59d7\u59d8\u59d9\u59da\u59db\u59dc\u59dd\u59de\u59df\u59e0\u59e1\u59e2\u59e3\u59e4\u59e5\u59e6\u59e7\u59e8\u59e9\u59ea\u59eb\u59ec\u59ed\u59ee\u59ef\u59f0\u59f1\u59f2\u59f3\u59f4\u59f5\u59f6\u59f7\u59f8\u59f9\u59fa\u59fb\u59fc\u59fd\u59fe\u59ff\u5a00\u5a01\u5a02\u5a03\u5a04\u5a05\u5a06\u5a07\u5a08\u5a09\u5a0a\u5a0b\u5a0c\u5a0d\u5a0e\u5a0f\u5a10\u5a11\u5a12\u5a13\u5a14\u5a15\u5a16\u5a17\u5a18\u5a19\u5a1a\u5a1b\u5a1c\u5a1d\u5a1e\u5a1f\u5a20\u5a21\u5a22\u5a23\u5a24\u5a25\u5a26\u5a27\u5a28\u5a29\u5a2a\u5a2b\u5a2c\u5a2d\u5a2e\u5a2f\u5a30\u5a31\u5a32\u5a33\u5a34\u5a35\u5a36\u5a37\u5a38\u5a39\u5a3a\u5a3b\u5a3c\u5a3d\u5a3e\u5a3f\u5a40\u5a41\u5a42\u5a43\u5a44\u5a45\u5a46\u5a47\u5a48\u5a49\u5a4a\u5a4b\u5a4c\u5a4d\u5a4e\u5a4f\u5a50\u5a51\u5a52\u5a53\u5a54\u5a55\u5a56\u5a57\u5a58\u5a59\u5a5a\u5a5b\u5a5c\u5a5d\u5a5e\u5a5f\u5a60\u5a61\u5a62\u5a63\u5a64\u5a65\u5a66\u5a67\u5a68\u5a69\u5a6a\u5a6b\u5a6c\u5a6d\u5a6e\u5a6f\u5a70\u5a71\u5a72\u5a73\u5a74\u5a75\u5a76\u5a77\u5a78\u5a79\u5a7a\u5a7b\u5a7c\u5a7d\u5a7e\u5a7f\u5a80\u5a81\u5a82\u5a83\u5a84\u5a85\u5a86\u5a87\u5a88\u5a89\u5a8a\u5a8b\u5a8c\u5a8d\u5a8e\u5a8f\u5a90\u5a91\u5a92\u5a93\u5a94\u5a95\u5a96\u5a97\u5a98\u5a99\u5a9a\u5a9b\u5a9c\u5a9d\u5a9e\u5a9f\u5aa0\u5aa1\u5aa2\u5aa3\u5aa4\u5aa5\u5aa6\u5aa7\u5aa8\u5aa9\u5aaa\u5aab\u5aac\u5aad\u5aae\u5aaf\u5ab0\u5ab1\u5ab2\u5ab3\u5ab4\u5ab5\u5ab6\u5ab7\u5ab8\u5ab9\u5aba\u5abb\u5abc\u5abd\u5abe\u5abf\u5ac0\u5ac1\u5ac2\u5ac3\u5ac4\u5ac5\u5ac6\u5ac7\u5ac8\u5ac9\u5aca\u5acb\u5acc\u5acd\u5ace\u5acf\u5ad0\u5ad1\u5ad2\u5ad3\u5ad4\u5ad5\u5ad6\u5ad7\u5ad8\u5ad9\u5ada\u5adb\u5adc\u5add\u5ade\u5adf\u5ae0\u5ae1\u5ae2\u5ae3\u5ae4\u5ae5\u5ae6\u5ae7\u5ae8\u5ae9\u5aea\u5aeb\u5aec\u5aed\u5aee\u5aef\u5af0\u5af1\u5af2\u5af3\u5af4\u5af5\u5af6\u5af7\u5af8\u5af9\u5afa\u5afb\u5afc\u5afd\u5afe\u5aff\u5b00\u5b01\u5b02\u5b03\u5b04\u5b05\u5b06\u5b07\u5b08\u5b09\u5b0a\u5b0b\u5b0c\u5b0d\u5b0e\u5b0f\u5b10\u5b11\u5b12\u5b13\u5b14\u5b15\u5b16\u5b17\u5b18\u5b19\u5b1a\u5b1b\u5b1c\u5b1d\u5b1e\u5b1f\u5b20\u5b21\u5b22\u5b23\u5b24\u5b25\u5b26\u5b27\u5b28\u5b29\u5b2a\u5b2b\u5b2c\u5b2d\u5b2e\u5b2f\u5b30\u5b31\u5b32\u5b33\u5b34\u5b35\u5b36\u5b37\u5b38\u5b39\u5b3a\u5b3b\u5b3c\u5b3d\u5b3e\u5b3f\u5b40\u5b41\u5b42\u5b43\u5b44\u5b45\u5b46\u5b47\u5b48\u5b49\u5b4a\u5b4b\u5b4c\u5b4d\u5b4e\u5b4f\u5b50\u5b51\u5b52\u5b53\u5b54\u5b55\u5b56\u5b57\u5b58\u5b59\u5b5a\u5b5b\u5b5c\u5b5d\u5b5e\u5b5f\u5b60\u5b61\u5b62\u5b63\u5b64\u5b65\u5b66\u5b67\u5b68\u5b69\u5b6a\u5b6b\u5b6c\u5b6d\u5b6e\u5b6f\u5b70\u5b71\u5b72\u5b73\u5b74\u5b75\u5b76\u5b77\u5b78\u5b79\u5b7a\u5b7b\u5b7c\u5b7d\u5b7e\u5b7f\u5b80\u5b81\u5b82\u5b83\u5b84\u5b85\u5b86\u5b87\u5b88\u5b89\u5b8a\u5b8b\u5b8c\u5b8d\u5b8e\u5b8f\u5b90\u5b91\u5b92\u5b93\u5b94\u5b95\u5b96\u5b97\u5b98\u5b99\u5b9a\u5b9b\u5b9c\u5b9d\u5b9e\u5b9f\u5ba0\u5ba1\u5ba2\u5ba3\u5ba4\u5ba5\u5ba6\u5ba7\u5ba8\u5ba9\u5baa\u5bab\u5bac\u5bad\u5bae\u5baf\u5bb0\u5bb1\u5bb2\u5bb3\u5bb4\u5bb5\u5bb6\u5bb7\u5bb8\u5bb9\u5bba\u5bbb\u5bbc\u5bbd\u5bbe\u5bbf\u5bc0\u5bc1\u5bc2\u5bc3\u5bc4\u5bc5\u5bc6\u5bc7\u5bc8\u5bc9\u5bca\u5bcb\u5bcc\u5bcd\u5bce\u5bcf\u5bd0\u5bd1\u5bd2\u5bd3\u5bd4\u5bd5\u5bd6\u5bd7\u5bd8\u5bd9\u5bda\u5bdb\u5bdc\u5bdd\u5bde\u5bdf\u5be0\u5be1\u5be2\u5be3\u5be4\u5be5\u5be6\u5be7\u5be8\u5be9\u5bea\u5beb\u5bec\u5bed\u5bee\u5bef\u5bf0\u5bf1\u5bf2\u5bf3\u5bf4\u5bf5\u5bf6\u5bf7\u5bf8\u5bf9\u5bfa\u5bfb\u5bfc\u5bfd\u5bfe\u5bff\u5c00\u5c01\u5c02\u5c03\u5c04\u5c05\u5c06\u5c07\u5c08\u5c09\u5c0a\u5c0b\u5c0c\u5c0d\u5c0e\u5c0f\u5c10\u5c11\u5c12\u5c13\u5c14\u5c15\u5c16\u5c17\u5c18\u5c19\u5c1a\u5c1b\u5c1c\u5c1d\u5c1e\u5c1f\u5c20\u5c21\u5c22\u5c23\u5c24\u5c25\u5c26\u5c27\u5c28\u5c29\u5c2a\u5c2b\u5c2c\u5c2d\u5c2e\u5c2f\u5c30\u5c31\u5c32\u5c33\u5c34\u5c35\u5c36\u5c37\u5c38\u5c39\u5c3a\u5c3b\u5c3c\u5c3d\u5c3e\u5c3f\u5c40\u5c41\u5c42\u5c43\u5c44\u5c45\u5c46\u5c47\u5c48\u5c49\u5c4a\u5c4b\u5c4c\u5c4d\u5c4e\u5c4f\u5c50\u5c51\u5c52\u5c53\u5c54\u5c55\u5c56\u5c57\u5c58\u5c59\u5c5a\u5c5b\u5c5c\u5c5d\u5c5e\u5c5f\u5c60\u5c61\u5c62\u5c63\u5c64\u5c65\u5c66\u5c67\u5c68\u5c69\u5c6a\u5c6b\u5c6c\u5c6d\u5c6e\u5c6f\u5c70\u5c71\u5c72\u5c73\u5c74\u5c75\u5c76\u5c77\u5c78\u5c79\u5c7a\u5c7b\u5c7c\u5c7d\u5c7e\u5c7f\u5c80\u5c81\u5c82\u5c83\u5c84\u5c85\u5c86\u5c87\u5c88\u5c89\u5c8a\u5c8b\u5c8c\u5c8d\u5c8e\u5c8f\u5c90\u5c91\u5c92\u5c93\u5c94\u5c95\u5c96\u5c97\u5c98\u5c99\u5c9a\u5c9b\u5c9c\u5c9d\u5c9e\u5c9f\u5ca0\u5ca1\u5ca2\u5ca3\u5ca4\u5ca5\u5ca6\u5ca7\u5ca8\u5ca9\u5caa\u5cab\u5cac\u5cad\u5cae\u5caf\u5cb0\u5cb1\u5cb2\u5cb3\u5cb4\u5cb5\u5cb6\u5cb7\u5cb8\u5cb9\u5cba\u5cbb\u5cbc\u5cbd\u5cbe\u5cbf\u5cc0\u5cc1\u5cc2\u5cc3\u5cc4\u5cc5\u5cc6\u5cc7\u5cc8\u5cc9\u5cca\u5ccb\u5ccc\u5ccd\u5cce\u5ccf\u5cd0\u5cd1\u5cd2\u5cd3\u5cd4\u5cd5\u5cd6\u5cd7\u5cd8\u5cd9\u5cda\u5cdb\u5cdc\u5cdd\u5cde\u5cdf\u5ce0\u5ce1\u5ce2\u5ce3\u5ce4\u5ce5\u5ce6\u5ce7\u5ce8\u5ce9\u5cea\u5ceb\u5cec\u5ced\u5cee\u5cef\u5cf0\u5cf1\u5cf2\u5cf3\u5cf4\u5cf5\u5cf6\u5cf7\u5cf8\u5cf9\u5cfa\u5cfb\u5cfc\u5cfd\u5cfe\u5cff\u5d00\u5d01\u5d02\u5d03\u5d04\u5d05\u5d06\u5d07\u5d08\u5d09\u5d0a\u5d0b\u5d0c\u5d0d\u5d0e\u5d0f\u5d10\u5d11\u5d12\u5d13\u5d14\u5d15\u5d16\u5d17\u5d18\u5d19\u5d1a\u5d1b\u5d1c\u5d1d\u5d1e\u5d1f\u5d20\u5d21\u5d22\u5d23\u5d24\u5d25\u5d26\u5d27\u5d28\u5d29\u5d2a\u5d2b\u5d2c\u5d2d\u5d2e\u5d2f\u5d30\u5d31\u5d32\u5d33\u5d34\u5d35\u5d36\u5d37\u5d38\u5d39\u5d3a\u5d3b\u5d3c\u5d3d\u5d3e\u5d3f\u5d40\u5d41\u5d42\u5d43\u5d44\u5d45\u5d46\u5d47\u5d48\u5d49\u5d4a\u5d4b\u5d4c\u5d4d\u5d4e\u5d4f\u5d50\u5d51\u5d52\u5d53\u5d54\u5d55\u5d56\u5d57\u5d58\u5d59\u5d5a\u5d5b\u5d5c\u5d5d\u5d5e\u5d5f\u5d60\u5d61\u5d62\u5d63\u5d64\u5d65\u5d66\u5d67\u5d68\u5d69\u5d6a\u5d6b\u5d6c\u5d6d\u5d6e\u5d6f\u5d70\u5d71\u5d72\u5d73\u5d74\u5d75\u5d76\u5d77\u5d78\u5d79\u5d7a\u5d7b\u5d7c\u5d7d\u5d7e\u5d7f\u5d80\u5d81\u5d82\u5d83\u5d84\u5d85\u5d86\u5d87\u5d88\u5d89\u5d8a\u5d8b\u5d8c\u5d8d\u5d8e\u5d8f\u5d90\u5d91\u5d92\u5d93\u5d94\u5d95\u5d96\u5d97\u5d98\u5d99\u5d9a\u5d9b\u5d9c\u5d9d\u5d9e\u5d9f\u5da0\u5da1\u5da2\u5da3\u5da4\u5da5\u5da6\u5da7\u5da8\u5da9\u5daa\u5dab\u5dac\u5dad\u5dae\u5daf\u5db0\u5db1\u5db2\u5db3\u5db4\u5db5\u5db6\u5db7\u5db8\u5db9\u5dba\u5dbb\u5dbc\u5dbd\u5dbe\u5dbf\u5dc0\u5dc1\u5dc2\u5dc3\u5dc4\u5dc5\u5dc6\u5dc7\u5dc8\u5dc9\u5dca\u5dcb\u5dcc\u5dcd\u5dce\u5dcf\u5dd0\u5dd1\u5dd2\u5dd3\u5dd4\u5dd5\u5dd6\u5dd7\u5dd8\u5dd9\u5dda\u5ddb\u5ddc\u5ddd\u5dde\u5ddf\u5de0\u5de1\u5de2\u5de3\u5de4\u5de5\u5de6\u5de7\u5de8\u5de9\u5dea\u5deb\u5dec\u5ded\u5dee\u5def\u5df0\u5df1\u5df2\u5df3\u5df4\u5df5\u5df6\u5df7\u5df8\u5df9\u5dfa\u5dfb\u5dfc\u5dfd\u5dfe\u5dff\u5e00\u5e01\u5e02\u5e03\u5e04\u5e05\u5e06\u5e07\u5e08\u5e09\u5e0a\u5e0b\u5e0c\u5e0d\u5e0e\u5e0f\u5e10\u5e11\u5e12\u5e13\u5e14\u5e15\u5e16\u5e17\u5e18\u5e19\u5e1a\u5e1b\u5e1c\u5e1d\u5e1e\u5e1f\u5e20\u5e21\u5e22\u5e23\u5e24\u5e25\u5e26\u5e27\u5e28\u5e29\u5e2a\u5e2b\u5e2c\u5e2d\u5e2e\u5e2f\u5e30\u5e31\u5e32\u5e33\u5e34\u5e35\u5e36\u5e37\u5e38\u5e39\u5e3a\u5e3b\u5e3c\u5e3d\u5e3e\u5e3f\u5e40\u5e41\u5e42\u5e43\u5e44\u5e45\u5e46\u5e47\u5e48\u5e49\u5e4a\u5e4b\u5e4c\u5e4d\u5e4e\u5e4f\u5e50\u5e51\u5e52\u5e53\u5e54\u5e55\u5e56\u5e57\u5e58\u5e59\u5e5a\u5e5b\u5e5c\u5e5d\u5e5e\u5e5f\u5e60\u5e61\u5e62\u5e63\u5e64\u5e65\u5e66\u5e67\u5e68\u5e69\u5e6a\u5e6b\u5e6c\u5e6d\u5e6e\u5e6f\u5e70\u5e71\u5e72\u5e73\u5e74\u5e75\u5e76\u5e77\u5e78\u5e79\u5e7a\u5e7b\u5e7c\u5e7d\u5e7e\u5e7f\u5e80\u5e81\u5e82\u5e83\u5e84\u5e85\u5e86\u5e87\u5e88\u5e89\u5e8a\u5e8b\u5e8c\u5e8d\u5e8e\u5e8f\u5e90\u5e91\u5e92\u5e93\u5e94\u5e95\u5e96\u5e97\u5e98\u5e99\u5e9a\u5e9b\u5e9c\u5e9d\u5e9e\u5e9f\u5ea0\u5ea1\u5ea2\u5ea3\u5ea4\u5ea5\u5ea6\u5ea7\u5ea8\u5ea9\u5eaa\u5eab\u5eac\u5ead\u5eae\u5eaf\u5eb0\u5eb1\u5eb2\u5eb3\u5eb4\u5eb5\u5eb6\u5eb7\u5eb8\u5eb9\u5eba\u5ebb\u5ebc\u5ebd\u5ebe\u5ebf\u5ec0\u5ec1\u5ec2\u5ec3\u5ec4\u5ec5\u5ec6\u5ec7\u5ec8\u5ec9\u5eca\u5ecb\u5ecc\u5ecd\u5ece\u5ecf\u5ed0\u5ed1\u5ed2\u5ed3\u5ed4\u5ed5\u5ed6\u5ed7\u5ed8\u5ed9\u5eda\u5edb\u5edc\u5edd\u5ede\u5edf\u5ee0\u5ee1\u5ee2\u5ee3\u5ee4\u5ee5\u5ee6\u5ee7\u5ee8\u5ee9\u5eea\u5eeb\u5eec\u5eed\u5eee\u5eef\u5ef0\u5ef1\u5ef2\u5ef3\u5ef4\u5ef5\u5ef6\u5ef7\u5ef8\u5ef9\u5efa\u5efb\u5efc\u5efd\u5efe\u5eff\u5f00\u5f01\u5f02\u5f03\u5f04\u5f05\u5f06\u5f07\u5f08\u5f09\u5f0a\u5f0b\u5f0c\u5f0d\u5f0e\u5f0f\u5f10\u5f11\u5f12\u5f13\u5f14\u5f15\u5f16\u5f17\u5f18\u5f19\u5f1a\u5f1b\u5f1c\u5f1d\u5f1e\u5f1f\u5f20\u5f21\u5f22\u5f23\u5f24\u5f25\u5f26\u5f27\u5f28\u5f29\u5f2a\u5f2b\u5f2c\u5f2d\u5f2e\u5f2f\u5f30\u5f31\u5f32\u5f33\u5f34\u5f35\u5f36\u5f37\u5f38\u5f39\u5f3a\u5f3b\u5f3c\u5f3d\u5f3e\u5f3f\u5f40\u5f41\u5f42\u5f43\u5f44\u5f45\u5f46\u5f47\u5f48\u5f49\u5f4a\u5f4b\u5f4c\u5f4d\u5f4e\u5f4f\u5f50\u5f51\u5f52\u5f53\u5f54\u5f55\u5f56\u5f57\u5f58\u5f59\u5f5a\u5f5b\u5f5c\u5f5d\u5f5e\u5f5f\u5f60\u5f61\u5f62\u5f63\u5f64\u5f65\u5f66\u5f67\u5f68\u5f69\u5f6a\u5f6b\u5f6c\u5f6d\u5f6e\u5f6f\u5f70\u5f71\u5f72\u5f73\u5f74\u5f75\u5f76\u5f77\u5f78\u5f79\u5f7a\u5f7b\u5f7c\u5f7d\u5f7e\u5f7f\u5f80\u5f81\u5f82\u5f83\u5f84\u5f85\u5f86\u5f87\u5f88\u5f89\u5f8a\u5f8b\u5f8c\u5f8d\u5f8e\u5f8f\u5f90\u5f91\u5f92\u5f93\u5f94\u5f95\u5f96\u5f97\u5f98\u5f99\u5f9a\u5f9b\u5f9c\u5f9d\u5f9e\u5f9f\u5fa0\u5fa1\u5fa2\u5fa3\u5fa4\u5fa5\u5fa6\u5fa7\u5fa8\u5fa9\u5faa\u5fab\u5fac\u5fad\u5fae\u5faf\u5fb0\u5fb1\u5fb2\u5fb3\u5fb4\u5fb5\u5fb6\u5fb7\u5fb8\u5fb9\u5fba\u5fbb\u5fbc\u5fbd\u5fbe\u5fbf\u5fc0\u5fc1\u5fc2\u5fc3\u5fc4\u5fc5\u5fc6\u5fc7\u5fc8\u5fc9\u5fca\u5fcb\u5fcc\u5fcd\u5fce\u5fcf\u5fd0\u5fd1\u5fd2\u5fd3\u5fd4\u5fd5\u5fd6\u5fd7\u5fd8\u5fd9\u5fda\u5fdb\u5fdc\u5fdd\u5fde\u5fdf\u5fe0\u5fe1\u5fe2\u5fe3\u5fe4\u5fe5\u5fe6\u5fe7\u5fe8\u5fe9\u5fea\u5feb\u5fec\u5fed\u5fee\u5fef\u5ff0\u5ff1\u5ff2\u5ff3\u5ff4\u5ff5\u5ff6\u5ff7\u5ff8\u5ff9\u5ffa\u5ffb\u5ffc\u5ffd\u5ffe\u5fff\u6000\u6001\u6002\u6003\u6004\u6005\u6006\u6007\u6008\u6009\u600a\u600b\u600c\u600d\u600e\u600f\u6010\u6011\u6012\u6013\u6014\u6015\u6016\u6017\u6018\u6019\u601a\u601b\u601c\u601d\u601e\u601f\u6020\u6021\u6022\u6023\u6024\u6025\u6026\u6027\u6028\u6029\u602a\u602b\u602c\u602d\u602e\u602f\u6030\u6031\u6032\u6033\u6034\u6035\u6036\u6037\u6038\u6039\u603a\u603b\u603c\u603d\u603e\u603f\u6040\u6041\u6042\u6043\u6044\u6045\u6046\u6047\u6048\u6049\u604a\u604b\u604c\u604d\u604e\u604f\u6050\u6051\u6052\u6053\u6054\u6055\u6056\u6057\u6058\u6059\u605a\u605b\u605c\u605d\u605e\u605f\u6060\u6061\u6062\u6063\u6064\u6065\u6066\u6067\u6068\u6069\u606a\u606b\u606c\u606d\u606e\u606f\u6070\u6071\u6072\u6073\u6074\u6075\u6076\u6077\u6078\u6079\u607a\u607b\u607c\u607d\u607e\u607f\u6080\u6081\u6082\u6083\u6084\u6085\u6086\u6087\u6088\u6089\u608a\u608b\u608c\u608d\u608e\u608f\u6090\u6091\u6092\u6093\u6094\u6095\u6096\u6097\u6098\u6099\u609a\u609b\u609c\u609d\u609e\u609f\u60a0\u60a1\u60a2\u60a3\u60a4\u60a5\u60a6\u60a7\u60a8\u60a9\u60aa\u60ab\u60ac\u60ad\u60ae\u60af\u60b0\u60b1\u60b2\u60b3\u60b4\u60b5\u60b6\u60b7\u60b8\u60b9\u60ba\u60bb\u60bc\u60bd\u60be\u60bf\u60c0\u60c1\u60c2\u60c3\u60c4\u60c5\u60c6\u60c7\u60c8\u60c9\u60ca\u60cb\u60cc\u60cd\u60ce\u60cf\u60d0\u60d1\u60d2\u60d3\u60d4\u60d5\u60d6\u60d7\u60d8\u60d9\u60da\u60db\u60dc\u60dd\u60de\u60df\u60e0\u60e1\u60e2\u60e3\u60e4\u60e5\u60e6\u60e7\u60e8\u60e9\u60ea\u60eb\u60ec\u60ed\u60ee\u60ef\u60f0\u60f1\u60f2\u60f3\u60f4\u60f5\u60f6\u60f7\u60f8\u60f9\u60fa\u60fb\u60fc\u60fd\u60fe\u60ff\u6100\u6101\u6102\u6103\u6104\u6105\u6106\u6107\u6108\u6109\u610a\u610b\u610c\u610d\u610e\u610f\u6110\u6111\u6112\u6113\u6114\u6115\u6116\u6117\u6118\u6119\u611a\u611b\u611c\u611d\u611e\u611f\u6120\u6121\u6122\u6123\u6124\u6125\u6126\u6127\u6128\u6129\u612a\u612b\u612c\u612d\u612e\u612f\u6130\u6131\u6132\u6133\u6134\u6135\u6136\u6137\u6138\u6139\u613a\u613b\u613c\u613d\u613e\u613f\u6140\u6141\u6142\u6143\u6144\u6145\u6146\u6147\u6148\u6149\u614a\u614b\u614c\u614d\u614e\u614f\u6150\u6151\u6152\u6153\u6154\u6155\u6156\u6157\u6158\u6159\u615a\u615b\u615c\u615d\u615e\u615f\u6160\u6161\u6162\u6163\u6164\u6165\u6166\u6167\u6168\u6169\u616a\u616b\u616c\u616d\u616e\u616f\u6170\u6171\u6172\u6173\u6174\u6175\u6176\u6177\u6178\u6179\u617a\u617b\u617c\u617d\u617e\u617f\u6180\u6181\u6182\u6183\u6184\u6185\u6186\u6187\u6188\u6189\u618a\u618b\u618c\u618d\u618e\u618f\u6190\u6191\u6192\u6193\u6194\u6195\u6196\u6197\u6198\u6199\u619a\u619b\u619c\u619d\u619e\u619f\u61a0\u61a1\u61a2\u61a3\u61a4\u61a5\u61a6\u61a7\u61a8\u61a9\u61aa\u61ab\u61ac\u61ad\u61ae\u61af\u61b0\u61b1\u61b2\u61b3\u61b4\u61b5\u61b6\u61b7\u61b8\u61b9\u61ba\u61bb\u61bc\u61bd\u61be\u61bf\u61c0\u61c1\u61c2\u61c3\u61c4\u61c5\u61c6\u61c7\u61c8\u61c9\u61ca\u61cb\u61cc\u61cd\u61ce\u61cf\u61d0\u61d1\u61d2\u61d3\u61d4\u61d5\u61d6\u61d7\u61d8\u61d9\u61da\u61db\u61dc\u61dd\u61de\u61df\u61e0\u61e1\u61e2\u61e3\u61e4\u61e5\u61e6\u61e7\u61e8\u61e9\u61ea\u61eb\u61ec\u61ed\u61ee\u61ef\u61f0\u61f1\u61f2\u61f3\u61f4\u61f5\u61f6\u61f7\u61f8\u61f9\u61fa\u61fb\u61fc\u61fd\u61fe\u61ff\u6200\u6201\u6202\u6203\u6204\u6205\u6206\u6207\u6208\u6209\u620a\u620b\u620c\u620d\u620e\u620f\u6210\u6211\u6212\u6213\u6214\u6215\u6216\u6217\u6218\u6219\u621a\u621b\u621c\u621d\u621e\u621f\u6220\u6221\u6222\u6223\u6224\u6225\u6226\u6227\u6228\u6229\u622a\u622b\u622c\u622d\u622e\u622f\u6230\u6231\u6232\u6233\u6234\u6235\u6236\u6237\u6238\u6239\u623a\u623b\u623c\u623d\u623e\u623f\u6240\u6241\u6242\u6243\u6244\u6245\u6246\u6247\u6248\u6249\u624a\u624b\u624c\u624d\u624e\u624f\u6250\u6251\u6252\u6253\u6254\u6255\u6256\u6257\u6258\u6259\u625a\u625b\u625c\u625d\u625e\u625f\u6260\u6261\u6262\u6263\u6264\u6265\u6266\u6267\u6268\u6269\u626a\u626b\u626c\u626d\u626e\u626f\u6270\u6271\u6272\u6273\u6274\u6275\u6276\u6277\u6278\u6279\u627a\u627b\u627c\u627d\u627e\u627f\u6280\u6281\u6282\u6283\u6284\u6285\u6286\u6287\u6288\u6289\u628a\u628b\u628c\u628d\u628e\u628f\u6290\u6291\u6292\u6293\u6294\u6295\u6296\u6297\u6298\u6299\u629a\u629b\u629c\u629d\u629e\u629f\u62a0\u62a1\u62a2\u62a3\u62a4\u62a5\u62a6\u62a7\u62a8\u62a9\u62aa\u62ab\u62ac\u62ad\u62ae\u62af\u62b0\u62b1\u62b2\u62b3\u62b4\u62b5\u62b6\u62b7\u62b8\u62b9\u62ba\u62bb\u62bc\u62bd\u62be\u62bf\u62c0\u62c1\u62c2\u62c3\u62c4\u62c5\u62c6\u62c7\u62c8\u62c9\u62ca\u62cb\u62cc\u62cd\u62ce\u62cf\u62d0\u62d1\u62d2\u62d3\u62d4\u62d5\u62d6\u62d7\u62d8\u62d9\u62da\u62db\u62dc\u62dd\u62de\u62df\u62e0\u62e1\u62e2\u62e3\u62e4\u62e5\u62e6\u62e7\u62e8\u62e9\u62ea\u62eb\u62ec\u62ed\u62ee\u62ef\u62f0\u62f1\u62f2\u62f3\u62f4\u62f5\u62f6\u62f7\u62f8\u62f9\u62fa\u62fb\u62fc\u62fd\u62fe\u62ff\u6300\u6301\u6302\u6303\u6304\u6305\u6306\u6307\u6308\u6309\u630a\u630b\u630c\u630d\u630e\u630f\u6310\u6311\u6312\u6313\u6314\u6315\u6316\u6317\u6318\u6319\u631a\u631b\u631c\u631d\u631e\u631f\u6320\u6321\u6322\u6323\u6324\u6325\u6326\u6327\u6328\u6329\u632a\u632b\u632c\u632d\u632e\u632f\u6330\u6331\u6332\u6333\u6334\u6335\u6336\u6337\u6338\u6339\u633a\u633b\u633c\u633d\u633e\u633f\u6340\u6341\u6342\u6343\u6344\u6345\u6346\u6347\u6348\u6349\u634a\u634b\u634c\u634d\u634e\u634f\u6350\u6351\u6352\u6353\u6354\u6355\u6356\u6357\u6358\u6359\u635a\u635b\u635c\u635d\u635e\u635f\u6360\u6361\u6362\u6363\u6364\u6365\u6366\u6367\u6368\u6369\u636a\u636b\u636c\u636d\u636e\u636f\u6370\u6371\u6372\u6373\u6374\u6375\u6376\u6377\u6378\u6379\u637a\u637b\u637c\u637d\u637e\u637f\u6380\u6381\u6382\u6383\u6384\u6385\u6386\u6387\u6388\u6389\u638a\u638b\u638c\u638d\u638e\u638f\u6390\u6391\u6392\u6393\u6394\u6395\u6396\u6397\u6398\u6399\u639a\u639b\u639c\u639d\u639e\u639f\u63a0\u63a1\u63a2\u63a3\u63a4\u63a5\u63a6\u63a7\u63a8\u63a9\u63aa\u63ab\u63ac\u63ad\u63ae\u63af\u63b0\u63b1\u63b2\u63b3\u63b4\u63b5\u63b6\u63b7\u63b8\u63b9\u63ba\u63bb\u63bc\u63bd\u63be\u63bf\u63c0\u63c1\u63c2\u63c3\u63c4\u63c5\u63c6\u63c7\u63c8\u63c9\u63ca\u63cb\u63cc\u63cd\u63ce\u63cf\u63d0\u63d1\u63d2\u63d3\u63d4\u63d5\u63d6\u63d7\u63d8\u63d9\u63da\u63db\u63dc\u63dd\u63de\u63df\u63e0\u63e1\u63e2\u63e3\u63e4\u63e5\u63e6\u63e7\u63e8\u63e9\u63ea\u63eb\u63ec\u63ed\u63ee\u63ef\u63f0\u63f1\u63f2\u63f3\u63f4\u63f5\u63f6\u63f7\u63f8\u63f9\u63fa\u63fb\u63fc\u63fd\u63fe\u63ff\u6400\u6401\u6402\u6403\u6404\u6405\u6406\u6407\u6408\u6409\u640a\u640b\u640c\u640d\u640e\u640f\u6410\u6411\u6412\u6413\u6414\u6415\u6416\u6417\u6418\u6419\u641a\u641b\u641c\u641d\u641e\u641f\u6420\u6421\u6422\u6423\u6424\u6425\u6426\u6427\u6428\u6429\u642a\u642b\u642c\u642d\u642e\u642f\u6430\u6431\u6432\u6433\u6434\u6435\u6436\u6437\u6438\u6439\u643a\u643b\u643c\u643d\u643e\u643f\u6440\u6441\u6442\u6443\u6444\u6445\u6446\u6447\u6448\u6449\u644a\u644b\u644c\u644d\u644e\u644f\u6450\u6451\u6452\u6453\u6454\u6455\u6456\u6457\u6458\u6459\u645a\u645b\u645c\u645d\u645e\u645f\u6460\u6461\u6462\u6463\u6464\u6465\u6466\u6467\u6468\u6469\u646a\u646b\u646c\u646d\u646e\u646f\u6470\u6471\u6472\u6473\u6474\u6475\u6476\u6477\u6478\u6479\u647a\u647b\u647c\u647d\u647e\u647f\u6480\u6481\u6482\u6483\u6484\u6485\u6486\u6487\u6488\u6489\u648a\u648b\u648c\u648d\u648e\u648f\u6490\u6491\u6492\u6493\u6494\u6495\u6496\u6497\u6498\u6499\u649a\u649b\u649c\u649d\u649e\u649f\u64a0\u64a1\u64a2\u64a3\u64a4\u64a5\u64a6\u64a7\u64a8\u64a9\u64aa\u64ab\u64ac\u64ad\u64ae\u64af\u64b0\u64b1\u64b2\u64b3\u64b4\u64b5\u64b6\u64b7\u64b8\u64b9\u64ba\u64bb\u64bc\u64bd\u64be\u64bf\u64c0\u64c1\u64c2\u64c3\u64c4\u64c5\u64c6\u64c7\u64c8\u64c9\u64ca\u64cb\u64cc\u64cd\u64ce\u64cf\u64d0\u64d1\u64d2\u64d3\u64d4\u64d5\u64d6\u64d7\u64d8\u64d9\u64da\u64db\u64dc\u64dd\u64de\u64df\u64e0\u64e1\u64e2\u64e3\u64e4\u64e5\u64e6\u64e7\u64e8\u64e9\u64ea\u64eb\u64ec\u64ed\u64ee\u64ef\u64f0\u64f1\u64f2\u64f3\u64f4\u64f5\u64f6\u64f7\u64f8\u64f9\u64fa\u64fb\u64fc\u64fd\u64fe\u64ff\u6500\u6501\u6502\u6503\u6504\u6505\u6506\u6507\u6508\u6509\u650a\u650b\u650c\u650d\u650e\u650f\u6510\u6511\u6512\u6513\u6514\u6515\u6516\u6517\u6518\u6519\u651a\u651b\u651c\u651d\u651e\u651f\u6520\u6521\u6522\u6523\u6524\u6525\u6526\u6527\u6528\u6529\u652a\u652b\u652c\u652d\u652e\u652f\u6530\u6531\u6532\u6533\u6534\u6535\u6536\u6537\u6538\u6539\u653a\u653b\u653c\u653d\u653e\u653f\u6540\u6541\u6542\u6543\u6544\u6545\u6546\u6547\u6548\u6549\u654a\u654b\u654c\u654d\u654e\u654f\u6550\u6551\u6552\u6553\u6554\u6555\u6556\u6557\u6558\u6559\u655a\u655b\u655c\u655d\u655e\u655f\u6560\u6561\u6562\u6563\u6564\u6565\u6566\u6567\u6568\u6569\u656a\u656b\u656c\u656d\u656e\u656f\u6570\u6571\u6572\u6573\u6574\u6575\u6576\u6577\u6578\u6579\u657a\u657b\u657c\u657d\u657e\u657f\u6580\u6581\u6582\u6583\u6584\u6585\u6586\u6587\u6588\u6589\u658a\u658b\u658c\u658d\u658e\u658f\u6590\u6591\u6592\u6593\u6594\u6595\u6596\u6597\u6598\u6599\u659a\u659b\u659c\u659d\u659e\u659f\u65a0\u65a1\u65a2\u65a3\u65a4\u65a5\u65a6\u65a7\u65a8\u65a9\u65aa\u65ab\u65ac\u65ad\u65ae\u65af\u65b0\u65b1\u65b2\u65b3\u65b4\u65b5\u65b6\u65b7\u65b8\u65b9\u65ba\u65bb\u65bc\u65bd\u65be\u65bf\u65c0\u65c1\u65c2\u65c3\u65c4\u65c5\u65c6\u65c7\u65c8\u65c9\u65ca\u65cb\u65cc\u65cd\u65ce\u65cf\u65d0\u65d1\u65d2\u65d3\u65d4\u65d5\u65d6\u65d7\u65d8\u65d9\u65da\u65db\u65dc\u65dd\u65de\u65df\u65e0\u65e1\u65e2\u65e3\u65e4\u65e5\u65e6\u65e7\u65e8\u65e9\u65ea\u65eb\u65ec\u65ed\u65ee\u65ef\u65f0\u65f1\u65f2\u65f3\u65f4\u65f5\u65f6\u65f7\u65f8\u65f9\u65fa\u65fb\u65fc\u65fd\u65fe\u65ff\u6600\u6601\u6602\u6603\u6604\u6605\u6606\u6607\u6608\u6609\u660a\u660b\u660c\u660d\u660e\u660f\u6610\u6611\u6612\u6613\u6614\u6615\u6616\u6617\u6618\u6619\u661a\u661b\u661c\u661d\u661e\u661f\u6620\u6621\u6622\u6623\u6624\u6625\u6626\u6627\u6628\u6629\u662a\u662b\u662c\u662d\u662e\u662f\u6630\u6631\u6632\u6633\u6634\u6635\u6636\u6637\u6638\u6639\u663a\u663b\u663c\u663d\u663e\u663f\u6640\u6641\u6642\u6643\u6644\u6645\u6646\u6647\u6648\u6649\u664a\u664b\u664c\u664d\u664e\u664f\u6650\u6651\u6652\u6653\u6654\u6655\u6656\u6657\u6658\u6659\u665a\u665b\u665c\u665d\u665e\u665f\u6660\u6661\u6662\u6663\u6664\u6665\u6666\u6667\u6668\u6669\u666a\u666b\u666c\u666d\u666e\u666f\u6670\u6671\u6672\u6673\u6674\u6675\u6676\u6677\u6678\u6679\u667a\u667b\u667c\u667d\u667e\u667f\u6680\u6681\u6682\u6683\u6684\u6685\u6686\u6687\u6688\u6689\u668a\u668b\u668c\u668d\u668e\u668f\u6690\u6691\u6692\u6693\u6694\u6695\u6696\u6697\u6698\u6699\u669a\u669b\u669c\u669d\u669e\u669f\u66a0\u66a1\u66a2\u66a3\u66a4\u66a5\u66a6\u66a7\u66a8\u66a9\u66aa\u66ab\u66ac\u66ad\u66ae\u66af\u66b0\u66b1\u66b2\u66b3\u66b4\u66b5\u66b6\u66b7\u66b8\u66b9\u66ba\u66bb\u66bc\u66bd\u66be\u66bf\u66c0\u66c1\u66c2\u66c3\u66c4\u66c5\u66c6\u66c7\u66c8\u66c9\u66ca\u66cb\u66cc\u66cd\u66ce\u66cf\u66d0\u66d1\u66d2\u66d3\u66d4\u66d5\u66d6\u66d7\u66d8\u66d9\u66da\u66db\u66dc\u66dd\u66de\u66df\u66e0\u66e1\u66e2\u66e3\u66e4\u66e5\u66e6\u66e7\u66e8\u66e9\u66ea\u66eb\u66ec\u66ed\u66ee\u66ef\u66f0\u66f1\u66f2\u66f3\u66f4\u66f5\u66f6\u66f7\u66f8\u66f9\u66fa\u66fb\u66fc\u66fd\u66fe\u66ff\u6700\u6701\u6702\u6703\u6704\u6705\u6706\u6707\u6708\u6709\u670a\u670b\u670c\u670d\u670e\u670f\u6710\u6711\u6712\u6713\u6714\u6715\u6716\u6717\u6718\u6719\u671a\u671b\u671c\u671d\u671e\u671f\u6720\u6721\u6722\u6723\u6724\u6725\u6726\u6727\u6728\u6729\u672a\u672b\u672c\u672d\u672e\u672f\u6730\u6731\u6732\u6733\u6734\u6735\u6736\u6737\u6738\u6739\u673a\u673b\u673c\u673d\u673e\u673f\u6740\u6741\u6742\u6743\u6744\u6745\u6746\u6747\u6748\u6749\u674a\u674b\u674c\u674d\u674e\u674f\u6750\u6751\u6752\u6753\u6754\u6755\u6756\u6757\u6758\u6759\u675a\u675b\u675c\u675d\u675e\u675f\u6760\u6761\u6762\u6763\u6764\u6765\u6766\u6767\u6768\u6769\u676a\u676b\u676c\u676d\u676e\u676f\u6770\u6771\u6772\u6773\u6774\u6775\u6776\u6777\u6778\u6779\u677a\u677b\u677c\u677d\u677e\u677f\u6780\u6781\u6782\u6783\u6784\u6785\u6786\u6787\u6788\u6789\u678a\u678b\u678c\u678d\u678e\u678f\u6790\u6791\u6792\u6793\u6794\u6795\u6796\u6797\u6798\u6799\u679a\u679b\u679c\u679d\u679e\u679f\u67a0\u67a1\u67a2\u67a3\u67a4\u67a5\u67a6\u67a7\u67a8\u67a9\u67aa\u67ab\u67ac\u67ad\u67ae\u67af\u67b0\u67b1\u67b2\u67b3\u67b4\u67b5\u67b6\u67b7\u67b8\u67b9\u67ba\u67bb\u67bc\u67bd\u67be\u67bf\u67c0\u67c1\u67c2\u67c3\u67c4\u67c5\u67c6\u67c7\u67c8\u67c9\u67ca\u67cb\u67cc\u67cd\u67ce\u67cf\u67d0\u67d1\u67d2\u67d3\u67d4\u67d5\u67d6\u67d7\u67d8\u67d9\u67da\u67db\u67dc\u67dd\u67de\u67df\u67e0\u67e1\u67e2\u67e3\u67e4\u67e5\u67e6\u67e7\u67e8\u67e9\u67ea\u67eb\u67ec\u67ed\u67ee\u67ef\u67f0\u67f1\u67f2\u67f3\u67f4\u67f5\u67f6\u67f7\u67f8\u67f9\u67fa\u67fb\u67fc\u67fd\u67fe\u67ff\u6800\u6801\u6802\u6803\u6804\u6805\u6806\u6807\u6808\u6809\u680a\u680b\u680c\u680d\u680e\u680f\u6810\u6811\u6812\u6813\u6814\u6815\u6816\u6817\u6818\u6819\u681a\u681b\u681c\u681d\u681e\u681f\u6820\u6821\u6822\u6823\u6824\u6825\u6826\u6827\u6828\u6829\u682a\u682b\u682c\u682d\u682e\u682f\u6830\u6831\u6832\u6833\u6834\u6835\u6836\u6837\u6838\u6839\u683a\u683b\u683c\u683d\u683e\u683f\u6840\u6841\u6842\u6843\u6844\u6845\u6846\u6847\u6848\u6849\u684a\u684b\u684c\u684d\u684e\u684f\u6850\u6851\u6852\u6853\u6854\u6855\u6856\u6857\u6858\u6859\u685a\u685b\u685c\u685d\u685e\u685f\u6860\u6861\u6862\u6863\u6864\u6865\u6866\u6867\u6868\u6869\u686a\u686b\u686c\u686d\u686e\u686f\u6870\u6871\u6872\u6873\u6874\u6875\u6876\u6877\u6878\u6879\u687a\u687b\u687c\u687d\u687e\u687f\u6880\u6881\u6882\u6883\u6884\u6885\u6886\u6887\u6888\u6889\u688a\u688b\u688c\u688d\u688e\u688f\u6890\u6891\u6892\u6893\u6894\u6895\u6896\u6897\u6898\u6899\u689a\u689b\u689c\u689d\u689e\u689f\u68a0\u68a1\u68a2\u68a3\u68a4\u68a5\u68a6\u68a7\u68a8\u68a9\u68aa\u68ab\u68ac\u68ad\u68ae\u68af\u68b0\u68b1\u68b2\u68b3\u68b4\u68b5\u68b6\u68b7\u68b8\u68b9\u68ba\u68bb\u68bc\u68bd\u68be\u68bf\u68c0\u68c1\u68c2\u68c3\u68c4\u68c5\u68c6\u68c7\u68c8\u68c9\u68ca\u68cb\u68cc\u68cd\u68ce\u68cf\u68d0\u68d1\u68d2\u68d3\u68d4\u68d5\u68d6\u68d7\u68d8\u68d9\u68da\u68db\u68dc\u68dd\u68de\u68df\u68e0\u68e1\u68e2\u68e3\u68e4\u68e5\u68e6\u68e7\u68e8\u68e9\u68ea\u68eb\u68ec\u68ed\u68ee\u68ef\u68f0\u68f1\u68f2\u68f3\u68f4\u68f5\u68f6\u68f7\u68f8\u68f9\u68fa\u68fb\u68fc\u68fd\u68fe\u68ff\u6900\u6901\u6902\u6903\u6904\u6905\u6906\u6907\u6908\u6909\u690a\u690b\u690c\u690d\u690e\u690f\u6910\u6911\u6912\u6913\u6914\u6915\u6916\u6917\u6918\u6919\u691a\u691b\u691c\u691d\u691e\u691f\u6920\u6921\u6922\u6923\u6924\u6925\u6926\u6927\u6928\u6929\u692a\u692b\u692c\u692d\u692e\u692f\u6930\u6931\u6932\u6933\u6934\u6935\u6936\u6937\u6938\u6939\u693a\u693b\u693c\u693d\u693e\u693f\u6940\u6941\u6942\u6943\u6944\u6945\u6946\u6947\u6948\u6949\u694a\u694b\u694c\u694d\u694e\u694f\u6950\u6951\u6952\u6953\u6954\u6955\u6956\u6957\u6958\u6959\u695a\u695b\u695c\u695d\u695e\u695f\u6960\u6961\u6962\u6963\u6964\u6965\u6966\u6967\u6968\u6969\u696a\u696b\u696c\u696d\u696e\u696f\u6970\u6971\u6972\u6973\u6974\u6975\u6976\u6977\u6978\u6979\u697a\u697b\u697c\u697d\u697e\u697f\u6980\u6981\u6982\u6983\u6984\u6985\u6986\u6987\u6988\u6989\u698a\u698b\u698c\u698d\u698e\u698f\u6990\u6991\u6992\u6993\u6994\u6995\u6996\u6997\u6998\u6999\u699a\u699b\u699c\u699d\u699e\u699f\u69a0\u69a1\u69a2\u69a3\u69a4\u69a5\u69a6\u69a7\u69a8\u69a9\u69aa\u69ab\u69ac\u69ad\u69ae\u69af\u69b0\u69b1\u69b2\u69b3\u69b4\u69b5\u69b6\u69b7\u69b8\u69b9\u69ba\u69bb\u69bc\u69bd\u69be\u69bf\u69c0\u69c1\u69c2\u69c3\u69c4\u69c5\u69c6\u69c7\u69c8\u69c9\u69ca\u69cb\u69cc\u69cd\u69ce\u69cf\u69d0\u69d1\u69d2\u69d3\u69d4\u69d5\u69d6\u69d7\u69d8\u69d9\u69da\u69db\u69dc\u69dd\u69de\u69df\u69e0\u69e1\u69e2\u69e3\u69e4\u69e5\u69e6\u69e7\u69e8\u69e9\u69ea\u69eb\u69ec\u69ed\u69ee\u69ef\u69f0\u69f1\u69f2\u69f3\u69f4\u69f5\u69f6\u69f7\u69f8\u69f9\u69fa\u69fb\u69fc\u69fd\u69fe\u69ff\u6a00\u6a01\u6a02\u6a03\u6a04\u6a05\u6a06\u6a07\u6a08\u6a09\u6a0a\u6a0b\u6a0c\u6a0d\u6a0e\u6a0f\u6a10\u6a11\u6a12\u6a13\u6a14\u6a15\u6a16\u6a17\u6a18\u6a19\u6a1a\u6a1b\u6a1c\u6a1d\u6a1e\u6a1f\u6a20\u6a21\u6a22\u6a23\u6a24\u6a25\u6a26\u6a27\u6a28\u6a29\u6a2a\u6a2b\u6a2c\u6a2d\u6a2e\u6a2f\u6a30\u6a31\u6a32\u6a33\u6a34\u6a35\u6a36\u6a37\u6a38\u6a39\u6a3a\u6a3b\u6a3c\u6a3d\u6a3e\u6a3f\u6a40\u6a41\u6a42\u6a43\u6a44\u6a45\u6a46\u6a47\u6a48\u6a49\u6a4a\u6a4b\u6a4c\u6a4d\u6a4e\u6a4f\u6a50\u6a51\u6a52\u6a53\u6a54\u6a55\u6a56\u6a57\u6a58\u6a59\u6a5a\u6a5b\u6a5c\u6a5d\u6a5e\u6a5f\u6a60\u6a61\u6a62\u6a63\u6a64\u6a65\u6a66\u6a67\u6a68\u6a69\u6a6a\u6a6b\u6a6c\u6a6d\u6a6e\u6a6f\u6a70\u6a71\u6a72\u6a73\u6a74\u6a75\u6a76\u6a77\u6a78\u6a79\u6a7a\u6a7b\u6a7c\u6a7d\u6a7e\u6a7f\u6a80\u6a81\u6a82\u6a83\u6a84\u6a85\u6a86\u6a87\u6a88\u6a89\u6a8a\u6a8b\u6a8c\u6a8d\u6a8e\u6a8f\u6a90\u6a91\u6a92\u6a93\u6a94\u6a95\u6a96\u6a97\u6a98\u6a99\u6a9a\u6a9b\u6a9c\u6a9d\u6a9e\u6a9f\u6aa0\u6aa1\u6aa2\u6aa3\u6aa4\u6aa5\u6aa6\u6aa7\u6aa8\u6aa9\u6aaa\u6aab\u6aac\u6aad\u6aae\u6aaf\u6ab0\u6ab1\u6ab2\u6ab3\u6ab4\u6ab5\u6ab6\u6ab7\u6ab8\u6ab9\u6aba\u6abb\u6abc\u6abd\u6abe\u6abf\u6ac0\u6ac1\u6ac2\u6ac3\u6ac4\u6ac5\u6ac6\u6ac7\u6ac8\u6ac9\u6aca\u6acb\u6acc\u6acd\u6ace\u6acf\u6ad0\u6ad1\u6ad2\u6ad3\u6ad4\u6ad5\u6ad6\u6ad7\u6ad8\u6ad9\u6ada\u6adb\u6adc\u6add\u6ade\u6adf\u6ae0\u6ae1\u6ae2\u6ae3\u6ae4\u6ae5\u6ae6\u6ae7\u6ae8\u6ae9\u6aea\u6aeb\u6aec\u6aed\u6aee\u6aef\u6af0\u6af1\u6af2\u6af3\u6af4\u6af5\u6af6\u6af7\u6af8\u6af9\u6afa\u6afb\u6afc\u6afd\u6afe\u6aff\u6b00\u6b01\u6b02\u6b03\u6b04\u6b05\u6b06\u6b07\u6b08\u6b09\u6b0a\u6b0b\u6b0c\u6b0d\u6b0e\u6b0f\u6b10\u6b11\u6b12\u6b13\u6b14\u6b15\u6b16\u6b17\u6b18\u6b19\u6b1a\u6b1b\u6b1c\u6b1d\u6b1e\u6b1f\u6b20\u6b21\u6b22\u6b23\u6b24\u6b25\u6b26\u6b27\u6b28\u6b29\u6b2a\u6b2b\u6b2c\u6b2d\u6b2e\u6b2f\u6b30\u6b31\u6b32\u6b33\u6b34\u6b35\u6b36\u6b37\u6b38\u6b39\u6b3a\u6b3b\u6b3c\u6b3d\u6b3e\u6b3f\u6b40\u6b41\u6b42\u6b43\u6b44\u6b45\u6b46\u6b47\u6b48\u6b49\u6b4a\u6b4b\u6b4c\u6b4d\u6b4e\u6b4f\u6b50\u6b51\u6b52\u6b53\u6b54\u6b55\u6b56\u6b57\u6b58\u6b59\u6b5a\u6b5b\u6b5c\u6b5d\u6b5e\u6b5f\u6b60\u6b61\u6b62\u6b63\u6b64\u6b65\u6b66\u6b67\u6b68\u6b69\u6b6a\u6b6b\u6b6c\u6b6d\u6b6e\u6b6f\u6b70\u6b71\u6b72\u6b73\u6b74\u6b75\u6b76\u6b77\u6b78\u6b79\u6b7a\u6b7b\u6b7c\u6b7d\u6b7e\u6b7f\u6b80\u6b81\u6b82\u6b83\u6b84\u6b85\u6b86\u6b87\u6b88\u6b89\u6b8a\u6b8b\u6b8c\u6b8d\u6b8e\u6b8f\u6b90\u6b91\u6b92\u6b93\u6b94\u6b95\u6b96\u6b97\u6b98\u6b99\u6b9a\u6b9b\u6b9c\u6b9d\u6b9e\u6b9f\u6ba0\u6ba1\u6ba2\u6ba3\u6ba4\u6ba5\u6ba6\u6ba7\u6ba8\u6ba9\u6baa\u6bab\u6bac\u6bad\u6bae\u6baf\u6bb0\u6bb1\u6bb2\u6bb3\u6bb4\u6bb5\u6bb6\u6bb7\u6bb8\u6bb9\u6bba\u6bbb\u6bbc\u6bbd\u6bbe\u6bbf\u6bc0\u6bc1\u6bc2\u6bc3\u6bc4\u6bc5\u6bc6\u6bc7\u6bc8\u6bc9\u6bca\u6bcb\u6bcc\u6bcd\u6bce\u6bcf\u6bd0\u6bd1\u6bd2\u6bd3\u6bd4\u6bd5\u6bd6\u6bd7\u6bd8\u6bd9\u6bda\u6bdb\u6bdc\u6bdd\u6bde\u6bdf\u6be0\u6be1\u6be2\u6be3\u6be4\u6be5\u6be6\u6be7\u6be8\u6be9\u6bea\u6beb\u6bec\u6bed\u6bee\u6bef\u6bf0\u6bf1\u6bf2\u6bf3\u6bf4\u6bf5\u6bf6\u6bf7\u6bf8\u6bf9\u6bfa\u6bfb\u6bfc\u6bfd\u6bfe\u6bff\u6c00\u6c01\u6c02\u6c03\u6c04\u6c05\u6c06\u6c07\u6c08\u6c09\u6c0a\u6c0b\u6c0c\u6c0d\u6c0e\u6c0f\u6c10\u6c11\u6c12\u6c13\u6c14\u6c15\u6c16\u6c17\u6c18\u6c19\u6c1a\u6c1b\u6c1c\u6c1d\u6c1e\u6c1f\u6c20\u6c21\u6c22\u6c23\u6c24\u6c25\u6c26\u6c27\u6c28\u6c29\u6c2a\u6c2b\u6c2c\u6c2d\u6c2e\u6c2f\u6c30\u6c31\u6c32\u6c33\u6c34\u6c35\u6c36\u6c37\u6c38\u6c39\u6c3a\u6c3b\u6c3c\u6c3d\u6c3e\u6c3f\u6c40\u6c41\u6c42\u6c43\u6c44\u6c45\u6c46\u6c47\u6c48\u6c49\u6c4a\u6c4b\u6c4c\u6c4d\u6c4e\u6c4f\u6c50\u6c51\u6c52\u6c53\u6c54\u6c55\u6c56\u6c57\u6c58\u6c59\u6c5a\u6c5b\u6c5c\u6c5d\u6c5e\u6c5f\u6c60\u6c61\u6c62\u6c63\u6c64\u6c65\u6c66\u6c67\u6c68\u6c69\u6c6a\u6c6b\u6c6c\u6c6d\u6c6e\u6c6f\u6c70\u6c71\u6c72\u6c73\u6c74\u6c75\u6c76\u6c77\u6c78\u6c79\u6c7a\u6c7b\u6c7c\u6c7d\u6c7e\u6c7f\u6c80\u6c81\u6c82\u6c83\u6c84\u6c85\u6c86\u6c87\u6c88\u6c89\u6c8a\u6c8b\u6c8c\u6c8d\u6c8e\u6c8f\u6c90\u6c91\u6c92\u6c93\u6c94\u6c95\u6c96\u6c97\u6c98\u6c99\u6c9a\u6c9b\u6c9c\u6c9d\u6c9e\u6c9f\u6ca0\u6ca1\u6ca2\u6ca3\u6ca4\u6ca5\u6ca6\u6ca7\u6ca8\u6ca9\u6caa\u6cab\u6cac\u6cad\u6cae\u6caf\u6cb0\u6cb1\u6cb2\u6cb3\u6cb4\u6cb5\u6cb6\u6cb7\u6cb8\u6cb9\u6cba\u6cbb\u6cbc\u6cbd\u6cbe\u6cbf\u6cc0\u6cc1\u6cc2\u6cc3\u6cc4\u6cc5\u6cc6\u6cc7\u6cc8\u6cc9\u6cca\u6ccb\u6ccc\u6ccd\u6cce\u6ccf\u6cd0\u6cd1\u6cd2\u6cd3\u6cd4\u6cd5\u6cd6\u6cd7\u6cd8\u6cd9\u6cda\u6cdb\u6cdc\u6cdd\u6cde\u6cdf\u6ce0\u6ce1\u6ce2\u6ce3\u6ce4\u6ce5\u6ce6\u6ce7\u6ce8\u6ce9\u6cea\u6ceb\u6cec\u6ced\u6cee\u6cef\u6cf0\u6cf1\u6cf2\u6cf3\u6cf4\u6cf5\u6cf6\u6cf7\u6cf8\u6cf9\u6cfa\u6cfb\u6cfc\u6cfd\u6cfe\u6cff\u6d00\u6d01\u6d02\u6d03\u6d04\u6d05\u6d06\u6d07\u6d08\u6d09\u6d0a\u6d0b\u6d0c\u6d0d\u6d0e\u6d0f\u6d10\u6d11\u6d12\u6d13\u6d14\u6d15\u6d16\u6d17\u6d18\u6d19\u6d1a\u6d1b\u6d1c\u6d1d\u6d1e\u6d1f\u6d20\u6d21\u6d22\u6d23\u6d24\u6d25\u6d26\u6d27\u6d28\u6d29\u6d2a\u6d2b\u6d2c\u6d2d\u6d2e\u6d2f\u6d30\u6d31\u6d32\u6d33\u6d34\u6d35\u6d36\u6d37\u6d38\u6d39\u6d3a\u6d3b\u6d3c\u6d3d\u6d3e\u6d3f\u6d40\u6d41\u6d42\u6d43\u6d44\u6d45\u6d46\u6d47\u6d48\u6d49\u6d4a\u6d4b\u6d4c\u6d4d\u6d4e\u6d4f\u6d50\u6d51\u6d52\u6d53\u6d54\u6d55\u6d56\u6d57\u6d58\u6d59\u6d5a\u6d5b\u6d5c\u6d5d\u6d5e\u6d5f\u6d60\u6d61\u6d62\u6d63\u6d64\u6d65\u6d66\u6d67\u6d68\u6d69\u6d6a\u6d6b\u6d6c\u6d6d\u6d6e\u6d6f\u6d70\u6d71\u6d72\u6d73\u6d74\u6d75\u6d76\u6d77\u6d78\u6d79\u6d7a\u6d7b\u6d7c\u6d7d\u6d7e\u6d7f\u6d80\u6d81\u6d82\u6d83\u6d84\u6d85\u6d86\u6d87\u6d88\u6d89\u6d8a\u6d8b\u6d8c\u6d8d\u6d8e\u6d8f\u6d90\u6d91\u6d92\u6d93\u6d94\u6d95\u6d96\u6d97\u6d98\u6d99\u6d9a\u6d9b\u6d9c\u6d9d\u6d9e\u6d9f\u6da0\u6da1\u6da2\u6da3\u6da4\u6da5\u6da6\u6da7\u6da8\u6da9\u6daa\u6dab\u6dac\u6dad\u6dae\u6daf\u6db0\u6db1\u6db2\u6db3\u6db4\u6db5\u6db6\u6db7\u6db8\u6db9\u6dba\u6dbb\u6dbc\u6dbd\u6dbe\u6dbf\u6dc0\u6dc1\u6dc2\u6dc3\u6dc4\u6dc5\u6dc6\u6dc7\u6dc8\u6dc9\u6dca\u6dcb\u6dcc\u6dcd\u6dce\u6dcf\u6dd0\u6dd1\u6dd2\u6dd3\u6dd4\u6dd5\u6dd6\u6dd7\u6dd8\u6dd9\u6dda\u6ddb\u6ddc\u6ddd\u6dde\u6ddf\u6de0\u6de1\u6de2\u6de3\u6de4\u6de5\u6de6\u6de7\u6de8\u6de9\u6dea\u6deb\u6dec\u6ded\u6dee\u6def\u6df0\u6df1\u6df2\u6df3\u6df4\u6df5\u6df6\u6df7\u6df8\u6df9\u6dfa\u6dfb\u6dfc\u6dfd\u6dfe\u6dff\u6e00\u6e01\u6e02\u6e03\u6e04\u6e05\u6e06\u6e07\u6e08\u6e09\u6e0a\u6e0b\u6e0c\u6e0d\u6e0e\u6e0f\u6e10\u6e11\u6e12\u6e13\u6e14\u6e15\u6e16\u6e17\u6e18\u6e19\u6e1a\u6e1b\u6e1c\u6e1d\u6e1e\u6e1f\u6e20\u6e21\u6e22\u6e23\u6e24\u6e25\u6e26\u6e27\u6e28\u6e29\u6e2a\u6e2b\u6e2c\u6e2d\u6e2e\u6e2f\u6e30\u6e31\u6e32\u6e33\u6e34\u6e35\u6e36\u6e37\u6e38\u6e39\u6e3a\u6e3b\u6e3c\u6e3d\u6e3e\u6e3f\u6e40\u6e41\u6e42\u6e43\u6e44\u6e45\u6e46\u6e47\u6e48\u6e49\u6e4a\u6e4b\u6e4c\u6e4d\u6e4e\u6e4f\u6e50\u6e51\u6e52\u6e53\u6e54\u6e55\u6e56\u6e57\u6e58\u6e59\u6e5a\u6e5b\u6e5c\u6e5d\u6e5e\u6e5f\u6e60\u6e61\u6e62\u6e63\u6e64\u6e65\u6e66\u6e67\u6e68\u6e69\u6e6a\u6e6b\u6e6c\u6e6d\u6e6e\u6e6f\u6e70\u6e71\u6e72\u6e73\u6e74\u6e75\u6e76\u6e77\u6e78\u6e79\u6e7a\u6e7b\u6e7c\u6e7d\u6e7e\u6e7f\u6e80\u6e81\u6e82\u6e83\u6e84\u6e85\u6e86\u6e87\u6e88\u6e89\u6e8a\u6e8b\u6e8c\u6e8d\u6e8e\u6e8f\u6e90\u6e91\u6e92\u6e93\u6e94\u6e95\u6e96\u6e97\u6e98\u6e99\u6e9a\u6e9b\u6e9c\u6e9d\u6e9e\u6e9f\u6ea0\u6ea1\u6ea2\u6ea3\u6ea4\u6ea5\u6ea6\u6ea7\u6ea8\u6ea9\u6eaa\u6eab\u6eac\u6ead\u6eae\u6eaf\u6eb0\u6eb1\u6eb2\u6eb3\u6eb4\u6eb5\u6eb6\u6eb7\u6eb8\u6eb9\u6eba\u6ebb\u6ebc\u6ebd\u6ebe\u6ebf\u6ec0\u6ec1\u6ec2\u6ec3\u6ec4\u6ec5\u6ec6\u6ec7\u6ec8\u6ec9\u6eca\u6ecb\u6ecc\u6ecd\u6ece\u6ecf\u6ed0\u6ed1\u6ed2\u6ed3\u6ed4\u6ed5\u6ed6\u6ed7\u6ed8\u6ed9\u6eda\u6edb\u6edc\u6edd\u6ede\u6edf\u6ee0\u6ee1\u6ee2\u6ee3\u6ee4\u6ee5\u6ee6\u6ee7\u6ee8\u6ee9\u6eea\u6eeb\u6eec\u6eed\u6eee\u6eef\u6ef0\u6ef1\u6ef2\u6ef3\u6ef4\u6ef5\u6ef6\u6ef7\u6ef8\u6ef9\u6efa\u6efb\u6efc\u6efd\u6efe\u6eff\u6f00\u6f01\u6f02\u6f03\u6f04\u6f05\u6f06\u6f07\u6f08\u6f09\u6f0a\u6f0b\u6f0c\u6f0d\u6f0e\u6f0f\u6f10\u6f11\u6f12\u6f13\u6f14\u6f15\u6f16\u6f17\u6f18\u6f19\u6f1a\u6f1b\u6f1c\u6f1d\u6f1e\u6f1f\u6f20\u6f21\u6f22\u6f23\u6f24\u6f25\u6f26\u6f27\u6f28\u6f29\u6f2a\u6f2b\u6f2c\u6f2d\u6f2e\u6f2f\u6f30\u6f31\u6f32\u6f33\u6f34\u6f35\u6f36\u6f37\u6f38\u6f39\u6f3a\u6f3b\u6f3c\u6f3d\u6f3e\u6f3f\u6f40\u6f41\u6f42\u6f43\u6f44\u6f45\u6f46\u6f47\u6f48\u6f49\u6f4a\u6f4b\u6f4c\u6f4d\u6f4e\u6f4f\u6f50\u6f51\u6f52\u6f53\u6f54\u6f55\u6f56\u6f57\u6f58\u6f59\u6f5a\u6f5b\u6f5c\u6f5d\u6f5e\u6f5f\u6f60\u6f61\u6f62\u6f63\u6f64\u6f65\u6f66\u6f67\u6f68\u6f69\u6f6a\u6f6b\u6f6c\u6f6d\u6f6e\u6f6f\u6f70\u6f71\u6f72\u6f73\u6f74\u6f75\u6f76\u6f77\u6f78\u6f79\u6f7a\u6f7b\u6f7c\u6f7d\u6f7e\u6f7f\u6f80\u6f81\u6f82\u6f83\u6f84\u6f85\u6f86\u6f87\u6f88\u6f89\u6f8a\u6f8b\u6f8c\u6f8d\u6f8e\u6f8f\u6f90\u6f91\u6f92\u6f93\u6f94\u6f95\u6f96\u6f97\u6f98\u6f99\u6f9a\u6f9b\u6f9c\u6f9d\u6f9e\u6f9f\u6fa0\u6fa1\u6fa2\u6fa3\u6fa4\u6fa5\u6fa6\u6fa7\u6fa8\u6fa9\u6faa\u6fab\u6fac\u6fad\u6fae\u6faf\u6fb0\u6fb1\u6fb2\u6fb3\u6fb4\u6fb5\u6fb6\u6fb7\u6fb8\u6fb9\u6fba\u6fbb\u6fbc\u6fbd\u6fbe\u6fbf\u6fc0\u6fc1\u6fc2\u6fc3\u6fc4\u6fc5\u6fc6\u6fc7\u6fc8\u6fc9\u6fca\u6fcb\u6fcc\u6fcd\u6fce\u6fcf\u6fd0\u6fd1\u6fd2\u6fd3\u6fd4\u6fd5\u6fd6\u6fd7\u6fd8\u6fd9\u6fda\u6fdb\u6fdc\u6fdd\u6fde\u6fdf\u6fe0\u6fe1\u6fe2\u6fe3\u6fe4\u6fe5\u6fe6\u6fe7\u6fe8\u6fe9\u6fea\u6feb\u6fec\u6fed\u6fee\u6fef\u6ff0\u6ff1\u6ff2\u6ff3\u6ff4\u6ff5\u6ff6\u6ff7\u6ff8\u6ff9\u6ffa\u6ffb\u6ffc\u6ffd\u6ffe\u6fff\u7000\u7001\u7002\u7003\u7004\u7005\u7006\u7007\u7008\u7009\u700a\u700b\u700c\u700d\u700e\u700f\u7010\u7011\u7012\u7013\u7014\u7015\u7016\u7017\u7018\u7019\u701a\u701b\u701c\u701d\u701e\u701f\u7020\u7021\u7022\u7023\u7024\u7025\u7026\u7027\u7028\u7029\u702a\u702b\u702c\u702d\u702e\u702f\u7030\u7031\u7032\u7033\u7034\u7035\u7036\u7037\u7038\u7039\u703a\u703b\u703c\u703d\u703e\u703f\u7040\u7041\u7042\u7043\u7044\u7045\u7046\u7047\u7048\u7049\u704a\u704b\u704c\u704d\u704e\u704f\u7050\u7051\u7052\u7053\u7054\u7055\u7056\u7057\u7058\u7059\u705a\u705b\u705c\u705d\u705e\u705f\u7060\u7061\u7062\u7063\u7064\u7065\u7066\u7067\u7068\u7069\u706a\u706b\u706c\u706d\u706e\u706f\u7070\u7071\u7072\u7073\u7074\u7075\u7076\u7077\u7078\u7079\u707a\u707b\u707c\u707d\u707e\u707f\u7080\u7081\u7082\u7083\u7084\u7085\u7086\u7087\u7088\u7089\u708a\u708b\u708c\u708d\u708e\u708f\u7090\u7091\u7092\u7093\u7094\u7095\u7096\u7097\u7098\u7099\u709a\u709b\u709c\u709d\u709e\u709f\u70a0\u70a1\u70a2\u70a3\u70a4\u70a5\u70a6\u70a7\u70a8\u70a9\u70aa\u70ab\u70ac\u70ad\u70ae\u70af\u70b0\u70b1\u70b2\u70b3\u70b4\u70b5\u70b6\u70b7\u70b8\u70b9\u70ba\u70bb\u70bc\u70bd\u70be\u70bf\u70c0\u70c1\u70c2\u70c3\u70c4\u70c5\u70c6\u70c7\u70c8\u70c9\u70ca\u70cb\u70cc\u70cd\u70ce\u70cf\u70d0\u70d1\u70d2\u70d3\u70d4\u70d5\u70d6\u70d7\u70d8\u70d9\u70da\u70db\u70dc\u70dd\u70de\u70df\u70e0\u70e1\u70e2\u70e3\u70e4\u70e5\u70e6\u70e7\u70e8\u70e9\u70ea\u70eb\u70ec\u70ed\u70ee\u70ef\u70f0\u70f1\u70f2\u70f3\u70f4\u70f5\u70f6\u70f7\u70f8\u70f9\u70fa\u70fb\u70fc\u70fd\u70fe\u70ff\u7100\u7101\u7102\u7103\u7104\u7105\u7106\u7107\u7108\u7109\u710a\u710b\u710c\u710d\u710e\u710f\u7110\u7111\u7112\u7113\u7114\u7115\u7116\u7117\u7118\u7119\u711a\u711b\u711c\u711d\u711e\u711f\u7120\u7121\u7122\u7123\u7124\u7125\u7126\u7127\u7128\u7129\u712a\u712b\u712c\u712d\u712e\u712f\u7130\u7131\u7132\u7133\u7134\u7135\u7136\u7137\u7138\u7139\u713a\u713b\u713c\u713d\u713e\u713f\u7140\u7141\u7142\u7143\u7144\u7145\u7146\u7147\u7148\u7149\u714a\u714b\u714c\u714d\u714e\u714f\u7150\u7151\u7152\u7153\u7154\u7155\u7156\u7157\u7158\u7159\u715a\u715b\u715c\u715d\u715e\u715f\u7160\u7161\u7162\u7163\u7164\u7165\u7166\u7167\u7168\u7169\u716a\u716b\u716c\u716d\u716e\u716f\u7170\u7171\u7172\u7173\u7174\u7175\u7176\u7177\u7178\u7179\u717a\u717b\u717c\u717d\u717e\u717f\u7180\u7181\u7182\u7183\u7184\u7185\u7186\u7187\u7188\u7189\u718a\u718b\u718c\u718d\u718e\u718f\u7190\u7191\u7192\u7193\u7194\u7195\u7196\u7197\u7198\u7199\u719a\u719b\u719c\u719d\u719e\u719f\u71a0\u71a1\u71a2\u71a3\u71a4\u71a5\u71a6\u71a7\u71a8\u71a9\u71aa\u71ab\u71ac\u71ad\u71ae\u71af\u71b0\u71b1\u71b2\u71b3\u71b4\u71b5\u71b6\u71b7\u71b8\u71b9\u71ba\u71bb\u71bc\u71bd\u71be\u71bf\u71c0\u71c1\u71c2\u71c3\u71c4\u71c5\u71c6\u71c7\u71c8\u71c9\u71ca\u71cb\u71cc\u71cd\u71ce\u71cf\u71d0\u71d1\u71d2\u71d3\u71d4\u71d5\u71d6\u71d7\u71d8\u71d9\u71da\u71db\u71dc\u71dd\u71de\u71df\u71e0\u71e1\u71e2\u71e3\u71e4\u71e5\u71e6\u71e7\u71e8\u71e9\u71ea\u71eb\u71ec\u71ed\u71ee\u71ef\u71f0\u71f1\u71f2\u71f3\u71f4\u71f5\u71f6\u71f7\u71f8\u71f9\u71fa\u71fb\u71fc\u71fd\u71fe\u71ff\u7200\u7201\u7202\u7203\u7204\u7205\u7206\u7207\u7208\u7209\u720a\u720b\u720c\u720d\u720e\u720f\u7210\u7211\u7212\u7213\u7214\u7215\u7216\u7217\u7218\u7219\u721a\u721b\u721c\u721d\u721e\u721f\u7220\u7221\u7222\u7223\u7224\u7225\u7226\u7227\u7228\u7229\u722a\u722b\u722c\u722d\u722e\u722f\u7230\u7231\u7232\u7233\u7234\u7235\u7236\u7237\u7238\u7239\u723a\u723b\u723c\u723d\u723e\u723f\u7240\u7241\u7242\u7243\u7244\u7245\u7246\u7247\u7248\u7249\u724a\u724b\u724c\u724d\u724e\u724f\u7250\u7251\u7252\u7253\u7254\u7255\u7256\u7257\u7258\u7259\u725a\u725b\u725c\u725d\u725e\u725f\u7260\u7261\u7262\u7263\u7264\u7265\u7266\u7267\u7268\u7269\u726a\u726b\u726c\u726d\u726e\u726f\u7270\u7271\u7272\u7273\u7274\u7275\u7276\u7277\u7278\u7279\u727a\u727b\u727c\u727d\u727e\u727f\u7280\u7281\u7282\u7283\u7284\u7285\u7286\u7287\u7288\u7289\u728a\u728b\u728c\u728d\u728e\u728f\u7290\u7291\u7292\u7293\u7294\u7295\u7296\u7297\u7298\u7299\u729a\u729b\u729c\u729d\u729e\u729f\u72a0\u72a1\u72a2\u72a3\u72a4\u72a5\u72a6\u72a7\u72a8\u72a9\u72aa\u72ab\u72ac\u72ad\u72ae\u72af\u72b0\u72b1\u72b2\u72b3\u72b4\u72b5\u72b6\u72b7\u72b8\u72b9\u72ba\u72bb\u72bc\u72bd\u72be\u72bf\u72c0\u72c1\u72c2\u72c3\u72c4\u72c5\u72c6\u72c7\u72c8\u72c9\u72ca\u72cb\u72cc\u72cd\u72ce\u72cf\u72d0\u72d1\u72d2\u72d3\u72d4\u72d5\u72d6\u72d7\u72d8\u72d9\u72da\u72db\u72dc\u72dd\u72de\u72df\u72e0\u72e1\u72e2\u72e3\u72e4\u72e5\u72e6\u72e7\u72e8\u72e9\u72ea\u72eb\u72ec\u72ed\u72ee\u72ef\u72f0\u72f1\u72f2\u72f3\u72f4\u72f5\u72f6\u72f7\u72f8\u72f9\u72fa\u72fb\u72fc\u72fd\u72fe\u72ff\u7300\u7301\u7302\u7303\u7304\u7305\u7306\u7307\u7308\u7309\u730a\u730b\u730c\u730d\u730e\u730f\u7310\u7311\u7312\u7313\u7314\u7315\u7316\u7317\u7318\u7319\u731a\u731b\u731c\u731d\u731e\u731f\u7320\u7321\u7322\u7323\u7324\u7325\u7326\u7327\u7328\u7329\u732a\u732b\u732c\u732d\u732e\u732f\u7330\u7331\u7332\u7333\u7334\u7335\u7336\u7337\u7338\u7339\u733a\u733b\u733c\u733d\u733e\u733f\u7340\u7341\u7342\u7343\u7344\u7345\u7346\u7347\u7348\u7349\u734a\u734b\u734c\u734d\u734e\u734f\u7350\u7351\u7352\u7353\u7354\u7355\u7356\u7357\u7358\u7359\u735a\u735b\u735c\u735d\u735e\u735f\u7360\u7361\u7362\u7363\u7364\u7365\u7366\u7367\u7368\u7369\u736a\u736b\u736c\u736d\u736e\u736f\u7370\u7371\u7372\u7373\u7374\u7375\u7376\u7377\u7378\u7379\u737a\u737b\u737c\u737d\u737e\u737f\u7380\u7381\u7382\u7383\u7384\u7385\u7386\u7387\u7388\u7389\u738a\u738b\u738c\u738d\u738e\u738f\u7390\u7391\u7392\u7393\u7394\u7395\u7396\u7397\u7398\u7399\u739a\u739b\u739c\u739d\u739e\u739f\u73a0\u73a1\u73a2\u73a3\u73a4\u73a5\u73a6\u73a7\u73a8\u73a9\u73aa\u73ab\u73ac\u73ad\u73ae\u73af\u73b0\u73b1\u73b2\u73b3\u73b4\u73b5\u73b6\u73b7\u73b8\u73b9\u73ba\u73bb\u73bc\u73bd\u73be\u73bf\u73c0\u73c1\u73c2\u73c3\u73c4\u73c5\u73c6\u73c7\u73c8\u73c9\u73ca\u73cb\u73cc\u73cd\u73ce\u73cf\u73d0\u73d1\u73d2\u73d3\u73d4\u73d5\u73d6\u73d7\u73d8\u73d9\u73da\u73db\u73dc\u73dd\u73de\u73df\u73e0\u73e1\u73e2\u73e3\u73e4\u73e5\u73e6\u73e7\u73e8\u73e9\u73ea\u73eb\u73ec\u73ed\u73ee\u73ef\u73f0\u73f1\u73f2\u73f3\u73f4\u73f5\u73f6\u73f7\u73f8\u73f9\u73fa\u73fb\u73fc\u73fd\u73fe\u73ff\u7400\u7401\u7402\u7403\u7404\u7405\u7406\u7407\u7408\u7409\u740a\u740b\u740c\u740d\u740e\u740f\u7410\u7411\u7412\u7413\u7414\u7415\u7416\u7417\u7418\u7419\u741a\u741b\u741c\u741d\u741e\u741f\u7420\u7421\u7422\u7423\u7424\u7425\u7426\u7427\u7428\u7429\u742a\u742b\u742c\u742d\u742e\u742f\u7430\u7431\u7432\u7433\u7434\u7435\u7436\u7437\u7438\u7439\u743a\u743b\u743c\u743d\u743e\u743f\u7440\u7441\u7442\u7443\u7444\u7445\u7446\u7447\u7448\u7449\u744a\u744b\u744c\u744d\u744e\u744f\u7450\u7451\u7452\u7453\u7454\u7455\u7456\u7457\u7458\u7459\u745a\u745b\u745c\u745d\u745e\u745f\u7460\u7461\u7462\u7463\u7464\u7465\u7466\u7467\u7468\u7469\u746a\u746b\u746c\u746d\u746e\u746f\u7470\u7471\u7472\u7473\u7474\u7475\u7476\u7477\u7478\u7479\u747a\u747b\u747c\u747d\u747e\u747f\u7480\u7481\u7482\u7483\u7484\u7485\u7486\u7487\u7488\u7489\u748a\u748b\u748c\u748d\u748e\u748f\u7490\u7491\u7492\u7493\u7494\u7495\u7496\u7497\u7498\u7499\u749a\u749b\u749c\u749d\u749e\u749f\u74a0\u74a1\u74a2\u74a3\u74a4\u74a5\u74a6\u74a7\u74a8\u74a9\u74aa\u74ab\u74ac\u74ad\u74ae\u74af\u74b0\u74b1\u74b2\u74b3\u74b4\u74b5\u74b6\u74b7\u74b8\u74b9\u74ba\u74bb\u74bc\u74bd\u74be\u74bf\u74c0\u74c1\u74c2\u74c3\u74c4\u74c5\u74c6\u74c7\u74c8\u74c9\u74ca\u74cb\u74cc\u74cd\u74ce\u74cf\u74d0\u74d1\u74d2\u74d3\u74d4\u74d5\u74d6\u74d7\u74d8\u74d9\u74da\u74db\u74dc\u74dd\u74de\u74df\u74e0\u74e1\u74e2\u74e3\u74e4\u74e5\u74e6\u74e7\u74e8\u74e9\u74ea\u74eb\u74ec\u74ed\u74ee\u74ef\u74f0\u74f1\u74f2\u74f3\u74f4\u74f5\u74f6\u74f7\u74f8\u74f9\u74fa\u74fb\u74fc\u74fd\u74fe\u74ff\u7500\u7501\u7502\u7503\u7504\u7505\u7506\u7507\u7508\u7509\u750a\u750b\u750c\u750d\u750e\u750f\u7510\u7511\u7512\u7513\u7514\u7515\u7516\u7517\u7518\u7519\u751a\u751b\u751c\u751d\u751e\u751f\u7520\u7521\u7522\u7523\u7524\u7525\u7526\u7527\u7528\u7529\u752a\u752b\u752c\u752d\u752e\u752f\u7530\u7531\u7532\u7533\u7534\u7535\u7536\u7537\u7538\u7539\u753a\u753b\u753c\u753d\u753e\u753f\u7540\u7541\u7542\u7543\u7544\u7545\u7546\u7547\u7548\u7549\u754a\u754b\u754c\u754d\u754e\u754f\u7550\u7551\u7552\u7553\u7554\u7555\u7556\u7557\u7558\u7559\u755a\u755b\u755c\u755d\u755e\u755f\u7560\u7561\u7562\u7563\u7564\u7565\u7566\u7567\u7568\u7569\u756a\u756b\u756c\u756d\u756e\u756f\u7570\u7571\u7572\u7573\u7574\u7575\u7576\u7577\u7578\u7579\u757a\u757b\u757c\u757d\u757e\u757f\u7580\u7581\u7582\u7583\u7584\u7585\u7586\u7587\u7588\u7589\u758a\u758b\u758c\u758d\u758e\u758f\u7590\u7591\u7592\u7593\u7594\u7595\u7596\u7597\u7598\u7599\u759a\u759b\u759c\u759d\u759e\u759f\u75a0\u75a1\u75a2\u75a3\u75a4\u75a5\u75a6\u75a7\u75a8\u75a9\u75aa\u75ab\u75ac\u75ad\u75ae\u75af\u75b0\u75b1\u75b2\u75b3\u75b4\u75b5\u75b6\u75b7\u75b8\u75b9\u75ba\u75bb\u75bc\u75bd\u75be\u75bf\u75c0\u75c1\u75c2\u75c3\u75c4\u75c5\u75c6\u75c7\u75c8\u75c9\u75ca\u75cb\u75cc\u75cd\u75ce\u75cf\u75d0\u75d1\u75d2\u75d3\u75d4\u75d5\u75d6\u75d7\u75d8\u75d9\u75da\u75db\u75dc\u75dd\u75de\u75df\u75e0\u75e1\u75e2\u75e3\u75e4\u75e5\u75e6\u75e7\u75e8\u75e9\u75ea\u75eb\u75ec\u75ed\u75ee\u75ef\u75f0\u75f1\u75f2\u75f3\u75f4\u75f5\u75f6\u75f7\u75f8\u75f9\u75fa\u75fb\u75fc\u75fd\u75fe\u75ff\u7600\u7601\u7602\u7603\u7604\u7605\u7606\u7607\u7608\u7609\u760a\u760b\u760c\u760d\u760e\u760f\u7610\u7611\u7612\u7613\u7614\u7615\u7616\u7617\u7618\u7619\u761a\u761b\u761c\u761d\u761e\u761f\u7620\u7621\u7622\u7623\u7624\u7625\u7626\u7627\u7628\u7629\u762a\u762b\u762c\u762d\u762e\u762f\u7630\u7631\u7632\u7633\u7634\u7635\u7636\u7637\u7638\u7639\u763a\u763b\u763c\u763d\u763e\u763f\u7640\u7641\u7642\u7643\u7644\u7645\u7646\u7647\u7648\u7649\u764a\u764b\u764c\u764d\u764e\u764f\u7650\u7651\u7652\u7653\u7654\u7655\u7656\u7657\u7658\u7659\u765a\u765b\u765c\u765d\u765e\u765f\u7660\u7661\u7662\u7663\u7664\u7665\u7666\u7667\u7668\u7669\u766a\u766b\u766c\u766d\u766e\u766f\u7670\u7671\u7672\u7673\u7674\u7675\u7676\u7677\u7678\u7679\u767a\u767b\u767c\u767d\u767e\u767f\u7680\u7681\u7682\u7683\u7684\u7685\u7686\u7687\u7688\u7689\u768a\u768b\u768c\u768d\u768e\u768f\u7690\u7691\u7692\u7693\u7694\u7695\u7696\u7697\u7698\u7699\u769a\u769b\u769c\u769d\u769e\u769f\u76a0\u76a1\u76a2\u76a3\u76a4\u76a5\u76a6\u76a7\u76a8\u76a9\u76aa\u76ab\u76ac\u76ad\u76ae\u76af\u76b0\u76b1\u76b2\u76b3\u76b4\u76b5\u76b6\u76b7\u76b8\u76b9\u76ba\u76bb\u76bc\u76bd\u76be\u76bf\u76c0\u76c1\u76c2\u76c3\u76c4\u76c5\u76c6\u76c7\u76c8\u76c9\u76ca\u76cb\u76cc\u76cd\u76ce\u76cf\u76d0\u76d1\u76d2\u76d3\u76d4\u76d5\u76d6\u76d7\u76d8\u76d9\u76da\u76db\u76dc\u76dd\u76de\u76df\u76e0\u76e1\u76e2\u76e3\u76e4\u76e5\u76e6\u76e7\u76e8\u76e9\u76ea\u76eb\u76ec\u76ed\u76ee\u76ef\u76f0\u76f1\u76f2\u76f3\u76f4\u76f5\u76f6\u76f7\u76f8\u76f9\u76fa\u76fb\u76fc\u76fd\u76fe\u76ff\u7700\u7701\u7702\u7703\u7704\u7705\u7706\u7707\u7708\u7709\u770a\u770b\u770c\u770d\u770e\u770f\u7710\u7711\u7712\u7713\u7714\u7715\u7716\u7717\u7718\u7719\u771a\u771b\u771c\u771d\u771e\u771f\u7720\u7721\u7722\u7723\u7724\u7725\u7726\u7727\u7728\u7729\u772a\u772b\u772c\u772d\u772e\u772f\u7730\u7731\u7732\u7733\u7734\u7735\u7736\u7737\u7738\u7739\u773a\u773b\u773c\u773d\u773e\u773f\u7740\u7741\u7742\u7743\u7744\u7745\u7746\u7747\u7748\u7749\u774a\u774b\u774c\u774d\u774e\u774f\u7750\u7751\u7752\u7753\u7754\u7755\u7756\u7757\u7758\u7759\u775a\u775b\u775c\u775d\u775e\u775f\u7760\u7761\u7762\u7763\u7764\u7765\u7766\u7767\u7768\u7769\u776a\u776b\u776c\u776d\u776e\u776f\u7770\u7771\u7772\u7773\u7774\u7775\u7776\u7777\u7778\u7779\u777a\u777b\u777c\u777d\u777e\u777f\u7780\u7781\u7782\u7783\u7784\u7785\u7786\u7787\u7788\u7789\u778a\u778b\u778c\u778d\u778e\u778f\u7790\u7791\u7792\u7793\u7794\u7795\u7796\u7797\u7798\u7799\u779a\u779b\u779c\u779d\u779e\u779f\u77a0\u77a1\u77a2\u77a3\u77a4\u77a5\u77a6\u77a7\u77a8\u77a9\u77aa\u77ab\u77ac\u77ad\u77ae\u77af\u77b0\u77b1\u77b2\u77b3\u77b4\u77b5\u77b6\u77b7\u77b8\u77b9\u77ba\u77bb\u77bc\u77bd\u77be\u77bf\u77c0\u77c1\u77c2\u77c3\u77c4\u77c5\u77c6\u77c7\u77c8\u77c9\u77ca\u77cb\u77cc\u77cd\u77ce\u77cf\u77d0\u77d1\u77d2\u77d3\u77d4\u77d5\u77d6\u77d7\u77d8\u77d9\u77da\u77db\u77dc\u77dd\u77de\u77df\u77e0\u77e1\u77e2\u77e3\u77e4\u77e5\u77e6\u77e7\u77e8\u77e9\u77ea\u77eb\u77ec\u77ed\u77ee\u77ef\u77f0\u77f1\u77f2\u77f3\u77f4\u77f5\u77f6\u77f7\u77f8\u77f9\u77fa\u77fb\u77fc\u77fd\u77fe\u77ff\u7800\u7801\u7802\u7803\u7804\u7805\u7806\u7807\u7808\u7809\u780a\u780b\u780c\u780d\u780e\u780f\u7810\u7811\u7812\u7813\u7814\u7815\u7816\u7817\u7818\u7819\u781a\u781b\u781c\u781d\u781e\u781f\u7820\u7821\u7822\u7823\u7824\u7825\u7826\u7827\u7828\u7829\u782a\u782b\u782c\u782d\u782e\u782f\u7830\u7831\u7832\u7833\u7834\u7835\u7836\u7837\u7838\u7839\u783a\u783b\u783c\u783d\u783e\u783f\u7840\u7841\u7842\u7843\u7844\u7845\u7846\u7847\u7848\u7849\u784a\u784b\u784c\u784d\u784e\u784f\u7850\u7851\u7852\u7853\u7854\u7855\u7856\u7857\u7858\u7859\u785a\u785b\u785c\u785d\u785e\u785f\u7860\u7861\u7862\u7863\u7864\u7865\u7866\u7867\u7868\u7869\u786a\u786b\u786c\u786d\u786e\u786f\u7870\u7871\u7872\u7873\u7874\u7875\u7876\u7877\u7878\u7879\u787a\u787b\u787c\u787d\u787e\u787f\u7880\u7881\u7882\u7883\u7884\u7885\u7886\u7887\u7888\u7889\u788a\u788b\u788c\u788d\u788e\u788f\u7890\u7891\u7892\u7893\u7894\u7895\u7896\u7897\u7898\u7899\u789a\u789b\u789c\u789d\u789e\u789f\u78a0\u78a1\u78a2\u78a3\u78a4\u78a5\u78a6\u78a7\u78a8\u78a9\u78aa\u78ab\u78ac\u78ad\u78ae\u78af\u78b0\u78b1\u78b2\u78b3\u78b4\u78b5\u78b6\u78b7\u78b8\u78b9\u78ba\u78bb\u78bc\u78bd\u78be\u78bf\u78c0\u78c1\u78c2\u78c3\u78c4\u78c5\u78c6\u78c7\u78c8\u78c9\u78ca\u78cb\u78cc\u78cd\u78ce\u78cf\u78d0\u78d1\u78d2\u78d3\u78d4\u78d5\u78d6\u78d7\u78d8\u78d9\u78da\u78db\u78dc\u78dd\u78de\u78df\u78e0\u78e1\u78e2\u78e3\u78e4\u78e5\u78e6\u78e7\u78e8\u78e9\u78ea\u78eb\u78ec\u78ed\u78ee\u78ef\u78f0\u78f1\u78f2\u78f3\u78f4\u78f5\u78f6\u78f7\u78f8\u78f9\u78fa\u78fb\u78fc\u78fd\u78fe\u78ff\u7900\u7901\u7902\u7903\u7904\u7905\u7906\u7907\u7908\u7909\u790a\u790b\u790c\u790d\u790e\u790f\u7910\u7911\u7912\u7913\u7914\u7915\u7916\u7917\u7918\u7919\u791a\u791b\u791c\u791d\u791e\u791f\u7920\u7921\u7922\u7923\u7924\u7925\u7926\u7927\u7928\u7929\u792a\u792b\u792c\u792d\u792e\u792f\u7930\u7931\u7932\u7933\u7934\u7935\u7936\u7937\u7938\u7939\u793a\u793b\u793c\u793d\u793e\u793f\u7940\u7941\u7942\u7943\u7944\u7945\u7946\u7947\u7948\u7949\u794a\u794b\u794c\u794d\u794e\u794f\u7950\u7951\u7952\u7953\u7954\u7955\u7956\u7957\u7958\u7959\u795a\u795b\u795c\u795d\u795e\u795f\u7960\u7961\u7962\u7963\u7964\u7965\u7966\u7967\u7968\u7969\u796a\u796b\u796c\u796d\u796e\u796f\u7970\u7971\u7972\u7973\u7974\u7975\u7976\u7977\u7978\u7979\u797a\u797b\u797c\u797d\u797e\u797f\u7980\u7981\u7982\u7983\u7984\u7985\u7986\u7987\u7988\u7989\u798a\u798b\u798c\u798d\u798e\u798f\u7990\u7991\u7992\u7993\u7994\u7995\u7996\u7997\u7998\u7999\u799a\u799b\u799c\u799d\u799e\u799f\u79a0\u79a1\u79a2\u79a3\u79a4\u79a5\u79a6\u79a7\u79a8\u79a9\u79aa\u79ab\u79ac\u79ad\u79ae\u79af\u79b0\u79b1\u79b2\u79b3\u79b4\u79b5\u79b6\u79b7\u79b8\u79b9\u79ba\u79bb\u79bc\u79bd\u79be\u79bf\u79c0\u79c1\u79c2\u79c3\u79c4\u79c5\u79c6\u79c7\u79c8\u79c9\u79ca\u79cb\u79cc\u79cd\u79ce\u79cf\u79d0\u79d1\u79d2\u79d3\u79d4\u79d5\u79d6\u79d7\u79d8\u79d9\u79da\u79db\u79dc\u79dd\u79de\u79df\u79e0\u79e1\u79e2\u79e3\u79e4\u79e5\u79e6\u79e7\u79e8\u79e9\u79ea\u79eb\u79ec\u79ed\u79ee\u79ef\u79f0\u79f1\u79f2\u79f3\u79f4\u79f5\u79f6\u79f7\u79f8\u79f9\u79fa\u79fb\u79fc\u79fd\u79fe\u79ff\u7a00\u7a01\u7a02\u7a03\u7a04\u7a05\u7a06\u7a07\u7a08\u7a09\u7a0a\u7a0b\u7a0c\u7a0d\u7a0e\u7a0f\u7a10\u7a11\u7a12\u7a13\u7a14\u7a15\u7a16\u7a17\u7a18\u7a19\u7a1a\u7a1b\u7a1c\u7a1d\u7a1e\u7a1f\u7a20\u7a21\u7a22\u7a23\u7a24\u7a25\u7a26\u7a27\u7a28\u7a29\u7a2a\u7a2b\u7a2c\u7a2d\u7a2e\u7a2f\u7a30\u7a31\u7a32\u7a33\u7a34\u7a35\u7a36\u7a37\u7a38\u7a39\u7a3a\u7a3b\u7a3c\u7a3d\u7a3e\u7a3f\u7a40\u7a41\u7a42\u7a43\u7a44\u7a45\u7a46\u7a47\u7a48\u7a49\u7a4a\u7a4b\u7a4c\u7a4d\u7a4e\u7a4f\u7a50\u7a51\u7a52\u7a53\u7a54\u7a55\u7a56\u7a57\u7a58\u7a59\u7a5a\u7a5b\u7a5c\u7a5d\u7a5e\u7a5f\u7a60\u7a61\u7a62\u7a63\u7a64\u7a65\u7a66\u7a67\u7a68\u7a69\u7a6a\u7a6b\u7a6c\u7a6d\u7a6e\u7a6f\u7a70\u7a71\u7a72\u7a73\u7a74\u7a75\u7a76\u7a77\u7a78\u7a79\u7a7a\u7a7b\u7a7c\u7a7d\u7a7e\u7a7f\u7a80\u7a81\u7a82\u7a83\u7a84\u7a85\u7a86\u7a87\u7a88\u7a89\u7a8a\u7a8b\u7a8c\u7a8d\u7a8e\u7a8f\u7a90\u7a91\u7a92\u7a93\u7a94\u7a95\u7a96\u7a97\u7a98\u7a99\u7a9a\u7a9b\u7a9c\u7a9d\u7a9e\u7a9f\u7aa0\u7aa1\u7aa2\u7aa3\u7aa4\u7aa5\u7aa6\u7aa7\u7aa8\u7aa9\u7aaa\u7aab\u7aac\u7aad\u7aae\u7aaf\u7ab0\u7ab1\u7ab2\u7ab3\u7ab4\u7ab5\u7ab6\u7ab7\u7ab8\u7ab9\u7aba\u7abb\u7abc\u7abd\u7abe\u7abf\u7ac0\u7ac1\u7ac2\u7ac3\u7ac4\u7ac5\u7ac6\u7ac7\u7ac8\u7ac9\u7aca\u7acb\u7acc\u7acd\u7ace\u7acf\u7ad0\u7ad1\u7ad2\u7ad3\u7ad4\u7ad5\u7ad6\u7ad7\u7ad8\u7ad9\u7ada\u7adb\u7adc\u7add\u7ade\u7adf\u7ae0\u7ae1\u7ae2\u7ae3\u7ae4\u7ae5\u7ae6\u7ae7\u7ae8\u7ae9\u7aea\u7aeb\u7aec\u7aed\u7aee\u7aef\u7af0\u7af1\u7af2\u7af3\u7af4\u7af5\u7af6\u7af7\u7af8\u7af9\u7afa\u7afb\u7afc\u7afd\u7afe\u7aff\u7b00\u7b01\u7b02\u7b03\u7b04\u7b05\u7b06\u7b07\u7b08\u7b09\u7b0a\u7b0b\u7b0c\u7b0d\u7b0e\u7b0f\u7b10\u7b11\u7b12\u7b13\u7b14\u7b15\u7b16\u7b17\u7b18\u7b19\u7b1a\u7b1b\u7b1c\u7b1d\u7b1e\u7b1f\u7b20\u7b21\u7b22\u7b23\u7b24\u7b25\u7b26\u7b27\u7b28\u7b29\u7b2a\u7b2b\u7b2c\u7b2d\u7b2e\u7b2f\u7b30\u7b31\u7b32\u7b33\u7b34\u7b35\u7b36\u7b37\u7b38\u7b39\u7b3a\u7b3b\u7b3c\u7b3d\u7b3e\u7b3f\u7b40\u7b41\u7b42\u7b43\u7b44\u7b45\u7b46\u7b47\u7b48\u7b49\u7b4a\u7b4b\u7b4c\u7b4d\u7b4e\u7b4f\u7b50\u7b51\u7b52\u7b53\u7b54\u7b55\u7b56\u7b57\u7b58\u7b59\u7b5a\u7b5b\u7b5c\u7b5d\u7b5e\u7b5f\u7b60\u7b61\u7b62\u7b63\u7b64\u7b65\u7b66\u7b67\u7b68\u7b69\u7b6a\u7b6b\u7b6c\u7b6d\u7b6e\u7b6f\u7b70\u7b71\u7b72\u7b73\u7b74\u7b75\u7b76\u7b77\u7b78\u7b79\u7b7a\u7b7b\u7b7c\u7b7d\u7b7e\u7b7f\u7b80\u7b81\u7b82\u7b83\u7b84\u7b85\u7b86\u7b87\u7b88\u7b89\u7b8a\u7b8b\u7b8c\u7b8d\u7b8e\u7b8f\u7b90\u7b91\u7b92\u7b93\u7b94\u7b95\u7b96\u7b97\u7b98\u7b99\u7b9a\u7b9b\u7b9c\u7b9d\u7b9e\u7b9f\u7ba0\u7ba1\u7ba2\u7ba3\u7ba4\u7ba5\u7ba6\u7ba7\u7ba8\u7ba9\u7baa\u7bab\u7bac\u7bad\u7bae\u7baf\u7bb0\u7bb1\u7bb2\u7bb3\u7bb4\u7bb5\u7bb6\u7bb7\u7bb8\u7bb9\u7bba\u7bbb\u7bbc\u7bbd\u7bbe\u7bbf\u7bc0\u7bc1\u7bc2\u7bc3\u7bc4\u7bc5\u7bc6\u7bc7\u7bc8\u7bc9\u7bca\u7bcb\u7bcc\u7bcd\u7bce\u7bcf\u7bd0\u7bd1\u7bd2\u7bd3\u7bd4\u7bd5\u7bd6\u7bd7\u7bd8\u7bd9\u7bda\u7bdb\u7bdc\u7bdd\u7bde\u7bdf\u7be0\u7be1\u7be2\u7be3\u7be4\u7be5\u7be6\u7be7\u7be8\u7be9\u7bea\u7beb\u7bec\u7bed\u7bee\u7bef\u7bf0\u7bf1\u7bf2\u7bf3\u7bf4\u7bf5\u7bf6\u7bf7\u7bf8\u7bf9\u7bfa\u7bfb\u7bfc\u7bfd\u7bfe\u7bff\u7c00\u7c01\u7c02\u7c03\u7c04\u7c05\u7c06\u7c07\u7c08\u7c09\u7c0a\u7c0b\u7c0c\u7c0d\u7c0e\u7c0f\u7c10\u7c11\u7c12\u7c13\u7c14\u7c15\u7c16\u7c17\u7c18\u7c19\u7c1a\u7c1b\u7c1c\u7c1d\u7c1e\u7c1f\u7c20\u7c21\u7c22\u7c23\u7c24\u7c25\u7c26\u7c27\u7c28\u7c29\u7c2a\u7c2b\u7c2c\u7c2d\u7c2e\u7c2f\u7c30\u7c31\u7c32\u7c33\u7c34\u7c35\u7c36\u7c37\u7c38\u7c39\u7c3a\u7c3b\u7c3c\u7c3d\u7c3e\u7c3f\u7c40\u7c41\u7c42\u7c43\u7c44\u7c45\u7c46\u7c47\u7c48\u7c49\u7c4a\u7c4b\u7c4c\u7c4d\u7c4e\u7c4f\u7c50\u7c51\u7c52\u7c53\u7c54\u7c55\u7c56\u7c57\u7c58\u7c59\u7c5a\u7c5b\u7c5c\u7c5d\u7c5e\u7c5f\u7c60\u7c61\u7c62\u7c63\u7c64\u7c65\u7c66\u7c67\u7c68\u7c69\u7c6a\u7c6b\u7c6c\u7c6d\u7c6e\u7c6f\u7c70\u7c71\u7c72\u7c73\u7c74\u7c75\u7c76\u7c77\u7c78\u7c79\u7c7a\u7c7b\u7c7c\u7c7d\u7c7e\u7c7f\u7c80\u7c81\u7c82\u7c83\u7c84\u7c85\u7c86\u7c87\u7c88\u7c89\u7c8a\u7c8b\u7c8c\u7c8d\u7c8e\u7c8f\u7c90\u7c91\u7c92\u7c93\u7c94\u7c95\u7c96\u7c97\u7c98\u7c99\u7c9a\u7c9b\u7c9c\u7c9d\u7c9e\u7c9f\u7ca0\u7ca1\u7ca2\u7ca3\u7ca4\u7ca5\u7ca6\u7ca7\u7ca8\u7ca9\u7caa\u7cab\u7cac\u7cad\u7cae\u7caf\u7cb0\u7cb1\u7cb2\u7cb3\u7cb4\u7cb5\u7cb6\u7cb7\u7cb8\u7cb9\u7cba\u7cbb\u7cbc\u7cbd\u7cbe\u7cbf\u7cc0\u7cc1\u7cc2\u7cc3\u7cc4\u7cc5\u7cc6\u7cc7\u7cc8\u7cc9\u7cca\u7ccb\u7ccc\u7ccd\u7cce\u7ccf\u7cd0\u7cd1\u7cd2\u7cd3\u7cd4\u7cd5\u7cd6\u7cd7\u7cd8\u7cd9\u7cda\u7cdb\u7cdc\u7cdd\u7cde\u7cdf\u7ce0\u7ce1\u7ce2\u7ce3\u7ce4\u7ce5\u7ce6\u7ce7\u7ce8\u7ce9\u7cea\u7ceb\u7cec\u7ced\u7cee\u7cef\u7cf0\u7cf1\u7cf2\u7cf3\u7cf4\u7cf5\u7cf6\u7cf7\u7cf8\u7cf9\u7cfa\u7cfb\u7cfc\u7cfd\u7cfe\u7cff\u7d00\u7d01\u7d02\u7d03\u7d04\u7d05\u7d06\u7d07\u7d08\u7d09\u7d0a\u7d0b\u7d0c\u7d0d\u7d0e\u7d0f\u7d10\u7d11\u7d12\u7d13\u7d14\u7d15\u7d16\u7d17\u7d18\u7d19\u7d1a\u7d1b\u7d1c\u7d1d\u7d1e\u7d1f\u7d20\u7d21\u7d22\u7d23\u7d24\u7d25\u7d26\u7d27\u7d28\u7d29\u7d2a\u7d2b\u7d2c\u7d2d\u7d2e\u7d2f\u7d30\u7d31\u7d32\u7d33\u7d34\u7d35\u7d36\u7d37\u7d38\u7d39\u7d3a\u7d3b\u7d3c\u7d3d\u7d3e\u7d3f\u7d40\u7d41\u7d42\u7d43\u7d44\u7d45\u7d46\u7d47\u7d48\u7d49\u7d4a\u7d4b\u7d4c\u7d4d\u7d4e\u7d4f\u7d50\u7d51\u7d52\u7d53\u7d54\u7d55\u7d56\u7d57\u7d58\u7d59\u7d5a\u7d5b\u7d5c\u7d5d\u7d5e\u7d5f\u7d60\u7d61\u7d62\u7d63\u7d64\u7d65\u7d66\u7d67\u7d68\u7d69\u7d6a\u7d6b\u7d6c\u7d6d\u7d6e\u7d6f\u7d70\u7d71\u7d72\u7d73\u7d74\u7d75\u7d76\u7d77\u7d78\u7d79\u7d7a\u7d7b\u7d7c\u7d7d\u7d7e\u7d7f\u7d80\u7d81\u7d82\u7d83\u7d84\u7d85\u7d86\u7d87\u7d88\u7d89\u7d8a\u7d8b\u7d8c\u7d8d\u7d8e\u7d8f\u7d90\u7d91\u7d92\u7d93\u7d94\u7d95\u7d96\u7d97\u7d98\u7d99\u7d9a\u7d9b\u7d9c\u7d9d\u7d9e\u7d9f\u7da0\u7da1\u7da2\u7da3\u7da4\u7da5\u7da6\u7da7\u7da8\u7da9\u7daa\u7dab\u7dac\u7dad\u7dae\u7daf\u7db0\u7db1\u7db2\u7db3\u7db4\u7db5\u7db6\u7db7\u7db8\u7db9\u7dba\u7dbb\u7dbc\u7dbd\u7dbe\u7dbf\u7dc0\u7dc1\u7dc2\u7dc3\u7dc4\u7dc5\u7dc6\u7dc7\u7dc8\u7dc9\u7dca\u7dcb\u7dcc\u7dcd\u7dce\u7dcf\u7dd0\u7dd1\u7dd2\u7dd3\u7dd4\u7dd5\u7dd6\u7dd7\u7dd8\u7dd9\u7dda\u7ddb\u7ddc\u7ddd\u7dde\u7ddf\u7de0\u7de1\u7de2\u7de3\u7de4\u7de5\u7de6\u7de7\u7de8\u7de9\u7dea\u7deb\u7dec\u7ded\u7dee\u7def\u7df0\u7df1\u7df2\u7df3\u7df4\u7df5\u7df6\u7df7\u7df8\u7df9\u7dfa\u7dfb\u7dfc\u7dfd\u7dfe\u7dff\u7e00\u7e01\u7e02\u7e03\u7e04\u7e05\u7e06\u7e07\u7e08\u7e09\u7e0a\u7e0b\u7e0c\u7e0d\u7e0e\u7e0f\u7e10\u7e11\u7e12\u7e13\u7e14\u7e15\u7e16\u7e17\u7e18\u7e19\u7e1a\u7e1b\u7e1c\u7e1d\u7e1e\u7e1f\u7e20\u7e21\u7e22\u7e23\u7e24\u7e25\u7e26\u7e27\u7e28\u7e29\u7e2a\u7e2b\u7e2c\u7e2d\u7e2e\u7e2f\u7e30\u7e31\u7e32\u7e33\u7e34\u7e35\u7e36\u7e37\u7e38\u7e39\u7e3a\u7e3b\u7e3c\u7e3d\u7e3e\u7e3f\u7e40\u7e41\u7e42\u7e43\u7e44\u7e45\u7e46\u7e47\u7e48\u7e49\u7e4a\u7e4b\u7e4c\u7e4d\u7e4e\u7e4f\u7e50\u7e51\u7e52\u7e53\u7e54\u7e55\u7e56\u7e57\u7e58\u7e59\u7e5a\u7e5b\u7e5c\u7e5d\u7e5e\u7e5f\u7e60\u7e61\u7e62\u7e63\u7e64\u7e65\u7e66\u7e67\u7e68\u7e69\u7e6a\u7e6b\u7e6c\u7e6d\u7e6e\u7e6f\u7e70\u7e71\u7e72\u7e73\u7e74\u7e75\u7e76\u7e77\u7e78\u7e79\u7e7a\u7e7b\u7e7c\u7e7d\u7e7e\u7e7f\u7e80\u7e81\u7e82\u7e83\u7e84\u7e85\u7e86\u7e87\u7e88\u7e89\u7e8a\u7e8b\u7e8c\u7e8d\u7e8e\u7e8f\u7e90\u7e91\u7e92\u7e93\u7e94\u7e95\u7e96\u7e97\u7e98\u7e99\u7e9a\u7e9b\u7e9c\u7e9d\u7e9e\u7e9f\u7ea0\u7ea1\u7ea2\u7ea3\u7ea4\u7ea5\u7ea6\u7ea7\u7ea8\u7ea9\u7eaa\u7eab\u7eac\u7ead\u7eae\u7eaf\u7eb0\u7eb1\u7eb2\u7eb3\u7eb4\u7eb5\u7eb6\u7eb7\u7eb8\u7eb9\u7eba\u7ebb\u7ebc\u7ebd\u7ebe\u7ebf\u7ec0\u7ec1\u7ec2\u7ec3\u7ec4\u7ec5\u7ec6\u7ec7\u7ec8\u7ec9\u7eca\u7ecb\u7ecc\u7ecd\u7ece\u7ecf\u7ed0\u7ed1\u7ed2\u7ed3\u7ed4\u7ed5\u7ed6\u7ed7\u7ed8\u7ed9\u7eda\u7edb\u7edc\u7edd\u7ede\u7edf\u7ee0\u7ee1\u7ee2\u7ee3\u7ee4\u7ee5\u7ee6\u7ee7\u7ee8\u7ee9\u7eea\u7eeb\u7eec\u7eed\u7eee\u7eef\u7ef0\u7ef1\u7ef2\u7ef3\u7ef4\u7ef5\u7ef6\u7ef7\u7ef8\u7ef9\u7efa\u7efb\u7efc\u7efd\u7efe\u7eff\u7f00\u7f01\u7f02\u7f03\u7f04\u7f05\u7f06\u7f07\u7f08\u7f09\u7f0a\u7f0b\u7f0c\u7f0d\u7f0e\u7f0f\u7f10\u7f11\u7f12\u7f13\u7f14\u7f15\u7f16\u7f17\u7f18\u7f19\u7f1a\u7f1b\u7f1c\u7f1d\u7f1e\u7f1f\u7f20\u7f21\u7f22\u7f23\u7f24\u7f25\u7f26\u7f27\u7f28\u7f29\u7f2a\u7f2b\u7f2c\u7f2d\u7f2e\u7f2f\u7f30\u7f31\u7f32\u7f33\u7f34\u7f35\u7f36\u7f37\u7f38\u7f39\u7f3a\u7f3b\u7f3c\u7f3d\u7f3e\u7f3f\u7f40\u7f41\u7f42\u7f43\u7f44\u7f45\u7f46\u7f47\u7f48\u7f49\u7f4a\u7f4b\u7f4c\u7f4d\u7f4e\u7f4f\u7f50\u7f51\u7f52\u7f53\u7f54\u7f55\u7f56\u7f57\u7f58\u7f59\u7f5a\u7f5b\u7f5c\u7f5d\u7f5e\u7f5f\u7f60\u7f61\u7f62\u7f63\u7f64\u7f65\u7f66\u7f67\u7f68\u7f69\u7f6a\u7f6b\u7f6c\u7f6d\u7f6e\u7f6f\u7f70\u7f71\u7f72\u7f73\u7f74\u7f75\u7f76\u7f77\u7f78\u7f79\u7f7a\u7f7b\u7f7c\u7f7d\u7f7e\u7f7f\u7f80\u7f81\u7f82\u7f83\u7f84\u7f85\u7f86\u7f87\u7f88\u7f89\u7f8a\u7f8b\u7f8c\u7f8d\u7f8e\u7f8f\u7f90\u7f91\u7f92\u7f93\u7f94\u7f95\u7f96\u7f97\u7f98\u7f99\u7f9a\u7f9b\u7f9c\u7f9d\u7f9e\u7f9f\u7fa0\u7fa1\u7fa2\u7fa3\u7fa4\u7fa5\u7fa6\u7fa7\u7fa8\u7fa9\u7faa\u7fab\u7fac\u7fad\u7fae\u7faf\u7fb0\u7fb1\u7fb2\u7fb3\u7fb4\u7fb5\u7fb6\u7fb7\u7fb8\u7fb9\u7fba\u7fbb\u7fbc\u7fbd\u7fbe\u7fbf\u7fc0\u7fc1\u7fc2\u7fc3\u7fc4\u7fc5\u7fc6\u7fc7\u7fc8\u7fc9\u7fca\u7fcb\u7fcc\u7fcd\u7fce\u7fcf\u7fd0\u7fd1\u7fd2\u7fd3\u7fd4\u7fd5\u7fd6\u7fd7\u7fd8\u7fd9\u7fda\u7fdb\u7fdc\u7fdd\u7fde\u7fdf\u7fe0\u7fe1\u7fe2\u7fe3\u7fe4\u7fe5\u7fe6\u7fe7\u7fe8\u7fe9\u7fea\u7feb\u7fec\u7fed\u7fee\u7fef\u7ff0\u7ff1\u7ff2\u7ff3\u7ff4\u7ff5\u7ff6\u7ff7\u7ff8\u7ff9\u7ffa\u7ffb\u7ffc\u7ffd\u7ffe\u7fff\u8000\u8001\u8002\u8003\u8004\u8005\u8006\u8007\u8008\u8009\u800a\u800b\u800c\u800d\u800e\u800f\u8010\u8011\u8012\u8013\u8014\u8015\u8016\u8017\u8018\u8019\u801a\u801b\u801c\u801d\u801e\u801f\u8020\u8021\u8022\u8023\u8024\u8025\u8026\u8027\u8028\u8029\u802a\u802b\u802c\u802d\u802e\u802f\u8030\u8031\u8032\u8033\u8034\u8035\u8036\u8037\u8038\u8039\u803a\u803b\u803c\u803d\u803e\u803f\u8040\u8041\u8042\u8043\u8044\u8045\u8046\u8047\u8048\u8049\u804a\u804b\u804c\u804d\u804e\u804f\u8050\u8051\u8052\u8053\u8054\u8055\u8056\u8057\u8058\u8059\u805a\u805b\u805c\u805d\u805e\u805f\u8060\u8061\u8062\u8063\u8064\u8065\u8066\u8067\u8068\u8069\u806a\u806b\u806c\u806d\u806e\u806f\u8070\u8071\u8072\u8073\u8074\u8075\u8076\u8077\u8078\u8079\u807a\u807b\u807c\u807d\u807e\u807f\u8080\u8081\u8082\u8083\u8084\u8085\u8086\u8087\u8088\u8089\u808a\u808b\u808c\u808d\u808e\u808f\u8090\u8091\u8092\u8093\u8094\u8095\u8096\u8097\u8098\u8099\u809a\u809b\u809c\u809d\u809e\u809f\u80a0\u80a1\u80a2\u80a3\u80a4\u80a5\u80a6\u80a7\u80a8\u80a9\u80aa\u80ab\u80ac\u80ad\u80ae\u80af\u80b0\u80b1\u80b2\u80b3\u80b4\u80b5\u80b6\u80b7\u80b8\u80b9\u80ba\u80bb\u80bc\u80bd\u80be\u80bf\u80c0\u80c1\u80c2\u80c3\u80c4\u80c5\u80c6\u80c7\u80c8\u80c9\u80ca\u80cb\u80cc\u80cd\u80ce\u80cf\u80d0\u80d1\u80d2\u80d3\u80d4\u80d5\u80d6\u80d7\u80d8\u80d9\u80da\u80db\u80dc\u80dd\u80de\u80df\u80e0\u80e1\u80e2\u80e3\u80e4\u80e5\u80e6\u80e7\u80e8\u80e9\u80ea\u80eb\u80ec\u80ed\u80ee\u80ef\u80f0\u80f1\u80f2\u80f3\u80f4\u80f5\u80f6\u80f7\u80f8\u80f9\u80fa\u80fb\u80fc\u80fd\u80fe\u80ff\u8100\u8101\u8102\u8103\u8104\u8105\u8106\u8107\u8108\u8109\u810a\u810b\u810c\u810d\u810e\u810f\u8110\u8111\u8112\u8113\u8114\u8115\u8116\u8117\u8118\u8119\u811a\u811b\u811c\u811d\u811e\u811f\u8120\u8121\u8122\u8123\u8124\u8125\u8126\u8127\u8128\u8129\u812a\u812b\u812c\u812d\u812e\u812f\u8130\u8131\u8132\u8133\u8134\u8135\u8136\u8137\u8138\u8139\u813a\u813b\u813c\u813d\u813e\u813f\u8140\u8141\u8142\u8143\u8144\u8145\u8146\u8147\u8148\u8149\u814a\u814b\u814c\u814d\u814e\u814f\u8150\u8151\u8152\u8153\u8154\u8155\u8156\u8157\u8158\u8159\u815a\u815b\u815c\u815d\u815e\u815f\u8160\u8161\u8162\u8163\u8164\u8165\u8166\u8167\u8168\u8169\u816a\u816b\u816c\u816d\u816e\u816f\u8170\u8171\u8172\u8173\u8174\u8175\u8176\u8177\u8178\u8179\u817a\u817b\u817c\u817d\u817e\u817f\u8180\u8181\u8182\u8183\u8184\u8185\u8186\u8187\u8188\u8189\u818a\u818b\u818c\u818d\u818e\u818f\u8190\u8191\u8192\u8193\u8194\u8195\u8196\u8197\u8198\u8199\u819a\u819b\u819c\u819d\u819e\u819f\u81a0\u81a1\u81a2\u81a3\u81a4\u81a5\u81a6\u81a7\u81a8\u81a9\u81aa\u81ab\u81ac\u81ad\u81ae\u81af\u81b0\u81b1\u81b2\u81b3\u81b4\u81b5\u81b6\u81b7\u81b8\u81b9\u81ba\u81bb\u81bc\u81bd\u81be\u81bf\u81c0\u81c1\u81c2\u81c3\u81c4\u81c5\u81c6\u81c7\u81c8\u81c9\u81ca\u81cb\u81cc\u81cd\u81ce\u81cf\u81d0\u81d1\u81d2\u81d3\u81d4\u81d5\u81d6\u81d7\u81d8\u81d9\u81da\u81db\u81dc\u81dd\u81de\u81df\u81e0\u81e1\u81e2\u81e3\u81e4\u81e5\u81e6\u81e7\u81e8\u81e9\u81ea\u81eb\u81ec\u81ed\u81ee\u81ef\u81f0\u81f1\u81f2\u81f3\u81f4\u81f5\u81f6\u81f7\u81f8\u81f9\u81fa\u81fb\u81fc\u81fd\u81fe\u81ff\u8200\u8201\u8202\u8203\u8204\u8205\u8206\u8207\u8208\u8209\u820a\u820b\u820c\u820d\u820e\u820f\u8210\u8211\u8212\u8213\u8214\u8215\u8216\u8217\u8218\u8219\u821a\u821b\u821c\u821d\u821e\u821f\u8220\u8221\u8222\u8223\u8224\u8225\u8226\u8227\u8228\u8229\u822a\u822b\u822c\u822d\u822e\u822f\u8230\u8231\u8232\u8233\u8234\u8235\u8236\u8237\u8238\u8239\u823a\u823b\u823c\u823d\u823e\u823f\u8240\u8241\u8242\u8243\u8244\u8245\u8246\u8247\u8248\u8249\u824a\u824b\u824c\u824d\u824e\u824f\u8250\u8251\u8252\u8253\u8254\u8255\u8256\u8257\u8258\u8259\u825a\u825b\u825c\u825d\u825e\u825f\u8260\u8261\u8262\u8263\u8264\u8265\u8266\u8267\u8268\u8269\u826a\u826b\u826c\u826d\u826e\u826f\u8270\u8271\u8272\u8273\u8274\u8275\u8276\u8277\u8278\u8279\u827a\u827b\u827c\u827d\u827e\u827f\u8280\u8281\u8282\u8283\u8284\u8285\u8286\u8287\u8288\u8289\u828a\u828b\u828c\u828d\u828e\u828f\u8290\u8291\u8292\u8293\u8294\u8295\u8296\u8297\u8298\u8299\u829a\u829b\u829c\u829d\u829e\u829f\u82a0\u82a1\u82a2\u82a3\u82a4\u82a5\u82a6\u82a7\u82a8\u82a9\u82aa\u82ab\u82ac\u82ad\u82ae\u82af\u82b0\u82b1\u82b2\u82b3\u82b4\u82b5\u82b6\u82b7\u82b8\u82b9\u82ba\u82bb\u82bc\u82bd\u82be\u82bf\u82c0\u82c1\u82c2\u82c3\u82c4\u82c5\u82c6\u82c7\u82c8\u82c9\u82ca\u82cb\u82cc\u82cd\u82ce\u82cf\u82d0\u82d1\u82d2\u82d3\u82d4\u82d5\u82d6\u82d7\u82d8\u82d9\u82da\u82db\u82dc\u82dd\u82de\u82df\u82e0\u82e1\u82e2\u82e3\u82e4\u82e5\u82e6\u82e7\u82e8\u82e9\u82ea\u82eb\u82ec\u82ed\u82ee\u82ef\u82f0\u82f1\u82f2\u82f3\u82f4\u82f5\u82f6\u82f7\u82f8\u82f9\u82fa\u82fb\u82fc\u82fd\u82fe\u82ff\u8300\u8301\u8302\u8303\u8304\u8305\u8306\u8307\u8308\u8309\u830a\u830b\u830c\u830d\u830e\u830f\u8310\u8311\u8312\u8313\u8314\u8315\u8316\u8317\u8318\u8319\u831a\u831b\u831c\u831d\u831e\u831f\u8320\u8321\u8322\u8323\u8324\u8325\u8326\u8327\u8328\u8329\u832a\u832b\u832c\u832d\u832e\u832f\u8330\u8331\u8332\u8333\u8334\u8335\u8336\u8337\u8338\u8339\u833a\u833b\u833c\u833d\u833e\u833f\u8340\u8341\u8342\u8343\u8344\u8345\u8346\u8347\u8348\u8349\u834a\u834b\u834c\u834d\u834e\u834f\u8350\u8351\u8352\u8353\u8354\u8355\u8356\u8357\u8358\u8359\u835a\u835b\u835c\u835d\u835e\u835f\u8360\u8361\u8362\u8363\u8364\u8365\u8366\u8367\u8368\u8369\u836a\u836b\u836c\u836d\u836e\u836f\u8370\u8371\u8372\u8373\u8374\u8375\u8376\u8377\u8378\u8379\u837a\u837b\u837c\u837d\u837e\u837f\u8380\u8381\u8382\u8383\u8384\u8385\u8386\u8387\u8388\u8389\u838a\u838b\u838c\u838d\u838e\u838f\u8390\u8391\u8392\u8393\u8394\u8395\u8396\u8397\u8398\u8399\u839a\u839b\u839c\u839d\u839e\u839f\u83a0\u83a1\u83a2\u83a3\u83a4\u83a5\u83a6\u83a7\u83a8\u83a9\u83aa\u83ab\u83ac\u83ad\u83ae\u83af\u83b0\u83b1\u83b2\u83b3\u83b4\u83b5\u83b6\u83b7\u83b8\u83b9\u83ba\u83bb\u83bc\u83bd\u83be\u83bf\u83c0\u83c1\u83c2\u83c3\u83c4\u83c5\u83c6\u83c7\u83c8\u83c9\u83ca\u83cb\u83cc\u83cd\u83ce\u83cf\u83d0\u83d1\u83d2\u83d3\u83d4\u83d5\u83d6\u83d7\u83d8\u83d9\u83da\u83db\u83dc\u83dd\u83de\u83df\u83e0\u83e1\u83e2\u83e3\u83e4\u83e5\u83e6\u83e7\u83e8\u83e9\u83ea\u83eb\u83ec\u83ed\u83ee\u83ef\u83f0\u83f1\u83f2\u83f3\u83f4\u83f5\u83f6\u83f7\u83f8\u83f9\u83fa\u83fb\u83fc\u83fd\u83fe\u83ff\u8400\u8401\u8402\u8403\u8404\u8405\u8406\u8407\u8408\u8409\u840a\u840b\u840c\u840d\u840e\u840f\u8410\u8411\u8412\u8413\u8414\u8415\u8416\u8417\u8418\u8419\u841a\u841b\u841c\u841d\u841e\u841f\u8420\u8421\u8422\u8423\u8424\u8425\u8426\u8427\u8428\u8429\u842a\u842b\u842c\u842d\u842e\u842f\u8430\u8431\u8432\u8433\u8434\u8435\u8436\u8437\u8438\u8439\u843a\u843b\u843c\u843d\u843e\u843f\u8440\u8441\u8442\u8443\u8444\u8445\u8446\u8447\u8448\u8449\u844a\u844b\u844c\u844d\u844e\u844f\u8450\u8451\u8452\u8453\u8454\u8455\u8456\u8457\u8458\u8459\u845a\u845b\u845c\u845d\u845e\u845f\u8460\u8461\u8462\u8463\u8464\u8465\u8466\u8467\u8468\u8469\u846a\u846b\u846c\u846d\u846e\u846f\u8470\u8471\u8472\u8473\u8474\u8475\u8476\u8477\u8478\u8479\u847a\u847b\u847c\u847d\u847e\u847f\u8480\u8481\u8482\u8483\u8484\u8485\u8486\u8487\u8488\u8489\u848a\u848b\u848c\u848d\u848e\u848f\u8490\u8491\u8492\u8493\u8494\u8495\u8496\u8497\u8498\u8499\u849a\u849b\u849c\u849d\u849e\u849f\u84a0\u84a1\u84a2\u84a3\u84a4\u84a5\u84a6\u84a7\u84a8\u84a9\u84aa\u84ab\u84ac\u84ad\u84ae\u84af\u84b0\u84b1\u84b2\u84b3\u84b4\u84b5\u84b6\u84b7\u84b8\u84b9\u84ba\u84bb\u84bc\u84bd\u84be\u84bf\u84c0\u84c1\u84c2\u84c3\u84c4\u84c5\u84c6\u84c7\u84c8\u84c9\u84ca\u84cb\u84cc\u84cd\u84ce\u84cf\u84d0\u84d1\u84d2\u84d3\u84d4\u84d5\u84d6\u84d7\u84d8\u84d9\u84da\u84db\u84dc\u84dd\u84de\u84df\u84e0\u84e1\u84e2\u84e3\u84e4\u84e5\u84e6\u84e7\u84e8\u84e9\u84ea\u84eb\u84ec\u84ed\u84ee\u84ef\u84f0\u84f1\u84f2\u84f3\u84f4\u84f5\u84f6\u84f7\u84f8\u84f9\u84fa\u84fb\u84fc\u84fd\u84fe\u84ff\u8500\u8501\u8502\u8503\u8504\u8505\u8506\u8507\u8508\u8509\u850a\u850b\u850c\u850d\u850e\u850f\u8510\u8511\u8512\u8513\u8514\u8515\u8516\u8517\u8518\u8519\u851a\u851b\u851c\u851d\u851e\u851f\u8520\u8521\u8522\u8523\u8524\u8525\u8526\u8527\u8528\u8529\u852a\u852b\u852c\u852d\u852e\u852f\u8530\u8531\u8532\u8533\u8534\u8535\u8536\u8537\u8538\u8539\u853a\u853b\u853c\u853d\u853e\u853f\u8540\u8541\u8542\u8543\u8544\u8545\u8546\u8547\u8548\u8549\u854a\u854b\u854c\u854d\u854e\u854f\u8550\u8551\u8552\u8553\u8554\u8555\u8556\u8557\u8558\u8559\u855a\u855b\u855c\u855d\u855e\u855f\u8560\u8561\u8562\u8563\u8564\u8565\u8566\u8567\u8568\u8569\u856a\u856b\u856c\u856d\u856e\u856f\u8570\u8571\u8572\u8573\u8574\u8575\u8576\u8577\u8578\u8579\u857a\u857b\u857c\u857d\u857e\u857f\u8580\u8581\u8582\u8583\u8584\u8585\u8586\u8587\u8588\u8589\u858a\u858b\u858c\u858d\u858e\u858f\u8590\u8591\u8592\u8593\u8594\u8595\u8596\u8597\u8598\u8599\u859a\u859b\u859c\u859d\u859e\u859f\u85a0\u85a1\u85a2\u85a3\u85a4\u85a5\u85a6\u85a7\u85a8\u85a9\u85aa\u85ab\u85ac\u85ad\u85ae\u85af\u85b0\u85b1\u85b2\u85b3\u85b4\u85b5\u85b6\u85b7\u85b8\u85b9\u85ba\u85bb\u85bc\u85bd\u85be\u85bf\u85c0\u85c1\u85c2\u85c3\u85c4\u85c5\u85c6\u85c7\u85c8\u85c9\u85ca\u85cb\u85cc\u85cd\u85ce\u85cf\u85d0\u85d1\u85d2\u85d3\u85d4\u85d5\u85d6\u85d7\u85d8\u85d9\u85da\u85db\u85dc\u85dd\u85de\u85df\u85e0\u85e1\u85e2\u85e3\u85e4\u85e5\u85e6\u85e7\u85e8\u85e9\u85ea\u85eb\u85ec\u85ed\u85ee\u85ef\u85f0\u85f1\u85f2\u85f3\u85f4\u85f5\u85f6\u85f7\u85f8\u85f9\u85fa\u85fb\u85fc\u85fd\u85fe\u85ff\u8600\u8601\u8602\u8603\u8604\u8605\u8606\u8607\u8608\u8609\u860a\u860b\u860c\u860d\u860e\u860f\u8610\u8611\u8612\u8613\u8614\u8615\u8616\u8617\u8618\u8619\u861a\u861b\u861c\u861d\u861e\u861f\u8620\u8621\u8622\u8623\u8624\u8625\u8626\u8627\u8628\u8629\u862a\u862b\u862c\u862d\u862e\u862f\u8630\u8631\u8632\u8633\u8634\u8635\u8636\u8637\u8638\u8639\u863a\u863b\u863c\u863d\u863e\u863f\u8640\u8641\u8642\u8643\u8644\u8645\u8646\u8647\u8648\u8649\u864a\u864b\u864c\u864d\u864e\u864f\u8650\u8651\u8652\u8653\u8654\u8655\u8656\u8657\u8658\u8659\u865a\u865b\u865c\u865d\u865e\u865f\u8660\u8661\u8662\u8663\u8664\u8665\u8666\u8667\u8668\u8669\u866a\u866b\u866c\u866d\u866e\u866f\u8670\u8671\u8672\u8673\u8674\u8675\u8676\u8677\u8678\u8679\u867a\u867b\u867c\u867d\u867e\u867f\u8680\u8681\u8682\u8683\u8684\u8685\u8686\u8687\u8688\u8689\u868a\u868b\u868c\u868d\u868e\u868f\u8690\u8691\u8692\u8693\u8694\u8695\u8696\u8697\u8698\u8699\u869a\u869b\u869c\u869d\u869e\u869f\u86a0\u86a1\u86a2\u86a3\u86a4\u86a5\u86a6\u86a7\u86a8\u86a9\u86aa\u86ab\u86ac\u86ad\u86ae\u86af\u86b0\u86b1\u86b2\u86b3\u86b4\u86b5\u86b6\u86b7\u86b8\u86b9\u86ba\u86bb\u86bc\u86bd\u86be\u86bf\u86c0\u86c1\u86c2\u86c3\u86c4\u86c5\u86c6\u86c7\u86c8\u86c9\u86ca\u86cb\u86cc\u86cd\u86ce\u86cf\u86d0\u86d1\u86d2\u86d3\u86d4\u86d5\u86d6\u86d7\u86d8\u86d9\u86da\u86db\u86dc\u86dd\u86de\u86df\u86e0\u86e1\u86e2\u86e3\u86e4\u86e5\u86e6\u86e7\u86e8\u86e9\u86ea\u86eb\u86ec\u86ed\u86ee\u86ef\u86f0\u86f1\u86f2\u86f3\u86f4\u86f5\u86f6\u86f7\u86f8\u86f9\u86fa\u86fb\u86fc\u86fd\u86fe\u86ff\u8700\u8701\u8702\u8703\u8704\u8705\u8706\u8707\u8708\u8709\u870a\u870b\u870c\u870d\u870e\u870f\u8710\u8711\u8712\u8713\u8714\u8715\u8716\u8717\u8718\u8719\u871a\u871b\u871c\u871d\u871e\u871f\u8720\u8721\u8722\u8723\u8724\u8725\u8726\u8727\u8728\u8729\u872a\u872b\u872c\u872d\u872e\u872f\u8730\u8731\u8732\u8733\u8734\u8735\u8736\u8737\u8738\u8739\u873a\u873b\u873c\u873d\u873e\u873f\u8740\u8741\u8742\u8743\u8744\u8745\u8746\u8747\u8748\u8749\u874a\u874b\u874c\u874d\u874e\u874f\u8750\u8751\u8752\u8753\u8754\u8755\u8756\u8757\u8758\u8759\u875a\u875b\u875c\u875d\u875e\u875f\u8760\u8761\u8762\u8763\u8764\u8765\u8766\u8767\u8768\u8769\u876a\u876b\u876c\u876d\u876e\u876f\u8770\u8771\u8772\u8773\u8774\u8775\u8776\u8777\u8778\u8779\u877a\u877b\u877c\u877d\u877e\u877f\u8780\u8781\u8782\u8783\u8784\u8785\u8786\u8787\u8788\u8789\u878a\u878b\u878c\u878d\u878e\u878f\u8790\u8791\u8792\u8793\u8794\u8795\u8796\u8797\u8798\u8799\u879a\u879b\u879c\u879d\u879e\u879f\u87a0\u87a1\u87a2\u87a3\u87a4\u87a5\u87a6\u87a7\u87a8\u87a9\u87aa\u87ab\u87ac\u87ad\u87ae\u87af\u87b0\u87b1\u87b2\u87b3\u87b4\u87b5\u87b6\u87b7\u87b8\u87b9\u87ba\u87bb\u87bc\u87bd\u87be\u87bf\u87c0\u87c1\u87c2\u87c3\u87c4\u87c5\u87c6\u87c7\u87c8\u87c9\u87ca\u87cb\u87cc\u87cd\u87ce\u87cf\u87d0\u87d1\u87d2\u87d3\u87d4\u87d5\u87d6\u87d7\u87d8\u87d9\u87da\u87db\u87dc\u87dd\u87de\u87df\u87e0\u87e1\u87e2\u87e3\u87e4\u87e5\u87e6\u87e7\u87e8\u87e9\u87ea\u87eb\u87ec\u87ed\u87ee\u87ef\u87f0\u87f1\u87f2\u87f3\u87f4\u87f5\u87f6\u87f7\u87f8\u87f9\u87fa\u87fb\u87fc\u87fd\u87fe\u87ff\u8800\u8801\u8802\u8803\u8804\u8805\u8806\u8807\u8808\u8809\u880a\u880b\u880c\u880d\u880e\u880f\u8810\u8811\u8812\u8813\u8814\u8815\u8816\u8817\u8818\u8819\u881a\u881b\u881c\u881d\u881e\u881f\u8820\u8821\u8822\u8823\u8824\u8825\u8826\u8827\u8828\u8829\u882a\u882b\u882c\u882d\u882e\u882f\u8830\u8831\u8832\u8833\u8834\u8835\u8836\u8837\u8838\u8839\u883a\u883b\u883c\u883d\u883e\u883f\u8840\u8841\u8842\u8843\u8844\u8845\u8846\u8847\u8848\u8849\u884a\u884b\u884c\u884d\u884e\u884f\u8850\u8851\u8852\u8853\u8854\u8855\u8856\u8857\u8858\u8859\u885a\u885b\u885c\u885d\u885e\u885f\u8860\u8861\u8862\u8863\u8864\u8865\u8866\u8867\u8868\u8869\u886a\u886b\u886c\u886d\u886e\u886f\u8870\u8871\u8872\u8873\u8874\u8875\u8876\u8877\u8878\u8879\u887a\u887b\u887c\u887d\u887e\u887f\u8880\u8881\u8882\u8883\u8884\u8885\u8886\u8887\u8888\u8889\u888a\u888b\u888c\u888d\u888e\u888f\u8890\u8891\u8892\u8893\u8894\u8895\u8896\u8897\u8898\u8899\u889a\u889b\u889c\u889d\u889e\u889f\u88a0\u88a1\u88a2\u88a3\u88a4\u88a5\u88a6\u88a7\u88a8\u88a9\u88aa\u88ab\u88ac\u88ad\u88ae\u88af\u88b0\u88b1\u88b2\u88b3\u88b4\u88b5\u88b6\u88b7\u88b8\u88b9\u88ba\u88bb\u88bc\u88bd\u88be\u88bf\u88c0\u88c1\u88c2\u88c3\u88c4\u88c5\u88c6\u88c7\u88c8\u88c9\u88ca\u88cb\u88cc\u88cd\u88ce\u88cf\u88d0\u88d1\u88d2\u88d3\u88d4\u88d5\u88d6\u88d7\u88d8\u88d9\u88da\u88db\u88dc\u88dd\u88de\u88df\u88e0\u88e1\u88e2\u88e3\u88e4\u88e5\u88e6\u88e7\u88e8\u88e9\u88ea\u88eb\u88ec\u88ed\u88ee\u88ef\u88f0\u88f1\u88f2\u88f3\u88f4\u88f5\u88f6\u88f7\u88f8\u88f9\u88fa\u88fb\u88fc\u88fd\u88fe\u88ff\u8900\u8901\u8902\u8903\u8904\u8905\u8906\u8907\u8908\u8909\u890a\u890b\u890c\u890d\u890e\u890f\u8910\u8911\u8912\u8913\u8914\u8915\u8916\u8917\u8918\u8919\u891a\u891b\u891c\u891d\u891e\u891f\u8920\u8921\u8922\u8923\u8924\u8925\u8926\u8927\u8928\u8929\u892a\u892b\u892c\u892d\u892e\u892f\u8930\u8931\u8932\u8933\u8934\u8935\u8936\u8937\u8938\u8939\u893a\u893b\u893c\u893d\u893e\u893f\u8940\u8941\u8942\u8943\u8944\u8945\u8946\u8947\u8948\u8949\u894a\u894b\u894c\u894d\u894e\u894f\u8950\u8951\u8952\u8953\u8954\u8955\u8956\u8957\u8958\u8959\u895a\u895b\u895c\u895d\u895e\u895f\u8960\u8961\u8962\u8963\u8964\u8965\u8966\u8967\u8968\u8969\u896a\u896b\u896c\u896d\u896e\u896f\u8970\u8971\u8972\u8973\u8974\u8975\u8976\u8977\u8978\u8979\u897a\u897b\u897c\u897d\u897e\u897f\u8980\u8981\u8982\u8983\u8984\u8985\u8986\u8987\u8988\u8989\u898a\u898b\u898c\u898d\u898e\u898f\u8990\u8991\u8992\u8993\u8994\u8995\u8996\u8997\u8998\u8999\u899a\u899b\u899c\u899d\u899e\u899f\u89a0\u89a1\u89a2\u89a3\u89a4\u89a5\u89a6\u89a7\u89a8\u89a9\u89aa\u89ab\u89ac\u89ad\u89ae\u89af\u89b0\u89b1\u89b2\u89b3\u89b4\u89b5\u89b6\u89b7\u89b8\u89b9\u89ba\u89bb\u89bc\u89bd\u89be\u89bf\u89c0\u89c1\u89c2\u89c3\u89c4\u89c5\u89c6\u89c7\u89c8\u89c9\u89ca\u89cb\u89cc\u89cd\u89ce\u89cf\u89d0\u89d1\u89d2\u89d3\u89d4\u89d5\u89d6\u89d7\u89d8\u89d9\u89da\u89db\u89dc\u89dd\u89de\u89df\u89e0\u89e1\u89e2\u89e3\u89e4\u89e5\u89e6\u89e7\u89e8\u89e9\u89ea\u89eb\u89ec\u89ed\u89ee\u89ef\u89f0\u89f1\u89f2\u89f3\u89f4\u89f5\u89f6\u89f7\u89f8\u89f9\u89fa\u89fb\u89fc\u89fd\u89fe\u89ff\u8a00\u8a01\u8a02\u8a03\u8a04\u8a05\u8a06\u8a07\u8a08\u8a09\u8a0a\u8a0b\u8a0c\u8a0d\u8a0e\u8a0f\u8a10\u8a11\u8a12\u8a13\u8a14\u8a15\u8a16\u8a17\u8a18\u8a19\u8a1a\u8a1b\u8a1c\u8a1d\u8a1e\u8a1f\u8a20\u8a21\u8a22\u8a23\u8a24\u8a25\u8a26\u8a27\u8a28\u8a29\u8a2a\u8a2b\u8a2c\u8a2d\u8a2e\u8a2f\u8a30\u8a31\u8a32\u8a33\u8a34\u8a35\u8a36\u8a37\u8a38\u8a39\u8a3a\u8a3b\u8a3c\u8a3d\u8a3e\u8a3f\u8a40\u8a41\u8a42\u8a43\u8a44\u8a45\u8a46\u8a47\u8a48\u8a49\u8a4a\u8a4b\u8a4c\u8a4d\u8a4e\u8a4f\u8a50\u8a51\u8a52\u8a53\u8a54\u8a55\u8a56\u8a57\u8a58\u8a59\u8a5a\u8a5b\u8a5c\u8a5d\u8a5e\u8a5f\u8a60\u8a61\u8a62\u8a63\u8a64\u8a65\u8a66\u8a67\u8a68\u8a69\u8a6a\u8a6b\u8a6c\u8a6d\u8a6e\u8a6f\u8a70\u8a71\u8a72\u8a73\u8a74\u8a75\u8a76\u8a77\u8a78\u8a79\u8a7a\u8a7b\u8a7c\u8a7d\u8a7e\u8a7f\u8a80\u8a81\u8a82\u8a83\u8a84\u8a85\u8a86\u8a87\u8a88\u8a89\u8a8a\u8a8b\u8a8c\u8a8d\u8a8e\u8a8f\u8a90\u8a91\u8a92\u8a93\u8a94\u8a95\u8a96\u8a97\u8a98\u8a99\u8a9a\u8a9b\u8a9c\u8a9d\u8a9e\u8a9f\u8aa0\u8aa1\u8aa2\u8aa3\u8aa4\u8aa5\u8aa6\u8aa7\u8aa8\u8aa9\u8aaa\u8aab\u8aac\u8aad\u8aae\u8aaf\u8ab0\u8ab1\u8ab2\u8ab3\u8ab4\u8ab5\u8ab6\u8ab7\u8ab8\u8ab9\u8aba\u8abb\u8abc\u8abd\u8abe\u8abf\u8ac0\u8ac1\u8ac2\u8ac3\u8ac4\u8ac5\u8ac6\u8ac7\u8ac8\u8ac9\u8aca\u8acb\u8acc\u8acd\u8ace\u8acf\u8ad0\u8ad1\u8ad2\u8ad3\u8ad4\u8ad5\u8ad6\u8ad7\u8ad8\u8ad9\u8ada\u8adb\u8adc\u8add\u8ade\u8adf\u8ae0\u8ae1\u8ae2\u8ae3\u8ae4\u8ae5\u8ae6\u8ae7\u8ae8\u8ae9\u8aea\u8aeb\u8aec\u8aed\u8aee\u8aef\u8af0\u8af1\u8af2\u8af3\u8af4\u8af5\u8af6\u8af7\u8af8\u8af9\u8afa\u8afb\u8afc\u8afd\u8afe\u8aff\u8b00\u8b01\u8b02\u8b03\u8b04\u8b05\u8b06\u8b07\u8b08\u8b09\u8b0a\u8b0b\u8b0c\u8b0d\u8b0e\u8b0f\u8b10\u8b11\u8b12\u8b13\u8b14\u8b15\u8b16\u8b17\u8b18\u8b19\u8b1a\u8b1b\u8b1c\u8b1d\u8b1e\u8b1f\u8b20\u8b21\u8b22\u8b23\u8b24\u8b25\u8b26\u8b27\u8b28\u8b29\u8b2a\u8b2b\u8b2c\u8b2d\u8b2e\u8b2f\u8b30\u8b31\u8b32\u8b33\u8b34\u8b35\u8b36\u8b37\u8b38\u8b39\u8b3a\u8b3b\u8b3c\u8b3d\u8b3e\u8b3f\u8b40\u8b41\u8b42\u8b43\u8b44\u8b45\u8b46\u8b47\u8b48\u8b49\u8b4a\u8b4b\u8b4c\u8b4d\u8b4e\u8b4f\u8b50\u8b51\u8b52\u8b53\u8b54\u8b55\u8b56\u8b57\u8b58\u8b59\u8b5a\u8b5b\u8b5c\u8b5d\u8b5e\u8b5f\u8b60\u8b61\u8b62\u8b63\u8b64\u8b65\u8b66\u8b67\u8b68\u8b69\u8b6a\u8b6b\u8b6c\u8b6d\u8b6e\u8b6f\u8b70\u8b71\u8b72\u8b73\u8b74\u8b75\u8b76\u8b77\u8b78\u8b79\u8b7a\u8b7b\u8b7c\u8b7d\u8b7e\u8b7f\u8b80\u8b81\u8b82\u8b83\u8b84\u8b85\u8b86\u8b87\u8b88\u8b89\u8b8a\u8b8b\u8b8c\u8b8d\u8b8e\u8b8f\u8b90\u8b91\u8b92\u8b93\u8b94\u8b95\u8b96\u8b97\u8b98\u8b99\u8b9a\u8b9b\u8b9c\u8b9d\u8b9e\u8b9f\u8ba0\u8ba1\u8ba2\u8ba3\u8ba4\u8ba5\u8ba6\u8ba7\u8ba8\u8ba9\u8baa\u8bab\u8bac\u8bad\u8bae\u8baf\u8bb0\u8bb1\u8bb2\u8bb3\u8bb4\u8bb5\u8bb6\u8bb7\u8bb8\u8bb9\u8bba\u8bbb\u8bbc\u8bbd\u8bbe\u8bbf\u8bc0\u8bc1\u8bc2\u8bc3\u8bc4\u8bc5\u8bc6\u8bc7\u8bc8\u8bc9\u8bca\u8bcb\u8bcc\u8bcd\u8bce\u8bcf\u8bd0\u8bd1\u8bd2\u8bd3\u8bd4\u8bd5\u8bd6\u8bd7\u8bd8\u8bd9\u8bda\u8bdb\u8bdc\u8bdd\u8bde\u8bdf\u8be0\u8be1\u8be2\u8be3\u8be4\u8be5\u8be6\u8be7\u8be8\u8be9\u8bea\u8beb\u8bec\u8bed\u8bee\u8bef\u8bf0\u8bf1\u8bf2\u8bf3\u8bf4\u8bf5\u8bf6\u8bf7\u8bf8\u8bf9\u8bfa\u8bfb\u8bfc\u8bfd\u8bfe\u8bff\u8c00\u8c01\u8c02\u8c03\u8c04\u8c05\u8c06\u8c07\u8c08\u8c09\u8c0a\u8c0b\u8c0c\u8c0d\u8c0e\u8c0f\u8c10\u8c11\u8c12\u8c13\u8c14\u8c15\u8c16\u8c17\u8c18\u8c19\u8c1a\u8c1b\u8c1c\u8c1d\u8c1e\u8c1f\u8c20\u8c21\u8c22\u8c23\u8c24\u8c25\u8c26\u8c27\u8c28\u8c29\u8c2a\u8c2b\u8c2c\u8c2d\u8c2e\u8c2f\u8c30\u8c31\u8c32\u8c33\u8c34\u8c35\u8c36\u8c37\u8c38\u8c39\u8c3a\u8c3b\u8c3c\u8c3d\u8c3e\u8c3f\u8c40\u8c41\u8c42\u8c43\u8c44\u8c45\u8c46\u8c47\u8c48\u8c49\u8c4a\u8c4b\u8c4c\u8c4d\u8c4e\u8c4f\u8c50\u8c51\u8c52\u8c53\u8c54\u8c55\u8c56\u8c57\u8c58\u8c59\u8c5a\u8c5b\u8c5c\u8c5d\u8c5e\u8c5f\u8c60\u8c61\u8c62\u8c63\u8c64\u8c65\u8c66\u8c67\u8c68\u8c69\u8c6a\u8c6b\u8c6c\u8c6d\u8c6e\u8c6f\u8c70\u8c71\u8c72\u8c73\u8c74\u8c75\u8c76\u8c77\u8c78\u8c79\u8c7a\u8c7b\u8c7c\u8c7d\u8c7e\u8c7f\u8c80\u8c81\u8c82\u8c83\u8c84\u8c85\u8c86\u8c87\u8c88\u8c89\u8c8a\u8c8b\u8c8c\u8c8d\u8c8e\u8c8f\u8c90\u8c91\u8c92\u8c93\u8c94\u8c95\u8c96\u8c97\u8c98\u8c99\u8c9a\u8c9b\u8c9c\u8c9d\u8c9e\u8c9f\u8ca0\u8ca1\u8ca2\u8ca3\u8ca4\u8ca5\u8ca6\u8ca7\u8ca8\u8ca9\u8caa\u8cab\u8cac\u8cad\u8cae\u8caf\u8cb0\u8cb1\u8cb2\u8cb3\u8cb4\u8cb5\u8cb6\u8cb7\u8cb8\u8cb9\u8cba\u8cbb\u8cbc\u8cbd\u8cbe\u8cbf\u8cc0\u8cc1\u8cc2\u8cc3\u8cc4\u8cc5\u8cc6\u8cc7\u8cc8\u8cc9\u8cca\u8ccb\u8ccc\u8ccd\u8cce\u8ccf\u8cd0\u8cd1\u8cd2\u8cd3\u8cd4\u8cd5\u8cd6\u8cd7\u8cd8\u8cd9\u8cda\u8cdb\u8cdc\u8cdd\u8cde\u8cdf\u8ce0\u8ce1\u8ce2\u8ce3\u8ce4\u8ce5\u8ce6\u8ce7\u8ce8\u8ce9\u8cea\u8ceb\u8cec\u8ced\u8cee\u8cef\u8cf0\u8cf1\u8cf2\u8cf3\u8cf4\u8cf5\u8cf6\u8cf7\u8cf8\u8cf9\u8cfa\u8cfb\u8cfc\u8cfd\u8cfe\u8cff\u8d00\u8d01\u8d02\u8d03\u8d04\u8d05\u8d06\u8d07\u8d08\u8d09\u8d0a\u8d0b\u8d0c\u8d0d\u8d0e\u8d0f\u8d10\u8d11\u8d12\u8d13\u8d14\u8d15\u8d16\u8d17\u8d18\u8d19\u8d1a\u8d1b\u8d1c\u8d1d\u8d1e\u8d1f\u8d20\u8d21\u8d22\u8d23\u8d24\u8d25\u8d26\u8d27\u8d28\u8d29\u8d2a\u8d2b\u8d2c\u8d2d\u8d2e\u8d2f\u8d30\u8d31\u8d32\u8d33\u8d34\u8d35\u8d36\u8d37\u8d38\u8d39\u8d3a\u8d3b\u8d3c\u8d3d\u8d3e\u8d3f\u8d40\u8d41\u8d42\u8d43\u8d44\u8d45\u8d46\u8d47\u8d48\u8d49\u8d4a\u8d4b\u8d4c\u8d4d\u8d4e\u8d4f\u8d50\u8d51\u8d52\u8d53\u8d54\u8d55\u8d56\u8d57\u8d58\u8d59\u8d5a\u8d5b\u8d5c\u8d5d\u8d5e\u8d5f\u8d60\u8d61\u8d62\u8d63\u8d64\u8d65\u8d66\u8d67\u8d68\u8d69\u8d6a\u8d6b\u8d6c\u8d6d\u8d6e\u8d6f\u8d70\u8d71\u8d72\u8d73\u8d74\u8d75\u8d76\u8d77\u8d78\u8d79\u8d7a\u8d7b\u8d7c\u8d7d\u8d7e\u8d7f\u8d80\u8d81\u8d82\u8d83\u8d84\u8d85\u8d86\u8d87\u8d88\u8d89\u8d8a\u8d8b\u8d8c\u8d8d\u8d8e\u8d8f\u8d90\u8d91\u8d92\u8d93\u8d94\u8d95\u8d96\u8d97\u8d98\u8d99\u8d9a\u8d9b\u8d9c\u8d9d\u8d9e\u8d9f\u8da0\u8da1\u8da2\u8da3\u8da4\u8da5\u8da6\u8da7\u8da8\u8da9\u8daa\u8dab\u8dac\u8dad\u8dae\u8daf\u8db0\u8db1\u8db2\u8db3\u8db4\u8db5\u8db6\u8db7\u8db8\u8db9\u8dba\u8dbb\u8dbc\u8dbd\u8dbe\u8dbf\u8dc0\u8dc1\u8dc2\u8dc3\u8dc4\u8dc5\u8dc6\u8dc7\u8dc8\u8dc9\u8dca\u8dcb\u8dcc\u8dcd\u8dce\u8dcf\u8dd0\u8dd1\u8dd2\u8dd3\u8dd4\u8dd5\u8dd6\u8dd7\u8dd8\u8dd9\u8dda\u8ddb\u8ddc\u8ddd\u8dde\u8ddf\u8de0\u8de1\u8de2\u8de3\u8de4\u8de5\u8de6\u8de7\u8de8\u8de9\u8dea\u8deb\u8dec\u8ded\u8dee\u8def\u8df0\u8df1\u8df2\u8df3\u8df4\u8df5\u8df6\u8df7\u8df8\u8df9\u8dfa\u8dfb\u8dfc\u8dfd\u8dfe\u8dff\u8e00\u8e01\u8e02\u8e03\u8e04\u8e05\u8e06\u8e07\u8e08\u8e09\u8e0a\u8e0b\u8e0c\u8e0d\u8e0e\u8e0f\u8e10\u8e11\u8e12\u8e13\u8e14\u8e15\u8e16\u8e17\u8e18\u8e19\u8e1a\u8e1b\u8e1c\u8e1d\u8e1e\u8e1f\u8e20\u8e21\u8e22\u8e23\u8e24\u8e25\u8e26\u8e27\u8e28\u8e29\u8e2a\u8e2b\u8e2c\u8e2d\u8e2e\u8e2f\u8e30\u8e31\u8e32\u8e33\u8e34\u8e35\u8e36\u8e37\u8e38\u8e39\u8e3a\u8e3b\u8e3c\u8e3d\u8e3e\u8e3f\u8e40\u8e41\u8e42\u8e43\u8e44\u8e45\u8e46\u8e47\u8e48\u8e49\u8e4a\u8e4b\u8e4c\u8e4d\u8e4e\u8e4f\u8e50\u8e51\u8e52\u8e53\u8e54\u8e55\u8e56\u8e57\u8e58\u8e59\u8e5a\u8e5b\u8e5c\u8e5d\u8e5e\u8e5f\u8e60\u8e61\u8e62\u8e63\u8e64\u8e65\u8e66\u8e67\u8e68\u8e69\u8e6a\u8e6b\u8e6c\u8e6d\u8e6e\u8e6f\u8e70\u8e71\u8e72\u8e73\u8e74\u8e75\u8e76\u8e77\u8e78\u8e79\u8e7a\u8e7b\u8e7c\u8e7d\u8e7e\u8e7f\u8e80\u8e81\u8e82\u8e83\u8e84\u8e85\u8e86\u8e87\u8e88\u8e89\u8e8a\u8e8b\u8e8c\u8e8d\u8e8e\u8e8f\u8e90\u8e91\u8e92\u8e93\u8e94\u8e95\u8e96\u8e97\u8e98\u8e99\u8e9a\u8e9b\u8e9c\u8e9d\u8e9e\u8e9f\u8ea0\u8ea1\u8ea2\u8ea3\u8ea4\u8ea5\u8ea6\u8ea7\u8ea8\u8ea9\u8eaa\u8eab\u8eac\u8ead\u8eae\u8eaf\u8eb0\u8eb1\u8eb2\u8eb3\u8eb4\u8eb5\u8eb6\u8eb7\u8eb8\u8eb9\u8eba\u8ebb\u8ebc\u8ebd\u8ebe\u8ebf\u8ec0\u8ec1\u8ec2\u8ec3\u8ec4\u8ec5\u8ec6\u8ec7\u8ec8\u8ec9\u8eca\u8ecb\u8ecc\u8ecd\u8ece\u8ecf\u8ed0\u8ed1\u8ed2\u8ed3\u8ed4\u8ed5\u8ed6\u8ed7\u8ed8\u8ed9\u8eda\u8edb\u8edc\u8edd\u8ede\u8edf\u8ee0\u8ee1\u8ee2\u8ee3\u8ee4\u8ee5\u8ee6\u8ee7\u8ee8\u8ee9\u8eea\u8eeb\u8eec\u8eed\u8eee\u8eef\u8ef0\u8ef1\u8ef2\u8ef3\u8ef4\u8ef5\u8ef6\u8ef7\u8ef8\u8ef9\u8efa\u8efb\u8efc\u8efd\u8efe\u8eff\u8f00\u8f01\u8f02\u8f03\u8f04\u8f05\u8f06\u8f07\u8f08\u8f09\u8f0a\u8f0b\u8f0c\u8f0d\u8f0e\u8f0f\u8f10\u8f11\u8f12\u8f13\u8f14\u8f15\u8f16\u8f17\u8f18\u8f19\u8f1a\u8f1b\u8f1c\u8f1d\u8f1e\u8f1f\u8f20\u8f21\u8f22\u8f23\u8f24\u8f25\u8f26\u8f27\u8f28\u8f29\u8f2a\u8f2b\u8f2c\u8f2d\u8f2e\u8f2f\u8f30\u8f31\u8f32\u8f33\u8f34\u8f35\u8f36\u8f37\u8f38\u8f39\u8f3a\u8f3b\u8f3c\u8f3d\u8f3e\u8f3f\u8f40\u8f41\u8f42\u8f43\u8f44\u8f45\u8f46\u8f47\u8f48\u8f49\u8f4a\u8f4b\u8f4c\u8f4d\u8f4e\u8f4f\u8f50\u8f51\u8f52\u8f53\u8f54\u8f55\u8f56\u8f57\u8f58\u8f59\u8f5a\u8f5b\u8f5c\u8f5d\u8f5e\u8f5f\u8f60\u8f61\u8f62\u8f63\u8f64\u8f65\u8f66\u8f67\u8f68\u8f69\u8f6a\u8f6b\u8f6c\u8f6d\u8f6e\u8f6f\u8f70\u8f71\u8f72\u8f73\u8f74\u8f75\u8f76\u8f77\u8f78\u8f79\u8f7a\u8f7b\u8f7c\u8f7d\u8f7e\u8f7f\u8f80\u8f81\u8f82\u8f83\u8f84\u8f85\u8f86\u8f87\u8f88\u8f89\u8f8a\u8f8b\u8f8c\u8f8d\u8f8e\u8f8f\u8f90\u8f91\u8f92\u8f93\u8f94\u8f95\u8f96\u8f97\u8f98\u8f99\u8f9a\u8f9b\u8f9c\u8f9d\u8f9e\u8f9f\u8fa0\u8fa1\u8fa2\u8fa3\u8fa4\u8fa5\u8fa6\u8fa7\u8fa8\u8fa9\u8faa\u8fab\u8fac\u8fad\u8fae\u8faf\u8fb0\u8fb1\u8fb2\u8fb3\u8fb4\u8fb5\u8fb6\u8fb7\u8fb8\u8fb9\u8fba\u8fbb\u8fbc\u8fbd\u8fbe\u8fbf\u8fc0\u8fc1\u8fc2\u8fc3\u8fc4\u8fc5\u8fc6\u8fc7\u8fc8\u8fc9\u8fca\u8fcb\u8fcc\u8fcd\u8fce\u8fcf\u8fd0\u8fd1\u8fd2\u8fd3\u8fd4\u8fd5\u8fd6\u8fd7\u8fd8\u8fd9\u8fda\u8fdb\u8fdc\u8fdd\u8fde\u8fdf\u8fe0\u8fe1\u8fe2\u8fe3\u8fe4\u8fe5\u8fe6\u8fe7\u8fe8\u8fe9\u8fea\u8feb\u8fec\u8fed\u8fee\u8fef\u8ff0\u8ff1\u8ff2\u8ff3\u8ff4\u8ff5\u8ff6\u8ff7\u8ff8\u8ff9\u8ffa\u8ffb\u8ffc\u8ffd\u8ffe\u8fff\u9000\u9001\u9002\u9003\u9004\u9005\u9006\u9007\u9008\u9009\u900a\u900b\u900c\u900d\u900e\u900f\u9010\u9011\u9012\u9013\u9014\u9015\u9016\u9017\u9018\u9019\u901a\u901b\u901c\u901d\u901e\u901f\u9020\u9021\u9022\u9023\u9024\u9025\u9026\u9027\u9028\u9029\u902a\u902b\u902c\u902d\u902e\u902f\u9030\u9031\u9032\u9033\u9034\u9035\u9036\u9037\u9038\u9039\u903a\u903b\u903c\u903d\u903e\u903f\u9040\u9041\u9042\u9043\u9044\u9045\u9046\u9047\u9048\u9049\u904a\u904b\u904c\u904d\u904e\u904f\u9050\u9051\u9052\u9053\u9054\u9055\u9056\u9057\u9058\u9059\u905a\u905b\u905c\u905d\u905e\u905f\u9060\u9061\u9062\u9063\u9064\u9065\u9066\u9067\u9068\u9069\u906a\u906b\u906c\u906d\u906e\u906f\u9070\u9071\u9072\u9073\u9074\u9075\u9076\u9077\u9078\u9079\u907a\u907b\u907c\u907d\u907e\u907f\u9080\u9081\u9082\u9083\u9084\u9085\u9086\u9087\u9088\u9089\u908a\u908b\u908c\u908d\u908e\u908f\u9090\u9091\u9092\u9093\u9094\u9095\u9096\u9097\u9098\u9099\u909a\u909b\u909c\u909d\u909e\u909f\u90a0\u90a1\u90a2\u90a3\u90a4\u90a5\u90a6\u90a7\u90a8\u90a9\u90aa\u90ab\u90ac\u90ad\u90ae\u90af\u90b0\u90b1\u90b2\u90b3\u90b4\u90b5\u90b6\u90b7\u90b8\u90b9\u90ba\u90bb\u90bc\u90bd\u90be\u90bf\u90c0\u90c1\u90c2\u90c3\u90c4\u90c5\u90c6\u90c7\u90c8\u90c9\u90ca\u90cb\u90cc\u90cd\u90ce\u90cf\u90d0\u90d1\u90d2\u90d3\u90d4\u90d5\u90d6\u90d7\u90d8\u90d9\u90da\u90db\u90dc\u90dd\u90de\u90df\u90e0\u90e1\u90e2\u90e3\u90e4\u90e5\u90e6\u90e7\u90e8\u90e9\u90ea\u90eb\u90ec\u90ed\u90ee\u90ef\u90f0\u90f1\u90f2\u90f3\u90f4\u90f5\u90f6\u90f7\u90f8\u90f9\u90fa\u90fb\u90fc\u90fd\u90fe\u90ff\u9100\u9101\u9102\u9103\u9104\u9105\u9106\u9107\u9108\u9109\u910a\u910b\u910c\u910d\u910e\u910f\u9110\u9111\u9112\u9113\u9114\u9115\u9116\u9117\u9118\u9119\u911a\u911b\u911c\u911d\u911e\u911f\u9120\u9121\u9122\u9123\u9124\u9125\u9126\u9127\u9128\u9129\u912a\u912b\u912c\u912d\u912e\u912f\u9130\u9131\u9132\u9133\u9134\u9135\u9136\u9137\u9138\u9139\u913a\u913b\u913c\u913d\u913e\u913f\u9140\u9141\u9142\u9143\u9144\u9145\u9146\u9147\u9148\u9149\u914a\u914b\u914c\u914d\u914e\u914f\u9150\u9151\u9152\u9153\u9154\u9155\u9156\u9157\u9158\u9159\u915a\u915b\u915c\u915d\u915e\u915f\u9160\u9161\u9162\u9163\u9164\u9165\u9166\u9167\u9168\u9169\u916a\u916b\u916c\u916d\u916e\u916f\u9170\u9171\u9172\u9173\u9174\u9175\u9176\u9177\u9178\u9179\u917a\u917b\u917c\u917d\u917e\u917f\u9180\u9181\u9182\u9183\u9184\u9185\u9186\u9187\u9188\u9189\u918a\u918b\u918c\u918d\u918e\u918f\u9190\u9191\u9192\u9193\u9194\u9195\u9196\u9197\u9198\u9199\u919a\u919b\u919c\u919d\u919e\u919f\u91a0\u91a1\u91a2\u91a3\u91a4\u91a5\u91a6\u91a7\u91a8\u91a9\u91aa\u91ab\u91ac\u91ad\u91ae\u91af\u91b0\u91b1\u91b2\u91b3\u91b4\u91b5\u91b6\u91b7\u91b8\u91b9\u91ba\u91bb\u91bc\u91bd\u91be\u91bf\u91c0\u91c1\u91c2\u91c3\u91c4\u91c5\u91c6\u91c7\u91c8\u91c9\u91ca\u91cb\u91cc\u91cd\u91ce\u91cf\u91d0\u91d1\u91d2\u91d3\u91d4\u91d5\u91d6\u91d7\u91d8\u91d9\u91da\u91db\u91dc\u91dd\u91de\u91df\u91e0\u91e1\u91e2\u91e3\u91e4\u91e5\u91e6\u91e7\u91e8\u91e9\u91ea\u91eb\u91ec\u91ed\u91ee\u91ef\u91f0\u91f1\u91f2\u91f3\u91f4\u91f5\u91f6\u91f7\u91f8\u91f9\u91fa\u91fb\u91fc\u91fd\u91fe\u91ff\u9200\u9201\u9202\u9203\u9204\u9205\u9206\u9207\u9208\u9209\u920a\u920b\u920c\u920d\u920e\u920f\u9210\u9211\u9212\u9213\u9214\u9215\u9216\u9217\u9218\u9219\u921a\u921b\u921c\u921d\u921e\u921f\u9220\u9221\u9222\u9223\u9224\u9225\u9226\u9227\u9228\u9229\u922a\u922b\u922c\u922d\u922e\u922f\u9230\u9231\u9232\u9233\u9234\u9235\u9236\u9237\u9238\u9239\u923a\u923b\u923c\u923d\u923e\u923f\u9240\u9241\u9242\u9243\u9244\u9245\u9246\u9247\u9248\u9249\u924a\u924b\u924c\u924d\u924e\u924f\u9250\u9251\u9252\u9253\u9254\u9255\u9256\u9257\u9258\u9259\u925a\u925b\u925c\u925d\u925e\u925f\u9260\u9261\u9262\u9263\u9264\u9265\u9266\u9267\u9268\u9269\u926a\u926b\u926c\u926d\u926e\u926f\u9270\u9271\u9272\u9273\u9274\u9275\u9276\u9277\u9278\u9279\u927a\u927b\u927c\u927d\u927e\u927f\u9280\u9281\u9282\u9283\u9284\u9285\u9286\u9287\u9288\u9289\u928a\u928b\u928c\u928d\u928e\u928f\u9290\u9291\u9292\u9293\u9294\u9295\u9296\u9297\u9298\u9299\u929a\u929b\u929c\u929d\u929e\u929f\u92a0\u92a1\u92a2\u92a3\u92a4\u92a5\u92a6\u92a7\u92a8\u92a9\u92aa\u92ab\u92ac\u92ad\u92ae\u92af\u92b0\u92b1\u92b2\u92b3\u92b4\u92b5\u92b6\u92b7\u92b8\u92b9\u92ba\u92bb\u92bc\u92bd\u92be\u92bf\u92c0\u92c1\u92c2\u92c3\u92c4\u92c5\u92c6\u92c7\u92c8\u92c9\u92ca\u92cb\u92cc\u92cd\u92ce\u92cf\u92d0\u92d1\u92d2\u92d3\u92d4\u92d5\u92d6\u92d7\u92d8\u92d9\u92da\u92db\u92dc\u92dd\u92de\u92df\u92e0\u92e1\u92e2\u92e3\u92e4\u92e5\u92e6\u92e7\u92e8\u92e9\u92ea\u92eb\u92ec\u92ed\u92ee\u92ef\u92f0\u92f1\u92f2\u92f3\u92f4\u92f5\u92f6\u92f7\u92f8\u92f9\u92fa\u92fb\u92fc\u92fd\u92fe\u92ff\u9300\u9301\u9302\u9303\u9304\u9305\u9306\u9307\u9308\u9309\u930a\u930b\u930c\u930d\u930e\u930f\u9310\u9311\u9312\u9313\u9314\u9315\u9316\u9317\u9318\u9319\u931a\u931b\u931c\u931d\u931e\u931f\u9320\u9321\u9322\u9323\u9324\u9325\u9326\u9327\u9328\u9329\u932a\u932b\u932c\u932d\u932e\u932f\u9330\u9331\u9332\u9333\u9334\u9335\u9336\u9337\u9338\u9339\u933a\u933b\u933c\u933d\u933e\u933f\u9340\u9341\u9342\u9343\u9344\u9345\u9346\u9347\u9348\u9349\u934a\u934b\u934c\u934d\u934e\u934f\u9350\u9351\u9352\u9353\u9354\u9355\u9356\u9357\u9358\u9359\u935a\u935b\u935c\u935d\u935e\u935f\u9360\u9361\u9362\u9363\u9364\u9365\u9366\u9367\u9368\u9369\u936a\u936b\u936c\u936d\u936e\u936f\u9370\u9371\u9372\u9373\u9374\u9375\u9376\u9377\u9378\u9379\u937a\u937b\u937c\u937d\u937e\u937f\u9380\u9381\u9382\u9383\u9384\u9385\u9386\u9387\u9388\u9389\u938a\u938b\u938c\u938d\u938e\u938f\u9390\u9391\u9392\u9393\u9394\u9395\u9396\u9397\u9398\u9399\u939a\u939b\u939c\u939d\u939e\u939f\u93a0\u93a1\u93a2\u93a3\u93a4\u93a5\u93a6\u93a7\u93a8\u93a9\u93aa\u93ab\u93ac\u93ad\u93ae\u93af\u93b0\u93b1\u93b2\u93b3\u93b4\u93b5\u93b6\u93b7\u93b8\u93b9\u93ba\u93bb\u93bc\u93bd\u93be\u93bf\u93c0\u93c1\u93c2\u93c3\u93c4\u93c5\u93c6\u93c7\u93c8\u93c9\u93ca\u93cb\u93cc\u93cd\u93ce\u93cf\u93d0\u93d1\u93d2\u93d3\u93d4\u93d5\u93d6\u93d7\u93d8\u93d9\u93da\u93db\u93dc\u93dd\u93de\u93df\u93e0\u93e1\u93e2\u93e3\u93e4\u93e5\u93e6\u93e7\u93e8\u93e9\u93ea\u93eb\u93ec\u93ed\u93ee\u93ef\u93f0\u93f1\u93f2\u93f3\u93f4\u93f5\u93f6\u93f7\u93f8\u93f9\u93fa\u93fb\u93fc\u93fd\u93fe\u93ff\u9400\u9401\u9402\u9403\u9404\u9405\u9406\u9407\u9408\u9409\u940a\u940b\u940c\u940d\u940e\u940f\u9410\u9411\u9412\u9413\u9414\u9415\u9416\u9417\u9418\u9419\u941a\u941b\u941c\u941d\u941e\u941f\u9420\u9421\u9422\u9423\u9424\u9425\u9426\u9427\u9428\u9429\u942a\u942b\u942c\u942d\u942e\u942f\u9430\u9431\u9432\u9433\u9434\u9435\u9436\u9437\u9438\u9439\u943a\u943b\u943c\u943d\u943e\u943f\u9440\u9441\u9442\u9443\u9444\u9445\u9446\u9447\u9448\u9449\u944a\u944b\u944c\u944d\u944e\u944f\u9450\u9451\u9452\u9453\u9454\u9455\u9456\u9457\u9458\u9459\u945a\u945b\u945c\u945d\u945e\u945f\u9460\u9461\u9462\u9463\u9464\u9465\u9466\u9467\u9468\u9469\u946a\u946b\u946c\u946d\u946e\u946f\u9470\u9471\u9472\u9473\u9474\u9475\u9476\u9477\u9478\u9479\u947a\u947b\u947c\u947d\u947e\u947f\u9480\u9481\u9482\u9483\u9484\u9485\u9486\u9487\u9488\u9489\u948a\u948b\u948c\u948d\u948e\u948f\u9490\u9491\u9492\u9493\u9494\u9495\u9496\u9497\u9498\u9499\u949a\u949b\u949c\u949d\u949e\u949f\u94a0\u94a1\u94a2\u94a3\u94a4\u94a5\u94a6\u94a7\u94a8\u94a9\u94aa\u94ab\u94ac\u94ad\u94ae\u94af\u94b0\u94b1\u94b2\u94b3\u94b4\u94b5\u94b6\u94b7\u94b8\u94b9\u94ba\u94bb\u94bc\u94bd\u94be\u94bf\u94c0\u94c1\u94c2\u94c3\u94c4\u94c5\u94c6\u94c7\u94c8\u94c9\u94ca\u94cb\u94cc\u94cd\u94ce\u94cf\u94d0\u94d1\u94d2\u94d3\u94d4\u94d5\u94d6\u94d7\u94d8\u94d9\u94da\u94db\u94dc\u94dd\u94de\u94df\u94e0\u94e1\u94e2\u94e3\u94e4\u94e5\u94e6\u94e7\u94e8\u94e9\u94ea\u94eb\u94ec\u94ed\u94ee\u94ef\u94f0\u94f1\u94f2\u94f3\u94f4\u94f5\u94f6\u94f7\u94f8\u94f9\u94fa\u94fb\u94fc\u94fd\u94fe\u94ff\u9500\u9501\u9502\u9503\u9504\u9505\u9506\u9507\u9508\u9509\u950a\u950b\u950c\u950d\u950e\u950f\u9510\u9511\u9512\u9513\u9514\u9515\u9516\u9517\u9518\u9519\u951a\u951b\u951c\u951d\u951e\u951f\u9520\u9521\u9522\u9523\u9524\u9525\u9526\u9527\u9528\u9529\u952a\u952b\u952c\u952d\u952e\u952f\u9530\u9531\u9532\u9533\u9534\u9535\u9536\u9537\u9538\u9539\u953a\u953b\u953c\u953d\u953e\u953f\u9540\u9541\u9542\u9543\u9544\u9545\u9546\u9547\u9548\u9549\u954a\u954b\u954c\u954d\u954e\u954f\u9550\u9551\u9552\u9553\u9554\u9555\u9556\u9557\u9558\u9559\u955a\u955b\u955c\u955d\u955e\u955f\u9560\u9561\u9562\u9563\u9564\u9565\u9566\u9567\u9568\u9569\u956a\u956b\u956c\u956d\u956e\u956f\u9570\u9571\u9572\u9573\u9574\u9575\u9576\u9577\u9578\u9579\u957a\u957b\u957c\u957d\u957e\u957f\u9580\u9581\u9582\u9583\u9584\u9585\u9586\u9587\u9588\u9589\u958a\u958b\u958c\u958d\u958e\u958f\u9590\u9591\u9592\u9593\u9594\u9595\u9596\u9597\u9598\u9599\u959a\u959b\u959c\u959d\u959e\u959f\u95a0\u95a1\u95a2\u95a3\u95a4\u95a5\u95a6\u95a7\u95a8\u95a9\u95aa\u95ab\u95ac\u95ad\u95ae\u95af\u95b0\u95b1\u95b2\u95b3\u95b4\u95b5\u95b6\u95b7\u95b8\u95b9\u95ba\u95bb\u95bc\u95bd\u95be\u95bf\u95c0\u95c1\u95c2\u95c3\u95c4\u95c5\u95c6\u95c7\u95c8\u95c9\u95ca\u95cb\u95cc\u95cd\u95ce\u95cf\u95d0\u95d1\u95d2\u95d3\u95d4\u95d5\u95d6\u95d7\u95d8\u95d9\u95da\u95db\u95dc\u95dd\u95de\u95df\u95e0\u95e1\u95e2\u95e3\u95e4\u95e5\u95e6\u95e7\u95e8\u95e9\u95ea\u95eb\u95ec\u95ed\u95ee\u95ef\u95f0\u95f1\u95f2\u95f3\u95f4\u95f5\u95f6\u95f7\u95f8\u95f9\u95fa\u95fb\u95fc\u95fd\u95fe\u95ff\u9600\u9601\u9602\u9603\u9604\u9605\u9606\u9607\u9608\u9609\u960a\u960b\u960c\u960d\u960e\u960f\u9610\u9611\u9612\u9613\u9614\u9615\u9616\u9617\u9618\u9619\u961a\u961b\u961c\u961d\u961e\u961f\u9620\u9621\u9622\u9623\u9624\u9625\u9626\u9627\u9628\u9629\u962a\u962b\u962c\u962d\u962e\u962f\u9630\u9631\u9632\u9633\u9634\u9635\u9636\u9637\u9638\u9639\u963a\u963b\u963c\u963d\u963e\u963f\u9640\u9641\u9642\u9643\u9644\u9645\u9646\u9647\u9648\u9649\u964a\u964b\u964c\u964d\u964e\u964f\u9650\u9651\u9652\u9653\u9654\u9655\u9656\u9657\u9658\u9659\u965a\u965b\u965c\u965d\u965e\u965f\u9660\u9661\u9662\u9663\u9664\u9665\u9666\u9667\u9668\u9669\u966a\u966b\u966c\u966d\u966e\u966f\u9670\u9671\u9672\u9673\u9674\u9675\u9676\u9677\u9678\u9679\u967a\u967b\u967c\u967d\u967e\u967f\u9680\u9681\u9682\u9683\u9684\u9685\u9686\u9687\u9688\u9689\u968a\u968b\u968c\u968d\u968e\u968f\u9690\u9691\u9692\u9693\u9694\u9695\u9696\u9697\u9698\u9699\u969a\u969b\u969c\u969d\u969e\u969f\u96a0\u96a1\u96a2\u96a3\u96a4\u96a5\u96a6\u96a7\u96a8\u96a9\u96aa\u96ab\u96ac\u96ad\u96ae\u96af\u96b0\u96b1\u96b2\u96b3\u96b4\u96b5\u96b6\u96b7\u96b8\u96b9\u96ba\u96bb\u96bc\u96bd\u96be\u96bf\u96c0\u96c1\u96c2\u96c3\u96c4\u96c5\u96c6\u96c7\u96c8\u96c9\u96ca\u96cb\u96cc\u96cd\u96ce\u96cf\u96d0\u96d1\u96d2\u96d3\u96d4\u96d5\u96d6\u96d7\u96d8\u96d9\u96da\u96db\u96dc\u96dd\u96de\u96df\u96e0\u96e1\u96e2\u96e3\u96e4\u96e5\u96e6\u96e7\u96e8\u96e9\u96ea\u96eb\u96ec\u96ed\u96ee\u96ef\u96f0\u96f1\u96f2\u96f3\u96f4\u96f5\u96f6\u96f7\u96f8\u96f9\u96fa\u96fb\u96fc\u96fd\u96fe\u96ff\u9700\u9701\u9702\u9703\u9704\u9705\u9706\u9707\u9708\u9709\u970a\u970b\u970c\u970d\u970e\u970f\u9710\u9711\u9712\u9713\u9714\u9715\u9716\u9717\u9718\u9719\u971a\u971b\u971c\u971d\u971e\u971f\u9720\u9721\u9722\u9723\u9724\u9725\u9726\u9727\u9728\u9729\u972a\u972b\u972c\u972d\u972e\u972f\u9730\u9731\u9732\u9733\u9734\u9735\u9736\u9737\u9738\u9739\u973a\u973b\u973c\u973d\u973e\u973f\u9740\u9741\u9742\u9743\u9744\u9745\u9746\u9747\u9748\u9749\u974a\u974b\u974c\u974d\u974e\u974f\u9750\u9751\u9752\u9753\u9754\u9755\u9756\u9757\u9758\u9759\u975a\u975b\u975c\u975d\u975e\u975f\u9760\u9761\u9762\u9763\u9764\u9765\u9766\u9767\u9768\u9769\u976a\u976b\u976c\u976d\u976e\u976f\u9770\u9771\u9772\u9773\u9774\u9775\u9776\u9777\u9778\u9779\u977a\u977b\u977c\u977d\u977e\u977f\u9780\u9781\u9782\u9783\u9784\u9785\u9786\u9787\u9788\u9789\u978a\u978b\u978c\u978d\u978e\u978f\u9790\u9791\u9792\u9793\u9794\u9795\u9796\u9797\u9798\u9799\u979a\u979b\u979c\u979d\u979e\u979f\u97a0\u97a1\u97a2\u97a3\u97a4\u97a5\u97a6\u97a7\u97a8\u97a9\u97aa\u97ab\u97ac\u97ad\u97ae\u97af\u97b0\u97b1\u97b2\u97b3\u97b4\u97b5\u97b6\u97b7\u97b8\u97b9\u97ba\u97bb\u97bc\u97bd\u97be\u97bf\u97c0\u97c1\u97c2\u97c3\u97c4\u97c5\u97c6\u97c7\u97c8\u97c9\u97ca\u97cb\u97cc\u97cd\u97ce\u97cf\u97d0\u97d1\u97d2\u97d3\u97d4\u97d5\u97d6\u97d7\u97d8\u97d9\u97da\u97db\u97dc\u97dd\u97de\u97df\u97e0\u97e1\u97e2\u97e3\u97e4\u97e5\u97e6\u97e7\u97e8\u97e9\u97ea\u97eb\u97ec\u97ed\u97ee\u97ef\u97f0\u97f1\u97f2\u97f3\u97f4\u97f5\u97f6\u97f7\u97f8\u97f9\u97fa\u97fb\u97fc\u97fd\u97fe\u97ff\u9800\u9801\u9802\u9803\u9804\u9805\u9806\u9807\u9808\u9809\u980a\u980b\u980c\u980d\u980e\u980f\u9810\u9811\u9812\u9813\u9814\u9815\u9816\u9817\u9818\u9819\u981a\u981b\u981c\u981d\u981e\u981f\u9820\u9821\u9822\u9823\u9824\u9825\u9826\u9827\u9828\u9829\u982a\u982b\u982c\u982d\u982e\u982f\u9830\u9831\u9832\u9833\u9834\u9835\u9836\u9837\u9838\u9839\u983a\u983b\u983c\u983d\u983e\u983f\u9840\u9841\u9842\u9843\u9844\u9845\u9846\u9847\u9848\u9849\u984a\u984b\u984c\u984d\u984e\u984f\u9850\u9851\u9852\u9853\u9854\u9855\u9856\u9857\u9858\u9859\u985a\u985b\u985c\u985d\u985e\u985f\u9860\u9861\u9862\u9863\u9864\u9865\u9866\u9867\u9868\u9869\u986a\u986b\u986c\u986d\u986e\u986f\u9870\u9871\u9872\u9873\u9874\u9875\u9876\u9877\u9878\u9879\u987a\u987b\u987c\u987d\u987e\u987f\u9880\u9881\u9882\u9883\u9884\u9885\u9886\u9887\u9888\u9889\u988a\u988b\u988c\u988d\u988e\u988f\u9890\u9891\u9892\u9893\u9894\u9895\u9896\u9897\u9898\u9899\u989a\u989b\u989c\u989d\u989e\u989f\u98a0\u98a1\u98a2\u98a3\u98a4\u98a5\u98a6\u98a7\u98a8\u98a9\u98aa\u98ab\u98ac\u98ad\u98ae\u98af\u98b0\u98b1\u98b2\u98b3\u98b4\u98b5\u98b6\u98b7\u98b8\u98b9\u98ba\u98bb\u98bc\u98bd\u98be\u98bf\u98c0\u98c1\u98c2\u98c3\u98c4\u98c5\u98c6\u98c7\u98c8\u98c9\u98ca\u98cb\u98cc\u98cd\u98ce\u98cf\u98d0\u98d1\u98d2\u98d3\u98d4\u98d5\u98d6\u98d7\u98d8\u98d9\u98da\u98db\u98dc\u98dd\u98de\u98df\u98e0\u98e1\u98e2\u98e3\u98e4\u98e5\u98e6\u98e7\u98e8\u98e9\u98ea\u98eb\u98ec\u98ed\u98ee\u98ef\u98f0\u98f1\u98f2\u98f3\u98f4\u98f5\u98f6\u98f7\u98f8\u98f9\u98fa\u98fb\u98fc\u98fd\u98fe\u98ff\u9900\u9901\u9902\u9903\u9904\u9905\u9906\u9907\u9908\u9909\u990a\u990b\u990c\u990d\u990e\u990f\u9910\u9911\u9912\u9913\u9914\u9915\u9916\u9917\u9918\u9919\u991a\u991b\u991c\u991d\u991e\u991f\u9920\u9921\u9922\u9923\u9924\u9925\u9926\u9927\u9928\u9929\u992a\u992b\u992c\u992d\u992e\u992f\u9930\u9931\u9932\u9933\u9934\u9935\u9936\u9937\u9938\u9939\u993a\u993b\u993c\u993d\u993e\u993f\u9940\u9941\u9942\u9943\u9944\u9945\u9946\u9947\u9948\u9949\u994a\u994b\u994c\u994d\u994e\u994f\u9950\u9951\u9952\u9953\u9954\u9955\u9956\u9957\u9958\u9959\u995a\u995b\u995c\u995d\u995e\u995f\u9960\u9961\u9962\u9963\u9964\u9965\u9966\u9967\u9968\u9969\u996a\u996b\u996c\u996d\u996e\u996f\u9970\u9971\u9972\u9973\u9974\u9975\u9976\u9977\u9978\u9979\u997a\u997b\u997c\u997d\u997e\u997f\u9980\u9981\u9982\u9983\u9984\u9985\u9986\u9987\u9988\u9989\u998a\u998b\u998c\u998d\u998e\u998f\u9990\u9991\u9992\u9993\u9994\u9995\u9996\u9997\u9998\u9999\u999a\u999b\u999c\u999d\u999e\u999f\u99a0\u99a1\u99a2\u99a3\u99a4\u99a5\u99a6\u99a7\u99a8\u99a9\u99aa\u99ab\u99ac\u99ad\u99ae\u99af\u99b0\u99b1\u99b2\u99b3\u99b4\u99b5\u99b6\u99b7\u99b8\u99b9\u99ba\u99bb\u99bc\u99bd\u99be\u99bf\u99c0\u99c1\u99c2\u99c3\u99c4\u99c5\u99c6\u99c7\u99c8\u99c9\u99ca\u99cb\u99cc\u99cd\u99ce\u99cf\u99d0\u99d1\u99d2\u99d3\u99d4\u99d5\u99d6\u99d7\u99d8\u99d9\u99da\u99db\u99dc\u99dd\u99de\u99df\u99e0\u99e1\u99e2\u99e3\u99e4\u99e5\u99e6\u99e7\u99e8\u99e9\u99ea\u99eb\u99ec\u99ed\u99ee\u99ef\u99f0\u99f1\u99f2\u99f3\u99f4\u99f5\u99f6\u99f7\u99f8\u99f9\u99fa\u99fb\u99fc\u99fd\u99fe\u99ff\u9a00\u9a01\u9a02\u9a03\u9a04\u9a05\u9a06\u9a07\u9a08\u9a09\u9a0a\u9a0b\u9a0c\u9a0d\u9a0e\u9a0f\u9a10\u9a11\u9a12\u9a13\u9a14\u9a15\u9a16\u9a17\u9a18\u9a19\u9a1a\u9a1b\u9a1c\u9a1d\u9a1e\u9a1f\u9a20\u9a21\u9a22\u9a23\u9a24\u9a25\u9a26\u9a27\u9a28\u9a29\u9a2a\u9a2b\u9a2c\u9a2d\u9a2e\u9a2f\u9a30\u9a31\u9a32\u9a33\u9a34\u9a35\u9a36\u9a37\u9a38\u9a39\u9a3a\u9a3b\u9a3c\u9a3d\u9a3e\u9a3f\u9a40\u9a41\u9a42\u9a43\u9a44\u9a45\u9a46\u9a47\u9a48\u9a49\u9a4a\u9a4b\u9a4c\u9a4d\u9a4e\u9a4f\u9a50\u9a51\u9a52\u9a53\u9a54\u9a55\u9a56\u9a57\u9a58\u9a59\u9a5a\u9a5b\u9a5c\u9a5d\u9a5e\u9a5f\u9a60\u9a61\u9a62\u9a63\u9a64\u9a65\u9a66\u9a67\u9a68\u9a69\u9a6a\u9a6b\u9a6c\u9a6d\u9a6e\u9a6f\u9a70\u9a71\u9a72\u9a73\u9a74\u9a75\u9a76\u9a77\u9a78\u9a79\u9a7a\u9a7b\u9a7c\u9a7d\u9a7e\u9a7f\u9a80\u9a81\u9a82\u9a83\u9a84\u9a85\u9a86\u9a87\u9a88\u9a89\u9a8a\u9a8b\u9a8c\u9a8d\u9a8e\u9a8f\u9a90\u9a91\u9a92\u9a93\u9a94\u9a95\u9a96\u9a97\u9a98\u9a99\u9a9a\u9a9b\u9a9c\u9a9d\u9a9e\u9a9f\u9aa0\u9aa1\u9aa2\u9aa3\u9aa4\u9aa5\u9aa6\u9aa7\u9aa8\u9aa9\u9aaa\u9aab\u9aac\u9aad\u9aae\u9aaf\u9ab0\u9ab1\u9ab2\u9ab3\u9ab4\u9ab5\u9ab6\u9ab7\u9ab8\u9ab9\u9aba\u9abb\u9abc\u9abd\u9abe\u9abf\u9ac0\u9ac1\u9ac2\u9ac3\u9ac4\u9ac5\u9ac6\u9ac7\u9ac8\u9ac9\u9aca\u9acb\u9acc\u9acd\u9ace\u9acf\u9ad0\u9ad1\u9ad2\u9ad3\u9ad4\u9ad5\u9ad6\u9ad7\u9ad8\u9ad9\u9ada\u9adb\u9adc\u9add\u9ade\u9adf\u9ae0\u9ae1\u9ae2\u9ae3\u9ae4\u9ae5\u9ae6\u9ae7\u9ae8\u9ae9\u9aea\u9aeb\u9aec\u9aed\u9aee\u9aef\u9af0\u9af1\u9af2\u9af3\u9af4\u9af5\u9af6\u9af7\u9af8\u9af9\u9afa\u9afb\u9afc\u9afd\u9afe\u9aff\u9b00\u9b01\u9b02\u9b03\u9b04\u9b05\u9b06\u9b07\u9b08\u9b09\u9b0a\u9b0b\u9b0c\u9b0d\u9b0e\u9b0f\u9b10\u9b11\u9b12\u9b13\u9b14\u9b15\u9b16\u9b17\u9b18\u9b19\u9b1a\u9b1b\u9b1c\u9b1d\u9b1e\u9b1f\u9b20\u9b21\u9b22\u9b23\u9b24\u9b25\u9b26\u9b27\u9b28\u9b29\u9b2a\u9b2b\u9b2c\u9b2d\u9b2e\u9b2f\u9b30\u9b31\u9b32\u9b33\u9b34\u9b35\u9b36\u9b37\u9b38\u9b39\u9b3a\u9b3b\u9b3c\u9b3d\u9b3e\u9b3f\u9b40\u9b41\u9b42\u9b43\u9b44\u9b45\u9b46\u9b47\u9b48\u9b49\u9b4a\u9b4b\u9b4c\u9b4d\u9b4e\u9b4f\u9b50\u9b51\u9b52\u9b53\u9b54\u9b55\u9b56\u9b57\u9b58\u9b59\u9b5a\u9b5b\u9b5c\u9b5d\u9b5e\u9b5f\u9b60\u9b61\u9b62\u9b63\u9b64\u9b65\u9b66\u9b67\u9b68\u9b69\u9b6a\u9b6b\u9b6c\u9b6d\u9b6e\u9b6f\u9b70\u9b71\u9b72\u9b73\u9b74\u9b75\u9b76\u9b77\u9b78\u9b79\u9b7a\u9b7b\u9b7c\u9b7d\u9b7e\u9b7f\u9b80\u9b81\u9b82\u9b83\u9b84\u9b85\u9b86\u9b87\u9b88\u9b89\u9b8a\u9b8b\u9b8c\u9b8d\u9b8e\u9b8f\u9b90\u9b91\u9b92\u9b93\u9b94\u9b95\u9b96\u9b97\u9b98\u9b99\u9b9a\u9b9b\u9b9c\u9b9d\u9b9e\u9b9f\u9ba0\u9ba1\u9ba2\u9ba3\u9ba4\u9ba5\u9ba6\u9ba7\u9ba8\u9ba9\u9baa\u9bab\u9bac\u9bad\u9bae\u9baf\u9bb0\u9bb1\u9bb2\u9bb3\u9bb4\u9bb5\u9bb6\u9bb7\u9bb8\u9bb9\u9bba\u9bbb\u9bbc\u9bbd\u9bbe\u9bbf\u9bc0\u9bc1\u9bc2\u9bc3\u9bc4\u9bc5\u9bc6\u9bc7\u9bc8\u9bc9\u9bca\u9bcb\u9bcc\u9bcd\u9bce\u9bcf\u9bd0\u9bd1\u9bd2\u9bd3\u9bd4\u9bd5\u9bd6\u9bd7\u9bd8\u9bd9\u9bda\u9bdb\u9bdc\u9bdd\u9bde\u9bdf\u9be0\u9be1\u9be2\u9be3\u9be4\u9be5\u9be6\u9be7\u9be8\u9be9\u9bea\u9beb\u9bec\u9bed\u9bee\u9bef\u9bf0\u9bf1\u9bf2\u9bf3\u9bf4\u9bf5\u9bf6\u9bf7\u9bf8\u9bf9\u9bfa\u9bfb\u9bfc\u9bfd\u9bfe\u9bff\u9c00\u9c01\u9c02\u9c03\u9c04\u9c05\u9c06\u9c07\u9c08\u9c09\u9c0a\u9c0b\u9c0c\u9c0d\u9c0e\u9c0f\u9c10\u9c11\u9c12\u9c13\u9c14\u9c15\u9c16\u9c17\u9c18\u9c19\u9c1a\u9c1b\u9c1c\u9c1d\u9c1e\u9c1f\u9c20\u9c21\u9c22\u9c23\u9c24\u9c25\u9c26\u9c27\u9c28\u9c29\u9c2a\u9c2b\u9c2c\u9c2d\u9c2e\u9c2f\u9c30\u9c31\u9c32\u9c33\u9c34\u9c35\u9c36\u9c37\u9c38\u9c39\u9c3a\u9c3b\u9c3c\u9c3d\u9c3e\u9c3f\u9c40\u9c41\u9c42\u9c43\u9c44\u9c45\u9c46\u9c47\u9c48\u9c49\u9c4a\u9c4b\u9c4c\u9c4d\u9c4e\u9c4f\u9c50\u9c51\u9c52\u9c53\u9c54\u9c55\u9c56\u9c57\u9c58\u9c59\u9c5a\u9c5b\u9c5c\u9c5d\u9c5e\u9c5f\u9c60\u9c61\u9c62\u9c63\u9c64\u9c65\u9c66\u9c67\u9c68\u9c69\u9c6a\u9c6b\u9c6c\u9c6d\u9c6e\u9c6f\u9c70\u9c71\u9c72\u9c73\u9c74\u9c75\u9c76\u9c77\u9c78\u9c79\u9c7a\u9c7b\u9c7c\u9c7d\u9c7e\u9c7f\u9c80\u9c81\u9c82\u9c83\u9c84\u9c85\u9c86\u9c87\u9c88\u9c89\u9c8a\u9c8b\u9c8c\u9c8d\u9c8e\u9c8f\u9c90\u9c91\u9c92\u9c93\u9c94\u9c95\u9c96\u9c97\u9c98\u9c99\u9c9a\u9c9b\u9c9c\u9c9d\u9c9e\u9c9f\u9ca0\u9ca1\u9ca2\u9ca3\u9ca4\u9ca5\u9ca6\u9ca7\u9ca8\u9ca9\u9caa\u9cab\u9cac\u9cad\u9cae\u9caf\u9cb0\u9cb1\u9cb2\u9cb3\u9cb4\u9cb5\u9cb6\u9cb7\u9cb8\u9cb9\u9cba\u9cbb\u9cbc\u9cbd\u9cbe\u9cbf\u9cc0\u9cc1\u9cc2\u9cc3\u9cc4\u9cc5\u9cc6\u9cc7\u9cc8\u9cc9\u9cca\u9ccb\u9ccc\u9ccd\u9cce\u9ccf\u9cd0\u9cd1\u9cd2\u9cd3\u9cd4\u9cd5\u9cd6\u9cd7\u9cd8\u9cd9\u9cda\u9cdb\u9cdc\u9cdd\u9cde\u9cdf\u9ce0\u9ce1\u9ce2\u9ce3\u9ce4\u9ce5\u9ce6\u9ce7\u9ce8\u9ce9\u9cea\u9ceb\u9cec\u9ced\u9cee\u9cef\u9cf0\u9cf1\u9cf2\u9cf3\u9cf4\u9cf5\u9cf6\u9cf7\u9cf8\u9cf9\u9cfa\u9cfb\u9cfc\u9cfd\u9cfe\u9cff\u9d00\u9d01\u9d02\u9d03\u9d04\u9d05\u9d06\u9d07\u9d08\u9d09\u9d0a\u9d0b\u9d0c\u9d0d\u9d0e\u9d0f\u9d10\u9d11\u9d12\u9d13\u9d14\u9d15\u9d16\u9d17\u9d18\u9d19\u9d1a\u9d1b\u9d1c\u9d1d\u9d1e\u9d1f\u9d20\u9d21\u9d22\u9d23\u9d24\u9d25\u9d26\u9d27\u9d28\u9d29\u9d2a\u9d2b\u9d2c\u9d2d\u9d2e\u9d2f\u9d30\u9d31\u9d32\u9d33\u9d34\u9d35\u9d36\u9d37\u9d38\u9d39\u9d3a\u9d3b\u9d3c\u9d3d\u9d3e\u9d3f\u9d40\u9d41\u9d42\u9d43\u9d44\u9d45\u9d46\u9d47\u9d48\u9d49\u9d4a\u9d4b\u9d4c\u9d4d\u9d4e\u9d4f\u9d50\u9d51\u9d52\u9d53\u9d54\u9d55\u9d56\u9d57\u9d58\u9d59\u9d5a\u9d5b\u9d5c\u9d5d\u9d5e\u9d5f\u9d60\u9d61\u9d62\u9d63\u9d64\u9d65\u9d66\u9d67\u9d68\u9d69\u9d6a\u9d6b\u9d6c\u9d6d\u9d6e\u9d6f\u9d70\u9d71\u9d72\u9d73\u9d74\u9d75\u9d76\u9d77\u9d78\u9d79\u9d7a\u9d7b\u9d7c\u9d7d\u9d7e\u9d7f\u9d80\u9d81\u9d82\u9d83\u9d84\u9d85\u9d86\u9d87\u9d88\u9d89\u9d8a\u9d8b\u9d8c\u9d8d\u9d8e\u9d8f\u9d90\u9d91\u9d92\u9d93\u9d94\u9d95\u9d96\u9d97\u9d98\u9d99\u9d9a\u9d9b\u9d9c\u9d9d\u9d9e\u9d9f\u9da0\u9da1\u9da2\u9da3\u9da4\u9da5\u9da6\u9da7\u9da8\u9da9\u9daa\u9dab\u9dac\u9dad\u9dae\u9daf\u9db0\u9db1\u9db2\u9db3\u9db4\u9db5\u9db6\u9db7\u9db8\u9db9\u9dba\u9dbb\u9dbc\u9dbd\u9dbe\u9dbf\u9dc0\u9dc1\u9dc2\u9dc3\u9dc4\u9dc5\u9dc6\u9dc7\u9dc8\u9dc9\u9dca\u9dcb\u9dcc\u9dcd\u9dce\u9dcf\u9dd0\u9dd1\u9dd2\u9dd3\u9dd4\u9dd5\u9dd6\u9dd7\u9dd8\u9dd9\u9dda\u9ddb\u9ddc\u9ddd\u9dde\u9ddf\u9de0\u9de1\u9de2\u9de3\u9de4\u9de5\u9de6\u9de7\u9de8\u9de9\u9dea\u9deb\u9dec\u9ded\u9dee\u9def\u9df0\u9df1\u9df2\u9df3\u9df4\u9df5\u9df6\u9df7\u9df8\u9df9\u9dfa\u9dfb\u9dfc\u9dfd\u9dfe\u9dff\u9e00\u9e01\u9e02\u9e03\u9e04\u9e05\u9e06\u9e07\u9e08\u9e09\u9e0a\u9e0b\u9e0c\u9e0d\u9e0e\u9e0f\u9e10\u9e11\u9e12\u9e13\u9e14\u9e15\u9e16\u9e17\u9e18\u9e19\u9e1a\u9e1b\u9e1c\u9e1d\u9e1e\u9e1f\u9e20\u9e21\u9e22\u9e23\u9e24\u9e25\u9e26\u9e27\u9e28\u9e29\u9e2a\u9e2b\u9e2c\u9e2d\u9e2e\u9e2f\u9e30\u9e31\u9e32\u9e33\u9e34\u9e35\u9e36\u9e37\u9e38\u9e39\u9e3a\u9e3b\u9e3c\u9e3d\u9e3e\u9e3f\u9e40\u9e41\u9e42\u9e43\u9e44\u9e45\u9e46\u9e47\u9e48\u9e49\u9e4a\u9e4b\u9e4c\u9e4d\u9e4e\u9e4f\u9e50\u9e51\u9e52\u9e53\u9e54\u9e55\u9e56\u9e57\u9e58\u9e59\u9e5a\u9e5b\u9e5c\u9e5d\u9e5e\u9e5f\u9e60\u9e61\u9e62\u9e63\u9e64\u9e65\u9e66\u9e67\u9e68\u9e69\u9e6a\u9e6b\u9e6c\u9e6d\u9e6e\u9e6f\u9e70\u9e71\u9e72\u9e73\u9e74\u9e75\u9e76\u9e77\u9e78\u9e79\u9e7a\u9e7b\u9e7c\u9e7d\u9e7e\u9e7f\u9e80\u9e81\u9e82\u9e83\u9e84\u9e85\u9e86\u9e87\u9e88\u9e89\u9e8a\u9e8b\u9e8c\u9e8d\u9e8e\u9e8f\u9e90\u9e91\u9e92\u9e93\u9e94\u9e95\u9e96\u9e97\u9e98\u9e99\u9e9a\u9e9b\u9e9c\u9e9d\u9e9e\u9e9f\u9ea0\u9ea1\u9ea2\u9ea3\u9ea4\u9ea5\u9ea6\u9ea7\u9ea8\u9ea9\u9eaa\u9eab\u9eac\u9ead\u9eae\u9eaf\u9eb0\u9eb1\u9eb2\u9eb3\u9eb4\u9eb5\u9eb6\u9eb7\u9eb8\u9eb9\u9eba\u9ebb\u9ebc\u9ebd\u9ebe\u9ebf\u9ec0\u9ec1\u9ec2\u9ec3\u9ec4\u9ec5\u9ec6\u9ec7\u9ec8\u9ec9\u9eca\u9ecb\u9ecc\u9ecd\u9ece\u9ecf\u9ed0\u9ed1\u9ed2\u9ed3\u9ed4\u9ed5\u9ed6\u9ed7\u9ed8\u9ed9\u9eda\u9edb\u9edc\u9edd\u9ede\u9edf\u9ee0\u9ee1\u9ee2\u9ee3\u9ee4\u9ee5\u9ee6\u9ee7\u9ee8\u9ee9\u9eea\u9eeb\u9eec\u9eed\u9eee\u9eef\u9ef0\u9ef1\u9ef2\u9ef3\u9ef4\u9ef5\u9ef6\u9ef7\u9ef8\u9ef9\u9efa\u9efb\u9efc\u9efd\u9efe\u9eff\u9f00\u9f01\u9f02\u9f03\u9f04\u9f05\u9f06\u9f07\u9f08\u9f09\u9f0a\u9f0b\u9f0c\u9f0d\u9f0e\u9f0f\u9f10\u9f11\u9f12\u9f13\u9f14\u9f15\u9f16\u9f17\u9f18\u9f19\u9f1a\u9f1b\u9f1c\u9f1d\u9f1e\u9f1f\u9f20\u9f21\u9f22\u9f23\u9f24\u9f25\u9f26\u9f27\u9f28\u9f29\u9f2a\u9f2b\u9f2c\u9f2d\u9f2e\u9f2f\u9f30\u9f31\u9f32\u9f33\u9f34\u9f35\u9f36\u9f37\u9f38\u9f39\u9f3a\u9f3b\u9f3c\u9f3d\u9f3e\u9f3f\u9f40\u9f41\u9f42\u9f43\u9f44\u9f45\u9f46\u9f47\u9f48\u9f49\u9f4a\u9f4b\u9f4c\u9f4d\u9f4e\u9f4f\u9f50\u9f51\u9f52\u9f53\u9f54\u9f55\u9f56\u9f57\u9f58\u9f59\u9f5a\u9f5b\u9f5c\u9f5d\u9f5e\u9f5f\u9f60\u9f61\u9f62\u9f63\u9f64\u9f65\u9f66\u9f67\u9f68\u9f69\u9f6a\u9f6b\u9f6c\u9f6d\u9f6e\u9f6f\u9f70\u9f71\u9f72\u9f73\u9f74\u9f75\u9f76\u9f77\u9f78\u9f79\u9f7a\u9f7b\u9f7c\u9f7d\u9f7e\u9f7f\u9f80\u9f81\u9f82\u9f83\u9f84\u9f85\u9f86\u9f87\u9f88\u9f89\u9f8a\u9f8b\u9f8c\u9f8d\u9f8e\u9f8f\u9f90\u9f91\u9f92\u9f93\u9f94\u9f95\u9f96\u9f97\u9f98\u9f99\u9f9a\u9f9b\u9f9c\u9f9d\u9f9e\u9f9f\u9fa0\u9fa1\u9fa2\u9fa3\u9fa4\u9fa5\u9fa6\u9fa7\u9fa8\u9fa9\u9faa\u9fab\u9fac\u9fad\u9fae\u9faf\u9fb0\u9fb1\u9fb2\u9fb3\u9fb4\u9fb5\u9fb6\u9fb7\u9fb8\u9fb9\u9fba\u9fbb\ua000\ua001\ua002\ua003\ua004\ua005\ua006\ua007\ua008\ua009\ua00a\ua00b\ua00c\ua00d\ua00e\ua00f\ua010\ua011\ua012\ua013\ua014\ua016\ua017\ua018\ua019\ua01a\ua01b\ua01c\ua01d\ua01e\ua01f\ua020\ua021\ua022\ua023\ua024\ua025\ua026\ua027\ua028\ua029\ua02a\ua02b\ua02c\ua02d\ua02e\ua02f\ua030\ua031\ua032\ua033\ua034\ua035\ua036\ua037\ua038\ua039\ua03a\ua03b\ua03c\ua03d\ua03e\ua03f\ua040\ua041\ua042\ua043\ua044\ua045\ua046\ua047\ua048\ua049\ua04a\ua04b\ua04c\ua04d\ua04e\ua04f\ua050\ua051\ua052\ua053\ua054\ua055\ua056\ua057\ua058\ua059\ua05a\ua05b\ua05c\ua05d\ua05e\ua05f\ua060\ua061\ua062\ua063\ua064\ua065\ua066\ua067\ua068\ua069\ua06a\ua06b\ua06c\ua06d\ua06e\ua06f\ua070\ua071\ua072\ua073\ua074\ua075\ua076\ua077\ua078\ua079\ua07a\ua07b\ua07c\ua07d\ua07e\ua07f\ua080\ua081\ua082\ua083\ua084\ua085\ua086\ua087\ua088\ua089\ua08a\ua08b\ua08c\ua08d\ua08e\ua08f\ua090\ua091\ua092\ua093\ua094\ua095\ua096\ua097\ua098\ua099\ua09a\ua09b\ua09c\ua09d\ua09e\ua09f\ua0a0\ua0a1\ua0a2\ua0a3\ua0a4\ua0a5\ua0a6\ua0a7\ua0a8\ua0a9\ua0aa\ua0ab\ua0ac\ua0ad\ua0ae\ua0af\ua0b0\ua0b1\ua0b2\ua0b3\ua0b4\ua0b5\ua0b6\ua0b7\ua0b8\ua0b9\ua0ba\ua0bb\ua0bc\ua0bd\ua0be\ua0bf\ua0c0\ua0c1\ua0c2\ua0c3\ua0c4\ua0c5\ua0c6\ua0c7\ua0c8\ua0c9\ua0ca\ua0cb\ua0cc\ua0cd\ua0ce\ua0cf\ua0d0\ua0d1\ua0d2\ua0d3\ua0d4\ua0d5\ua0d6\ua0d7\ua0d8\ua0d9\ua0da\ua0db\ua0dc\ua0dd\ua0de\ua0df\ua0e0\ua0e1\ua0e2\ua0e3\ua0e4\ua0e5\ua0e6\ua0e7\ua0e8\ua0e9\ua0ea\ua0eb\ua0ec\ua0ed\ua0ee\ua0ef\ua0f0\ua0f1\ua0f2\ua0f3\ua0f4\ua0f5\ua0f6\ua0f7\ua0f8\ua0f9\ua0fa\ua0fb\ua0fc\ua0fd\ua0fe\ua0ff\ua100\ua101\ua102\ua103\ua104\ua105\ua106\ua107\ua108\ua109\ua10a\ua10b\ua10c\ua10d\ua10e\ua10f\ua110\ua111\ua112\ua113\ua114\ua115\ua116\ua117\ua118\ua119\ua11a\ua11b\ua11c\ua11d\ua11e\ua11f\ua120\ua121\ua122\ua123\ua124\ua125\ua126\ua127\ua128\ua129\ua12a\ua12b\ua12c\ua12d\ua12e\ua12f\ua130\ua131\ua132\ua133\ua134\ua135\ua136\ua137\ua138\ua139\ua13a\ua13b\ua13c\ua13d\ua13e\ua13f\ua140\ua141\ua142\ua143\ua144\ua145\ua146\ua147\ua148\ua149\ua14a\ua14b\ua14c\ua14d\ua14e\ua14f\ua150\ua151\ua152\ua153\ua154\ua155\ua156\ua157\ua158\ua159\ua15a\ua15b\ua15c\ua15d\ua15e\ua15f\ua160\ua161\ua162\ua163\ua164\ua165\ua166\ua167\ua168\ua169\ua16a\ua16b\ua16c\ua16d\ua16e\ua16f\ua170\ua171\ua172\ua173\ua174\ua175\ua176\ua177\ua178\ua179\ua17a\ua17b\ua17c\ua17d\ua17e\ua17f\ua180\ua181\ua182\ua183\ua184\ua185\ua186\ua187\ua188\ua189\ua18a\ua18b\ua18c\ua18d\ua18e\ua18f\ua190\ua191\ua192\ua193\ua194\ua195\ua196\ua197\ua198\ua199\ua19a\ua19b\ua19c\ua19d\ua19e\ua19f\ua1a0\ua1a1\ua1a2\ua1a3\ua1a4\ua1a5\ua1a6\ua1a7\ua1a8\ua1a9\ua1aa\ua1ab\ua1ac\ua1ad\ua1ae\ua1af\ua1b0\ua1b1\ua1b2\ua1b3\ua1b4\ua1b5\ua1b6\ua1b7\ua1b8\ua1b9\ua1ba\ua1bb\ua1bc\ua1bd\ua1be\ua1bf\ua1c0\ua1c1\ua1c2\ua1c3\ua1c4\ua1c5\ua1c6\ua1c7\ua1c8\ua1c9\ua1ca\ua1cb\ua1cc\ua1cd\ua1ce\ua1cf\ua1d0\ua1d1\ua1d2\ua1d3\ua1d4\ua1d5\ua1d6\ua1d7\ua1d8\ua1d9\ua1da\ua1db\ua1dc\ua1dd\ua1de\ua1df\ua1e0\ua1e1\ua1e2\ua1e3\ua1e4\ua1e5\ua1e6\ua1e7\ua1e8\ua1e9\ua1ea\ua1eb\ua1ec\ua1ed\ua1ee\ua1ef\ua1f0\ua1f1\ua1f2\ua1f3\ua1f4\ua1f5\ua1f6\ua1f7\ua1f8\ua1f9\ua1fa\ua1fb\ua1fc\ua1fd\ua1fe\ua1ff\ua200\ua201\ua202\ua203\ua204\ua205\ua206\ua207\ua208\ua209\ua20a\ua20b\ua20c\ua20d\ua20e\ua20f\ua210\ua211\ua212\ua213\ua214\ua215\ua216\ua217\ua218\ua219\ua21a\ua21b\ua21c\ua21d\ua21e\ua21f\ua220\ua221\ua222\ua223\ua224\ua225\ua226\ua227\ua228\ua229\ua22a\ua22b\ua22c\ua22d\ua22e\ua22f\ua230\ua231\ua232\ua233\ua234\ua235\ua236\ua237\ua238\ua239\ua23a\ua23b\ua23c\ua23d\ua23e\ua23f\ua240\ua241\ua242\ua243\ua244\ua245\ua246\ua247\ua248\ua249\ua24a\ua24b\ua24c\ua24d\ua24e\ua24f\ua250\ua251\ua252\ua253\ua254\ua255\ua256\ua257\ua258\ua259\ua25a\ua25b\ua25c\ua25d\ua25e\ua25f\ua260\ua261\ua262\ua263\ua264\ua265\ua266\ua267\ua268\ua269\ua26a\ua26b\ua26c\ua26d\ua26e\ua26f\ua270\ua271\ua272\ua273\ua274\ua275\ua276\ua277\ua278\ua279\ua27a\ua27b\ua27c\ua27d\ua27e\ua27f\ua280\ua281\ua282\ua283\ua284\ua285\ua286\ua287\ua288\ua289\ua28a\ua28b\ua28c\ua28d\ua28e\ua28f\ua290\ua291\ua292\ua293\ua294\ua295\ua296\ua297\ua298\ua299\ua29a\ua29b\ua29c\ua29d\ua29e\ua29f\ua2a0\ua2a1\ua2a2\ua2a3\ua2a4\ua2a5\ua2a6\ua2a7\ua2a8\ua2a9\ua2aa\ua2ab\ua2ac\ua2ad\ua2ae\ua2af\ua2b0\ua2b1\ua2b2\ua2b3\ua2b4\ua2b5\ua2b6\ua2b7\ua2b8\ua2b9\ua2ba\ua2bb\ua2bc\ua2bd\ua2be\ua2bf\ua2c0\ua2c1\ua2c2\ua2c3\ua2c4\ua2c5\ua2c6\ua2c7\ua2c8\ua2c9\ua2ca\ua2cb\ua2cc\ua2cd\ua2ce\ua2cf\ua2d0\ua2d1\ua2d2\ua2d3\ua2d4\ua2d5\ua2d6\ua2d7\ua2d8\ua2d9\ua2da\ua2db\ua2dc\ua2dd\ua2de\ua2df\ua2e0\ua2e1\ua2e2\ua2e3\ua2e4\ua2e5\ua2e6\ua2e7\ua2e8\ua2e9\ua2ea\ua2eb\ua2ec\ua2ed\ua2ee\ua2ef\ua2f0\ua2f1\ua2f2\ua2f3\ua2f4\ua2f5\ua2f6\ua2f7\ua2f8\ua2f9\ua2fa\ua2fb\ua2fc\ua2fd\ua2fe\ua2ff\ua300\ua301\ua302\ua303\ua304\ua305\ua306\ua307\ua308\ua309\ua30a\ua30b\ua30c\ua30d\ua30e\ua30f\ua310\ua311\ua312\ua313\ua314\ua315\ua316\ua317\ua318\ua319\ua31a\ua31b\ua31c\ua31d\ua31e\ua31f\ua320\ua321\ua322\ua323\ua324\ua325\ua326\ua327\ua328\ua329\ua32a\ua32b\ua32c\ua32d\ua32e\ua32f\ua330\ua331\ua332\ua333\ua334\ua335\ua336\ua337\ua338\ua339\ua33a\ua33b\ua33c\ua33d\ua33e\ua33f\ua340\ua341\ua342\ua343\ua344\ua345\ua346\ua347\ua348\ua349\ua34a\ua34b\ua34c\ua34d\ua34e\ua34f\ua350\ua351\ua352\ua353\ua354\ua355\ua356\ua357\ua358\ua359\ua35a\ua35b\ua35c\ua35d\ua35e\ua35f\ua360\ua361\ua362\ua363\ua364\ua365\ua366\ua367\ua368\ua369\ua36a\ua36b\ua36c\ua36d\ua36e\ua36f\ua370\ua371\ua372\ua373\ua374\ua375\ua376\ua377\ua378\ua379\ua37a\ua37b\ua37c\ua37d\ua37e\ua37f\ua380\ua381\ua382\ua383\ua384\ua385\ua386\ua387\ua388\ua389\ua38a\ua38b\ua38c\ua38d\ua38e\ua38f\ua390\ua391\ua392\ua393\ua394\ua395\ua396\ua397\ua398\ua399\ua39a\ua39b\ua39c\ua39d\ua39e\ua39f\ua3a0\ua3a1\ua3a2\ua3a3\ua3a4\ua3a5\ua3a6\ua3a7\ua3a8\ua3a9\ua3aa\ua3ab\ua3ac\ua3ad\ua3ae\ua3af\ua3b0\ua3b1\ua3b2\ua3b3\ua3b4\ua3b5\ua3b6\ua3b7\ua3b8\ua3b9\ua3ba\ua3bb\ua3bc\ua3bd\ua3be\ua3bf\ua3c0\ua3c1\ua3c2\ua3c3\ua3c4\ua3c5\ua3c6\ua3c7\ua3c8\ua3c9\ua3ca\ua3cb\ua3cc\ua3cd\ua3ce\ua3cf\ua3d0\ua3d1\ua3d2\ua3d3\ua3d4\ua3d5\ua3d6\ua3d7\ua3d8\ua3d9\ua3da\ua3db\ua3dc\ua3dd\ua3de\ua3df\ua3e0\ua3e1\ua3e2\ua3e3\ua3e4\ua3e5\ua3e6\ua3e7\ua3e8\ua3e9\ua3ea\ua3eb\ua3ec\ua3ed\ua3ee\ua3ef\ua3f0\ua3f1\ua3f2\ua3f3\ua3f4\ua3f5\ua3f6\ua3f7\ua3f8\ua3f9\ua3fa\ua3fb\ua3fc\ua3fd\ua3fe\ua3ff\ua400\ua401\ua402\ua403\ua404\ua405\ua406\ua407\ua408\ua409\ua40a\ua40b\ua40c\ua40d\ua40e\ua40f\ua410\ua411\ua412\ua413\ua414\ua415\ua416\ua417\ua418\ua419\ua41a\ua41b\ua41c\ua41d\ua41e\ua41f\ua420\ua421\ua422\ua423\ua424\ua425\ua426\ua427\ua428\ua429\ua42a\ua42b\ua42c\ua42d\ua42e\ua42f\ua430\ua431\ua432\ua433\ua434\ua435\ua436\ua437\ua438\ua439\ua43a\ua43b\ua43c\ua43d\ua43e\ua43f\ua440\ua441\ua442\ua443\ua444\ua445\ua446\ua447\ua448\ua449\ua44a\ua44b\ua44c\ua44d\ua44e\ua44f\ua450\ua451\ua452\ua453\ua454\ua455\ua456\ua457\ua458\ua459\ua45a\ua45b\ua45c\ua45d\ua45e\ua45f\ua460\ua461\ua462\ua463\ua464\ua465\ua466\ua467\ua468\ua469\ua46a\ua46b\ua46c\ua46d\ua46e\ua46f\ua470\ua471\ua472\ua473\ua474\ua475\ua476\ua477\ua478\ua479\ua47a\ua47b\ua47c\ua47d\ua47e\ua47f\ua480\ua481\ua482\ua483\ua484\ua485\ua486\ua487\ua488\ua489\ua48a\ua48b\ua48c\ua800\ua801\ua803\ua804\ua805\ua807\ua808\ua809\ua80a\ua80c\ua80d\ua80e\ua80f\ua810\ua811\ua812\ua813\ua814\ua815\ua816\ua817\ua818\ua819\ua81a\ua81b\ua81c\ua81d\ua81e\ua81f\ua820\ua821\ua822\uac00\uac01\uac02\uac03\uac04\uac05\uac06\uac07\uac08\uac09\uac0a\uac0b\uac0c\uac0d\uac0e\uac0f\uac10\uac11\uac12\uac13\uac14\uac15\uac16\uac17\uac18\uac19\uac1a\uac1b\uac1c\uac1d\uac1e\uac1f\uac20\uac21\uac22\uac23\uac24\uac25\uac26\uac27\uac28\uac29\uac2a\uac2b\uac2c\uac2d\uac2e\uac2f\uac30\uac31\uac32\uac33\uac34\uac35\uac36\uac37\uac38\uac39\uac3a\uac3b\uac3c\uac3d\uac3e\uac3f\uac40\uac41\uac42\uac43\uac44\uac45\uac46\uac47\uac48\uac49\uac4a\uac4b\uac4c\uac4d\uac4e\uac4f\uac50\uac51\uac52\uac53\uac54\uac55\uac56\uac57\uac58\uac59\uac5a\uac5b\uac5c\uac5d\uac5e\uac5f\uac60\uac61\uac62\uac63\uac64\uac65\uac66\uac67\uac68\uac69\uac6a\uac6b\uac6c\uac6d\uac6e\uac6f\uac70\uac71\uac72\uac73\uac74\uac75\uac76\uac77\uac78\uac79\uac7a\uac7b\uac7c\uac7d\uac7e\uac7f\uac80\uac81\uac82\uac83\uac84\uac85\uac86\uac87\uac88\uac89\uac8a\uac8b\uac8c\uac8d\uac8e\uac8f\uac90\uac91\uac92\uac93\uac94\uac95\uac96\uac97\uac98\uac99\uac9a\uac9b\uac9c\uac9d\uac9e\uac9f\uaca0\uaca1\uaca2\uaca3\uaca4\uaca5\uaca6\uaca7\uaca8\uaca9\uacaa\uacab\uacac\uacad\uacae\uacaf\uacb0\uacb1\uacb2\uacb3\uacb4\uacb5\uacb6\uacb7\uacb8\uacb9\uacba\uacbb\uacbc\uacbd\uacbe\uacbf\uacc0\uacc1\uacc2\uacc3\uacc4\uacc5\uacc6\uacc7\uacc8\uacc9\uacca\uaccb\uaccc\uaccd\uacce\uaccf\uacd0\uacd1\uacd2\uacd3\uacd4\uacd5\uacd6\uacd7\uacd8\uacd9\uacda\uacdb\uacdc\uacdd\uacde\uacdf\uace0\uace1\uace2\uace3\uace4\uace5\uace6\uace7\uace8\uace9\uacea\uaceb\uacec\uaced\uacee\uacef\uacf0\uacf1\uacf2\uacf3\uacf4\uacf5\uacf6\uacf7\uacf8\uacf9\uacfa\uacfb\uacfc\uacfd\uacfe\uacff\uad00\uad01\uad02\uad03\uad04\uad05\uad06\uad07\uad08\uad09\uad0a\uad0b\uad0c\uad0d\uad0e\uad0f\uad10\uad11\uad12\uad13\uad14\uad15\uad16\uad17\uad18\uad19\uad1a\uad1b\uad1c\uad1d\uad1e\uad1f\uad20\uad21\uad22\uad23\uad24\uad25\uad26\uad27\uad28\uad29\uad2a\uad2b\uad2c\uad2d\uad2e\uad2f\uad30\uad31\uad32\uad33\uad34\uad35\uad36\uad37\uad38\uad39\uad3a\uad3b\uad3c\uad3d\uad3e\uad3f\uad40\uad41\uad42\uad43\uad44\uad45\uad46\uad47\uad48\uad49\uad4a\uad4b\uad4c\uad4d\uad4e\uad4f\uad50\uad51\uad52\uad53\uad54\uad55\uad56\uad57\uad58\uad59\uad5a\uad5b\uad5c\uad5d\uad5e\uad5f\uad60\uad61\uad62\uad63\uad64\uad65\uad66\uad67\uad68\uad69\uad6a\uad6b\uad6c\uad6d\uad6e\uad6f\uad70\uad71\uad72\uad73\uad74\uad75\uad76\uad77\uad78\uad79\uad7a\uad7b\uad7c\uad7d\uad7e\uad7f\uad80\uad81\uad82\uad83\uad84\uad85\uad86\uad87\uad88\uad89\uad8a\uad8b\uad8c\uad8d\uad8e\uad8f\uad90\uad91\uad92\uad93\uad94\uad95\uad96\uad97\uad98\uad99\uad9a\uad9b\uad9c\uad9d\uad9e\uad9f\uada0\uada1\uada2\uada3\uada4\uada5\uada6\uada7\uada8\uada9\uadaa\uadab\uadac\uadad\uadae\uadaf\uadb0\uadb1\uadb2\uadb3\uadb4\uadb5\uadb6\uadb7\uadb8\uadb9\uadba\uadbb\uadbc\uadbd\uadbe\uadbf\uadc0\uadc1\uadc2\uadc3\uadc4\uadc5\uadc6\uadc7\uadc8\uadc9\uadca\uadcb\uadcc\uadcd\uadce\uadcf\uadd0\uadd1\uadd2\uadd3\uadd4\uadd5\uadd6\uadd7\uadd8\uadd9\uadda\uaddb\uaddc\uaddd\uadde\uaddf\uade0\uade1\uade2\uade3\uade4\uade5\uade6\uade7\uade8\uade9\uadea\uadeb\uadec\uaded\uadee\uadef\uadf0\uadf1\uadf2\uadf3\uadf4\uadf5\uadf6\uadf7\uadf8\uadf9\uadfa\uadfb\uadfc\uadfd\uadfe\uadff\uae00\uae01\uae02\uae03\uae04\uae05\uae06\uae07\uae08\uae09\uae0a\uae0b\uae0c\uae0d\uae0e\uae0f\uae10\uae11\uae12\uae13\uae14\uae15\uae16\uae17\uae18\uae19\uae1a\uae1b\uae1c\uae1d\uae1e\uae1f\uae20\uae21\uae22\uae23\uae24\uae25\uae26\uae27\uae28\uae29\uae2a\uae2b\uae2c\uae2d\uae2e\uae2f\uae30\uae31\uae32\uae33\uae34\uae35\uae36\uae37\uae38\uae39\uae3a\uae3b\uae3c\uae3d\uae3e\uae3f\uae40\uae41\uae42\uae43\uae44\uae45\uae46\uae47\uae48\uae49\uae4a\uae4b\uae4c\uae4d\uae4e\uae4f\uae50\uae51\uae52\uae53\uae54\uae55\uae56\uae57\uae58\uae59\uae5a\uae5b\uae5c\uae5d\uae5e\uae5f\uae60\uae61\uae62\uae63\uae64\uae65\uae66\uae67\uae68\uae69\uae6a\uae6b\uae6c\uae6d\uae6e\uae6f\uae70\uae71\uae72\uae73\uae74\uae75\uae76\uae77\uae78\uae79\uae7a\uae7b\uae7c\uae7d\uae7e\uae7f\uae80\uae81\uae82\uae83\uae84\uae85\uae86\uae87\uae88\uae89\uae8a\uae8b\uae8c\uae8d\uae8e\uae8f\uae90\uae91\uae92\uae93\uae94\uae95\uae96\uae97\uae98\uae99\uae9a\uae9b\uae9c\uae9d\uae9e\uae9f\uaea0\uaea1\uaea2\uaea3\uaea4\uaea5\uaea6\uaea7\uaea8\uaea9\uaeaa\uaeab\uaeac\uaead\uaeae\uaeaf\uaeb0\uaeb1\uaeb2\uaeb3\uaeb4\uaeb5\uaeb6\uaeb7\uaeb8\uaeb9\uaeba\uaebb\uaebc\uaebd\uaebe\uaebf\uaec0\uaec1\uaec2\uaec3\uaec4\uaec5\uaec6\uaec7\uaec8\uaec9\uaeca\uaecb\uaecc\uaecd\uaece\uaecf\uaed0\uaed1\uaed2\uaed3\uaed4\uaed5\uaed6\uaed7\uaed8\uaed9\uaeda\uaedb\uaedc\uaedd\uaede\uaedf\uaee0\uaee1\uaee2\uaee3\uaee4\uaee5\uaee6\uaee7\uaee8\uaee9\uaeea\uaeeb\uaeec\uaeed\uaeee\uaeef\uaef0\uaef1\uaef2\uaef3\uaef4\uaef5\uaef6\uaef7\uaef8\uaef9\uaefa\uaefb\uaefc\uaefd\uaefe\uaeff\uaf00\uaf01\uaf02\uaf03\uaf04\uaf05\uaf06\uaf07\uaf08\uaf09\uaf0a\uaf0b\uaf0c\uaf0d\uaf0e\uaf0f\uaf10\uaf11\uaf12\uaf13\uaf14\uaf15\uaf16\uaf17\uaf18\uaf19\uaf1a\uaf1b\uaf1c\uaf1d\uaf1e\uaf1f\uaf20\uaf21\uaf22\uaf23\uaf24\uaf25\uaf26\uaf27\uaf28\uaf29\uaf2a\uaf2b\uaf2c\uaf2d\uaf2e\uaf2f\uaf30\uaf31\uaf32\uaf33\uaf34\uaf35\uaf36\uaf37\uaf38\uaf39\uaf3a\uaf3b\uaf3c\uaf3d\uaf3e\uaf3f\uaf40\uaf41\uaf42\uaf43\uaf44\uaf45\uaf46\uaf47\uaf48\uaf49\uaf4a\uaf4b\uaf4c\uaf4d\uaf4e\uaf4f\uaf50\uaf51\uaf52\uaf53\uaf54\uaf55\uaf56\uaf57\uaf58\uaf59\uaf5a\uaf5b\uaf5c\uaf5d\uaf5e\uaf5f\uaf60\uaf61\uaf62\uaf63\uaf64\uaf65\uaf66\uaf67\uaf68\uaf69\uaf6a\uaf6b\uaf6c\uaf6d\uaf6e\uaf6f\uaf70\uaf71\uaf72\uaf73\uaf74\uaf75\uaf76\uaf77\uaf78\uaf79\uaf7a\uaf7b\uaf7c\uaf7d\uaf7e\uaf7f\uaf80\uaf81\uaf82\uaf83\uaf84\uaf85\uaf86\uaf87\uaf88\uaf89\uaf8a\uaf8b\uaf8c\uaf8d\uaf8e\uaf8f\uaf90\uaf91\uaf92\uaf93\uaf94\uaf95\uaf96\uaf97\uaf98\uaf99\uaf9a\uaf9b\uaf9c\uaf9d\uaf9e\uaf9f\uafa0\uafa1\uafa2\uafa3\uafa4\uafa5\uafa6\uafa7\uafa8\uafa9\uafaa\uafab\uafac\uafad\uafae\uafaf\uafb0\uafb1\uafb2\uafb3\uafb4\uafb5\uafb6\uafb7\uafb8\uafb9\uafba\uafbb\uafbc\uafbd\uafbe\uafbf\uafc0\uafc1\uafc2\uafc3\uafc4\uafc5\uafc6\uafc7\uafc8\uafc9\uafca\uafcb\uafcc\uafcd\uafce\uafcf\uafd0\uafd1\uafd2\uafd3\uafd4\uafd5\uafd6\uafd7\uafd8\uafd9\uafda\uafdb\uafdc\uafdd\uafde\uafdf\uafe0\uafe1\uafe2\uafe3\uafe4\uafe5\uafe6\uafe7\uafe8\uafe9\uafea\uafeb\uafec\uafed\uafee\uafef\uaff0\uaff1\uaff2\uaff3\uaff4\uaff5\uaff6\uaff7\uaff8\uaff9\uaffa\uaffb\uaffc\uaffd\uaffe\uafff\ub000\ub001\ub002\ub003\ub004\ub005\ub006\ub007\ub008\ub009\ub00a\ub00b\ub00c\ub00d\ub00e\ub00f\ub010\ub011\ub012\ub013\ub014\ub015\ub016\ub017\ub018\ub019\ub01a\ub01b\ub01c\ub01d\ub01e\ub01f\ub020\ub021\ub022\ub023\ub024\ub025\ub026\ub027\ub028\ub029\ub02a\ub02b\ub02c\ub02d\ub02e\ub02f\ub030\ub031\ub032\ub033\ub034\ub035\ub036\ub037\ub038\ub039\ub03a\ub03b\ub03c\ub03d\ub03e\ub03f\ub040\ub041\ub042\ub043\ub044\ub045\ub046\ub047\ub048\ub049\ub04a\ub04b\ub04c\ub04d\ub04e\ub04f\ub050\ub051\ub052\ub053\ub054\ub055\ub056\ub057\ub058\ub059\ub05a\ub05b\ub05c\ub05d\ub05e\ub05f\ub060\ub061\ub062\ub063\ub064\ub065\ub066\ub067\ub068\ub069\ub06a\ub06b\ub06c\ub06d\ub06e\ub06f\ub070\ub071\ub072\ub073\ub074\ub075\ub076\ub077\ub078\ub079\ub07a\ub07b\ub07c\ub07d\ub07e\ub07f\ub080\ub081\ub082\ub083\ub084\ub085\ub086\ub087\ub088\ub089\ub08a\ub08b\ub08c\ub08d\ub08e\ub08f\ub090\ub091\ub092\ub093\ub094\ub095\ub096\ub097\ub098\ub099\ub09a\ub09b\ub09c\ub09d\ub09e\ub09f\ub0a0\ub0a1\ub0a2\ub0a3\ub0a4\ub0a5\ub0a6\ub0a7\ub0a8\ub0a9\ub0aa\ub0ab\ub0ac\ub0ad\ub0ae\ub0af\ub0b0\ub0b1\ub0b2\ub0b3\ub0b4\ub0b5\ub0b6\ub0b7\ub0b8\ub0b9\ub0ba\ub0bb\ub0bc\ub0bd\ub0be\ub0bf\ub0c0\ub0c1\ub0c2\ub0c3\ub0c4\ub0c5\ub0c6\ub0c7\ub0c8\ub0c9\ub0ca\ub0cb\ub0cc\ub0cd\ub0ce\ub0cf\ub0d0\ub0d1\ub0d2\ub0d3\ub0d4\ub0d5\ub0d6\ub0d7\ub0d8\ub0d9\ub0da\ub0db\ub0dc\ub0dd\ub0de\ub0df\ub0e0\ub0e1\ub0e2\ub0e3\ub0e4\ub0e5\ub0e6\ub0e7\ub0e8\ub0e9\ub0ea\ub0eb\ub0ec\ub0ed\ub0ee\ub0ef\ub0f0\ub0f1\ub0f2\ub0f3\ub0f4\ub0f5\ub0f6\ub0f7\ub0f8\ub0f9\ub0fa\ub0fb\ub0fc\ub0fd\ub0fe\ub0ff\ub100\ub101\ub102\ub103\ub104\ub105\ub106\ub107\ub108\ub109\ub10a\ub10b\ub10c\ub10d\ub10e\ub10f\ub110\ub111\ub112\ub113\ub114\ub115\ub116\ub117\ub118\ub119\ub11a\ub11b\ub11c\ub11d\ub11e\ub11f\ub120\ub121\ub122\ub123\ub124\ub125\ub126\ub127\ub128\ub129\ub12a\ub12b\ub12c\ub12d\ub12e\ub12f\ub130\ub131\ub132\ub133\ub134\ub135\ub136\ub137\ub138\ub139\ub13a\ub13b\ub13c\ub13d\ub13e\ub13f\ub140\ub141\ub142\ub143\ub144\ub145\ub146\ub147\ub148\ub149\ub14a\ub14b\ub14c\ub14d\ub14e\ub14f\ub150\ub151\ub152\ub153\ub154\ub155\ub156\ub157\ub158\ub159\ub15a\ub15b\ub15c\ub15d\ub15e\ub15f\ub160\ub161\ub162\ub163\ub164\ub165\ub166\ub167\ub168\ub169\ub16a\ub16b\ub16c\ub16d\ub16e\ub16f\ub170\ub171\ub172\ub173\ub174\ub175\ub176\ub177\ub178\ub179\ub17a\ub17b\ub17c\ub17d\ub17e\ub17f\ub180\ub181\ub182\ub183\ub184\ub185\ub186\ub187\ub188\ub189\ub18a\ub18b\ub18c\ub18d\ub18e\ub18f\ub190\ub191\ub192\ub193\ub194\ub195\ub196\ub197\ub198\ub199\ub19a\ub19b\ub19c\ub19d\ub19e\ub19f\ub1a0\ub1a1\ub1a2\ub1a3\ub1a4\ub1a5\ub1a6\ub1a7\ub1a8\ub1a9\ub1aa\ub1ab\ub1ac\ub1ad\ub1ae\ub1af\ub1b0\ub1b1\ub1b2\ub1b3\ub1b4\ub1b5\ub1b6\ub1b7\ub1b8\ub1b9\ub1ba\ub1bb\ub1bc\ub1bd\ub1be\ub1bf\ub1c0\ub1c1\ub1c2\ub1c3\ub1c4\ub1c5\ub1c6\ub1c7\ub1c8\ub1c9\ub1ca\ub1cb\ub1cc\ub1cd\ub1ce\ub1cf\ub1d0\ub1d1\ub1d2\ub1d3\ub1d4\ub1d5\ub1d6\ub1d7\ub1d8\ub1d9\ub1da\ub1db\ub1dc\ub1dd\ub1de\ub1df\ub1e0\ub1e1\ub1e2\ub1e3\ub1e4\ub1e5\ub1e6\ub1e7\ub1e8\ub1e9\ub1ea\ub1eb\ub1ec\ub1ed\ub1ee\ub1ef\ub1f0\ub1f1\ub1f2\ub1f3\ub1f4\ub1f5\ub1f6\ub1f7\ub1f8\ub1f9\ub1fa\ub1fb\ub1fc\ub1fd\ub1fe\ub1ff\ub200\ub201\ub202\ub203\ub204\ub205\ub206\ub207\ub208\ub209\ub20a\ub20b\ub20c\ub20d\ub20e\ub20f\ub210\ub211\ub212\ub213\ub214\ub215\ub216\ub217\ub218\ub219\ub21a\ub21b\ub21c\ub21d\ub21e\ub21f\ub220\ub221\ub222\ub223\ub224\ub225\ub226\ub227\ub228\ub229\ub22a\ub22b\ub22c\ub22d\ub22e\ub22f\ub230\ub231\ub232\ub233\ub234\ub235\ub236\ub237\ub238\ub239\ub23a\ub23b\ub23c\ub23d\ub23e\ub23f\ub240\ub241\ub242\ub243\ub244\ub245\ub246\ub247\ub248\ub249\ub24a\ub24b\ub24c\ub24d\ub24e\ub24f\ub250\ub251\ub252\ub253\ub254\ub255\ub256\ub257\ub258\ub259\ub25a\ub25b\ub25c\ub25d\ub25e\ub25f\ub260\ub261\ub262\ub263\ub264\ub265\ub266\ub267\ub268\ub269\ub26a\ub26b\ub26c\ub26d\ub26e\ub26f\ub270\ub271\ub272\ub273\ub274\ub275\ub276\ub277\ub278\ub279\ub27a\ub27b\ub27c\ub27d\ub27e\ub27f\ub280\ub281\ub282\ub283\ub284\ub285\ub286\ub287\ub288\ub289\ub28a\ub28b\ub28c\ub28d\ub28e\ub28f\ub290\ub291\ub292\ub293\ub294\ub295\ub296\ub297\ub298\ub299\ub29a\ub29b\ub29c\ub29d\ub29e\ub29f\ub2a0\ub2a1\ub2a2\ub2a3\ub2a4\ub2a5\ub2a6\ub2a7\ub2a8\ub2a9\ub2aa\ub2ab\ub2ac\ub2ad\ub2ae\ub2af\ub2b0\ub2b1\ub2b2\ub2b3\ub2b4\ub2b5\ub2b6\ub2b7\ub2b8\ub2b9\ub2ba\ub2bb\ub2bc\ub2bd\ub2be\ub2bf\ub2c0\ub2c1\ub2c2\ub2c3\ub2c4\ub2c5\ub2c6\ub2c7\ub2c8\ub2c9\ub2ca\ub2cb\ub2cc\ub2cd\ub2ce\ub2cf\ub2d0\ub2d1\ub2d2\ub2d3\ub2d4\ub2d5\ub2d6\ub2d7\ub2d8\ub2d9\ub2da\ub2db\ub2dc\ub2dd\ub2de\ub2df\ub2e0\ub2e1\ub2e2\ub2e3\ub2e4\ub2e5\ub2e6\ub2e7\ub2e8\ub2e9\ub2ea\ub2eb\ub2ec\ub2ed\ub2ee\ub2ef\ub2f0\ub2f1\ub2f2\ub2f3\ub2f4\ub2f5\ub2f6\ub2f7\ub2f8\ub2f9\ub2fa\ub2fb\ub2fc\ub2fd\ub2fe\ub2ff\ub300\ub301\ub302\ub303\ub304\ub305\ub306\ub307\ub308\ub309\ub30a\ub30b\ub30c\ub30d\ub30e\ub30f\ub310\ub311\ub312\ub313\ub314\ub315\ub316\ub317\ub318\ub319\ub31a\ub31b\ub31c\ub31d\ub31e\ub31f\ub320\ub321\ub322\ub323\ub324\ub325\ub326\ub327\ub328\ub329\ub32a\ub32b\ub32c\ub32d\ub32e\ub32f\ub330\ub331\ub332\ub333\ub334\ub335\ub336\ub337\ub338\ub339\ub33a\ub33b\ub33c\ub33d\ub33e\ub33f\ub340\ub341\ub342\ub343\ub344\ub345\ub346\ub347\ub348\ub349\ub34a\ub34b\ub34c\ub34d\ub34e\ub34f\ub350\ub351\ub352\ub353\ub354\ub355\ub356\ub357\ub358\ub359\ub35a\ub35b\ub35c\ub35d\ub35e\ub35f\ub360\ub361\ub362\ub363\ub364\ub365\ub366\ub367\ub368\ub369\ub36a\ub36b\ub36c\ub36d\ub36e\ub36f\ub370\ub371\ub372\ub373\ub374\ub375\ub376\ub377\ub378\ub379\ub37a\ub37b\ub37c\ub37d\ub37e\ub37f\ub380\ub381\ub382\ub383\ub384\ub385\ub386\ub387\ub388\ub389\ub38a\ub38b\ub38c\ub38d\ub38e\ub38f\ub390\ub391\ub392\ub393\ub394\ub395\ub396\ub397\ub398\ub399\ub39a\ub39b\ub39c\ub39d\ub39e\ub39f\ub3a0\ub3a1\ub3a2\ub3a3\ub3a4\ub3a5\ub3a6\ub3a7\ub3a8\ub3a9\ub3aa\ub3ab\ub3ac\ub3ad\ub3ae\ub3af\ub3b0\ub3b1\ub3b2\ub3b3\ub3b4\ub3b5\ub3b6\ub3b7\ub3b8\ub3b9\ub3ba\ub3bb\ub3bc\ub3bd\ub3be\ub3bf\ub3c0\ub3c1\ub3c2\ub3c3\ub3c4\ub3c5\ub3c6\ub3c7\ub3c8\ub3c9\ub3ca\ub3cb\ub3cc\ub3cd\ub3ce\ub3cf\ub3d0\ub3d1\ub3d2\ub3d3\ub3d4\ub3d5\ub3d6\ub3d7\ub3d8\ub3d9\ub3da\ub3db\ub3dc\ub3dd\ub3de\ub3df\ub3e0\ub3e1\ub3e2\ub3e3\ub3e4\ub3e5\ub3e6\ub3e7\ub3e8\ub3e9\ub3ea\ub3eb\ub3ec\ub3ed\ub3ee\ub3ef\ub3f0\ub3f1\ub3f2\ub3f3\ub3f4\ub3f5\ub3f6\ub3f7\ub3f8\ub3f9\ub3fa\ub3fb\ub3fc\ub3fd\ub3fe\ub3ff\ub400\ub401\ub402\ub403\ub404\ub405\ub406\ub407\ub408\ub409\ub40a\ub40b\ub40c\ub40d\ub40e\ub40f\ub410\ub411\ub412\ub413\ub414\ub415\ub416\ub417\ub418\ub419\ub41a\ub41b\ub41c\ub41d\ub41e\ub41f\ub420\ub421\ub422\ub423\ub424\ub425\ub426\ub427\ub428\ub429\ub42a\ub42b\ub42c\ub42d\ub42e\ub42f\ub430\ub431\ub432\ub433\ub434\ub435\ub436\ub437\ub438\ub439\ub43a\ub43b\ub43c\ub43d\ub43e\ub43f\ub440\ub441\ub442\ub443\ub444\ub445\ub446\ub447\ub448\ub449\ub44a\ub44b\ub44c\ub44d\ub44e\ub44f\ub450\ub451\ub452\ub453\ub454\ub455\ub456\ub457\ub458\ub459\ub45a\ub45b\ub45c\ub45d\ub45e\ub45f\ub460\ub461\ub462\ub463\ub464\ub465\ub466\ub467\ub468\ub469\ub46a\ub46b\ub46c\ub46d\ub46e\ub46f\ub470\ub471\ub472\ub473\ub474\ub475\ub476\ub477\ub478\ub479\ub47a\ub47b\ub47c\ub47d\ub47e\ub47f\ub480\ub481\ub482\ub483\ub484\ub485\ub486\ub487\ub488\ub489\ub48a\ub48b\ub48c\ub48d\ub48e\ub48f\ub490\ub491\ub492\ub493\ub494\ub495\ub496\ub497\ub498\ub499\ub49a\ub49b\ub49c\ub49d\ub49e\ub49f\ub4a0\ub4a1\ub4a2\ub4a3\ub4a4\ub4a5\ub4a6\ub4a7\ub4a8\ub4a9\ub4aa\ub4ab\ub4ac\ub4ad\ub4ae\ub4af\ub4b0\ub4b1\ub4b2\ub4b3\ub4b4\ub4b5\ub4b6\ub4b7\ub4b8\ub4b9\ub4ba\ub4bb\ub4bc\ub4bd\ub4be\ub4bf\ub4c0\ub4c1\ub4c2\ub4c3\ub4c4\ub4c5\ub4c6\ub4c7\ub4c8\ub4c9\ub4ca\ub4cb\ub4cc\ub4cd\ub4ce\ub4cf\ub4d0\ub4d1\ub4d2\ub4d3\ub4d4\ub4d5\ub4d6\ub4d7\ub4d8\ub4d9\ub4da\ub4db\ub4dc\ub4dd\ub4de\ub4df\ub4e0\ub4e1\ub4e2\ub4e3\ub4e4\ub4e5\ub4e6\ub4e7\ub4e8\ub4e9\ub4ea\ub4eb\ub4ec\ub4ed\ub4ee\ub4ef\ub4f0\ub4f1\ub4f2\ub4f3\ub4f4\ub4f5\ub4f6\ub4f7\ub4f8\ub4f9\ub4fa\ub4fb\ub4fc\ub4fd\ub4fe\ub4ff\ub500\ub501\ub502\ub503\ub504\ub505\ub506\ub507\ub508\ub509\ub50a\ub50b\ub50c\ub50d\ub50e\ub50f\ub510\ub511\ub512\ub513\ub514\ub515\ub516\ub517\ub518\ub519\ub51a\ub51b\ub51c\ub51d\ub51e\ub51f\ub520\ub521\ub522\ub523\ub524\ub525\ub526\ub527\ub528\ub529\ub52a\ub52b\ub52c\ub52d\ub52e\ub52f\ub530\ub531\ub532\ub533\ub534\ub535\ub536\ub537\ub538\ub539\ub53a\ub53b\ub53c\ub53d\ub53e\ub53f\ub540\ub541\ub542\ub543\ub544\ub545\ub546\ub547\ub548\ub549\ub54a\ub54b\ub54c\ub54d\ub54e\ub54f\ub550\ub551\ub552\ub553\ub554\ub555\ub556\ub557\ub558\ub559\ub55a\ub55b\ub55c\ub55d\ub55e\ub55f\ub560\ub561\ub562\ub563\ub564\ub565\ub566\ub567\ub568\ub569\ub56a\ub56b\ub56c\ub56d\ub56e\ub56f\ub570\ub571\ub572\ub573\ub574\ub575\ub576\ub577\ub578\ub579\ub57a\ub57b\ub57c\ub57d\ub57e\ub57f\ub580\ub581\ub582\ub583\ub584\ub585\ub586\ub587\ub588\ub589\ub58a\ub58b\ub58c\ub58d\ub58e\ub58f\ub590\ub591\ub592\ub593\ub594\ub595\ub596\ub597\ub598\ub599\ub59a\ub59b\ub59c\ub59d\ub59e\ub59f\ub5a0\ub5a1\ub5a2\ub5a3\ub5a4\ub5a5\ub5a6\ub5a7\ub5a8\ub5a9\ub5aa\ub5ab\ub5ac\ub5ad\ub5ae\ub5af\ub5b0\ub5b1\ub5b2\ub5b3\ub5b4\ub5b5\ub5b6\ub5b7\ub5b8\ub5b9\ub5ba\ub5bb\ub5bc\ub5bd\ub5be\ub5bf\ub5c0\ub5c1\ub5c2\ub5c3\ub5c4\ub5c5\ub5c6\ub5c7\ub5c8\ub5c9\ub5ca\ub5cb\ub5cc\ub5cd\ub5ce\ub5cf\ub5d0\ub5d1\ub5d2\ub5d3\ub5d4\ub5d5\ub5d6\ub5d7\ub5d8\ub5d9\ub5da\ub5db\ub5dc\ub5dd\ub5de\ub5df\ub5e0\ub5e1\ub5e2\ub5e3\ub5e4\ub5e5\ub5e6\ub5e7\ub5e8\ub5e9\ub5ea\ub5eb\ub5ec\ub5ed\ub5ee\ub5ef\ub5f0\ub5f1\ub5f2\ub5f3\ub5f4\ub5f5\ub5f6\ub5f7\ub5f8\ub5f9\ub5fa\ub5fb\ub5fc\ub5fd\ub5fe\ub5ff\ub600\ub601\ub602\ub603\ub604\ub605\ub606\ub607\ub608\ub609\ub60a\ub60b\ub60c\ub60d\ub60e\ub60f\ub610\ub611\ub612\ub613\ub614\ub615\ub616\ub617\ub618\ub619\ub61a\ub61b\ub61c\ub61d\ub61e\ub61f\ub620\ub621\ub622\ub623\ub624\ub625\ub626\ub627\ub628\ub629\ub62a\ub62b\ub62c\ub62d\ub62e\ub62f\ub630\ub631\ub632\ub633\ub634\ub635\ub636\ub637\ub638\ub639\ub63a\ub63b\ub63c\ub63d\ub63e\ub63f\ub640\ub641\ub642\ub643\ub644\ub645\ub646\ub647\ub648\ub649\ub64a\ub64b\ub64c\ub64d\ub64e\ub64f\ub650\ub651\ub652\ub653\ub654\ub655\ub656\ub657\ub658\ub659\ub65a\ub65b\ub65c\ub65d\ub65e\ub65f\ub660\ub661\ub662\ub663\ub664\ub665\ub666\ub667\ub668\ub669\ub66a\ub66b\ub66c\ub66d\ub66e\ub66f\ub670\ub671\ub672\ub673\ub674\ub675\ub676\ub677\ub678\ub679\ub67a\ub67b\ub67c\ub67d\ub67e\ub67f\ub680\ub681\ub682\ub683\ub684\ub685\ub686\ub687\ub688\ub689\ub68a\ub68b\ub68c\ub68d\ub68e\ub68f\ub690\ub691\ub692\ub693\ub694\ub695\ub696\ub697\ub698\ub699\ub69a\ub69b\ub69c\ub69d\ub69e\ub69f\ub6a0\ub6a1\ub6a2\ub6a3\ub6a4\ub6a5\ub6a6\ub6a7\ub6a8\ub6a9\ub6aa\ub6ab\ub6ac\ub6ad\ub6ae\ub6af\ub6b0\ub6b1\ub6b2\ub6b3\ub6b4\ub6b5\ub6b6\ub6b7\ub6b8\ub6b9\ub6ba\ub6bb\ub6bc\ub6bd\ub6be\ub6bf\ub6c0\ub6c1\ub6c2\ub6c3\ub6c4\ub6c5\ub6c6\ub6c7\ub6c8\ub6c9\ub6ca\ub6cb\ub6cc\ub6cd\ub6ce\ub6cf\ub6d0\ub6d1\ub6d2\ub6d3\ub6d4\ub6d5\ub6d6\ub6d7\ub6d8\ub6d9\ub6da\ub6db\ub6dc\ub6dd\ub6de\ub6df\ub6e0\ub6e1\ub6e2\ub6e3\ub6e4\ub6e5\ub6e6\ub6e7\ub6e8\ub6e9\ub6ea\ub6eb\ub6ec\ub6ed\ub6ee\ub6ef\ub6f0\ub6f1\ub6f2\ub6f3\ub6f4\ub6f5\ub6f6\ub6f7\ub6f8\ub6f9\ub6fa\ub6fb\ub6fc\ub6fd\ub6fe\ub6ff\ub700\ub701\ub702\ub703\ub704\ub705\ub706\ub707\ub708\ub709\ub70a\ub70b\ub70c\ub70d\ub70e\ub70f\ub710\ub711\ub712\ub713\ub714\ub715\ub716\ub717\ub718\ub719\ub71a\ub71b\ub71c\ub71d\ub71e\ub71f\ub720\ub721\ub722\ub723\ub724\ub725\ub726\ub727\ub728\ub729\ub72a\ub72b\ub72c\ub72d\ub72e\ub72f\ub730\ub731\ub732\ub733\ub734\ub735\ub736\ub737\ub738\ub739\ub73a\ub73b\ub73c\ub73d\ub73e\ub73f\ub740\ub741\ub742\ub743\ub744\ub745\ub746\ub747\ub748\ub749\ub74a\ub74b\ub74c\ub74d\ub74e\ub74f\ub750\ub751\ub752\ub753\ub754\ub755\ub756\ub757\ub758\ub759\ub75a\ub75b\ub75c\ub75d\ub75e\ub75f\ub760\ub761\ub762\ub763\ub764\ub765\ub766\ub767\ub768\ub769\ub76a\ub76b\ub76c\ub76d\ub76e\ub76f\ub770\ub771\ub772\ub773\ub774\ub775\ub776\ub777\ub778\ub779\ub77a\ub77b\ub77c\ub77d\ub77e\ub77f\ub780\ub781\ub782\ub783\ub784\ub785\ub786\ub787\ub788\ub789\ub78a\ub78b\ub78c\ub78d\ub78e\ub78f\ub790\ub791\ub792\ub793\ub794\ub795\ub796\ub797\ub798\ub799\ub79a\ub79b\ub79c\ub79d\ub79e\ub79f\ub7a0\ub7a1\ub7a2\ub7a3\ub7a4\ub7a5\ub7a6\ub7a7\ub7a8\ub7a9\ub7aa\ub7ab\ub7ac\ub7ad\ub7ae\ub7af\ub7b0\ub7b1\ub7b2\ub7b3\ub7b4\ub7b5\ub7b6\ub7b7\ub7b8\ub7b9\ub7ba\ub7bb\ub7bc\ub7bd\ub7be\ub7bf\ub7c0\ub7c1\ub7c2\ub7c3\ub7c4\ub7c5\ub7c6\ub7c7\ub7c8\ub7c9\ub7ca\ub7cb\ub7cc\ub7cd\ub7ce\ub7cf\ub7d0\ub7d1\ub7d2\ub7d3\ub7d4\ub7d5\ub7d6\ub7d7\ub7d8\ub7d9\ub7da\ub7db\ub7dc\ub7dd\ub7de\ub7df\ub7e0\ub7e1\ub7e2\ub7e3\ub7e4\ub7e5\ub7e6\ub7e7\ub7e8\ub7e9\ub7ea\ub7eb\ub7ec\ub7ed\ub7ee\ub7ef\ub7f0\ub7f1\ub7f2\ub7f3\ub7f4\ub7f5\ub7f6\ub7f7\ub7f8\ub7f9\ub7fa\ub7fb\ub7fc\ub7fd\ub7fe\ub7ff\ub800\ub801\ub802\ub803\ub804\ub805\ub806\ub807\ub808\ub809\ub80a\ub80b\ub80c\ub80d\ub80e\ub80f\ub810\ub811\ub812\ub813\ub814\ub815\ub816\ub817\ub818\ub819\ub81a\ub81b\ub81c\ub81d\ub81e\ub81f\ub820\ub821\ub822\ub823\ub824\ub825\ub826\ub827\ub828\ub829\ub82a\ub82b\ub82c\ub82d\ub82e\ub82f\ub830\ub831\ub832\ub833\ub834\ub835\ub836\ub837\ub838\ub839\ub83a\ub83b\ub83c\ub83d\ub83e\ub83f\ub840\ub841\ub842\ub843\ub844\ub845\ub846\ub847\ub848\ub849\ub84a\ub84b\ub84c\ub84d\ub84e\ub84f\ub850\ub851\ub852\ub853\ub854\ub855\ub856\ub857\ub858\ub859\ub85a\ub85b\ub85c\ub85d\ub85e\ub85f\ub860\ub861\ub862\ub863\ub864\ub865\ub866\ub867\ub868\ub869\ub86a\ub86b\ub86c\ub86d\ub86e\ub86f\ub870\ub871\ub872\ub873\ub874\ub875\ub876\ub877\ub878\ub879\ub87a\ub87b\ub87c\ub87d\ub87e\ub87f\ub880\ub881\ub882\ub883\ub884\ub885\ub886\ub887\ub888\ub889\ub88a\ub88b\ub88c\ub88d\ub88e\ub88f\ub890\ub891\ub892\ub893\ub894\ub895\ub896\ub897\ub898\ub899\ub89a\ub89b\ub89c\ub89d\ub89e\ub89f\ub8a0\ub8a1\ub8a2\ub8a3\ub8a4\ub8a5\ub8a6\ub8a7\ub8a8\ub8a9\ub8aa\ub8ab\ub8ac\ub8ad\ub8ae\ub8af\ub8b0\ub8b1\ub8b2\ub8b3\ub8b4\ub8b5\ub8b6\ub8b7\ub8b8\ub8b9\ub8ba\ub8bb\ub8bc\ub8bd\ub8be\ub8bf\ub8c0\ub8c1\ub8c2\ub8c3\ub8c4\ub8c5\ub8c6\ub8c7\ub8c8\ub8c9\ub8ca\ub8cb\ub8cc\ub8cd\ub8ce\ub8cf\ub8d0\ub8d1\ub8d2\ub8d3\ub8d4\ub8d5\ub8d6\ub8d7\ub8d8\ub8d9\ub8da\ub8db\ub8dc\ub8dd\ub8de\ub8df\ub8e0\ub8e1\ub8e2\ub8e3\ub8e4\ub8e5\ub8e6\ub8e7\ub8e8\ub8e9\ub8ea\ub8eb\ub8ec\ub8ed\ub8ee\ub8ef\ub8f0\ub8f1\ub8f2\ub8f3\ub8f4\ub8f5\ub8f6\ub8f7\ub8f8\ub8f9\ub8fa\ub8fb\ub8fc\ub8fd\ub8fe\ub8ff\ub900\ub901\ub902\ub903\ub904\ub905\ub906\ub907\ub908\ub909\ub90a\ub90b\ub90c\ub90d\ub90e\ub90f\ub910\ub911\ub912\ub913\ub914\ub915\ub916\ub917\ub918\ub919\ub91a\ub91b\ub91c\ub91d\ub91e\ub91f\ub920\ub921\ub922\ub923\ub924\ub925\ub926\ub927\ub928\ub929\ub92a\ub92b\ub92c\ub92d\ub92e\ub92f\ub930\ub931\ub932\ub933\ub934\ub935\ub936\ub937\ub938\ub939\ub93a\ub93b\ub93c\ub93d\ub93e\ub93f\ub940\ub941\ub942\ub943\ub944\ub945\ub946\ub947\ub948\ub949\ub94a\ub94b\ub94c\ub94d\ub94e\ub94f\ub950\ub951\ub952\ub953\ub954\ub955\ub956\ub957\ub958\ub959\ub95a\ub95b\ub95c\ub95d\ub95e\ub95f\ub960\ub961\ub962\ub963\ub964\ub965\ub966\ub967\ub968\ub969\ub96a\ub96b\ub96c\ub96d\ub96e\ub96f\ub970\ub971\ub972\ub973\ub974\ub975\ub976\ub977\ub978\ub979\ub97a\ub97b\ub97c\ub97d\ub97e\ub97f\ub980\ub981\ub982\ub983\ub984\ub985\ub986\ub987\ub988\ub989\ub98a\ub98b\ub98c\ub98d\ub98e\ub98f\ub990\ub991\ub992\ub993\ub994\ub995\ub996\ub997\ub998\ub999\ub99a\ub99b\ub99c\ub99d\ub99e\ub99f\ub9a0\ub9a1\ub9a2\ub9a3\ub9a4\ub9a5\ub9a6\ub9a7\ub9a8\ub9a9\ub9aa\ub9ab\ub9ac\ub9ad\ub9ae\ub9af\ub9b0\ub9b1\ub9b2\ub9b3\ub9b4\ub9b5\ub9b6\ub9b7\ub9b8\ub9b9\ub9ba\ub9bb\ub9bc\ub9bd\ub9be\ub9bf\ub9c0\ub9c1\ub9c2\ub9c3\ub9c4\ub9c5\ub9c6\ub9c7\ub9c8\ub9c9\ub9ca\ub9cb\ub9cc\ub9cd\ub9ce\ub9cf\ub9d0\ub9d1\ub9d2\ub9d3\ub9d4\ub9d5\ub9d6\ub9d7\ub9d8\ub9d9\ub9da\ub9db\ub9dc\ub9dd\ub9de\ub9df\ub9e0\ub9e1\ub9e2\ub9e3\ub9e4\ub9e5\ub9e6\ub9e7\ub9e8\ub9e9\ub9ea\ub9eb\ub9ec\ub9ed\ub9ee\ub9ef\ub9f0\ub9f1\ub9f2\ub9f3\ub9f4\ub9f5\ub9f6\ub9f7\ub9f8\ub9f9\ub9fa\ub9fb\ub9fc\ub9fd\ub9fe\ub9ff\uba00\uba01\uba02\uba03\uba04\uba05\uba06\uba07\uba08\uba09\uba0a\uba0b\uba0c\uba0d\uba0e\uba0f\uba10\uba11\uba12\uba13\uba14\uba15\uba16\uba17\uba18\uba19\uba1a\uba1b\uba1c\uba1d\uba1e\uba1f\uba20\uba21\uba22\uba23\uba24\uba25\uba26\uba27\uba28\uba29\uba2a\uba2b\uba2c\uba2d\uba2e\uba2f\uba30\uba31\uba32\uba33\uba34\uba35\uba36\uba37\uba38\uba39\uba3a\uba3b\uba3c\uba3d\uba3e\uba3f\uba40\uba41\uba42\uba43\uba44\uba45\uba46\uba47\uba48\uba49\uba4a\uba4b\uba4c\uba4d\uba4e\uba4f\uba50\uba51\uba52\uba53\uba54\uba55\uba56\uba57\uba58\uba59\uba5a\uba5b\uba5c\uba5d\uba5e\uba5f\uba60\uba61\uba62\uba63\uba64\uba65\uba66\uba67\uba68\uba69\uba6a\uba6b\uba6c\uba6d\uba6e\uba6f\uba70\uba71\uba72\uba73\uba74\uba75\uba76\uba77\uba78\uba79\uba7a\uba7b\uba7c\uba7d\uba7e\uba7f\uba80\uba81\uba82\uba83\uba84\uba85\uba86\uba87\uba88\uba89\uba8a\uba8b\uba8c\uba8d\uba8e\uba8f\uba90\uba91\uba92\uba93\uba94\uba95\uba96\uba97\uba98\uba99\uba9a\uba9b\uba9c\uba9d\uba9e\uba9f\ubaa0\ubaa1\ubaa2\ubaa3\ubaa4\ubaa5\ubaa6\ubaa7\ubaa8\ubaa9\ubaaa\ubaab\ubaac\ubaad\ubaae\ubaaf\ubab0\ubab1\ubab2\ubab3\ubab4\ubab5\ubab6\ubab7\ubab8\ubab9\ubaba\ubabb\ubabc\ubabd\ubabe\ubabf\ubac0\ubac1\ubac2\ubac3\ubac4\ubac5\ubac6\ubac7\ubac8\ubac9\ubaca\ubacb\ubacc\ubacd\ubace\ubacf\ubad0\ubad1\ubad2\ubad3\ubad4\ubad5\ubad6\ubad7\ubad8\ubad9\ubada\ubadb\ubadc\ubadd\ubade\ubadf\ubae0\ubae1\ubae2\ubae3\ubae4\ubae5\ubae6\ubae7\ubae8\ubae9\ubaea\ubaeb\ubaec\ubaed\ubaee\ubaef\ubaf0\ubaf1\ubaf2\ubaf3\ubaf4\ubaf5\ubaf6\ubaf7\ubaf8\ubaf9\ubafa\ubafb\ubafc\ubafd\ubafe\ubaff\ubb00\ubb01\ubb02\ubb03\ubb04\ubb05\ubb06\ubb07\ubb08\ubb09\ubb0a\ubb0b\ubb0c\ubb0d\ubb0e\ubb0f\ubb10\ubb11\ubb12\ubb13\ubb14\ubb15\ubb16\ubb17\ubb18\ubb19\ubb1a\ubb1b\ubb1c\ubb1d\ubb1e\ubb1f\ubb20\ubb21\ubb22\ubb23\ubb24\ubb25\ubb26\ubb27\ubb28\ubb29\ubb2a\ubb2b\ubb2c\ubb2d\ubb2e\ubb2f\ubb30\ubb31\ubb32\ubb33\ubb34\ubb35\ubb36\ubb37\ubb38\ubb39\ubb3a\ubb3b\ubb3c\ubb3d\ubb3e\ubb3f\ubb40\ubb41\ubb42\ubb43\ubb44\ubb45\ubb46\ubb47\ubb48\ubb49\ubb4a\ubb4b\ubb4c\ubb4d\ubb4e\ubb4f\ubb50\ubb51\ubb52\ubb53\ubb54\ubb55\ubb56\ubb57\ubb58\ubb59\ubb5a\ubb5b\ubb5c\ubb5d\ubb5e\ubb5f\ubb60\ubb61\ubb62\ubb63\ubb64\ubb65\ubb66\ubb67\ubb68\ubb69\ubb6a\ubb6b\ubb6c\ubb6d\ubb6e\ubb6f\ubb70\ubb71\ubb72\ubb73\ubb74\ubb75\ubb76\ubb77\ubb78\ubb79\ubb7a\ubb7b\ubb7c\ubb7d\ubb7e\ubb7f\ubb80\ubb81\ubb82\ubb83\ubb84\ubb85\ubb86\ubb87\ubb88\ubb89\ubb8a\ubb8b\ubb8c\ubb8d\ubb8e\ubb8f\ubb90\ubb91\ubb92\ubb93\ubb94\ubb95\ubb96\ubb97\ubb98\ubb99\ubb9a\ubb9b\ubb9c\ubb9d\ubb9e\ubb9f\ubba0\ubba1\ubba2\ubba3\ubba4\ubba5\ubba6\ubba7\ubba8\ubba9\ubbaa\ubbab\ubbac\ubbad\ubbae\ubbaf\ubbb0\ubbb1\ubbb2\ubbb3\ubbb4\ubbb5\ubbb6\ubbb7\ubbb8\ubbb9\ubbba\ubbbb\ubbbc\ubbbd\ubbbe\ubbbf\ubbc0\ubbc1\ubbc2\ubbc3\ubbc4\ubbc5\ubbc6\ubbc7\ubbc8\ubbc9\ubbca\ubbcb\ubbcc\ubbcd\ubbce\ubbcf\ubbd0\ubbd1\ubbd2\ubbd3\ubbd4\ubbd5\ubbd6\ubbd7\ubbd8\ubbd9\ubbda\ubbdb\ubbdc\ubbdd\ubbde\ubbdf\ubbe0\ubbe1\ubbe2\ubbe3\ubbe4\ubbe5\ubbe6\ubbe7\ubbe8\ubbe9\ubbea\ubbeb\ubbec\ubbed\ubbee\ubbef\ubbf0\ubbf1\ubbf2\ubbf3\ubbf4\ubbf5\ubbf6\ubbf7\ubbf8\ubbf9\ubbfa\ubbfb\ubbfc\ubbfd\ubbfe\ubbff\ubc00\ubc01\ubc02\ubc03\ubc04\ubc05\ubc06\ubc07\ubc08\ubc09\ubc0a\ubc0b\ubc0c\ubc0d\ubc0e\ubc0f\ubc10\ubc11\ubc12\ubc13\ubc14\ubc15\ubc16\ubc17\ubc18\ubc19\ubc1a\ubc1b\ubc1c\ubc1d\ubc1e\ubc1f\ubc20\ubc21\ubc22\ubc23\ubc24\ubc25\ubc26\ubc27\ubc28\ubc29\ubc2a\ubc2b\ubc2c\ubc2d\ubc2e\ubc2f\ubc30\ubc31\ubc32\ubc33\ubc34\ubc35\ubc36\ubc37\ubc38\ubc39\ubc3a\ubc3b\ubc3c\ubc3d\ubc3e\ubc3f\ubc40\ubc41\ubc42\ubc43\ubc44\ubc45\ubc46\ubc47\ubc48\ubc49\ubc4a\ubc4b\ubc4c\ubc4d\ubc4e\ubc4f\ubc50\ubc51\ubc52\ubc53\ubc54\ubc55\ubc56\ubc57\ubc58\ubc59\ubc5a\ubc5b\ubc5c\ubc5d\ubc5e\ubc5f\ubc60\ubc61\ubc62\ubc63\ubc64\ubc65\ubc66\ubc67\ubc68\ubc69\ubc6a\ubc6b\ubc6c\ubc6d\ubc6e\ubc6f\ubc70\ubc71\ubc72\ubc73\ubc74\ubc75\ubc76\ubc77\ubc78\ubc79\ubc7a\ubc7b\ubc7c\ubc7d\ubc7e\ubc7f\ubc80\ubc81\ubc82\ubc83\ubc84\ubc85\ubc86\ubc87\ubc88\ubc89\ubc8a\ubc8b\ubc8c\ubc8d\ubc8e\ubc8f\ubc90\ubc91\ubc92\ubc93\ubc94\ubc95\ubc96\ubc97\ubc98\ubc99\ubc9a\ubc9b\ubc9c\ubc9d\ubc9e\ubc9f\ubca0\ubca1\ubca2\ubca3\ubca4\ubca5\ubca6\ubca7\ubca8\ubca9\ubcaa\ubcab\ubcac\ubcad\ubcae\ubcaf\ubcb0\ubcb1\ubcb2\ubcb3\ubcb4\ubcb5\ubcb6\ubcb7\ubcb8\ubcb9\ubcba\ubcbb\ubcbc\ubcbd\ubcbe\ubcbf\ubcc0\ubcc1\ubcc2\ubcc3\ubcc4\ubcc5\ubcc6\ubcc7\ubcc8\ubcc9\ubcca\ubccb\ubccc\ubccd\ubcce\ubccf\ubcd0\ubcd1\ubcd2\ubcd3\ubcd4\ubcd5\ubcd6\ubcd7\ubcd8\ubcd9\ubcda\ubcdb\ubcdc\ubcdd\ubcde\ubcdf\ubce0\ubce1\ubce2\ubce3\ubce4\ubce5\ubce6\ubce7\ubce8\ubce9\ubcea\ubceb\ubcec\ubced\ubcee\ubcef\ubcf0\ubcf1\ubcf2\ubcf3\ubcf4\ubcf5\ubcf6\ubcf7\ubcf8\ubcf9\ubcfa\ubcfb\ubcfc\ubcfd\ubcfe\ubcff\ubd00\ubd01\ubd02\ubd03\ubd04\ubd05\ubd06\ubd07\ubd08\ubd09\ubd0a\ubd0b\ubd0c\ubd0d\ubd0e\ubd0f\ubd10\ubd11\ubd12\ubd13\ubd14\ubd15\ubd16\ubd17\ubd18\ubd19\ubd1a\ubd1b\ubd1c\ubd1d\ubd1e\ubd1f\ubd20\ubd21\ubd22\ubd23\ubd24\ubd25\ubd26\ubd27\ubd28\ubd29\ubd2a\ubd2b\ubd2c\ubd2d\ubd2e\ubd2f\ubd30\ubd31\ubd32\ubd33\ubd34\ubd35\ubd36\ubd37\ubd38\ubd39\ubd3a\ubd3b\ubd3c\ubd3d\ubd3e\ubd3f\ubd40\ubd41\ubd42\ubd43\ubd44\ubd45\ubd46\ubd47\ubd48\ubd49\ubd4a\ubd4b\ubd4c\ubd4d\ubd4e\ubd4f\ubd50\ubd51\ubd52\ubd53\ubd54\ubd55\ubd56\ubd57\ubd58\ubd59\ubd5a\ubd5b\ubd5c\ubd5d\ubd5e\ubd5f\ubd60\ubd61\ubd62\ubd63\ubd64\ubd65\ubd66\ubd67\ubd68\ubd69\ubd6a\ubd6b\ubd6c\ubd6d\ubd6e\ubd6f\ubd70\ubd71\ubd72\ubd73\ubd74\ubd75\ubd76\ubd77\ubd78\ubd79\ubd7a\ubd7b\ubd7c\ubd7d\ubd7e\ubd7f\ubd80\ubd81\ubd82\ubd83\ubd84\ubd85\ubd86\ubd87\ubd88\ubd89\ubd8a\ubd8b\ubd8c\ubd8d\ubd8e\ubd8f\ubd90\ubd91\ubd92\ubd93\ubd94\ubd95\ubd96\ubd97\ubd98\ubd99\ubd9a\ubd9b\ubd9c\ubd9d\ubd9e\ubd9f\ubda0\ubda1\ubda2\ubda3\ubda4\ubda5\ubda6\ubda7\ubda8\ubda9\ubdaa\ubdab\ubdac\ubdad\ubdae\ubdaf\ubdb0\ubdb1\ubdb2\ubdb3\ubdb4\ubdb5\ubdb6\ubdb7\ubdb8\ubdb9\ubdba\ubdbb\ubdbc\ubdbd\ubdbe\ubdbf\ubdc0\ubdc1\ubdc2\ubdc3\ubdc4\ubdc5\ubdc6\ubdc7\ubdc8\ubdc9\ubdca\ubdcb\ubdcc\ubdcd\ubdce\ubdcf\ubdd0\ubdd1\ubdd2\ubdd3\ubdd4\ubdd5\ubdd6\ubdd7\ubdd8\ubdd9\ubdda\ubddb\ubddc\ubddd\ubdde\ubddf\ubde0\ubde1\ubde2\ubde3\ubde4\ubde5\ubde6\ubde7\ubde8\ubde9\ubdea\ubdeb\ubdec\ubded\ubdee\ubdef\ubdf0\ubdf1\ubdf2\ubdf3\ubdf4\ubdf5\ubdf6\ubdf7\ubdf8\ubdf9\ubdfa\ubdfb\ubdfc\ubdfd\ubdfe\ubdff\ube00\ube01\ube02\ube03\ube04\ube05\ube06\ube07\ube08\ube09\ube0a\ube0b\ube0c\ube0d\ube0e\ube0f\ube10\ube11\ube12\ube13\ube14\ube15\ube16\ube17\ube18\ube19\ube1a\ube1b\ube1c\ube1d\ube1e\ube1f\ube20\ube21\ube22\ube23\ube24\ube25\ube26\ube27\ube28\ube29\ube2a\ube2b\ube2c\ube2d\ube2e\ube2f\ube30\ube31\ube32\ube33\ube34\ube35\ube36\ube37\ube38\ube39\ube3a\ube3b\ube3c\ube3d\ube3e\ube3f\ube40\ube41\ube42\ube43\ube44\ube45\ube46\ube47\ube48\ube49\ube4a\ube4b\ube4c\ube4d\ube4e\ube4f\ube50\ube51\ube52\ube53\ube54\ube55\ube56\ube57\ube58\ube59\ube5a\ube5b\ube5c\ube5d\ube5e\ube5f\ube60\ube61\ube62\ube63\ube64\ube65\ube66\ube67\ube68\ube69\ube6a\ube6b\ube6c\ube6d\ube6e\ube6f\ube70\ube71\ube72\ube73\ube74\ube75\ube76\ube77\ube78\ube79\ube7a\ube7b\ube7c\ube7d\ube7e\ube7f\ube80\ube81\ube82\ube83\ube84\ube85\ube86\ube87\ube88\ube89\ube8a\ube8b\ube8c\ube8d\ube8e\ube8f\ube90\ube91\ube92\ube93\ube94\ube95\ube96\ube97\ube98\ube99\ube9a\ube9b\ube9c\ube9d\ube9e\ube9f\ubea0\ubea1\ubea2\ubea3\ubea4\ubea5\ubea6\ubea7\ubea8\ubea9\ubeaa\ubeab\ubeac\ubead\ubeae\ubeaf\ubeb0\ubeb1\ubeb2\ubeb3\ubeb4\ubeb5\ubeb6\ubeb7\ubeb8\ubeb9\ubeba\ubebb\ubebc\ubebd\ubebe\ubebf\ubec0\ubec1\ubec2\ubec3\ubec4\ubec5\ubec6\ubec7\ubec8\ubec9\ubeca\ubecb\ubecc\ubecd\ubece\ubecf\ubed0\ubed1\ubed2\ubed3\ubed4\ubed5\ubed6\ubed7\ubed8\ubed9\ubeda\ubedb\ubedc\ubedd\ubede\ubedf\ubee0\ubee1\ubee2\ubee3\ubee4\ubee5\ubee6\ubee7\ubee8\ubee9\ubeea\ubeeb\ubeec\ubeed\ubeee\ubeef\ubef0\ubef1\ubef2\ubef3\ubef4\ubef5\ubef6\ubef7\ubef8\ubef9\ubefa\ubefb\ubefc\ubefd\ubefe\ubeff\ubf00\ubf01\ubf02\ubf03\ubf04\ubf05\ubf06\ubf07\ubf08\ubf09\ubf0a\ubf0b\ubf0c\ubf0d\ubf0e\ubf0f\ubf10\ubf11\ubf12\ubf13\ubf14\ubf15\ubf16\ubf17\ubf18\ubf19\ubf1a\ubf1b\ubf1c\ubf1d\ubf1e\ubf1f\ubf20\ubf21\ubf22\ubf23\ubf24\ubf25\ubf26\ubf27\ubf28\ubf29\ubf2a\ubf2b\ubf2c\ubf2d\ubf2e\ubf2f\ubf30\ubf31\ubf32\ubf33\ubf34\ubf35\ubf36\ubf37\ubf38\ubf39\ubf3a\ubf3b\ubf3c\ubf3d\ubf3e\ubf3f\ubf40\ubf41\ubf42\ubf43\ubf44\ubf45\ubf46\ubf47\ubf48\ubf49\ubf4a\ubf4b\ubf4c\ubf4d\ubf4e\ubf4f\ubf50\ubf51\ubf52\ubf53\ubf54\ubf55\ubf56\ubf57\ubf58\ubf59\ubf5a\ubf5b\ubf5c\ubf5d\ubf5e\ubf5f\ubf60\ubf61\ubf62\ubf63\ubf64\ubf65\ubf66\ubf67\ubf68\ubf69\ubf6a\ubf6b\ubf6c\ubf6d\ubf6e\ubf6f\ubf70\ubf71\ubf72\ubf73\ubf74\ubf75\ubf76\ubf77\ubf78\ubf79\ubf7a\ubf7b\ubf7c\ubf7d\ubf7e\ubf7f\ubf80\ubf81\ubf82\ubf83\ubf84\ubf85\ubf86\ubf87\ubf88\ubf89\ubf8a\ubf8b\ubf8c\ubf8d\ubf8e\ubf8f\ubf90\ubf91\ubf92\ubf93\ubf94\ubf95\ubf96\ubf97\ubf98\ubf99\ubf9a\ubf9b\ubf9c\ubf9d\ubf9e\ubf9f\ubfa0\ubfa1\ubfa2\ubfa3\ubfa4\ubfa5\ubfa6\ubfa7\ubfa8\ubfa9\ubfaa\ubfab\ubfac\ubfad\ubfae\ubfaf\ubfb0\ubfb1\ubfb2\ubfb3\ubfb4\ubfb5\ubfb6\ubfb7\ubfb8\ubfb9\ubfba\ubfbb\ubfbc\ubfbd\ubfbe\ubfbf\ubfc0\ubfc1\ubfc2\ubfc3\ubfc4\ubfc5\ubfc6\ubfc7\ubfc8\ubfc9\ubfca\ubfcb\ubfcc\ubfcd\ubfce\ubfcf\ubfd0\ubfd1\ubfd2\ubfd3\ubfd4\ubfd5\ubfd6\ubfd7\ubfd8\ubfd9\ubfda\ubfdb\ubfdc\ubfdd\ubfde\ubfdf\ubfe0\ubfe1\ubfe2\ubfe3\ubfe4\ubfe5\ubfe6\ubfe7\ubfe8\ubfe9\ubfea\ubfeb\ubfec\ubfed\ubfee\ubfef\ubff0\ubff1\ubff2\ubff3\ubff4\ubff5\ubff6\ubff7\ubff8\ubff9\ubffa\ubffb\ubffc\ubffd\ubffe\ubfff\uc000\uc001\uc002\uc003\uc004\uc005\uc006\uc007\uc008\uc009\uc00a\uc00b\uc00c\uc00d\uc00e\uc00f\uc010\uc011\uc012\uc013\uc014\uc015\uc016\uc017\uc018\uc019\uc01a\uc01b\uc01c\uc01d\uc01e\uc01f\uc020\uc021\uc022\uc023\uc024\uc025\uc026\uc027\uc028\uc029\uc02a\uc02b\uc02c\uc02d\uc02e\uc02f\uc030\uc031\uc032\uc033\uc034\uc035\uc036\uc037\uc038\uc039\uc03a\uc03b\uc03c\uc03d\uc03e\uc03f\uc040\uc041\uc042\uc043\uc044\uc045\uc046\uc047\uc048\uc049\uc04a\uc04b\uc04c\uc04d\uc04e\uc04f\uc050\uc051\uc052\uc053\uc054\uc055\uc056\uc057\uc058\uc059\uc05a\uc05b\uc05c\uc05d\uc05e\uc05f\uc060\uc061\uc062\uc063\uc064\uc065\uc066\uc067\uc068\uc069\uc06a\uc06b\uc06c\uc06d\uc06e\uc06f\uc070\uc071\uc072\uc073\uc074\uc075\uc076\uc077\uc078\uc079\uc07a\uc07b\uc07c\uc07d\uc07e\uc07f\uc080\uc081\uc082\uc083\uc084\uc085\uc086\uc087\uc088\uc089\uc08a\uc08b\uc08c\uc08d\uc08e\uc08f\uc090\uc091\uc092\uc093\uc094\uc095\uc096\uc097\uc098\uc099\uc09a\uc09b\uc09c\uc09d\uc09e\uc09f\uc0a0\uc0a1\uc0a2\uc0a3\uc0a4\uc0a5\uc0a6\uc0a7\uc0a8\uc0a9\uc0aa\uc0ab\uc0ac\uc0ad\uc0ae\uc0af\uc0b0\uc0b1\uc0b2\uc0b3\uc0b4\uc0b5\uc0b6\uc0b7\uc0b8\uc0b9\uc0ba\uc0bb\uc0bc\uc0bd\uc0be\uc0bf\uc0c0\uc0c1\uc0c2\uc0c3\uc0c4\uc0c5\uc0c6\uc0c7\uc0c8\uc0c9\uc0ca\uc0cb\uc0cc\uc0cd\uc0ce\uc0cf\uc0d0\uc0d1\uc0d2\uc0d3\uc0d4\uc0d5\uc0d6\uc0d7\uc0d8\uc0d9\uc0da\uc0db\uc0dc\uc0dd\uc0de\uc0df\uc0e0\uc0e1\uc0e2\uc0e3\uc0e4\uc0e5\uc0e6\uc0e7\uc0e8\uc0e9\uc0ea\uc0eb\uc0ec\uc0ed\uc0ee\uc0ef\uc0f0\uc0f1\uc0f2\uc0f3\uc0f4\uc0f5\uc0f6\uc0f7\uc0f8\uc0f9\uc0fa\uc0fb\uc0fc\uc0fd\uc0fe\uc0ff\uc100\uc101\uc102\uc103\uc104\uc105\uc106\uc107\uc108\uc109\uc10a\uc10b\uc10c\uc10d\uc10e\uc10f\uc110\uc111\uc112\uc113\uc114\uc115\uc116\uc117\uc118\uc119\uc11a\uc11b\uc11c\uc11d\uc11e\uc11f\uc120\uc121\uc122\uc123\uc124\uc125\uc126\uc127\uc128\uc129\uc12a\uc12b\uc12c\uc12d\uc12e\uc12f\uc130\uc131\uc132\uc133\uc134\uc135\uc136\uc137\uc138\uc139\uc13a\uc13b\uc13c\uc13d\uc13e\uc13f\uc140\uc141\uc142\uc143\uc144\uc145\uc146\uc147\uc148\uc149\uc14a\uc14b\uc14c\uc14d\uc14e\uc14f\uc150\uc151\uc152\uc153\uc154\uc155\uc156\uc157\uc158\uc159\uc15a\uc15b\uc15c\uc15d\uc15e\uc15f\uc160\uc161\uc162\uc163\uc164\uc165\uc166\uc167\uc168\uc169\uc16a\uc16b\uc16c\uc16d\uc16e\uc16f\uc170\uc171\uc172\uc173\uc174\uc175\uc176\uc177\uc178\uc179\uc17a\uc17b\uc17c\uc17d\uc17e\uc17f\uc180\uc181\uc182\uc183\uc184\uc185\uc186\uc187\uc188\uc189\uc18a\uc18b\uc18c\uc18d\uc18e\uc18f\uc190\uc191\uc192\uc193\uc194\uc195\uc196\uc197\uc198\uc199\uc19a\uc19b\uc19c\uc19d\uc19e\uc19f\uc1a0\uc1a1\uc1a2\uc1a3\uc1a4\uc1a5\uc1a6\uc1a7\uc1a8\uc1a9\uc1aa\uc1ab\uc1ac\uc1ad\uc1ae\uc1af\uc1b0\uc1b1\uc1b2\uc1b3\uc1b4\uc1b5\uc1b6\uc1b7\uc1b8\uc1b9\uc1ba\uc1bb\uc1bc\uc1bd\uc1be\uc1bf\uc1c0\uc1c1\uc1c2\uc1c3\uc1c4\uc1c5\uc1c6\uc1c7\uc1c8\uc1c9\uc1ca\uc1cb\uc1cc\uc1cd\uc1ce\uc1cf\uc1d0\uc1d1\uc1d2\uc1d3\uc1d4\uc1d5\uc1d6\uc1d7\uc1d8\uc1d9\uc1da\uc1db\uc1dc\uc1dd\uc1de\uc1df\uc1e0\uc1e1\uc1e2\uc1e3\uc1e4\uc1e5\uc1e6\uc1e7\uc1e8\uc1e9\uc1ea\uc1eb\uc1ec\uc1ed\uc1ee\uc1ef\uc1f0\uc1f1\uc1f2\uc1f3\uc1f4\uc1f5\uc1f6\uc1f7\uc1f8\uc1f9\uc1fa\uc1fb\uc1fc\uc1fd\uc1fe\uc1ff\uc200\uc201\uc202\uc203\uc204\uc205\uc206\uc207\uc208\uc209\uc20a\uc20b\uc20c\uc20d\uc20e\uc20f\uc210\uc211\uc212\uc213\uc214\uc215\uc216\uc217\uc218\uc219\uc21a\uc21b\uc21c\uc21d\uc21e\uc21f\uc220\uc221\uc222\uc223\uc224\uc225\uc226\uc227\uc228\uc229\uc22a\uc22b\uc22c\uc22d\uc22e\uc22f\uc230\uc231\uc232\uc233\uc234\uc235\uc236\uc237\uc238\uc239\uc23a\uc23b\uc23c\uc23d\uc23e\uc23f\uc240\uc241\uc242\uc243\uc244\uc245\uc246\uc247\uc248\uc249\uc24a\uc24b\uc24c\uc24d\uc24e\uc24f\uc250\uc251\uc252\uc253\uc254\uc255\uc256\uc257\uc258\uc259\uc25a\uc25b\uc25c\uc25d\uc25e\uc25f\uc260\uc261\uc262\uc263\uc264\uc265\uc266\uc267\uc268\uc269\uc26a\uc26b\uc26c\uc26d\uc26e\uc26f\uc270\uc271\uc272\uc273\uc274\uc275\uc276\uc277\uc278\uc279\uc27a\uc27b\uc27c\uc27d\uc27e\uc27f\uc280\uc281\uc282\uc283\uc284\uc285\uc286\uc287\uc288\uc289\uc28a\uc28b\uc28c\uc28d\uc28e\uc28f\uc290\uc291\uc292\uc293\uc294\uc295\uc296\uc297\uc298\uc299\uc29a\uc29b\uc29c\uc29d\uc29e\uc29f\uc2a0\uc2a1\uc2a2\uc2a3\uc2a4\uc2a5\uc2a6\uc2a7\uc2a8\uc2a9\uc2aa\uc2ab\uc2ac\uc2ad\uc2ae\uc2af\uc2b0\uc2b1\uc2b2\uc2b3\uc2b4\uc2b5\uc2b6\uc2b7\uc2b8\uc2b9\uc2ba\uc2bb\uc2bc\uc2bd\uc2be\uc2bf\uc2c0\uc2c1\uc2c2\uc2c3\uc2c4\uc2c5\uc2c6\uc2c7\uc2c8\uc2c9\uc2ca\uc2cb\uc2cc\uc2cd\uc2ce\uc2cf\uc2d0\uc2d1\uc2d2\uc2d3\uc2d4\uc2d5\uc2d6\uc2d7\uc2d8\uc2d9\uc2da\uc2db\uc2dc\uc2dd\uc2de\uc2df\uc2e0\uc2e1\uc2e2\uc2e3\uc2e4\uc2e5\uc2e6\uc2e7\uc2e8\uc2e9\uc2ea\uc2eb\uc2ec\uc2ed\uc2ee\uc2ef\uc2f0\uc2f1\uc2f2\uc2f3\uc2f4\uc2f5\uc2f6\uc2f7\uc2f8\uc2f9\uc2fa\uc2fb\uc2fc\uc2fd\uc2fe\uc2ff\uc300\uc301\uc302\uc303\uc304\uc305\uc306\uc307\uc308\uc309\uc30a\uc30b\uc30c\uc30d\uc30e\uc30f\uc310\uc311\uc312\uc313\uc314\uc315\uc316\uc317\uc318\uc319\uc31a\uc31b\uc31c\uc31d\uc31e\uc31f\uc320\uc321\uc322\uc323\uc324\uc325\uc326\uc327\uc328\uc329\uc32a\uc32b\uc32c\uc32d\uc32e\uc32f\uc330\uc331\uc332\uc333\uc334\uc335\uc336\uc337\uc338\uc339\uc33a\uc33b\uc33c\uc33d\uc33e\uc33f\uc340\uc341\uc342\uc343\uc344\uc345\uc346\uc347\uc348\uc349\uc34a\uc34b\uc34c\uc34d\uc34e\uc34f\uc350\uc351\uc352\uc353\uc354\uc355\uc356\uc357\uc358\uc359\uc35a\uc35b\uc35c\uc35d\uc35e\uc35f\uc360\uc361\uc362\uc363\uc364\uc365\uc366\uc367\uc368\uc369\uc36a\uc36b\uc36c\uc36d\uc36e\uc36f\uc370\uc371\uc372\uc373\uc374\uc375\uc376\uc377\uc378\uc379\uc37a\uc37b\uc37c\uc37d\uc37e\uc37f\uc380\uc381\uc382\uc383\uc384\uc385\uc386\uc387\uc388\uc389\uc38a\uc38b\uc38c\uc38d\uc38e\uc38f\uc390\uc391\uc392\uc393\uc394\uc395\uc396\uc397\uc398\uc399\uc39a\uc39b\uc39c\uc39d\uc39e\uc39f\uc3a0\uc3a1\uc3a2\uc3a3\uc3a4\uc3a5\uc3a6\uc3a7\uc3a8\uc3a9\uc3aa\uc3ab\uc3ac\uc3ad\uc3ae\uc3af\uc3b0\uc3b1\uc3b2\uc3b3\uc3b4\uc3b5\uc3b6\uc3b7\uc3b8\uc3b9\uc3ba\uc3bb\uc3bc\uc3bd\uc3be\uc3bf\uc3c0\uc3c1\uc3c2\uc3c3\uc3c4\uc3c5\uc3c6\uc3c7\uc3c8\uc3c9\uc3ca\uc3cb\uc3cc\uc3cd\uc3ce\uc3cf\uc3d0\uc3d1\uc3d2\uc3d3\uc3d4\uc3d5\uc3d6\uc3d7\uc3d8\uc3d9\uc3da\uc3db\uc3dc\uc3dd\uc3de\uc3df\uc3e0\uc3e1\uc3e2\uc3e3\uc3e4\uc3e5\uc3e6\uc3e7\uc3e8\uc3e9\uc3ea\uc3eb\uc3ec\uc3ed\uc3ee\uc3ef\uc3f0\uc3f1\uc3f2\uc3f3\uc3f4\uc3f5\uc3f6\uc3f7\uc3f8\uc3f9\uc3fa\uc3fb\uc3fc\uc3fd\uc3fe\uc3ff\uc400\uc401\uc402\uc403\uc404\uc405\uc406\uc407\uc408\uc409\uc40a\uc40b\uc40c\uc40d\uc40e\uc40f\uc410\uc411\uc412\uc413\uc414\uc415\uc416\uc417\uc418\uc419\uc41a\uc41b\uc41c\uc41d\uc41e\uc41f\uc420\uc421\uc422\uc423\uc424\uc425\uc426\uc427\uc428\uc429\uc42a\uc42b\uc42c\uc42d\uc42e\uc42f\uc430\uc431\uc432\uc433\uc434\uc435\uc436\uc437\uc438\uc439\uc43a\uc43b\uc43c\uc43d\uc43e\uc43f\uc440\uc441\uc442\uc443\uc444\uc445\uc446\uc447\uc448\uc449\uc44a\uc44b\uc44c\uc44d\uc44e\uc44f\uc450\uc451\uc452\uc453\uc454\uc455\uc456\uc457\uc458\uc459\uc45a\uc45b\uc45c\uc45d\uc45e\uc45f\uc460\uc461\uc462\uc463\uc464\uc465\uc466\uc467\uc468\uc469\uc46a\uc46b\uc46c\uc46d\uc46e\uc46f\uc470\uc471\uc472\uc473\uc474\uc475\uc476\uc477\uc478\uc479\uc47a\uc47b\uc47c\uc47d\uc47e\uc47f\uc480\uc481\uc482\uc483\uc484\uc485\uc486\uc487\uc488\uc489\uc48a\uc48b\uc48c\uc48d\uc48e\uc48f\uc490\uc491\uc492\uc493\uc494\uc495\uc496\uc497\uc498\uc499\uc49a\uc49b\uc49c\uc49d\uc49e\uc49f\uc4a0\uc4a1\uc4a2\uc4a3\uc4a4\uc4a5\uc4a6\uc4a7\uc4a8\uc4a9\uc4aa\uc4ab\uc4ac\uc4ad\uc4ae\uc4af\uc4b0\uc4b1\uc4b2\uc4b3\uc4b4\uc4b5\uc4b6\uc4b7\uc4b8\uc4b9\uc4ba\uc4bb\uc4bc\uc4bd\uc4be\uc4bf\uc4c0\uc4c1\uc4c2\uc4c3\uc4c4\uc4c5\uc4c6\uc4c7\uc4c8\uc4c9\uc4ca\uc4cb\uc4cc\uc4cd\uc4ce\uc4cf\uc4d0\uc4d1\uc4d2\uc4d3\uc4d4\uc4d5\uc4d6\uc4d7\uc4d8\uc4d9\uc4da\uc4db\uc4dc\uc4dd\uc4de\uc4df\uc4e0\uc4e1\uc4e2\uc4e3\uc4e4\uc4e5\uc4e6\uc4e7\uc4e8\uc4e9\uc4ea\uc4eb\uc4ec\uc4ed\uc4ee\uc4ef\uc4f0\uc4f1\uc4f2\uc4f3\uc4f4\uc4f5\uc4f6\uc4f7\uc4f8\uc4f9\uc4fa\uc4fb\uc4fc\uc4fd\uc4fe\uc4ff\uc500\uc501\uc502\uc503\uc504\uc505\uc506\uc507\uc508\uc509\uc50a\uc50b\uc50c\uc50d\uc50e\uc50f\uc510\uc511\uc512\uc513\uc514\uc515\uc516\uc517\uc518\uc519\uc51a\uc51b\uc51c\uc51d\uc51e\uc51f\uc520\uc521\uc522\uc523\uc524\uc525\uc526\uc527\uc528\uc529\uc52a\uc52b\uc52c\uc52d\uc52e\uc52f\uc530\uc531\uc532\uc533\uc534\uc535\uc536\uc537\uc538\uc539\uc53a\uc53b\uc53c\uc53d\uc53e\uc53f\uc540\uc541\uc542\uc543\uc544\uc545\uc546\uc547\uc548\uc549\uc54a\uc54b\uc54c\uc54d\uc54e\uc54f\uc550\uc551\uc552\uc553\uc554\uc555\uc556\uc557\uc558\uc559\uc55a\uc55b\uc55c\uc55d\uc55e\uc55f\uc560\uc561\uc562\uc563\uc564\uc565\uc566\uc567\uc568\uc569\uc56a\uc56b\uc56c\uc56d\uc56e\uc56f\uc570\uc571\uc572\uc573\uc574\uc575\uc576\uc577\uc578\uc579\uc57a\uc57b\uc57c\uc57d\uc57e\uc57f\uc580\uc581\uc582\uc583\uc584\uc585\uc586\uc587\uc588\uc589\uc58a\uc58b\uc58c\uc58d\uc58e\uc58f\uc590\uc591\uc592\uc593\uc594\uc595\uc596\uc597\uc598\uc599\uc59a\uc59b\uc59c\uc59d\uc59e\uc59f\uc5a0\uc5a1\uc5a2\uc5a3\uc5a4\uc5a5\uc5a6\uc5a7\uc5a8\uc5a9\uc5aa\uc5ab\uc5ac\uc5ad\uc5ae\uc5af\uc5b0\uc5b1\uc5b2\uc5b3\uc5b4\uc5b5\uc5b6\uc5b7\uc5b8\uc5b9\uc5ba\uc5bb\uc5bc\uc5bd\uc5be\uc5bf\uc5c0\uc5c1\uc5c2\uc5c3\uc5c4\uc5c5\uc5c6\uc5c7\uc5c8\uc5c9\uc5ca\uc5cb\uc5cc\uc5cd\uc5ce\uc5cf\uc5d0\uc5d1\uc5d2\uc5d3\uc5d4\uc5d5\uc5d6\uc5d7\uc5d8\uc5d9\uc5da\uc5db\uc5dc\uc5dd\uc5de\uc5df\uc5e0\uc5e1\uc5e2\uc5e3\uc5e4\uc5e5\uc5e6\uc5e7\uc5e8\uc5e9\uc5ea\uc5eb\uc5ec\uc5ed\uc5ee\uc5ef\uc5f0\uc5f1\uc5f2\uc5f3\uc5f4\uc5f5\uc5f6\uc5f7\uc5f8\uc5f9\uc5fa\uc5fb\uc5fc\uc5fd\uc5fe\uc5ff\uc600\uc601\uc602\uc603\uc604\uc605\uc606\uc607\uc608\uc609\uc60a\uc60b\uc60c\uc60d\uc60e\uc60f\uc610\uc611\uc612\uc613\uc614\uc615\uc616\uc617\uc618\uc619\uc61a\uc61b\uc61c\uc61d\uc61e\uc61f\uc620\uc621\uc622\uc623\uc624\uc625\uc626\uc627\uc628\uc629\uc62a\uc62b\uc62c\uc62d\uc62e\uc62f\uc630\uc631\uc632\uc633\uc634\uc635\uc636\uc637\uc638\uc639\uc63a\uc63b\uc63c\uc63d\uc63e\uc63f\uc640\uc641\uc642\uc643\uc644\uc645\uc646\uc647\uc648\uc649\uc64a\uc64b\uc64c\uc64d\uc64e\uc64f\uc650\uc651\uc652\uc653\uc654\uc655\uc656\uc657\uc658\uc659\uc65a\uc65b\uc65c\uc65d\uc65e\uc65f\uc660\uc661\uc662\uc663\uc664\uc665\uc666\uc667\uc668\uc669\uc66a\uc66b\uc66c\uc66d\uc66e\uc66f\uc670\uc671\uc672\uc673\uc674\uc675\uc676\uc677\uc678\uc679\uc67a\uc67b\uc67c\uc67d\uc67e\uc67f\uc680\uc681\uc682\uc683\uc684\uc685\uc686\uc687\uc688\uc689\uc68a\uc68b\uc68c\uc68d\uc68e\uc68f\uc690\uc691\uc692\uc693\uc694\uc695\uc696\uc697\uc698\uc699\uc69a\uc69b\uc69c\uc69d\uc69e\uc69f\uc6a0\uc6a1\uc6a2\uc6a3\uc6a4\uc6a5\uc6a6\uc6a7\uc6a8\uc6a9\uc6aa\uc6ab\uc6ac\uc6ad\uc6ae\uc6af\uc6b0\uc6b1\uc6b2\uc6b3\uc6b4\uc6b5\uc6b6\uc6b7\uc6b8\uc6b9\uc6ba\uc6bb\uc6bc\uc6bd\uc6be\uc6bf\uc6c0\uc6c1\uc6c2\uc6c3\uc6c4\uc6c5\uc6c6\uc6c7\uc6c8\uc6c9\uc6ca\uc6cb\uc6cc\uc6cd\uc6ce\uc6cf\uc6d0\uc6d1\uc6d2\uc6d3\uc6d4\uc6d5\uc6d6\uc6d7\uc6d8\uc6d9\uc6da\uc6db\uc6dc\uc6dd\uc6de\uc6df\uc6e0\uc6e1\uc6e2\uc6e3\uc6e4\uc6e5\uc6e6\uc6e7\uc6e8\uc6e9\uc6ea\uc6eb\uc6ec\uc6ed\uc6ee\uc6ef\uc6f0\uc6f1\uc6f2\uc6f3\uc6f4\uc6f5\uc6f6\uc6f7\uc6f8\uc6f9\uc6fa\uc6fb\uc6fc\uc6fd\uc6fe\uc6ff\uc700\uc701\uc702\uc703\uc704\uc705\uc706\uc707\uc708\uc709\uc70a\uc70b\uc70c\uc70d\uc70e\uc70f\uc710\uc711\uc712\uc713\uc714\uc715\uc716\uc717\uc718\uc719\uc71a\uc71b\uc71c\uc71d\uc71e\uc71f\uc720\uc721\uc722\uc723\uc724\uc725\uc726\uc727\uc728\uc729\uc72a\uc72b\uc72c\uc72d\uc72e\uc72f\uc730\uc731\uc732\uc733\uc734\uc735\uc736\uc737\uc738\uc739\uc73a\uc73b\uc73c\uc73d\uc73e\uc73f\uc740\uc741\uc742\uc743\uc744\uc745\uc746\uc747\uc748\uc749\uc74a\uc74b\uc74c\uc74d\uc74e\uc74f\uc750\uc751\uc752\uc753\uc754\uc755\uc756\uc757\uc758\uc759\uc75a\uc75b\uc75c\uc75d\uc75e\uc75f\uc760\uc761\uc762\uc763\uc764\uc765\uc766\uc767\uc768\uc769\uc76a\uc76b\uc76c\uc76d\uc76e\uc76f\uc770\uc771\uc772\uc773\uc774\uc775\uc776\uc777\uc778\uc779\uc77a\uc77b\uc77c\uc77d\uc77e\uc77f\uc780\uc781\uc782\uc783\uc784\uc785\uc786\uc787\uc788\uc789\uc78a\uc78b\uc78c\uc78d\uc78e\uc78f\uc790\uc791\uc792\uc793\uc794\uc795\uc796\uc797\uc798\uc799\uc79a\uc79b\uc79c\uc79d\uc79e\uc79f\uc7a0\uc7a1\uc7a2\uc7a3\uc7a4\uc7a5\uc7a6\uc7a7\uc7a8\uc7a9\uc7aa\uc7ab\uc7ac\uc7ad\uc7ae\uc7af\uc7b0\uc7b1\uc7b2\uc7b3\uc7b4\uc7b5\uc7b6\uc7b7\uc7b8\uc7b9\uc7ba\uc7bb\uc7bc\uc7bd\uc7be\uc7bf\uc7c0\uc7c1\uc7c2\uc7c3\uc7c4\uc7c5\uc7c6\uc7c7\uc7c8\uc7c9\uc7ca\uc7cb\uc7cc\uc7cd\uc7ce\uc7cf\uc7d0\uc7d1\uc7d2\uc7d3\uc7d4\uc7d5\uc7d6\uc7d7\uc7d8\uc7d9\uc7da\uc7db\uc7dc\uc7dd\uc7de\uc7df\uc7e0\uc7e1\uc7e2\uc7e3\uc7e4\uc7e5\uc7e6\uc7e7\uc7e8\uc7e9\uc7ea\uc7eb\uc7ec\uc7ed\uc7ee\uc7ef\uc7f0\uc7f1\uc7f2\uc7f3\uc7f4\uc7f5\uc7f6\uc7f7\uc7f8\uc7f9\uc7fa\uc7fb\uc7fc\uc7fd\uc7fe\uc7ff\uc800\uc801\uc802\uc803\uc804\uc805\uc806\uc807\uc808\uc809\uc80a\uc80b\uc80c\uc80d\uc80e\uc80f\uc810\uc811\uc812\uc813\uc814\uc815\uc816\uc817\uc818\uc819\uc81a\uc81b\uc81c\uc81d\uc81e\uc81f\uc820\uc821\uc822\uc823\uc824\uc825\uc826\uc827\uc828\uc829\uc82a\uc82b\uc82c\uc82d\uc82e\uc82f\uc830\uc831\uc832\uc833\uc834\uc835\uc836\uc837\uc838\uc839\uc83a\uc83b\uc83c\uc83d\uc83e\uc83f\uc840\uc841\uc842\uc843\uc844\uc845\uc846\uc847\uc848\uc849\uc84a\uc84b\uc84c\uc84d\uc84e\uc84f\uc850\uc851\uc852\uc853\uc854\uc855\uc856\uc857\uc858\uc859\uc85a\uc85b\uc85c\uc85d\uc85e\uc85f\uc860\uc861\uc862\uc863\uc864\uc865\uc866\uc867\uc868\uc869\uc86a\uc86b\uc86c\uc86d\uc86e\uc86f\uc870\uc871\uc872\uc873\uc874\uc875\uc876\uc877\uc878\uc879\uc87a\uc87b\uc87c\uc87d\uc87e\uc87f\uc880\uc881\uc882\uc883\uc884\uc885\uc886\uc887\uc888\uc889\uc88a\uc88b\uc88c\uc88d\uc88e\uc88f\uc890\uc891\uc892\uc893\uc894\uc895\uc896\uc897\uc898\uc899\uc89a\uc89b\uc89c\uc89d\uc89e\uc89f\uc8a0\uc8a1\uc8a2\uc8a3\uc8a4\uc8a5\uc8a6\uc8a7\uc8a8\uc8a9\uc8aa\uc8ab\uc8ac\uc8ad\uc8ae\uc8af\uc8b0\uc8b1\uc8b2\uc8b3\uc8b4\uc8b5\uc8b6\uc8b7\uc8b8\uc8b9\uc8ba\uc8bb\uc8bc\uc8bd\uc8be\uc8bf\uc8c0\uc8c1\uc8c2\uc8c3\uc8c4\uc8c5\uc8c6\uc8c7\uc8c8\uc8c9\uc8ca\uc8cb\uc8cc\uc8cd\uc8ce\uc8cf\uc8d0\uc8d1\uc8d2\uc8d3\uc8d4\uc8d5\uc8d6\uc8d7\uc8d8\uc8d9\uc8da\uc8db\uc8dc\uc8dd\uc8de\uc8df\uc8e0\uc8e1\uc8e2\uc8e3\uc8e4\uc8e5\uc8e6\uc8e7\uc8e8\uc8e9\uc8ea\uc8eb\uc8ec\uc8ed\uc8ee\uc8ef\uc8f0\uc8f1\uc8f2\uc8f3\uc8f4\uc8f5\uc8f6\uc8f7\uc8f8\uc8f9\uc8fa\uc8fb\uc8fc\uc8fd\uc8fe\uc8ff\uc900\uc901\uc902\uc903\uc904\uc905\uc906\uc907\uc908\uc909\uc90a\uc90b\uc90c\uc90d\uc90e\uc90f\uc910\uc911\uc912\uc913\uc914\uc915\uc916\uc917\uc918\uc919\uc91a\uc91b\uc91c\uc91d\uc91e\uc91f\uc920\uc921\uc922\uc923\uc924\uc925\uc926\uc927\uc928\uc929\uc92a\uc92b\uc92c\uc92d\uc92e\uc92f\uc930\uc931\uc932\uc933\uc934\uc935\uc936\uc937\uc938\uc939\uc93a\uc93b\uc93c\uc93d\uc93e\uc93f\uc940\uc941\uc942\uc943\uc944\uc945\uc946\uc947\uc948\uc949\uc94a\uc94b\uc94c\uc94d\uc94e\uc94f\uc950\uc951\uc952\uc953\uc954\uc955\uc956\uc957\uc958\uc959\uc95a\uc95b\uc95c\uc95d\uc95e\uc95f\uc960\uc961\uc962\uc963\uc964\uc965\uc966\uc967\uc968\uc969\uc96a\uc96b\uc96c\uc96d\uc96e\uc96f\uc970\uc971\uc972\uc973\uc974\uc975\uc976\uc977\uc978\uc979\uc97a\uc97b\uc97c\uc97d\uc97e\uc97f\uc980\uc981\uc982\uc983\uc984\uc985\uc986\uc987\uc988\uc989\uc98a\uc98b\uc98c\uc98d\uc98e\uc98f\uc990\uc991\uc992\uc993\uc994\uc995\uc996\uc997\uc998\uc999\uc99a\uc99b\uc99c\uc99d\uc99e\uc99f\uc9a0\uc9a1\uc9a2\uc9a3\uc9a4\uc9a5\uc9a6\uc9a7\uc9a8\uc9a9\uc9aa\uc9ab\uc9ac\uc9ad\uc9ae\uc9af\uc9b0\uc9b1\uc9b2\uc9b3\uc9b4\uc9b5\uc9b6\uc9b7\uc9b8\uc9b9\uc9ba\uc9bb\uc9bc\uc9bd\uc9be\uc9bf\uc9c0\uc9c1\uc9c2\uc9c3\uc9c4\uc9c5\uc9c6\uc9c7\uc9c8\uc9c9\uc9ca\uc9cb\uc9cc\uc9cd\uc9ce\uc9cf\uc9d0\uc9d1\uc9d2\uc9d3\uc9d4\uc9d5\uc9d6\uc9d7\uc9d8\uc9d9\uc9da\uc9db\uc9dc\uc9dd\uc9de\uc9df\uc9e0\uc9e1\uc9e2\uc9e3\uc9e4\uc9e5\uc9e6\uc9e7\uc9e8\uc9e9\uc9ea\uc9eb\uc9ec\uc9ed\uc9ee\uc9ef\uc9f0\uc9f1\uc9f2\uc9f3\uc9f4\uc9f5\uc9f6\uc9f7\uc9f8\uc9f9\uc9fa\uc9fb\uc9fc\uc9fd\uc9fe\uc9ff\uca00\uca01\uca02\uca03\uca04\uca05\uca06\uca07\uca08\uca09\uca0a\uca0b\uca0c\uca0d\uca0e\uca0f\uca10\uca11\uca12\uca13\uca14\uca15\uca16\uca17\uca18\uca19\uca1a\uca1b\uca1c\uca1d\uca1e\uca1f\uca20\uca21\uca22\uca23\uca24\uca25\uca26\uca27\uca28\uca29\uca2a\uca2b\uca2c\uca2d\uca2e\uca2f\uca30\uca31\uca32\uca33\uca34\uca35\uca36\uca37\uca38\uca39\uca3a\uca3b\uca3c\uca3d\uca3e\uca3f\uca40\uca41\uca42\uca43\uca44\uca45\uca46\uca47\uca48\uca49\uca4a\uca4b\uca4c\uca4d\uca4e\uca4f\uca50\uca51\uca52\uca53\uca54\uca55\uca56\uca57\uca58\uca59\uca5a\uca5b\uca5c\uca5d\uca5e\uca5f\uca60\uca61\uca62\uca63\uca64\uca65\uca66\uca67\uca68\uca69\uca6a\uca6b\uca6c\uca6d\uca6e\uca6f\uca70\uca71\uca72\uca73\uca74\uca75\uca76\uca77\uca78\uca79\uca7a\uca7b\uca7c\uca7d\uca7e\uca7f\uca80\uca81\uca82\uca83\uca84\uca85\uca86\uca87\uca88\uca89\uca8a\uca8b\uca8c\uca8d\uca8e\uca8f\uca90\uca91\uca92\uca93\uca94\uca95\uca96\uca97\uca98\uca99\uca9a\uca9b\uca9c\uca9d\uca9e\uca9f\ucaa0\ucaa1\ucaa2\ucaa3\ucaa4\ucaa5\ucaa6\ucaa7\ucaa8\ucaa9\ucaaa\ucaab\ucaac\ucaad\ucaae\ucaaf\ucab0\ucab1\ucab2\ucab3\ucab4\ucab5\ucab6\ucab7\ucab8\ucab9\ucaba\ucabb\ucabc\ucabd\ucabe\ucabf\ucac0\ucac1\ucac2\ucac3\ucac4\ucac5\ucac6\ucac7\ucac8\ucac9\ucaca\ucacb\ucacc\ucacd\ucace\ucacf\ucad0\ucad1\ucad2\ucad3\ucad4\ucad5\ucad6\ucad7\ucad8\ucad9\ucada\ucadb\ucadc\ucadd\ucade\ucadf\ucae0\ucae1\ucae2\ucae3\ucae4\ucae5\ucae6\ucae7\ucae8\ucae9\ucaea\ucaeb\ucaec\ucaed\ucaee\ucaef\ucaf0\ucaf1\ucaf2\ucaf3\ucaf4\ucaf5\ucaf6\ucaf7\ucaf8\ucaf9\ucafa\ucafb\ucafc\ucafd\ucafe\ucaff\ucb00\ucb01\ucb02\ucb03\ucb04\ucb05\ucb06\ucb07\ucb08\ucb09\ucb0a\ucb0b\ucb0c\ucb0d\ucb0e\ucb0f\ucb10\ucb11\ucb12\ucb13\ucb14\ucb15\ucb16\ucb17\ucb18\ucb19\ucb1a\ucb1b\ucb1c\ucb1d\ucb1e\ucb1f\ucb20\ucb21\ucb22\ucb23\ucb24\ucb25\ucb26\ucb27\ucb28\ucb29\ucb2a\ucb2b\ucb2c\ucb2d\ucb2e\ucb2f\ucb30\ucb31\ucb32\ucb33\ucb34\ucb35\ucb36\ucb37\ucb38\ucb39\ucb3a\ucb3b\ucb3c\ucb3d\ucb3e\ucb3f\ucb40\ucb41\ucb42\ucb43\ucb44\ucb45\ucb46\ucb47\ucb48\ucb49\ucb4a\ucb4b\ucb4c\ucb4d\ucb4e\ucb4f\ucb50\ucb51\ucb52\ucb53\ucb54\ucb55\ucb56\ucb57\ucb58\ucb59\ucb5a\ucb5b\ucb5c\ucb5d\ucb5e\ucb5f\ucb60\ucb61\ucb62\ucb63\ucb64\ucb65\ucb66\ucb67\ucb68\ucb69\ucb6a\ucb6b\ucb6c\ucb6d\ucb6e\ucb6f\ucb70\ucb71\ucb72\ucb73\ucb74\ucb75\ucb76\ucb77\ucb78\ucb79\ucb7a\ucb7b\ucb7c\ucb7d\ucb7e\ucb7f\ucb80\ucb81\ucb82\ucb83\ucb84\ucb85\ucb86\ucb87\ucb88\ucb89\ucb8a\ucb8b\ucb8c\ucb8d\ucb8e\ucb8f\ucb90\ucb91\ucb92\ucb93\ucb94\ucb95\ucb96\ucb97\ucb98\ucb99\ucb9a\ucb9b\ucb9c\ucb9d\ucb9e\ucb9f\ucba0\ucba1\ucba2\ucba3\ucba4\ucba5\ucba6\ucba7\ucba8\ucba9\ucbaa\ucbab\ucbac\ucbad\ucbae\ucbaf\ucbb0\ucbb1\ucbb2\ucbb3\ucbb4\ucbb5\ucbb6\ucbb7\ucbb8\ucbb9\ucbba\ucbbb\ucbbc\ucbbd\ucbbe\ucbbf\ucbc0\ucbc1\ucbc2\ucbc3\ucbc4\ucbc5\ucbc6\ucbc7\ucbc8\ucbc9\ucbca\ucbcb\ucbcc\ucbcd\ucbce\ucbcf\ucbd0\ucbd1\ucbd2\ucbd3\ucbd4\ucbd5\ucbd6\ucbd7\ucbd8\ucbd9\ucbda\ucbdb\ucbdc\ucbdd\ucbde\ucbdf\ucbe0\ucbe1\ucbe2\ucbe3\ucbe4\ucbe5\ucbe6\ucbe7\ucbe8\ucbe9\ucbea\ucbeb\ucbec\ucbed\ucbee\ucbef\ucbf0\ucbf1\ucbf2\ucbf3\ucbf4\ucbf5\ucbf6\ucbf7\ucbf8\ucbf9\ucbfa\ucbfb\ucbfc\ucbfd\ucbfe\ucbff\ucc00\ucc01\ucc02\ucc03\ucc04\ucc05\ucc06\ucc07\ucc08\ucc09\ucc0a\ucc0b\ucc0c\ucc0d\ucc0e\ucc0f\ucc10\ucc11\ucc12\ucc13\ucc14\ucc15\ucc16\ucc17\ucc18\ucc19\ucc1a\ucc1b\ucc1c\ucc1d\ucc1e\ucc1f\ucc20\ucc21\ucc22\ucc23\ucc24\ucc25\ucc26\ucc27\ucc28\ucc29\ucc2a\ucc2b\ucc2c\ucc2d\ucc2e\ucc2f\ucc30\ucc31\ucc32\ucc33\ucc34\ucc35\ucc36\ucc37\ucc38\ucc39\ucc3a\ucc3b\ucc3c\ucc3d\ucc3e\ucc3f\ucc40\ucc41\ucc42\ucc43\ucc44\ucc45\ucc46\ucc47\ucc48\ucc49\ucc4a\ucc4b\ucc4c\ucc4d\ucc4e\ucc4f\ucc50\ucc51\ucc52\ucc53\ucc54\ucc55\ucc56\ucc57\ucc58\ucc59\ucc5a\ucc5b\ucc5c\ucc5d\ucc5e\ucc5f\ucc60\ucc61\ucc62\ucc63\ucc64\ucc65\ucc66\ucc67\ucc68\ucc69\ucc6a\ucc6b\ucc6c\ucc6d\ucc6e\ucc6f\ucc70\ucc71\ucc72\ucc73\ucc74\ucc75\ucc76\ucc77\ucc78\ucc79\ucc7a\ucc7b\ucc7c\ucc7d\ucc7e\ucc7f\ucc80\ucc81\ucc82\ucc83\ucc84\ucc85\ucc86\ucc87\ucc88\ucc89\ucc8a\ucc8b\ucc8c\ucc8d\ucc8e\ucc8f\ucc90\ucc91\ucc92\ucc93\ucc94\ucc95\ucc96\ucc97\ucc98\ucc99\ucc9a\ucc9b\ucc9c\ucc9d\ucc9e\ucc9f\ucca0\ucca1\ucca2\ucca3\ucca4\ucca5\ucca6\ucca7\ucca8\ucca9\uccaa\uccab\uccac\uccad\uccae\uccaf\uccb0\uccb1\uccb2\uccb3\uccb4\uccb5\uccb6\uccb7\uccb8\uccb9\uccba\uccbb\uccbc\uccbd\uccbe\uccbf\uccc0\uccc1\uccc2\uccc3\uccc4\uccc5\uccc6\uccc7\uccc8\uccc9\uccca\ucccb\ucccc\ucccd\uccce\ucccf\uccd0\uccd1\uccd2\uccd3\uccd4\uccd5\uccd6\uccd7\uccd8\uccd9\uccda\uccdb\uccdc\uccdd\uccde\uccdf\ucce0\ucce1\ucce2\ucce3\ucce4\ucce5\ucce6\ucce7\ucce8\ucce9\uccea\ucceb\uccec\ucced\uccee\uccef\uccf0\uccf1\uccf2\uccf3\uccf4\uccf5\uccf6\uccf7\uccf8\uccf9\uccfa\uccfb\uccfc\uccfd\uccfe\uccff\ucd00\ucd01\ucd02\ucd03\ucd04\ucd05\ucd06\ucd07\ucd08\ucd09\ucd0a\ucd0b\ucd0c\ucd0d\ucd0e\ucd0f\ucd10\ucd11\ucd12\ucd13\ucd14\ucd15\ucd16\ucd17\ucd18\ucd19\ucd1a\ucd1b\ucd1c\ucd1d\ucd1e\ucd1f\ucd20\ucd21\ucd22\ucd23\ucd24\ucd25\ucd26\ucd27\ucd28\ucd29\ucd2a\ucd2b\ucd2c\ucd2d\ucd2e\ucd2f\ucd30\ucd31\ucd32\ucd33\ucd34\ucd35\ucd36\ucd37\ucd38\ucd39\ucd3a\ucd3b\ucd3c\ucd3d\ucd3e\ucd3f\ucd40\ucd41\ucd42\ucd43\ucd44\ucd45\ucd46\ucd47\ucd48\ucd49\ucd4a\ucd4b\ucd4c\ucd4d\ucd4e\ucd4f\ucd50\ucd51\ucd52\ucd53\ucd54\ucd55\ucd56\ucd57\ucd58\ucd59\ucd5a\ucd5b\ucd5c\ucd5d\ucd5e\ucd5f\ucd60\ucd61\ucd62\ucd63\ucd64\ucd65\ucd66\ucd67\ucd68\ucd69\ucd6a\ucd6b\ucd6c\ucd6d\ucd6e\ucd6f\ucd70\ucd71\ucd72\ucd73\ucd74\ucd75\ucd76\ucd77\ucd78\ucd79\ucd7a\ucd7b\ucd7c\ucd7d\ucd7e\ucd7f\ucd80\ucd81\ucd82\ucd83\ucd84\ucd85\ucd86\ucd87\ucd88\ucd89\ucd8a\ucd8b\ucd8c\ucd8d\ucd8e\ucd8f\ucd90\ucd91\ucd92\ucd93\ucd94\ucd95\ucd96\ucd97\ucd98\ucd99\ucd9a\ucd9b\ucd9c\ucd9d\ucd9e\ucd9f\ucda0\ucda1\ucda2\ucda3\ucda4\ucda5\ucda6\ucda7\ucda8\ucda9\ucdaa\ucdab\ucdac\ucdad\ucdae\ucdaf\ucdb0\ucdb1\ucdb2\ucdb3\ucdb4\ucdb5\ucdb6\ucdb7\ucdb8\ucdb9\ucdba\ucdbb\ucdbc\ucdbd\ucdbe\ucdbf\ucdc0\ucdc1\ucdc2\ucdc3\ucdc4\ucdc5\ucdc6\ucdc7\ucdc8\ucdc9\ucdca\ucdcb\ucdcc\ucdcd\ucdce\ucdcf\ucdd0\ucdd1\ucdd2\ucdd3\ucdd4\ucdd5\ucdd6\ucdd7\ucdd8\ucdd9\ucdda\ucddb\ucddc\ucddd\ucdde\ucddf\ucde0\ucde1\ucde2\ucde3\ucde4\ucde5\ucde6\ucde7\ucde8\ucde9\ucdea\ucdeb\ucdec\ucded\ucdee\ucdef\ucdf0\ucdf1\ucdf2\ucdf3\ucdf4\ucdf5\ucdf6\ucdf7\ucdf8\ucdf9\ucdfa\ucdfb\ucdfc\ucdfd\ucdfe\ucdff\uce00\uce01\uce02\uce03\uce04\uce05\uce06\uce07\uce08\uce09\uce0a\uce0b\uce0c\uce0d\uce0e\uce0f\uce10\uce11\uce12\uce13\uce14\uce15\uce16\uce17\uce18\uce19\uce1a\uce1b\uce1c\uce1d\uce1e\uce1f\uce20\uce21\uce22\uce23\uce24\uce25\uce26\uce27\uce28\uce29\uce2a\uce2b\uce2c\uce2d\uce2e\uce2f\uce30\uce31\uce32\uce33\uce34\uce35\uce36\uce37\uce38\uce39\uce3a\uce3b\uce3c\uce3d\uce3e\uce3f\uce40\uce41\uce42\uce43\uce44\uce45\uce46\uce47\uce48\uce49\uce4a\uce4b\uce4c\uce4d\uce4e\uce4f\uce50\uce51\uce52\uce53\uce54\uce55\uce56\uce57\uce58\uce59\uce5a\uce5b\uce5c\uce5d\uce5e\uce5f\uce60\uce61\uce62\uce63\uce64\uce65\uce66\uce67\uce68\uce69\uce6a\uce6b\uce6c\uce6d\uce6e\uce6f\uce70\uce71\uce72\uce73\uce74\uce75\uce76\uce77\uce78\uce79\uce7a\uce7b\uce7c\uce7d\uce7e\uce7f\uce80\uce81\uce82\uce83\uce84\uce85\uce86\uce87\uce88\uce89\uce8a\uce8b\uce8c\uce8d\uce8e\uce8f\uce90\uce91\uce92\uce93\uce94\uce95\uce96\uce97\uce98\uce99\uce9a\uce9b\uce9c\uce9d\uce9e\uce9f\ucea0\ucea1\ucea2\ucea3\ucea4\ucea5\ucea6\ucea7\ucea8\ucea9\uceaa\uceab\uceac\ucead\uceae\uceaf\uceb0\uceb1\uceb2\uceb3\uceb4\uceb5\uceb6\uceb7\uceb8\uceb9\uceba\ucebb\ucebc\ucebd\ucebe\ucebf\ucec0\ucec1\ucec2\ucec3\ucec4\ucec5\ucec6\ucec7\ucec8\ucec9\uceca\ucecb\ucecc\ucecd\ucece\ucecf\uced0\uced1\uced2\uced3\uced4\uced5\uced6\uced7\uced8\uced9\uceda\ucedb\ucedc\ucedd\ucede\ucedf\ucee0\ucee1\ucee2\ucee3\ucee4\ucee5\ucee6\ucee7\ucee8\ucee9\uceea\uceeb\uceec\uceed\uceee\uceef\ucef0\ucef1\ucef2\ucef3\ucef4\ucef5\ucef6\ucef7\ucef8\ucef9\ucefa\ucefb\ucefc\ucefd\ucefe\uceff\ucf00\ucf01\ucf02\ucf03\ucf04\ucf05\ucf06\ucf07\ucf08\ucf09\ucf0a\ucf0b\ucf0c\ucf0d\ucf0e\ucf0f\ucf10\ucf11\ucf12\ucf13\ucf14\ucf15\ucf16\ucf17\ucf18\ucf19\ucf1a\ucf1b\ucf1c\ucf1d\ucf1e\ucf1f\ucf20\ucf21\ucf22\ucf23\ucf24\ucf25\ucf26\ucf27\ucf28\ucf29\ucf2a\ucf2b\ucf2c\ucf2d\ucf2e\ucf2f\ucf30\ucf31\ucf32\ucf33\ucf34\ucf35\ucf36\ucf37\ucf38\ucf39\ucf3a\ucf3b\ucf3c\ucf3d\ucf3e\ucf3f\ucf40\ucf41\ucf42\ucf43\ucf44\ucf45\ucf46\ucf47\ucf48\ucf49\ucf4a\ucf4b\ucf4c\ucf4d\ucf4e\ucf4f\ucf50\ucf51\ucf52\ucf53\ucf54\ucf55\ucf56\ucf57\ucf58\ucf59\ucf5a\ucf5b\ucf5c\ucf5d\ucf5e\ucf5f\ucf60\ucf61\ucf62\ucf63\ucf64\ucf65\ucf66\ucf67\ucf68\ucf69\ucf6a\ucf6b\ucf6c\ucf6d\ucf6e\ucf6f\ucf70\ucf71\ucf72\ucf73\ucf74\ucf75\ucf76\ucf77\ucf78\ucf79\ucf7a\ucf7b\ucf7c\ucf7d\ucf7e\ucf7f\ucf80\ucf81\ucf82\ucf83\ucf84\ucf85\ucf86\ucf87\ucf88\ucf89\ucf8a\ucf8b\ucf8c\ucf8d\ucf8e\ucf8f\ucf90\ucf91\ucf92\ucf93\ucf94\ucf95\ucf96\ucf97\ucf98\ucf99\ucf9a\ucf9b\ucf9c\ucf9d\ucf9e\ucf9f\ucfa0\ucfa1\ucfa2\ucfa3\ucfa4\ucfa5\ucfa6\ucfa7\ucfa8\ucfa9\ucfaa\ucfab\ucfac\ucfad\ucfae\ucfaf\ucfb0\ucfb1\ucfb2\ucfb3\ucfb4\ucfb5\ucfb6\ucfb7\ucfb8\ucfb9\ucfba\ucfbb\ucfbc\ucfbd\ucfbe\ucfbf\ucfc0\ucfc1\ucfc2\ucfc3\ucfc4\ucfc5\ucfc6\ucfc7\ucfc8\ucfc9\ucfca\ucfcb\ucfcc\ucfcd\ucfce\ucfcf\ucfd0\ucfd1\ucfd2\ucfd3\ucfd4\ucfd5\ucfd6\ucfd7\ucfd8\ucfd9\ucfda\ucfdb\ucfdc\ucfdd\ucfde\ucfdf\ucfe0\ucfe1\ucfe2\ucfe3\ucfe4\ucfe5\ucfe6\ucfe7\ucfe8\ucfe9\ucfea\ucfeb\ucfec\ucfed\ucfee\ucfef\ucff0\ucff1\ucff2\ucff3\ucff4\ucff5\ucff6\ucff7\ucff8\ucff9\ucffa\ucffb\ucffc\ucffd\ucffe\ucfff\ud000\ud001\ud002\ud003\ud004\ud005\ud006\ud007\ud008\ud009\ud00a\ud00b\ud00c\ud00d\ud00e\ud00f\ud010\ud011\ud012\ud013\ud014\ud015\ud016\ud017\ud018\ud019\ud01a\ud01b\ud01c\ud01d\ud01e\ud01f\ud020\ud021\ud022\ud023\ud024\ud025\ud026\ud027\ud028\ud029\ud02a\ud02b\ud02c\ud02d\ud02e\ud02f\ud030\ud031\ud032\ud033\ud034\ud035\ud036\ud037\ud038\ud039\ud03a\ud03b\ud03c\ud03d\ud03e\ud03f\ud040\ud041\ud042\ud043\ud044\ud045\ud046\ud047\ud048\ud049\ud04a\ud04b\ud04c\ud04d\ud04e\ud04f\ud050\ud051\ud052\ud053\ud054\ud055\ud056\ud057\ud058\ud059\ud05a\ud05b\ud05c\ud05d\ud05e\ud05f\ud060\ud061\ud062\ud063\ud064\ud065\ud066\ud067\ud068\ud069\ud06a\ud06b\ud06c\ud06d\ud06e\ud06f\ud070\ud071\ud072\ud073\ud074\ud075\ud076\ud077\ud078\ud079\ud07a\ud07b\ud07c\ud07d\ud07e\ud07f\ud080\ud081\ud082\ud083\ud084\ud085\ud086\ud087\ud088\ud089\ud08a\ud08b\ud08c\ud08d\ud08e\ud08f\ud090\ud091\ud092\ud093\ud094\ud095\ud096\ud097\ud098\ud099\ud09a\ud09b\ud09c\ud09d\ud09e\ud09f\ud0a0\ud0a1\ud0a2\ud0a3\ud0a4\ud0a5\ud0a6\ud0a7\ud0a8\ud0a9\ud0aa\ud0ab\ud0ac\ud0ad\ud0ae\ud0af\ud0b0\ud0b1\ud0b2\ud0b3\ud0b4\ud0b5\ud0b6\ud0b7\ud0b8\ud0b9\ud0ba\ud0bb\ud0bc\ud0bd\ud0be\ud0bf\ud0c0\ud0c1\ud0c2\ud0c3\ud0c4\ud0c5\ud0c6\ud0c7\ud0c8\ud0c9\ud0ca\ud0cb\ud0cc\ud0cd\ud0ce\ud0cf\ud0d0\ud0d1\ud0d2\ud0d3\ud0d4\ud0d5\ud0d6\ud0d7\ud0d8\ud0d9\ud0da\ud0db\ud0dc\ud0dd\ud0de\ud0df\ud0e0\ud0e1\ud0e2\ud0e3\ud0e4\ud0e5\ud0e6\ud0e7\ud0e8\ud0e9\ud0ea\ud0eb\ud0ec\ud0ed\ud0ee\ud0ef\ud0f0\ud0f1\ud0f2\ud0f3\ud0f4\ud0f5\ud0f6\ud0f7\ud0f8\ud0f9\ud0fa\ud0fb\ud0fc\ud0fd\ud0fe\ud0ff\ud100\ud101\ud102\ud103\ud104\ud105\ud106\ud107\ud108\ud109\ud10a\ud10b\ud10c\ud10d\ud10e\ud10f\ud110\ud111\ud112\ud113\ud114\ud115\ud116\ud117\ud118\ud119\ud11a\ud11b\ud11c\ud11d\ud11e\ud11f\ud120\ud121\ud122\ud123\ud124\ud125\ud126\ud127\ud128\ud129\ud12a\ud12b\ud12c\ud12d\ud12e\ud12f\ud130\ud131\ud132\ud133\ud134\ud135\ud136\ud137\ud138\ud139\ud13a\ud13b\ud13c\ud13d\ud13e\ud13f\ud140\ud141\ud142\ud143\ud144\ud145\ud146\ud147\ud148\ud149\ud14a\ud14b\ud14c\ud14d\ud14e\ud14f\ud150\ud151\ud152\ud153\ud154\ud155\ud156\ud157\ud158\ud159\ud15a\ud15b\ud15c\ud15d\ud15e\ud15f\ud160\ud161\ud162\ud163\ud164\ud165\ud166\ud167\ud168\ud169\ud16a\ud16b\ud16c\ud16d\ud16e\ud16f\ud170\ud171\ud172\ud173\ud174\ud175\ud176\ud177\ud178\ud179\ud17a\ud17b\ud17c\ud17d\ud17e\ud17f\ud180\ud181\ud182\ud183\ud184\ud185\ud186\ud187\ud188\ud189\ud18a\ud18b\ud18c\ud18d\ud18e\ud18f\ud190\ud191\ud192\ud193\ud194\ud195\ud196\ud197\ud198\ud199\ud19a\ud19b\ud19c\ud19d\ud19e\ud19f\ud1a0\ud1a1\ud1a2\ud1a3\ud1a4\ud1a5\ud1a6\ud1a7\ud1a8\ud1a9\ud1aa\ud1ab\ud1ac\ud1ad\ud1ae\ud1af\ud1b0\ud1b1\ud1b2\ud1b3\ud1b4\ud1b5\ud1b6\ud1b7\ud1b8\ud1b9\ud1ba\ud1bb\ud1bc\ud1bd\ud1be\ud1bf\ud1c0\ud1c1\ud1c2\ud1c3\ud1c4\ud1c5\ud1c6\ud1c7\ud1c8\ud1c9\ud1ca\ud1cb\ud1cc\ud1cd\ud1ce\ud1cf\ud1d0\ud1d1\ud1d2\ud1d3\ud1d4\ud1d5\ud1d6\ud1d7\ud1d8\ud1d9\ud1da\ud1db\ud1dc\ud1dd\ud1de\ud1df\ud1e0\ud1e1\ud1e2\ud1e3\ud1e4\ud1e5\ud1e6\ud1e7\ud1e8\ud1e9\ud1ea\ud1eb\ud1ec\ud1ed\ud1ee\ud1ef\ud1f0\ud1f1\ud1f2\ud1f3\ud1f4\ud1f5\ud1f6\ud1f7\ud1f8\ud1f9\ud1fa\ud1fb\ud1fc\ud1fd\ud1fe\ud1ff\ud200\ud201\ud202\ud203\ud204\ud205\ud206\ud207\ud208\ud209\ud20a\ud20b\ud20c\ud20d\ud20e\ud20f\ud210\ud211\ud212\ud213\ud214\ud215\ud216\ud217\ud218\ud219\ud21a\ud21b\ud21c\ud21d\ud21e\ud21f\ud220\ud221\ud222\ud223\ud224\ud225\ud226\ud227\ud228\ud229\ud22a\ud22b\ud22c\ud22d\ud22e\ud22f\ud230\ud231\ud232\ud233\ud234\ud235\ud236\ud237\ud238\ud239\ud23a\ud23b\ud23c\ud23d\ud23e\ud23f\ud240\ud241\ud242\ud243\ud244\ud245\ud246\ud247\ud248\ud249\ud24a\ud24b\ud24c\ud24d\ud24e\ud24f\ud250\ud251\ud252\ud253\ud254\ud255\ud256\ud257\ud258\ud259\ud25a\ud25b\ud25c\ud25d\ud25e\ud25f\ud260\ud261\ud262\ud263\ud264\ud265\ud266\ud267\ud268\ud269\ud26a\ud26b\ud26c\ud26d\ud26e\ud26f\ud270\ud271\ud272\ud273\ud274\ud275\ud276\ud277\ud278\ud279\ud27a\ud27b\ud27c\ud27d\ud27e\ud27f\ud280\ud281\ud282\ud283\ud284\ud285\ud286\ud287\ud288\ud289\ud28a\ud28b\ud28c\ud28d\ud28e\ud28f\ud290\ud291\ud292\ud293\ud294\ud295\ud296\ud297\ud298\ud299\ud29a\ud29b\ud29c\ud29d\ud29e\ud29f\ud2a0\ud2a1\ud2a2\ud2a3\ud2a4\ud2a5\ud2a6\ud2a7\ud2a8\ud2a9\ud2aa\ud2ab\ud2ac\ud2ad\ud2ae\ud2af\ud2b0\ud2b1\ud2b2\ud2b3\ud2b4\ud2b5\ud2b6\ud2b7\ud2b8\ud2b9\ud2ba\ud2bb\ud2bc\ud2bd\ud2be\ud2bf\ud2c0\ud2c1\ud2c2\ud2c3\ud2c4\ud2c5\ud2c6\ud2c7\ud2c8\ud2c9\ud2ca\ud2cb\ud2cc\ud2cd\ud2ce\ud2cf\ud2d0\ud2d1\ud2d2\ud2d3\ud2d4\ud2d5\ud2d6\ud2d7\ud2d8\ud2d9\ud2da\ud2db\ud2dc\ud2dd\ud2de\ud2df\ud2e0\ud2e1\ud2e2\ud2e3\ud2e4\ud2e5\ud2e6\ud2e7\ud2e8\ud2e9\ud2ea\ud2eb\ud2ec\ud2ed\ud2ee\ud2ef\ud2f0\ud2f1\ud2f2\ud2f3\ud2f4\ud2f5\ud2f6\ud2f7\ud2f8\ud2f9\ud2fa\ud2fb\ud2fc\ud2fd\ud2fe\ud2ff\ud300\ud301\ud302\ud303\ud304\ud305\ud306\ud307\ud308\ud309\ud30a\ud30b\ud30c\ud30d\ud30e\ud30f\ud310\ud311\ud312\ud313\ud314\ud315\ud316\ud317\ud318\ud319\ud31a\ud31b\ud31c\ud31d\ud31e\ud31f\ud320\ud321\ud322\ud323\ud324\ud325\ud326\ud327\ud328\ud329\ud32a\ud32b\ud32c\ud32d\ud32e\ud32f\ud330\ud331\ud332\ud333\ud334\ud335\ud336\ud337\ud338\ud339\ud33a\ud33b\ud33c\ud33d\ud33e\ud33f\ud340\ud341\ud342\ud343\ud344\ud345\ud346\ud347\ud348\ud349\ud34a\ud34b\ud34c\ud34d\ud34e\ud34f\ud350\ud351\ud352\ud353\ud354\ud355\ud356\ud357\ud358\ud359\ud35a\ud35b\ud35c\ud35d\ud35e\ud35f\ud360\ud361\ud362\ud363\ud364\ud365\ud366\ud367\ud368\ud369\ud36a\ud36b\ud36c\ud36d\ud36e\ud36f\ud370\ud371\ud372\ud373\ud374\ud375\ud376\ud377\ud378\ud379\ud37a\ud37b\ud37c\ud37d\ud37e\ud37f\ud380\ud381\ud382\ud383\ud384\ud385\ud386\ud387\ud388\ud389\ud38a\ud38b\ud38c\ud38d\ud38e\ud38f\ud390\ud391\ud392\ud393\ud394\ud395\ud396\ud397\ud398\ud399\ud39a\ud39b\ud39c\ud39d\ud39e\ud39f\ud3a0\ud3a1\ud3a2\ud3a3\ud3a4\ud3a5\ud3a6\ud3a7\ud3a8\ud3a9\ud3aa\ud3ab\ud3ac\ud3ad\ud3ae\ud3af\ud3b0\ud3b1\ud3b2\ud3b3\ud3b4\ud3b5\ud3b6\ud3b7\ud3b8\ud3b9\ud3ba\ud3bb\ud3bc\ud3bd\ud3be\ud3bf\ud3c0\ud3c1\ud3c2\ud3c3\ud3c4\ud3c5\ud3c6\ud3c7\ud3c8\ud3c9\ud3ca\ud3cb\ud3cc\ud3cd\ud3ce\ud3cf\ud3d0\ud3d1\ud3d2\ud3d3\ud3d4\ud3d5\ud3d6\ud3d7\ud3d8\ud3d9\ud3da\ud3db\ud3dc\ud3dd\ud3de\ud3df\ud3e0\ud3e1\ud3e2\ud3e3\ud3e4\ud3e5\ud3e6\ud3e7\ud3e8\ud3e9\ud3ea\ud3eb\ud3ec\ud3ed\ud3ee\ud3ef\ud3f0\ud3f1\ud3f2\ud3f3\ud3f4\ud3f5\ud3f6\ud3f7\ud3f8\ud3f9\ud3fa\ud3fb\ud3fc\ud3fd\ud3fe\ud3ff\ud400\ud401\ud402\ud403\ud404\ud405\ud406\ud407\ud408\ud409\ud40a\ud40b\ud40c\ud40d\ud40e\ud40f\ud410\ud411\ud412\ud413\ud414\ud415\ud416\ud417\ud418\ud419\ud41a\ud41b\ud41c\ud41d\ud41e\ud41f\ud420\ud421\ud422\ud423\ud424\ud425\ud426\ud427\ud428\ud429\ud42a\ud42b\ud42c\ud42d\ud42e\ud42f\ud430\ud431\ud432\ud433\ud434\ud435\ud436\ud437\ud438\ud439\ud43a\ud43b\ud43c\ud43d\ud43e\ud43f\ud440\ud441\ud442\ud443\ud444\ud445\ud446\ud447\ud448\ud449\ud44a\ud44b\ud44c\ud44d\ud44e\ud44f\ud450\ud451\ud452\ud453\ud454\ud455\ud456\ud457\ud458\ud459\ud45a\ud45b\ud45c\ud45d\ud45e\ud45f\ud460\ud461\ud462\ud463\ud464\ud465\ud466\ud467\ud468\ud469\ud46a\ud46b\ud46c\ud46d\ud46e\ud46f\ud470\ud471\ud472\ud473\ud474\ud475\ud476\ud477\ud478\ud479\ud47a\ud47b\ud47c\ud47d\ud47e\ud47f\ud480\ud481\ud482\ud483\ud484\ud485\ud486\ud487\ud488\ud489\ud48a\ud48b\ud48c\ud48d\ud48e\ud48f\ud490\ud491\ud492\ud493\ud494\ud495\ud496\ud497\ud498\ud499\ud49a\ud49b\ud49c\ud49d\ud49e\ud49f\ud4a0\ud4a1\ud4a2\ud4a3\ud4a4\ud4a5\ud4a6\ud4a7\ud4a8\ud4a9\ud4aa\ud4ab\ud4ac\ud4ad\ud4ae\ud4af\ud4b0\ud4b1\ud4b2\ud4b3\ud4b4\ud4b5\ud4b6\ud4b7\ud4b8\ud4b9\ud4ba\ud4bb\ud4bc\ud4bd\ud4be\ud4bf\ud4c0\ud4c1\ud4c2\ud4c3\ud4c4\ud4c5\ud4c6\ud4c7\ud4c8\ud4c9\ud4ca\ud4cb\ud4cc\ud4cd\ud4ce\ud4cf\ud4d0\ud4d1\ud4d2\ud4d3\ud4d4\ud4d5\ud4d6\ud4d7\ud4d8\ud4d9\ud4da\ud4db\ud4dc\ud4dd\ud4de\ud4df\ud4e0\ud4e1\ud4e2\ud4e3\ud4e4\ud4e5\ud4e6\ud4e7\ud4e8\ud4e9\ud4ea\ud4eb\ud4ec\ud4ed\ud4ee\ud4ef\ud4f0\ud4f1\ud4f2\ud4f3\ud4f4\ud4f5\ud4f6\ud4f7\ud4f8\ud4f9\ud4fa\ud4fb\ud4fc\ud4fd\ud4fe\ud4ff\ud500\ud501\ud502\ud503\ud504\ud505\ud506\ud507\ud508\ud509\ud50a\ud50b\ud50c\ud50d\ud50e\ud50f\ud510\ud511\ud512\ud513\ud514\ud515\ud516\ud517\ud518\ud519\ud51a\ud51b\ud51c\ud51d\ud51e\ud51f\ud520\ud521\ud522\ud523\ud524\ud525\ud526\ud527\ud528\ud529\ud52a\ud52b\ud52c\ud52d\ud52e\ud52f\ud530\ud531\ud532\ud533\ud534\ud535\ud536\ud537\ud538\ud539\ud53a\ud53b\ud53c\ud53d\ud53e\ud53f\ud540\ud541\ud542\ud543\ud544\ud545\ud546\ud547\ud548\ud549\ud54a\ud54b\ud54c\ud54d\ud54e\ud54f\ud550\ud551\ud552\ud553\ud554\ud555\ud556\ud557\ud558\ud559\ud55a\ud55b\ud55c\ud55d\ud55e\ud55f\ud560\ud561\ud562\ud563\ud564\ud565\ud566\ud567\ud568\ud569\ud56a\ud56b\ud56c\ud56d\ud56e\ud56f\ud570\ud571\ud572\ud573\ud574\ud575\ud576\ud577\ud578\ud579\ud57a\ud57b\ud57c\ud57d\ud57e\ud57f\ud580\ud581\ud582\ud583\ud584\ud585\ud586\ud587\ud588\ud589\ud58a\ud58b\ud58c\ud58d\ud58e\ud58f\ud590\ud591\ud592\ud593\ud594\ud595\ud596\ud597\ud598\ud599\ud59a\ud59b\ud59c\ud59d\ud59e\ud59f\ud5a0\ud5a1\ud5a2\ud5a3\ud5a4\ud5a5\ud5a6\ud5a7\ud5a8\ud5a9\ud5aa\ud5ab\ud5ac\ud5ad\ud5ae\ud5af\ud5b0\ud5b1\ud5b2\ud5b3\ud5b4\ud5b5\ud5b6\ud5b7\ud5b8\ud5b9\ud5ba\ud5bb\ud5bc\ud5bd\ud5be\ud5bf\ud5c0\ud5c1\ud5c2\ud5c3\ud5c4\ud5c5\ud5c6\ud5c7\ud5c8\ud5c9\ud5ca\ud5cb\ud5cc\ud5cd\ud5ce\ud5cf\ud5d0\ud5d1\ud5d2\ud5d3\ud5d4\ud5d5\ud5d6\ud5d7\ud5d8\ud5d9\ud5da\ud5db\ud5dc\ud5dd\ud5de\ud5df\ud5e0\ud5e1\ud5e2\ud5e3\ud5e4\ud5e5\ud5e6\ud5e7\ud5e8\ud5e9\ud5ea\ud5eb\ud5ec\ud5ed\ud5ee\ud5ef\ud5f0\ud5f1\ud5f2\ud5f3\ud5f4\ud5f5\ud5f6\ud5f7\ud5f8\ud5f9\ud5fa\ud5fb\ud5fc\ud5fd\ud5fe\ud5ff\ud600\ud601\ud602\ud603\ud604\ud605\ud606\ud607\ud608\ud609\ud60a\ud60b\ud60c\ud60d\ud60e\ud60f\ud610\ud611\ud612\ud613\ud614\ud615\ud616\ud617\ud618\ud619\ud61a\ud61b\ud61c\ud61d\ud61e\ud61f\ud620\ud621\ud622\ud623\ud624\ud625\ud626\ud627\ud628\ud629\ud62a\ud62b\ud62c\ud62d\ud62e\ud62f\ud630\ud631\ud632\ud633\ud634\ud635\ud636\ud637\ud638\ud639\ud63a\ud63b\ud63c\ud63d\ud63e\ud63f\ud640\ud641\ud642\ud643\ud644\ud645\ud646\ud647\ud648\ud649\ud64a\ud64b\ud64c\ud64d\ud64e\ud64f\ud650\ud651\ud652\ud653\ud654\ud655\ud656\ud657\ud658\ud659\ud65a\ud65b\ud65c\ud65d\ud65e\ud65f\ud660\ud661\ud662\ud663\ud664\ud665\ud666\ud667\ud668\ud669\ud66a\ud66b\ud66c\ud66d\ud66e\ud66f\ud670\ud671\ud672\ud673\ud674\ud675\ud676\ud677\ud678\ud679\ud67a\ud67b\ud67c\ud67d\ud67e\ud67f\ud680\ud681\ud682\ud683\ud684\ud685\ud686\ud687\ud688\ud689\ud68a\ud68b\ud68c\ud68d\ud68e\ud68f\ud690\ud691\ud692\ud693\ud694\ud695\ud696\ud697\ud698\ud699\ud69a\ud69b\ud69c\ud69d\ud69e\ud69f\ud6a0\ud6a1\ud6a2\ud6a3\ud6a4\ud6a5\ud6a6\ud6a7\ud6a8\ud6a9\ud6aa\ud6ab\ud6ac\ud6ad\ud6ae\ud6af\ud6b0\ud6b1\ud6b2\ud6b3\ud6b4\ud6b5\ud6b6\ud6b7\ud6b8\ud6b9\ud6ba\ud6bb\ud6bc\ud6bd\ud6be\ud6bf\ud6c0\ud6c1\ud6c2\ud6c3\ud6c4\ud6c5\ud6c6\ud6c7\ud6c8\ud6c9\ud6ca\ud6cb\ud6cc\ud6cd\ud6ce\ud6cf\ud6d0\ud6d1\ud6d2\ud6d3\ud6d4\ud6d5\ud6d6\ud6d7\ud6d8\ud6d9\ud6da\ud6db\ud6dc\ud6dd\ud6de\ud6df\ud6e0\ud6e1\ud6e2\ud6e3\ud6e4\ud6e5\ud6e6\ud6e7\ud6e8\ud6e9\ud6ea\ud6eb\ud6ec\ud6ed\ud6ee\ud6ef\ud6f0\ud6f1\ud6f2\ud6f3\ud6f4\ud6f5\ud6f6\ud6f7\ud6f8\ud6f9\ud6fa\ud6fb\ud6fc\ud6fd\ud6fe\ud6ff\ud700\ud701\ud702\ud703\ud704\ud705\ud706\ud707\ud708\ud709\ud70a\ud70b\ud70c\ud70d\ud70e\ud70f\ud710\ud711\ud712\ud713\ud714\ud715\ud716\ud717\ud718\ud719\ud71a\ud71b\ud71c\ud71d\ud71e\ud71f\ud720\ud721\ud722\ud723\ud724\ud725\ud726\ud727\ud728\ud729\ud72a\ud72b\ud72c\ud72d\ud72e\ud72f\ud730\ud731\ud732\ud733\ud734\ud735\ud736\ud737\ud738\ud739\ud73a\ud73b\ud73c\ud73d\ud73e\ud73f\ud740\ud741\ud742\ud743\ud744\ud745\ud746\ud747\ud748\ud749\ud74a\ud74b\ud74c\ud74d\ud74e\ud74f\ud750\ud751\ud752\ud753\ud754\ud755\ud756\ud757\ud758\ud759\ud75a\ud75b\ud75c\ud75d\ud75e\ud75f\ud760\ud761\ud762\ud763\ud764\ud765\ud766\ud767\ud768\ud769\ud76a\ud76b\ud76c\ud76d\ud76e\ud76f\ud770\ud771\ud772\ud773\ud774\ud775\ud776\ud777\ud778\ud779\ud77a\ud77b\ud77c\ud77d\ud77e\ud77f\ud780\ud781\ud782\ud783\ud784\ud785\ud786\ud787\ud788\ud789\ud78a\ud78b\ud78c\ud78d\ud78e\ud78f\ud790\ud791\ud792\ud793\ud794\ud795\ud796\ud797\ud798\ud799\ud79a\ud79b\ud79c\ud79d\ud79e\ud79f\ud7a0\ud7a1\ud7a2\ud7a3\uf900\uf901\uf902\uf903\uf904\uf905\uf906\uf907\uf908\uf909\uf90a\uf90b\uf90c\uf90d\uf90e\uf90f\uf910\uf911\uf912\uf913\uf914\uf915\uf916\uf917\uf918\uf919\uf91a\uf91b\uf91c\uf91d\uf91e\uf91f\uf920\uf921\uf922\uf923\uf924\uf925\uf926\uf927\uf928\uf929\uf92a\uf92b\uf92c\uf92d\uf92e\uf92f\uf930\uf931\uf932\uf933\uf934\uf935\uf936\uf937\uf938\uf939\uf93a\uf93b\uf93c\uf93d\uf93e\uf93f\uf940\uf941\uf942\uf943\uf944\uf945\uf946\uf947\uf948\uf949\uf94a\uf94b\uf94c\uf94d\uf94e\uf94f\uf950\uf951\uf952\uf953\uf954\uf955\uf956\uf957\uf958\uf959\uf95a\uf95b\uf95c\uf95d\uf95e\uf95f\uf960\uf961\uf962\uf963\uf964\uf965\uf966\uf967\uf968\uf969\uf96a\uf96b\uf96c\uf96d\uf96e\uf96f\uf970\uf971\uf972\uf973\uf974\uf975\uf976\uf977\uf978\uf979\uf97a\uf97b\uf97c\uf97d\uf97e\uf97f\uf980\uf981\uf982\uf983\uf984\uf985\uf986\uf987\uf988\uf989\uf98a\uf98b\uf98c\uf98d\uf98e\uf98f\uf990\uf991\uf992\uf993\uf994\uf995\uf996\uf997\uf998\uf999\uf99a\uf99b\uf99c\uf99d\uf99e\uf99f\uf9a0\uf9a1\uf9a2\uf9a3\uf9a4\uf9a5\uf9a6\uf9a7\uf9a8\uf9a9\uf9aa\uf9ab\uf9ac\uf9ad\uf9ae\uf9af\uf9b0\uf9b1\uf9b2\uf9b3\uf9b4\uf9b5\uf9b6\uf9b7\uf9b8\uf9b9\uf9ba\uf9bb\uf9bc\uf9bd\uf9be\uf9bf\uf9c0\uf9c1\uf9c2\uf9c3\uf9c4\uf9c5\uf9c6\uf9c7\uf9c8\uf9c9\uf9ca\uf9cb\uf9cc\uf9cd\uf9ce\uf9cf\uf9d0\uf9d1\uf9d2\uf9d3\uf9d4\uf9d5\uf9d6\uf9d7\uf9d8\uf9d9\uf9da\uf9db\uf9dc\uf9dd\uf9de\uf9df\uf9e0\uf9e1\uf9e2\uf9e3\uf9e4\uf9e5\uf9e6\uf9e7\uf9e8\uf9e9\uf9ea\uf9eb\uf9ec\uf9ed\uf9ee\uf9ef\uf9f0\uf9f1\uf9f2\uf9f3\uf9f4\uf9f5\uf9f6\uf9f7\uf9f8\uf9f9\uf9fa\uf9fb\uf9fc\uf9fd\uf9fe\uf9ff\ufa00\ufa01\ufa02\ufa03\ufa04\ufa05\ufa06\ufa07\ufa08\ufa09\ufa0a\ufa0b\ufa0c\ufa0d\ufa0e\ufa0f\ufa10\ufa11\ufa12\ufa13\ufa14\ufa15\ufa16\ufa17\ufa18\ufa19\ufa1a\ufa1b\ufa1c\ufa1d\ufa1e\ufa1f\ufa20\ufa21\ufa22\ufa23\ufa24\ufa25\ufa26\ufa27\ufa28\ufa29\ufa2a\ufa2b\ufa2c\ufa2d\ufa30\ufa31\ufa32\ufa33\ufa34\ufa35\ufa36\ufa37\ufa38\ufa39\ufa3a\ufa3b\ufa3c\ufa3d\ufa3e\ufa3f\ufa40\ufa41\ufa42\ufa43\ufa44\ufa45\ufa46\ufa47\ufa48\ufa49\ufa4a\ufa4b\ufa4c\ufa4d\ufa4e\ufa4f\ufa50\ufa51\ufa52\ufa53\ufa54\ufa55\ufa56\ufa57\ufa58\ufa59\ufa5a\ufa5b\ufa5c\ufa5d\ufa5e\ufa5f\ufa60\ufa61\ufa62\ufa63\ufa64\ufa65\ufa66\ufa67\ufa68\ufa69\ufa6a\ufa70\ufa71\ufa72\ufa73\ufa74\ufa75\ufa76\ufa77\ufa78\ufa79\ufa7a\ufa7b\ufa7c\ufa7d\ufa7e\ufa7f\ufa80\ufa81\ufa82\ufa83\ufa84\ufa85\ufa86\ufa87\ufa88\ufa89\ufa8a\ufa8b\ufa8c\ufa8d\ufa8e\ufa8f\ufa90\ufa91\ufa92\ufa93\ufa94\ufa95\ufa96\ufa97\ufa98\ufa99\ufa9a\ufa9b\ufa9c\ufa9d\ufa9e\ufa9f\ufaa0\ufaa1\ufaa2\ufaa3\ufaa4\ufaa5\ufaa6\ufaa7\ufaa8\ufaa9\ufaaa\ufaab\ufaac\ufaad\ufaae\ufaaf\ufab0\ufab1\ufab2\ufab3\ufab4\ufab5\ufab6\ufab7\ufab8\ufab9\ufaba\ufabb\ufabc\ufabd\ufabe\ufabf\ufac0\ufac1\ufac2\ufac3\ufac4\ufac5\ufac6\ufac7\ufac8\ufac9\ufaca\ufacb\ufacc\ufacd\uface\ufacf\ufad0\ufad1\ufad2\ufad3\ufad4\ufad5\ufad6\ufad7\ufad8\ufad9\ufb1d\ufb1f\ufb20\ufb21\ufb22\ufb23\ufb24\ufb25\ufb26\ufb27\ufb28\ufb2a\ufb2b\ufb2c\ufb2d\ufb2e\ufb2f\ufb30\ufb31\ufb32\ufb33\ufb34\ufb35\ufb36\ufb38\ufb39\ufb3a\ufb3b\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46\ufb47\ufb48\ufb49\ufb4a\ufb4b\ufb4c\ufb4d\ufb4e\ufb4f\ufb50\ufb51\ufb52\ufb53\ufb54\ufb55\ufb56\ufb57\ufb58\ufb59\ufb5a\ufb5b\ufb5c\ufb5d\ufb5e\ufb5f\ufb60\ufb61\ufb62\ufb63\ufb64\ufb65\ufb66\ufb67\ufb68\ufb69\ufb6a\ufb6b\ufb6c\ufb6d\ufb6e\ufb6f\ufb70\ufb71\ufb72\ufb73\ufb74\ufb75\ufb76\ufb77\ufb78\ufb79\ufb7a\ufb7b\ufb7c\ufb7d\ufb7e\ufb7f\ufb80\ufb81\ufb82\ufb83\ufb84\ufb85\ufb86\ufb87\ufb88\ufb89\ufb8a\ufb8b\ufb8c\ufb8d\ufb8e\ufb8f\ufb90\ufb91\ufb92\ufb93\ufb94\ufb95\ufb96\ufb97\ufb98\ufb99\ufb9a\ufb9b\ufb9c\ufb9d\ufb9e\ufb9f\ufba0\ufba1\ufba2\ufba3\ufba4\ufba5\ufba6\ufba7\ufba8\ufba9\ufbaa\ufbab\ufbac\ufbad\ufbae\ufbaf\ufbb0\ufbb1\ufbd3\ufbd4\ufbd5\ufbd6\ufbd7\ufbd8\ufbd9\ufbda\ufbdb\ufbdc\ufbdd\ufbde\ufbdf\ufbe0\ufbe1\ufbe2\ufbe3\ufbe4\ufbe5\ufbe6\ufbe7\ufbe8\ufbe9\ufbea\ufbeb\ufbec\ufbed\ufbee\ufbef\ufbf0\ufbf1\ufbf2\ufbf3\ufbf4\ufbf5\ufbf6\ufbf7\ufbf8\ufbf9\ufbfa\ufbfb\ufbfc\ufbfd\ufbfe\ufbff\ufc00\ufc01\ufc02\ufc03\ufc04\ufc05\ufc06\ufc07\ufc08\ufc09\ufc0a\ufc0b\ufc0c\ufc0d\ufc0e\ufc0f\ufc10\ufc11\ufc12\ufc13\ufc14\ufc15\ufc16\ufc17\ufc18\ufc19\ufc1a\ufc1b\ufc1c\ufc1d\ufc1e\ufc1f\ufc20\ufc21\ufc22\ufc23\ufc24\ufc25\ufc26\ufc27\ufc28\ufc29\ufc2a\ufc2b\ufc2c\ufc2d\ufc2e\ufc2f\ufc30\ufc31\ufc32\ufc33\ufc34\ufc35\ufc36\ufc37\ufc38\ufc39\ufc3a\ufc3b\ufc3c\ufc3d\ufc3e\ufc3f\ufc40\ufc41\ufc42\ufc43\ufc44\ufc45\ufc46\ufc47\ufc48\ufc49\ufc4a\ufc4b\ufc4c\ufc4d\ufc4e\ufc4f\ufc50\ufc51\ufc52\ufc53\ufc54\ufc55\ufc56\ufc57\ufc58\ufc59\ufc5a\ufc5b\ufc5c\ufc5d\ufc5e\ufc5f\ufc60\ufc61\ufc62\ufc63\ufc64\ufc65\ufc66\ufc67\ufc68\ufc69\ufc6a\ufc6b\ufc6c\ufc6d\ufc6e\ufc6f\ufc70\ufc71\ufc72\ufc73\ufc74\ufc75\ufc76\ufc77\ufc78\ufc79\ufc7a\ufc7b\ufc7c\ufc7d\ufc7e\ufc7f\ufc80\ufc81\ufc82\ufc83\ufc84\ufc85\ufc86\ufc87\ufc88\ufc89\ufc8a\ufc8b\ufc8c\ufc8d\ufc8e\ufc8f\ufc90\ufc91\ufc92\ufc93\ufc94\ufc95\ufc96\ufc97\ufc98\ufc99\ufc9a\ufc9b\ufc9c\ufc9d\ufc9e\ufc9f\ufca0\ufca1\ufca2\ufca3\ufca4\ufca5\ufca6\ufca7\ufca8\ufca9\ufcaa\ufcab\ufcac\ufcad\ufcae\ufcaf\ufcb0\ufcb1\ufcb2\ufcb3\ufcb4\ufcb5\ufcb6\ufcb7\ufcb8\ufcb9\ufcba\ufcbb\ufcbc\ufcbd\ufcbe\ufcbf\ufcc0\ufcc1\ufcc2\ufcc3\ufcc4\ufcc5\ufcc6\ufcc7\ufcc8\ufcc9\ufcca\ufccb\ufccc\ufccd\ufcce\ufccf\ufcd0\ufcd1\ufcd2\ufcd3\ufcd4\ufcd5\ufcd6\ufcd7\ufcd8\ufcd9\ufcda\ufcdb\ufcdc\ufcdd\ufcde\ufcdf\ufce0\ufce1\ufce2\ufce3\ufce4\ufce5\ufce6\ufce7\ufce8\ufce9\ufcea\ufceb\ufcec\ufced\ufcee\ufcef\ufcf0\ufcf1\ufcf2\ufcf3\ufcf4\ufcf5\ufcf6\ufcf7\ufcf8\ufcf9\ufcfa\ufcfb\ufcfc\ufcfd\ufcfe\ufcff\ufd00\ufd01\ufd02\ufd03\ufd04\ufd05\ufd06\ufd07\ufd08\ufd09\ufd0a\ufd0b\ufd0c\ufd0d\ufd0e\ufd0f\ufd10\ufd11\ufd12\ufd13\ufd14\ufd15\ufd16\ufd17\ufd18\ufd19\ufd1a\ufd1b\ufd1c\ufd1d\ufd1e\ufd1f\ufd20\ufd21\ufd22\ufd23\ufd24\ufd25\ufd26\ufd27\ufd28\ufd29\ufd2a\ufd2b\ufd2c\ufd2d\ufd2e\ufd2f\ufd30\ufd31\ufd32\ufd33\ufd34\ufd35\ufd36\ufd37\ufd38\ufd39\ufd3a\ufd3b\ufd3c\ufd3d\ufd50\ufd51\ufd52\ufd53\ufd54\ufd55\ufd56\ufd57\ufd58\ufd59\ufd5a\ufd5b\ufd5c\ufd5d\ufd5e\ufd5f\ufd60\ufd61\ufd62\ufd63\ufd64\ufd65\ufd66\ufd67\ufd68\ufd69\ufd6a\ufd6b\ufd6c\ufd6d\ufd6e\ufd6f\ufd70\ufd71\ufd72\ufd73\ufd74\ufd75\ufd76\ufd77\ufd78\ufd79\ufd7a\ufd7b\ufd7c\ufd7d\ufd7e\ufd7f\ufd80\ufd81\ufd82\ufd83\ufd84\ufd85\ufd86\ufd87\ufd88\ufd89\ufd8a\ufd8b\ufd8c\ufd8d\ufd8e\ufd8f\ufd92\ufd93\ufd94\ufd95\ufd96\ufd97\ufd98\ufd99\ufd9a\ufd9b\ufd9c\ufd9d\ufd9e\ufd9f\ufda0\ufda1\ufda2\ufda3\ufda4\ufda5\ufda6\ufda7\ufda8\ufda9\ufdaa\ufdab\ufdac\ufdad\ufdae\ufdaf\ufdb0\ufdb1\ufdb2\ufdb3\ufdb4\ufdb5\ufdb6\ufdb7\ufdb8\ufdb9\ufdba\ufdbb\ufdbc\ufdbd\ufdbe\ufdbf\ufdc0\ufdc1\ufdc2\ufdc3\ufdc4\ufdc5\ufdc6\ufdc7\ufdf0\ufdf1\ufdf2\ufdf3\ufdf4\ufdf5\ufdf6\ufdf7\ufdf8\ufdf9\ufdfa\ufdfb\ufe70\ufe71\ufe72\ufe73\ufe74\ufe76\ufe77\ufe78\ufe79\ufe7a\ufe7b\ufe7c\ufe7d\ufe7e\ufe7f\ufe80\ufe81\ufe82\ufe83\ufe84\ufe85\ufe86\ufe87\ufe88\ufe89\ufe8a\ufe8b\ufe8c\ufe8d\ufe8e\ufe8f\ufe90\ufe91\ufe92\ufe93\ufe94\ufe95\ufe96\ufe97\ufe98\ufe99\ufe9a\ufe9b\ufe9c\ufe9d\ufe9e\ufe9f\ufea0\ufea1\ufea2\ufea3\ufea4\ufea5\ufea6\ufea7\ufea8\ufea9\ufeaa\ufeab\ufeac\ufead\ufeae\ufeaf\ufeb0\ufeb1\ufeb2\ufeb3\ufeb4\ufeb5\ufeb6\ufeb7\ufeb8\ufeb9\ufeba\ufebb\ufebc\ufebd\ufebe\ufebf\ufec0\ufec1\ufec2\ufec3\ufec4\ufec5\ufec6\ufec7\ufec8\ufec9\ufeca\ufecb\ufecc\ufecd\ufece\ufecf\ufed0\ufed1\ufed2\ufed3\ufed4\ufed5\ufed6\ufed7\ufed8\ufed9\ufeda\ufedb\ufedc\ufedd\ufede\ufedf\ufee0\ufee1\ufee2\ufee3\ufee4\ufee5\ufee6\ufee7\ufee8\ufee9\ufeea\ufeeb\ufeec\ufeed\ufeee\ufeef\ufef0\ufef1\ufef2\ufef3\ufef4\ufef5\ufef6\ufef7\ufef8\ufef9\ufefa\ufefb\ufefc\uff66\uff67\uff68\uff69\uff6a\uff6b\uff6c\uff6d\uff6e\uff6f\uff71\uff72\uff73\uff74\uff75\uff76\uff77\uff78\uff79\uff7a\uff7b\uff7c\uff7d\uff7e\uff7f\uff80\uff81\uff82\uff83\uff84\uff85\uff86\uff87\uff88\uff89\uff8a\uff8b\uff8c\uff8d\uff8e\uff8f\uff90\uff91\uff92\uff93\uff94\uff95\uff96\uff97\uff98\uff99\uff9a\uff9b\uff9c\uff9d\uffa0\uffa1\uffa2\uffa3\uffa4\uffa5\uffa6\uffa7\uffa8\uffa9\uffaa\uffab\uffac\uffad\uffae\uffaf\uffb0\uffb1\uffb2\uffb3\uffb4\uffb5\uffb6\uffb7\uffb8\uffb9\uffba\uffbb\uffbc\uffbd\uffbe\uffc2\uffc3\uffc4\uffc5\uffc6\uffc7\uffca\uffcb\uffcc\uffcd\uffce\uffcf\uffd2\uffd3\uffd4\uffd5\uffd6\uffd7\uffda\uffdb\uffdc'
-
-Lt = u'\u01c5\u01c8\u01cb\u01f2\u1f88\u1f89\u1f8a\u1f8b\u1f8c\u1f8d\u1f8e\u1f8f\u1f98\u1f99\u1f9a\u1f9b\u1f9c\u1f9d\u1f9e\u1f9f\u1fa8\u1fa9\u1faa\u1fab\u1fac\u1fad\u1fae\u1faf\u1fbc\u1fcc\u1ffc'
-
-Lu = u'ABCDEFGHIJKLMNOPQRSTUVWXYZ\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd8\xd9\xda\xdb\xdc\xdd\xde\u0100\u0102\u0104\u0106\u0108\u010a\u010c\u010e\u0110\u0112\u0114\u0116\u0118\u011a\u011c\u011e\u0120\u0122\u0124\u0126\u0128\u012a\u012c\u012e\u0130\u0132\u0134\u0136\u0139\u013b\u013d\u013f\u0141\u0143\u0145\u0147\u014a\u014c\u014e\u0150\u0152\u0154\u0156\u0158\u015a\u015c\u015e\u0160\u0162\u0164\u0166\u0168\u016a\u016c\u016e\u0170\u0172\u0174\u0176\u0178\u0179\u017b\u017d\u0181\u0182\u0184\u0186\u0187\u0189\u018a\u018b\u018e\u018f\u0190\u0191\u0193\u0194\u0196\u0197\u0198\u019c\u019d\u019f\u01a0\u01a2\u01a4\u01a6\u01a7\u01a9\u01ac\u01ae\u01af\u01b1\u01b2\u01b3\u01b5\u01b7\u01b8\u01bc\u01c4\u01c7\u01ca\u01cd\u01cf\u01d1\u01d3\u01d5\u01d7\u01d9\u01db\u01de\u01e0\u01e2\u01e4\u01e6\u01e8\u01ea\u01ec\u01ee\u01f1\u01f4\u01f6\u01f7\u01f8\u01fa\u01fc\u01fe\u0200\u0202\u0204\u0206\u0208\u020a\u020c\u020e\u0210\u0212\u0214\u0216\u0218\u021a\u021c\u021e\u0220\u0222\u0224\u0226\u0228\u022a\u022c\u022e\u0230\u0232\u023a\u023b\u023d\u023e\u0241\u0386\u0388\u0389\u038a\u038c\u038e\u038f\u0391\u0392\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039a\u039b\u039c\u039d\u039e\u039f\u03a0\u03a1\u03a3\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\u03aa\u03ab\u03d2\u03d3\u03d4\u03d8\u03da\u03dc\u03de\u03e0\u03e2\u03e4\u03e6\u03e8\u03ea\u03ec\u03ee\u03f4\u03f7\u03f9\u03fa\u03fd\u03fe\u03ff\u0400\u0401\u0402\u0403\u0404\u0405\u0406\u0407\u0408\u0409\u040a\u040b\u040c\u040d\u040e\u040f\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u0419\u041a\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a\u042b\u042c\u042d\u042e\u042f\u0460\u0462\u0464\u0466\u0468\u046a\u046c\u046e\u0470\u0472\u0474\u0476\u0478\u047a\u047c\u047e\u0480\u048a\u048c\u048e\u0490\u0492\u0494\u0496\u0498\u049a\u049c\u049e\u04a0\u04a2\u04a4\u04a6\u04a8\u04aa\u04ac\u04ae\u04b0\u04b2\u04b4\u04b6\u04b8\u04ba\u04bc\u04be\u04c0\u04c1\u04c3\u04c5\u04c7\u04c9\u04cb\u04cd\u04d0\u04d2\u04d4\u04d6\u04d8\u04da\u04dc\u04de\u04e0\u04e2\u04e4\u04e6\u04e8\u04ea\u04ec\u04ee\u04f0\u04f2\u04f4\u04f6\u04f8\u0500\u0502\u0504\u0506\u0508\u050a\u050c\u050e\u0531\u0532\u0533\u0534\u0535\u0536\u0537\u0538\u0539\u053a\u053b\u053c\u053d\u053e\u053f\u0540\u0541\u0542\u0543\u0544\u0545\u0546\u0547\u0548\u0549\u054a\u054b\u054c\u054d\u054e\u054f\u0550\u0551\u0552\u0553\u0554\u0555\u0556\u10a0\u10a1\u10a2\u10a3\u10a4\u10a5\u10a6\u10a7\u10a8\u10a9\u10aa\u10ab\u10ac\u10ad\u10ae\u10af\u10b0\u10b1\u10b2\u10b3\u10b4\u10b5\u10b6\u10b7\u10b8\u10b9\u10ba\u10bb\u10bc\u10bd\u10be\u10bf\u10c0\u10c1\u10c2\u10c3\u10c4\u10c5\u1e00\u1e02\u1e04\u1e06\u1e08\u1e0a\u1e0c\u1e0e\u1e10\u1e12\u1e14\u1e16\u1e18\u1e1a\u1e1c\u1e1e\u1e20\u1e22\u1e24\u1e26\u1e28\u1e2a\u1e2c\u1e2e\u1e30\u1e32\u1e34\u1e36\u1e38\u1e3a\u1e3c\u1e3e\u1e40\u1e42\u1e44\u1e46\u1e48\u1e4a\u1e4c\u1e4e\u1e50\u1e52\u1e54\u1e56\u1e58\u1e5a\u1e5c\u1e5e\u1e60\u1e62\u1e64\u1e66\u1e68\u1e6a\u1e6c\u1e6e\u1e70\u1e72\u1e74\u1e76\u1e78\u1e7a\u1e7c\u1e7e\u1e80\u1e82\u1e84\u1e86\u1e88\u1e8a\u1e8c\u1e8e\u1e90\u1e92\u1e94\u1ea0\u1ea2\u1ea4\u1ea6\u1ea8\u1eaa\u1eac\u1eae\u1eb0\u1eb2\u1eb4\u1eb6\u1eb8\u1eba\u1ebc\u1ebe\u1ec0\u1ec2\u1ec4\u1ec6\u1ec8\u1eca\u1ecc\u1ece\u1ed0\u1ed2\u1ed4\u1ed6\u1ed8\u1eda\u1edc\u1ede\u1ee0\u1ee2\u1ee4\u1ee6\u1ee8\u1eea\u1eec\u1eee\u1ef0\u1ef2\u1ef4\u1ef6\u1ef8\u1f08\u1f09\u1f0a\u1f0b\u1f0c\u1f0d\u1f0e\u1f0f\u1f18\u1f19\u1f1a\u1f1b\u1f1c\u1f1d\u1f28\u1f29\u1f2a\u1f2b\u1f2c\u1f2d\u1f2e\u1f2f\u1f38\u1f39\u1f3a\u1f3b\u1f3c\u1f3d\u1f3e\u1f3f\u1f48\u1f49\u1f4a\u1f4b\u1f4c\u1f4d\u1f59\u1f5b\u1f5d\u1f5f\u1f68\u1f69\u1f6a\u1f6b\u1f6c\u1f6d\u1f6e\u1f6f\u1fb8\u1fb9\u1fba\u1fbb\u1fc8\u1fc9\u1fca\u1fcb\u1fd8\u1fd9\u1fda\u1fdb\u1fe8\u1fe9\u1fea\u1feb\u1fec\u1ff8\u1ff9\u1ffa\u1ffb\u2102\u2107\u210b\u210c\u210d\u2110\u2111\u2112\u2115\u2119\u211a\u211b\u211c\u211d\u2124\u2126\u2128\u212a\u212b\u212c\u212d\u2130\u2131\u2133\u213e\u213f\u2145\u2c00\u2c01\u2c02\u2c03\u2c04\u2c05\u2c06\u2c07\u2c08\u2c09\u2c0a\u2c0b\u2c0c\u2c0d\u2c0e\u2c0f\u2c10\u2c11\u2c12\u2c13\u2c14\u2c15\u2c16\u2c17\u2c18\u2c19\u2c1a\u2c1b\u2c1c\u2c1d\u2c1e\u2c1f\u2c20\u2c21\u2c22\u2c23\u2c24\u2c25\u2c26\u2c27\u2c28\u2c29\u2c2a\u2c2b\u2c2c\u2c2d\u2c2e\u2c80\u2c82\u2c84\u2c86\u2c88\u2c8a\u2c8c\u2c8e\u2c90\u2c92\u2c94\u2c96\u2c98\u2c9a\u2c9c\u2c9e\u2ca0\u2ca2\u2ca4\u2ca6\u2ca8\u2caa\u2cac\u2cae\u2cb0\u2cb2\u2cb4\u2cb6\u2cb8\u2cba\u2cbc\u2cbe\u2cc0\u2cc2\u2cc4\u2cc6\u2cc8\u2cca\u2ccc\u2cce\u2cd0\u2cd2\u2cd4\u2cd6\u2cd8\u2cda\u2cdc\u2cde\u2ce0\u2ce2\uff21\uff22\uff23\uff24\uff25\uff26\uff27\uff28\uff29\uff2a\uff2b\uff2c\uff2d\uff2e\uff2f\uff30\uff31\uff32\uff33\uff34\uff35\uff36\uff37\uff38\uff39\uff3a'
-
-Mc = u'\u0903\u093e\u093f\u0940\u0949\u094a\u094b\u094c\u0982\u0983\u09be\u09bf\u09c0\u09c7\u09c8\u09cb\u09cc\u09d7\u0a03\u0a3e\u0a3f\u0a40\u0a83\u0abe\u0abf\u0ac0\u0ac9\u0acb\u0acc\u0b02\u0b03\u0b3e\u0b40\u0b47\u0b48\u0b4b\u0b4c\u0b57\u0bbe\u0bbf\u0bc1\u0bc2\u0bc6\u0bc7\u0bc8\u0bca\u0bcb\u0bcc\u0bd7\u0c01\u0c02\u0c03\u0c41\u0c42\u0c43\u0c44\u0c82\u0c83\u0cbe\u0cc0\u0cc1\u0cc2\u0cc3\u0cc4\u0cc7\u0cc8\u0cca\u0ccb\u0cd5\u0cd6\u0d02\u0d03\u0d3e\u0d3f\u0d40\u0d46\u0d47\u0d48\u0d4a\u0d4b\u0d4c\u0d57\u0d82\u0d83\u0dcf\u0dd0\u0dd1\u0dd8\u0dd9\u0dda\u0ddb\u0ddc\u0ddd\u0dde\u0ddf\u0df2\u0df3\u0f3e\u0f3f\u0f7f\u102c\u1031\u1038\u1056\u1057\u17b6\u17be\u17bf\u17c0\u17c1\u17c2\u17c3\u17c4\u17c5\u17c7\u17c8\u1923\u1924\u1925\u1926\u1929\u192a\u192b\u1930\u1931\u1933\u1934\u1935\u1936\u1937\u1938\u19b0\u19b1\u19b2\u19b3\u19b4\u19b5\u19b6\u19b7\u19b8\u19b9\u19ba\u19bb\u19bc\u19bd\u19be\u19bf\u19c0\u19c8\u19c9\u1a19\u1a1a\u1a1b\ua802\ua823\ua824\ua827'
-
-Me = u'\u0488\u0489\u06de\u20dd\u20de\u20df\u20e0\u20e2\u20e3\u20e4'
-
-Mn = u'\u0300\u0301\u0302\u0303\u0304\u0305\u0306\u0307\u0308\u0309\u030a\u030b\u030c\u030d\u030e\u030f\u0310\u0311\u0312\u0313\u0314\u0315\u0316\u0317\u0318\u0319\u031a\u031b\u031c\u031d\u031e\u031f\u0320\u0321\u0322\u0323\u0324\u0325\u0326\u0327\u0328\u0329\u032a\u032b\u032c\u032d\u032e\u032f\u0330\u0331\u0332\u0333\u0334\u0335\u0336\u0337\u0338\u0339\u033a\u033b\u033c\u033d\u033e\u033f\u0340\u0341\u0342\u0343\u0344\u0345\u0346\u0347\u0348\u0349\u034a\u034b\u034c\u034d\u034e\u034f\u0350\u0351\u0352\u0353\u0354\u0355\u0356\u0357\u0358\u0359\u035a\u035b\u035c\u035d\u035e\u035f\u0360\u0361\u0362\u0363\u0364\u0365\u0366\u0367\u0368\u0369\u036a\u036b\u036c\u036d\u036e\u036f\u0483\u0484\u0485\u0486\u0591\u0592\u0593\u0594\u0595\u0596\u0597\u0598\u0599\u059a\u059b\u059c\u059d\u059e\u059f\u05a0\u05a1\u05a2\u05a3\u05a4\u05a5\u05a6\u05a7\u05a8\u05a9\u05aa\u05ab\u05ac\u05ad\u05ae\u05af\u05b0\u05b1\u05b2\u05b3\u05b4\u05b5\u05b6\u05b7\u05b8\u05b9\u05bb\u05bc\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610\u0611\u0612\u0613\u0614\u0615\u064b\u064c\u064d\u064e\u064f\u0650\u0651\u0652\u0653\u0654\u0655\u0656\u0657\u0658\u0659\u065a\u065b\u065c\u065d\u065e\u0670\u06d6\u06d7\u06d8\u06d9\u06da\u06db\u06dc\u06df\u06e0\u06e1\u06e2\u06e3\u06e4\u06e7\u06e8\u06ea\u06eb\u06ec\u06ed\u0711\u0730\u0731\u0732\u0733\u0734\u0735\u0736\u0737\u0738\u0739\u073a\u073b\u073c\u073d\u073e\u073f\u0740\u0741\u0742\u0743\u0744\u0745\u0746\u0747\u0748\u0749\u074a\u07a6\u07a7\u07a8\u07a9\u07aa\u07ab\u07ac\u07ad\u07ae\u07af\u07b0\u0901\u0902\u093c\u0941\u0942\u0943\u0944\u0945\u0946\u0947\u0948\u094d\u0951\u0952\u0953\u0954\u0962\u0963\u0981\u09bc\u09c1\u09c2\u09c3\u09c4\u09cd\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b\u0a4c\u0a4d\u0a70\u0a71\u0a81\u0a82\u0abc\u0ac1\u0ac2\u0ac3\u0ac4\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3f\u0b41\u0b42\u0b43\u0b4d\u0b56\u0b82\u0bc0\u0bcd\u0c3e\u0c3f\u0c40\u0c46\u0c47\u0c48\u0c4a\u0c4b\u0c4c\u0c4d\u0c55\u0c56\u0cbc\u0cbf\u0cc6\u0ccc\u0ccd\u0d41\u0d42\u0d43\u0d4d\u0dca\u0dd2\u0dd3\u0dd4\u0dd6\u0e31\u0e34\u0e35\u0e36\u0e37\u0e38\u0e39\u0e3a\u0e47\u0e48\u0e49\u0e4a\u0e4b\u0e4c\u0e4d\u0e4e\u0eb1\u0eb4\u0eb5\u0eb6\u0eb7\u0eb8\u0eb9\u0ebb\u0ebc\u0ec8\u0ec9\u0eca\u0ecb\u0ecc\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71\u0f72\u0f73\u0f74\u0f75\u0f76\u0f77\u0f78\u0f79\u0f7a\u0f7b\u0f7c\u0f7d\u0f7e\u0f80\u0f81\u0f82\u0f83\u0f84\u0f86\u0f87\u0f90\u0f91\u0f92\u0f93\u0f94\u0f95\u0f96\u0f97\u0f99\u0f9a\u0f9b\u0f9c\u0f9d\u0f9e\u0f9f\u0fa0\u0fa1\u0fa2\u0fa3\u0fa4\u0fa5\u0fa6\u0fa7\u0fa8\u0fa9\u0faa\u0fab\u0fac\u0fad\u0fae\u0faf\u0fb0\u0fb1\u0fb2\u0fb3\u0fb4\u0fb5\u0fb6\u0fb7\u0fb8\u0fb9\u0fba\u0fbb\u0fbc\u0fc6\u102d\u102e\u102f\u1030\u1032\u1036\u1037\u1039\u1058\u1059\u135f\u1712\u1713\u1714\u1732\u1733\u1734\u1752\u1753\u1772\u1773\u17b7\u17b8\u17b9\u17ba\u17bb\u17bc\u17bd\u17c6\u17c9\u17ca\u17cb\u17cc\u17cd\u17ce\u17cf\u17d0\u17d1\u17d2\u17d3\u17dd\u180b\u180c\u180d\u18a9\u1920\u1921\u1922\u1927\u1928\u1932\u1939\u193a\u193b\u1a17\u1a18\u1dc0\u1dc1\u1dc2\u1dc3\u20d0\u20d1\u20d2\u20d3\u20d4\u20d5\u20d6\u20d7\u20d8\u20d9\u20da\u20db\u20dc\u20e1\u20e5\u20e6\u20e7\u20e8\u20e9\u20ea\u20eb\u302a\u302b\u302c\u302d\u302e\u302f\u3099\u309a\ua806\ua80b\ua825\ua826\ufb1e\ufe00\ufe01\ufe02\ufe03\ufe04\ufe05\ufe06\ufe07\ufe08\ufe09\ufe0a\ufe0b\ufe0c\ufe0d\ufe0e\ufe0f\ufe20\ufe21\ufe22\ufe23'
-
-Nd = u'0123456789\u0660\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9\u0966\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f\u09e6\u09e7\u09e8\u09e9\u09ea\u09eb\u09ec\u09ed\u09ee\u09ef\u0a66\u0a67\u0a68\u0a69\u0a6a\u0a6b\u0a6c\u0a6d\u0a6e\u0a6f\u0ae6\u0ae7\u0ae8\u0ae9\u0aea\u0aeb\u0aec\u0aed\u0aee\u0aef\u0b66\u0b67\u0b68\u0b69\u0b6a\u0b6b\u0b6c\u0b6d\u0b6e\u0b6f\u0be6\u0be7\u0be8\u0be9\u0bea\u0beb\u0bec\u0bed\u0bee\u0bef\u0c66\u0c67\u0c68\u0c69\u0c6a\u0c6b\u0c6c\u0c6d\u0c6e\u0c6f\u0ce6\u0ce7\u0ce8\u0ce9\u0cea\u0ceb\u0cec\u0ced\u0cee\u0cef\u0d66\u0d67\u0d68\u0d69\u0d6a\u0d6b\u0d6c\u0d6d\u0d6e\u0d6f\u0e50\u0e51\u0e52\u0e53\u0e54\u0e55\u0e56\u0e57\u0e58\u0e59\u0ed0\u0ed1\u0ed2\u0ed3\u0ed4\u0ed5\u0ed6\u0ed7\u0ed8\u0ed9\u0f20\u0f21\u0f22\u0f23\u0f24\u0f25\u0f26\u0f27\u0f28\u0f29\u1040\u1041\u1042\u1043\u1044\u1045\u1046\u1047\u1048\u1049\u17e0\u17e1\u17e2\u17e3\u17e4\u17e5\u17e6\u17e7\u17e8\u17e9\u1810\u1811\u1812\u1813\u1814\u1815\u1816\u1817\u1818\u1819\u1946\u1947\u1948\u1949\u194a\u194b\u194c\u194d\u194e\u194f\u19d0\u19d1\u19d2\u19d3\u19d4\u19d5\u19d6\u19d7\u19d8\u19d9\uff10\uff11\uff12\uff13\uff14\uff15\uff16\uff17\uff18\uff19'
-
-Nl = u'\u16ee\u16ef\u16f0\u2160\u2161\u2162\u2163\u2164\u2165\u2166\u2167\u2168\u2169\u216a\u216b\u216c\u216d\u216e\u216f\u2170\u2171\u2172\u2173\u2174\u2175\u2176\u2177\u2178\u2179\u217a\u217b\u217c\u217d\u217e\u217f\u2180\u2181\u2182\u2183\u3007\u3021\u3022\u3023\u3024\u3025\u3026\u3027\u3028\u3029\u3038\u3039\u303a'
-
-No = u'\xb2\xb3\xb9\xbc\xbd\xbe\u09f4\u09f5\u09f6\u09f7\u09f8\u09f9\u0bf0\u0bf1\u0bf2\u0f2a\u0f2b\u0f2c\u0f2d\u0f2e\u0f2f\u0f30\u0f31\u0f32\u0f33\u1369\u136a\u136b\u136c\u136d\u136e\u136f\u1370\u1371\u1372\u1373\u1374\u1375\u1376\u1377\u1378\u1379\u137a\u137b\u137c\u17f0\u17f1\u17f2\u17f3\u17f4\u17f5\u17f6\u17f7\u17f8\u17f9\u2070\u2074\u2075\u2076\u2077\u2078\u2079\u2080\u2081\u2082\u2083\u2084\u2085\u2086\u2087\u2088\u2089\u2153\u2154\u2155\u2156\u2157\u2158\u2159\u215a\u215b\u215c\u215d\u215e\u215f\u2460\u2461\u2462\u2463\u2464\u2465\u2466\u2467\u2468\u2469\u246a\u246b\u246c\u246d\u246e\u246f\u2470\u2471\u2472\u2473\u2474\u2475\u2476\u2477\u2478\u2479\u247a\u247b\u247c\u247d\u247e\u247f\u2480\u2481\u2482\u2483\u2484\u2485\u2486\u2487\u2488\u2489\u248a\u248b\u248c\u248d\u248e\u248f\u2490\u2491\u2492\u2493\u2494\u2495\u2496\u2497\u2498\u2499\u249a\u249b\u24ea\u24eb\u24ec\u24ed\u24ee\u24ef\u24f0\u24f1\u24f2\u24f3\u24f4\u24f5\u24f6\u24f7\u24f8\u24f9\u24fa\u24fb\u24fc\u24fd\u24fe\u24ff\u2776\u2777\u2778\u2779\u277a\u277b\u277c\u277d\u277e\u277f\u2780\u2781\u2782\u2783\u2784\u2785\u2786\u2787\u2788\u2789\u278a\u278b\u278c\u278d\u278e\u278f\u2790\u2791\u2792\u2793\u2cfd\u3192\u3193\u3194\u3195\u3220\u3221\u3222\u3223\u3224\u3225\u3226\u3227\u3228\u3229\u3251\u3252\u3253\u3254\u3255\u3256\u3257\u3258\u3259\u325a\u325b\u325c\u325d\u325e\u325f\u3280\u3281\u3282\u3283\u3284\u3285\u3286\u3287\u3288\u3289\u32b1\u32b2\u32b3\u32b4\u32b5\u32b6\u32b7\u32b8\u32b9\u32ba\u32bb\u32bc\u32bd\u32be\u32bf'
-
-Pc = u'_\u203f\u2040\u2054\ufe33\ufe34\ufe4d\ufe4e\ufe4f\uff3f'
-
-Pd = u'-\u058a\u1806\u2010\u2011\u2012\u2013\u2014\u2015\u2e17\u301c\u3030\u30a0\ufe31\ufe32\ufe58\ufe63\uff0d'
-
-Pe = u')]}\u0f3b\u0f3d\u169c\u2046\u207e\u208e\u232a\u23b5\u2769\u276b\u276d\u276f\u2771\u2773\u2775\u27c6\u27e7\u27e9\u27eb\u2984\u2986\u2988\u298a\u298c\u298e\u2990\u2992\u2994\u2996\u2998\u29d9\u29db\u29fd\u3009\u300b\u300d\u300f\u3011\u3015\u3017\u3019\u301b\u301e\u301f\ufd3f\ufe18\ufe36\ufe38\ufe3a\ufe3c\ufe3e\ufe40\ufe42\ufe44\ufe48\ufe5a\ufe5c\ufe5e\uff09\uff3d\uff5d\uff60\uff63'
-
-Pf = u'\xbb\u2019\u201d\u203a\u2e03\u2e05\u2e0a\u2e0d\u2e1d'
-
-Pi = u'\xab\u2018\u201b\u201c\u201f\u2039\u2e02\u2e04\u2e09\u2e0c\u2e1c'
-
-Po = u'!"#%&\'*,./:;?@\\\xa1\xb7\xbf\u037e\u0387\u055a\u055b\u055c\u055d\u055e\u055f\u0589\u05be\u05c0\u05c3\u05c6\u05f3\u05f4\u060c\u060d\u061b\u061e\u061f\u066a\u066b\u066c\u066d\u06d4\u0700\u0701\u0702\u0703\u0704\u0705\u0706\u0707\u0708\u0709\u070a\u070b\u070c\u070d\u0964\u0965\u0970\u0df4\u0e4f\u0e5a\u0e5b\u0f04\u0f05\u0f06\u0f07\u0f08\u0f09\u0f0a\u0f0b\u0f0c\u0f0d\u0f0e\u0f0f\u0f10\u0f11\u0f12\u0f85\u0fd0\u0fd1\u104a\u104b\u104c\u104d\u104e\u104f\u10fb\u1361\u1362\u1363\u1364\u1365\u1366\u1367\u1368\u166d\u166e\u16eb\u16ec\u16ed\u1735\u1736\u17d4\u17d5\u17d6\u17d8\u17d9\u17da\u1800\u1801\u1802\u1803\u1804\u1805\u1807\u1808\u1809\u180a\u1944\u1945\u19de\u19df\u1a1e\u1a1f\u2016\u2017\u2020\u2021\u2022\u2023\u2024\u2025\u2026\u2027\u2030\u2031\u2032\u2033\u2034\u2035\u2036\u2037\u2038\u203b\u203c\u203d\u203e\u2041\u2042\u2043\u2047\u2048\u2049\u204a\u204b\u204c\u204d\u204e\u204f\u2050\u2051\u2053\u2055\u2056\u2057\u2058\u2059\u205a\u205b\u205c\u205d\u205e\u23b6\u2cf9\u2cfa\u2cfb\u2cfc\u2cfe\u2cff\u2e00\u2e01\u2e06\u2e07\u2e08\u2e0b\u2e0e\u2e0f\u2e10\u2e11\u2e12\u2e13\u2e14\u2e15\u2e16\u3001\u3002\u3003\u303d\u30fb\ufe10\ufe11\ufe12\ufe13\ufe14\ufe15\ufe16\ufe19\ufe30\ufe45\ufe46\ufe49\ufe4a\ufe4b\ufe4c\ufe50\ufe51\ufe52\ufe54\ufe55\ufe56\ufe57\ufe5f\ufe60\ufe61\ufe68\ufe6a\ufe6b\uff01\uff02\uff03\uff05\uff06\uff07\uff0a\uff0c\uff0e\uff0f\uff1a\uff1b\uff1f\uff20\uff3c\uff61\uff64\uff65'
-
-Ps = u'([{\u0f3a\u0f3c\u169b\u201a\u201e\u2045\u207d\u208d\u2329\u23b4\u2768\u276a\u276c\u276e\u2770\u2772\u2774\u27c5\u27e6\u27e8\u27ea\u2983\u2985\u2987\u2989\u298b\u298d\u298f\u2991\u2993\u2995\u2997\u29d8\u29da\u29fc\u3008\u300a\u300c\u300e\u3010\u3014\u3016\u3018\u301a\u301d\ufd3e\ufe17\ufe35\ufe37\ufe39\ufe3b\ufe3d\ufe3f\ufe41\ufe43\ufe47\ufe59\ufe5b\ufe5d\uff08\uff3b\uff5b\uff5f\uff62'
-
-Sc = u'$\xa2\xa3\xa4\xa5\u060b\u09f2\u09f3\u0af1\u0bf9\u0e3f\u17db\u20a0\u20a1\u20a2\u20a3\u20a4\u20a5\u20a6\u20a7\u20a8\u20a9\u20aa\u20ab\u20ac\u20ad\u20ae\u20af\u20b0\u20b1\u20b2\u20b3\u20b4\u20b5\ufdfc\ufe69\uff04\uffe0\uffe1\uffe5\uffe6'
-
-Sk = u'^`\xa8\xaf\xb4\xb8\u02c2\u02c3\u02c4\u02c5\u02d2\u02d3\u02d4\u02d5\u02d6\u02d7\u02d8\u02d9\u02da\u02db\u02dc\u02dd\u02de\u02df\u02e5\u02e6\u02e7\u02e8\u02e9\u02ea\u02eb\u02ec\u02ed\u02ef\u02f0\u02f1\u02f2\u02f3\u02f4\u02f5\u02f6\u02f7\u02f8\u02f9\u02fa\u02fb\u02fc\u02fd\u02fe\u02ff\u0374\u0375\u0384\u0385\u1fbd\u1fbf\u1fc0\u1fc1\u1fcd\u1fce\u1fcf\u1fdd\u1fde\u1fdf\u1fed\u1fee\u1fef\u1ffd\u1ffe\u309b\u309c\ua700\ua701\ua702\ua703\ua704\ua705\ua706\ua707\ua708\ua709\ua70a\ua70b\ua70c\ua70d\ua70e\ua70f\ua710\ua711\ua712\ua713\ua714\ua715\ua716\uff3e\uff40\uffe3'
-
-Sm = u'+<=>|~\xac\xb1\xd7\xf7\u03f6\u2044\u2052\u207a\u207b\u207c\u208a\u208b\u208c\u2140\u2141\u2142\u2143\u2144\u214b\u2190\u2191\u2192\u2193\u2194\u219a\u219b\u21a0\u21a3\u21a6\u21ae\u21ce\u21cf\u21d2\u21d4\u21f4\u21f5\u21f6\u21f7\u21f8\u21f9\u21fa\u21fb\u21fc\u21fd\u21fe\u21ff\u2200\u2201\u2202\u2203\u2204\u2205\u2206\u2207\u2208\u2209\u220a\u220b\u220c\u220d\u220e\u220f\u2210\u2211\u2212\u2213\u2214\u2215\u2216\u2217\u2218\u2219\u221a\u221b\u221c\u221d\u221e\u221f\u2220\u2221\u2222\u2223\u2224\u2225\u2226\u2227\u2228\u2229\u222a\u222b\u222c\u222d\u222e\u222f\u2230\u2231\u2232\u2233\u2234\u2235\u2236\u2237\u2238\u2239\u223a\u223b\u223c\u223d\u223e\u223f\u2240\u2241\u2242\u2243\u2244\u2245\u2246\u2247\u2248\u2249\u224a\u224b\u224c\u224d\u224e\u224f\u2250\u2251\u2252\u2253\u2254\u2255\u2256\u2257\u2258\u2259\u225a\u225b\u225c\u225d\u225e\u225f\u2260\u2261\u2262\u2263\u2264\u2265\u2266\u2267\u2268\u2269\u226a\u226b\u226c\u226d\u226e\u226f\u2270\u2271\u2272\u2273\u2274\u2275\u2276\u2277\u2278\u2279\u227a\u227b\u227c\u227d\u227e\u227f\u2280\u2281\u2282\u2283\u2284\u2285\u2286\u2287\u2288\u2289\u228a\u228b\u228c\u228d\u228e\u228f\u2290\u2291\u2292\u2293\u2294\u2295\u2296\u2297\u2298\u2299\u229a\u229b\u229c\u229d\u229e\u229f\u22a0\u22a1\u22a2\u22a3\u22a4\u22a5\u22a6\u22a7\u22a8\u22a9\u22aa\u22ab\u22ac\u22ad\u22ae\u22af\u22b0\u22b1\u22b2\u22b3\u22b4\u22b5\u22b6\u22b7\u22b8\u22b9\u22ba\u22bb\u22bc\u22bd\u22be\u22bf\u22c0\u22c1\u22c2\u22c3\u22c4\u22c5\u22c6\u22c7\u22c8\u22c9\u22ca\u22cb\u22cc\u22cd\u22ce\u22cf\u22d0\u22d1\u22d2\u22d3\u22d4\u22d5\u22d6\u22d7\u22d8\u22d9\u22da\u22db\u22dc\u22dd\u22de\u22df\u22e0\u22e1\u22e2\u22e3\u22e4\u22e5\u22e6\u22e7\u22e8\u22e9\u22ea\u22eb\u22ec\u22ed\u22ee\u22ef\u22f0\u22f1\u22f2\u22f3\u22f4\u22f5\u22f6\u22f7\u22f8\u22f9\u22fa\u22fb\u22fc\u22fd\u22fe\u22ff\u2308\u2309\u230a\u230b\u2320\u2321\u237c\u239b\u239c\u239d\u239e\u239f\u23a0\u23a1\u23a2\u23a3\u23a4\u23a5\u23a6\u23a7\u23a8\u23a9\u23aa\u23ab\u23ac\u23ad\u23ae\u23af\u23b0\u23b1\u23b2\u23b3\u25b7\u25c1\u25f8\u25f9\u25fa\u25fb\u25fc\u25fd\u25fe\u25ff\u266f\u27c0\u27c1\u27c2\u27c3\u27c4\u27d0\u27d1\u27d2\u27d3\u27d4\u27d5\u27d6\u27d7\u27d8\u27d9\u27da\u27db\u27dc\u27dd\u27de\u27df\u27e0\u27e1\u27e2\u27e3\u27e4\u27e5\u27f0\u27f1\u27f2\u27f3\u27f4\u27f5\u27f6\u27f7\u27f8\u27f9\u27fa\u27fb\u27fc\u27fd\u27fe\u27ff\u2900\u2901\u2902\u2903\u2904\u2905\u2906\u2907\u2908\u2909\u290a\u290b\u290c\u290d\u290e\u290f\u2910\u2911\u2912\u2913\u2914\u2915\u2916\u2917\u2918\u2919\u291a\u291b\u291c\u291d\u291e\u291f\u2920\u2921\u2922\u2923\u2924\u2925\u2926\u2927\u2928\u2929\u292a\u292b\u292c\u292d\u292e\u292f\u2930\u2931\u2932\u2933\u2934\u2935\u2936\u2937\u2938\u2939\u293a\u293b\u293c\u293d\u293e\u293f\u2940\u2941\u2942\u2943\u2944\u2945\u2946\u2947\u2948\u2949\u294a\u294b\u294c\u294d\u294e\u294f\u2950\u2951\u2952\u2953\u2954\u2955\u2956\u2957\u2958\u2959\u295a\u295b\u295c\u295d\u295e\u295f\u2960\u2961\u2962\u2963\u2964\u2965\u2966\u2967\u2968\u2969\u296a\u296b\u296c\u296d\u296e\u296f\u2970\u2971\u2972\u2973\u2974\u2975\u2976\u2977\u2978\u2979\u297a\u297b\u297c\u297d\u297e\u297f\u2980\u2981\u2982\u2999\u299a\u299b\u299c\u299d\u299e\u299f\u29a0\u29a1\u29a2\u29a3\u29a4\u29a5\u29a6\u29a7\u29a8\u29a9\u29aa\u29ab\u29ac\u29ad\u29ae\u29af\u29b0\u29b1\u29b2\u29b3\u29b4\u29b5\u29b6\u29b7\u29b8\u29b9\u29ba\u29bb\u29bc\u29bd\u29be\u29bf\u29c0\u29c1\u29c2\u29c3\u29c4\u29c5\u29c6\u29c7\u29c8\u29c9\u29ca\u29cb\u29cc\u29cd\u29ce\u29cf\u29d0\u29d1\u29d2\u29d3\u29d4\u29d5\u29d6\u29d7\u29dc\u29dd\u29de\u29df\u29e0\u29e1\u29e2\u29e3\u29e4\u29e5\u29e6\u29e7\u29e8\u29e9\u29ea\u29eb\u29ec\u29ed\u29ee\u29ef\u29f0\u29f1\u29f2\u29f3\u29f4\u29f5\u29f6\u29f7\u29f8\u29f9\u29fa\u29fb\u29fe\u29ff\u2a00\u2a01\u2a02\u2a03\u2a04\u2a05\u2a06\u2a07\u2a08\u2a09\u2a0a\u2a0b\u2a0c\u2a0d\u2a0e\u2a0f\u2a10\u2a11\u2a12\u2a13\u2a14\u2a15\u2a16\u2a17\u2a18\u2a19\u2a1a\u2a1b\u2a1c\u2a1d\u2a1e\u2a1f\u2a20\u2a21\u2a22\u2a23\u2a24\u2a25\u2a26\u2a27\u2a28\u2a29\u2a2a\u2a2b\u2a2c\u2a2d\u2a2e\u2a2f\u2a30\u2a31\u2a32\u2a33\u2a34\u2a35\u2a36\u2a37\u2a38\u2a39\u2a3a\u2a3b\u2a3c\u2a3d\u2a3e\u2a3f\u2a40\u2a41\u2a42\u2a43\u2a44\u2a45\u2a46\u2a47\u2a48\u2a49\u2a4a\u2a4b\u2a4c\u2a4d\u2a4e\u2a4f\u2a50\u2a51\u2a52\u2a53\u2a54\u2a55\u2a56\u2a57\u2a58\u2a59\u2a5a\u2a5b\u2a5c\u2a5d\u2a5e\u2a5f\u2a60\u2a61\u2a62\u2a63\u2a64\u2a65\u2a66\u2a67\u2a68\u2a69\u2a6a\u2a6b\u2a6c\u2a6d\u2a6e\u2a6f\u2a70\u2a71\u2a72\u2a73\u2a74\u2a75\u2a76\u2a77\u2a78\u2a79\u2a7a\u2a7b\u2a7c\u2a7d\u2a7e\u2a7f\u2a80\u2a81\u2a82\u2a83\u2a84\u2a85\u2a86\u2a87\u2a88\u2a89\u2a8a\u2a8b\u2a8c\u2a8d\u2a8e\u2a8f\u2a90\u2a91\u2a92\u2a93\u2a94\u2a95\u2a96\u2a97\u2a98\u2a99\u2a9a\u2a9b\u2a9c\u2a9d\u2a9e\u2a9f\u2aa0\u2aa1\u2aa2\u2aa3\u2aa4\u2aa5\u2aa6\u2aa7\u2aa8\u2aa9\u2aaa\u2aab\u2aac\u2aad\u2aae\u2aaf\u2ab0\u2ab1\u2ab2\u2ab3\u2ab4\u2ab5\u2ab6\u2ab7\u2ab8\u2ab9\u2aba\u2abb\u2abc\u2abd\u2abe\u2abf\u2ac0\u2ac1\u2ac2\u2ac3\u2ac4\u2ac5\u2ac6\u2ac7\u2ac8\u2ac9\u2aca\u2acb\u2acc\u2acd\u2ace\u2acf\u2ad0\u2ad1\u2ad2\u2ad3\u2ad4\u2ad5\u2ad6\u2ad7\u2ad8\u2ad9\u2ada\u2adb\u2adc\u2add\u2ade\u2adf\u2ae0\u2ae1\u2ae2\u2ae3\u2ae4\u2ae5\u2ae6\u2ae7\u2ae8\u2ae9\u2aea\u2aeb\u2aec\u2aed\u2aee\u2aef\u2af0\u2af1\u2af2\u2af3\u2af4\u2af5\u2af6\u2af7\u2af8\u2af9\u2afa\u2afb\u2afc\u2afd\u2afe\u2aff\ufb29\ufe62\ufe64\ufe65\ufe66\uff0b\uff1c\uff1d\uff1e\uff5c\uff5e\uffe2\uffe9\uffea\uffeb\uffec'
-
-So = u'\xa6\xa7\xa9\xae\xb0\xb6\u0482\u060e\u060f\u06e9\u06fd\u06fe\u09fa\u0b70\u0bf3\u0bf4\u0bf5\u0bf6\u0bf7\u0bf8\u0bfa\u0f01\u0f02\u0f03\u0f13\u0f14\u0f15\u0f16\u0f17\u0f1a\u0f1b\u0f1c\u0f1d\u0f1e\u0f1f\u0f34\u0f36\u0f38\u0fbe\u0fbf\u0fc0\u0fc1\u0fc2\u0fc3\u0fc4\u0fc5\u0fc7\u0fc8\u0fc9\u0fca\u0fcb\u0fcc\u0fcf\u1360\u1390\u1391\u1392\u1393\u1394\u1395\u1396\u1397\u1398\u1399\u1940\u19e0\u19e1\u19e2\u19e3\u19e4\u19e5\u19e6\u19e7\u19e8\u19e9\u19ea\u19eb\u19ec\u19ed\u19ee\u19ef\u19f0\u19f1\u19f2\u19f3\u19f4\u19f5\u19f6\u19f7\u19f8\u19f9\u19fa\u19fb\u19fc\u19fd\u19fe\u19ff\u2100\u2101\u2103\u2104\u2105\u2106\u2108\u2109\u2114\u2116\u2117\u2118\u211e\u211f\u2120\u2121\u2122\u2123\u2125\u2127\u2129\u212e\u2132\u213a\u213b\u214a\u214c\u2195\u2196\u2197\u2198\u2199\u219c\u219d\u219e\u219f\u21a1\u21a2\u21a4\u21a5\u21a7\u21a8\u21a9\u21aa\u21ab\u21ac\u21ad\u21af\u21b0\u21b1\u21b2\u21b3\u21b4\u21b5\u21b6\u21b7\u21b8\u21b9\u21ba\u21bb\u21bc\u21bd\u21be\u21bf\u21c0\u21c1\u21c2\u21c3\u21c4\u21c5\u21c6\u21c7\u21c8\u21c9\u21ca\u21cb\u21cc\u21cd\u21d0\u21d1\u21d3\u21d5\u21d6\u21d7\u21d8\u21d9\u21da\u21db\u21dc\u21dd\u21de\u21df\u21e0\u21e1\u21e2\u21e3\u21e4\u21e5\u21e6\u21e7\u21e8\u21e9\u21ea\u21eb\u21ec\u21ed\u21ee\u21ef\u21f0\u21f1\u21f2\u21f3\u2300\u2301\u2302\u2303\u2304\u2305\u2306\u2307\u230c\u230d\u230e\u230f\u2310\u2311\u2312\u2313\u2314\u2315\u2316\u2317\u2318\u2319\u231a\u231b\u231c\u231d\u231e\u231f\u2322\u2323\u2324\u2325\u2326\u2327\u2328\u232b\u232c\u232d\u232e\u232f\u2330\u2331\u2332\u2333\u2334\u2335\u2336\u2337\u2338\u2339\u233a\u233b\u233c\u233d\u233e\u233f\u2340\u2341\u2342\u2343\u2344\u2345\u2346\u2347\u2348\u2349\u234a\u234b\u234c\u234d\u234e\u234f\u2350\u2351\u2352\u2353\u2354\u2355\u2356\u2357\u2358\u2359\u235a\u235b\u235c\u235d\u235e\u235f\u2360\u2361\u2362\u2363\u2364\u2365\u2366\u2367\u2368\u2369\u236a\u236b\u236c\u236d\u236e\u236f\u2370\u2371\u2372\u2373\u2374\u2375\u2376\u2377\u2378\u2379\u237a\u237b\u237d\u237e\u237f\u2380\u2381\u2382\u2383\u2384\u2385\u2386\u2387\u2388\u2389\u238a\u238b\u238c\u238d\u238e\u238f\u2390\u2391\u2392\u2393\u2394\u2395\u2396\u2397\u2398\u2399\u239a\u23b7\u23b8\u23b9\u23ba\u23bb\u23bc\u23bd\u23be\u23bf\u23c0\u23c1\u23c2\u23c3\u23c4\u23c5\u23c6\u23c7\u23c8\u23c9\u23ca\u23cb\u23cc\u23cd\u23ce\u23cf\u23d0\u23d1\u23d2\u23d3\u23d4\u23d5\u23d6\u23d7\u23d8\u23d9\u23da\u23db\u2400\u2401\u2402\u2403\u2404\u2405\u2406\u2407\u2408\u2409\u240a\u240b\u240c\u240d\u240e\u240f\u2410\u2411\u2412\u2413\u2414\u2415\u2416\u2417\u2418\u2419\u241a\u241b\u241c\u241d\u241e\u241f\u2420\u2421\u2422\u2423\u2424\u2425\u2426\u2440\u2441\u2442\u2443\u2444\u2445\u2446\u2447\u2448\u2449\u244a\u249c\u249d\u249e\u249f\u24a0\u24a1\u24a2\u24a3\u24a4\u24a5\u24a6\u24a7\u24a8\u24a9\u24aa\u24ab\u24ac\u24ad\u24ae\u24af\u24b0\u24b1\u24b2\u24b3\u24b4\u24b5\u24b6\u24b7\u24b8\u24b9\u24ba\u24bb\u24bc\u24bd\u24be\u24bf\u24c0\u24c1\u24c2\u24c3\u24c4\u24c5\u24c6\u24c7\u24c8\u24c9\u24ca\u24cb\u24cc\u24cd\u24ce\u24cf\u24d0\u24d1\u24d2\u24d3\u24d4\u24d5\u24d6\u24d7\u24d8\u24d9\u24da\u24db\u24dc\u24dd\u24de\u24df\u24e0\u24e1\u24e2\u24e3\u24e4\u24e5\u24e6\u24e7\u24e8\u24e9\u2500\u2501\u2502\u2503\u2504\u2505\u2506\u2507\u2508\u2509\u250a\u250b\u250c\u250d\u250e\u250f\u2510\u2511\u2512\u2513\u2514\u2515\u2516\u2517\u2518\u2519\u251a\u251b\u251c\u251d\u251e\u251f\u2520\u2521\u2522\u2523\u2524\u2525\u2526\u2527\u2528\u2529\u252a\u252b\u252c\u252d\u252e\u252f\u2530\u2531\u2532\u2533\u2534\u2535\u2536\u2537\u2538\u2539\u253a\u253b\u253c\u253d\u253e\u253f\u2540\u2541\u2542\u2543\u2544\u2545\u2546\u2547\u2548\u2549\u254a\u254b\u254c\u254d\u254e\u254f\u2550\u2551\u2552\u2553\u2554\u2555\u2556\u2557\u2558\u2559\u255a\u255b\u255c\u255d\u255e\u255f\u2560\u2561\u2562\u2563\u2564\u2565\u2566\u2567\u2568\u2569\u256a\u256b\u256c\u256d\u256e\u256f\u2570\u2571\u2572\u2573\u2574\u2575\u2576\u2577\u2578\u2579\u257a\u257b\u257c\u257d\u257e\u257f\u2580\u2581\u2582\u2583\u2584\u2585\u2586\u2587\u2588\u2589\u258a\u258b\u258c\u258d\u258e\u258f\u2590\u2591\u2592\u2593\u2594\u2595\u2596\u2597\u2598\u2599\u259a\u259b\u259c\u259d\u259e\u259f\u25a0\u25a1\u25a2\u25a3\u25a4\u25a5\u25a6\u25a7\u25a8\u25a9\u25aa\u25ab\u25ac\u25ad\u25ae\u25af\u25b0\u25b1\u25b2\u25b3\u25b4\u25b5\u25b6\u25b8\u25b9\u25ba\u25bb\u25bc\u25bd\u25be\u25bf\u25c0\u25c2\u25c3\u25c4\u25c5\u25c6\u25c7\u25c8\u25c9\u25ca\u25cb\u25cc\u25cd\u25ce\u25cf\u25d0\u25d1\u25d2\u25d3\u25d4\u25d5\u25d6\u25d7\u25d8\u25d9\u25da\u25db\u25dc\u25dd\u25de\u25df\u25e0\u25e1\u25e2\u25e3\u25e4\u25e5\u25e6\u25e7\u25e8\u25e9\u25ea\u25eb\u25ec\u25ed\u25ee\u25ef\u25f0\u25f1\u25f2\u25f3\u25f4\u25f5\u25f6\u25f7\u2600\u2601\u2602\u2603\u2604\u2605\u2606\u2607\u2608\u2609\u260a\u260b\u260c\u260d\u260e\u260f\u2610\u2611\u2612\u2613\u2614\u2615\u2616\u2617\u2618\u2619\u261a\u261b\u261c\u261d\u261e\u261f\u2620\u2621\u2622\u2623\u2624\u2625\u2626\u2627\u2628\u2629\u262a\u262b\u262c\u262d\u262e\u262f\u2630\u2631\u2632\u2633\u2634\u2635\u2636\u2637\u2638\u2639\u263a\u263b\u263c\u263d\u263e\u263f\u2640\u2641\u2642\u2643\u2644\u2645\u2646\u2647\u2648\u2649\u264a\u264b\u264c\u264d\u264e\u264f\u2650\u2651\u2652\u2653\u2654\u2655\u2656\u2657\u2658\u2659\u265a\u265b\u265c\u265d\u265e\u265f\u2660\u2661\u2662\u2663\u2664\u2665\u2666\u2667\u2668\u2669\u266a\u266b\u266c\u266d\u266e\u2670\u2671\u2672\u2673\u2674\u2675\u2676\u2677\u2678\u2679\u267a\u267b\u267c\u267d\u267e\u267f\u2680\u2681\u2682\u2683\u2684\u2685\u2686\u2687\u2688\u2689\u268a\u268b\u268c\u268d\u268e\u268f\u2690\u2691\u2692\u2693\u2694\u2695\u2696\u2697\u2698\u2699\u269a\u269b\u269c\u26a0\u26a1\u26a2\u26a3\u26a4\u26a5\u26a6\u26a7\u26a8\u26a9\u26aa\u26ab\u26ac\u26ad\u26ae\u26af\u26b0\u26b1\u2701\u2702\u2703\u2704\u2706\u2707\u2708\u2709\u270c\u270d\u270e\u270f\u2710\u2711\u2712\u2713\u2714\u2715\u2716\u2717\u2718\u2719\u271a\u271b\u271c\u271d\u271e\u271f\u2720\u2721\u2722\u2723\u2724\u2725\u2726\u2727\u2729\u272a\u272b\u272c\u272d\u272e\u272f\u2730\u2731\u2732\u2733\u2734\u2735\u2736\u2737\u2738\u2739\u273a\u273b\u273c\u273d\u273e\u273f\u2740\u2741\u2742\u2743\u2744\u2745\u2746\u2747\u2748\u2749\u274a\u274b\u274d\u274f\u2750\u2751\u2752\u2756\u2758\u2759\u275a\u275b\u275c\u275d\u275e\u2761\u2762\u2763\u2764\u2765\u2766\u2767\u2794\u2798\u2799\u279a\u279b\u279c\u279d\u279e\u279f\u27a0\u27a1\u27a2\u27a3\u27a4\u27a5\u27a6\u27a7\u27a8\u27a9\u27aa\u27ab\u27ac\u27ad\u27ae\u27af\u27b1\u27b2\u27b3\u27b4\u27b5\u27b6\u27b7\u27b8\u27b9\u27ba\u27bb\u27bc\u27bd\u27be\u2800\u2801\u2802\u2803\u2804\u2805\u2806\u2807\u2808\u2809\u280a\u280b\u280c\u280d\u280e\u280f\u2810\u2811\u2812\u2813\u2814\u2815\u2816\u2817\u2818\u2819\u281a\u281b\u281c\u281d\u281e\u281f\u2820\u2821\u2822\u2823\u2824\u2825\u2826\u2827\u2828\u2829\u282a\u282b\u282c\u282d\u282e\u282f\u2830\u2831\u2832\u2833\u2834\u2835\u2836\u2837\u2838\u2839\u283a\u283b\u283c\u283d\u283e\u283f\u2840\u2841\u2842\u2843\u2844\u2845\u2846\u2847\u2848\u2849\u284a\u284b\u284c\u284d\u284e\u284f\u2850\u2851\u2852\u2853\u2854\u2855\u2856\u2857\u2858\u2859\u285a\u285b\u285c\u285d\u285e\u285f\u2860\u2861\u2862\u2863\u2864\u2865\u2866\u2867\u2868\u2869\u286a\u286b\u286c\u286d\u286e\u286f\u2870\u2871\u2872\u2873\u2874\u2875\u2876\u2877\u2878\u2879\u287a\u287b\u287c\u287d\u287e\u287f\u2880\u2881\u2882\u2883\u2884\u2885\u2886\u2887\u2888\u2889\u288a\u288b\u288c\u288d\u288e\u288f\u2890\u2891\u2892\u2893\u2894\u2895\u2896\u2897\u2898\u2899\u289a\u289b\u289c\u289d\u289e\u289f\u28a0\u28a1\u28a2\u28a3\u28a4\u28a5\u28a6\u28a7\u28a8\u28a9\u28aa\u28ab\u28ac\u28ad\u28ae\u28af\u28b0\u28b1\u28b2\u28b3\u28b4\u28b5\u28b6\u28b7\u28b8\u28b9\u28ba\u28bb\u28bc\u28bd\u28be\u28bf\u28c0\u28c1\u28c2\u28c3\u28c4\u28c5\u28c6\u28c7\u28c8\u28c9\u28ca\u28cb\u28cc\u28cd\u28ce\u28cf\u28d0\u28d1\u28d2\u28d3\u28d4\u28d5\u28d6\u28d7\u28d8\u28d9\u28da\u28db\u28dc\u28dd\u28de\u28df\u28e0\u28e1\u28e2\u28e3\u28e4\u28e5\u28e6\u28e7\u28e8\u28e9\u28ea\u28eb\u28ec\u28ed\u28ee\u28ef\u28f0\u28f1\u28f2\u28f3\u28f4\u28f5\u28f6\u28f7\u28f8\u28f9\u28fa\u28fb\u28fc\u28fd\u28fe\u28ff\u2b00\u2b01\u2b02\u2b03\u2b04\u2b05\u2b06\u2b07\u2b08\u2b09\u2b0a\u2b0b\u2b0c\u2b0d\u2b0e\u2b0f\u2b10\u2b11\u2b12\u2b13\u2ce5\u2ce6\u2ce7\u2ce8\u2ce9\u2cea\u2e80\u2e81\u2e82\u2e83\u2e84\u2e85\u2e86\u2e87\u2e88\u2e89\u2e8a\u2e8b\u2e8c\u2e8d\u2e8e\u2e8f\u2e90\u2e91\u2e92\u2e93\u2e94\u2e95\u2e96\u2e97\u2e98\u2e99\u2e9b\u2e9c\u2e9d\u2e9e\u2e9f\u2ea0\u2ea1\u2ea2\u2ea3\u2ea4\u2ea5\u2ea6\u2ea7\u2ea8\u2ea9\u2eaa\u2eab\u2eac\u2ead\u2eae\u2eaf\u2eb0\u2eb1\u2eb2\u2eb3\u2eb4\u2eb5\u2eb6\u2eb7\u2eb8\u2eb9\u2eba\u2ebb\u2ebc\u2ebd\u2ebe\u2ebf\u2ec0\u2ec1\u2ec2\u2ec3\u2ec4\u2ec5\u2ec6\u2ec7\u2ec8\u2ec9\u2eca\u2ecb\u2ecc\u2ecd\u2ece\u2ecf\u2ed0\u2ed1\u2ed2\u2ed3\u2ed4\u2ed5\u2ed6\u2ed7\u2ed8\u2ed9\u2eda\u2edb\u2edc\u2edd\u2ede\u2edf\u2ee0\u2ee1\u2ee2\u2ee3\u2ee4\u2ee5\u2ee6\u2ee7\u2ee8\u2ee9\u2eea\u2eeb\u2eec\u2eed\u2eee\u2eef\u2ef0\u2ef1\u2ef2\u2ef3\u2f00\u2f01\u2f02\u2f03\u2f04\u2f05\u2f06\u2f07\u2f08\u2f09\u2f0a\u2f0b\u2f0c\u2f0d\u2f0e\u2f0f\u2f10\u2f11\u2f12\u2f13\u2f14\u2f15\u2f16\u2f17\u2f18\u2f19\u2f1a\u2f1b\u2f1c\u2f1d\u2f1e\u2f1f\u2f20\u2f21\u2f22\u2f23\u2f24\u2f25\u2f26\u2f27\u2f28\u2f29\u2f2a\u2f2b\u2f2c\u2f2d\u2f2e\u2f2f\u2f30\u2f31\u2f32\u2f33\u2f34\u2f35\u2f36\u2f37\u2f38\u2f39\u2f3a\u2f3b\u2f3c\u2f3d\u2f3e\u2f3f\u2f40\u2f41\u2f42\u2f43\u2f44\u2f45\u2f46\u2f47\u2f48\u2f49\u2f4a\u2f4b\u2f4c\u2f4d\u2f4e\u2f4f\u2f50\u2f51\u2f52\u2f53\u2f54\u2f55\u2f56\u2f57\u2f58\u2f59\u2f5a\u2f5b\u2f5c\u2f5d\u2f5e\u2f5f\u2f60\u2f61\u2f62\u2f63\u2f64\u2f65\u2f66\u2f67\u2f68\u2f69\u2f6a\u2f6b\u2f6c\u2f6d\u2f6e\u2f6f\u2f70\u2f71\u2f72\u2f73\u2f74\u2f75\u2f76\u2f77\u2f78\u2f79\u2f7a\u2f7b\u2f7c\u2f7d\u2f7e\u2f7f\u2f80\u2f81\u2f82\u2f83\u2f84\u2f85\u2f86\u2f87\u2f88\u2f89\u2f8a\u2f8b\u2f8c\u2f8d\u2f8e\u2f8f\u2f90\u2f91\u2f92\u2f93\u2f94\u2f95\u2f96\u2f97\u2f98\u2f99\u2f9a\u2f9b\u2f9c\u2f9d\u2f9e\u2f9f\u2fa0\u2fa1\u2fa2\u2fa3\u2fa4\u2fa5\u2fa6\u2fa7\u2fa8\u2fa9\u2faa\u2fab\u2fac\u2fad\u2fae\u2faf\u2fb0\u2fb1\u2fb2\u2fb3\u2fb4\u2fb5\u2fb6\u2fb7\u2fb8\u2fb9\u2fba\u2fbb\u2fbc\u2fbd\u2fbe\u2fbf\u2fc0\u2fc1\u2fc2\u2fc3\u2fc4\u2fc5\u2fc6\u2fc7\u2fc8\u2fc9\u2fca\u2fcb\u2fcc\u2fcd\u2fce\u2fcf\u2fd0\u2fd1\u2fd2\u2fd3\u2fd4\u2fd5\u2ff0\u2ff1\u2ff2\u2ff3\u2ff4\u2ff5\u2ff6\u2ff7\u2ff8\u2ff9\u2ffa\u2ffb\u3004\u3012\u3013\u3020\u3036\u3037\u303e\u303f\u3190\u3191\u3196\u3197\u3198\u3199\u319a\u319b\u319c\u319d\u319e\u319f\u31c0\u31c1\u31c2\u31c3\u31c4\u31c5\u31c6\u31c7\u31c8\u31c9\u31ca\u31cb\u31cc\u31cd\u31ce\u31cf\u3200\u3201\u3202\u3203\u3204\u3205\u3206\u3207\u3208\u3209\u320a\u320b\u320c\u320d\u320e\u320f\u3210\u3211\u3212\u3213\u3214\u3215\u3216\u3217\u3218\u3219\u321a\u321b\u321c\u321d\u321e\u322a\u322b\u322c\u322d\u322e\u322f\u3230\u3231\u3232\u3233\u3234\u3235\u3236\u3237\u3238\u3239\u323a\u323b\u323c\u323d\u323e\u323f\u3240\u3241\u3242\u3243\u3250\u3260\u3261\u3262\u3263\u3264\u3265\u3266\u3267\u3268\u3269\u326a\u326b\u326c\u326d\u326e\u326f\u3270\u3271\u3272\u3273\u3274\u3275\u3276\u3277\u3278\u3279\u327a\u327b\u327c\u327d\u327e\u327f\u328a\u328b\u328c\u328d\u328e\u328f\u3290\u3291\u3292\u3293\u3294\u3295\u3296\u3297\u3298\u3299\u329a\u329b\u329c\u329d\u329e\u329f\u32a0\u32a1\u32a2\u32a3\u32a4\u32a5\u32a6\u32a7\u32a8\u32a9\u32aa\u32ab\u32ac\u32ad\u32ae\u32af\u32b0\u32c0\u32c1\u32c2\u32c3\u32c4\u32c5\u32c6\u32c7\u32c8\u32c9\u32ca\u32cb\u32cc\u32cd\u32ce\u32cf\u32d0\u32d1\u32d2\u32d3\u32d4\u32d5\u32d6\u32d7\u32d8\u32d9\u32da\u32db\u32dc\u32dd\u32de\u32df\u32e0\u32e1\u32e2\u32e3\u32e4\u32e5\u32e6\u32e7\u32e8\u32e9\u32ea\u32eb\u32ec\u32ed\u32ee\u32ef\u32f0\u32f1\u32f2\u32f3\u32f4\u32f5\u32f6\u32f7\u32f8\u32f9\u32fa\u32fb\u32fc\u32fd\u32fe\u3300\u3301\u3302\u3303\u3304\u3305\u3306\u3307\u3308\u3309\u330a\u330b\u330c\u330d\u330e\u330f\u3310\u3311\u3312\u3313\u3314\u3315\u3316\u3317\u3318\u3319\u331a\u331b\u331c\u331d\u331e\u331f\u3320\u3321\u3322\u3323\u3324\u3325\u3326\u3327\u3328\u3329\u332a\u332b\u332c\u332d\u332e\u332f\u3330\u3331\u3332\u3333\u3334\u3335\u3336\u3337\u3338\u3339\u333a\u333b\u333c\u333d\u333e\u333f\u3340\u3341\u3342\u3343\u3344\u3345\u3346\u3347\u3348\u3349\u334a\u334b\u334c\u334d\u334e\u334f\u3350\u3351\u3352\u3353\u3354\u3355\u3356\u3357\u3358\u3359\u335a\u335b\u335c\u335d\u335e\u335f\u3360\u3361\u3362\u3363\u3364\u3365\u3366\u3367\u3368\u3369\u336a\u336b\u336c\u336d\u336e\u336f\u3370\u3371\u3372\u3373\u3374\u3375\u3376\u3377\u3378\u3379\u337a\u337b\u337c\u337d\u337e\u337f\u3380\u3381\u3382\u3383\u3384\u3385\u3386\u3387\u3388\u3389\u338a\u338b\u338c\u338d\u338e\u338f\u3390\u3391\u3392\u3393\u3394\u3395\u3396\u3397\u3398\u3399\u339a\u339b\u339c\u339d\u339e\u339f\u33a0\u33a1\u33a2\u33a3\u33a4\u33a5\u33a6\u33a7\u33a8\u33a9\u33aa\u33ab\u33ac\u33ad\u33ae\u33af\u33b0\u33b1\u33b2\u33b3\u33b4\u33b5\u33b6\u33b7\u33b8\u33b9\u33ba\u33bb\u33bc\u33bd\u33be\u33bf\u33c0\u33c1\u33c2\u33c3\u33c4\u33c5\u33c6\u33c7\u33c8\u33c9\u33ca\u33cb\u33cc\u33cd\u33ce\u33cf\u33d0\u33d1\u33d2\u33d3\u33d4\u33d5\u33d6\u33d7\u33d8\u33d9\u33da\u33db\u33dc\u33dd\u33de\u33df\u33e0\u33e1\u33e2\u33e3\u33e4\u33e5\u33e6\u33e7\u33e8\u33e9\u33ea\u33eb\u33ec\u33ed\u33ee\u33ef\u33f0\u33f1\u33f2\u33f3\u33f4\u33f5\u33f6\u33f7\u33f8\u33f9\u33fa\u33fb\u33fc\u33fd\u33fe\u33ff\u4dc0\u4dc1\u4dc2\u4dc3\u4dc4\u4dc5\u4dc6\u4dc7\u4dc8\u4dc9\u4dca\u4dcb\u4dcc\u4dcd\u4dce\u4dcf\u4dd0\u4dd1\u4dd2\u4dd3\u4dd4\u4dd5\u4dd6\u4dd7\u4dd8\u4dd9\u4dda\u4ddb\u4ddc\u4ddd\u4dde\u4ddf\u4de0\u4de1\u4de2\u4de3\u4de4\u4de5\u4de6\u4de7\u4de8\u4de9\u4dea\u4deb\u4dec\u4ded\u4dee\u4def\u4df0\u4df1\u4df2\u4df3\u4df4\u4df5\u4df6\u4df7\u4df8\u4df9\u4dfa\u4dfb\u4dfc\u4dfd\u4dfe\u4dff\ua490\ua491\ua492\ua493\ua494\ua495\ua496\ua497\ua498\ua499\ua49a\ua49b\ua49c\ua49d\ua49e\ua49f\ua4a0\ua4a1\ua4a2\ua4a3\ua4a4\ua4a5\ua4a6\ua4a7\ua4a8\ua4a9\ua4aa\ua4ab\ua4ac\ua4ad\ua4ae\ua4af\ua4b0\ua4b1\ua4b2\ua4b3\ua4b4\ua4b5\ua4b6\ua4b7\ua4b8\ua4b9\ua4ba\ua4bb\ua4bc\ua4bd\ua4be\ua4bf\ua4c0\ua4c1\ua4c2\ua4c3\ua4c4\ua4c5\ua4c6\ua828\ua829\ua82a\ua82b\ufdfd\uffe4\uffe8\uffed\uffee\ufffc\ufffd'
-
-Zl = u'\u2028'
-
-Zp = u'\u2029'
-
-Zs = u' \xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000'
-
-cats = ['Cc', 'Cf', 'Cn', 'Co', 'Cs', 'Ll', 'Lm', 'Lo', 'Lt', 'Lu', 'Mc', 'Me', 'Mn', 'Nd', 'Nl', 'No', 'Pc', 'Pd', 'Pe', 'Pf', 'Pi', 'Po', 'Ps', 'Sc', 'Sk', 'Sm', 'So', 'Zl', 'Zp', 'Zs']
-
-def combine(*args):
-    return u''.join([globals()[cat] for cat in args])
-
-xid_start = u'\u0041-\u005A\u005F\u0061-\u007A\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u01BA\u01BB\u01BC-\u01BF\u01C0-\u01C3\u01C4-\u0241\u0250-\u02AF\u02B0-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EE\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03CE\u03D0-\u03F5\u03F7-\u0481\u048A-\u04CE\u04D0-\u04F9\u0500-\u050F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0621-\u063A\u0640\u0641-\u064A\u066E-\u066F\u0671-\u06D3\u06D5\u06E5-\u06E6\u06EE-\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u076D\u0780-\u07A5\u07B1\u0904-\u0939\u093D\u0950\u0958-\u0961\u097D\u0985-\u098C\u098F-\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC-\u09DD\u09DF-\u09E1\u09F0-\u09F1\u0A05-\u0A0A\u0A0F-\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32-\u0A33\u0A35-\u0A36\u0A38-\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2-\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0-\u0AE1\u0B05-\u0B0C\u0B0F-\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32-\u0B33\u0B35-\u0B39\u0B3D\u0B5C-\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99-\u0B9A\u0B9C\u0B9E-\u0B9F\u0BA3-\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C60-\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0-\u0CE1\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D28\u0D2A-\u0D39\u0D60-\u0D61\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E40-\u0E45\u0E46\u0E81-\u0E82\u0E84\u0E87-\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA-\u0EAB\u0EAD-\u0EB0\u0EB2\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDD\u0F00\u0F40-\u0F47\u0F49-\u0F6A\u0F88-\u0F8B\u1000-\u1021\u1023-\u1027\u1029-\u102A\u1050-\u1055\u10A0-\u10C5\u10D0-\u10FA\u10FC\u1100-\u1159\u115F-\u11A2\u11A8-\u11F9\u1200-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u1676\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F0\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1842\u1843\u1844-\u1877\u1880-\u18A8\u1900-\u191C\u1950-\u196D\u1970-\u1974\u1980-\u19A9\u19C1-\u19C7\u1A00-\u1A16\u1D00-\u1D2B\u1D2C-\u1D61\u1D62-\u1D77\u1D78\u1D79-\u1D9A\u1D9B-\u1DBF\u1E00-\u1E9B\u1EA0-\u1EF9\u1F00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u2094\u2102\u2107\u210A-\u2113\u2115\u2118\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212E\u212F-\u2131\u2133-\u2134\u2135-\u2138\u2139\u213C-\u213F\u2145-\u2149\u2160-\u2183\u2C00-\u2C2E\u2C30-\u2C5E\u2C80-\u2CE4\u2D00-\u2D25\u2D30-\u2D65\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3005\u3006\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303A\u303B\u303C\u3041-\u3096\u309D-\u309E\u309F\u30A1-\u30FA\u30FC-\u30FE\u30FF\u3105-\u312C\u3131-\u318E\u31A0-\u31B7\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FBB\uA000-\uA014\uA015\uA016-\uA48C\uA800-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uAC00-\uD7A3\uF900-\uFA2D\uFA30-\uFA6A\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40-\uFB41\uFB43-\uFB44\uFB46-\uFBB1\uFBD3-\uFC5D\uFC64-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDF9\uFE71\uFE73\uFE77\uFE79\uFE7B\uFE7D\uFE7F-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFF6F\uFF70\uFF71-\uFF9D\uFFA0-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC'
-
-xid_continue = u'\u0030-\u0039\u0041-\u005A\u005F\u0061-\u007A\u00AA\u00B5\u00B7\u00BA\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u01BA\u01BB\u01BC-\u01BF\u01C0-\u01C3\u01C4-\u0241\u0250-\u02AF\u02B0-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EE\u0300-\u036F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03CE\u03D0-\u03F5\u03F7-\u0481\u0483-\u0486\u048A-\u04CE\u04D0-\u04F9\u0500-\u050F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05B9\u05BB-\u05BD\u05BF\u05C1-\u05C2\u05C4-\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u0615\u0621-\u063A\u0640\u0641-\u064A\u064B-\u065E\u0660-\u0669\u066E-\u066F\u0670\u0671-\u06D3\u06D5\u06D6-\u06DC\u06DF-\u06E4\u06E5-\u06E6\u06E7-\u06E8\u06EA-\u06ED\u06EE-\u06EF\u06F0-\u06F9\u06FA-\u06FC\u06FF\u0710\u0711\u0712-\u072F\u0730-\u074A\u074D-\u076D\u0780-\u07A5\u07A6-\u07B0\u07B1\u0901-\u0902\u0903\u0904-\u0939\u093C\u093D\u093E-\u0940\u0941-\u0948\u0949-\u094C\u094D\u0950\u0951-\u0954\u0958-\u0961\u0962-\u0963\u0966-\u096F\u097D\u0981\u0982-\u0983\u0985-\u098C\u098F-\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC\u09BD\u09BE-\u09C0\u09C1-\u09C4\u09C7-\u09C8\u09CB-\u09CC\u09CD\u09CE\u09D7\u09DC-\u09DD\u09DF-\u09E1\u09E2-\u09E3\u09E6-\u09EF\u09F0-\u09F1\u0A01-\u0A02\u0A03\u0A05-\u0A0A\u0A0F-\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32-\u0A33\u0A35-\u0A36\u0A38-\u0A39\u0A3C\u0A3E-\u0A40\u0A41-\u0A42\u0A47-\u0A48\u0A4B-\u0A4D\u0A59-\u0A5C\u0A5E\u0A66-\u0A6F\u0A70-\u0A71\u0A72-\u0A74\u0A81-\u0A82\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2-\u0AB3\u0AB5-\u0AB9\u0ABC\u0ABD\u0ABE-\u0AC0\u0AC1-\u0AC5\u0AC7-\u0AC8\u0AC9\u0ACB-\u0ACC\u0ACD\u0AD0\u0AE0-\u0AE1\u0AE2-\u0AE3\u0AE6-\u0AEF\u0B01\u0B02-\u0B03\u0B05-\u0B0C\u0B0F-\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32-\u0B33\u0B35-\u0B39\u0B3C\u0B3D\u0B3E\u0B3F\u0B40\u0B41-\u0B43\u0B47-\u0B48\u0B4B-\u0B4C\u0B4D\u0B56\u0B57\u0B5C-\u0B5D\u0B5F-\u0B61\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99-\u0B9A\u0B9C\u0B9E-\u0B9F\u0BA3-\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BBF\u0BC0\u0BC1-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCC\u0BCD\u0BD7\u0BE6-\u0BEF\u0C01-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3E-\u0C40\u0C41-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55-\u0C56\u0C60-\u0C61\u0C66-\u0C6F\u0C82-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC\u0CBD\u0CBE\u0CBF\u0CC0-\u0CC4\u0CC6\u0CC7-\u0CC8\u0CCA-\u0CCB\u0CCC-\u0CCD\u0CD5-\u0CD6\u0CDE\u0CE0-\u0CE1\u0CE6-\u0CEF\u0D02-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D28\u0D2A-\u0D39\u0D3E-\u0D40\u0D41-\u0D43\u0D46-\u0D48\u0D4A-\u0D4C\u0D4D\u0D57\u0D60-\u0D61\u0D66-\u0D6F\u0D82-\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD1\u0DD2-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DF2-\u0DF3\u0E01-\u0E30\u0E31\u0E32-\u0E33\u0E34-\u0E3A\u0E40-\u0E45\u0E46\u0E47-\u0E4E\u0E50-\u0E59\u0E81-\u0E82\u0E84\u0E87-\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA-\u0EAB\u0EAD-\u0EB0\u0EB1\u0EB2-\u0EB3\u0EB4-\u0EB9\u0EBB-\u0EBC\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDD\u0F00\u0F18-\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F3F\u0F40-\u0F47\u0F49-\u0F6A\u0F71-\u0F7E\u0F7F\u0F80-\u0F84\u0F86-\u0F87\u0F88-\u0F8B\u0F90-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1021\u1023-\u1027\u1029-\u102A\u102C\u102D-\u1030\u1031\u1032\u1036-\u1037\u1038\u1039\u1040-\u1049\u1050-\u1055\u1056-\u1057\u1058-\u1059\u10A0-\u10C5\u10D0-\u10FA\u10FC\u1100-\u1159\u115F-\u11A2\u11A8-\u11F9\u1200-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135F\u1369-\u1371\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u1676\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F0\u1700-\u170C\u170E-\u1711\u1712-\u1714\u1720-\u1731\u1732-\u1734\u1740-\u1751\u1752-\u1753\u1760-\u176C\u176E-\u1770\u1772-\u1773\u1780-\u17B3\u17B6\u17B7-\u17BD\u17BE-\u17C5\u17C6\u17C7-\u17C8\u17C9-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1842\u1843\u1844-\u1877\u1880-\u18A8\u18A9\u1900-\u191C\u1920-\u1922\u1923-\u1926\u1927-\u1928\u1929-\u192B\u1930-\u1931\u1932\u1933-\u1938\u1939-\u193B\u1946-\u194F\u1950-\u196D\u1970-\u1974\u1980-\u19A9\u19B0-\u19C0\u19C1-\u19C7\u19C8-\u19C9\u19D0-\u19D9\u1A00-\u1A16\u1A17-\u1A18\u1A19-\u1A1B\u1D00-\u1D2B\u1D2C-\u1D61\u1D62-\u1D77\u1D78\u1D79-\u1D9A\u1D9B-\u1DBF\u1DC0-\u1DC3\u1E00-\u1E9B\u1EA0-\u1EF9\u1F00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u203F-\u2040\u2054\u2071\u207F\u2090-\u2094\u20D0-\u20DC\u20E1\u20E5-\u20EB\u2102\u2107\u210A-\u2113\u2115\u2118\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212E\u212F-\u2131\u2133-\u2134\u2135-\u2138\u2139\u213C-\u213F\u2145-\u2149\u2160-\u2183\u2C00-\u2C2E\u2C30-\u2C5E\u2C80-\u2CE4\u2D00-\u2D25\u2D30-\u2D65\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3005\u3006\u3007\u3021-\u3029\u302A-\u302F\u3031-\u3035\u3038-\u303A\u303B\u303C\u3041-\u3096\u3099-\u309A\u309D-\u309E\u309F\u30A1-\u30FA\u30FC-\u30FE\u30FF\u3105-\u312C\u3131-\u318E\u31A0-\u31B7\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FBB\uA000-\uA014\uA015\uA016-\uA48C\uA800-\uA801\uA802\uA803-\uA805\uA806\uA807-\uA80A\uA80B\uA80C-\uA822\uA823-\uA824\uA825-\uA826\uA827\uAC00-\uD7A3\uF900-\uFA2D\uFA30-\uFA6A\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1E\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40-\uFB41\uFB43-\uFB44\uFB46-\uFBB1\uFBD3-\uFC5D\uFC64-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDF9\uFE00-\uFE0F\uFE20-\uFE23\uFE33-\uFE34\uFE4D-\uFE4F\uFE71\uFE73\uFE77\uFE79\uFE7B\uFE7D\uFE7F-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFF6F\uFF70\uFF71-\uFF9D\uFF9E-\uFF9F\uFFA0-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC'
-
-def allexcept(*args):
-    newcats = cats[:]
-    for arg in args:
-        newcats.remove(arg)
-    return u''.join([globals()[cat] for cat in newcats])
-
-if __name__ == '__main__':
-    import unicodedata
-
-    categories = {}
-
-    f = open(__file__.rstrip('co'))
-    try:
-        content = f.read()
-    finally:
-        f.close()
-
-    header = content[:content.find('Cc =')]
-    footer = content[content.find("def combine("):]
-
-    for code in range(65535):
-        c = unichr(code)
-        cat = unicodedata.category(c)
-        categories.setdefault(cat, []).append(c)
-
-    f = open(__file__, 'w')
-    f.write(header)
-
-    for cat in sorted(categories):
-        val = u''.join(categories[cat])
-        if cat == 'Cs':
-            # Jython can't handle isolated surrogates
-            f.write("""\
-try:
-    Cs = eval(r"%r")
-except UnicodeDecodeError:
-    Cs = '' # Jython can't handle isolated surrogates\n\n""" % val)
-        else:
-            f.write('%s = %r\n\n' % (cat, val))
-    f.write('cats = %r\n\n' % sorted(categories.keys()))
-
-    f.write(footer)
-    f.close()
diff --git a/third_party/jinja2/bccache.py b/third_party/jinja2/bccache.py
deleted file mode 100644
index f5bd314..0000000
--- a/third_party/jinja2/bccache.py
+++ /dev/null
@@ -1,362 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    jinja2.bccache
-    ~~~~~~~~~~~~~~
-
-    This module implements the bytecode cache system Jinja is optionally
-    using.  This is useful if you have very complex template situations and
-    the compiliation of all those templates slow down your application too
-    much.
-
-    Situations where this is useful are often forking web applications that
-    are initialized on the first request.
-
-    :copyright: (c) 2010 by the Jinja Team.
-    :license: BSD.
-"""
-from os import path, listdir
-import os
-import sys
-import stat
-import errno
-import marshal
-import tempfile
-import fnmatch
-from hashlib import sha1
-from jinja2.utils import open_if_exists
-from jinja2._compat import BytesIO, pickle, PY2, text_type
-
-
-# marshal works better on 3.x, one hack less required
-if not PY2:
-    marshal_dump = marshal.dump
-    marshal_load = marshal.load
-else:
-
-    def marshal_dump(code, f):
-        if isinstance(f, file):
-            marshal.dump(code, f)
-        else:
-            f.write(marshal.dumps(code))
-
-    def marshal_load(f):
-        if isinstance(f, file):
-            return marshal.load(f)
-        return marshal.loads(f.read())
-
-
-bc_version = 2
-
-# magic version used to only change with new jinja versions.  With 2.6
-# we change this to also take Python version changes into account.  The
-# reason for this is that Python tends to segfault if fed earlier bytecode
-# versions because someone thought it would be a good idea to reuse opcodes
-# or make Python incompatible with earlier versions.
-bc_magic = 'j2'.encode('ascii') + \
-    pickle.dumps(bc_version, 2) + \
-    pickle.dumps((sys.version_info[0] << 24) | sys.version_info[1])
-
-
-class Bucket(object):
-    """Buckets are used to store the bytecode for one template.  It's created
-    and initialized by the bytecode cache and passed to the loading functions.
-
-    The buckets get an internal checksum from the cache assigned and use this
-    to automatically reject outdated cache material.  Individual bytecode
-    cache subclasses don't have to care about cache invalidation.
-    """
-
-    def __init__(self, environment, key, checksum):
-        self.environment = environment
-        self.key = key
-        self.checksum = checksum
-        self.reset()
-
-    def reset(self):
-        """Resets the bucket (unloads the bytecode)."""
-        self.code = None
-
-    def load_bytecode(self, f):
-        """Loads bytecode from a file or file like object."""
-        # make sure the magic header is correct
-        magic = f.read(len(bc_magic))
-        if magic != bc_magic:
-            self.reset()
-            return
-        # the source code of the file changed, we need to reload
-        checksum = pickle.load(f)
-        if self.checksum != checksum:
-            self.reset()
-            return
-        # if marshal_load fails then we need to reload
-        try:
-            self.code = marshal_load(f)
-        except (EOFError, ValueError, TypeError):
-            self.reset()
-            return
-
-    def write_bytecode(self, f):
-        """Dump the bytecode into the file or file like object passed."""
-        if self.code is None:
-            raise TypeError('can\'t write empty bucket')
-        f.write(bc_magic)
-        pickle.dump(self.checksum, f, 2)
-        marshal_dump(self.code, f)
-
-    def bytecode_from_string(self, string):
-        """Load bytecode from a string."""
-        self.load_bytecode(BytesIO(string))
-
-    def bytecode_to_string(self):
-        """Return the bytecode as string."""
-        out = BytesIO()
-        self.write_bytecode(out)
-        return out.getvalue()
-
-
-class BytecodeCache(object):
-    """To implement your own bytecode cache you have to subclass this class
-    and override :meth:`load_bytecode` and :meth:`dump_bytecode`.  Both of
-    these methods are passed a :class:`~jinja2.bccache.Bucket`.
-
-    A very basic bytecode cache that saves the bytecode on the file system::
-
-        from os import path
-
-        class MyCache(BytecodeCache):
-
-            def __init__(self, directory):
-                self.directory = directory
-
-            def load_bytecode(self, bucket):
-                filename = path.join(self.directory, bucket.key)
-                if path.exists(filename):
-                    with open(filename, 'rb') as f:
-                        bucket.load_bytecode(f)
-
-            def dump_bytecode(self, bucket):
-                filename = path.join(self.directory, bucket.key)
-                with open(filename, 'wb') as f:
-                    bucket.write_bytecode(f)
-
-    A more advanced version of a filesystem based bytecode cache is part of
-    Jinja2.
-    """
-
-    def load_bytecode(self, bucket):
-        """Subclasses have to override this method to load bytecode into a
-        bucket.  If they are not able to find code in the cache for the
-        bucket, it must not do anything.
-        """
-        raise NotImplementedError()
-
-    def dump_bytecode(self, bucket):
-        """Subclasses have to override this method to write the bytecode
-        from a bucket back to the cache.  If it unable to do so it must not
-        fail silently but raise an exception.
-        """
-        raise NotImplementedError()
-
-    def clear(self):
-        """Clears the cache.  This method is not used by Jinja2 but should be
-        implemented to allow applications to clear the bytecode cache used
-        by a particular environment.
-        """
-
-    def get_cache_key(self, name, filename=None):
-        """Returns the unique hash key for this template name."""
-        hash = sha1(name.encode('utf-8'))
-        if filename is not None:
-            filename = '|' + filename
-            if isinstance(filename, text_type):
-                filename = filename.encode('utf-8')
-            hash.update(filename)
-        return hash.hexdigest()
-
-    def get_source_checksum(self, source):
-        """Returns a checksum for the source."""
-        return sha1(source.encode('utf-8')).hexdigest()
-
-    def get_bucket(self, environment, name, filename, source):
-        """Return a cache bucket for the given template.  All arguments are
-        mandatory but filename may be `None`.
-        """
-        key = self.get_cache_key(name, filename)
-        checksum = self.get_source_checksum(source)
-        bucket = Bucket(environment, key, checksum)
-        self.load_bytecode(bucket)
-        return bucket
-
-    def set_bucket(self, bucket):
-        """Put the bucket into the cache."""
-        self.dump_bytecode(bucket)
-
-
-class FileSystemBytecodeCache(BytecodeCache):
-    """A bytecode cache that stores bytecode on the filesystem.  It accepts
-    two arguments: The directory where the cache items are stored and a
-    pattern string that is used to build the filename.
-
-    If no directory is specified a default cache directory is selected.  On
-    Windows the user's temp directory is used, on UNIX systems a directory
-    is created for the user in the system temp directory.
-
-    The pattern can be used to have multiple separate caches operate on the
-    same directory.  The default pattern is ``'__jinja2_%s.cache'``.  ``%s``
-    is replaced with the cache key.
-
-    >>> bcc = FileSystemBytecodeCache('/tmp/jinja_cache', '%s.cache')
-
-    This bytecode cache supports clearing of the cache using the clear method.
-    """
-
-    def __init__(self, directory=None, pattern='__jinja2_%s.cache'):
-        if directory is None:
-            directory = self._get_default_cache_dir()
-        self.directory = directory
-        self.pattern = pattern
-
-    def _get_default_cache_dir(self):
-        def _unsafe_dir():
-            raise RuntimeError('Cannot determine safe temp directory.  You '
-                               'need to explicitly provide one.')
-
-        tmpdir = tempfile.gettempdir()
-
-        # On windows the temporary directory is used specific unless
-        # explicitly forced otherwise.  We can just use that.
-        if os.name == 'nt':
-            return tmpdir
-        if not hasattr(os, 'getuid'):
-            _unsafe_dir()
-
-        dirname = '_jinja2-cache-%d' % os.getuid()
-        actual_dir = os.path.join(tmpdir, dirname)
-
-        try:
-            os.mkdir(actual_dir, stat.S_IRWXU)
-        except OSError as e:
-            if e.errno != errno.EEXIST:
-                raise
-        try:
-            os.chmod(actual_dir, stat.S_IRWXU)
-            actual_dir_stat = os.lstat(actual_dir)
-            if actual_dir_stat.st_uid != os.getuid() \
-               or not stat.S_ISDIR(actual_dir_stat.st_mode) \
-               or stat.S_IMODE(actual_dir_stat.st_mode) != stat.S_IRWXU:
-                _unsafe_dir()
-        except OSError as e:
-            if e.errno != errno.EEXIST:
-                raise
-
-        actual_dir_stat = os.lstat(actual_dir)
-        if actual_dir_stat.st_uid != os.getuid() \
-           or not stat.S_ISDIR(actual_dir_stat.st_mode) \
-           or stat.S_IMODE(actual_dir_stat.st_mode) != stat.S_IRWXU:
-            _unsafe_dir()
-
-        return actual_dir
-
-    def _get_cache_filename(self, bucket):
-        return path.join(self.directory, self.pattern % bucket.key)
-
-    def load_bytecode(self, bucket):
-        f = open_if_exists(self._get_cache_filename(bucket), 'rb')
-        if f is not None:
-            try:
-                bucket.load_bytecode(f)
-            finally:
-                f.close()
-
-    def dump_bytecode(self, bucket):
-        f = open(self._get_cache_filename(bucket), 'wb')
-        try:
-            bucket.write_bytecode(f)
-        finally:
-            f.close()
-
-    def clear(self):
-        # imported lazily here because google app-engine doesn't support
-        # write access on the file system and the function does not exist
-        # normally.
-        from os import remove
-        files = fnmatch.filter(listdir(self.directory), self.pattern % '*')
-        for filename in files:
-            try:
-                remove(path.join(self.directory, filename))
-            except OSError:
-                pass
-
-
-class MemcachedBytecodeCache(BytecodeCache):
-    """This class implements a bytecode cache that uses a memcache cache for
-    storing the information.  It does not enforce a specific memcache library
-    (tummy's memcache or cmemcache) but will accept any class that provides
-    the minimal interface required.
-
-    Libraries compatible with this class:
-
-    -   `werkzeug <http://werkzeug.pocoo.org/>`_.contrib.cache
-    -   `python-memcached <http://www.tummy.com/Community/software/python-memcached/>`_
-    -   `cmemcache <http://gijsbert.org/cmemcache/>`_
-
-    (Unfortunately the django cache interface is not compatible because it
-    does not support storing binary data, only unicode.  You can however pass
-    the underlying cache client to the bytecode cache which is available
-    as `django.core.cache.cache._client`.)
-
-    The minimal interface for the client passed to the constructor is this:
-
-    .. class:: MinimalClientInterface
-
-        .. method:: set(key, value[, timeout])
-
-            Stores the bytecode in the cache.  `value` is a string and
-            `timeout` the timeout of the key.  If timeout is not provided
-            a default timeout or no timeout should be assumed, if it's
-            provided it's an integer with the number of seconds the cache
-            item should exist.
-
-        .. method:: get(key)
-
-            Returns the value for the cache key.  If the item does not
-            exist in the cache the return value must be `None`.
-
-    The other arguments to the constructor are the prefix for all keys that
-    is added before the actual cache key and the timeout for the bytecode in
-    the cache system.  We recommend a high (or no) timeout.
-
-    This bytecode cache does not support clearing of used items in the cache.
-    The clear method is a no-operation function.
-
-    .. versionadded:: 2.7
-       Added support for ignoring memcache errors through the
-       `ignore_memcache_errors` parameter.
-    """
-
-    def __init__(self, client, prefix='jinja2/bytecode/', timeout=None,
-                 ignore_memcache_errors=True):
-        self.client = client
-        self.prefix = prefix
-        self.timeout = timeout
-        self.ignore_memcache_errors = ignore_memcache_errors
-
-    def load_bytecode(self, bucket):
-        try:
-            code = self.client.get(self.prefix + bucket.key)
-        except Exception:
-            if not self.ignore_memcache_errors:
-                raise
-            code = None
-        if code is not None:
-            bucket.bytecode_from_string(code)
-
-    def dump_bytecode(self, bucket):
-        args = (self.prefix + bucket.key, bucket.bytecode_to_string())
-        if self.timeout is not None:
-            args += (self.timeout,)
-        try:
-            self.client.set(*args)
-        except Exception:
-            if not self.ignore_memcache_errors:
-                raise
diff --git a/third_party/jinja2/compiler.py b/third_party/jinja2/compiler.py
deleted file mode 100644
index fad007b..0000000
--- a/third_party/jinja2/compiler.py
+++ /dev/null
@@ -1,1686 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    jinja2.compiler
-    ~~~~~~~~~~~~~~~
-
-    Compiles nodes into python code.
-
-    :copyright: (c) 2010 by the Jinja Team.
-    :license: BSD, see LICENSE for more details.
-"""
-from itertools import chain
-from copy import deepcopy
-from keyword import iskeyword as is_python_keyword
-from jinja2 import nodes
-from jinja2.nodes import EvalContext
-from jinja2.visitor import NodeVisitor
-from jinja2.exceptions import TemplateAssertionError
-from jinja2.utils import Markup, concat, escape
-from jinja2._compat import range_type, text_type, string_types, \
-     iteritems, NativeStringIO, imap
-
-
-operators = {
-    'eq':       '==',
-    'ne':       '!=',
-    'gt':       '>',
-    'gteq':     '>=',
-    'lt':       '<',
-    'lteq':     '<=',
-    'in':       'in',
-    'notin':    'not in'
-}
-
-# what method to iterate over items do we want to use for dict iteration
-# in generated code?  on 2.x let's go with iteritems, on 3.x with items
-if hasattr(dict, 'iteritems'):
-    dict_item_iter = 'iteritems'
-else:
-    dict_item_iter = 'items'
-
-
-# does if 0: dummy(x) get us x into the scope?
-def unoptimize_before_dead_code():
-    x = 42
-    def f():
-        if 0: dummy(x)
-    return f
-
-# The getattr is necessary for pypy which does not set this attribute if
-# no closure is on the function
-unoptimize_before_dead_code = bool(
-    getattr(unoptimize_before_dead_code(), '__closure__', None))
-
-
-def generate(node, environment, name, filename, stream=None,
-             defer_init=False):
-    """Generate the python source for a node tree."""
-    if not isinstance(node, nodes.Template):
-        raise TypeError('Can\'t compile non template nodes')
-    generator = environment.code_generator_class(environment, name, filename,
-                                                 stream, defer_init)
-    generator.visit(node)
-    if stream is None:
-        return generator.stream.getvalue()
-
-
-def has_safe_repr(value):
-    """Does the node have a safe representation?"""
-    if value is None or value is NotImplemented or value is Ellipsis:
-        return True
-    if isinstance(value, (bool, int, float, complex, range_type,
-            Markup) + string_types):
-        return True
-    if isinstance(value, (tuple, list, set, frozenset)):
-        for item in value:
-            if not has_safe_repr(item):
-                return False
-        return True
-    elif isinstance(value, dict):
-        for key, value in iteritems(value):
-            if not has_safe_repr(key):
-                return False
-            if not has_safe_repr(value):
-                return False
-        return True
-    return False
-
-
-def find_undeclared(nodes, names):
-    """Check if the names passed are accessed undeclared.  The return value
-    is a set of all the undeclared names from the sequence of names found.
-    """
-    visitor = UndeclaredNameVisitor(names)
-    try:
-        for node in nodes:
-            visitor.visit(node)
-    except VisitorExit:
-        pass
-    return visitor.undeclared
-
-
-class Identifiers(object):
-    """Tracks the status of identifiers in frames."""
-
-    def __init__(self):
-        # variables that are known to be declared (probably from outer
-        # frames or because they are special for the frame)
-        self.declared = set()
-
-        # undeclared variables from outer scopes
-        self.outer_undeclared = set()
-
-        # names that are accessed without being explicitly declared by
-        # this one or any of the outer scopes.  Names can appear both in
-        # declared and undeclared.
-        self.undeclared = set()
-
-        # names that are declared locally
-        self.declared_locally = set()
-
-        # names that are declared by parameters
-        self.declared_parameter = set()
-
-    def add_special(self, name):
-        """Register a special name like `loop`."""
-        self.undeclared.discard(name)
-        self.declared.add(name)
-
-    def is_declared(self, name):
-        """Check if a name is declared in this or an outer scope."""
-        if name in self.declared_locally or name in self.declared_parameter:
-            return True
-        return name in self.declared
-
-    def copy(self):
-        return deepcopy(self)
-
-
-class Frame(object):
-    """Holds compile time information for us."""
-
-    def __init__(self, eval_ctx, parent=None):
-        self.eval_ctx = eval_ctx
-        self.identifiers = Identifiers()
-
-        # a toplevel frame is the root + soft frames such as if conditions.
-        self.toplevel = False
-
-        # the root frame is basically just the outermost frame, so no if
-        # conditions.  This information is used to optimize inheritance
-        # situations.
-        self.rootlevel = False
-
-        # in some dynamic inheritance situations the compiler needs to add
-        # write tests around output statements.
-        self.require_output_check = parent and parent.require_output_check
-
-        # inside some tags we are using a buffer rather than yield statements.
-        # this for example affects {% filter %} or {% macro %}.  If a frame
-        # is buffered this variable points to the name of the list used as
-        # buffer.
-        self.buffer = None
-
-        # the name of the block we're in, otherwise None.
-        self.block = parent and parent.block or None
-
-        # a set of actually assigned names
-        self.assigned_names = set()
-
-        # the parent of this frame
-        self.parent = parent
-
-        if parent is not None:
-            self.identifiers.declared.update(
-                parent.identifiers.declared |
-                parent.identifiers.declared_parameter |
-                parent.assigned_names
-            )
-            self.identifiers.outer_undeclared.update(
-                parent.identifiers.undeclared -
-                self.identifiers.declared
-            )
-            self.buffer = parent.buffer
-
-    def copy(self):
-        """Create a copy of the current one."""
-        rv = object.__new__(self.__class__)
-        rv.__dict__.update(self.__dict__)
-        rv.identifiers = object.__new__(self.identifiers.__class__)
-        rv.identifiers.__dict__.update(self.identifiers.__dict__)
-        return rv
-
-    def inspect(self, nodes):
-        """Walk the node and check for identifiers.  If the scope is hard (eg:
-        enforce on a python level) overrides from outer scopes are tracked
-        differently.
-        """
-        visitor = FrameIdentifierVisitor(self.identifiers)
-        for node in nodes:
-            visitor.visit(node)
-
-    def find_shadowed(self, extra=()):
-        """Find all the shadowed names.  extra is an iterable of variables
-        that may be defined with `add_special` which may occour scoped.
-        """
-        i = self.identifiers
-        return (i.declared | i.outer_undeclared) & \
-               (i.declared_locally | i.declared_parameter) | \
-               set(x for x in extra if i.is_declared(x))
-
-    def inner(self):
-        """Return an inner frame."""
-        return Frame(self.eval_ctx, self)
-
-    def soft(self):
-        """Return a soft frame.  A soft frame may not be modified as
-        standalone thing as it shares the resources with the frame it
-        was created of, but it's not a rootlevel frame any longer.
-        """
-        rv = self.copy()
-        rv.rootlevel = False
-        return rv
-
-    __copy__ = copy
-
-
-class VisitorExit(RuntimeError):
-    """Exception used by the `UndeclaredNameVisitor` to signal a stop."""
-
-
-class DependencyFinderVisitor(NodeVisitor):
-    """A visitor that collects filter and test calls."""
-
-    def __init__(self):
-        self.filters = set()
-        self.tests = set()
-
-    def visit_Filter(self, node):
-        self.generic_visit(node)
-        self.filters.add(node.name)
-
-    def visit_Test(self, node):
-        self.generic_visit(node)
-        self.tests.add(node.name)
-
-    def visit_Block(self, node):
-        """Stop visiting at blocks."""
-
-
-class UndeclaredNameVisitor(NodeVisitor):
-    """A visitor that checks if a name is accessed without being
-    declared.  This is different from the frame visitor as it will
-    not stop at closure frames.
-    """
-
-    def __init__(self, names):
-        self.names = set(names)
-        self.undeclared = set()
-
-    def visit_Name(self, node):
-        if node.ctx == 'load' and node.name in self.names:
-            self.undeclared.add(node.name)
-            if self.undeclared == self.names:
-                raise VisitorExit()
-        else:
-            self.names.discard(node.name)
-
-    def visit_Block(self, node):
-        """Stop visiting a blocks."""
-
-
-class FrameIdentifierVisitor(NodeVisitor):
-    """A visitor for `Frame.inspect`."""
-
-    def __init__(self, identifiers):
-        self.identifiers = identifiers
-
-    def visit_Name(self, node):
-        """All assignments to names go through this function."""
-        if node.ctx == 'store':
-            self.identifiers.declared_locally.add(node.name)
-        elif node.ctx == 'param':
-            self.identifiers.declared_parameter.add(node.name)
-        elif node.ctx == 'load' and not \
-             self.identifiers.is_declared(node.name):
-            self.identifiers.undeclared.add(node.name)
-
-    def visit_If(self, node):
-        self.visit(node.test)
-        real_identifiers = self.identifiers
-
-        old_names = real_identifiers.declared_locally | \
-                    real_identifiers.declared_parameter
-
-        def inner_visit(nodes):
-            if not nodes:
-                return set()
-            self.identifiers = real_identifiers.copy()
-            for subnode in nodes:
-                self.visit(subnode)
-            rv = self.identifiers.declared_locally - old_names
-            # we have to remember the undeclared variables of this branch
-            # because we will have to pull them.
-            real_identifiers.undeclared.update(self.identifiers.undeclared)
-            self.identifiers = real_identifiers
-            return rv
-
-        body = inner_visit(node.body)
-        else_ = inner_visit(node.else_ or ())
-
-        # the differences between the two branches are also pulled as
-        # undeclared variables
-        real_identifiers.undeclared.update(body.symmetric_difference(else_) -
-                                           real_identifiers.declared)
-
-        # remember those that are declared.
-        real_identifiers.declared_locally.update(body | else_)
-
-    def visit_Macro(self, node):
-        self.identifiers.declared_locally.add(node.name)
-
-    def visit_Import(self, node):
-        self.generic_visit(node)
-        self.identifiers.declared_locally.add(node.target)
-
-    def visit_FromImport(self, node):
-        self.generic_visit(node)
-        for name in node.names:
-            if isinstance(name, tuple):
-                self.identifiers.declared_locally.add(name[1])
-            else:
-                self.identifiers.declared_locally.add(name)
-
-    def visit_Assign(self, node):
-        """Visit assignments in the correct order."""
-        self.visit(node.node)
-        self.visit(node.target)
-
-    def visit_For(self, node):
-        """Visiting stops at for blocks.  However the block sequence
-        is visited as part of the outer scope.
-        """
-        self.visit(node.iter)
-
-    def visit_CallBlock(self, node):
-        self.visit(node.call)
-
-    def visit_FilterBlock(self, node):
-        self.visit(node.filter)
-
-    def visit_AssignBlock(self, node):
-        """Stop visiting at block assigns."""
-
-    def visit_Scope(self, node):
-        """Stop visiting at scopes."""
-
-    def visit_Block(self, node):
-        """Stop visiting at blocks."""
-
-
-class CompilerExit(Exception):
-    """Raised if the compiler encountered a situation where it just
-    doesn't make sense to further process the code.  Any block that
-    raises such an exception is not further processed.
-    """
-
-
-class CodeGenerator(NodeVisitor):
-
-    def __init__(self, environment, name, filename, stream=None,
-                 defer_init=False):
-        if stream is None:
-            stream = NativeStringIO()
-        self.environment = environment
-        self.name = name
-        self.filename = filename
-        self.stream = stream
-        self.created_block_context = False
-        self.defer_init = defer_init
-
-        # aliases for imports
-        self.import_aliases = {}
-
-        # a registry for all blocks.  Because blocks are moved out
-        # into the global python scope they are registered here
-        self.blocks = {}
-
-        # the number of extends statements so far
-        self.extends_so_far = 0
-
-        # some templates have a rootlevel extends.  In this case we
-        # can safely assume that we're a child template and do some
-        # more optimizations.
-        self.has_known_extends = False
-
-        # the current line number
-        self.code_lineno = 1
-
-        # registry of all filters and tests (global, not block local)
-        self.tests = {}
-        self.filters = {}
-
-        # the debug information
-        self.debug_info = []
-        self._write_debug_info = None
-
-        # the number of new lines before the next write()
-        self._new_lines = 0
-
-        # the line number of the last written statement
-        self._last_line = 0
-
-        # true if nothing was written so far.
-        self._first_write = True
-
-        # used by the `temporary_identifier` method to get new
-        # unique, temporary identifier
-        self._last_identifier = 0
-
-        # the current indentation
-        self._indentation = 0
-
-    # -- Various compilation helpers
-
-    def fail(self, msg, lineno):
-        """Fail with a :exc:`TemplateAssertionError`."""
-        raise TemplateAssertionError(msg, lineno, self.name, self.filename)
-
-    def temporary_identifier(self):
-        """Get a new unique identifier."""
-        self._last_identifier += 1
-        return 't_%d' % self._last_identifier
-
-    def buffer(self, frame):
-        """Enable buffering for the frame from that point onwards."""
-        frame.buffer = self.temporary_identifier()
-        self.writeline('%s = []' % frame.buffer)
-
-    def return_buffer_contents(self, frame):
-        """Return the buffer contents of the frame."""
-        if frame.eval_ctx.volatile:
-            self.writeline('if context.eval_ctx.autoescape:')
-            self.indent()
-            self.writeline('return Markup(concat(%s))' % frame.buffer)
-            self.outdent()
-            self.writeline('else:')
-            self.indent()
-            self.writeline('return concat(%s)' % frame.buffer)
-            self.outdent()
-        elif frame.eval_ctx.autoescape:
-            self.writeline('return Markup(concat(%s))' % frame.buffer)
-        else:
-            self.writeline('return concat(%s)' % frame.buffer)
-
-    def indent(self):
-        """Indent by one."""
-        self._indentation += 1
-
-    def outdent(self, step=1):
-        """Outdent by step."""
-        self._indentation -= step
-
-    def start_write(self, frame, node=None):
-        """Yield or write into the frame buffer."""
-        if frame.buffer is None:
-            self.writeline('yield ', node)
-        else:
-            self.writeline('%s.append(' % frame.buffer, node)
-
-    def end_write(self, frame):
-        """End the writing process started by `start_write`."""
-        if frame.buffer is not None:
-            self.write(')')
-
-    def simple_write(self, s, frame, node=None):
-        """Simple shortcut for start_write + write + end_write."""
-        self.start_write(frame, node)
-        self.write(s)
-        self.end_write(frame)
-
-    def blockvisit(self, nodes, frame):
-        """Visit a list of nodes as block in a frame.  If the current frame
-        is no buffer a dummy ``if 0: yield None`` is written automatically
-        unless the force_generator parameter is set to False.
-        """
-        if frame.buffer is None:
-            self.writeline('if 0: yield None')
-        else:
-            self.writeline('pass')
-        try:
-            for node in nodes:
-                self.visit(node, frame)
-        except CompilerExit:
-            pass
-
-    def write(self, x):
-        """Write a string into the output stream."""
-        if self._new_lines:
-            if not self._first_write:
-                self.stream.write('\n' * self._new_lines)
-                self.code_lineno += self._new_lines
-                if self._write_debug_info is not None:
-                    self.debug_info.append((self._write_debug_info,
-                                            self.code_lineno))
-                    self._write_debug_info = None
-            self._first_write = False
-            self.stream.write('    ' * self._indentation)
-            self._new_lines = 0
-        self.stream.write(x)
-
-    def writeline(self, x, node=None, extra=0):
-        """Combination of newline and write."""
-        self.newline(node, extra)
-        self.write(x)
-
-    def newline(self, node=None, extra=0):
-        """Add one or more newlines before the next write."""
-        self._new_lines = max(self._new_lines, 1 + extra)
-        if node is not None and node.lineno != self._last_line:
-            self._write_debug_info = node.lineno
-            self._last_line = node.lineno
-
-    def signature(self, node, frame, extra_kwargs=None):
-        """Writes a function call to the stream for the current node.
-        A leading comma is added automatically.  The extra keyword
-        arguments may not include python keywords otherwise a syntax
-        error could occour.  The extra keyword arguments should be given
-        as python dict.
-        """
-        # if any of the given keyword arguments is a python keyword
-        # we have to make sure that no invalid call is created.
-        kwarg_workaround = False
-        for kwarg in chain((x.key for x in node.kwargs), extra_kwargs or ()):
-            if is_python_keyword(kwarg):
-                kwarg_workaround = True
-                break
-
-        for arg in node.args:
-            self.write(', ')
-            self.visit(arg, frame)
-
-        if not kwarg_workaround:
-            for kwarg in node.kwargs:
-                self.write(', ')
-                self.visit(kwarg, frame)
-            if extra_kwargs is not None:
-                for key, value in iteritems(extra_kwargs):
-                    self.write(', %s=%s' % (key, value))
-        if node.dyn_args:
-            self.write(', *')
-            self.visit(node.dyn_args, frame)
-
-        if kwarg_workaround:
-            if node.dyn_kwargs is not None:
-                self.write(', **dict({')
-            else:
-                self.write(', **{')
-            for kwarg in node.kwargs:
-                self.write('%r: ' % kwarg.key)
-                self.visit(kwarg.value, frame)
-                self.write(', ')
-            if extra_kwargs is not None:
-                for key, value in iteritems(extra_kwargs):
-                    self.write('%r: %s, ' % (key, value))
-            if node.dyn_kwargs is not None:
-                self.write('}, **')
-                self.visit(node.dyn_kwargs, frame)
-                self.write(')')
-            else:
-                self.write('}')
-
-        elif node.dyn_kwargs is not None:
-            self.write(', **')
-            self.visit(node.dyn_kwargs, frame)
-
-    def pull_locals(self, frame):
-        """Pull all the references identifiers into the local scope."""
-        for name in frame.identifiers.undeclared:
-            self.writeline('l_%s = context.resolve(%r)' % (name, name))
-
-    def pull_dependencies(self, nodes):
-        """Pull all the dependencies."""
-        visitor = DependencyFinderVisitor()
-        for node in nodes:
-            visitor.visit(node)
-        for dependency in 'filters', 'tests':
-            mapping = getattr(self, dependency)
-            for name in getattr(visitor, dependency):
-                if name not in mapping:
-                    mapping[name] = self.temporary_identifier()
-                self.writeline('%s = environment.%s[%r]' %
-                               (mapping[name], dependency, name))
-
-    def unoptimize_scope(self, frame):
-        """Disable Python optimizations for the frame."""
-        # XXX: this is not that nice but it has no real overhead.  It
-        # mainly works because python finds the locals before dead code
-        # is removed.  If that breaks we have to add a dummy function
-        # that just accepts the arguments and does nothing.
-        if frame.identifiers.declared:
-            self.writeline('%sdummy(%s)' % (
-                unoptimize_before_dead_code and 'if 0: ' or '',
-                ', '.join('l_' + name for name in frame.identifiers.declared)
-            ))
-
-    def push_scope(self, frame, extra_vars=()):
-        """This function returns all the shadowed variables in a dict
-        in the form name: alias and will write the required assignments
-        into the current scope.  No indentation takes place.
-
-        This also predefines locally declared variables from the loop
-        body because under some circumstances it may be the case that
-
-        `extra_vars` is passed to `Frame.find_shadowed`.
-        """
-        aliases = {}
-        for name in frame.find_shadowed(extra_vars):
-            aliases[name] = ident = self.temporary_identifier()
-            self.writeline('%s = l_%s' % (ident, name))
-        to_declare = set()
-        for name in frame.identifiers.declared_locally:
-            if name not in aliases:
-                to_declare.add('l_' + name)
-        if to_declare:
-            self.writeline(' = '.join(to_declare) + ' = missing')
-        return aliases
-
-    def pop_scope(self, aliases, frame):
-        """Restore all aliases and delete unused variables."""
-        for name, alias in iteritems(aliases):
-            self.writeline('l_%s = %s' % (name, alias))
-        to_delete = set()
-        for name in frame.identifiers.declared_locally:
-            if name not in aliases:
-                to_delete.add('l_' + name)
-        if to_delete:
-            # we cannot use the del statement here because enclosed
-            # scopes can trigger a SyntaxError:
-            #   a = 42; b = lambda: a; del a
-            self.writeline(' = '.join(to_delete) + ' = missing')
-
-    def function_scoping(self, node, frame, children=None,
-                         find_special=True):
-        """In Jinja a few statements require the help of anonymous
-        functions.  Those are currently macros and call blocks and in
-        the future also recursive loops.  As there is currently
-        technical limitation that doesn't allow reading and writing a
-        variable in a scope where the initial value is coming from an
-        outer scope, this function tries to fall back with a common
-        error message.  Additionally the frame passed is modified so
-        that the argumetns are collected and callers are looked up.
-
-        This will return the modified frame.
-        """
-        # we have to iterate twice over it, make sure that works
-        if children is None:
-            children = node.iter_child_nodes()
-        children = list(children)
-        func_frame = frame.inner()
-        func_frame.inspect(children)
-
-        # variables that are undeclared (accessed before declaration) and
-        # declared locally *and* part of an outside scope raise a template
-        # assertion error. Reason: we can't generate reasonable code from
-        # it without aliasing all the variables.
-        # this could be fixed in Python 3 where we have the nonlocal
-        # keyword or if we switch to bytecode generation
-        overridden_closure_vars = (
-            func_frame.identifiers.undeclared &
-            func_frame.identifiers.declared &
-            (func_frame.identifiers.declared_locally |
-             func_frame.identifiers.declared_parameter)
-        )
-        if overridden_closure_vars:
-            self.fail('It\'s not possible to set and access variables '
-                      'derived from an outer scope! (affects: %s)' %
-                      ', '.join(sorted(overridden_closure_vars)), node.lineno)
-
-        # remove variables from a closure from the frame's undeclared
-        # identifiers.
-        func_frame.identifiers.undeclared -= (
-            func_frame.identifiers.undeclared &
-            func_frame.identifiers.declared
-        )
-
-        # no special variables for this scope, abort early
-        if not find_special:
-            return func_frame
-
-        func_frame.accesses_kwargs = False
-        func_frame.accesses_varargs = False
-        func_frame.accesses_caller = False
-        func_frame.arguments = args = ['l_' + x.name for x in node.args]
-
-        undeclared = find_undeclared(children, ('caller', 'kwargs', 'varargs'))
-
-        if 'caller' in undeclared:
-            func_frame.accesses_caller = True
-            func_frame.identifiers.add_special('caller')
-            args.append('l_caller')
-        if 'kwargs' in undeclared:
-            func_frame.accesses_kwargs = True
-            func_frame.identifiers.add_special('kwargs')
-            args.append('l_kwargs')
-        if 'varargs' in undeclared:
-            func_frame.accesses_varargs = True
-            func_frame.identifiers.add_special('varargs')
-            args.append('l_varargs')
-        return func_frame
-
-    def macro_body(self, node, frame, children=None):
-        """Dump the function def of a macro or call block."""
-        frame = self.function_scoping(node, frame, children)
-        # macros are delayed, they never require output checks
-        frame.require_output_check = False
-        args = frame.arguments
-        # XXX: this is an ugly fix for the loop nesting bug
-        # (tests.test_old_bugs.test_loop_call_bug).  This works around
-        # a identifier nesting problem we have in general.  It's just more
-        # likely to happen in loops which is why we work around it.  The
-        # real solution would be "nonlocal" all the identifiers that are
-        # leaking into a new python frame and might be used both unassigned
-        # and assigned.
-        if 'loop' in frame.identifiers.declared:
-            args = args + ['l_loop=l_loop']
-        self.writeline('def macro(%s):' % ', '.join(args), node)
-        self.indent()
-        self.buffer(frame)
-        self.pull_locals(frame)
-        self.blockvisit(node.body, frame)
-        self.return_buffer_contents(frame)
-        self.outdent()
-        return frame
-
-    def macro_def(self, node, frame):
-        """Dump the macro definition for the def created by macro_body."""
-        arg_tuple = ', '.join(repr(x.name) for x in node.args)
-        name = getattr(node, 'name', None)
-        if len(node.args) == 1:
-            arg_tuple += ','
-        self.write('Macro(environment, macro, %r, (%s), (' %
-                   (name, arg_tuple))
-        for arg in node.defaults:
-            self.visit(arg, frame)
-            self.write(', ')
-        self.write('), %r, %r, %r)' % (
-            bool(frame.accesses_kwargs),
-            bool(frame.accesses_varargs),
-            bool(frame.accesses_caller)
-        ))
-
-    def position(self, node):
-        """Return a human readable position for the node."""
-        rv = 'line %d' % node.lineno
-        if self.name is not None:
-            rv += ' in ' + repr(self.name)
-        return rv
-
-    # -- Statement Visitors
-
-    def visit_Template(self, node, frame=None):
-        assert frame is None, 'no root frame allowed'
-        eval_ctx = EvalContext(self.environment, self.name)
-
-        from jinja2.runtime import __all__ as exported
-        self.writeline('from __future__ import division')
-        self.writeline('from jinja2.runtime import ' + ', '.join(exported))
-        if not unoptimize_before_dead_code:
-            self.writeline('dummy = lambda *x: None')
-
-        # if we want a deferred initialization we cannot move the
-        # environment into a local name
-        envenv = not self.defer_init and ', environment=environment' or ''
-
-        # do we have an extends tag at all?  If not, we can save some
-        # overhead by just not processing any inheritance code.
-        have_extends = node.find(nodes.Extends) is not None
-
-        # find all blocks
-        for block in node.find_all(nodes.Block):
-            if block.name in self.blocks:
-                self.fail('block %r defined twice' % block.name, block.lineno)
-            self.blocks[block.name] = block
-
-        # find all imports and import them
-        for import_ in node.find_all(nodes.ImportedName):
-            if import_.importname not in self.import_aliases:
-                imp = import_.importname
-                self.import_aliases[imp] = alias = self.temporary_identifier()
-                if '.' in imp:
-                    module, obj = imp.rsplit('.', 1)
-                    self.writeline('from %s import %s as %s' %
-                                   (module, obj, alias))
-                else:
-                    self.writeline('import %s as %s' % (imp, alias))
-
-        # add the load name
-        self.writeline('name = %r' % self.name)
-
-        # generate the root render function.
-        self.writeline('def root(context%s):' % envenv, extra=1)
-
-        # process the root
-        frame = Frame(eval_ctx)
-        frame.inspect(node.body)
-        frame.toplevel = frame.rootlevel = True
-        frame.require_output_check = have_extends and not self.has_known_extends
-        self.indent()
-        if have_extends:
-            self.writeline('parent_template = None')
-        if 'self' in find_undeclared(node.body, ('self',)):
-            frame.identifiers.add_special('self')
-            self.writeline('l_self = TemplateReference(context)')
-        self.pull_locals(frame)
-        self.pull_dependencies(node.body)
-        self.blockvisit(node.body, frame)
-        self.outdent()
-
-        # make sure that the parent root is called.
-        if have_extends:
-            if not self.has_known_extends:
-                self.indent()
-                self.writeline('if parent_template is not None:')
-            self.indent()
-            self.writeline('for event in parent_template.'
-                           'root_render_func(context):')
-            self.indent()
-            self.writeline('yield event')
-            self.outdent(2 + (not self.has_known_extends))
-
-        # at this point we now have the blocks collected and can visit them too.
-        for name, block in iteritems(self.blocks):
-            block_frame = Frame(eval_ctx)
-            block_frame.inspect(block.body)
-            block_frame.block = name
-            self.writeline('def block_%s(context%s):' % (name, envenv),
-                           block, 1)
-            self.indent()
-            undeclared = find_undeclared(block.body, ('self', 'super'))
-            if 'self' in undeclared:
-                block_frame.identifiers.add_special('self')
-                self.writeline('l_self = TemplateReference(context)')
-            if 'super' in undeclared:
-                block_frame.identifiers.add_special('super')
-                self.writeline('l_super = context.super(%r, '
-                               'block_%s)' % (name, name))
-            self.pull_locals(block_frame)
-            self.pull_dependencies(block.body)
-            self.blockvisit(block.body, block_frame)
-            self.outdent()
-
-        self.writeline('blocks = {%s}' % ', '.join('%r: block_%s' % (x, x)
-                                                   for x in self.blocks),
-                       extra=1)
-
-        # add a function that returns the debug info
-        self.writeline('debug_info = %r' % '&'.join('%s=%s' % x for x
-                                                    in self.debug_info))
-
-    def visit_Block(self, node, frame):
-        """Call a block and register it for the template."""
-        level = 1
-        if frame.toplevel:
-            # if we know that we are a child template, there is no need to
-            # check if we are one
-            if self.has_known_extends:
-                return
-            if self.extends_so_far > 0:
-                self.writeline('if parent_template is None:')
-                self.indent()
-                level += 1
-        context = node.scoped and 'context.derived(locals())' or 'context'
-        self.writeline('for event in context.blocks[%r][0](%s):' % (
-                       node.name, context), node)
-        self.indent()
-        self.simple_write('event', frame)
-        self.outdent(level)
-
-    def visit_Extends(self, node, frame):
-        """Calls the extender."""
-        if not frame.toplevel:
-            self.fail('cannot use extend from a non top-level scope',
-                      node.lineno)
-
-        # if the number of extends statements in general is zero so
-        # far, we don't have to add a check if something extended
-        # the template before this one.
-        if self.extends_so_far > 0:
-
-            # if we have a known extends we just add a template runtime
-            # error into the generated code.  We could catch that at compile
-            # time too, but i welcome it not to confuse users by throwing the
-            # same error at different times just "because we can".
-            if not self.has_known_extends:
-                self.writeline('if parent_template is not None:')
-                self.indent()
-            self.writeline('raise TemplateRuntimeError(%r)' %
-                           'extended multiple times')
-
-            # if we have a known extends already we don't need that code here
-            # as we know that the template execution will end here.
-            if self.has_known_extends:
-                raise CompilerExit()
-            else:
-                self.outdent()
-
-        self.writeline('parent_template = environment.get_template(', node)
-        self.visit(node.template, frame)
-        self.write(', %r)' % self.name)
-        self.writeline('for name, parent_block in parent_template.'
-                       'blocks.%s():' % dict_item_iter)
-        self.indent()
-        self.writeline('context.blocks.setdefault(name, []).'
-                       'append(parent_block)')
-        self.outdent()
-
-        # if this extends statement was in the root level we can take
-        # advantage of that information and simplify the generated code
-        # in the top level from this point onwards
-        if frame.rootlevel:
-            self.has_known_extends = True
-
-        # and now we have one more
-        self.extends_so_far += 1
-
-    def visit_Include(self, node, frame):
-        """Handles includes."""
-        if node.with_context:
-            self.unoptimize_scope(frame)
-        if node.ignore_missing:
-            self.writeline('try:')
-            self.indent()
-
-        func_name = 'get_or_select_template'
-        if isinstance(node.template, nodes.Const):
-            if isinstance(node.template.value, string_types):
-                func_name = 'get_template'
-            elif isinstance(node.template.value, (tuple, list)):
-                func_name = 'select_template'
-        elif isinstance(node.template, (nodes.Tuple, nodes.List)):
-            func_name = 'select_template'
-
-        self.writeline('template = environment.%s(' % func_name, node)
-        self.visit(node.template, frame)
-        self.write(', %r)' % self.name)
-        if node.ignore_missing:
-            self.outdent()
-            self.writeline('except TemplateNotFound:')
-            self.indent()
-            self.writeline('pass')
-            self.outdent()
-            self.writeline('else:')
-            self.indent()
-
-        if node.with_context:
-            self.writeline('for event in template.root_render_func('
-                           'template.new_context(context.parent, True, '
-                           'locals())):')
-        else:
-            self.writeline('for event in template.module._body_stream:')
-
-        self.indent()
-        self.simple_write('event', frame)
-        self.outdent()
-
-        if node.ignore_missing:
-            self.outdent()
-
-    def visit_Import(self, node, frame):
-        """Visit regular imports."""
-        if node.with_context:
-            self.unoptimize_scope(frame)
-        self.writeline('l_%s = ' % node.target, node)
-        if frame.toplevel:
-            self.write('context.vars[%r] = ' % node.target)
-        self.write('environment.get_template(')
-        self.visit(node.template, frame)
-        self.write(', %r).' % self.name)
-        if node.with_context:
-            self.write('make_module(context.parent, True, locals())')
-        else:
-            self.write('module')
-        if frame.toplevel and not node.target.startswith('_'):
-            self.writeline('context.exported_vars.discard(%r)' % node.target)
-        frame.assigned_names.add(node.target)
-
-    def visit_FromImport(self, node, frame):
-        """Visit named imports."""
-        self.newline(node)
-        self.write('included_template = environment.get_template(')
-        self.visit(node.template, frame)
-        self.write(', %r).' % self.name)
-        if node.with_context:
-            self.write('make_module(context.parent, True)')
-        else:
-            self.write('module')
-
-        var_names = []
-        discarded_names = []
-        for name in node.names:
-            if isinstance(name, tuple):
-                name, alias = name
-            else:
-                alias = name
-            self.writeline('l_%s = getattr(included_template, '
-                           '%r, missing)' % (alias, name))
-            self.writeline('if l_%s is missing:' % alias)
-            self.indent()
-            self.writeline('l_%s = environment.undefined(%r %% '
-                           'included_template.__name__, '
-                           'name=%r)' %
-                           (alias, 'the template %%r (imported on %s) does '
-                           'not export the requested name %s' % (
-                                self.position(node),
-                                repr(name)
-                           ), name))
-            self.outdent()
-            if frame.toplevel:
-                var_names.append(alias)
-                if not alias.startswith('_'):
-                    discarded_names.append(alias)
-            frame.assigned_names.add(alias)
-
-        if var_names:
-            if len(var_names) == 1:
-                name = var_names[0]
-                self.writeline('context.vars[%r] = l_%s' % (name, name))
-            else:
-                self.writeline('context.vars.update({%s})' % ', '.join(
-                    '%r: l_%s' % (name, name) for name in var_names
-                ))
-        if discarded_names:
-            if len(discarded_names) == 1:
-                self.writeline('context.exported_vars.discard(%r)' %
-                               discarded_names[0])
-            else:
-                self.writeline('context.exported_vars.difference_'
-                               'update((%s))' % ', '.join(imap(repr, discarded_names)))
-
-    def visit_For(self, node, frame):
-        # when calculating the nodes for the inner frame we have to exclude
-        # the iterator contents from it
-        children = node.iter_child_nodes(exclude=('iter',))
-        if node.recursive:
-            loop_frame = self.function_scoping(node, frame, children,
-                                               find_special=False)
-        else:
-            loop_frame = frame.inner()
-            loop_frame.inspect(children)
-
-        # try to figure out if we have an extended loop.  An extended loop
-        # is necessary if the loop is in recursive mode if the special loop
-        # variable is accessed in the body.
-        extended_loop = node.recursive or 'loop' in \
-                        find_undeclared(node.iter_child_nodes(
-                            only=('body',)), ('loop',))
-
-        # if we don't have an recursive loop we have to find the shadowed
-        # variables at that point.  Because loops can be nested but the loop
-        # variable is a special one we have to enforce aliasing for it.
-        if not node.recursive:
-            aliases = self.push_scope(loop_frame, ('loop',))
-
-        # otherwise we set up a buffer and add a function def
-        else:
-            self.writeline('def loop(reciter, loop_render_func, depth=0):', node)
-            self.indent()
-            self.buffer(loop_frame)
-            aliases = {}
-
-        # make sure the loop variable is a special one and raise a template
-        # assertion error if a loop tries to write to loop
-        if extended_loop:
-            self.writeline('l_loop = missing')
-            loop_frame.identifiers.add_special('loop')
-        for name in node.find_all(nodes.Name):
-            if name.ctx == 'store' and name.name == 'loop':
-                self.fail('Can\'t assign to special loop variable '
-                          'in for-loop target', name.lineno)
-
-        self.pull_locals(loop_frame)
-        if node.else_:
-            iteration_indicator = self.temporary_identifier()
-            self.writeline('%s = 1' % iteration_indicator)
-
-        # Create a fake parent loop if the else or test section of a
-        # loop is accessing the special loop variable and no parent loop
-        # exists.
-        if 'loop' not in aliases and 'loop' in find_undeclared(
-           node.iter_child_nodes(only=('else_', 'test')), ('loop',)):
-            self.writeline("l_loop = environment.undefined(%r, name='loop')" %
-                ("'loop' is undefined. the filter section of a loop as well "
-                 "as the else block don't have access to the special 'loop'"
-                 " variable of the current loop.  Because there is no parent "
-                 "loop it's undefined.  Happened in loop on %s" %
-                 self.position(node)))
-
-        self.writeline('for ', node)
-        self.visit(node.target, loop_frame)
-        self.write(extended_loop and ', l_loop in LoopContext(' or ' in ')
-
-        # if we have an extened loop and a node test, we filter in the
-        # "outer frame".
-        if extended_loop and node.test is not None:
-            self.write('(')
-            self.visit(node.target, loop_frame)
-            self.write(' for ')
-            self.visit(node.target, loop_frame)
-            self.write(' in ')
-            if node.recursive:
-                self.write('reciter')
-            else:
-                self.visit(node.iter, loop_frame)
-            self.write(' if (')
-            test_frame = loop_frame.copy()
-            self.visit(node.test, test_frame)
-            self.write('))')
-
-        elif node.recursive:
-            self.write('reciter')
-        else:
-            self.visit(node.iter, loop_frame)
-
-        if node.recursive:
-            self.write(', loop_render_func, depth):')
-        else:
-            self.write(extended_loop and '):' or ':')
-
-        # tests in not extended loops become a continue
-        if not extended_loop and node.test is not None:
-            self.indent()
-            self.writeline('if not ')
-            self.visit(node.test, loop_frame)
-            self.write(':')
-            self.indent()
-            self.writeline('continue')
-            self.outdent(2)
-
-        self.indent()
-        self.blockvisit(node.body, loop_frame)
-        if node.else_:
-            self.writeline('%s = 0' % iteration_indicator)
-        self.outdent()
-
-        if node.else_:
-            self.writeline('if %s:' % iteration_indicator)
-            self.indent()
-            self.blockvisit(node.else_, loop_frame)
-            self.outdent()
-
-        # reset the aliases if there are any.
-        if not node.recursive:
-            self.pop_scope(aliases, loop_frame)
-
-        # if the node was recursive we have to return the buffer contents
-        # and start the iteration code
-        if node.recursive:
-            self.return_buffer_contents(loop_frame)
-            self.outdent()
-            self.start_write(frame, node)
-            self.write('loop(')
-            self.visit(node.iter, frame)
-            self.write(', loop)')
-            self.end_write(frame)
-
-    def visit_If(self, node, frame):
-        if_frame = frame.soft()
-        self.writeline('if ', node)
-        self.visit(node.test, if_frame)
-        self.write(':')
-        self.indent()
-        self.blockvisit(node.body, if_frame)
-        self.outdent()
-        if node.else_:
-            self.writeline('else:')
-            self.indent()
-            self.blockvisit(node.else_, if_frame)
-            self.outdent()
-
-    def visit_Macro(self, node, frame):
-        macro_frame = self.macro_body(node, frame)
-        self.newline()
-        if frame.toplevel:
-            if not node.name.startswith('_'):
-                self.write('context.exported_vars.add(%r)' % node.name)
-            self.writeline('context.vars[%r] = ' % node.name)
-        self.write('l_%s = ' % node.name)
-        self.macro_def(node, macro_frame)
-        frame.assigned_names.add(node.name)
-
-    def visit_CallBlock(self, node, frame):
-        children = node.iter_child_nodes(exclude=('call',))
-        call_frame = self.macro_body(node, frame, children)
-        self.writeline('caller = ')
-        self.macro_def(node, call_frame)
-        self.start_write(frame, node)
-        self.visit_Call(node.call, call_frame, forward_caller=True)
-        self.end_write(frame)
-
-    def visit_FilterBlock(self, node, frame):
-        filter_frame = frame.inner()
-        filter_frame.inspect(node.iter_child_nodes())
-        aliases = self.push_scope(filter_frame)
-        self.pull_locals(filter_frame)
-        self.buffer(filter_frame)
-        self.blockvisit(node.body, filter_frame)
-        self.start_write(frame, node)
-        self.visit_Filter(node.filter, filter_frame)
-        self.end_write(frame)
-        self.pop_scope(aliases, filter_frame)
-
-    def visit_ExprStmt(self, node, frame):
-        self.newline(node)
-        self.visit(node.node, frame)
-
-    def visit_Output(self, node, frame):
-        # if we have a known extends statement, we don't output anything
-        # if we are in a require_output_check section
-        if self.has_known_extends and frame.require_output_check:
-            return
-
-        allow_constant_finalize = True
-        if self.environment.finalize:
-            func = self.environment.finalize
-            if getattr(func, 'contextfunction', False) or \
-               getattr(func, 'evalcontextfunction', False):
-                allow_constant_finalize = False
-            elif getattr(func, 'environmentfunction', False):
-                finalize = lambda x: text_type(
-                    self.environment.finalize(self.environment, x))
-            else:
-                finalize = lambda x: text_type(self.environment.finalize(x))
-        else:
-            finalize = text_type
-
-        # if we are inside a frame that requires output checking, we do so
-        outdent_later = False
-        if frame.require_output_check:
-            self.writeline('if parent_template is None:')
-            self.indent()
-            outdent_later = True
-
-        # try to evaluate as many chunks as possible into a static
-        # string at compile time.
-        body = []
-        for child in node.nodes:
-            try:
-                if not allow_constant_finalize:
-                    raise nodes.Impossible()
-                const = child.as_const(frame.eval_ctx)
-            except nodes.Impossible:
-                body.append(child)
-                continue
-            # the frame can't be volatile here, becaus otherwise the
-            # as_const() function would raise an Impossible exception
-            # at that point.
-            try:
-                if frame.eval_ctx.autoescape:
-                    if hasattr(const, '__html__'):
-                        const = const.__html__()
-                    else:
-                        const = escape(const)
-                const = finalize(const)
-            except Exception:
-                # if something goes wrong here we evaluate the node
-                # at runtime for easier debugging
-                body.append(child)
-                continue
-            if body and isinstance(body[-1], list):
-                body[-1].append(const)
-            else:
-                body.append([const])
-
-        # if we have less than 3 nodes or a buffer we yield or extend/append
-        if len(body) < 3 or frame.buffer is not None:
-            if frame.buffer is not None:
-                # for one item we append, for more we extend
-                if len(body) == 1:
-                    self.writeline('%s.append(' % frame.buffer)
-                else:
-                    self.writeline('%s.extend((' % frame.buffer)
-                self.indent()
-            for item in body:
-                if isinstance(item, list):
-                    val = repr(concat(item))
-                    if frame.buffer is None:
-                        self.writeline('yield ' + val)
-                    else:
-                        self.writeline(val + ', ')
-                else:
-                    if frame.buffer is None:
-                        self.writeline('yield ', item)
-                    else:
-                        self.newline(item)
-                    close = 1
-                    if frame.eval_ctx.volatile:
-                        self.write('(context.eval_ctx.autoescape and'
-                                   ' escape or to_string)(')
-                    elif frame.eval_ctx.autoescape:
-                        self.write('escape(')
-                    else:
-                        self.write('to_string(')
-                    if self.environment.finalize is not None:
-                        self.write('environment.finalize(')
-                        if getattr(self.environment.finalize,
-                                   "contextfunction", False):
-                            self.write('context, ')
-                        close += 1
-                    self.visit(item, frame)
-                    self.write(')' * close)
-                    if frame.buffer is not None:
-                        self.write(', ')
-            if frame.buffer is not None:
-                # close the open parentheses
-                self.outdent()
-                self.writeline(len(body) == 1 and ')' or '))')
-
-        # otherwise we create a format string as this is faster in that case
-        else:
-            format = []
-            arguments = []
-            for item in body:
-                if isinstance(item, list):
-                    format.append(concat(item).replace('%', '%%'))
-                else:
-                    format.append('%s')
-                    arguments.append(item)
-            self.writeline('yield ')
-            self.write(repr(concat(format)) + ' % (')
-            self.indent()
-            for argument in arguments:
-                self.newline(argument)
-                close = 0
-                if frame.eval_ctx.volatile:
-                    self.write('(context.eval_ctx.autoescape and'
-                               ' escape or to_string)(')
-                    close += 1
-                elif frame.eval_ctx.autoescape:
-                    self.write('escape(')
-                    close += 1
-                if self.environment.finalize is not None:
-                    self.write('environment.finalize(')
-                    if getattr(self.environment.finalize,
-                               'contextfunction', False):
-                        self.write('context, ')
-                    elif getattr(self.environment.finalize,
-                               'evalcontextfunction', False):
-                        self.write('context.eval_ctx, ')
-                    elif getattr(self.environment.finalize,
-                               'environmentfunction', False):
-                        self.write('environment, ')
-                    close += 1
-                self.visit(argument, frame)
-                self.write(')' * close + ', ')
-            self.outdent()
-            self.writeline(')')
-
-        if outdent_later:
-            self.outdent()
-
-    def make_assignment_frame(self, frame):
-        # toplevel assignments however go into the local namespace and
-        # the current template's context.  We create a copy of the frame
-        # here and add a set so that the Name visitor can add the assigned
-        # names here.
-        if not frame.toplevel:
-            return frame
-        assignment_frame = frame.copy()
-        assignment_frame.toplevel_assignments = set()
-        return assignment_frame
-
-    def export_assigned_vars(self, frame, assignment_frame):
-        if not frame.toplevel:
-            return
-        public_names = [x for x in assignment_frame.toplevel_assignments
-                        if not x.startswith('_')]
-        if len(assignment_frame.toplevel_assignments) == 1:
-            name = next(iter(assignment_frame.toplevel_assignments))
-            self.writeline('context.vars[%r] = l_%s' % (name, name))
-        else:
-            self.writeline('context.vars.update({')
-            for idx, name in enumerate(assignment_frame.toplevel_assignments):
-                if idx:
-                    self.write(', ')
-                self.write('%r: l_%s' % (name, name))
-            self.write('})')
-        if public_names:
-            if len(public_names) == 1:
-                self.writeline('context.exported_vars.add(%r)' %
-                               public_names[0])
-            else:
-                self.writeline('context.exported_vars.update((%s))' %
-                               ', '.join(imap(repr, public_names)))
-
-    def visit_Assign(self, node, frame):
-        self.newline(node)
-        assignment_frame = self.make_assignment_frame(frame)
-        self.visit(node.target, assignment_frame)
-        self.write(' = ')
-        self.visit(node.node, frame)
-        self.export_assigned_vars(frame, assignment_frame)
-
-    def visit_AssignBlock(self, node, frame):
-        block_frame = frame.inner()
-        block_frame.inspect(node.body)
-        aliases = self.push_scope(block_frame)
-        self.pull_locals(block_frame)
-        self.buffer(block_frame)
-        self.blockvisit(node.body, block_frame)
-        self.pop_scope(aliases, block_frame)
-
-        assignment_frame = self.make_assignment_frame(frame)
-        self.newline(node)
-        self.visit(node.target, assignment_frame)
-        self.write(' = concat(%s)' % block_frame.buffer)
-        self.export_assigned_vars(frame, assignment_frame)
-
-    # -- Expression Visitors
-
-    def visit_Name(self, node, frame):
-        if node.ctx == 'store' and frame.toplevel:
-            frame.toplevel_assignments.add(node.name)
-        self.write('l_' + node.name)
-        frame.assigned_names.add(node.name)
-
-    def visit_Const(self, node, frame):
-        val = node.value
-        if isinstance(val, float):
-            self.write(str(val))
-        else:
-            self.write(repr(val))
-
-    def visit_TemplateData(self, node, frame):
-        try:
-            self.write(repr(node.as_const(frame.eval_ctx)))
-        except nodes.Impossible:
-            self.write('(context.eval_ctx.autoescape and Markup or identity)(%r)'
-                       % node.data)
-
-    def visit_Tuple(self, node, frame):
-        self.write('(')
-        idx = -1
-        for idx, item in enumerate(node.items):
-            if idx:
-                self.write(', ')
-            self.visit(item, frame)
-        self.write(idx == 0 and ',)' or ')')
-
-    def visit_List(self, node, frame):
-        self.write('[')
-        for idx, item in enumerate(node.items):
-            if idx:
-                self.write(', ')
-            self.visit(item, frame)
-        self.write(']')
-
-    def visit_Dict(self, node, frame):
-        self.write('{')
-        for idx, item in enumerate(node.items):
-            if idx:
-                self.write(', ')
-            self.visit(item.key, frame)
-            self.write(': ')
-            self.visit(item.value, frame)
-        self.write('}')
-
-    def binop(operator, interceptable=True):
-        def visitor(self, node, frame):
-            if self.environment.sandboxed and \
-               operator in self.environment.intercepted_binops:
-                self.write('environment.call_binop(context, %r, ' % operator)
-                self.visit(node.left, frame)
-                self.write(', ')
-                self.visit(node.right, frame)
-            else:
-                self.write('(')
-                self.visit(node.left, frame)
-                self.write(' %s ' % operator)
-                self.visit(node.right, frame)
-            self.write(')')
-        return visitor
-
-    def uaop(operator, interceptable=True):
-        def visitor(self, node, frame):
-            if self.environment.sandboxed and \
-               operator in self.environment.intercepted_unops:
-                self.write('environment.call_unop(context, %r, ' % operator)
-                self.visit(node.node, frame)
-            else:
-                self.write('(' + operator)
-                self.visit(node.node, frame)
-            self.write(')')
-        return visitor
-
-    visit_Add = binop('+')
-    visit_Sub = binop('-')
-    visit_Mul = binop('*')
-    visit_Div = binop('/')
-    visit_FloorDiv = binop('//')
-    visit_Pow = binop('**')
-    visit_Mod = binop('%')
-    visit_And = binop('and', interceptable=False)
-    visit_Or = binop('or', interceptable=False)
-    visit_Pos = uaop('+')
-    visit_Neg = uaop('-')
-    visit_Not = uaop('not ', interceptable=False)
-    del binop, uaop
-
-    def visit_Concat(self, node, frame):
-        if frame.eval_ctx.volatile:
-            func_name = '(context.eval_ctx.volatile and' \
-                        ' markup_join or unicode_join)'
-        elif frame.eval_ctx.autoescape:
-            func_name = 'markup_join'
-        else:
-            func_name = 'unicode_join'
-        self.write('%s((' % func_name)
-        for arg in node.nodes:
-            self.visit(arg, frame)
-            self.write(', ')
-        self.write('))')
-
-    def visit_Compare(self, node, frame):
-        self.visit(node.expr, frame)
-        for op in node.ops:
-            self.visit(op, frame)
-
-    def visit_Operand(self, node, frame):
-        self.write(' %s ' % operators[node.op])
-        self.visit(node.expr, frame)
-
-    def visit_Getattr(self, node, frame):
-        self.write('environment.getattr(')
-        self.visit(node.node, frame)
-        self.write(', %r)' % node.attr)
-
-    def visit_Getitem(self, node, frame):
-        # slices bypass the environment getitem method.
-        if isinstance(node.arg, nodes.Slice):
-            self.visit(node.node, frame)
-            self.write('[')
-            self.visit(node.arg, frame)
-            self.write(']')
-        else:
-            self.write('environment.getitem(')
-            self.visit(node.node, frame)
-            self.write(', ')
-            self.visit(node.arg, frame)
-            self.write(')')
-
-    def visit_Slice(self, node, frame):
-        if node.start is not None:
-            self.visit(node.start, frame)
-        self.write(':')
-        if node.stop is not None:
-            self.visit(node.stop, frame)
-        if node.step is not None:
-            self.write(':')
-            self.visit(node.step, frame)
-
-    def visit_Filter(self, node, frame):
-        self.write(self.filters[node.name] + '(')
-        func = self.environment.filters.get(node.name)
-        if func is None:
-            self.fail('no filter named %r' % node.name, node.lineno)
-        if getattr(func, 'contextfilter', False):
-            self.write('context, ')
-        elif getattr(func, 'evalcontextfilter', False):
-            self.write('context.eval_ctx, ')
-        elif getattr(func, 'environmentfilter', False):
-            self.write('environment, ')
-
-        # if the filter node is None we are inside a filter block
-        # and want to write to the current buffer
-        if node.node is not None:
-            self.visit(node.node, frame)
-        elif frame.eval_ctx.volatile:
-            self.write('(context.eval_ctx.autoescape and'
-                       ' Markup(concat(%s)) or concat(%s))' %
-                       (frame.buffer, frame.buffer))
-        elif frame.eval_ctx.autoescape:
-            self.write('Markup(concat(%s))' % frame.buffer)
-        else:
-            self.write('concat(%s)' % frame.buffer)
-        self.signature(node, frame)
-        self.write(')')
-
-    def visit_Test(self, node, frame):
-        self.write(self.tests[node.name] + '(')
-        if node.name not in self.environment.tests:
-            self.fail('no test named %r' % node.name, node.lineno)
-        self.visit(node.node, frame)
-        self.signature(node, frame)
-        self.write(')')
-
-    def visit_CondExpr(self, node, frame):
-        def write_expr2():
-            if node.expr2 is not None:
-                return self.visit(node.expr2, frame)
-            self.write('environment.undefined(%r)' % ('the inline if-'
-                       'expression on %s evaluated to false and '
-                       'no else section was defined.' % self.position(node)))
-
-        self.write('(')
-        self.visit(node.expr1, frame)
-        self.write(' if ')
-        self.visit(node.test, frame)
-        self.write(' else ')
-        write_expr2()
-        self.write(')')
-
-    def visit_Call(self, node, frame, forward_caller=False):
-        if self.environment.sandboxed:
-            self.write('environment.call(context, ')
-        else:
-            self.write('context.call(')
-        self.visit(node.node, frame)
-        extra_kwargs = forward_caller and {'caller': 'caller'} or None
-        self.signature(node, frame, extra_kwargs)
-        self.write(')')
-
-    def visit_Keyword(self, node, frame):
-        self.write(node.key + '=')
-        self.visit(node.value, frame)
-
-    # -- Unused nodes for extensions
-
-    def visit_MarkSafe(self, node, frame):
-        self.write('Markup(')
-        self.visit(node.expr, frame)
-        self.write(')')
-
-    def visit_MarkSafeIfAutoescape(self, node, frame):
-        self.write('(context.eval_ctx.autoescape and Markup or identity)(')
-        self.visit(node.expr, frame)
-        self.write(')')
-
-    def visit_EnvironmentAttribute(self, node, frame):
-        self.write('environment.' + node.name)
-
-    def visit_ExtensionAttribute(self, node, frame):
-        self.write('environment.extensions[%r].%s' % (node.identifier, node.name))
-
-    def visit_ImportedName(self, node, frame):
-        self.write(self.import_aliases[node.importname])
-
-    def visit_InternalName(self, node, frame):
-        self.write(node.name)
-
-    def visit_ContextReference(self, node, frame):
-        self.write('context')
-
-    def visit_Continue(self, node, frame):
-        self.writeline('continue', node)
-
-    def visit_Break(self, node, frame):
-        self.writeline('break', node)
-
-    def visit_Scope(self, node, frame):
-        scope_frame = frame.inner()
-        scope_frame.inspect(node.iter_child_nodes())
-        aliases = self.push_scope(scope_frame)
-        self.pull_locals(scope_frame)
-        self.blockvisit(node.body, scope_frame)
-        self.pop_scope(aliases, scope_frame)
-
-    def visit_EvalContextModifier(self, node, frame):
-        for keyword in node.options:
-            self.writeline('context.eval_ctx.%s = ' % keyword.key)
-            self.visit(keyword.value, frame)
-            try:
-                val = keyword.value.as_const(frame.eval_ctx)
-            except nodes.Impossible:
-                frame.eval_ctx.volatile = True
-            else:
-                setattr(frame.eval_ctx, keyword.key, val)
-
-    def visit_ScopedEvalContextModifier(self, node, frame):
-        old_ctx_name = self.temporary_identifier()
-        safed_ctx = frame.eval_ctx.save()
-        self.writeline('%s = context.eval_ctx.save()' % old_ctx_name)
-        self.visit_EvalContextModifier(node, frame)
-        for child in node.body:
-            self.visit(child, frame)
-        frame.eval_ctx.revert(safed_ctx)
-        self.writeline('context.eval_ctx.revert(%s)' % old_ctx_name)
diff --git a/third_party/jinja2/constants.py b/third_party/jinja2/constants.py
deleted file mode 100644
index cab203c..0000000
--- a/third_party/jinja2/constants.py
+++ /dev/null
@@ -1,32 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    jinja.constants
-    ~~~~~~~~~~~~~~~
-
-    Various constants.
-
-    :copyright: (c) 2010 by the Jinja Team.
-    :license: BSD, see LICENSE for more details.
-"""
-
-
-#: list of lorem ipsum words used by the lipsum() helper function
-LOREM_IPSUM_WORDS = u'''\
-a ac accumsan ad adipiscing aenean aliquam aliquet amet ante aptent arcu at
-auctor augue bibendum blandit class commodo condimentum congue consectetuer
-consequat conubia convallis cras cubilia cum curabitur curae cursus dapibus
-diam dictum dictumst dignissim dis dolor donec dui duis egestas eget eleifend
-elementum elit enim erat eros est et etiam eu euismod facilisi facilisis fames
-faucibus felis fermentum feugiat fringilla fusce gravida habitant habitasse hac
-hendrerit hymenaeos iaculis id imperdiet in inceptos integer interdum ipsum
-justo lacinia lacus laoreet lectus leo libero ligula litora lobortis lorem
-luctus maecenas magna magnis malesuada massa mattis mauris metus mi molestie
-mollis montes morbi mus nam nascetur natoque nec neque netus nibh nisi nisl non
-nonummy nostra nulla nullam nunc odio orci ornare parturient pede pellentesque
-penatibus per pharetra phasellus placerat platea porta porttitor posuere
-potenti praesent pretium primis proin pulvinar purus quam quis quisque rhoncus
-ridiculus risus rutrum sagittis sapien scelerisque sed sem semper senectus sit
-sociis sociosqu sodales sollicitudin suscipit suspendisse taciti tellus tempor
-tempus tincidunt torquent tortor tristique turpis ullamcorper ultrices
-ultricies urna ut varius vehicula vel velit venenatis vestibulum vitae vivamus
-viverra volutpat vulputate'''
diff --git a/third_party/jinja2/debug.py b/third_party/jinja2/debug.py
deleted file mode 100644
index 3252748..0000000
--- a/third_party/jinja2/debug.py
+++ /dev/null
@@ -1,350 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    jinja2.debug
-    ~~~~~~~~~~~~
-
-    Implements the debug interface for Jinja.  This module does some pretty
-    ugly stuff with the Python traceback system in order to achieve tracebacks
-    with correct line numbers, locals and contents.
-
-    :copyright: (c) 2010 by the Jinja Team.
-    :license: BSD, see LICENSE for more details.
-"""
-import sys
-import traceback
-from types import TracebackType, CodeType
-from jinja2.utils import missing, internal_code
-from jinja2.exceptions import TemplateSyntaxError
-from jinja2._compat import iteritems, reraise, PY2
-
-# on pypy we can take advantage of transparent proxies
-try:
-    from __pypy__ import tproxy
-except ImportError:
-    tproxy = None
-
-
-# how does the raise helper look like?
-try:
-    exec("raise TypeError, 'foo'")
-except SyntaxError:
-    raise_helper = 'raise __jinja_exception__[1]'
-except TypeError:
-    raise_helper = 'raise __jinja_exception__[0], __jinja_exception__[1]'
-
-
-class TracebackFrameProxy(object):
-    """Proxies a traceback frame."""
-
-    def __init__(self, tb):
-        self.tb = tb
-        self._tb_next = None
-
-    @property
-    def tb_next(self):
-        return self._tb_next
-
-    def set_next(self, next):
-        if tb_set_next is not None:
-            try:
-                tb_set_next(self.tb, next and next.tb or None)
-            except Exception:
-                # this function can fail due to all the hackery it does
-                # on various python implementations.  We just catch errors
-                # down and ignore them if necessary.
-                pass
-        self._tb_next = next
-
-    @property
-    def is_jinja_frame(self):
-        return '__jinja_template__' in self.tb.tb_frame.f_globals
-
-    def __getattr__(self, name):
-        return getattr(self.tb, name)
-
-
-def make_frame_proxy(frame):
-    proxy = TracebackFrameProxy(frame)
-    if tproxy is None:
-        return proxy
-    def operation_handler(operation, *args, **kwargs):
-        if operation in ('__getattribute__', '__getattr__'):
-            return getattr(proxy, args[0])
-        elif operation == '__setattr__':
-            proxy.__setattr__(*args, **kwargs)
-        else:
-            return getattr(proxy, operation)(*args, **kwargs)
-    return tproxy(TracebackType, operation_handler)
-
-
-class ProcessedTraceback(object):
-    """Holds a Jinja preprocessed traceback for printing or reraising."""
-
-    def __init__(self, exc_type, exc_value, frames):
-        assert frames, 'no frames for this traceback?'
-        self.exc_type = exc_type
-        self.exc_value = exc_value
-        self.frames = frames
-
-        # newly concatenate the frames (which are proxies)
-        prev_tb = None
-        for tb in self.frames:
-            if prev_tb is not None:
-                prev_tb.set_next(tb)
-            prev_tb = tb
-        prev_tb.set_next(None)
-
-    def render_as_text(self, limit=None):
-        """Return a string with the traceback."""
-        lines = traceback.format_exception(self.exc_type, self.exc_value,
-                                           self.frames[0], limit=limit)
-        return ''.join(lines).rstrip()
-
-    def render_as_html(self, full=False):
-        """Return a unicode string with the traceback as rendered HTML."""
-        from jinja2.debugrenderer import render_traceback
-        return u'%s\n\n<!--\n%s\n-->' % (
-            render_traceback(self, full=full),
-            self.render_as_text().decode('utf-8', 'replace')
-        )
-
-    @property
-    def is_template_syntax_error(self):
-        """`True` if this is a template syntax error."""
-        return isinstance(self.exc_value, TemplateSyntaxError)
-
-    @property
-    def exc_info(self):
-        """Exception info tuple with a proxy around the frame objects."""
-        return self.exc_type, self.exc_value, self.frames[0]
-
-    @property
-    def standard_exc_info(self):
-        """Standard python exc_info for re-raising"""
-        tb = self.frames[0]
-        # the frame will be an actual traceback (or transparent proxy) if
-        # we are on pypy or a python implementation with support for tproxy
-        if type(tb) is not TracebackType:
-            tb = tb.tb
-        return self.exc_type, self.exc_value, tb
-
-
-def make_traceback(exc_info, source_hint=None):
-    """Creates a processed traceback object from the exc_info."""
-    exc_type, exc_value, tb = exc_info
-    if isinstance(exc_value, TemplateSyntaxError):
-        exc_info = translate_syntax_error(exc_value, source_hint)
-        initial_skip = 0
-    else:
-        initial_skip = 1
-    return translate_exception(exc_info, initial_skip)
-
-
-def translate_syntax_error(error, source=None):
-    """Rewrites a syntax error to please traceback systems."""
-    error.source = source
-    error.translated = True
-    exc_info = (error.__class__, error, None)
-    filename = error.filename
-    if filename is None:
-        filename = '<unknown>'
-    return fake_exc_info(exc_info, filename, error.lineno)
-
-
-def translate_exception(exc_info, initial_skip=0):
-    """If passed an exc_info it will automatically rewrite the exceptions
-    all the way down to the correct line numbers and frames.
-    """
-    tb = exc_info[2]
-    frames = []
-
-    # skip some internal frames if wanted
-    for x in range(initial_skip):
-        if tb is not None:
-            tb = tb.tb_next
-    initial_tb = tb
-
-    while tb is not None:
-        # skip frames decorated with @internalcode.  These are internal
-        # calls we can't avoid and that are useless in template debugging
-        # output.
-        if tb.tb_frame.f_code in internal_code:
-            tb = tb.tb_next
-            continue
-
-        # save a reference to the next frame if we override the current
-        # one with a faked one.
-        next = tb.tb_next
-
-        # fake template exceptions
-        template = tb.tb_frame.f_globals.get('__jinja_template__')
-        if template is not None:
-            lineno = template.get_corresponding_lineno(tb.tb_lineno)
-            tb = fake_exc_info(exc_info[:2] + (tb,), template.filename,
-                               lineno)[2]
-
-        frames.append(make_frame_proxy(tb))
-        tb = next
-
-    # if we don't have any exceptions in the frames left, we have to
-    # reraise it unchanged.
-    # XXX: can we backup here?  when could this happen?
-    if not frames:
-        reraise(exc_info[0], exc_info[1], exc_info[2])
-
-    return ProcessedTraceback(exc_info[0], exc_info[1], frames)
-
-
-def fake_exc_info(exc_info, filename, lineno):
-    """Helper for `translate_exception`."""
-    exc_type, exc_value, tb = exc_info
-
-    # figure the real context out
-    if tb is not None:
-        real_locals = tb.tb_frame.f_locals.copy()
-        ctx = real_locals.get('context')
-        if ctx:
-            locals = ctx.get_all()
-        else:
-            locals = {}
-        for name, value in iteritems(real_locals):
-            if name.startswith('l_') and value is not missing:
-                locals[name[2:]] = value
-
-        # if there is a local called __jinja_exception__, we get
-        # rid of it to not break the debug functionality.
-        locals.pop('__jinja_exception__', None)
-    else:
-        locals = {}
-
-    # assamble fake globals we need
-    globals = {
-        '__name__':             filename,
-        '__file__':             filename,
-        '__jinja_exception__':  exc_info[:2],
-
-        # we don't want to keep the reference to the template around
-        # to not cause circular dependencies, but we mark it as Jinja
-        # frame for the ProcessedTraceback
-        '__jinja_template__':   None
-    }
-
-    # and fake the exception
-    code = compile('\n' * (lineno - 1) + raise_helper, filename, 'exec')
-
-    # if it's possible, change the name of the code.  This won't work
-    # on some python environments such as google appengine
-    try:
-        if tb is None:
-            location = 'template'
-        else:
-            function = tb.tb_frame.f_code.co_name
-            if function == 'root':
-                location = 'top-level template code'
-            elif function.startswith('block_'):
-                location = 'block "%s"' % function[6:]
-            else:
-                location = 'template'
-
-        if PY2:
-            code = CodeType(0, code.co_nlocals, code.co_stacksize,
-                            code.co_flags, code.co_code, code.co_consts,
-                            code.co_names, code.co_varnames, filename,
-                            location, code.co_firstlineno,
-                            code.co_lnotab, (), ())
-        else:
-            code = CodeType(0, code.co_kwonlyargcount,
-                            code.co_nlocals, code.co_stacksize,
-                            code.co_flags, code.co_code, code.co_consts,
-                            code.co_names, code.co_varnames, filename,
-                            location, code.co_firstlineno,
-                            code.co_lnotab, (), ())
-    except Exception as e:
-        pass
-
-    # execute the code and catch the new traceback
-    try:
-        exec(code, globals, locals)
-    except:
-        exc_info = sys.exc_info()
-        new_tb = exc_info[2].tb_next
-
-    # return without this frame
-    return exc_info[:2] + (new_tb,)
-
-
-def _init_ugly_crap():
-    """This function implements a few ugly things so that we can patch the
-    traceback objects.  The function returned allows resetting `tb_next` on
-    any python traceback object.  Do not attempt to use this on non cpython
-    interpreters
-    """
-    import ctypes
-    from types import TracebackType
-
-    if PY2:
-        # figure out size of _Py_ssize_t for Python 2:
-        if hasattr(ctypes.pythonapi, 'Py_InitModule4_64'):
-            _Py_ssize_t = ctypes.c_int64
-        else:
-            _Py_ssize_t = ctypes.c_int
-    else:
-        # platform ssize_t on Python 3
-        _Py_ssize_t = ctypes.c_ssize_t
-
-    # regular python
-    class _PyObject(ctypes.Structure):
-        pass
-    _PyObject._fields_ = [
-        ('ob_refcnt', _Py_ssize_t),
-        ('ob_type', ctypes.POINTER(_PyObject))
-    ]
-
-    # python with trace
-    if hasattr(sys, 'getobjects'):
-        class _PyObject(ctypes.Structure):
-            pass
-        _PyObject._fields_ = [
-            ('_ob_next', ctypes.POINTER(_PyObject)),
-            ('_ob_prev', ctypes.POINTER(_PyObject)),
-            ('ob_refcnt', _Py_ssize_t),
-            ('ob_type', ctypes.POINTER(_PyObject))
-        ]
-
-    class _Traceback(_PyObject):
-        pass
-    _Traceback._fields_ = [
-        ('tb_next', ctypes.POINTER(_Traceback)),
-        ('tb_frame', ctypes.POINTER(_PyObject)),
-        ('tb_lasti', ctypes.c_int),
-        ('tb_lineno', ctypes.c_int)
-    ]
-
-    def tb_set_next(tb, next):
-        """Set the tb_next attribute of a traceback object."""
-        if not (isinstance(tb, TracebackType) and
-                (next is None or isinstance(next, TracebackType))):
-            raise TypeError('tb_set_next arguments must be traceback objects')
-        obj = _Traceback.from_address(id(tb))
-        if tb.tb_next is not None:
-            old = _Traceback.from_address(id(tb.tb_next))
-            old.ob_refcnt -= 1
-        if next is None:
-            obj.tb_next = ctypes.POINTER(_Traceback)()
-        else:
-            next = _Traceback.from_address(id(next))
-            next.ob_refcnt += 1
-            obj.tb_next = ctypes.pointer(next)
-
-    return tb_set_next
-
-
-# try to get a tb_set_next implementation if we don't have transparent
-# proxies.
-tb_set_next = None
-if tproxy is None:
-    try:
-        tb_set_next = _init_ugly_crap()
-    except:
-        pass
-    del _init_ugly_crap
diff --git a/third_party/jinja2/defaults.py b/third_party/jinja2/defaults.py
deleted file mode 100644
index 3717a72..0000000
--- a/third_party/jinja2/defaults.py
+++ /dev/null
@@ -1,43 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    jinja2.defaults
-    ~~~~~~~~~~~~~~~
-
-    Jinja default filters and tags.
-
-    :copyright: (c) 2010 by the Jinja Team.
-    :license: BSD, see LICENSE for more details.
-"""
-from jinja2._compat import range_type
-from jinja2.utils import generate_lorem_ipsum, Cycler, Joiner
-
-
-# defaults for the parser / lexer
-BLOCK_START_STRING = '{%'
-BLOCK_END_STRING = '%}'
-VARIABLE_START_STRING = '{{'
-VARIABLE_END_STRING = '}}'
-COMMENT_START_STRING = '{#'
-COMMENT_END_STRING = '#}'
-LINE_STATEMENT_PREFIX = None
-LINE_COMMENT_PREFIX = None
-TRIM_BLOCKS = False
-LSTRIP_BLOCKS = False
-NEWLINE_SEQUENCE = '\n'
-KEEP_TRAILING_NEWLINE = False
-
-
-# default filters, tests and namespace
-from jinja2.filters import FILTERS as DEFAULT_FILTERS
-from jinja2.tests import TESTS as DEFAULT_TESTS
-DEFAULT_NAMESPACE = {
-    'range':        range_type,
-    'dict':         dict,
-    'lipsum':       generate_lorem_ipsum,
-    'cycler':       Cycler,
-    'joiner':       Joiner
-}
-
-
-# export all constants
-__all__ = tuple(x for x in locals().keys() if x.isupper())
diff --git a/third_party/jinja2/environment.py b/third_party/jinja2/environment.py
deleted file mode 100644
index 8b2572b..0000000
--- a/third_party/jinja2/environment.py
+++ /dev/null
@@ -1,1213 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    jinja2.environment
-    ~~~~~~~~~~~~~~~~~~
-
-    Provides a class that holds runtime and parsing time options.
-
-    :copyright: (c) 2010 by the Jinja Team.
-    :license: BSD, see LICENSE for more details.
-"""
-import os
-import sys
-from jinja2 import nodes
-from jinja2.defaults import BLOCK_START_STRING, \
-     BLOCK_END_STRING, VARIABLE_START_STRING, VARIABLE_END_STRING, \
-     COMMENT_START_STRING, COMMENT_END_STRING, LINE_STATEMENT_PREFIX, \
-     LINE_COMMENT_PREFIX, TRIM_BLOCKS, NEWLINE_SEQUENCE, \
-     DEFAULT_FILTERS, DEFAULT_TESTS, DEFAULT_NAMESPACE, \
-     KEEP_TRAILING_NEWLINE, LSTRIP_BLOCKS
-from jinja2.lexer import get_lexer, TokenStream
-from jinja2.parser import Parser
-from jinja2.nodes import EvalContext
-from jinja2.optimizer import optimize
-from jinja2.compiler import generate, CodeGenerator
-from jinja2.runtime import Undefined, new_context, Context
-from jinja2.exceptions import TemplateSyntaxError, TemplateNotFound, \
-     TemplatesNotFound, TemplateRuntimeError
-from jinja2.utils import import_string, LRUCache, Markup, missing, \
-     concat, consume, internalcode
-from jinja2._compat import imap, ifilter, string_types, iteritems, \
-     text_type, reraise, implements_iterator, implements_to_string, \
-     get_next, encode_filename, PY2, PYPY
-from functools import reduce
-
-
-# for direct template usage we have up to ten living environments
-_spontaneous_environments = LRUCache(10)
-
-# the function to create jinja traceback objects.  This is dynamically
-# imported on the first exception in the exception handler.
-_make_traceback = None
-
-
-def get_spontaneous_environment(*args):
-    """Return a new spontaneous environment.  A spontaneous environment is an
-    unnamed and unaccessible (in theory) environment that is used for
-    templates generated from a string and not from the file system.
-    """
-    try:
-        env = _spontaneous_environments.get(args)
-    except TypeError:
-        return Environment(*args)
-    if env is not None:
-        return env
-    _spontaneous_environments[args] = env = Environment(*args)
-    env.shared = True
-    return env
-
-
-def create_cache(size):
-    """Return the cache class for the given size."""
-    if size == 0:
-        return None
-    if size < 0:
-        return {}
-    return LRUCache(size)
-
-
-def copy_cache(cache):
-    """Create an empty copy of the given cache."""
-    if cache is None:
-        return None
-    elif type(cache) is dict:
-        return {}
-    return LRUCache(cache.capacity)
-
-
-def load_extensions(environment, extensions):
-    """Load the extensions from the list and bind it to the environment.
-    Returns a dict of instantiated environments.
-    """
-    result = {}
-    for extension in extensions:
-        if isinstance(extension, string_types):
-            extension = import_string(extension)
-        result[extension.identifier] = extension(environment)
-    return result
-
-
-def _environment_sanity_check(environment):
-    """Perform a sanity check on the environment."""
-    assert issubclass(environment.undefined, Undefined), 'undefined must ' \
-        'be a subclass of undefined because filters depend on it.'
-    assert environment.block_start_string != \
-        environment.variable_start_string != \
-        environment.comment_start_string, 'block, variable and comment ' \
-        'start strings must be different'
-    assert environment.newline_sequence in ('\r', '\r\n', '\n'), \
-        'newline_sequence set to unknown line ending string.'
-    return environment
-
-
-class Environment(object):
-    r"""The core component of Jinja is the `Environment`.  It contains
-    important shared variables like configuration, filters, tests,
-    globals and others.  Instances of this class may be modified if
-    they are not shared and if no template was loaded so far.
-    Modifications on environments after the first template was loaded
-    will lead to surprising effects and undefined behavior.
-
-    Here are the possible initialization parameters:
-
-        `block_start_string`
-            The string marking the beginning of a block.  Defaults to ``'{%'``.
-
-        `block_end_string`
-            The string marking the end of a block.  Defaults to ``'%}'``.
-
-        `variable_start_string`
-            The string marking the beginning of a print statement.
-            Defaults to ``'{{'``.
-
-        `variable_end_string`
-            The string marking the end of a print statement.  Defaults to
-            ``'}}'``.
-
-        `comment_start_string`
-            The string marking the beginning of a comment.  Defaults to ``'{#'``.
-
-        `comment_end_string`
-            The string marking the end of a comment.  Defaults to ``'#}'``.
-
-        `line_statement_prefix`
-            If given and a string, this will be used as prefix for line based
-            statements.  See also :ref:`line-statements`.
-
-        `line_comment_prefix`
-            If given and a string, this will be used as prefix for line based
-            comments.  See also :ref:`line-statements`.
-
-            .. versionadded:: 2.2
-
-        `trim_blocks`
-            If this is set to ``True`` the first newline after a block is
-            removed (block, not variable tag!).  Defaults to `False`.
-
-        `lstrip_blocks`
-            If this is set to ``True`` leading spaces and tabs are stripped
-            from the start of a line to a block.  Defaults to `False`.
-
-        `newline_sequence`
-            The sequence that starts a newline.  Must be one of ``'\r'``,
-            ``'\n'`` or ``'\r\n'``.  The default is ``'\n'`` which is a
-            useful default for Linux and OS X systems as well as web
-            applications.
-
-        `keep_trailing_newline`
-            Preserve the trailing newline when rendering templates.
-            The default is ``False``, which causes a single newline,
-            if present, to be stripped from the end of the template.
-
-            .. versionadded:: 2.7
-
-        `extensions`
-            List of Jinja extensions to use.  This can either be import paths
-            as strings or extension classes.  For more information have a
-            look at :ref:`the extensions documentation <jinja-extensions>`.
-
-        `optimized`
-            should the optimizer be enabled?  Default is `True`.
-
-        `undefined`
-            :class:`Undefined` or a subclass of it that is used to represent
-            undefined values in the template.
-
-        `finalize`
-            A callable that can be used to process the result of a variable
-            expression before it is output.  For example one can convert
-            `None` implicitly into an empty string here.
-
-        `autoescape`
-            If set to true the XML/HTML autoescaping feature is enabled by
-            default.  For more details about autoescaping see
-            :class:`~jinja2.utils.Markup`.  As of Jinja 2.4 this can also
-            be a callable that is passed the template name and has to
-            return `True` or `False` depending on autoescape should be
-            enabled by default.
-
-            .. versionchanged:: 2.4
-               `autoescape` can now be a function
-
-        `loader`
-            The template loader for this environment.
-
-        `cache_size`
-            The size of the cache.  Per default this is ``400`` which means
-            that if more than 400 templates are loaded the loader will clean
-            out the least recently used template.  If the cache size is set to
-            ``0`` templates are recompiled all the time, if the cache size is
-            ``-1`` the cache will not be cleaned.
-
-            .. versionchanged:: 2.8
-               The cache size was increased to 400 from a low 50.
-
-        `auto_reload`
-            Some loaders load templates from locations where the template
-            sources may change (ie: file system or database).  If
-            `auto_reload` is set to `True` (default) every time a template is
-            requested the loader checks if the source changed and if yes, it
-            will reload the template.  For higher performance it's possible to
-            disable that.
-
-        `bytecode_cache`
-            If set to a bytecode cache object, this object will provide a
-            cache for the internal Jinja bytecode so that templates don't
-            have to be parsed if they were not changed.
-
-            See :ref:`bytecode-cache` for more information.
-    """
-
-    #: if this environment is sandboxed.  Modifying this variable won't make
-    #: the environment sandboxed though.  For a real sandboxed environment
-    #: have a look at jinja2.sandbox.  This flag alone controls the code
-    #: generation by the compiler.
-    sandboxed = False
-
-    #: True if the environment is just an overlay
-    overlayed = False
-
-    #: the environment this environment is linked to if it is an overlay
-    linked_to = None
-
-    #: shared environments have this set to `True`.  A shared environment
-    #: must not be modified
-    shared = False
-
-    #: these are currently EXPERIMENTAL undocumented features.
-    exception_handler = None
-    exception_formatter = None
-
-    #: the class that is used for code generation.  See
-    #: :class:`~jinja2.compiler.CodeGenerator` for more information.
-    code_generator_class = CodeGenerator
-
-    #: the context class thatis used for templates.  See
-    #: :class:`~jinja2.runtime.Context` for more information.
-    context_class = Context
-
-    def __init__(self,
-                 block_start_string=BLOCK_START_STRING,
-                 block_end_string=BLOCK_END_STRING,
-                 variable_start_string=VARIABLE_START_STRING,
-                 variable_end_string=VARIABLE_END_STRING,
-                 comment_start_string=COMMENT_START_STRING,
-                 comment_end_string=COMMENT_END_STRING,
-                 line_statement_prefix=LINE_STATEMENT_PREFIX,
-                 line_comment_prefix=LINE_COMMENT_PREFIX,
-                 trim_blocks=TRIM_BLOCKS,
-                 lstrip_blocks=LSTRIP_BLOCKS,
-                 newline_sequence=NEWLINE_SEQUENCE,
-                 keep_trailing_newline=KEEP_TRAILING_NEWLINE,
-                 extensions=(),
-                 optimized=True,
-                 undefined=Undefined,
-                 finalize=None,
-                 autoescape=False,
-                 loader=None,
-                 cache_size=400,
-                 auto_reload=True,
-                 bytecode_cache=None):
-        # !!Important notice!!
-        #   The constructor accepts quite a few arguments that should be
-        #   passed by keyword rather than position.  However it's important to
-        #   not change the order of arguments because it's used at least
-        #   internally in those cases:
-        #       -   spontaneous environments (i18n extension and Template)
-        #       -   unittests
-        #   If parameter changes are required only add parameters at the end
-        #   and don't change the arguments (or the defaults!) of the arguments
-        #   existing already.
-
-        # lexer / parser information
-        self.block_start_string = block_start_string
-        self.block_end_string = block_end_string
-        self.variable_start_string = variable_start_string
-        self.variable_end_string = variable_end_string
-        self.comment_start_string = comment_start_string
-        self.comment_end_string = comment_end_string
-        self.line_statement_prefix = line_statement_prefix
-        self.line_comment_prefix = line_comment_prefix
-        self.trim_blocks = trim_blocks
-        self.lstrip_blocks = lstrip_blocks
-        self.newline_sequence = newline_sequence
-        self.keep_trailing_newline = keep_trailing_newline
-
-        # runtime information
-        self.undefined = undefined
-        self.optimized = optimized
-        self.finalize = finalize
-        self.autoescape = autoescape
-
-        # defaults
-        self.filters = DEFAULT_FILTERS.copy()
-        self.tests = DEFAULT_TESTS.copy()
-        self.globals = DEFAULT_NAMESPACE.copy()
-
-        # set the loader provided
-        self.loader = loader
-        self.cache = create_cache(cache_size)
-        self.bytecode_cache = bytecode_cache
-        self.auto_reload = auto_reload
-
-        # load extensions
-        self.extensions = load_extensions(self, extensions)
-
-        _environment_sanity_check(self)
-
-    def add_extension(self, extension):
-        """Adds an extension after the environment was created.
-
-        .. versionadded:: 2.5
-        """
-        self.extensions.update(load_extensions(self, [extension]))
-
-    def extend(self, **attributes):
-        """Add the items to the instance of the environment if they do not exist
-        yet.  This is used by :ref:`extensions <writing-extensions>` to register
-        callbacks and configuration values without breaking inheritance.
-        """
-        for key, value in iteritems(attributes):
-            if not hasattr(self, key):
-                setattr(self, key, value)
-
-    def overlay(self, block_start_string=missing, block_end_string=missing,
-                variable_start_string=missing, variable_end_string=missing,
-                comment_start_string=missing, comment_end_string=missing,
-                line_statement_prefix=missing, line_comment_prefix=missing,
-                trim_blocks=missing, lstrip_blocks=missing,
-                extensions=missing, optimized=missing,
-                undefined=missing, finalize=missing, autoescape=missing,
-                loader=missing, cache_size=missing, auto_reload=missing,
-                bytecode_cache=missing):
-        """Create a new overlay environment that shares all the data with the
-        current environment except for cache and the overridden attributes.
-        Extensions cannot be removed for an overlayed environment.  An overlayed
-        environment automatically gets all the extensions of the environment it
-        is linked to plus optional extra extensions.
-
-        Creating overlays should happen after the initial environment was set
-        up completely.  Not all attributes are truly linked, some are just
-        copied over so modifications on the original environment may not shine
-        through.
-        """
-        args = dict(locals())
-        del args['self'], args['cache_size'], args['extensions']
-
-        rv = object.__new__(self.__class__)
-        rv.__dict__.update(self.__dict__)
-        rv.overlayed = True
-        rv.linked_to = self
-
-        for key, value in iteritems(args):
-            if value is not missing:
-                setattr(rv, key, value)
-
-        if cache_size is not missing:
-            rv.cache = create_cache(cache_size)
-        else:
-            rv.cache = copy_cache(self.cache)
-
-        rv.extensions = {}
-        for key, value in iteritems(self.extensions):
-            rv.extensions[key] = value.bind(rv)
-        if extensions is not missing:
-            rv.extensions.update(load_extensions(rv, extensions))
-
-        return _environment_sanity_check(rv)
-
-    lexer = property(get_lexer, doc="The lexer for this environment.")
-
-    def iter_extensions(self):
-        """Iterates over the extensions by priority."""
-        return iter(sorted(self.extensions.values(),
-                           key=lambda x: x.priority))
-
-    def getitem(self, obj, argument):
-        """Get an item or attribute of an object but prefer the item."""
-        try:
-            return obj[argument]
-        except (TypeError, LookupError):
-            if isinstance(argument, string_types):
-                try:
-                    attr = str(argument)
-                except Exception:
-                    pass
-                else:
-                    try:
-                        return getattr(obj, attr)
-                    except AttributeError:
-                        pass
-            return self.undefined(obj=obj, name=argument)
-
-    def getattr(self, obj, attribute):
-        """Get an item or attribute of an object but prefer the attribute.
-        Unlike :meth:`getitem` the attribute *must* be a bytestring.
-        """
-        try:
-            return getattr(obj, attribute)
-        except AttributeError:
-            pass
-        try:
-            return obj[attribute]
-        except (TypeError, LookupError, AttributeError):
-            return self.undefined(obj=obj, name=attribute)
-
-    def call_filter(self, name, value, args=None, kwargs=None,
-                    context=None, eval_ctx=None):
-        """Invokes a filter on a value the same way the compiler does it.
-
-        .. versionadded:: 2.7
-        """
-        func = self.filters.get(name)
-        if func is None:
-            raise TemplateRuntimeError('no filter named %r' % name)
-        args = [value] + list(args or ())
-        if getattr(func, 'contextfilter', False):
-            if context is None:
-                raise TemplateRuntimeError('Attempted to invoke context '
-                                           'filter without context')
-            args.insert(0, context)
-        elif getattr(func, 'evalcontextfilter', False):
-            if eval_ctx is None:
-                if context is not None:
-                    eval_ctx = context.eval_ctx
-                else:
-                    eval_ctx = EvalContext(self)
-            args.insert(0, eval_ctx)
-        elif getattr(func, 'environmentfilter', False):
-            args.insert(0, self)
-        return func(*args, **(kwargs or {}))
-
-    def call_test(self, name, value, args=None, kwargs=None):
-        """Invokes a test on a value the same way the compiler does it.
-
-        .. versionadded:: 2.7
-        """
-        func = self.tests.get(name)
-        if func is None:
-            raise TemplateRuntimeError('no test named %r' % name)
-        return func(value, *(args or ()), **(kwargs or {}))
-
-    @internalcode
-    def parse(self, source, name=None, filename=None):
-        """Parse the sourcecode and return the abstract syntax tree.  This
-        tree of nodes is used by the compiler to convert the template into
-        executable source- or bytecode.  This is useful for debugging or to
-        extract information from templates.
-
-        If you are :ref:`developing Jinja2 extensions <writing-extensions>`
-        this gives you a good overview of the node tree generated.
-        """
-        try:
-            return self._parse(source, name, filename)
-        except TemplateSyntaxError:
-            exc_info = sys.exc_info()
-        self.handle_exception(exc_info, source_hint=source)
-
-    def _parse(self, source, name, filename):
-        """Internal parsing function used by `parse` and `compile`."""
-        return Parser(self, source, name, encode_filename(filename)).parse()
-
-    def lex(self, source, name=None, filename=None):
-        """Lex the given sourcecode and return a generator that yields
-        tokens as tuples in the form ``(lineno, token_type, value)``.
-        This can be useful for :ref:`extension development <writing-extensions>`
-        and debugging templates.
-
-        This does not perform preprocessing.  If you want the preprocessing
-        of the extensions to be applied you have to filter source through
-        the :meth:`preprocess` method.
-        """
-        source = text_type(source)
-        try:
-            return self.lexer.tokeniter(source, name, filename)
-        except TemplateSyntaxError:
-            exc_info = sys.exc_info()
-        self.handle_exception(exc_info, source_hint=source)
-
-    def preprocess(self, source, name=None, filename=None):
-        """Preprocesses the source with all extensions.  This is automatically
-        called for all parsing and compiling methods but *not* for :meth:`lex`
-        because there you usually only want the actual source tokenized.
-        """
-        return reduce(lambda s, e: e.preprocess(s, name, filename),
-                      self.iter_extensions(), text_type(source))
-
-    def _tokenize(self, source, name, filename=None, state=None):
-        """Called by the parser to do the preprocessing and filtering
-        for all the extensions.  Returns a :class:`~jinja2.lexer.TokenStream`.
-        """
-        source = self.preprocess(source, name, filename)
-        stream = self.lexer.tokenize(source, name, filename, state)
-        for ext in self.iter_extensions():
-            stream = ext.filter_stream(stream)
-            if not isinstance(stream, TokenStream):
-                stream = TokenStream(stream, name, filename)
-        return stream
-
-    def _generate(self, source, name, filename, defer_init=False):
-        """Internal hook that can be overridden to hook a different generate
-        method in.
-
-        .. versionadded:: 2.5
-        """
-        return generate(source, self, name, filename, defer_init=defer_init)
-
-    def _compile(self, source, filename):
-        """Internal hook that can be overridden to hook a different compile
-        method in.
-
-        .. versionadded:: 2.5
-        """
-        return compile(source, filename, 'exec')
-
-    @internalcode
-    def compile(self, source, name=None, filename=None, raw=False,
-                defer_init=False):
-        """Compile a node or template source code.  The `name` parameter is
-        the load name of the template after it was joined using
-        :meth:`join_path` if necessary, not the filename on the file system.
-        the `filename` parameter is the estimated filename of the template on
-        the file system.  If the template came from a database or memory this
-        can be omitted.
-
-        The return value of this method is a python code object.  If the `raw`
-        parameter is `True` the return value will be a string with python
-        code equivalent to the bytecode returned otherwise.  This method is
-        mainly used internally.
-
-        `defer_init` is use internally to aid the module code generator.  This
-        causes the generated code to be able to import without the global
-        environment variable to be set.
-
-        .. versionadded:: 2.4
-           `defer_init` parameter added.
-        """
-        source_hint = None
-        try:
-            if isinstance(source, string_types):
-                source_hint = source
-                source = self._parse(source, name, filename)
-            if self.optimized:
-                source = optimize(source, self)
-            source = self._generate(source, name, filename,
-                                    defer_init=defer_init)
-            if raw:
-                return source
-            if filename is None:
-                filename = '<template>'
-            else:
-                filename = encode_filename(filename)
-            return self._compile(source, filename)
-        except TemplateSyntaxError:
-            exc_info = sys.exc_info()
-        self.handle_exception(exc_info, source_hint=source_hint)
-
-    def compile_expression(self, source, undefined_to_none=True):
-        """A handy helper method that returns a callable that accepts keyword
-        arguments that appear as variables in the expression.  If called it
-        returns the result of the expression.
-
-        This is useful if applications want to use the same rules as Jinja
-        in template "configuration files" or similar situations.
-
-        Example usage:
-
-        >>> env = Environment()
-        >>> expr = env.compile_expression('foo == 42')
-        >>> expr(foo=23)
-        False
-        >>> expr(foo=42)
-        True
-
-        Per default the return value is converted to `None` if the
-        expression returns an undefined value.  This can be changed
-        by setting `undefined_to_none` to `False`.
-
-        >>> env.compile_expression('var')() is None
-        True
-        >>> env.compile_expression('var', undefined_to_none=False)()
-        Undefined
-
-        .. versionadded:: 2.1
-        """
-        parser = Parser(self, source, state='variable')
-        exc_info = None
-        try:
-            expr = parser.parse_expression()
-            if not parser.stream.eos:
-                raise TemplateSyntaxError('chunk after expression',
-                                          parser.stream.current.lineno,
-                                          None, None)
-            expr.set_environment(self)
-        except TemplateSyntaxError:
-            exc_info = sys.exc_info()
-        if exc_info is not None:
-            self.handle_exception(exc_info, source_hint=source)
-        body = [nodes.Assign(nodes.Name('result', 'store'), expr, lineno=1)]
-        template = self.from_string(nodes.Template(body, lineno=1))
-        return TemplateExpression(template, undefined_to_none)
-
-    def compile_templates(self, target, extensions=None, filter_func=None,
-                          zip='deflated', log_function=None,
-                          ignore_errors=True, py_compile=False):
-        """Finds all the templates the loader can find, compiles them
-        and stores them in `target`.  If `zip` is `None`, instead of in a
-        zipfile, the templates will be stored in a directory.
-        By default a deflate zip algorithm is used. To switch to
-        the stored algorithm, `zip` can be set to ``'stored'``.
-
-        `extensions` and `filter_func` are passed to :meth:`list_templates`.
-        Each template returned will be compiled to the target folder or
-        zipfile.
-
-        By default template compilation errors are ignored.  In case a
-        log function is provided, errors are logged.  If you want template
-        syntax errors to abort the compilation you can set `ignore_errors`
-        to `False` and you will get an exception on syntax errors.
-
-        If `py_compile` is set to `True` .pyc files will be written to the
-        target instead of standard .py files.  This flag does not do anything
-        on pypy and Python 3 where pyc files are not picked up by itself and
-        don't give much benefit.
-
-        .. versionadded:: 2.4
-        """
-        from jinja2.loaders import ModuleLoader
-
-        if log_function is None:
-            log_function = lambda x: None
-
-        if py_compile:
-            if not PY2 or PYPY:
-                from warnings import warn
-                warn(Warning('py_compile has no effect on pypy or Python 3'))
-                py_compile = False
-            else:
-                import imp
-                import marshal
-                py_header = imp.get_magic() + \
-                    u'\xff\xff\xff\xff'.encode('iso-8859-15')
-
-                # Python 3.3 added a source filesize to the header
-                if sys.version_info >= (3, 3):
-                    py_header += u'\x00\x00\x00\x00'.encode('iso-8859-15')
-
-        def write_file(filename, data, mode):
-            if zip:
-                info = ZipInfo(filename)
-                info.external_attr = 0o755 << 16
-                zip_file.writestr(info, data)
-            else:
-                f = open(os.path.join(target, filename), mode)
-                try:
-                    f.write(data)
-                finally:
-                    f.close()
-
-        if zip is not None:
-            from zipfile import ZipFile, ZipInfo, ZIP_DEFLATED, ZIP_STORED
-            zip_file = ZipFile(target, 'w', dict(deflated=ZIP_DEFLATED,
-                                                 stored=ZIP_STORED)[zip])
-            log_function('Compiling into Zip archive "%s"' % target)
-        else:
-            if not os.path.isdir(target):
-                os.makedirs(target)
-            log_function('Compiling into folder "%s"' % target)
-
-        try:
-            for name in self.list_templates(extensions, filter_func):
-                source, filename, _ = self.loader.get_source(self, name)
-                try:
-                    code = self.compile(source, name, filename, True, True)
-                except TemplateSyntaxError as e:
-                    if not ignore_errors:
-                        raise
-                    log_function('Could not compile "%s": %s' % (name, e))
-                    continue
-
-                filename = ModuleLoader.get_module_filename(name)
-
-                if py_compile:
-                    c = self._compile(code, encode_filename(filename))
-                    write_file(filename + 'c', py_header +
-                               marshal.dumps(c), 'wb')
-                    log_function('Byte-compiled "%s" as %s' %
-                                 (name, filename + 'c'))
-                else:
-                    write_file(filename, code, 'w')
-                    log_function('Compiled "%s" as %s' % (name, filename))
-        finally:
-            if zip:
-                zip_file.close()
-
-        log_function('Finished compiling templates')
-
-    def list_templates(self, extensions=None, filter_func=None):
-        """Returns a list of templates for this environment.  This requires
-        that the loader supports the loader's
-        :meth:`~BaseLoader.list_templates` method.
-
-        If there are other files in the template folder besides the
-        actual templates, the returned list can be filtered.  There are two
-        ways: either `extensions` is set to a list of file extensions for
-        templates, or a `filter_func` can be provided which is a callable that
-        is passed a template name and should return `True` if it should end up
-        in the result list.
-
-        If the loader does not support that, a :exc:`TypeError` is raised.
-
-        .. versionadded:: 2.4
-        """
-        x = self.loader.list_templates()
-        if extensions is not None:
-            if filter_func is not None:
-                raise TypeError('either extensions or filter_func '
-                                'can be passed, but not both')
-            filter_func = lambda x: '.' in x and \
-                                    x.rsplit('.', 1)[1] in extensions
-        if filter_func is not None:
-            x = list(ifilter(filter_func, x))
-        return x
-
-    def handle_exception(self, exc_info=None, rendered=False, source_hint=None):
-        """Exception handling helper.  This is used internally to either raise
-        rewritten exceptions or return a rendered traceback for the template.
-        """
-        global _make_traceback
-        if exc_info is None:
-            exc_info = sys.exc_info()
-
-        # the debugging module is imported when it's used for the first time.
-        # we're doing a lot of stuff there and for applications that do not
-        # get any exceptions in template rendering there is no need to load
-        # all of that.
-        if _make_traceback is None:
-            from jinja2.debug import make_traceback as _make_traceback
-        traceback = _make_traceback(exc_info, source_hint)
-        if rendered and self.exception_formatter is not None:
-            return self.exception_formatter(traceback)
-        if self.exception_handler is not None:
-            self.exception_handler(traceback)
-        exc_type, exc_value, tb = traceback.standard_exc_info
-        reraise(exc_type, exc_value, tb)
-
-    def join_path(self, template, parent):
-        """Join a template with the parent.  By default all the lookups are
-        relative to the loader root so this method returns the `template`
-        parameter unchanged, but if the paths should be relative to the
-        parent template, this function can be used to calculate the real
-        template name.
-
-        Subclasses may override this method and implement template path
-        joining here.
-        """
-        return template
-
-    @internalcode
-    def _load_template(self, name, globals):
-        if self.loader is None:
-            raise TypeError('no loader for this environment specified')
-        try:
-            # use abs path for cache key
-            cache_key = self.loader.get_source(self, name)[1]
-        except RuntimeError:
-            # if loader does not implement get_source()
-            cache_key = None
-        # if template is not file, use name for cache key
-        if cache_key is None:
-            cache_key = name
-        if self.cache is not None:
-            template = self.cache.get(cache_key)
-            if template is not None and (not self.auto_reload or
-                                         template.is_up_to_date):
-                return template
-        template = self.loader.load(self, name, globals)
-        if self.cache is not None:
-            self.cache[cache_key] = template
-        return template
-
-    @internalcode
-    def get_template(self, name, parent=None, globals=None):
-        """Load a template from the loader.  If a loader is configured this
-        method ask the loader for the template and returns a :class:`Template`.
-        If the `parent` parameter is not `None`, :meth:`join_path` is called
-        to get the real template name before loading.
-
-        The `globals` parameter can be used to provide template wide globals.
-        These variables are available in the context at render time.
-
-        If the template does not exist a :exc:`TemplateNotFound` exception is
-        raised.
-
-        .. versionchanged:: 2.4
-           If `name` is a :class:`Template` object it is returned from the
-           function unchanged.
-        """
-        if isinstance(name, Template):
-            return name
-        if parent is not None:
-            name = self.join_path(name, parent)
-        return self._load_template(name, self.make_globals(globals))
-
-    @internalcode
-    def select_template(self, names, parent=None, globals=None):
-        """Works like :meth:`get_template` but tries a number of templates
-        before it fails.  If it cannot find any of the templates, it will
-        raise a :exc:`TemplatesNotFound` exception.
-
-        .. versionadded:: 2.3
-
-        .. versionchanged:: 2.4
-           If `names` contains a :class:`Template` object it is returned
-           from the function unchanged.
-        """
-        if not names:
-            raise TemplatesNotFound(message=u'Tried to select from an empty list '
-                                            u'of templates.')
-        globals = self.make_globals(globals)
-        for name in names:
-            if isinstance(name, Template):
-                return name
-            if parent is not None:
-                name = self.join_path(name, parent)
-            try:
-                return self._load_template(name, globals)
-            except TemplateNotFound:
-                pass
-        raise TemplatesNotFound(names)
-
-    @internalcode
-    def get_or_select_template(self, template_name_or_list,
-                               parent=None, globals=None):
-        """Does a typecheck and dispatches to :meth:`select_template`
-        if an iterable of template names is given, otherwise to
-        :meth:`get_template`.
-
-        .. versionadded:: 2.3
-        """
-        if isinstance(template_name_or_list, string_types):
-            return self.get_template(template_name_or_list, parent, globals)
-        elif isinstance(template_name_or_list, Template):
-            return template_name_or_list
-        return self.select_template(template_name_or_list, parent, globals)
-
-    def from_string(self, source, globals=None, template_class=None):
-        """Load a template from a string.  This parses the source given and
-        returns a :class:`Template` object.
-        """
-        globals = self.make_globals(globals)
-        cls = template_class or self.template_class
-        return cls.from_code(self, self.compile(source), globals, None)
-
-    def make_globals(self, d):
-        """Return a dict for the globals."""
-        if not d:
-            return self.globals
-        return dict(self.globals, **d)
-
-
-class Template(object):
-    """The central template object.  This class represents a compiled template
-    and is used to evaluate it.
-
-    Normally the template object is generated from an :class:`Environment` but
-    it also has a constructor that makes it possible to create a template
-    instance directly using the constructor.  It takes the same arguments as
-    the environment constructor but it's not possible to specify a loader.
-
-    Every template object has a few methods and members that are guaranteed
-    to exist.  However it's important that a template object should be
-    considered immutable.  Modifications on the object are not supported.
-
-    Template objects created from the constructor rather than an environment
-    do have an `environment` attribute that points to a temporary environment
-    that is probably shared with other templates created with the constructor
-    and compatible settings.
-
-    >>> template = Template('Hello {{ name }}!')
-    >>> template.render(name='John Doe') == u'Hello John Doe!'
-    True
-    >>> stream = template.stream(name='John Doe')
-    >>> next(stream) == u'Hello John Doe!'
-    True
-    >>> next(stream)
-    Traceback (most recent call last):
-        ...
-    StopIteration
-    """
-
-    def __new__(cls, source,
-                block_start_string=BLOCK_START_STRING,
-                block_end_string=BLOCK_END_STRING,
-                variable_start_string=VARIABLE_START_STRING,
-                variable_end_string=VARIABLE_END_STRING,
-                comment_start_string=COMMENT_START_STRING,
-                comment_end_string=COMMENT_END_STRING,
-                line_statement_prefix=LINE_STATEMENT_PREFIX,
-                line_comment_prefix=LINE_COMMENT_PREFIX,
-                trim_blocks=TRIM_BLOCKS,
-                lstrip_blocks=LSTRIP_BLOCKS,
-                newline_sequence=NEWLINE_SEQUENCE,
-                keep_trailing_newline=KEEP_TRAILING_NEWLINE,
-                extensions=(),
-                optimized=True,
-                undefined=Undefined,
-                finalize=None,
-                autoescape=False):
-        env = get_spontaneous_environment(
-            block_start_string, block_end_string, variable_start_string,
-            variable_end_string, comment_start_string, comment_end_string,
-            line_statement_prefix, line_comment_prefix, trim_blocks,
-            lstrip_blocks, newline_sequence, keep_trailing_newline,
-            frozenset(extensions), optimized, undefined, finalize, autoescape,
-            None, 0, False, None)
-        return env.from_string(source, template_class=cls)
-
-    @classmethod
-    def from_code(cls, environment, code, globals, uptodate=None):
-        """Creates a template object from compiled code and the globals.  This
-        is used by the loaders and environment to create a template object.
-        """
-        namespace = {
-            'environment':  environment,
-            '__file__':     code.co_filename
-        }
-        exec(code, namespace)
-        rv = cls._from_namespace(environment, namespace, globals)
-        rv._uptodate = uptodate
-        return rv
-
-    @classmethod
-    def from_module_dict(cls, environment, module_dict, globals):
-        """Creates a template object from a module.  This is used by the
-        module loader to create a template object.
-
-        .. versionadded:: 2.4
-        """
-        return cls._from_namespace(environment, module_dict, globals)
-
-    @classmethod
-    def _from_namespace(cls, environment, namespace, globals):
-        t = object.__new__(cls)
-        t.environment = environment
-        t.globals = globals
-        t.name = namespace['name']
-        t.filename = namespace['__file__']
-        t.blocks = namespace['blocks']
-
-        # render function and module
-        t.root_render_func = namespace['root']
-        t._module = None
-
-        # debug and loader helpers
-        t._debug_info = namespace['debug_info']
-        t._uptodate = None
-
-        # store the reference
-        namespace['environment'] = environment
-        namespace['__jinja_template__'] = t
-
-        return t
-
-    def render(self, *args, **kwargs):
-        """This method accepts the same arguments as the `dict` constructor:
-        A dict, a dict subclass or some keyword arguments.  If no arguments
-        are given the context will be empty.  These two calls do the same::
-
-            template.render(knights='that say nih')
-            template.render({'knights': 'that say nih'})
-
-        This will return the rendered template as unicode string.
-        """
-        vars = dict(*args, **kwargs)
-        try:
-            return concat(self.root_render_func(self.new_context(vars)))
-        except Exception:
-            exc_info = sys.exc_info()
-        return self.environment.handle_exception(exc_info, True)
-
-    def stream(self, *args, **kwargs):
-        """Works exactly like :meth:`generate` but returns a
-        :class:`TemplateStream`.
-        """
-        return TemplateStream(self.generate(*args, **kwargs))
-
-    def generate(self, *args, **kwargs):
-        """For very large templates it can be useful to not render the whole
-        template at once but evaluate each statement after another and yield
-        piece for piece.  This method basically does exactly that and returns
-        a generator that yields one item after another as unicode strings.
-
-        It accepts the same arguments as :meth:`render`.
-        """
-        vars = dict(*args, **kwargs)
-        try:
-            for event in self.root_render_func(self.new_context(vars)):
-                yield event
-        except Exception:
-            exc_info = sys.exc_info()
-        else:
-            return
-        yield self.environment.handle_exception(exc_info, True)
-
-    def new_context(self, vars=None, shared=False, locals=None):
-        """Create a new :class:`Context` for this template.  The vars
-        provided will be passed to the template.  Per default the globals
-        are added to the context.  If shared is set to `True` the data
-        is passed as it to the context without adding the globals.
-
-        `locals` can be a dict of local variables for internal usage.
-        """
-        return new_context(self.environment, self.name, self.blocks,
-                           vars, shared, self.globals, locals)
-
-    def make_module(self, vars=None, shared=False, locals=None):
-        """This method works like the :attr:`module` attribute when called
-        without arguments but it will evaluate the template on every call
-        rather than caching it.  It's also possible to provide
-        a dict which is then used as context.  The arguments are the same
-        as for the :meth:`new_context` method.
-        """
-        return TemplateModule(self, self.new_context(vars, shared, locals))
-
-    @property
-    def module(self):
-        """The template as module.  This is used for imports in the
-        template runtime but is also useful if one wants to access
-        exported template variables from the Python layer:
-
-        >>> t = Template('{% macro foo() %}42{% endmacro %}23')
-        >>> str(t.module)
-        '23'
-        >>> t.module.foo() == u'42'
-        True
-        """
-        if self._module is not None:
-            return self._module
-        self._module = rv = self.make_module()
-        return rv
-
-    def get_corresponding_lineno(self, lineno):
-        """Return the source line number of a line number in the
-        generated bytecode as they are not in sync.
-        """
-        for template_line, code_line in reversed(self.debug_info):
-            if code_line <= lineno:
-                return template_line
-        return 1
-
-    @property
-    def is_up_to_date(self):
-        """If this variable is `False` there is a newer version available."""
-        if self._uptodate is None:
-            return True
-        return self._uptodate()
-
-    @property
-    def debug_info(self):
-        """The debug info mapping."""
-        return [tuple(imap(int, x.split('='))) for x in
-                self._debug_info.split('&')]
-
-    def __repr__(self):
-        if self.name is None:
-            name = 'memory:%x' % id(self)
-        else:
-            name = repr(self.name)
-        return '<%s %s>' % (self.__class__.__name__, name)
-
-
-@implements_to_string
-class TemplateModule(object):
-    """Represents an imported template.  All the exported names of the
-    template are available as attributes on this object.  Additionally
-    converting it into an unicode- or bytestrings renders the contents.
-    """
-
-    def __init__(self, template, context):
-        self._body_stream = list(template.root_render_func(context))
-        self.__dict__.update(context.get_exported())
-        self.__name__ = template.name
-
-    def __html__(self):
-        return Markup(concat(self._body_stream))
-
-    def __str__(self):
-        return concat(self._body_stream)
-
-    def __repr__(self):
-        if self.__name__ is None:
-            name = 'memory:%x' % id(self)
-        else:
-            name = repr(self.__name__)
-        return '<%s %s>' % (self.__class__.__name__, name)
-
-
-class TemplateExpression(object):
-    """The :meth:`jinja2.Environment.compile_expression` method returns an
-    instance of this object.  It encapsulates the expression-like access
-    to the template with an expression it wraps.
-    """
-
-    def __init__(self, template, undefined_to_none):
-        self._template = template
-        self._undefined_to_none = undefined_to_none
-
-    def __call__(self, *args, **kwargs):
-        context = self._template.new_context(dict(*args, **kwargs))
-        consume(self._template.root_render_func(context))
-        rv = context.vars['result']
-        if self._undefined_to_none and isinstance(rv, Undefined):
-            rv = None
-        return rv
-
-
-@implements_iterator
-class TemplateStream(object):
-    """A template stream works pretty much like an ordinary python generator
-    but it can buffer multiple items to reduce the number of total iterations.
-    Per default the output is unbuffered which means that for every unbuffered
-    instruction in the template one unicode string is yielded.
-
-    If buffering is enabled with a buffer size of 5, five items are combined
-    into a new unicode string.  This is mainly useful if you are streaming
-    big templates to a client via WSGI which flushes after each iteration.
-    """
-
-    def __init__(self, gen):
-        self._gen = gen
-        self.disable_buffering()
-
-    def dump(self, fp, encoding=None, errors='strict'):
-        """Dump the complete stream into a file or file-like object.
-        Per default unicode strings are written, if you want to encode
-        before writing specify an `encoding`.
-
-        Example usage::
-
-            Template('Hello {{ name }}!').stream(name='foo').dump('hello.html')
-        """
-        close = False
-        if isinstance(fp, string_types):
-            if encoding is None:
-                encoding = 'utf-8'
-            fp = open(fp, 'wb')
-            close = True
-        try:
-            if encoding is not None:
-                iterable = (x.encode(encoding, errors) for x in self)
-            else:
-                iterable = self
-            if hasattr(fp, 'writelines'):
-                fp.writelines(iterable)
-            else:
-                for item in iterable:
-                    fp.write(item)
-        finally:
-            if close:
-                fp.close()
-
-    def disable_buffering(self):
-        """Disable the output buffering."""
-        self._next = get_next(self._gen)
-        self.buffered = False
-
-    def enable_buffering(self, size=5):
-        """Enable buffering.  Buffer `size` items before yielding them."""
-        if size <= 1:
-            raise ValueError('buffer size too small')
-
-        def generator(next):
-            buf = []
-            c_size = 0
-            push = buf.append
-
-            while 1:
-                try:
-                    while c_size < size:
-                        c = next()
-                        push(c)
-                        if c:
-                            c_size += 1
-                except StopIteration:
-                    if not c_size:
-                        return
-                yield concat(buf)
-                del buf[:]
-                c_size = 0
-
-        self.buffered = True
-        self._next = get_next(generator(get_next(self._gen)))
-
-    def __iter__(self):
-        return self
-
-    def __next__(self):
-        return self._next()
-
-
-# hook in default template class.  if anyone reads this comment: ignore that
-# it's possible to use custom templates ;-)
-Environment.template_class = Template
diff --git a/third_party/jinja2/exceptions.py b/third_party/jinja2/exceptions.py
deleted file mode 100644
index c9df6dc..0000000
--- a/third_party/jinja2/exceptions.py
+++ /dev/null
@@ -1,146 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    jinja2.exceptions
-    ~~~~~~~~~~~~~~~~~
-
-    Jinja exceptions.
-
-    :copyright: (c) 2010 by the Jinja Team.
-    :license: BSD, see LICENSE for more details.
-"""
-from jinja2._compat import imap, text_type, PY2, implements_to_string
-
-
-class TemplateError(Exception):
-    """Baseclass for all template errors."""
-
-    if PY2:
-        def __init__(self, message=None):
-            if message is not None:
-                message = text_type(message).encode('utf-8')
-            Exception.__init__(self, message)
-
-        @property
-        def message(self):
-            if self.args:
-                message = self.args[0]
-                if message is not None:
-                    return message.decode('utf-8', 'replace')
-
-        def __unicode__(self):
-            return self.message or u''
-    else:
-        def __init__(self, message=None):
-            Exception.__init__(self, message)
-
-        @property
-        def message(self):
-            if self.args:
-                message = self.args[0]
-                if message is not None:
-                    return message
-
-
-@implements_to_string
-class TemplateNotFound(IOError, LookupError, TemplateError):
-    """Raised if a template does not exist."""
-
-    # looks weird, but removes the warning descriptor that just
-    # bogusly warns us about message being deprecated
-    message = None
-
-    def __init__(self, name, message=None):
-        IOError.__init__(self)
-        if message is None:
-            message = name
-        self.message = message
-        self.name = name
-        self.templates = [name]
-
-    def __str__(self):
-        return self.message
-
-
-class TemplatesNotFound(TemplateNotFound):
-    """Like :class:`TemplateNotFound` but raised if multiple templates
-    are selected.  This is a subclass of :class:`TemplateNotFound`
-    exception, so just catching the base exception will catch both.
-
-    .. versionadded:: 2.2
-    """
-
-    def __init__(self, names=(), message=None):
-        if message is None:
-            message = u'none of the templates given were found: ' + \
-                      u', '.join(imap(text_type, names))
-        TemplateNotFound.__init__(self, names and names[-1] or None, message)
-        self.templates = list(names)
-
-
-@implements_to_string
-class TemplateSyntaxError(TemplateError):
-    """Raised to tell the user that there is a problem with the template."""
-
-    def __init__(self, message, lineno, name=None, filename=None):
-        TemplateError.__init__(self, message)
-        self.lineno = lineno
-        self.name = name
-        self.filename = filename
-        self.source = None
-
-        # this is set to True if the debug.translate_syntax_error
-        # function translated the syntax error into a new traceback
-        self.translated = False
-
-    def __str__(self):
-        # for translated errors we only return the message
-        if self.translated:
-            return self.message
-
-        # otherwise attach some stuff
-        location = 'line %d' % self.lineno
-        name = self.filename or self.name
-        if name:
-            location = 'File "%s", %s' % (name, location)
-        lines = [self.message, '  ' + location]
-
-        # if the source is set, add the line to the output
-        if self.source is not None:
-            try:
-                line = self.source.splitlines()[self.lineno - 1]
-            except IndexError:
-                line = None
-            if line:
-                lines.append('    ' + line.strip())
-
-        return u'\n'.join(lines)
-
-
-class TemplateAssertionError(TemplateSyntaxError):
-    """Like a template syntax error, but covers cases where something in the
-    template caused an error at compile time that wasn't necessarily caused
-    by a syntax error.  However it's a direct subclass of
-    :exc:`TemplateSyntaxError` and has the same attributes.
-    """
-
-
-class TemplateRuntimeError(TemplateError):
-    """A generic runtime error in the template engine.  Under some situations
-    Jinja may raise this exception.
-    """
-
-
-class UndefinedError(TemplateRuntimeError):
-    """Raised if a template tries to operate on :class:`Undefined`."""
-
-
-class SecurityError(TemplateRuntimeError):
-    """Raised if a template tries to do something insecure if the
-    sandbox is enabled.
-    """
-
-
-class FilterArgumentError(TemplateRuntimeError):
-    """This error is raised if a filter was called with inappropriate
-    arguments
-    """
diff --git a/third_party/jinja2/ext.py b/third_party/jinja2/ext.py
deleted file mode 100644
index 562ab50..0000000
--- a/third_party/jinja2/ext.py
+++ /dev/null
@@ -1,636 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    jinja2.ext
-    ~~~~~~~~~~
-
-    Jinja extensions allow to add custom tags similar to the way django custom
-    tags work.  By default two example extensions exist: an i18n and a cache
-    extension.
-
-    :copyright: (c) 2010 by the Jinja Team.
-    :license: BSD.
-"""
-from jinja2 import nodes
-from jinja2.defaults import BLOCK_START_STRING, \
-     BLOCK_END_STRING, VARIABLE_START_STRING, VARIABLE_END_STRING, \
-     COMMENT_START_STRING, COMMENT_END_STRING, LINE_STATEMENT_PREFIX, \
-     LINE_COMMENT_PREFIX, TRIM_BLOCKS, NEWLINE_SEQUENCE, \
-     KEEP_TRAILING_NEWLINE, LSTRIP_BLOCKS
-from jinja2.environment import Environment
-from jinja2.runtime import concat
-from jinja2.exceptions import TemplateAssertionError, TemplateSyntaxError
-from jinja2.utils import contextfunction, import_string, Markup
-from jinja2._compat import with_metaclass, string_types, iteritems
-
-
-# the only real useful gettext functions for a Jinja template.  Note
-# that ugettext must be assigned to gettext as Jinja doesn't support
-# non unicode strings.
-GETTEXT_FUNCTIONS = ('_', 'gettext', 'ngettext')
-
-
-class ExtensionRegistry(type):
-    """Gives the extension an unique identifier."""
-
-    def __new__(cls, name, bases, d):
-        rv = type.__new__(cls, name, bases, d)
-        rv.identifier = rv.__module__ + '.' + rv.__name__
-        return rv
-
-
-class Extension(with_metaclass(ExtensionRegistry, object)):
-    """Extensions can be used to add extra functionality to the Jinja template
-    system at the parser level.  Custom extensions are bound to an environment
-    but may not store environment specific data on `self`.  The reason for
-    this is that an extension can be bound to another environment (for
-    overlays) by creating a copy and reassigning the `environment` attribute.
-
-    As extensions are created by the environment they cannot accept any
-    arguments for configuration.  One may want to work around that by using
-    a factory function, but that is not possible as extensions are identified
-    by their import name.  The correct way to configure the extension is
-    storing the configuration values on the environment.  Because this way the
-    environment ends up acting as central configuration storage the
-    attributes may clash which is why extensions have to ensure that the names
-    they choose for configuration are not too generic.  ``prefix`` for example
-    is a terrible name, ``fragment_cache_prefix`` on the other hand is a good
-    name as includes the name of the extension (fragment cache).
-    """
-
-    #: if this extension parses this is the list of tags it's listening to.
-    tags = set()
-
-    #: the priority of that extension.  This is especially useful for
-    #: extensions that preprocess values.  A lower value means higher
-    #: priority.
-    #:
-    #: .. versionadded:: 2.4
-    priority = 100
-
-    def __init__(self, environment):
-        self.environment = environment
-
-    def bind(self, environment):
-        """Create a copy of this extension bound to another environment."""
-        rv = object.__new__(self.__class__)
-        rv.__dict__.update(self.__dict__)
-        rv.environment = environment
-        return rv
-
-    def preprocess(self, source, name, filename=None):
-        """This method is called before the actual lexing and can be used to
-        preprocess the source.  The `filename` is optional.  The return value
-        must be the preprocessed source.
-        """
-        return source
-
-    def filter_stream(self, stream):
-        """It's passed a :class:`~jinja2.lexer.TokenStream` that can be used
-        to filter tokens returned.  This method has to return an iterable of
-        :class:`~jinja2.lexer.Token`\s, but it doesn't have to return a
-        :class:`~jinja2.lexer.TokenStream`.
-
-        In the `ext` folder of the Jinja2 source distribution there is a file
-        called `inlinegettext.py` which implements a filter that utilizes this
-        method.
-        """
-        return stream
-
-    def parse(self, parser):
-        """If any of the :attr:`tags` matched this method is called with the
-        parser as first argument.  The token the parser stream is pointing at
-        is the name token that matched.  This method has to return one or a
-        list of multiple nodes.
-        """
-        raise NotImplementedError()
-
-    def attr(self, name, lineno=None):
-        """Return an attribute node for the current extension.  This is useful
-        to pass constants on extensions to generated template code.
-
-        ::
-
-            self.attr('_my_attribute', lineno=lineno)
-        """
-        return nodes.ExtensionAttribute(self.identifier, name, lineno=lineno)
-
-    def call_method(self, name, args=None, kwargs=None, dyn_args=None,
-                    dyn_kwargs=None, lineno=None):
-        """Call a method of the extension.  This is a shortcut for
-        :meth:`attr` + :class:`jinja2.nodes.Call`.
-        """
-        if args is None:
-            args = []
-        if kwargs is None:
-            kwargs = []
-        return nodes.Call(self.attr(name, lineno=lineno), args, kwargs,
-                          dyn_args, dyn_kwargs, lineno=lineno)
-
-
-@contextfunction
-def _gettext_alias(__context, *args, **kwargs):
-    return __context.call(__context.resolve('gettext'), *args, **kwargs)
-
-
-def _make_new_gettext(func):
-    @contextfunction
-    def gettext(__context, __string, **variables):
-        rv = __context.call(func, __string)
-        if __context.eval_ctx.autoescape:
-            rv = Markup(rv)
-        return rv % variables
-    return gettext
-
-
-def _make_new_ngettext(func):
-    @contextfunction
-    def ngettext(__context, __singular, __plural, __num, **variables):
-        variables.setdefault('num', __num)
-        rv = __context.call(func, __singular, __plural, __num)
-        if __context.eval_ctx.autoescape:
-            rv = Markup(rv)
-        return rv % variables
-    return ngettext
-
-
-class InternationalizationExtension(Extension):
-    """This extension adds gettext support to Jinja2."""
-    tags = set(['trans'])
-
-    # TODO: the i18n extension is currently reevaluating values in a few
-    # situations.  Take this example:
-    #   {% trans count=something() %}{{ count }} foo{% pluralize
-    #     %}{{ count }} fooss{% endtrans %}
-    # something is called twice here.  One time for the gettext value and
-    # the other time for the n-parameter of the ngettext function.
-
-    def __init__(self, environment):
-        Extension.__init__(self, environment)
-        environment.globals['_'] = _gettext_alias
-        environment.extend(
-            install_gettext_translations=self._install,
-            install_null_translations=self._install_null,
-            install_gettext_callables=self._install_callables,
-            uninstall_gettext_translations=self._uninstall,
-            extract_translations=self._extract,
-            newstyle_gettext=False
-        )
-
-    def _install(self, translations, newstyle=None):
-        gettext = getattr(translations, 'ugettext', None)
-        if gettext is None:
-            gettext = translations.gettext
-        ngettext = getattr(translations, 'ungettext', None)
-        if ngettext is None:
-            ngettext = translations.ngettext
-        self._install_callables(gettext, ngettext, newstyle)
-
-    def _install_null(self, newstyle=None):
-        self._install_callables(
-            lambda x: x,
-            lambda s, p, n: (n != 1 and (p,) or (s,))[0],
-            newstyle
-        )
-
-    def _install_callables(self, gettext, ngettext, newstyle=None):
-        if newstyle is not None:
-            self.environment.newstyle_gettext = newstyle
-        if self.environment.newstyle_gettext:
-            gettext = _make_new_gettext(gettext)
-            ngettext = _make_new_ngettext(ngettext)
-        self.environment.globals.update(
-            gettext=gettext,
-            ngettext=ngettext
-        )
-
-    def _uninstall(self, translations):
-        for key in 'gettext', 'ngettext':
-            self.environment.globals.pop(key, None)
-
-    def _extract(self, source, gettext_functions=GETTEXT_FUNCTIONS):
-        if isinstance(source, string_types):
-            source = self.environment.parse(source)
-        return extract_from_ast(source, gettext_functions)
-
-    def parse(self, parser):
-        """Parse a translatable tag."""
-        lineno = next(parser.stream).lineno
-        num_called_num = False
-
-        # find all the variables referenced.  Additionally a variable can be
-        # defined in the body of the trans block too, but this is checked at
-        # a later state.
-        plural_expr = None
-        plural_expr_assignment = None
-        variables = {}
-        while parser.stream.current.type != 'block_end':
-            if variables:
-                parser.stream.expect('comma')
-
-            # skip colon for python compatibility
-            if parser.stream.skip_if('colon'):
-                break
-
-            name = parser.stream.expect('name')
-            if name.value in variables:
-                parser.fail('translatable variable %r defined twice.' %
-                            name.value, name.lineno,
-                            exc=TemplateAssertionError)
-
-            # expressions
-            if parser.stream.current.type == 'assign':
-                next(parser.stream)
-                variables[name.value] = var = parser.parse_expression()
-            else:
-                variables[name.value] = var = nodes.Name(name.value, 'load')
-
-            if plural_expr is None:
-                if isinstance(var, nodes.Call):
-                    plural_expr = nodes.Name('_trans', 'load')
-                    variables[name.value] = plural_expr
-                    plural_expr_assignment = nodes.Assign(
-                        nodes.Name('_trans', 'store'), var)
-                else:
-                    plural_expr = var
-                num_called_num = name.value == 'num'
-
-        parser.stream.expect('block_end')
-
-        plural = plural_names = None
-        have_plural = False
-        referenced = set()
-
-        # now parse until endtrans or pluralize
-        singular_names, singular = self._parse_block(parser, True)
-        if singular_names:
-            referenced.update(singular_names)
-            if plural_expr is None:
-                plural_expr = nodes.Name(singular_names[0], 'load')
-                num_called_num = singular_names[0] == 'num'
-
-        # if we have a pluralize block, we parse that too
-        if parser.stream.current.test('name:pluralize'):
-            have_plural = True
-            next(parser.stream)
-            if parser.stream.current.type != 'block_end':
-                name = parser.stream.expect('name')
-                if name.value not in variables:
-                    parser.fail('unknown variable %r for pluralization' %
-                                name.value, name.lineno,
-                                exc=TemplateAssertionError)
-                plural_expr = variables[name.value]
-                num_called_num = name.value == 'num'
-            parser.stream.expect('block_end')
-            plural_names, plural = self._parse_block(parser, False)
-            next(parser.stream)
-            referenced.update(plural_names)
-        else:
-            next(parser.stream)
-
-        # register free names as simple name expressions
-        for var in referenced:
-            if var not in variables:
-                variables[var] = nodes.Name(var, 'load')
-
-        if not have_plural:
-            plural_expr = None
-        elif plural_expr is None:
-            parser.fail('pluralize without variables', lineno)
-
-        node = self._make_node(singular, plural, variables, plural_expr,
-                               bool(referenced),
-                               num_called_num and have_plural)
-        node.set_lineno(lineno)
-        if plural_expr_assignment is not None:
-            return [plural_expr_assignment, node]
-        else:
-            return node
-
-    def _parse_block(self, parser, allow_pluralize):
-        """Parse until the next block tag with a given name."""
-        referenced = []
-        buf = []
-        while 1:
-            if parser.stream.current.type == 'data':
-                buf.append(parser.stream.current.value.replace('%', '%%'))
-                next(parser.stream)
-            elif parser.stream.current.type == 'variable_begin':
-                next(parser.stream)
-                name = parser.stream.expect('name').value
-                referenced.append(name)
-                buf.append('%%(%s)s' % name)
-                parser.stream.expect('variable_end')
-            elif parser.stream.current.type == 'block_begin':
-                next(parser.stream)
-                if parser.stream.current.test('name:endtrans'):
-                    break
-                elif parser.stream.current.test('name:pluralize'):
-                    if allow_pluralize:
-                        break
-                    parser.fail('a translatable section can have only one '
-                                'pluralize section')
-                parser.fail('control structures in translatable sections are '
-                            'not allowed')
-            elif parser.stream.eos:
-                parser.fail('unclosed translation block')
-            else:
-                assert False, 'internal parser error'
-
-        return referenced, concat(buf)
-
-    def _make_node(self, singular, plural, variables, plural_expr,
-                   vars_referenced, num_called_num):
-        """Generates a useful node from the data provided."""
-        # no variables referenced?  no need to escape for old style
-        # gettext invocations only if there are vars.
-        if not vars_referenced and not self.environment.newstyle_gettext:
-            singular = singular.replace('%%', '%')
-            if plural:
-                plural = plural.replace('%%', '%')
-
-        # singular only:
-        if plural_expr is None:
-            gettext = nodes.Name('gettext', 'load')
-            node = nodes.Call(gettext, [nodes.Const(singular)],
-                              [], None, None)
-
-        # singular and plural
-        else:
-            ngettext = nodes.Name('ngettext', 'load')
-            node = nodes.Call(ngettext, [
-                nodes.Const(singular),
-                nodes.Const(plural),
-                plural_expr
-            ], [], None, None)
-
-        # in case newstyle gettext is used, the method is powerful
-        # enough to handle the variable expansion and autoescape
-        # handling itself
-        if self.environment.newstyle_gettext:
-            for key, value in iteritems(variables):
-                # the function adds that later anyways in case num was
-                # called num, so just skip it.
-                if num_called_num and key == 'num':
-                    continue
-                node.kwargs.append(nodes.Keyword(key, value))
-
-        # otherwise do that here
-        else:
-            # mark the return value as safe if we are in an
-            # environment with autoescaping turned on
-            node = nodes.MarkSafeIfAutoescape(node)
-            if variables:
-                node = nodes.Mod(node, nodes.Dict([
-                    nodes.Pair(nodes.Const(key), value)
-                    for key, value in variables.items()
-                ]))
-        return nodes.Output([node])
-
-
-class ExprStmtExtension(Extension):
-    """Adds a `do` tag to Jinja2 that works like the print statement just
-    that it doesn't print the return value.
-    """
-    tags = set(['do'])
-
-    def parse(self, parser):
-        node = nodes.ExprStmt(lineno=next(parser.stream).lineno)
-        node.node = parser.parse_tuple()
-        return node
-
-
-class LoopControlExtension(Extension):
-    """Adds break and continue to the template engine."""
-    tags = set(['break', 'continue'])
-
-    def parse(self, parser):
-        token = next(parser.stream)
-        if token.value == 'break':
-            return nodes.Break(lineno=token.lineno)
-        return nodes.Continue(lineno=token.lineno)
-
-
-class WithExtension(Extension):
-    """Adds support for a django-like with block."""
-    tags = set(['with'])
-
-    def parse(self, parser):
-        node = nodes.Scope(lineno=next(parser.stream).lineno)
-        assignments = []
-        while parser.stream.current.type != 'block_end':
-            lineno = parser.stream.current.lineno
-            if assignments:
-                parser.stream.expect('comma')
-            target = parser.parse_assign_target()
-            parser.stream.expect('assign')
-            expr = parser.parse_expression()
-            assignments.append(nodes.Assign(target, expr, lineno=lineno))
-        node.body = assignments + \
-            list(parser.parse_statements(('name:endwith',),
-                                         drop_needle=True))
-        return node
-
-
-class AutoEscapeExtension(Extension):
-    """Changes auto escape rules for a scope."""
-    tags = set(['autoescape'])
-
-    def parse(self, parser):
-        node = nodes.ScopedEvalContextModifier(lineno=next(parser.stream).lineno)
-        node.options = [
-            nodes.Keyword('autoescape', parser.parse_expression())
-        ]
-        node.body = parser.parse_statements(('name:endautoescape',),
-                                            drop_needle=True)
-        return nodes.Scope([node])
-
-
-def extract_from_ast(node, gettext_functions=GETTEXT_FUNCTIONS,
-                     babel_style=True):
-    """Extract localizable strings from the given template node.  Per
-    default this function returns matches in babel style that means non string
-    parameters as well as keyword arguments are returned as `None`.  This
-    allows Babel to figure out what you really meant if you are using
-    gettext functions that allow keyword arguments for placeholder expansion.
-    If you don't want that behavior set the `babel_style` parameter to `False`
-    which causes only strings to be returned and parameters are always stored
-    in tuples.  As a consequence invalid gettext calls (calls without a single
-    string parameter or string parameters after non-string parameters) are
-    skipped.
-
-    This example explains the behavior:
-
-    >>> from jinja2 import Environment
-    >>> env = Environment()
-    >>> node = env.parse('{{ (_("foo"), _(), ngettext("foo", "bar", 42)) }}')
-    >>> list(extract_from_ast(node))
-    [(1, '_', 'foo'), (1, '_', ()), (1, 'ngettext', ('foo', 'bar', None))]
-    >>> list(extract_from_ast(node, babel_style=False))
-    [(1, '_', ('foo',)), (1, 'ngettext', ('foo', 'bar'))]
-
-    For every string found this function yields a ``(lineno, function,
-    message)`` tuple, where:
-
-    * ``lineno`` is the number of the line on which the string was found,
-    * ``function`` is the name of the ``gettext`` function used (if the
-      string was extracted from embedded Python code), and
-    *  ``message`` is the string itself (a ``unicode`` object, or a tuple
-       of ``unicode`` objects for functions with multiple string arguments).
-
-    This extraction function operates on the AST and is because of that unable
-    to extract any comments.  For comment support you have to use the babel
-    extraction interface or extract comments yourself.
-    """
-    for node in node.find_all(nodes.Call):
-        if not isinstance(node.node, nodes.Name) or \
-           node.node.name not in gettext_functions:
-            continue
-
-        strings = []
-        for arg in node.args:
-            if isinstance(arg, nodes.Const) and \
-               isinstance(arg.value, string_types):
-                strings.append(arg.value)
-            else:
-                strings.append(None)
-
-        for arg in node.kwargs:
-            strings.append(None)
-        if node.dyn_args is not None:
-            strings.append(None)
-        if node.dyn_kwargs is not None:
-            strings.append(None)
-
-        if not babel_style:
-            strings = tuple(x for x in strings if x is not None)
-            if not strings:
-                continue
-        else:
-            if len(strings) == 1:
-                strings = strings[0]
-            else:
-                strings = tuple(strings)
-        yield node.lineno, node.node.name, strings
-
-
-class _CommentFinder(object):
-    """Helper class to find comments in a token stream.  Can only
-    find comments for gettext calls forwards.  Once the comment
-    from line 4 is found, a comment for line 1 will not return a
-    usable value.
-    """
-
-    def __init__(self, tokens, comment_tags):
-        self.tokens = tokens
-        self.comment_tags = comment_tags
-        self.offset = 0
-        self.last_lineno = 0
-
-    def find_backwards(self, offset):
-        try:
-            for _, token_type, token_value in \
-                    reversed(self.tokens[self.offset:offset]):
-                if token_type in ('comment', 'linecomment'):
-                    try:
-                        prefix, comment = token_value.split(None, 1)
-                    except ValueError:
-                        continue
-                    if prefix in self.comment_tags:
-                        return [comment.rstrip()]
-            return []
-        finally:
-            self.offset = offset
-
-    def find_comments(self, lineno):
-        if not self.comment_tags or self.last_lineno > lineno:
-            return []
-        for idx, (token_lineno, _, _) in enumerate(self.tokens[self.offset:]):
-            if token_lineno > lineno:
-                return self.find_backwards(self.offset + idx)
-        return self.find_backwards(len(self.tokens))
-
-
-def babel_extract(fileobj, keywords, comment_tags, options):
-    """Babel extraction method for Jinja templates.
-
-    .. versionchanged:: 2.3
-       Basic support for translation comments was added.  If `comment_tags`
-       is now set to a list of keywords for extraction, the extractor will
-       try to find the best preceeding comment that begins with one of the
-       keywords.  For best results, make sure to not have more than one
-       gettext call in one line of code and the matching comment in the
-       same line or the line before.
-
-    .. versionchanged:: 2.5.1
-       The `newstyle_gettext` flag can be set to `True` to enable newstyle
-       gettext calls.
-
-    .. versionchanged:: 2.7
-       A `silent` option can now be provided.  If set to `False` template
-       syntax errors are propagated instead of being ignored.
-
-    :param fileobj: the file-like object the messages should be extracted from
-    :param keywords: a list of keywords (i.e. function names) that should be
-                     recognized as translation functions
-    :param comment_tags: a list of translator tags to search for and include
-                         in the results.
-    :param options: a dictionary of additional options (optional)
-    :return: an iterator over ``(lineno, funcname, message, comments)`` tuples.
-             (comments will be empty currently)
-    """
-    extensions = set()
-    for extension in options.get('extensions', '').split(','):
-        extension = extension.strip()
-        if not extension:
-            continue
-        extensions.add(import_string(extension))
-    if InternationalizationExtension not in extensions:
-        extensions.add(InternationalizationExtension)
-
-    def getbool(options, key, default=False):
-        return options.get(key, str(default)).lower() in \
-            ('1', 'on', 'yes', 'true')
-
-    silent = getbool(options, 'silent', True)
-    environment = Environment(
-        options.get('block_start_string', BLOCK_START_STRING),
-        options.get('block_end_string', BLOCK_END_STRING),
-        options.get('variable_start_string', VARIABLE_START_STRING),
-        options.get('variable_end_string', VARIABLE_END_STRING),
-        options.get('comment_start_string', COMMENT_START_STRING),
-        options.get('comment_end_string', COMMENT_END_STRING),
-        options.get('line_statement_prefix') or LINE_STATEMENT_PREFIX,
-        options.get('line_comment_prefix') or LINE_COMMENT_PREFIX,
-        getbool(options, 'trim_blocks', TRIM_BLOCKS),
-        getbool(options, 'lstrip_blocks', LSTRIP_BLOCKS),
-        NEWLINE_SEQUENCE,
-        getbool(options, 'keep_trailing_newline', KEEP_TRAILING_NEWLINE),
-        frozenset(extensions),
-        cache_size=0,
-        auto_reload=False
-    )
-
-    if getbool(options, 'newstyle_gettext'):
-        environment.newstyle_gettext = True
-
-    source = fileobj.read().decode(options.get('encoding', 'utf-8'))
-    try:
-        node = environment.parse(source)
-        tokens = list(environment.lex(environment.preprocess(source)))
-    except TemplateSyntaxError as e:
-        if not silent:
-            raise
-        # skip templates with syntax errors
-        return
-
-    finder = _CommentFinder(tokens, comment_tags)
-    for lineno, func, message in extract_from_ast(node, keywords):
-        yield lineno, func, message, finder.find_comments(lineno)
-
-
-#: nicer import names
-i18n = InternationalizationExtension
-do = ExprStmtExtension
-loopcontrols = LoopControlExtension
-with_ = WithExtension
-autoescape = AutoEscapeExtension
diff --git a/third_party/jinja2/filters.py b/third_party/jinja2/filters.py
deleted file mode 100644
index e5c7a1a..0000000
--- a/third_party/jinja2/filters.py
+++ /dev/null
@@ -1,996 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    jinja2.filters
-    ~~~~~~~~~~~~~~
-
-    Bundled jinja filters.
-
-    :copyright: (c) 2010 by the Jinja Team.
-    :license: BSD, see LICENSE for more details.
-"""
-import re
-import math
-
-from random import choice
-from operator import itemgetter
-from itertools import groupby
-from jinja2.utils import Markup, escape, pformat, urlize, soft_unicode, \
-     unicode_urlencode
-from jinja2.runtime import Undefined
-from jinja2.exceptions import FilterArgumentError
-from jinja2._compat import imap, string_types, text_type, iteritems
-
-
-_word_re = re.compile(r'\w+(?u)')
-
-
-def contextfilter(f):
-    """Decorator for marking context dependent filters. The current
-    :class:`Context` will be passed as first argument.
-    """
-    f.contextfilter = True
-    return f
-
-
-def evalcontextfilter(f):
-    """Decorator for marking eval-context dependent filters.  An eval
-    context object is passed as first argument.  For more information
-    about the eval context, see :ref:`eval-context`.
-
-    .. versionadded:: 2.4
-    """
-    f.evalcontextfilter = True
-    return f
-
-
-def environmentfilter(f):
-    """Decorator for marking evironment dependent filters.  The current
-    :class:`Environment` is passed to the filter as first argument.
-    """
-    f.environmentfilter = True
-    return f
-
-
-def make_attrgetter(environment, attribute):
-    """Returns a callable that looks up the given attribute from a
-    passed object with the rules of the environment.  Dots are allowed
-    to access attributes of attributes.  Integer parts in paths are
-    looked up as integers.
-    """
-    if not isinstance(attribute, string_types) \
-       or ('.' not in attribute and not attribute.isdigit()):
-        return lambda x: environment.getitem(x, attribute)
-    attribute = attribute.split('.')
-    def attrgetter(item):
-        for part in attribute:
-            if part.isdigit():
-                part = int(part)
-            item = environment.getitem(item, part)
-        return item
-    return attrgetter
-
-
-def do_forceescape(value):
-    """Enforce HTML escaping.  This will probably double escape variables."""
-    if hasattr(value, '__html__'):
-        value = value.__html__()
-    return escape(text_type(value))
-
-
-def do_urlencode(value):
-    """Escape strings for use in URLs (uses UTF-8 encoding).  It accepts both
-    dictionaries and regular strings as well as pairwise iterables.
-
-    .. versionadded:: 2.7
-    """
-    itemiter = None
-    if isinstance(value, dict):
-        itemiter = iteritems(value)
-    elif not isinstance(value, string_types):
-        try:
-            itemiter = iter(value)
-        except TypeError:
-            pass
-    if itemiter is None:
-        return unicode_urlencode(value)
-    return u'&'.join(unicode_urlencode(k) + '=' +
-                     unicode_urlencode(v, for_qs=True)
-                     for k, v in itemiter)
-
-
-@evalcontextfilter
-def do_replace(eval_ctx, s, old, new, count=None):
-    """Return a copy of the value with all occurrences of a substring
-    replaced with a new one. The first argument is the substring
-    that should be replaced, the second is the replacement string.
-    If the optional third argument ``count`` is given, only the first
-    ``count`` occurrences are replaced:
-
-    .. sourcecode:: jinja
-
-        {{ "Hello World"|replace("Hello", "Goodbye") }}
-            -> Goodbye World
-
-        {{ "aaaaargh"|replace("a", "d'oh, ", 2) }}
-            -> d'oh, d'oh, aaargh
-    """
-    if count is None:
-        count = -1
-    if not eval_ctx.autoescape:
-        return text_type(s).replace(text_type(old), text_type(new), count)
-    if hasattr(old, '__html__') or hasattr(new, '__html__') and \
-       not hasattr(s, '__html__'):
-        s = escape(s)
-    else:
-        s = soft_unicode(s)
-    return s.replace(soft_unicode(old), soft_unicode(new), count)
-
-
-def do_upper(s):
-    """Convert a value to uppercase."""
-    return soft_unicode(s).upper()
-
-
-def do_lower(s):
-    """Convert a value to lowercase."""
-    return soft_unicode(s).lower()
-
-
-@evalcontextfilter
-def do_xmlattr(_eval_ctx, d, autospace=True):
-    """Create an SGML/XML attribute string based on the items in a dict.
-    All values that are neither `none` nor `undefined` are automatically
-    escaped:
-
-    .. sourcecode:: html+jinja
-
-        <ul{{ {'class': 'my_list', 'missing': none,
-                'id': 'list-%d'|format(variable)}|xmlattr }}>
-        ...
-        </ul>
-
-    Results in something like this:
-
-    .. sourcecode:: html
-
-        <ul class="my_list" id="list-42">
-        ...
-        </ul>
-
-    As you can see it automatically prepends a space in front of the item
-    if the filter returned something unless the second parameter is false.
-    """
-    rv = u' '.join(
-        u'%s="%s"' % (escape(key), escape(value))
-        for key, value in iteritems(d)
-        if value is not None and not isinstance(value, Undefined)
-    )
-    if autospace and rv:
-        rv = u' ' + rv
-    if _eval_ctx.autoescape:
-        rv = Markup(rv)
-    return rv
-
-
-def do_capitalize(s):
-    """Capitalize a value. The first character will be uppercase, all others
-    lowercase.
-    """
-    return soft_unicode(s).capitalize()
-
-
-def do_title(s):
-    """Return a titlecased version of the value. I.e. words will start with
-    uppercase letters, all remaining characters are lowercase.
-    """
-    rv = []
-    for item in re.compile(r'([-\s]+)(?u)').split(soft_unicode(s)):
-        if not item:
-            continue
-        rv.append(item[0].upper() + item[1:].lower())
-    return ''.join(rv)
-
-
-def do_dictsort(value, case_sensitive=False, by='key'):
-    """Sort a dict and yield (key, value) pairs. Because python dicts are
-    unsorted you may want to use this function to order them by either
-    key or value:
-
-    .. sourcecode:: jinja
-
-        {% for item in mydict|dictsort %}
-            sort the dict by key, case insensitive
-
-        {% for item in mydict|dictsort(true) %}
-            sort the dict by key, case sensitive
-
-        {% for item in mydict|dictsort(false, 'value') %}
-            sort the dict by value, case insensitive
-    """
-    if by == 'key':
-        pos = 0
-    elif by == 'value':
-        pos = 1
-    else:
-        raise FilterArgumentError('You can only sort by either '
-                                  '"key" or "value"')
-    def sort_func(item):
-        value = item[pos]
-        if isinstance(value, string_types) and not case_sensitive:
-            value = value.lower()
-        return value
-
-    return sorted(value.items(), key=sort_func)
-
-
-@environmentfilter
-def do_sort(environment, value, reverse=False, case_sensitive=False,
-            attribute=None):
-    """Sort an iterable.  Per default it sorts ascending, if you pass it
-    true as first argument it will reverse the sorting.
-
-    If the iterable is made of strings the third parameter can be used to
-    control the case sensitiveness of the comparison which is disabled by
-    default.
-
-    .. sourcecode:: jinja
-
-        {% for item in iterable|sort %}
-            ...
-        {% endfor %}
-
-    It is also possible to sort by an attribute (for example to sort
-    by the date of an object) by specifying the `attribute` parameter:
-
-    .. sourcecode:: jinja
-
-        {% for item in iterable|sort(attribute='date') %}
-            ...
-        {% endfor %}
-
-    .. versionchanged:: 2.6
-       The `attribute` parameter was added.
-    """
-    if not case_sensitive:
-        def sort_func(item):
-            if isinstance(item, string_types):
-                item = item.lower()
-            return item
-    else:
-        sort_func = None
-    if attribute is not None:
-        getter = make_attrgetter(environment, attribute)
-        def sort_func(item, processor=sort_func or (lambda x: x)):
-            return processor(getter(item))
-    return sorted(value, key=sort_func, reverse=reverse)
-
-
-def do_default(value, default_value=u'', boolean=False):
-    """If the value is undefined it will return the passed default value,
-    otherwise the value of the variable:
-
-    .. sourcecode:: jinja
-
-        {{ my_variable|default('my_variable is not defined') }}
-
-    This will output the value of ``my_variable`` if the variable was
-    defined, otherwise ``'my_variable is not defined'``. If you want
-    to use default with variables that evaluate to false you have to
-    set the second parameter to `true`:
-
-    .. sourcecode:: jinja
-
-        {{ ''|default('the string was empty', true) }}
-    """
-    if isinstance(value, Undefined) or (boolean and not value):
-        return default_value
-    return value
-
-
-@evalcontextfilter
-def do_join(eval_ctx, value, d=u'', attribute=None):
-    """Return a string which is the concatenation of the strings in the
-    sequence. The separator between elements is an empty string per
-    default, you can define it with the optional parameter:
-
-    .. sourcecode:: jinja
-
-        {{ [1, 2, 3]|join('|') }}
-            -> 1|2|3
-
-        {{ [1, 2, 3]|join }}
-            -> 123
-
-    It is also possible to join certain attributes of an object:
-
-    .. sourcecode:: jinja
-
-        {{ users|join(', ', attribute='username') }}
-
-    .. versionadded:: 2.6
-       The `attribute` parameter was added.
-    """
-    if attribute is not None:
-        value = imap(make_attrgetter(eval_ctx.environment, attribute), value)
-
-    # no automatic escaping?  joining is a lot eaiser then
-    if not eval_ctx.autoescape:
-        return text_type(d).join(imap(text_type, value))
-
-    # if the delimiter doesn't have an html representation we check
-    # if any of the items has.  If yes we do a coercion to Markup
-    if not hasattr(d, '__html__'):
-        value = list(value)
-        do_escape = False
-        for idx, item in enumerate(value):
-            if hasattr(item, '__html__'):
-                do_escape = True
-            else:
-                value[idx] = text_type(item)
-        if do_escape:
-            d = escape(d)
-        else:
-            d = text_type(d)
-        return d.join(value)
-
-    # no html involved, to normal joining
-    return soft_unicode(d).join(imap(soft_unicode, value))
-
-
-def do_center(value, width=80):
-    """Centers the value in a field of a given width."""
-    return text_type(value).center(width)
-
-
-@environmentfilter
-def do_first(environment, seq):
-    """Return the first item of a sequence."""
-    try:
-        return next(iter(seq))
-    except StopIteration:
-        return environment.undefined('No first item, sequence was empty.')
-
-
-@environmentfilter
-def do_last(environment, seq):
-    """Return the last item of a sequence."""
-    try:
-        return next(iter(reversed(seq)))
-    except StopIteration:
-        return environment.undefined('No last item, sequence was empty.')
-
-
-@environmentfilter
-def do_random(environment, seq):
-    """Return a random item from the sequence."""
-    try:
-        return choice(seq)
-    except IndexError:
-        return environment.undefined('No random item, sequence was empty.')
-
-
-def do_filesizeformat(value, binary=False):
-    """Format the value like a 'human-readable' file size (i.e. 13 kB,
-    4.1 MB, 102 Bytes, etc).  Per default decimal prefixes are used (Mega,
-    Giga, etc.), if the second parameter is set to `True` the binary
-    prefixes are used (Mebi, Gibi).
-    """
-    bytes = float(value)
-    base = binary and 1024 or 1000
-    prefixes = [
-        (binary and 'KiB' or 'kB'),
-        (binary and 'MiB' or 'MB'),
-        (binary and 'GiB' or 'GB'),
-        (binary and 'TiB' or 'TB'),
-        (binary and 'PiB' or 'PB'),
-        (binary and 'EiB' or 'EB'),
-        (binary and 'ZiB' or 'ZB'),
-        (binary and 'YiB' or 'YB')
-    ]
-    if bytes == 1:
-        return '1 Byte'
-    elif bytes < base:
-        return '%d Bytes' % bytes
-    else:
-        for i, prefix in enumerate(prefixes):
-            unit = base ** (i + 2)
-            if bytes < unit:
-                return '%.1f %s' % ((base * bytes / unit), prefix)
-        return '%.1f %s' % ((base * bytes / unit), prefix)
-
-
-def do_pprint(value, verbose=False):
-    """Pretty print a variable. Useful for debugging.
-
-    With Jinja 1.2 onwards you can pass it a parameter.  If this parameter
-    is truthy the output will be more verbose (this requires `pretty`)
-    """
-    return pformat(value, verbose=verbose)
-
-
-@evalcontextfilter
-def do_urlize(eval_ctx, value, trim_url_limit=None, nofollow=False,
-              target=None):
-    """Converts URLs in plain text into clickable links.
-
-    If you pass the filter an additional integer it will shorten the urls
-    to that number. Also a third argument exists that makes the urls
-    "nofollow":
-
-    .. sourcecode:: jinja
-
-        {{ mytext|urlize(40, true) }}
-            links are shortened to 40 chars and defined with rel="nofollow"
-
-    If *target* is specified, the ``target`` attribute will be added to the
-    ``<a>`` tag:
-
-    .. sourcecode:: jinja
-
-       {{ mytext|urlize(40, target='_blank') }}
-
-    .. versionchanged:: 2.8+
-       The *target* parameter was added.
-    """
-    rv = urlize(value, trim_url_limit, nofollow, target)
-    if eval_ctx.autoescape:
-        rv = Markup(rv)
-    return rv
-
-
-def do_indent(s, width=4, indentfirst=False):
-    """Return a copy of the passed string, each line indented by
-    4 spaces. The first line is not indented. If you want to
-    change the number of spaces or indent the first line too
-    you can pass additional parameters to the filter:
-
-    .. sourcecode:: jinja
-
-        {{ mytext|indent(2, true) }}
-            indent by two spaces and indent the first line too.
-    """
-    indention = u' ' * width
-    rv = (u'\n' + indention).join(s.splitlines())
-    if indentfirst:
-        rv = indention + rv
-    return rv
-
-
-def do_truncate(s, length=255, killwords=False, end='...'):
-    """Return a truncated copy of the string. The length is specified
-    with the first parameter which defaults to ``255``. If the second
-    parameter is ``true`` the filter will cut the text at length. Otherwise
-    it will discard the last word. If the text was in fact
-    truncated it will append an ellipsis sign (``"..."``). If you want a
-    different ellipsis sign than ``"..."`` you can specify it using the
-    third parameter.
-
-    .. sourcecode:: jinja
-
-        {{ "foo bar baz"|truncate(9) }}
-            -> "foo ..."
-        {{ "foo bar baz"|truncate(9, True) }}
-            -> "foo ba..."
-
-    """
-    if len(s) <= length:
-        return s
-    elif killwords:
-        return s[:length - len(end)] + end
-
-    result = s[:length - len(end)].rsplit(' ', 1)[0]
-    if len(result) < length:
-        result += ' '
-    return result + end
-
-
-@environmentfilter
-def do_wordwrap(environment, s, width=79, break_long_words=True,
-                wrapstring=None):
-    """
-    Return a copy of the string passed to the filter wrapped after
-    ``79`` characters.  You can override this default using the first
-    parameter.  If you set the second parameter to `false` Jinja will not
-    split words apart if they are longer than `width`. By default, the newlines
-    will be the default newlines for the environment, but this can be changed
-    using the wrapstring keyword argument.
-
-    .. versionadded:: 2.7
-       Added support for the `wrapstring` parameter.
-    """
-    if not wrapstring:
-        wrapstring = environment.newline_sequence
-    import textwrap
-    return wrapstring.join(textwrap.wrap(s, width=width, expand_tabs=False,
-                                   replace_whitespace=False,
-                                   break_long_words=break_long_words))
-
-
-def do_wordcount(s):
-    """Count the words in that string."""
-    return len(_word_re.findall(s))
-
-
-def do_int(value, default=0, base=10):
-    """Convert the value into an integer. If the
-    conversion doesn't work it will return ``0``. You can
-    override this default using the first parameter. You
-    can also override the default base (10) in the second
-    parameter, which handles input with prefixes such as
-    0b, 0o and 0x for bases 2, 8 and 16 respectively.
-    """
-    try:
-        return int(value, base)
-    except (TypeError, ValueError):
-        # this quirk is necessary so that "42.23"|int gives 42.
-        try:
-            return int(float(value))
-        except (TypeError, ValueError):
-            return default
-
-
-def do_float(value, default=0.0):
-    """Convert the value into a floating point number. If the
-    conversion doesn't work it will return ``0.0``. You can
-    override this default using the first parameter.
-    """
-    try:
-        return float(value)
-    except (TypeError, ValueError):
-        return default
-
-
-def do_format(value, *args, **kwargs):
-    """
-    Apply python string formatting on an object:
-
-    .. sourcecode:: jinja
-
-        {{ "%s - %s"|format("Hello?", "Foo!") }}
-            -> Hello? - Foo!
-    """
-    if args and kwargs:
-        raise FilterArgumentError('can\'t handle positional and keyword '
-                                  'arguments at the same time')
-    return soft_unicode(value) % (kwargs or args)
-
-
-def do_trim(value):
-    """Strip leading and trailing whitespace."""
-    return soft_unicode(value).strip()
-
-
-def do_striptags(value):
-    """Strip SGML/XML tags and replace adjacent whitespace by one space.
-    """
-    if hasattr(value, '__html__'):
-        value = value.__html__()
-    return Markup(text_type(value)).striptags()
-
-
-def do_slice(value, slices, fill_with=None):
-    """Slice an iterator and return a list of lists containing
-    those items. Useful if you want to create a div containing
-    three ul tags that represent columns:
-
-    .. sourcecode:: html+jinja
-
-        <div class="columwrapper">
-          {%- for column in items|slice(3) %}
-            <ul class="column-{{ loop.index }}">
-            {%- for item in column %}
-              <li>{{ item }}</li>
-            {%- endfor %}
-            </ul>
-          {%- endfor %}
-        </div>
-
-    If you pass it a second argument it's used to fill missing
-    values on the last iteration.
-    """
-    seq = list(value)
-    length = len(seq)
-    items_per_slice = length // slices
-    slices_with_extra = length % slices
-    offset = 0
-    for slice_number in range(slices):
-        start = offset + slice_number * items_per_slice
-        if slice_number < slices_with_extra:
-            offset += 1
-        end = offset + (slice_number + 1) * items_per_slice
-        tmp = seq[start:end]
-        if fill_with is not None and slice_number >= slices_with_extra:
-            tmp.append(fill_with)
-        yield tmp
-
-
-def do_batch(value, linecount, fill_with=None):
-    """
-    A filter that batches items. It works pretty much like `slice`
-    just the other way round. It returns a list of lists with the
-    given number of items. If you provide a second parameter this
-    is used to fill up missing items. See this example:
-
-    .. sourcecode:: html+jinja
-
-        <table>
-        {%- for row in items|batch(3, '&nbsp;') %}
-          <tr>
-          {%- for column in row %}
-            <td>{{ column }}</td>
-          {%- endfor %}
-          </tr>
-        {%- endfor %}
-        </table>
-    """
-    tmp = []
-    for item in value:
-        if len(tmp) == linecount:
-            yield tmp
-            tmp = []
-        tmp.append(item)
-    if tmp:
-        if fill_with is not None and len(tmp) < linecount:
-            tmp += [fill_with] * (linecount - len(tmp))
-        yield tmp
-
-
-def do_round(value, precision=0, method='common'):
-    """Round the number to a given precision. The first
-    parameter specifies the precision (default is ``0``), the
-    second the rounding method:
-
-    - ``'common'`` rounds either up or down
-    - ``'ceil'`` always rounds up
-    - ``'floor'`` always rounds down
-
-    If you don't specify a method ``'common'`` is used.
-
-    .. sourcecode:: jinja
-
-        {{ 42.55|round }}
-            -> 43.0
-        {{ 42.55|round(1, 'floor') }}
-            -> 42.5
-
-    Note that even if rounded to 0 precision, a float is returned.  If
-    you need a real integer, pipe it through `int`:
-
-    .. sourcecode:: jinja
-
-        {{ 42.55|round|int }}
-            -> 43
-    """
-    if not method in ('common', 'ceil', 'floor'):
-        raise FilterArgumentError('method must be common, ceil or floor')
-    if method == 'common':
-        return round(value, precision)
-    func = getattr(math, method)
-    return func(value * (10 ** precision)) / (10 ** precision)
-
-
-@environmentfilter
-def do_groupby(environment, value, attribute):
-    """Group a sequence of objects by a common attribute.
-
-    If you for example have a list of dicts or objects that represent persons
-    with `gender`, `first_name` and `last_name` attributes and you want to
-    group all users by genders you can do something like the following
-    snippet:
-
-    .. sourcecode:: html+jinja
-
-        <ul>
-        {% for group in persons|groupby('gender') %}
-            <li>{{ group.grouper }}<ul>
-            {% for person in group.list %}
-                <li>{{ person.first_name }} {{ person.last_name }}</li>
-            {% endfor %}</ul></li>
-        {% endfor %}
-        </ul>
-
-    Additionally it's possible to use tuple unpacking for the grouper and
-    list:
-
-    .. sourcecode:: html+jinja
-
-        <ul>
-        {% for grouper, list in persons|groupby('gender') %}
-            ...
-        {% endfor %}
-        </ul>
-
-    As you can see the item we're grouping by is stored in the `grouper`
-    attribute and the `list` contains all the objects that have this grouper
-    in common.
-
-    .. versionchanged:: 2.6
-       It's now possible to use dotted notation to group by the child
-       attribute of another attribute.
-    """
-    expr = make_attrgetter(environment, attribute)
-    return sorted(map(_GroupTuple, groupby(sorted(value, key=expr), expr)))
-
-
-class _GroupTuple(tuple):
-    __slots__ = ()
-    grouper = property(itemgetter(0))
-    list = property(itemgetter(1))
-
-    def __new__(cls, xxx_todo_changeme):
-        (key, value) = xxx_todo_changeme
-        return tuple.__new__(cls, (key, list(value)))
-
-
-@environmentfilter
-def do_sum(environment, iterable, attribute=None, start=0):
-    """Returns the sum of a sequence of numbers plus the value of parameter
-    'start' (which defaults to 0).  When the sequence is empty it returns
-    start.
-
-    It is also possible to sum up only certain attributes:
-
-    .. sourcecode:: jinja
-
-        Total: {{ items|sum(attribute='price') }}
-
-    .. versionchanged:: 2.6
-       The `attribute` parameter was added to allow suming up over
-       attributes.  Also the `start` parameter was moved on to the right.
-    """
-    if attribute is not None:
-        iterable = imap(make_attrgetter(environment, attribute), iterable)
-    return sum(iterable, start)
-
-
-def do_list(value):
-    """Convert the value into a list.  If it was a string the returned list
-    will be a list of characters.
-    """
-    return list(value)
-
-
-def do_mark_safe(value):
-    """Mark the value as safe which means that in an environment with automatic
-    escaping enabled this variable will not be escaped.
-    """
-    return Markup(value)
-
-
-def do_mark_unsafe(value):
-    """Mark a value as unsafe.  This is the reverse operation for :func:`safe`."""
-    return text_type(value)
-
-
-def do_reverse(value):
-    """Reverse the object or return an iterator that iterates over it the other
-    way round.
-    """
-    if isinstance(value, string_types):
-        return value[::-1]
-    try:
-        return reversed(value)
-    except TypeError:
-        try:
-            rv = list(value)
-            rv.reverse()
-            return rv
-        except TypeError:
-            raise FilterArgumentError('argument must be iterable')
-
-
-@environmentfilter
-def do_attr(environment, obj, name):
-    """Get an attribute of an object.  ``foo|attr("bar")`` works like
-    ``foo.bar`` just that always an attribute is returned and items are not
-    looked up.
-
-    See :ref:`Notes on subscriptions <notes-on-subscriptions>` for more details.
-    """
-    try:
-        name = str(name)
-    except UnicodeError:
-        pass
-    else:
-        try:
-            value = getattr(obj, name)
-        except AttributeError:
-            pass
-        else:
-            if environment.sandboxed and not \
-               environment.is_safe_attribute(obj, name, value):
-                return environment.unsafe_undefined(obj, name)
-            return value
-    return environment.undefined(obj=obj, name=name)
-
-
-@contextfilter
-def do_map(*args, **kwargs):
-    """Applies a filter on a sequence of objects or looks up an attribute.
-    This is useful when dealing with lists of objects but you are really
-    only interested in a certain value of it.
-
-    The basic usage is mapping on an attribute.  Imagine you have a list
-    of users but you are only interested in a list of usernames:
-
-    .. sourcecode:: jinja
-
-        Users on this page: {{ users|map(attribute='username')|join(', ') }}
-
-    Alternatively you can let it invoke a filter by passing the name of the
-    filter and the arguments afterwards.  A good example would be applying a
-    text conversion filter on a sequence:
-
-    .. sourcecode:: jinja
-
-        Users on this page: {{ titles|map('lower')|join(', ') }}
-
-    .. versionadded:: 2.7
-    """
-    context = args[0]
-    seq = args[1]
-
-    if len(args) == 2 and 'attribute' in kwargs:
-        attribute = kwargs.pop('attribute')
-        if kwargs:
-            raise FilterArgumentError('Unexpected keyword argument %r' %
-                next(iter(kwargs)))
-        func = make_attrgetter(context.environment, attribute)
-    else:
-        try:
-            name = args[2]
-            args = args[3:]
-        except LookupError:
-            raise FilterArgumentError('map requires a filter argument')
-        func = lambda item: context.environment.call_filter(
-            name, item, args, kwargs, context=context)
-
-    if seq:
-        for item in seq:
-            yield func(item)
-
-
-@contextfilter
-def do_select(*args, **kwargs):
-    """Filters a sequence of objects by applying a test to the object and only
-    selecting the ones with the test succeeding.
-
-    Example usage:
-
-    .. sourcecode:: jinja
-
-        {{ numbers|select("odd") }}
-        {{ numbers|select("odd") }}
-
-    .. versionadded:: 2.7
-    """
-    return _select_or_reject(args, kwargs, lambda x: x, False)
-
-
-@contextfilter
-def do_reject(*args, **kwargs):
-    """Filters a sequence of objects by applying a test to the object and
-    rejecting the ones with the test succeeding.
-
-    Example usage:
-
-    .. sourcecode:: jinja
-
-        {{ numbers|reject("odd") }}
-
-    .. versionadded:: 2.7
-    """
-    return _select_or_reject(args, kwargs, lambda x: not x, False)
-
-
-@contextfilter
-def do_selectattr(*args, **kwargs):
-    """Filters a sequence of objects by applying a test to an attribute of an
-    object and only selecting the ones with the test succeeding.
-
-    Example usage:
-
-    .. sourcecode:: jinja
-
-        {{ users|selectattr("is_active") }}
-        {{ users|selectattr("email", "none") }}
-
-    .. versionadded:: 2.7
-    """
-    return _select_or_reject(args, kwargs, lambda x: x, True)
-
-
-@contextfilter
-def do_rejectattr(*args, **kwargs):
-    """Filters a sequence of objects by applying a test to an attribute of an
-    object or the attribute and rejecting the ones with the test succeeding.
-
-    .. sourcecode:: jinja
-
-        {{ users|rejectattr("is_active") }}
-        {{ users|rejectattr("email", "none") }}
-
-    .. versionadded:: 2.7
-    """
-    return _select_or_reject(args, kwargs, lambda x: not x, True)
-
-
-def _select_or_reject(args, kwargs, modfunc, lookup_attr):
-    context = args[0]
-    seq = args[1]
-    if lookup_attr:
-        try:
-            attr = args[2]
-        except LookupError:
-            raise FilterArgumentError('Missing parameter for attribute name')
-        transfunc = make_attrgetter(context.environment, attr)
-        off = 1
-    else:
-        off = 0
-        transfunc = lambda x: x
-
-    try:
-        name = args[2 + off]
-        args = args[3 + off:]
-        func = lambda item: context.environment.call_test(
-            name, item, args, kwargs)
-    except LookupError:
-        func = bool
-
-    if seq:
-        for item in seq:
-            if modfunc(func(transfunc(item))):
-                yield item
-
-
-FILTERS = {
-    'abs':                  abs,
-    'attr':                 do_attr,
-    'batch':                do_batch,
-    'capitalize':           do_capitalize,
-    'center':               do_center,
-    'count':                len,
-    'd':                    do_default,
-    'default':              do_default,
-    'dictsort':             do_dictsort,
-    'e':                    escape,
-    'escape':               escape,
-    'filesizeformat':       do_filesizeformat,
-    'first':                do_first,
-    'float':                do_float,
-    'forceescape':          do_forceescape,
-    'format':               do_format,
-    'groupby':              do_groupby,
-    'indent':               do_indent,
-    'int':                  do_int,
-    'join':                 do_join,
-    'last':                 do_last,
-    'length':               len,
-    'list':                 do_list,
-    'lower':                do_lower,
-    'map':                  do_map,
-    'pprint':               do_pprint,
-    'random':               do_random,
-    'reject':               do_reject,
-    'rejectattr':           do_rejectattr,
-    'replace':              do_replace,
-    'reverse':              do_reverse,
-    'round':                do_round,
-    'safe':                 do_mark_safe,
-    'select':               do_select,
-    'selectattr':           do_selectattr,
-    'slice':                do_slice,
-    'sort':                 do_sort,
-    'string':               soft_unicode,
-    'striptags':            do_striptags,
-    'sum':                  do_sum,
-    'title':                do_title,
-    'trim':                 do_trim,
-    'truncate':             do_truncate,
-    'upper':                do_upper,
-    'urlencode':            do_urlencode,
-    'urlize':               do_urlize,
-    'wordcount':            do_wordcount,
-    'wordwrap':             do_wordwrap,
-    'xmlattr':              do_xmlattr,
-}
diff --git a/third_party/jinja2/get_jinja2.sh b/third_party/jinja2/get_jinja2.sh
deleted file mode 100755
index 0018349..0000000
--- a/third_party/jinja2/get_jinja2.sh
+++ /dev/null
@@ -1,122 +0,0 @@
-#!/bin/bash
-# Download and extract Jinja2
-# Homepage:
-# http://jinja.pocoo.org/
-# Installation instructions:
-# http://jinja.pocoo.org/docs/intro/#from-the-tarball-release
-# Download page:
-# https://pypi.python.org/pypi/Jinja2
-PACKAGE='Jinja2'
-VERSION='2.8'
-SRC_URL='https://pypi.python.org/packages/f2/2f/0b98b06a345a761bec91a079ccae392d282690c2d8272e708f4d10829e22/Jinja2-2.8.tar.gz'
-PACKAGE_DIR='jinja2'
-
-CHROMIUM_FILES="README.chromium OWNERS get_jinja2.sh"
-EXTRA_FILES='LICENSE AUTHORS'
-REMOVE_FILES='testsuite'
-
-FILENAME="$(basename $SRC_URL)"
-MD5_FILENAME="$FILENAME.md5"
-SHA512_FILENAME="$FILENAME.sha512"
-CHROMIUM_FILES+=" $MD5_FILENAME $SHA512_FILENAME"
-
-BUILD_DIR="$PACKAGE-$VERSION"
-THIRD_PARTY="$(dirname $(realpath $(dirname "${BASH_SOURCE[0]}")))"
-INSTALL_DIR="$THIRD_PARTY/$PACKAGE_DIR"
-OUT_DIR="$INSTALL_DIR/$BUILD_DIR/$PACKAGE_DIR"
-OLD_DIR="$THIRD_PARTY/$PACKAGE_DIR.old"
-
-function check_hashes {
-  # Hashes generated via:
-  # FILENAME=Jinja2-2.8.tar.gz
-  # md5sum "$FILENAME" > "$FILENAME.md5"
-  # sha512sum "$FILENAME" > "$FILENAME.sha512"
-  # unset FILENAME
-
-  # MD5
-  if ! [ -f "$MD5_FILENAME" ]
-  then
-    echo "MD5 hash file $MD5_FILENAME not found, could not verify archive"
-    exit 1
-  fi
-
-  # 32-digit hash, followed by filename
-  MD5_HASHFILE_REGEX="^[0-9a-f]{32}  $FILENAME"
-  if ! grep --extended-regex --line-regex --silent \
-    "$MD5_HASHFILE_REGEX" "$MD5_FILENAME"
-  then
-    echo "MD5 hash file $MD5_FILENAME does not contain hash for $FILENAME," \
-         'could not verify archive'
-    echo 'Hash file contents are:'
-    cat "$MD5_FILENAME"
-    exit 1
-  fi
-
-  if ! md5sum --check "$MD5_FILENAME"
-  then
-    echo 'MD5 hash does not match,' \
-         "archive file $FILENAME corrupt or compromised!"
-    exit 1
-  fi
-
-  # SHA-512
-  if ! [ -f "$SHA512_FILENAME" ]
-  then
-    echo "SHA-512 hash file $SHA512_FILENAME not found," \
-         'could not verify archive'
-    exit 1
-  fi
-
-  # 128-digit hash, followed by filename
-  SHA512_HASHFILE_REGEX="^[0-9a-f]{128}  $FILENAME"
-  if ! grep --extended-regex --line-regex --silent \
-    "$SHA512_HASHFILE_REGEX" "$SHA512_FILENAME"
-  then
-    echo "SHA-512 hash file $SHA512_FILENAME does not contain hash for" \
-         "$FILENAME, could not verify archive"
-    echo 'Hash file contents are:'
-    cat "$SHA512_FILENAME"
-    exit 1
-  fi
-
-  if ! sha512sum --check "$SHA512_FILENAME"
-  then
-    echo 'SHA-512 hash does not match,' \
-         "archive file $FILENAME corrupt or compromised!"
-    exit 1
-  fi
-}
-
-
-################################################################################
-# Body
-
-cd "$INSTALL_DIR"
-echo "Downloading $SRC_URL"
-curl --remote-name "$SRC_URL"
-check_hashes
-tar xvzf "$FILENAME"
-# Copy extra files over
-for FILE in $CHROMIUM_FILES
-do
-  cp "$FILE" "$OUT_DIR"
-done
-
-cd "$BUILD_DIR"
-for FILE in $EXTRA_FILES
-do
-  cp "$FILE" "$OUT_DIR"
-done
-
-cd "$OUT_DIR"
-for FILE in $REMOVE_FILES
-do
-  rm -fr "$FILE"
-done
-
-# Replace with new directory
-cd ..
-mv "$INSTALL_DIR" "$OLD_DIR"
-mv "$PACKAGE_DIR" "$INSTALL_DIR"
-cd "$INSTALL_DIR"
-rm -fr "$OLD_DIR"
diff --git a/third_party/jinja2/lexer.py b/third_party/jinja2/lexer.py
deleted file mode 100644
index c8dac21..0000000
--- a/third_party/jinja2/lexer.py
+++ /dev/null
@@ -1,734 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    jinja2.lexer
-    ~~~~~~~~~~~~
-
-    This module implements a Jinja / Python combination lexer. The
-    `Lexer` class provided by this module is used to do some preprocessing
-    for Jinja.
-
-    On the one hand it filters out invalid operators like the bitshift
-    operators we don't allow in templates. On the other hand it separates
-    template code and python code in expressions.
-
-    :copyright: (c) 2010 by the Jinja Team.
-    :license: BSD, see LICENSE for more details.
-"""
-import re
-
-from operator import itemgetter
-from collections import deque
-from jinja2.exceptions import TemplateSyntaxError
-from jinja2.utils import LRUCache
-from jinja2._compat import iteritems, implements_iterator, text_type, \
-     intern, PY2
-
-
-# cache for the lexers. Exists in order to be able to have multiple
-# environments with the same lexer
-_lexer_cache = LRUCache(50)
-
-# static regular expressions
-whitespace_re = re.compile(r'\s+', re.U)
-string_re = re.compile(r"('([^'\\]*(?:\\.[^'\\]*)*)'"
-                       r'|"([^"\\]*(?:\\.[^"\\]*)*)")', re.S)
-integer_re = re.compile(r'\d+')
-
-# we use the unicode identifier rule if this python version is able
-# to handle unicode identifiers, otherwise the standard ASCII one.
-try:
-    compile('föö', '<unknown>', 'eval')
-except SyntaxError:
-    name_re = re.compile(r'\b[a-zA-Z_][a-zA-Z0-9_]*\b')
-else:
-    from jinja2 import _stringdefs
-    name_re = re.compile(r'[%s][%s]*' % (_stringdefs.xid_start,
-                                         _stringdefs.xid_continue))
-
-float_re = re.compile(r'(?<!\.)\d+\.\d+')
-newline_re = re.compile(r'(\r\n|\r|\n)')
-
-# internal the tokens and keep references to them
-TOKEN_ADD = intern('add')
-TOKEN_ASSIGN = intern('assign')
-TOKEN_COLON = intern('colon')
-TOKEN_COMMA = intern('comma')
-TOKEN_DIV = intern('div')
-TOKEN_DOT = intern('dot')
-TOKEN_EQ = intern('eq')
-TOKEN_FLOORDIV = intern('floordiv')
-TOKEN_GT = intern('gt')
-TOKEN_GTEQ = intern('gteq')
-TOKEN_LBRACE = intern('lbrace')
-TOKEN_LBRACKET = intern('lbracket')
-TOKEN_LPAREN = intern('lparen')
-TOKEN_LT = intern('lt')
-TOKEN_LTEQ = intern('lteq')
-TOKEN_MOD = intern('mod')
-TOKEN_MUL = intern('mul')
-TOKEN_NE = intern('ne')
-TOKEN_PIPE = intern('pipe')
-TOKEN_POW = intern('pow')
-TOKEN_RBRACE = intern('rbrace')
-TOKEN_RBRACKET = intern('rbracket')
-TOKEN_RPAREN = intern('rparen')
-TOKEN_SEMICOLON = intern('semicolon')
-TOKEN_SUB = intern('sub')
-TOKEN_TILDE = intern('tilde')
-TOKEN_WHITESPACE = intern('whitespace')
-TOKEN_FLOAT = intern('float')
-TOKEN_INTEGER = intern('integer')
-TOKEN_NAME = intern('name')
-TOKEN_STRING = intern('string')
-TOKEN_OPERATOR = intern('operator')
-TOKEN_BLOCK_BEGIN = intern('block_begin')
-TOKEN_BLOCK_END = intern('block_end')
-TOKEN_VARIABLE_BEGIN = intern('variable_begin')
-TOKEN_VARIABLE_END = intern('variable_end')
-TOKEN_RAW_BEGIN = intern('raw_begin')
-TOKEN_RAW_END = intern('raw_end')
-TOKEN_COMMENT_BEGIN = intern('comment_begin')
-TOKEN_COMMENT_END = intern('comment_end')
-TOKEN_COMMENT = intern('comment')
-TOKEN_LINESTATEMENT_BEGIN = intern('linestatement_begin')
-TOKEN_LINESTATEMENT_END = intern('linestatement_end')
-TOKEN_LINECOMMENT_BEGIN = intern('linecomment_begin')
-TOKEN_LINECOMMENT_END = intern('linecomment_end')
-TOKEN_LINECOMMENT = intern('linecomment')
-TOKEN_DATA = intern('data')
-TOKEN_INITIAL = intern('initial')
-TOKEN_EOF = intern('eof')
-
-# bind operators to token types
-operators = {
-    '+':            TOKEN_ADD,
-    '-':            TOKEN_SUB,
-    '/':            TOKEN_DIV,
-    '//':           TOKEN_FLOORDIV,
-    '*':            TOKEN_MUL,
-    '%':            TOKEN_MOD,
-    '**':           TOKEN_POW,
-    '~':            TOKEN_TILDE,
-    '[':            TOKEN_LBRACKET,
-    ']':            TOKEN_RBRACKET,
-    '(':            TOKEN_LPAREN,
-    ')':            TOKEN_RPAREN,
-    '{':            TOKEN_LBRACE,
-    '}':            TOKEN_RBRACE,
-    '==':           TOKEN_EQ,
-    '!=':           TOKEN_NE,
-    '>':            TOKEN_GT,
-    '>=':           TOKEN_GTEQ,
-    '<':            TOKEN_LT,
-    '<=':           TOKEN_LTEQ,
-    '=':            TOKEN_ASSIGN,
-    '.':            TOKEN_DOT,
-    ':':            TOKEN_COLON,
-    '|':            TOKEN_PIPE,
-    ',':            TOKEN_COMMA,
-    ';':            TOKEN_SEMICOLON
-}
-
-reverse_operators = dict([(v, k) for k, v in iteritems(operators)])
-assert len(operators) == len(reverse_operators), 'operators dropped'
-operator_re = re.compile('(%s)' % '|'.join(re.escape(x) for x in
-                         sorted(operators, key=lambda x: -len(x))))
-
-ignored_tokens = frozenset([TOKEN_COMMENT_BEGIN, TOKEN_COMMENT,
-                            TOKEN_COMMENT_END, TOKEN_WHITESPACE,
-                            TOKEN_LINECOMMENT_BEGIN, TOKEN_LINECOMMENT_END,
-                            TOKEN_LINECOMMENT])
-ignore_if_empty = frozenset([TOKEN_WHITESPACE, TOKEN_DATA,
-                             TOKEN_COMMENT, TOKEN_LINECOMMENT])
-
-
-def _describe_token_type(token_type):
-    if token_type in reverse_operators:
-        return reverse_operators[token_type]
-    return {
-        TOKEN_COMMENT_BEGIN:        'begin of comment',
-        TOKEN_COMMENT_END:          'end of comment',
-        TOKEN_COMMENT:              'comment',
-        TOKEN_LINECOMMENT:          'comment',
-        TOKEN_BLOCK_BEGIN:          'begin of statement block',
-        TOKEN_BLOCK_END:            'end of statement block',
-        TOKEN_VARIABLE_BEGIN:       'begin of print statement',
-        TOKEN_VARIABLE_END:         'end of print statement',
-        TOKEN_LINESTATEMENT_BEGIN:  'begin of line statement',
-        TOKEN_LINESTATEMENT_END:    'end of line statement',
-        TOKEN_DATA:                 'template data / text',
-        TOKEN_EOF:                  'end of template'
-    }.get(token_type, token_type)
-
-
-def describe_token(token):
-    """Returns a description of the token."""
-    if token.type == 'name':
-        return token.value
-    return _describe_token_type(token.type)
-
-
-def describe_token_expr(expr):
-    """Like `describe_token` but for token expressions."""
-    if ':' in expr:
-        type, value = expr.split(':', 1)
-        if type == 'name':
-            return value
-    else:
-        type = expr
-    return _describe_token_type(type)
-
-
-def count_newlines(value):
-    """Count the number of newline characters in the string.  This is
-    useful for extensions that filter a stream.
-    """
-    return len(newline_re.findall(value))
-
-
-def compile_rules(environment):
-    """Compiles all the rules from the environment into a list of rules."""
-    e = re.escape
-    rules = [
-        (len(environment.comment_start_string), 'comment',
-         e(environment.comment_start_string)),
-        (len(environment.block_start_string), 'block',
-         e(environment.block_start_string)),
-        (len(environment.variable_start_string), 'variable',
-         e(environment.variable_start_string))
-    ]
-
-    if environment.line_statement_prefix is not None:
-        rules.append((len(environment.line_statement_prefix), 'linestatement',
-                      r'^[ \t\v]*' + e(environment.line_statement_prefix)))
-    if environment.line_comment_prefix is not None:
-        rules.append((len(environment.line_comment_prefix), 'linecomment',
-                      r'(?:^|(?<=\S))[^\S\r\n]*' +
-                      e(environment.line_comment_prefix)))
-
-    return [x[1:] for x in sorted(rules, reverse=True)]
-
-
-class Failure(object):
-    """Class that raises a `TemplateSyntaxError` if called.
-    Used by the `Lexer` to specify known errors.
-    """
-
-    def __init__(self, message, cls=TemplateSyntaxError):
-        self.message = message
-        self.error_class = cls
-
-    def __call__(self, lineno, filename):
-        raise self.error_class(self.message, lineno, filename)
-
-
-class Token(tuple):
-    """Token class."""
-    __slots__ = ()
-    lineno, type, value = (property(itemgetter(x)) for x in range(3))
-
-    def __new__(cls, lineno, type, value):
-        return tuple.__new__(cls, (lineno, intern(str(type)), value))
-
-    def __str__(self):
-        if self.type in reverse_operators:
-            return reverse_operators[self.type]
-        elif self.type == 'name':
-            return self.value
-        return self.type
-
-    def test(self, expr):
-        """Test a token against a token expression.  This can either be a
-        token type or ``'token_type:token_value'``.  This can only test
-        against string values and types.
-        """
-        # here we do a regular string equality check as test_any is usually
-        # passed an iterable of not interned strings.
-        if self.type == expr:
-            return True
-        elif ':' in expr:
-            return expr.split(':', 1) == [self.type, self.value]
-        return False
-
-    def test_any(self, *iterable):
-        """Test against multiple token expressions."""
-        for expr in iterable:
-            if self.test(expr):
-                return True
-        return False
-
-    def __repr__(self):
-        return 'Token(%r, %r, %r)' % (
-            self.lineno,
-            self.type,
-            self.value
-        )
-
-
-@implements_iterator
-class TokenStreamIterator(object):
-    """The iterator for tokenstreams.  Iterate over the stream
-    until the eof token is reached.
-    """
-
-    def __init__(self, stream):
-        self.stream = stream
-
-    def __iter__(self):
-        return self
-
-    def __next__(self):
-        token = self.stream.current
-        if token.type is TOKEN_EOF:
-            self.stream.close()
-            raise StopIteration()
-        next(self.stream)
-        return token
-
-
-@implements_iterator
-class TokenStream(object):
-    """A token stream is an iterable that yields :class:`Token`\s.  The
-    parser however does not iterate over it but calls :meth:`next` to go
-    one token ahead.  The current active token is stored as :attr:`current`.
-    """
-
-    def __init__(self, generator, name, filename):
-        self._iter = iter(generator)
-        self._pushed = deque()
-        self.name = name
-        self.filename = filename
-        self.closed = False
-        self.current = Token(1, TOKEN_INITIAL, '')
-        next(self)
-
-    def __iter__(self):
-        return TokenStreamIterator(self)
-
-    def __bool__(self):
-        return bool(self._pushed) or self.current.type is not TOKEN_EOF
-    __nonzero__ = __bool__  # py2
-
-    eos = property(lambda x: not x, doc="Are we at the end of the stream?")
-
-    def push(self, token):
-        """Push a token back to the stream."""
-        self._pushed.append(token)
-
-    def look(self):
-        """Look at the next token."""
-        old_token = next(self)
-        result = self.current
-        self.push(result)
-        self.current = old_token
-        return result
-
-    def skip(self, n=1):
-        """Got n tokens ahead."""
-        for x in range(n):
-            next(self)
-
-    def next_if(self, expr):
-        """Perform the token test and return the token if it matched.
-        Otherwise the return value is `None`.
-        """
-        if self.current.test(expr):
-            return next(self)
-
-    def skip_if(self, expr):
-        """Like :meth:`next_if` but only returns `True` or `False`."""
-        return self.next_if(expr) is not None
-
-    def __next__(self):
-        """Go one token ahead and return the old one"""
-        rv = self.current
-        if self._pushed:
-            self.current = self._pushed.popleft()
-        elif self.current.type is not TOKEN_EOF:
-            try:
-                self.current = next(self._iter)
-            except StopIteration:
-                self.close()
-        return rv
-
-    def close(self):
-        """Close the stream."""
-        self.current = Token(self.current.lineno, TOKEN_EOF, '')
-        self._iter = None
-        self.closed = True
-
-    def expect(self, expr):
-        """Expect a given token type and return it.  This accepts the same
-        argument as :meth:`jinja2.lexer.Token.test`.
-        """
-        if not self.current.test(expr):
-            expr = describe_token_expr(expr)
-            if self.current.type is TOKEN_EOF:
-                raise TemplateSyntaxError('unexpected end of template, '
-                                          'expected %r.' % expr,
-                                          self.current.lineno,
-                                          self.name, self.filename)
-            raise TemplateSyntaxError("expected token %r, got %r" %
-                                      (expr, describe_token(self.current)),
-                                      self.current.lineno,
-                                      self.name, self.filename)
-        try:
-            return self.current
-        finally:
-            next(self)
-
-
-def get_lexer(environment):
-    """Return a lexer which is probably cached."""
-    key = (environment.block_start_string,
-           environment.block_end_string,
-           environment.variable_start_string,
-           environment.variable_end_string,
-           environment.comment_start_string,
-           environment.comment_end_string,
-           environment.line_statement_prefix,
-           environment.line_comment_prefix,
-           environment.trim_blocks,
-           environment.lstrip_blocks,
-           environment.newline_sequence,
-           environment.keep_trailing_newline)
-    lexer = _lexer_cache.get(key)
-    if lexer is None:
-        lexer = Lexer(environment)
-        _lexer_cache[key] = lexer
-    return lexer
-
-
-class Lexer(object):
-    """Class that implements a lexer for a given environment. Automatically
-    created by the environment class, usually you don't have to do that.
-
-    Note that the lexer is not automatically bound to an environment.
-    Multiple environments can share the same lexer.
-    """
-
-    def __init__(self, environment):
-        # shortcuts
-        c = lambda x: re.compile(x, re.M | re.S)
-        e = re.escape
-
-        # lexing rules for tags
-        tag_rules = [
-            (whitespace_re, TOKEN_WHITESPACE, None),
-            (float_re, TOKEN_FLOAT, None),
-            (integer_re, TOKEN_INTEGER, None),
-            (name_re, TOKEN_NAME, None),
-            (string_re, TOKEN_STRING, None),
-            (operator_re, TOKEN_OPERATOR, None)
-        ]
-
-        # assemble the root lexing rule. because "|" is ungreedy
-        # we have to sort by length so that the lexer continues working
-        # as expected when we have parsing rules like <% for block and
-        # <%= for variables. (if someone wants asp like syntax)
-        # variables are just part of the rules if variable processing
-        # is required.
-        root_tag_rules = compile_rules(environment)
-
-        # block suffix if trimming is enabled
-        block_suffix_re = environment.trim_blocks and '\\n?' or ''
-
-        # strip leading spaces if lstrip_blocks is enabled
-        prefix_re = {}
-        if environment.lstrip_blocks:
-            # use '{%+' to manually disable lstrip_blocks behavior
-            no_lstrip_re = e('+')
-            # detect overlap between block and variable or comment strings
-            block_diff = c(r'^%s(.*)' % e(environment.block_start_string))
-            # make sure we don't mistake a block for a variable or a comment
-            m = block_diff.match(environment.comment_start_string)
-            no_lstrip_re += m and r'|%s' % e(m.group(1)) or ''
-            m = block_diff.match(environment.variable_start_string)
-            no_lstrip_re += m and r'|%s' % e(m.group(1)) or ''
-
-            # detect overlap between comment and variable strings
-            comment_diff = c(r'^%s(.*)' % e(environment.comment_start_string))
-            m = comment_diff.match(environment.variable_start_string)
-            no_variable_re = m and r'(?!%s)' % e(m.group(1)) or ''
-
-            lstrip_re = r'^[ \t]*'
-            block_prefix_re = r'%s%s(?!%s)|%s\+?' % (
-                    lstrip_re,
-                    e(environment.block_start_string),
-                    no_lstrip_re,
-                    e(environment.block_start_string),
-                    )
-            comment_prefix_re = r'%s%s%s|%s\+?' % (
-                    lstrip_re,
-                    e(environment.comment_start_string),
-                    no_variable_re,
-                    e(environment.comment_start_string),
-                    )
-            prefix_re['block'] = block_prefix_re
-            prefix_re['comment'] = comment_prefix_re
-        else:
-            block_prefix_re = '%s' % e(environment.block_start_string)
-
-        self.newline_sequence = environment.newline_sequence
-        self.keep_trailing_newline = environment.keep_trailing_newline
-
-        # global lexing rules
-        self.rules = {
-            'root': [
-                # directives
-                (c('(.*?)(?:%s)' % '|'.join(
-                    [r'(?P<raw_begin>(?:\s*%s\-|%s)\s*raw\s*(?:\-%s\s*|%s))' % (
-                        e(environment.block_start_string),
-                        block_prefix_re,
-                        e(environment.block_end_string),
-                        e(environment.block_end_string)
-                    )] + [
-                        r'(?P<%s_begin>\s*%s\-|%s)' % (n, r, prefix_re.get(n,r))
-                        for n, r in root_tag_rules
-                    ])), (TOKEN_DATA, '#bygroup'), '#bygroup'),
-                # data
-                (c('.+'), TOKEN_DATA, None)
-            ],
-            # comments
-            TOKEN_COMMENT_BEGIN: [
-                (c(r'(.*?)((?:\-%s\s*|%s)%s)' % (
-                    e(environment.comment_end_string),
-                    e(environment.comment_end_string),
-                    block_suffix_re
-                )), (TOKEN_COMMENT, TOKEN_COMMENT_END), '#pop'),
-                (c('(.)'), (Failure('Missing end of comment tag'),), None)
-            ],
-            # blocks
-            TOKEN_BLOCK_BEGIN: [
-                (c('(?:\-%s\s*|%s)%s' % (
-                    e(environment.block_end_string),
-                    e(environment.block_end_string),
-                    block_suffix_re
-                )), TOKEN_BLOCK_END, '#pop'),
-            ] + tag_rules,
-            # variables
-            TOKEN_VARIABLE_BEGIN: [
-                (c('\-%s\s*|%s' % (
-                    e(environment.variable_end_string),
-                    e(environment.variable_end_string)
-                )), TOKEN_VARIABLE_END, '#pop')
-            ] + tag_rules,
-            # raw block
-            TOKEN_RAW_BEGIN: [
-                (c('(.*?)((?:\s*%s\-|%s)\s*endraw\s*(?:\-%s\s*|%s%s))' % (
-                    e(environment.block_start_string),
-                    block_prefix_re,
-                    e(environment.block_end_string),
-                    e(environment.block_end_string),
-                    block_suffix_re
-                )), (TOKEN_DATA, TOKEN_RAW_END), '#pop'),
-                (c('(.)'), (Failure('Missing end of raw directive'),), None)
-            ],
-            # line statements
-            TOKEN_LINESTATEMENT_BEGIN: [
-                (c(r'\s*(\n|$)'), TOKEN_LINESTATEMENT_END, '#pop')
-            ] + tag_rules,
-            # line comments
-            TOKEN_LINECOMMENT_BEGIN: [
-                (c(r'(.*?)()(?=\n|$)'), (TOKEN_LINECOMMENT,
-                 TOKEN_LINECOMMENT_END), '#pop')
-            ]
-        }
-
-    def _normalize_newlines(self, value):
-        """Called for strings and template data to normalize it to unicode."""
-        return newline_re.sub(self.newline_sequence, value)
-
-    def tokenize(self, source, name=None, filename=None, state=None):
-        """Calls tokeniter + tokenize and wraps it in a token stream.
-        """
-        stream = self.tokeniter(source, name, filename, state)
-        return TokenStream(self.wrap(stream, name, filename), name, filename)
-
-    def wrap(self, stream, name=None, filename=None):
-        """This is called with the stream as returned by `tokenize` and wraps
-        every token in a :class:`Token` and converts the value.
-        """
-        for lineno, token, value in stream:
-            if token in ignored_tokens:
-                continue
-            elif token == 'linestatement_begin':
-                token = 'block_begin'
-            elif token == 'linestatement_end':
-                token = 'block_end'
-            # we are not interested in those tokens in the parser
-            elif token in ('raw_begin', 'raw_end'):
-                continue
-            elif token == 'data':
-                value = self._normalize_newlines(value)
-            elif token == 'keyword':
-                token = value
-            elif token == 'name':
-                value = str(value)
-            elif token == 'string':
-                # try to unescape string
-                try:
-                    value = self._normalize_newlines(value[1:-1]) \
-                        .encode('ascii', 'backslashreplace') \
-                        .decode('unicode-escape')
-                except Exception as e:
-                    msg = str(e).split(':')[-1].strip()
-                    raise TemplateSyntaxError(msg, lineno, name, filename)
-                # if we can express it as bytestring (ascii only)
-                # we do that for support of semi broken APIs
-                # as datetime.datetime.strftime.  On python 3 this
-                # call becomes a noop thanks to 2to3
-                if PY2:
-                    try:
-                        value = value.encode('ascii')
-                    except UnicodeError:
-                        pass
-            elif token == 'integer':
-                value = int(value)
-            elif token == 'float':
-                value = float(value)
-            elif token == 'operator':
-                token = operators[value]
-            yield Token(lineno, token, value)
-
-    def tokeniter(self, source, name, filename=None, state=None):
-        """This method tokenizes the text and returns the tokens in a
-        generator.  Use this method if you just want to tokenize a template.
-        """
-        source = text_type(source)
-        lines = source.splitlines()
-        if self.keep_trailing_newline and source:
-            for newline in ('\r\n', '\r', '\n'):
-                if source.endswith(newline):
-                    lines.append('')
-                    break
-        source = '\n'.join(lines)
-        pos = 0
-        lineno = 1
-        stack = ['root']
-        if state is not None and state != 'root':
-            assert state in ('variable', 'block'), 'invalid state'
-            stack.append(state + '_begin')
-        else:
-            state = 'root'
-        statetokens = self.rules[stack[-1]]
-        source_length = len(source)
-
-        balancing_stack = []
-
-        while 1:
-            # tokenizer loop
-            for regex, tokens, new_state in statetokens:
-                m = regex.match(source, pos)
-                # if no match we try again with the next rule
-                if m is None:
-                    continue
-
-                # we only match blocks and variables if braces / parentheses
-                # are balanced. continue parsing with the lower rule which
-                # is the operator rule. do this only if the end tags look
-                # like operators
-                if balancing_stack and \
-                   tokens in ('variable_end', 'block_end',
-                              'linestatement_end'):
-                    continue
-
-                # tuples support more options
-                if isinstance(tokens, tuple):
-                    for idx, token in enumerate(tokens):
-                        # failure group
-                        if token.__class__ is Failure:
-                            raise token(lineno, filename)
-                        # bygroup is a bit more complex, in that case we
-                        # yield for the current token the first named
-                        # group that matched
-                        elif token == '#bygroup':
-                            for key, value in iteritems(m.groupdict()):
-                                if value is not None:
-                                    yield lineno, key, value
-                                    lineno += value.count('\n')
-                                    break
-                            else:
-                                raise RuntimeError('%r wanted to resolve '
-                                                   'the token dynamically'
-                                                   ' but no group matched'
-                                                   % regex)
-                        # normal group
-                        else:
-                            data = m.group(idx + 1)
-                            if data or token not in ignore_if_empty:
-                                yield lineno, token, data
-                            lineno += data.count('\n')
-
-                # strings as token just are yielded as it.
-                else:
-                    data = m.group()
-                    # update brace/parentheses balance
-                    if tokens == 'operator':
-                        if data == '{':
-                            balancing_stack.append('}')
-                        elif data == '(':
-                            balancing_stack.append(')')
-                        elif data == '[':
-                            balancing_stack.append(']')
-                        elif data in ('}', ')', ']'):
-                            if not balancing_stack:
-                                raise TemplateSyntaxError('unexpected \'%s\'' %
-                                                          data, lineno, name,
-                                                          filename)
-                            expected_op = balancing_stack.pop()
-                            if expected_op != data:
-                                raise TemplateSyntaxError('unexpected \'%s\', '
-                                                          'expected \'%s\'' %
-                                                          (data, expected_op),
-                                                          lineno, name,
-                                                          filename)
-                    # yield items
-                    if data or tokens not in ignore_if_empty:
-                        yield lineno, tokens, data
-                    lineno += data.count('\n')
-
-                # fetch new position into new variable so that we can check
-                # if there is a internal parsing error which would result
-                # in an infinite loop
-                pos2 = m.end()
-
-                # handle state changes
-                if new_state is not None:
-                    # remove the uppermost state
-                    if new_state == '#pop':
-                        stack.pop()
-                    # resolve the new state by group checking
-                    elif new_state == '#bygroup':
-                        for key, value in iteritems(m.groupdict()):
-                            if value is not None:
-                                stack.append(key)
-                                break
-                        else:
-                            raise RuntimeError('%r wanted to resolve the '
-                                               'new state dynamically but'
-                                               ' no group matched' %
-                                               regex)
-                    # direct state name given
-                    else:
-                        stack.append(new_state)
-                    statetokens = self.rules[stack[-1]]
-                # we are still at the same position and no stack change.
-                # this means a loop without break condition, avoid that and
-                # raise error
-                elif pos2 == pos:
-                    raise RuntimeError('%r yielded empty string without '
-                                       'stack change' % regex)
-                # publish new function and start again
-                pos = pos2
-                break
-            # if loop terminated without break we haven't found a single match
-            # either we are at the end of the file or we have a problem
-            else:
-                # end of text
-                if pos >= source_length:
-                    return
-                # something went wrong
-                raise TemplateSyntaxError('unexpected char %r at %d' %
-                                          (source[pos], pos), lineno,
-                                          name, filename)
diff --git a/third_party/jinja2/loaders.py b/third_party/jinja2/loaders.py
deleted file mode 100644
index 44aa392..0000000
--- a/third_party/jinja2/loaders.py
+++ /dev/null
@@ -1,481 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    jinja2.loaders
-    ~~~~~~~~~~~~~~
-
-    Jinja loader classes.
-
-    :copyright: (c) 2010 by the Jinja Team.
-    :license: BSD, see LICENSE for more details.
-"""
-import os
-import sys
-import weakref
-from types import ModuleType
-from os import path
-from hashlib import sha1
-from jinja2.exceptions import TemplateNotFound
-from jinja2.utils import open_if_exists, internalcode
-from jinja2._compat import string_types, iteritems
-
-
-def split_template_path(template):
-    """Split a path into segments and perform a sanity check.  If it detects
-    '..' in the path it will raise a `TemplateNotFound` error.
-    """
-    pieces = []
-    for piece in template.split('/'):
-        if path.sep in piece \
-           or (path.altsep and path.altsep in piece) or \
-           piece == path.pardir:
-            raise TemplateNotFound(template)
-        elif piece and piece != '.':
-            pieces.append(piece)
-    return pieces
-
-
-class BaseLoader(object):
-    """Baseclass for all loaders.  Subclass this and override `get_source` to
-    implement a custom loading mechanism.  The environment provides a
-    `get_template` method that calls the loader's `load` method to get the
-    :class:`Template` object.
-
-    A very basic example for a loader that looks up templates on the file
-    system could look like this::
-
-        from jinja2 import BaseLoader, TemplateNotFound
-        from os.path import join, exists, getmtime
-
-        class MyLoader(BaseLoader):
-
-            def __init__(self, path):
-                self.path = path
-
-            def get_source(self, environment, template):
-                path = join(self.path, template)
-                if not exists(path):
-                    raise TemplateNotFound(template)
-                mtime = getmtime(path)
-                with file(path) as f:
-                    source = f.read().decode('utf-8')
-                return source, path, lambda: mtime == getmtime(path)
-    """
-
-    #: if set to `False` it indicates that the loader cannot provide access
-    #: to the source of templates.
-    #:
-    #: .. versionadded:: 2.4
-    has_source_access = True
-
-    def get_source(self, environment, template):
-        """Get the template source, filename and reload helper for a template.
-        It's passed the environment and template name and has to return a
-        tuple in the form ``(source, filename, uptodate)`` or raise a
-        `TemplateNotFound` error if it can't locate the template.
-
-        The source part of the returned tuple must be the source of the
-        template as unicode string or a ASCII bytestring.  The filename should
-        be the name of the file on the filesystem if it was loaded from there,
-        otherwise `None`.  The filename is used by python for the tracebacks
-        if no loader extension is used.
-
-        The last item in the tuple is the `uptodate` function.  If auto
-        reloading is enabled it's always called to check if the template
-        changed.  No arguments are passed so the function must store the
-        old state somewhere (for example in a closure).  If it returns `False`
-        the template will be reloaded.
-        """
-        if not self.has_source_access:
-            raise RuntimeError('%s cannot provide access to the source' %
-                               self.__class__.__name__)
-        raise TemplateNotFound(template)
-
-    def list_templates(self):
-        """Iterates over all templates.  If the loader does not support that
-        it should raise a :exc:`TypeError` which is the default behavior.
-        """
-        raise TypeError('this loader cannot iterate over all templates')
-
-    @internalcode
-    def load(self, environment, name, globals=None):
-        """Loads a template.  This method looks up the template in the cache
-        or loads one by calling :meth:`get_source`.  Subclasses should not
-        override this method as loaders working on collections of other
-        loaders (such as :class:`PrefixLoader` or :class:`ChoiceLoader`)
-        will not call this method but `get_source` directly.
-        """
-        code = None
-        if globals is None:
-            globals = {}
-
-        # first we try to get the source for this template together
-        # with the filename and the uptodate function.
-        source, filename, uptodate = self.get_source(environment, name)
-
-        # try to load the code from the bytecode cache if there is a
-        # bytecode cache configured.
-        bcc = environment.bytecode_cache
-        if bcc is not None:
-            bucket = bcc.get_bucket(environment, name, filename, source)
-            code = bucket.code
-
-        # if we don't have code so far (not cached, no longer up to
-        # date) etc. we compile the template
-        if code is None:
-            code = environment.compile(source, name, filename)
-
-        # if the bytecode cache is available and the bucket doesn't
-        # have a code so far, we give the bucket the new code and put
-        # it back to the bytecode cache.
-        if bcc is not None and bucket.code is None:
-            bucket.code = code
-            bcc.set_bucket(bucket)
-
-        return environment.template_class.from_code(environment, code,
-                                                    globals, uptodate)
-
-
-class FileSystemLoader(BaseLoader):
-    """Loads templates from the file system.  This loader can find templates
-    in folders on the file system and is the preferred way to load them.
-
-    The loader takes the path to the templates as string, or if multiple
-    locations are wanted a list of them which is then looked up in the
-    given order::
-
-    >>> loader = FileSystemLoader('/path/to/templates')
-    >>> loader = FileSystemLoader(['/path/to/templates', '/other/path'])
-
-    Per default the template encoding is ``'utf-8'`` which can be changed
-    by setting the `encoding` parameter to something else.
-
-    To follow symbolic links, set the *followlinks* parameter to ``True``::
-
-    >>> loader = FileSystemLoader('/path/to/templates', followlinks=True)
-
-    .. versionchanged:: 2.8+
-       The *followlinks* parameter was added.
-    """
-
-    def __init__(self, searchpath, encoding='utf-8', followlinks=False):
-        if isinstance(searchpath, string_types):
-            searchpath = [searchpath]
-        self.searchpath = list(searchpath)
-        self.encoding = encoding
-        self.followlinks = followlinks
-
-    def get_source(self, environment, template):
-        pieces = split_template_path(template)
-        for searchpath in self.searchpath:
-            filename = path.join(searchpath, *pieces)
-            f = open_if_exists(filename)
-            if f is None:
-                continue
-            try:
-                contents = f.read().decode(self.encoding)
-            finally:
-                f.close()
-
-            mtime = path.getmtime(filename)
-
-            def uptodate():
-                try:
-                    return path.getmtime(filename) == mtime
-                except OSError:
-                    return False
-            return contents, filename, uptodate
-        raise TemplateNotFound(template)
-
-    def list_templates(self):
-        found = set()
-        for searchpath in self.searchpath:
-            walk_dir = os.walk(searchpath, followlinks=self.followlinks)
-            for dirpath, dirnames, filenames in walk_dir:
-                for filename in filenames:
-                    template = os.path.join(dirpath, filename) \
-                        [len(searchpath):].strip(os.path.sep) \
-                                          .replace(os.path.sep, '/')
-                    if template[:2] == './':
-                        template = template[2:]
-                    if template not in found:
-                        found.add(template)
-        return sorted(found)
-
-
-class PackageLoader(BaseLoader):
-    """Load templates from python eggs or packages.  It is constructed with
-    the name of the python package and the path to the templates in that
-    package::
-
-        loader = PackageLoader('mypackage', 'views')
-
-    If the package path is not given, ``'templates'`` is assumed.
-
-    Per default the template encoding is ``'utf-8'`` which can be changed
-    by setting the `encoding` parameter to something else.  Due to the nature
-    of eggs it's only possible to reload templates if the package was loaded
-    from the file system and not a zip file.
-    """
-
-    def __init__(self, package_name, package_path='templates',
-                 encoding='utf-8'):
-        from pkg_resources import DefaultProvider, ResourceManager, \
-                                  get_provider
-        provider = get_provider(package_name)
-        self.encoding = encoding
-        self.manager = ResourceManager()
-        self.filesystem_bound = isinstance(provider, DefaultProvider)
-        self.provider = provider
-        self.package_path = package_path
-
-    def get_source(self, environment, template):
-        pieces = split_template_path(template)
-        p = '/'.join((self.package_path,) + tuple(pieces))
-        if not self.provider.has_resource(p):
-            raise TemplateNotFound(template)
-
-        filename = uptodate = None
-        if self.filesystem_bound:
-            filename = self.provider.get_resource_filename(self.manager, p)
-            mtime = path.getmtime(filename)
-            def uptodate():
-                try:
-                    return path.getmtime(filename) == mtime
-                except OSError:
-                    return False
-
-        source = self.provider.get_resource_string(self.manager, p)
-        return source.decode(self.encoding), filename, uptodate
-
-    def list_templates(self):
-        path = self.package_path
-        if path[:2] == './':
-            path = path[2:]
-        elif path == '.':
-            path = ''
-        offset = len(path)
-        results = []
-        def _walk(path):
-            for filename in self.provider.resource_listdir(path):
-                fullname = path + '/' + filename
-                if self.provider.resource_isdir(fullname):
-                    _walk(fullname)
-                else:
-                    results.append(fullname[offset:].lstrip('/'))
-        _walk(path)
-        results.sort()
-        return results
-
-
-class DictLoader(BaseLoader):
-    """Loads a template from a python dict.  It's passed a dict of unicode
-    strings bound to template names.  This loader is useful for unittesting:
-
-    >>> loader = DictLoader({'index.html': 'source here'})
-
-    Because auto reloading is rarely useful this is disabled per default.
-    """
-
-    def __init__(self, mapping):
-        self.mapping = mapping
-
-    def get_source(self, environment, template):
-        if template in self.mapping:
-            source = self.mapping[template]
-            return source, None, lambda: source == self.mapping.get(template)
-        raise TemplateNotFound(template)
-
-    def list_templates(self):
-        return sorted(self.mapping)
-
-
-class FunctionLoader(BaseLoader):
-    """A loader that is passed a function which does the loading.  The
-    function receives the name of the template and has to return either
-    an unicode string with the template source, a tuple in the form ``(source,
-    filename, uptodatefunc)`` or `None` if the template does not exist.
-
-    >>> def load_template(name):
-    ...     if name == 'index.html':
-    ...         return '...'
-    ...
-    >>> loader = FunctionLoader(load_template)
-
-    The `uptodatefunc` is a function that is called if autoreload is enabled
-    and has to return `True` if the template is still up to date.  For more
-    details have a look at :meth:`BaseLoader.get_source` which has the same
-    return value.
-    """
-
-    def __init__(self, load_func):
-        self.load_func = load_func
-
-    def get_source(self, environment, template):
-        rv = self.load_func(template)
-        if rv is None:
-            raise TemplateNotFound(template)
-        elif isinstance(rv, string_types):
-            return rv, None, None
-        return rv
-
-
-class PrefixLoader(BaseLoader):
-    """A loader that is passed a dict of loaders where each loader is bound
-    to a prefix.  The prefix is delimited from the template by a slash per
-    default, which can be changed by setting the `delimiter` argument to
-    something else::
-
-        loader = PrefixLoader({
-            'app1':     PackageLoader('mypackage.app1'),
-            'app2':     PackageLoader('mypackage.app2')
-        })
-
-    By loading ``'app1/index.html'`` the file from the app1 package is loaded,
-    by loading ``'app2/index.html'`` the file from the second.
-    """
-
-    def __init__(self, mapping, delimiter='/'):
-        self.mapping = mapping
-        self.delimiter = delimiter
-
-    def get_loader(self, template):
-        try:
-            prefix, name = template.split(self.delimiter, 1)
-            loader = self.mapping[prefix]
-        except (ValueError, KeyError):
-            raise TemplateNotFound(template)
-        return loader, name
-
-    def get_source(self, environment, template):
-        loader, name = self.get_loader(template)
-        try:
-            return loader.get_source(environment, name)
-        except TemplateNotFound:
-            # re-raise the exception with the correct fileame here.
-            # (the one that includes the prefix)
-            raise TemplateNotFound(template)
-
-    @internalcode
-    def load(self, environment, name, globals=None):
-        loader, local_name = self.get_loader(name)
-        try:
-            return loader.load(environment, local_name, globals)
-        except TemplateNotFound:
-            # re-raise the exception with the correct fileame here.
-            # (the one that includes the prefix)
-            raise TemplateNotFound(name)
-
-    def list_templates(self):
-        result = []
-        for prefix, loader in iteritems(self.mapping):
-            for template in loader.list_templates():
-                result.append(prefix + self.delimiter + template)
-        return result
-
-
-class ChoiceLoader(BaseLoader):
-    """This loader works like the `PrefixLoader` just that no prefix is
-    specified.  If a template could not be found by one loader the next one
-    is tried.
-
-    >>> loader = ChoiceLoader([
-    ...     FileSystemLoader('/path/to/user/templates'),
-    ...     FileSystemLoader('/path/to/system/templates')
-    ... ])
-
-    This is useful if you want to allow users to override builtin templates
-    from a different location.
-    """
-
-    def __init__(self, loaders):
-        self.loaders = loaders
-
-    def get_source(self, environment, template):
-        for loader in self.loaders:
-            try:
-                return loader.get_source(environment, template)
-            except TemplateNotFound:
-                pass
-        raise TemplateNotFound(template)
-
-    @internalcode
-    def load(self, environment, name, globals=None):
-        for loader in self.loaders:
-            try:
-                return loader.load(environment, name, globals)
-            except TemplateNotFound:
-                pass
-        raise TemplateNotFound(name)
-
-    def list_templates(self):
-        found = set()
-        for loader in self.loaders:
-            found.update(loader.list_templates())
-        return sorted(found)
-
-
-class _TemplateModule(ModuleType):
-    """Like a normal module but with support for weak references"""
-
-
-class ModuleLoader(BaseLoader):
-    """This loader loads templates from precompiled templates.
-
-    Example usage:
-
-    >>> loader = ChoiceLoader([
-    ...     ModuleLoader('/path/to/compiled/templates'),
-    ...     FileSystemLoader('/path/to/templates')
-    ... ])
-
-    Templates can be precompiled with :meth:`Environment.compile_templates`.
-    """
-
-    has_source_access = False
-
-    def __init__(self, path):
-        package_name = '_jinja2_module_templates_%x' % id(self)
-
-        # create a fake module that looks for the templates in the
-        # path given.
-        mod = _TemplateModule(package_name)
-        if isinstance(path, string_types):
-            path = [path]
-        else:
-            path = list(path)
-        mod.__path__ = path
-
-        sys.modules[package_name] = weakref.proxy(mod,
-            lambda x: sys.modules.pop(package_name, None))
-
-        # the only strong reference, the sys.modules entry is weak
-        # so that the garbage collector can remove it once the
-        # loader that created it goes out of business.
-        self.module = mod
-        self.package_name = package_name
-
-    @staticmethod
-    def get_template_key(name):
-        return 'tmpl_' + sha1(name.encode('utf-8')).hexdigest()
-
-    @staticmethod
-    def get_module_filename(name):
-        return ModuleLoader.get_template_key(name) + '.py'
-
-    @internalcode
-    def load(self, environment, name, globals=None):
-        key = self.get_template_key(name)
-        module = '%s.%s' % (self.package_name, key)
-        mod = getattr(self.module, module, None)
-        if mod is None:
-            try:
-                mod = __import__(module, None, None, ['root'])
-            except ImportError:
-                raise TemplateNotFound(name)
-
-            # remove the entry from sys.modules, we only want the attribute
-            # on the module object we have stored on the loader.
-            sys.modules.pop(module, None)
-
-        return environment.template_class.from_module_dict(
-            environment, mod.__dict__, globals)
diff --git a/third_party/jinja2/meta.py b/third_party/jinja2/meta.py
deleted file mode 100644
index 3dbab7c..0000000
--- a/third_party/jinja2/meta.py
+++ /dev/null
@@ -1,103 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    jinja2.meta
-    ~~~~~~~~~~~
-
-    This module implements various functions that exposes information about
-    templates that might be interesting for various kinds of applications.
-
-    :copyright: (c) 2010 by the Jinja Team, see AUTHORS for more details.
-    :license: BSD, see LICENSE for more details.
-"""
-from jinja2 import nodes
-from jinja2.compiler import CodeGenerator
-from jinja2._compat import string_types
-
-
-class TrackingCodeGenerator(CodeGenerator):
-    """We abuse the code generator for introspection."""
-
-    def __init__(self, environment):
-        CodeGenerator.__init__(self, environment, '<introspection>',
-                               '<introspection>')
-        self.undeclared_identifiers = set()
-
-    def write(self, x):
-        """Don't write."""
-
-    def pull_locals(self, frame):
-        """Remember all undeclared identifiers."""
-        self.undeclared_identifiers.update(frame.identifiers.undeclared)
-
-
-def find_undeclared_variables(ast):
-    """Returns a set of all variables in the AST that will be looked up from
-    the context at runtime.  Because at compile time it's not known which
-    variables will be used depending on the path the execution takes at
-    runtime, all variables are returned.
-
-    >>> from jinja2 import Environment, meta
-    >>> env = Environment()
-    >>> ast = env.parse('{% set foo = 42 %}{{ bar + foo }}')
-    >>> meta.find_undeclared_variables(ast) == set(['bar'])
-    True
-
-    .. admonition:: Implementation
-
-       Internally the code generator is used for finding undeclared variables.
-       This is good to know because the code generator might raise a
-       :exc:`TemplateAssertionError` during compilation and as a matter of
-       fact this function can currently raise that exception as well.
-    """
-    codegen = TrackingCodeGenerator(ast.environment)
-    codegen.visit(ast)
-    return codegen.undeclared_identifiers
-
-
-def find_referenced_templates(ast):
-    """Finds all the referenced templates from the AST.  This will return an
-    iterator over all the hardcoded template extensions, inclusions and
-    imports.  If dynamic inheritance or inclusion is used, `None` will be
-    yielded.
-
-    >>> from jinja2 import Environment, meta
-    >>> env = Environment()
-    >>> ast = env.parse('{% extends "layout.html" %}{% include helper %}')
-    >>> list(meta.find_referenced_templates(ast))
-    ['layout.html', None]
-
-    This function is useful for dependency tracking.  For example if you want
-    to rebuild parts of the website after a layout template has changed.
-    """
-    for node in ast.find_all((nodes.Extends, nodes.FromImport, nodes.Import,
-                              nodes.Include)):
-        if not isinstance(node.template, nodes.Const):
-            # a tuple with some non consts in there
-            if isinstance(node.template, (nodes.Tuple, nodes.List)):
-                for template_name in node.template.items:
-                    # something const, only yield the strings and ignore
-                    # non-string consts that really just make no sense
-                    if isinstance(template_name, nodes.Const):
-                        if isinstance(template_name.value, string_types):
-                            yield template_name.value
-                    # something dynamic in there
-                    else:
-                        yield None
-            # something dynamic we don't know about here
-            else:
-                yield None
-            continue
-        # constant is a basestring, direct template name
-        if isinstance(node.template.value, string_types):
-            yield node.template.value
-        # a tuple or list (latter *should* not happen) made of consts,
-        # yield the consts that are strings.  We could warn here for
-        # non string values
-        elif isinstance(node, nodes.Include) and \
-             isinstance(node.template.value, (tuple, list)):
-            for template_name in node.template.value:
-                if isinstance(template_name, string_types):
-                    yield template_name
-        # something else we don't care about, we could warn here
-        else:
-            yield None
diff --git a/third_party/jinja2/nodes.py b/third_party/jinja2/nodes.py
deleted file mode 100644
index d32046c..0000000
--- a/third_party/jinja2/nodes.py
+++ /dev/null
@@ -1,919 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    jinja2.nodes
-    ~~~~~~~~~~~~
-
-    This module implements additional nodes derived from the ast base node.
-
-    It also provides some node tree helper functions like `in_lineno` and
-    `get_nodes` used by the parser and translator in order to normalize
-    python and jinja nodes.
-
-    :copyright: (c) 2010 by the Jinja Team.
-    :license: BSD, see LICENSE for more details.
-"""
-import types
-import operator
-
-from collections import deque
-from jinja2.utils import Markup
-from jinja2._compat import izip, with_metaclass, text_type
-
-
-#: the types we support for context functions
-_context_function_types = (types.FunctionType, types.MethodType)
-
-
-_binop_to_func = {
-    '*':        operator.mul,
-    '/':        operator.truediv,
-    '//':       operator.floordiv,
-    '**':       operator.pow,
-    '%':        operator.mod,
-    '+':        operator.add,
-    '-':        operator.sub
-}
-
-_uaop_to_func = {
-    'not':      operator.not_,
-    '+':        operator.pos,
-    '-':        operator.neg
-}
-
-_cmpop_to_func = {
-    'eq':       operator.eq,
-    'ne':       operator.ne,
-    'gt':       operator.gt,
-    'gteq':     operator.ge,
-    'lt':       operator.lt,
-    'lteq':     operator.le,
-    'in':       lambda a, b: a in b,
-    'notin':    lambda a, b: a not in b
-}
-
-
-class Impossible(Exception):
-    """Raised if the node could not perform a requested action."""
-
-
-class NodeType(type):
-    """A metaclass for nodes that handles the field and attribute
-    inheritance.  fields and attributes from the parent class are
-    automatically forwarded to the child."""
-
-    def __new__(cls, name, bases, d):
-        for attr in 'fields', 'attributes':
-            storage = []
-            storage.extend(getattr(bases[0], attr, ()))
-            storage.extend(d.get(attr, ()))
-            assert len(bases) == 1, 'multiple inheritance not allowed'
-            assert len(storage) == len(set(storage)), 'layout conflict'
-            d[attr] = tuple(storage)
-        d.setdefault('abstract', False)
-        return type.__new__(cls, name, bases, d)
-
-
-class EvalContext(object):
-    """Holds evaluation time information.  Custom attributes can be attached
-    to it in extensions.
-    """
-
-    def __init__(self, environment, template_name=None):
-        self.environment = environment
-        if callable(environment.autoescape):
-            self.autoescape = environment.autoescape(template_name)
-        else:
-            self.autoescape = environment.autoescape
-        self.volatile = False
-
-    def save(self):
-        return self.__dict__.copy()
-
-    def revert(self, old):
-        self.__dict__.clear()
-        self.__dict__.update(old)
-
-
-def get_eval_context(node, ctx):
-    if ctx is None:
-        if node.environment is None:
-            raise RuntimeError('if no eval context is passed, the '
-                               'node must have an attached '
-                               'environment.')
-        return EvalContext(node.environment)
-    return ctx
-
-
-class Node(with_metaclass(NodeType, object)):
-    """Baseclass for all Jinja2 nodes.  There are a number of nodes available
-    of different types.  There are four major types:
-
-    -   :class:`Stmt`: statements
-    -   :class:`Expr`: expressions
-    -   :class:`Helper`: helper nodes
-    -   :class:`Template`: the outermost wrapper node
-
-    All nodes have fields and attributes.  Fields may be other nodes, lists,
-    or arbitrary values.  Fields are passed to the constructor as regular
-    positional arguments, attributes as keyword arguments.  Each node has
-    two attributes: `lineno` (the line number of the node) and `environment`.
-    The `environment` attribute is set at the end of the parsing process for
-    all nodes automatically.
-    """
-    fields = ()
-    attributes = ('lineno', 'environment')
-    abstract = True
-
-    def __init__(self, *fields, **attributes):
-        if self.abstract:
-            raise TypeError('abstract nodes are not instanciable')
-        if fields:
-            if len(fields) != len(self.fields):
-                if not self.fields:
-                    raise TypeError('%r takes 0 arguments' %
-                                    self.__class__.__name__)
-                raise TypeError('%r takes 0 or %d argument%s' % (
-                    self.__class__.__name__,
-                    len(self.fields),
-                    len(self.fields) != 1 and 's' or ''
-                ))
-            for name, arg in izip(self.fields, fields):
-                setattr(self, name, arg)
-        for attr in self.attributes:
-            setattr(self, attr, attributes.pop(attr, None))
-        if attributes:
-            raise TypeError('unknown attribute %r' %
-                            next(iter(attributes)))
-
-    def iter_fields(self, exclude=None, only=None):
-        """This method iterates over all fields that are defined and yields
-        ``(key, value)`` tuples.  Per default all fields are returned, but
-        it's possible to limit that to some fields by providing the `only`
-        parameter or to exclude some using the `exclude` parameter.  Both
-        should be sets or tuples of field names.
-        """
-        for name in self.fields:
-            if (exclude is only is None) or \
-               (exclude is not None and name not in exclude) or \
-               (only is not None and name in only):
-                try:
-                    yield name, getattr(self, name)
-                except AttributeError:
-                    pass
-
-    def iter_child_nodes(self, exclude=None, only=None):
-        """Iterates over all direct child nodes of the node.  This iterates
-        over all fields and yields the values of they are nodes.  If the value
-        of a field is a list all the nodes in that list are returned.
-        """
-        for field, item in self.iter_fields(exclude, only):
-            if isinstance(item, list):
-                for n in item:
-                    if isinstance(n, Node):
-                        yield n
-            elif isinstance(item, Node):
-                yield item
-
-    def find(self, node_type):
-        """Find the first node of a given type.  If no such node exists the
-        return value is `None`.
-        """
-        for result in self.find_all(node_type):
-            return result
-
-    def find_all(self, node_type):
-        """Find all the nodes of a given type.  If the type is a tuple,
-        the check is performed for any of the tuple items.
-        """
-        for child in self.iter_child_nodes():
-            if isinstance(child, node_type):
-                yield child
-            for result in child.find_all(node_type):
-                yield result
-
-    def set_ctx(self, ctx):
-        """Reset the context of a node and all child nodes.  Per default the
-        parser will all generate nodes that have a 'load' context as it's the
-        most common one.  This method is used in the parser to set assignment
-        targets and other nodes to a store context.
-        """
-        todo = deque([self])
-        while todo:
-            node = todo.popleft()
-            if 'ctx' in node.fields:
-                node.ctx = ctx
-            todo.extend(node.iter_child_nodes())
-        return self
-
-    def set_lineno(self, lineno, override=False):
-        """Set the line numbers of the node and children."""
-        todo = deque([self])
-        while todo:
-            node = todo.popleft()
-            if 'lineno' in node.attributes:
-                if node.lineno is None or override:
-                    node.lineno = lineno
-            todo.extend(node.iter_child_nodes())
-        return self
-
-    def set_environment(self, environment):
-        """Set the environment for all nodes."""
-        todo = deque([self])
-        while todo:
-            node = todo.popleft()
-            node.environment = environment
-            todo.extend(node.iter_child_nodes())
-        return self
-
-    def __eq__(self, other):
-        return type(self) is type(other) and \
-               tuple(self.iter_fields()) == tuple(other.iter_fields())
-
-    def __ne__(self, other):
-        return not self.__eq__(other)
-
-    # Restore Python 2 hashing behavior on Python 3
-    __hash__ = object.__hash__
-
-    def __repr__(self):
-        return '%s(%s)' % (
-            self.__class__.__name__,
-            ', '.join('%s=%r' % (arg, getattr(self, arg, None)) for
-                      arg in self.fields)
-        )
-
-
-class Stmt(Node):
-    """Base node for all statements."""
-    abstract = True
-
-
-class Helper(Node):
-    """Nodes that exist in a specific context only."""
-    abstract = True
-
-
-class Template(Node):
-    """Node that represents a template.  This must be the outermost node that
-    is passed to the compiler.
-    """
-    fields = ('body',)
-
-
-class Output(Stmt):
-    """A node that holds multiple expressions which are then printed out.
-    This is used both for the `print` statement and the regular template data.
-    """
-    fields = ('nodes',)
-
-
-class Extends(Stmt):
-    """Represents an extends statement."""
-    fields = ('template',)
-
-
-class For(Stmt):
-    """The for loop.  `target` is the target for the iteration (usually a
-    :class:`Name` or :class:`Tuple`), `iter` the iterable.  `body` is a list
-    of nodes that are used as loop-body, and `else_` a list of nodes for the
-    `else` block.  If no else node exists it has to be an empty list.
-
-    For filtered nodes an expression can be stored as `test`, otherwise `None`.
-    """
-    fields = ('target', 'iter', 'body', 'else_', 'test', 'recursive')
-
-
-class If(Stmt):
-    """If `test` is true, `body` is rendered, else `else_`."""
-    fields = ('test', 'body', 'else_')
-
-
-class Macro(Stmt):
-    """A macro definition.  `name` is the name of the macro, `args` a list of
-    arguments and `defaults` a list of defaults if there are any.  `body` is
-    a list of nodes for the macro body.
-    """
-    fields = ('name', 'args', 'defaults', 'body')
-
-
-class CallBlock(Stmt):
-    """Like a macro without a name but a call instead.  `call` is called with
-    the unnamed macro as `caller` argument this node holds.
-    """
-    fields = ('call', 'args', 'defaults', 'body')
-
-
-class FilterBlock(Stmt):
-    """Node for filter sections."""
-    fields = ('body', 'filter')
-
-
-class Block(Stmt):
-    """A node that represents a block."""
-    fields = ('name', 'body', 'scoped')
-
-
-class Include(Stmt):
-    """A node that represents the include tag."""
-    fields = ('template', 'with_context', 'ignore_missing')
-
-
-class Import(Stmt):
-    """A node that represents the import tag."""
-    fields = ('template', 'target', 'with_context')
-
-
-class FromImport(Stmt):
-    """A node that represents the from import tag.  It's important to not
-    pass unsafe names to the name attribute.  The compiler translates the
-    attribute lookups directly into getattr calls and does *not* use the
-    subscript callback of the interface.  As exported variables may not
-    start with double underscores (which the parser asserts) this is not a
-    problem for regular Jinja code, but if this node is used in an extension
-    extra care must be taken.
-
-    The list of names may contain tuples if aliases are wanted.
-    """
-    fields = ('template', 'names', 'with_context')
-
-
-class ExprStmt(Stmt):
-    """A statement that evaluates an expression and discards the result."""
-    fields = ('node',)
-
-
-class Assign(Stmt):
-    """Assigns an expression to a target."""
-    fields = ('target', 'node')
-
-
-class AssignBlock(Stmt):
-    """Assigns a block to a target."""
-    fields = ('target', 'body')
-
-
-class Expr(Node):
-    """Baseclass for all expressions."""
-    abstract = True
-
-    def as_const(self, eval_ctx=None):
-        """Return the value of the expression as constant or raise
-        :exc:`Impossible` if this was not possible.
-
-        An :class:`EvalContext` can be provided, if none is given
-        a default context is created which requires the nodes to have
-        an attached environment.
-
-        .. versionchanged:: 2.4
-           the `eval_ctx` parameter was added.
-        """
-        raise Impossible()
-
-    def can_assign(self):
-        """Check if it's possible to assign something to this node."""
-        return False
-
-
-class BinExpr(Expr):
-    """Baseclass for all binary expressions."""
-    fields = ('left', 'right')
-    operator = None
-    abstract = True
-
-    def as_const(self, eval_ctx=None):
-        eval_ctx = get_eval_context(self, eval_ctx)
-        # intercepted operators cannot be folded at compile time
-        if self.environment.sandboxed and \
-           self.operator in self.environment.intercepted_binops:
-            raise Impossible()
-        f = _binop_to_func[self.operator]
-        try:
-            return f(self.left.as_const(eval_ctx), self.right.as_const(eval_ctx))
-        except Exception:
-            raise Impossible()
-
-
-class UnaryExpr(Expr):
-    """Baseclass for all unary expressions."""
-    fields = ('node',)
-    operator = None
-    abstract = True
-
-    def as_const(self, eval_ctx=None):
-        eval_ctx = get_eval_context(self, eval_ctx)
-        # intercepted operators cannot be folded at compile time
-        if self.environment.sandboxed and \
-           self.operator in self.environment.intercepted_unops:
-            raise Impossible()
-        f = _uaop_to_func[self.operator]
-        try:
-            return f(self.node.as_const(eval_ctx))
-        except Exception:
-            raise Impossible()
-
-
-class Name(Expr):
-    """Looks up a name or stores a value in a name.
-    The `ctx` of the node can be one of the following values:
-
-    -   `store`: store a value in the name
-    -   `load`: load that name
-    -   `param`: like `store` but if the name was defined as function parameter.
-    """
-    fields = ('name', 'ctx')
-
-    def can_assign(self):
-        return self.name not in ('true', 'false', 'none',
-                                 'True', 'False', 'None')
-
-
-class Literal(Expr):
-    """Baseclass for literals."""
-    abstract = True
-
-
-class Const(Literal):
-    """All constant values.  The parser will return this node for simple
-    constants such as ``42`` or ``"foo"`` but it can be used to store more
-    complex values such as lists too.  Only constants with a safe
-    representation (objects where ``eval(repr(x)) == x`` is true).
-    """
-    fields = ('value',)
-
-    def as_const(self, eval_ctx=None):
-        return self.value
-
-    @classmethod
-    def from_untrusted(cls, value, lineno=None, environment=None):
-        """Return a const object if the value is representable as
-        constant value in the generated code, otherwise it will raise
-        an `Impossible` exception.
-        """
-        from .compiler import has_safe_repr
-        if not has_safe_repr(value):
-            raise Impossible()
-        return cls(value, lineno=lineno, environment=environment)
-
-
-class TemplateData(Literal):
-    """A constant template string."""
-    fields = ('data',)
-
-    def as_const(self, eval_ctx=None):
-        eval_ctx = get_eval_context(self, eval_ctx)
-        if eval_ctx.volatile:
-            raise Impossible()
-        if eval_ctx.autoescape:
-            return Markup(self.data)
-        return self.data
-
-
-class Tuple(Literal):
-    """For loop unpacking and some other things like multiple arguments
-    for subscripts.  Like for :class:`Name` `ctx` specifies if the tuple
-    is used for loading the names or storing.
-    """
-    fields = ('items', 'ctx')
-
-    def as_const(self, eval_ctx=None):
-        eval_ctx = get_eval_context(self, eval_ctx)
-        return tuple(x.as_const(eval_ctx) for x in self.items)
-
-    def can_assign(self):
-        for item in self.items:
-            if not item.can_assign():
-                return False
-        return True
-
-
-class List(Literal):
-    """Any list literal such as ``[1, 2, 3]``"""
-    fields = ('items',)
-
-    def as_const(self, eval_ctx=None):
-        eval_ctx = get_eval_context(self, eval_ctx)
-        return [x.as_const(eval_ctx) for x in self.items]
-
-
-class Dict(Literal):
-    """Any dict literal such as ``{1: 2, 3: 4}``.  The items must be a list of
-    :class:`Pair` nodes.
-    """
-    fields = ('items',)
-
-    def as_const(self, eval_ctx=None):
-        eval_ctx = get_eval_context(self, eval_ctx)
-        return dict(x.as_const(eval_ctx) for x in self.items)
-
-
-class Pair(Helper):
-    """A key, value pair for dicts."""
-    fields = ('key', 'value')
-
-    def as_const(self, eval_ctx=None):
-        eval_ctx = get_eval_context(self, eval_ctx)
-        return self.key.as_const(eval_ctx), self.value.as_const(eval_ctx)
-
-
-class Keyword(Helper):
-    """A key, value pair for keyword arguments where key is a string."""
-    fields = ('key', 'value')
-
-    def as_const(self, eval_ctx=None):
-        eval_ctx = get_eval_context(self, eval_ctx)
-        return self.key, self.value.as_const(eval_ctx)
-
-
-class CondExpr(Expr):
-    """A conditional expression (inline if expression).  (``{{
-    foo if bar else baz }}``)
-    """
-    fields = ('test', 'expr1', 'expr2')
-
-    def as_const(self, eval_ctx=None):
-        eval_ctx = get_eval_context(self, eval_ctx)
-        if self.test.as_const(eval_ctx):
-            return self.expr1.as_const(eval_ctx)
-
-        # if we evaluate to an undefined object, we better do that at runtime
-        if self.expr2 is None:
-            raise Impossible()
-
-        return self.expr2.as_const(eval_ctx)
-
-
-class Filter(Expr):
-    """This node applies a filter on an expression.  `name` is the name of
-    the filter, the rest of the fields are the same as for :class:`Call`.
-
-    If the `node` of a filter is `None` the contents of the last buffer are
-    filtered.  Buffers are created by macros and filter blocks.
-    """
-    fields = ('node', 'name', 'args', 'kwargs', 'dyn_args', 'dyn_kwargs')
-
-    def as_const(self, eval_ctx=None):
-        eval_ctx = get_eval_context(self, eval_ctx)
-        if eval_ctx.volatile or self.node is None:
-            raise Impossible()
-        # we have to be careful here because we call filter_ below.
-        # if this variable would be called filter, 2to3 would wrap the
-        # call in a list beause it is assuming we are talking about the
-        # builtin filter function here which no longer returns a list in
-        # python 3.  because of that, do not rename filter_ to filter!
-        filter_ = self.environment.filters.get(self.name)
-        if filter_ is None or getattr(filter_, 'contextfilter', False):
-            raise Impossible()
-        obj = self.node.as_const(eval_ctx)
-        args = [x.as_const(eval_ctx) for x in self.args]
-        if getattr(filter_, 'evalcontextfilter', False):
-            args.insert(0, eval_ctx)
-        elif getattr(filter_, 'environmentfilter', False):
-            args.insert(0, self.environment)
-        kwargs = dict(x.as_const(eval_ctx) for x in self.kwargs)
-        if self.dyn_args is not None:
-            try:
-                args.extend(self.dyn_args.as_const(eval_ctx))
-            except Exception:
-                raise Impossible()
-        if self.dyn_kwargs is not None:
-            try:
-                kwargs.update(self.dyn_kwargs.as_const(eval_ctx))
-            except Exception:
-                raise Impossible()
-        try:
-            return filter_(obj, *args, **kwargs)
-        except Exception:
-            raise Impossible()
-
-
-class Test(Expr):
-    """Applies a test on an expression.  `name` is the name of the test, the
-    rest of the fields are the same as for :class:`Call`.
-    """
-    fields = ('node', 'name', 'args', 'kwargs', 'dyn_args', 'dyn_kwargs')
-
-
-class Call(Expr):
-    """Calls an expression.  `args` is a list of arguments, `kwargs` a list
-    of keyword arguments (list of :class:`Keyword` nodes), and `dyn_args`
-    and `dyn_kwargs` has to be either `None` or a node that is used as
-    node for dynamic positional (``*args``) or keyword (``**kwargs``)
-    arguments.
-    """
-    fields = ('node', 'args', 'kwargs', 'dyn_args', 'dyn_kwargs')
-
-    def as_const(self, eval_ctx=None):
-        eval_ctx = get_eval_context(self, eval_ctx)
-        if eval_ctx.volatile:
-            raise Impossible()
-        obj = self.node.as_const(eval_ctx)
-
-        # don't evaluate context functions
-        args = [x.as_const(eval_ctx) for x in self.args]
-        if isinstance(obj, _context_function_types):
-            if getattr(obj, 'contextfunction', False):
-                raise Impossible()
-            elif getattr(obj, 'evalcontextfunction', False):
-                args.insert(0, eval_ctx)
-            elif getattr(obj, 'environmentfunction', False):
-                args.insert(0, self.environment)
-
-        kwargs = dict(x.as_const(eval_ctx) for x in self.kwargs)
-        if self.dyn_args is not None:
-            try:
-                args.extend(self.dyn_args.as_const(eval_ctx))
-            except Exception:
-                raise Impossible()
-        if self.dyn_kwargs is not None:
-            try:
-                kwargs.update(self.dyn_kwargs.as_const(eval_ctx))
-            except Exception:
-                raise Impossible()
-        try:
-            return obj(*args, **kwargs)
-        except Exception:
-            raise Impossible()
-
-
-class Getitem(Expr):
-    """Get an attribute or item from an expression and prefer the item."""
-    fields = ('node', 'arg', 'ctx')
-
-    def as_const(self, eval_ctx=None):
-        eval_ctx = get_eval_context(self, eval_ctx)
-        if self.ctx != 'load':
-            raise Impossible()
-        try:
-            return self.environment.getitem(self.node.as_const(eval_ctx),
-                                            self.arg.as_const(eval_ctx))
-        except Exception:
-            raise Impossible()
-
-    def can_assign(self):
-        return False
-
-
-class Getattr(Expr):
-    """Get an attribute or item from an expression that is a ascii-only
-    bytestring and prefer the attribute.
-    """
-    fields = ('node', 'attr', 'ctx')
-
-    def as_const(self, eval_ctx=None):
-        if self.ctx != 'load':
-            raise Impossible()
-        try:
-            eval_ctx = get_eval_context(self, eval_ctx)
-            return self.environment.getattr(self.node.as_const(eval_ctx),
-                                            self.attr)
-        except Exception:
-            raise Impossible()
-
-    def can_assign(self):
-        return False
-
-
-class Slice(Expr):
-    """Represents a slice object.  This must only be used as argument for
-    :class:`Subscript`.
-    """
-    fields = ('start', 'stop', 'step')
-
-    def as_const(self, eval_ctx=None):
-        eval_ctx = get_eval_context(self, eval_ctx)
-        def const(obj):
-            if obj is None:
-                return None
-            return obj.as_const(eval_ctx)
-        return slice(const(self.start), const(self.stop), const(self.step))
-
-
-class Concat(Expr):
-    """Concatenates the list of expressions provided after converting them to
-    unicode.
-    """
-    fields = ('nodes',)
-
-    def as_const(self, eval_ctx=None):
-        eval_ctx = get_eval_context(self, eval_ctx)
-        return ''.join(text_type(x.as_const(eval_ctx)) for x in self.nodes)
-
-
-class Compare(Expr):
-    """Compares an expression with some other expressions.  `ops` must be a
-    list of :class:`Operand`\s.
-    """
-    fields = ('expr', 'ops')
-
-    def as_const(self, eval_ctx=None):
-        eval_ctx = get_eval_context(self, eval_ctx)
-        result = value = self.expr.as_const(eval_ctx)
-        try:
-            for op in self.ops:
-                new_value = op.expr.as_const(eval_ctx)
-                result = _cmpop_to_func[op.op](value, new_value)
-                value = new_value
-        except Exception:
-            raise Impossible()
-        return result
-
-
-class Operand(Helper):
-    """Holds an operator and an expression."""
-    fields = ('op', 'expr')
-
-if __debug__:
-    Operand.__doc__ += '\nThe following operators are available: ' + \
-        ', '.join(sorted('``%s``' % x for x in set(_binop_to_func) |
-                  set(_uaop_to_func) | set(_cmpop_to_func)))
-
-
-class Mul(BinExpr):
-    """Multiplies the left with the right node."""
-    operator = '*'
-
-
-class Div(BinExpr):
-    """Divides the left by the right node."""
-    operator = '/'
-
-
-class FloorDiv(BinExpr):
-    """Divides the left by the right node and truncates conver the
-    result into an integer by truncating.
-    """
-    operator = '//'
-
-
-class Add(BinExpr):
-    """Add the left to the right node."""
-    operator = '+'
-
-
-class Sub(BinExpr):
-    """Subtract the right from the left node."""
-    operator = '-'
-
-
-class Mod(BinExpr):
-    """Left modulo right."""
-    operator = '%'
-
-
-class Pow(BinExpr):
-    """Left to the power of right."""
-    operator = '**'
-
-
-class And(BinExpr):
-    """Short circuited AND."""
-    operator = 'and'
-
-    def as_const(self, eval_ctx=None):
-        eval_ctx = get_eval_context(self, eval_ctx)
-        return self.left.as_const(eval_ctx) and self.right.as_const(eval_ctx)
-
-
-class Or(BinExpr):
-    """Short circuited OR."""
-    operator = 'or'
-
-    def as_const(self, eval_ctx=None):
-        eval_ctx = get_eval_context(self, eval_ctx)
-        return self.left.as_const(eval_ctx) or self.right.as_const(eval_ctx)
-
-
-class Not(UnaryExpr):
-    """Negate the expression."""
-    operator = 'not'
-
-
-class Neg(UnaryExpr):
-    """Make the expression negative."""
-    operator = '-'
-
-
-class Pos(UnaryExpr):
-    """Make the expression positive (noop for most expressions)"""
-    operator = '+'
-
-
-# Helpers for extensions
-
-
-class EnvironmentAttribute(Expr):
-    """Loads an attribute from the environment object.  This is useful for
-    extensions that want to call a callback stored on the environment.
-    """
-    fields = ('name',)
-
-
-class ExtensionAttribute(Expr):
-    """Returns the attribute of an extension bound to the environment.
-    The identifier is the identifier of the :class:`Extension`.
-
-    This node is usually constructed by calling the
-    :meth:`~jinja2.ext.Extension.attr` method on an extension.
-    """
-    fields = ('identifier', 'name')
-
-
-class ImportedName(Expr):
-    """If created with an import name the import name is returned on node
-    access.  For example ``ImportedName('cgi.escape')`` returns the `escape`
-    function from the cgi module on evaluation.  Imports are optimized by the
-    compiler so there is no need to assign them to local variables.
-    """
-    fields = ('importname',)
-
-
-class InternalName(Expr):
-    """An internal name in the compiler.  You cannot create these nodes
-    yourself but the parser provides a
-    :meth:`~jinja2.parser.Parser.free_identifier` method that creates
-    a new identifier for you.  This identifier is not available from the
-    template and is not threated specially by the compiler.
-    """
-    fields = ('name',)
-
-    def __init__(self):
-        raise TypeError('Can\'t create internal names.  Use the '
-                        '`free_identifier` method on a parser.')
-
-
-class MarkSafe(Expr):
-    """Mark the wrapped expression as safe (wrap it as `Markup`)."""
-    fields = ('expr',)
-
-    def as_const(self, eval_ctx=None):
-        eval_ctx = get_eval_context(self, eval_ctx)
-        return Markup(self.expr.as_const(eval_ctx))
-
-
-class MarkSafeIfAutoescape(Expr):
-    """Mark the wrapped expression as safe (wrap it as `Markup`) but
-    only if autoescaping is active.
-
-    .. versionadded:: 2.5
-    """
-    fields = ('expr',)
-
-    def as_const(self, eval_ctx=None):
-        eval_ctx = get_eval_context(self, eval_ctx)
-        if eval_ctx.volatile:
-            raise Impossible()
-        expr = self.expr.as_const(eval_ctx)
-        if eval_ctx.autoescape:
-            return Markup(expr)
-        return expr
-
-
-class ContextReference(Expr):
-    """Returns the current template context.  It can be used like a
-    :class:`Name` node, with a ``'load'`` ctx and will return the
-    current :class:`~jinja2.runtime.Context` object.
-
-    Here an example that assigns the current template name to a
-    variable named `foo`::
-
-        Assign(Name('foo', ctx='store'),
-               Getattr(ContextReference(), 'name'))
-    """
-
-
-class Continue(Stmt):
-    """Continue a loop."""
-
-
-class Break(Stmt):
-    """Break a loop."""
-
-
-class Scope(Stmt):
-    """An artificial scope."""
-    fields = ('body',)
-
-
-class EvalContextModifier(Stmt):
-    """Modifies the eval context.  For each option that should be modified,
-    a :class:`Keyword` has to be added to the :attr:`options` list.
-
-    Example to change the `autoescape` setting::
-
-        EvalContextModifier(options=[Keyword('autoescape', Const(True))])
-    """
-    fields = ('options',)
-
-
-class ScopedEvalContextModifier(EvalContextModifier):
-    """Modifies the eval context and reverts it later.  Works exactly like
-    :class:`EvalContextModifier` but will only modify the
-    :class:`~jinja2.nodes.EvalContext` for nodes in the :attr:`body`.
-    """
-    fields = ('body',)
-
-
-# make sure nobody creates custom nodes
-def _failing_new(*args, **kwargs):
-    raise TypeError('can\'t create custom node types')
-NodeType.__new__ = staticmethod(_failing_new); del _failing_new
diff --git a/third_party/jinja2/optimizer.py b/third_party/jinja2/optimizer.py
deleted file mode 100644
index 00eab11..0000000
--- a/third_party/jinja2/optimizer.py
+++ /dev/null
@@ -1,68 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    jinja2.optimizer
-    ~~~~~~~~~~~~~~~~
-
-    The jinja optimizer is currently trying to constant fold a few expressions
-    and modify the AST in place so that it should be easier to evaluate it.
-
-    Because the AST does not contain all the scoping information and the
-    compiler has to find that out, we cannot do all the optimizations we
-    want.  For example loop unrolling doesn't work because unrolled loops would
-    have a different scoping.
-
-    The solution would be a second syntax tree that has the scoping rules stored.
-
-    :copyright: (c) 2010 by the Jinja Team.
-    :license: BSD.
-"""
-from jinja2 import nodes
-from jinja2.visitor import NodeTransformer
-
-
-def optimize(node, environment):
-    """The context hint can be used to perform an static optimization
-    based on the context given."""
-    optimizer = Optimizer(environment)
-    return optimizer.visit(node)
-
-
-class Optimizer(NodeTransformer):
-
-    def __init__(self, environment):
-        self.environment = environment
-
-    def visit_If(self, node):
-        """Eliminate dead code."""
-        # do not optimize ifs that have a block inside so that it doesn't
-        # break super().
-        if node.find(nodes.Block) is not None:
-            return self.generic_visit(node)
-        try:
-            val = self.visit(node.test).as_const()
-        except nodes.Impossible:
-            return self.generic_visit(node)
-        if val:
-            body = node.body
-        else:
-            body = node.else_
-        result = []
-        for node in body:
-            result.extend(self.visit_list(node))
-        return result
-
-    def fold(self, node):
-        """Do constant folding."""
-        node = self.generic_visit(node)
-        try:
-            return nodes.Const.from_untrusted(node.as_const(),
-                                              lineno=node.lineno,
-                                              environment=self.environment)
-        except nodes.Impossible:
-            return node
-
-    visit_Add = visit_Sub = visit_Mul = visit_Div = visit_FloorDiv = \
-    visit_Pow = visit_Mod = visit_And = visit_Or = visit_Pos = visit_Neg = \
-    visit_Not = visit_Compare = visit_Getitem = visit_Getattr = visit_Call = \
-    visit_Filter = visit_Test = visit_CondExpr = fold
-    del fold
diff --git a/third_party/jinja2/parser.py b/third_party/jinja2/parser.py
deleted file mode 100644
index d24da18..0000000
--- a/third_party/jinja2/parser.py
+++ /dev/null
@@ -1,899 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    jinja2.parser
-    ~~~~~~~~~~~~~
-
-    Implements the template parser.
-
-    :copyright: (c) 2010 by the Jinja Team.
-    :license: BSD, see LICENSE for more details.
-"""
-from jinja2 import nodes
-from jinja2.exceptions import TemplateSyntaxError, TemplateAssertionError
-from jinja2.lexer import describe_token, describe_token_expr
-from jinja2._compat import imap
-
-
-_statement_keywords = frozenset(['for', 'if', 'block', 'extends', 'print',
-                                 'macro', 'include', 'from', 'import',
-                                 'set'])
-_compare_operators = frozenset(['eq', 'ne', 'lt', 'lteq', 'gt', 'gteq'])
-
-
-class Parser(object):
-    """This is the central parsing class Jinja2 uses.  It's passed to
-    extensions and can be used to parse expressions or statements.
-    """
-
-    def __init__(self, environment, source, name=None, filename=None,
-                 state=None):
-        self.environment = environment
-        self.stream = environment._tokenize(source, name, filename, state)
-        self.name = name
-        self.filename = filename
-        self.closed = False
-        self.extensions = {}
-        for extension in environment.iter_extensions():
-            for tag in extension.tags:
-                self.extensions[tag] = extension.parse
-        self._last_identifier = 0
-        self._tag_stack = []
-        self._end_token_stack = []
-
-    def fail(self, msg, lineno=None, exc=TemplateSyntaxError):
-        """Convenience method that raises `exc` with the message, passed
-        line number or last line number as well as the current name and
-        filename.
-        """
-        if lineno is None:
-            lineno = self.stream.current.lineno
-        raise exc(msg, lineno, self.name, self.filename)
-
-    def _fail_ut_eof(self, name, end_token_stack, lineno):
-        expected = []
-        for exprs in end_token_stack:
-            expected.extend(imap(describe_token_expr, exprs))
-        if end_token_stack:
-            currently_looking = ' or '.join(
-                "'%s'" % describe_token_expr(expr)
-                for expr in end_token_stack[-1])
-        else:
-            currently_looking = None
-
-        if name is None:
-            message = ['Unexpected end of template.']
-        else:
-            message = ['Encountered unknown tag \'%s\'.' % name]
-
-        if currently_looking:
-            if name is not None and name in expected:
-                message.append('You probably made a nesting mistake. Jinja '
-                               'is expecting this tag, but currently looking '
-                               'for %s.' % currently_looking)
-            else:
-                message.append('Jinja was looking for the following tags: '
-                               '%s.' % currently_looking)
-
-        if self._tag_stack:
-            message.append('The innermost block that needs to be '
-                           'closed is \'%s\'.' % self._tag_stack[-1])
-
-        self.fail(' '.join(message), lineno)
-
-    def fail_unknown_tag(self, name, lineno=None):
-        """Called if the parser encounters an unknown tag.  Tries to fail
-        with a human readable error message that could help to identify
-        the problem.
-        """
-        return self._fail_ut_eof(name, self._end_token_stack, lineno)
-
-    def fail_eof(self, end_tokens=None, lineno=None):
-        """Like fail_unknown_tag but for end of template situations."""
-        stack = list(self._end_token_stack)
-        if end_tokens is not None:
-            stack.append(end_tokens)
-        return self._fail_ut_eof(None, stack, lineno)
-
-    def is_tuple_end(self, extra_end_rules=None):
-        """Are we at the end of a tuple?"""
-        if self.stream.current.type in ('variable_end', 'block_end', 'rparen'):
-            return True
-        elif extra_end_rules is not None:
-            return self.stream.current.test_any(extra_end_rules)
-        return False
-
-    def free_identifier(self, lineno=None):
-        """Return a new free identifier as :class:`~jinja2.nodes.InternalName`."""
-        self._last_identifier += 1
-        rv = object.__new__(nodes.InternalName)
-        nodes.Node.__init__(rv, 'fi%d' % self._last_identifier, lineno=lineno)
-        return rv
-
-    def parse_statement(self):
-        """Parse a single statement."""
-        token = self.stream.current
-        if token.type != 'name':
-            self.fail('tag name expected', token.lineno)
-        self._tag_stack.append(token.value)
-        pop_tag = True
-        try:
-            if token.value in _statement_keywords:
-                return getattr(self, 'parse_' + self.stream.current.value)()
-            if token.value == 'call':
-                return self.parse_call_block()
-            if token.value == 'filter':
-                return self.parse_filter_block()
-            ext = self.extensions.get(token.value)
-            if ext is not None:
-                return ext(self)
-
-            # did not work out, remove the token we pushed by accident
-            # from the stack so that the unknown tag fail function can
-            # produce a proper error message.
-            self._tag_stack.pop()
-            pop_tag = False
-            self.fail_unknown_tag(token.value, token.lineno)
-        finally:
-            if pop_tag:
-                self._tag_stack.pop()
-
-    def parse_statements(self, end_tokens, drop_needle=False):
-        """Parse multiple statements into a list until one of the end tokens
-        is reached.  This is used to parse the body of statements as it also
-        parses template data if appropriate.  The parser checks first if the
-        current token is a colon and skips it if there is one.  Then it checks
-        for the block end and parses until if one of the `end_tokens` is
-        reached.  Per default the active token in the stream at the end of
-        the call is the matched end token.  If this is not wanted `drop_needle`
-        can be set to `True` and the end token is removed.
-        """
-        # the first token may be a colon for python compatibility
-        self.stream.skip_if('colon')
-
-        # in the future it would be possible to add whole code sections
-        # by adding some sort of end of statement token and parsing those here.
-        self.stream.expect('block_end')
-        result = self.subparse(end_tokens)
-
-        # we reached the end of the template too early, the subparser
-        # does not check for this, so we do that now
-        if self.stream.current.type == 'eof':
-            self.fail_eof(end_tokens)
-
-        if drop_needle:
-            next(self.stream)
-        return result
-
-    def parse_set(self):
-        """Parse an assign statement."""
-        lineno = next(self.stream).lineno
-        target = self.parse_assign_target()
-        if self.stream.skip_if('assign'):
-            expr = self.parse_tuple()
-            return nodes.Assign(target, expr, lineno=lineno)
-        body = self.parse_statements(('name:endset',),
-                                     drop_needle=True)
-        return nodes.AssignBlock(target, body, lineno=lineno)
-
-    def parse_for(self):
-        """Parse a for loop."""
-        lineno = self.stream.expect('name:for').lineno
-        target = self.parse_assign_target(extra_end_rules=('name:in',))
-        self.stream.expect('name:in')
-        iter = self.parse_tuple(with_condexpr=False,
-                                extra_end_rules=('name:recursive',))
-        test = None
-        if self.stream.skip_if('name:if'):
-            test = self.parse_expression()
-        recursive = self.stream.skip_if('name:recursive')
-        body = self.parse_statements(('name:endfor', 'name:else'))
-        if next(self.stream).value == 'endfor':
-            else_ = []
-        else:
-            else_ = self.parse_statements(('name:endfor',), drop_needle=True)
-        return nodes.For(target, iter, body, else_, test,
-                         recursive, lineno=lineno)
-
-    def parse_if(self):
-        """Parse an if construct."""
-        node = result = nodes.If(lineno=self.stream.expect('name:if').lineno)
-        while 1:
-            node.test = self.parse_tuple(with_condexpr=False)
-            node.body = self.parse_statements(('name:elif', 'name:else',
-                                               'name:endif'))
-            token = next(self.stream)
-            if token.test('name:elif'):
-                new_node = nodes.If(lineno=self.stream.current.lineno)
-                node.else_ = [new_node]
-                node = new_node
-                continue
-            elif token.test('name:else'):
-                node.else_ = self.parse_statements(('name:endif',),
-                                                   drop_needle=True)
-            else:
-                node.else_ = []
-            break
-        return result
-
-    def parse_block(self):
-        node = nodes.Block(lineno=next(self.stream).lineno)
-        node.name = self.stream.expect('name').value
-        node.scoped = self.stream.skip_if('name:scoped')
-
-        # common problem people encounter when switching from django
-        # to jinja.  we do not support hyphens in block names, so let's
-        # raise a nicer error message in that case.
-        if self.stream.current.type == 'sub':
-            self.fail('Block names in Jinja have to be valid Python '
-                      'identifiers and may not contain hyphens, use an '
-                      'underscore instead.')
-
-        node.body = self.parse_statements(('name:endblock',), drop_needle=True)
-        self.stream.skip_if('name:' + node.name)
-        return node
-
-    def parse_extends(self):
-        node = nodes.Extends(lineno=next(self.stream).lineno)
-        node.template = self.parse_expression()
-        return node
-
-    def parse_import_context(self, node, default):
-        if self.stream.current.test_any('name:with', 'name:without') and \
-           self.stream.look().test('name:context'):
-            node.with_context = next(self.stream).value == 'with'
-            self.stream.skip()
-        else:
-            node.with_context = default
-        return node
-
-    def parse_include(self):
-        node = nodes.Include(lineno=next(self.stream).lineno)
-        node.template = self.parse_expression()
-        if self.stream.current.test('name:ignore') and \
-           self.stream.look().test('name:missing'):
-            node.ignore_missing = True
-            self.stream.skip(2)
-        else:
-            node.ignore_missing = False
-        return self.parse_import_context(node, True)
-
-    def parse_import(self):
-        node = nodes.Import(lineno=next(self.stream).lineno)
-        node.template = self.parse_expression()
-        self.stream.expect('name:as')
-        node.target = self.parse_assign_target(name_only=True).name
-        return self.parse_import_context(node, False)
-
-    def parse_from(self):
-        node = nodes.FromImport(lineno=next(self.stream).lineno)
-        node.template = self.parse_expression()
-        self.stream.expect('name:import')
-        node.names = []
-
-        def parse_context():
-            if self.stream.current.value in ('with', 'without') and \
-               self.stream.look().test('name:context'):
-                node.with_context = next(self.stream).value == 'with'
-                self.stream.skip()
-                return True
-            return False
-
-        while 1:
-            if node.names:
-                self.stream.expect('comma')
-            if self.stream.current.type == 'name':
-                if parse_context():
-                    break
-                target = self.parse_assign_target(name_only=True)
-                if target.name.startswith('_'):
-                    self.fail('names starting with an underline can not '
-                              'be imported', target.lineno,
-                              exc=TemplateAssertionError)
-                if self.stream.skip_if('name:as'):
-                    alias = self.parse_assign_target(name_only=True)
-                    node.names.append((target.name, alias.name))
-                else:
-                    node.names.append(target.name)
-                if parse_context() or self.stream.current.type != 'comma':
-                    break
-            else:
-                break
-        if not hasattr(node, 'with_context'):
-            node.with_context = False
-            self.stream.skip_if('comma')
-        return node
-
-    def parse_signature(self, node):
-        node.args = args = []
-        node.defaults = defaults = []
-        self.stream.expect('lparen')
-        while self.stream.current.type != 'rparen':
-            if args:
-                self.stream.expect('comma')
-            arg = self.parse_assign_target(name_only=True)
-            arg.set_ctx('param')
-            if self.stream.skip_if('assign'):
-                defaults.append(self.parse_expression())
-            elif defaults:
-                self.fail('non-default argument follows default argument')
-            args.append(arg)
-        self.stream.expect('rparen')
-
-    def parse_call_block(self):
-        node = nodes.CallBlock(lineno=next(self.stream).lineno)
-        if self.stream.current.type == 'lparen':
-            self.parse_signature(node)
-        else:
-            node.args = []
-            node.defaults = []
-
-        node.call = self.parse_expression()
-        if not isinstance(node.call, nodes.Call):
-            self.fail('expected call', node.lineno)
-        node.body = self.parse_statements(('name:endcall',), drop_needle=True)
-        return node
-
-    def parse_filter_block(self):
-        node = nodes.FilterBlock(lineno=next(self.stream).lineno)
-        node.filter = self.parse_filter(None, start_inline=True)
-        node.body = self.parse_statements(('name:endfilter',),
-                                          drop_needle=True)
-        return node
-
-    def parse_macro(self):
-        node = nodes.Macro(lineno=next(self.stream).lineno)
-        node.name = self.parse_assign_target(name_only=True).name
-        self.parse_signature(node)
-        node.body = self.parse_statements(('name:endmacro',),
-                                          drop_needle=True)
-        return node
-
-    def parse_print(self):
-        node = nodes.Output(lineno=next(self.stream).lineno)
-        node.nodes = []
-        while self.stream.current.type != 'block_end':
-            if node.nodes:
-                self.stream.expect('comma')
-            node.nodes.append(self.parse_expression())
-        return node
-
-    def parse_assign_target(self, with_tuple=True, name_only=False,
-                            extra_end_rules=None):
-        """Parse an assignment target.  As Jinja2 allows assignments to
-        tuples, this function can parse all allowed assignment targets.  Per
-        default assignments to tuples are parsed, that can be disable however
-        by setting `with_tuple` to `False`.  If only assignments to names are
-        wanted `name_only` can be set to `True`.  The `extra_end_rules`
-        parameter is forwarded to the tuple parsing function.
-        """
-        if name_only:
-            token = self.stream.expect('name')
-            target = nodes.Name(token.value, 'store', lineno=token.lineno)
-        else:
-            if with_tuple:
-                target = self.parse_tuple(simplified=True,
-                                          extra_end_rules=extra_end_rules)
-            else:
-                target = self.parse_primary()
-            target.set_ctx('store')
-        if not target.can_assign():
-            self.fail('can\'t assign to %r' % target.__class__.
-                      __name__.lower(), target.lineno)
-        return target
-
-    def parse_expression(self, with_condexpr=True):
-        """Parse an expression.  Per default all expressions are parsed, if
-        the optional `with_condexpr` parameter is set to `False` conditional
-        expressions are not parsed.
-        """
-        if with_condexpr:
-            return self.parse_condexpr()
-        return self.parse_or()
-
-    def parse_condexpr(self):
-        lineno = self.stream.current.lineno
-        expr1 = self.parse_or()
-        while self.stream.skip_if('name:if'):
-            expr2 = self.parse_or()
-            if self.stream.skip_if('name:else'):
-                expr3 = self.parse_condexpr()
-            else:
-                expr3 = None
-            expr1 = nodes.CondExpr(expr2, expr1, expr3, lineno=lineno)
-            lineno = self.stream.current.lineno
-        return expr1
-
-    def parse_or(self):
-        lineno = self.stream.current.lineno
-        left = self.parse_and()
-        while self.stream.skip_if('name:or'):
-            right = self.parse_and()
-            left = nodes.Or(left, right, lineno=lineno)
-            lineno = self.stream.current.lineno
-        return left
-
-    def parse_and(self):
-        lineno = self.stream.current.lineno
-        left = self.parse_not()
-        while self.stream.skip_if('name:and'):
-            right = self.parse_not()
-            left = nodes.And(left, right, lineno=lineno)
-            lineno = self.stream.current.lineno
-        return left
-
-    def parse_not(self):
-        if self.stream.current.test('name:not'):
-            lineno = next(self.stream).lineno
-            return nodes.Not(self.parse_not(), lineno=lineno)
-        return self.parse_compare()
-
-    def parse_compare(self):
-        lineno = self.stream.current.lineno
-        expr = self.parse_add()
-        ops = []
-        while 1:
-            token_type = self.stream.current.type
-            if token_type in _compare_operators:
-                next(self.stream)
-                ops.append(nodes.Operand(token_type, self.parse_add()))
-            elif self.stream.skip_if('name:in'):
-                ops.append(nodes.Operand('in', self.parse_add()))
-            elif (self.stream.current.test('name:not') and
-                  self.stream.look().test('name:in')):
-                self.stream.skip(2)
-                ops.append(nodes.Operand('notin', self.parse_add()))
-            else:
-                break
-            lineno = self.stream.current.lineno
-        if not ops:
-            return expr
-        return nodes.Compare(expr, ops, lineno=lineno)
-
-    def parse_add(self):
-        lineno = self.stream.current.lineno
-        left = self.parse_sub()
-        while self.stream.current.type == 'add':
-            next(self.stream)
-            right = self.parse_sub()
-            left = nodes.Add(left, right, lineno=lineno)
-            lineno = self.stream.current.lineno
-        return left
-
-    def parse_sub(self):
-        lineno = self.stream.current.lineno
-        left = self.parse_concat()
-        while self.stream.current.type == 'sub':
-            next(self.stream)
-            right = self.parse_concat()
-            left = nodes.Sub(left, right, lineno=lineno)
-            lineno = self.stream.current.lineno
-        return left
-
-    def parse_concat(self):
-        lineno = self.stream.current.lineno
-        args = [self.parse_mul()]
-        while self.stream.current.type == 'tilde':
-            next(self.stream)
-            args.append(self.parse_mul())
-        if len(args) == 1:
-            return args[0]
-        return nodes.Concat(args, lineno=lineno)
-
-    def parse_mul(self):
-        lineno = self.stream.current.lineno
-        left = self.parse_div()
-        while self.stream.current.type == 'mul':
-            next(self.stream)
-            right = self.parse_div()
-            left = nodes.Mul(left, right, lineno=lineno)
-            lineno = self.stream.current.lineno
-        return left
-
-    def parse_div(self):
-        lineno = self.stream.current.lineno
-        left = self.parse_floordiv()
-        while self.stream.current.type == 'div':
-            next(self.stream)
-            right = self.parse_floordiv()
-            left = nodes.Div(left, right, lineno=lineno)
-            lineno = self.stream.current.lineno
-        return left
-
-    def parse_floordiv(self):
-        lineno = self.stream.current.lineno
-        left = self.parse_mod()
-        while self.stream.current.type == 'floordiv':
-            next(self.stream)
-            right = self.parse_mod()
-            left = nodes.FloorDiv(left, right, lineno=lineno)
-            lineno = self.stream.current.lineno
-        return left
-
-    def parse_mod(self):
-        lineno = self.stream.current.lineno
-        left = self.parse_pow()
-        while self.stream.current.type == 'mod':
-            next(self.stream)
-            right = self.parse_pow()
-            left = nodes.Mod(left, right, lineno=lineno)
-            lineno = self.stream.current.lineno
-        return left
-
-    def parse_pow(self):
-        lineno = self.stream.current.lineno
-        left = self.parse_unary()
-        while self.stream.current.type == 'pow':
-            next(self.stream)
-            right = self.parse_unary()
-            left = nodes.Pow(left, right, lineno=lineno)
-            lineno = self.stream.current.lineno
-        return left
-
-    def parse_unary(self, with_filter=True):
-        token_type = self.stream.current.type
-        lineno = self.stream.current.lineno
-        if token_type == 'sub':
-            next(self.stream)
-            node = nodes.Neg(self.parse_unary(False), lineno=lineno)
-        elif token_type == 'add':
-            next(self.stream)
-            node = nodes.Pos(self.parse_unary(False), lineno=lineno)
-        else:
-            node = self.parse_primary()
-        node = self.parse_postfix(node)
-        if with_filter:
-            node = self.parse_filter_expr(node)
-        return node
-
-    def parse_primary(self):
-        token = self.stream.current
-        if token.type == 'name':
-            if token.value in ('true', 'false', 'True', 'False'):
-                node = nodes.Const(token.value in ('true', 'True'),
-                                   lineno=token.lineno)
-            elif token.value in ('none', 'None'):
-                node = nodes.Const(None, lineno=token.lineno)
-            else:
-                node = nodes.Name(token.value, 'load', lineno=token.lineno)
-            next(self.stream)
-        elif token.type == 'string':
-            next(self.stream)
-            buf = [token.value]
-            lineno = token.lineno
-            while self.stream.current.type == 'string':
-                buf.append(self.stream.current.value)
-                next(self.stream)
-            node = nodes.Const(''.join(buf), lineno=lineno)
-        elif token.type in ('integer', 'float'):
-            next(self.stream)
-            node = nodes.Const(token.value, lineno=token.lineno)
-        elif token.type == 'lparen':
-            next(self.stream)
-            node = self.parse_tuple(explicit_parentheses=True)
-            self.stream.expect('rparen')
-        elif token.type == 'lbracket':
-            node = self.parse_list()
-        elif token.type == 'lbrace':
-            node = self.parse_dict()
-        else:
-            self.fail("unexpected '%s'" % describe_token(token), token.lineno)
-        return node
-
-    def parse_tuple(self, simplified=False, with_condexpr=True,
-                    extra_end_rules=None, explicit_parentheses=False):
-        """Works like `parse_expression` but if multiple expressions are
-        delimited by a comma a :class:`~jinja2.nodes.Tuple` node is created.
-        This method could also return a regular expression instead of a tuple
-        if no commas where found.
-
-        The default parsing mode is a full tuple.  If `simplified` is `True`
-        only names and literals are parsed.  The `no_condexpr` parameter is
-        forwarded to :meth:`parse_expression`.
-
-        Because tuples do not require delimiters and may end in a bogus comma
-        an extra hint is needed that marks the end of a tuple.  For example
-        for loops support tuples between `for` and `in`.  In that case the
-        `extra_end_rules` is set to ``['name:in']``.
-
-        `explicit_parentheses` is true if the parsing was triggered by an
-        expression in parentheses.  This is used to figure out if an empty
-        tuple is a valid expression or not.
-        """
-        lineno = self.stream.current.lineno
-        if simplified:
-            parse = self.parse_primary
-        elif with_condexpr:
-            parse = self.parse_expression
-        else:
-            parse = lambda: self.parse_expression(with_condexpr=False)
-        args = []
-        is_tuple = False
-        while 1:
-            if args:
-                self.stream.expect('comma')
-            if self.is_tuple_end(extra_end_rules):
-                break
-            args.append(parse())
-            if self.stream.current.type == 'comma':
-                is_tuple = True
-            else:
-                break
-            lineno = self.stream.current.lineno
-
-        if not is_tuple:
-            if args:
-                return args[0]
-
-            # if we don't have explicit parentheses, an empty tuple is
-            # not a valid expression.  This would mean nothing (literally
-            # nothing) in the spot of an expression would be an empty
-            # tuple.
-            if not explicit_parentheses:
-                self.fail('Expected an expression, got \'%s\'' %
-                          describe_token(self.stream.current))
-
-        return nodes.Tuple(args, 'load', lineno=lineno)
-
-    def parse_list(self):
-        token = self.stream.expect('lbracket')
-        items = []
-        while self.stream.current.type != 'rbracket':
-            if items:
-                self.stream.expect('comma')
-            if self.stream.current.type == 'rbracket':
-                break
-            items.append(self.parse_expression())
-        self.stream.expect('rbracket')
-        return nodes.List(items, lineno=token.lineno)
-
-    def parse_dict(self):
-        token = self.stream.expect('lbrace')
-        items = []
-        while self.stream.current.type != 'rbrace':
-            if items:
-                self.stream.expect('comma')
-            if self.stream.current.type == 'rbrace':
-                break
-            key = self.parse_expression()
-            self.stream.expect('colon')
-            value = self.parse_expression()
-            items.append(nodes.Pair(key, value, lineno=key.lineno))
-        self.stream.expect('rbrace')
-        return nodes.Dict(items, lineno=token.lineno)
-
-    def parse_postfix(self, node):
-        while 1:
-            token_type = self.stream.current.type
-            if token_type == 'dot' or token_type == 'lbracket':
-                node = self.parse_subscript(node)
-            # calls are valid both after postfix expressions (getattr
-            # and getitem) as well as filters and tests
-            elif token_type == 'lparen':
-                node = self.parse_call(node)
-            else:
-                break
-        return node
-
-    def parse_filter_expr(self, node):
-        while 1:
-            token_type = self.stream.current.type
-            if token_type == 'pipe':
-                node = self.parse_filter(node)
-            elif token_type == 'name' and self.stream.current.value == 'is':
-                node = self.parse_test(node)
-            # calls are valid both after postfix expressions (getattr
-            # and getitem) as well as filters and tests
-            elif token_type == 'lparen':
-                node = self.parse_call(node)
-            else:
-                break
-        return node
-
-    def parse_subscript(self, node):
-        token = next(self.stream)
-        if token.type == 'dot':
-            attr_token = self.stream.current
-            next(self.stream)
-            if attr_token.type == 'name':
-                return nodes.Getattr(node, attr_token.value, 'load',
-                                     lineno=token.lineno)
-            elif attr_token.type != 'integer':
-                self.fail('expected name or number', attr_token.lineno)
-            arg = nodes.Const(attr_token.value, lineno=attr_token.lineno)
-            return nodes.Getitem(node, arg, 'load', lineno=token.lineno)
-        if token.type == 'lbracket':
-            args = []
-            while self.stream.current.type != 'rbracket':
-                if args:
-                    self.stream.expect('comma')
-                args.append(self.parse_subscribed())
-            self.stream.expect('rbracket')
-            if len(args) == 1:
-                arg = args[0]
-            else:
-                arg = nodes.Tuple(args, 'load', lineno=token.lineno)
-            return nodes.Getitem(node, arg, 'load', lineno=token.lineno)
-        self.fail('expected subscript expression', self.lineno)
-
-    def parse_subscribed(self):
-        lineno = self.stream.current.lineno
-
-        if self.stream.current.type == 'colon':
-            next(self.stream)
-            args = [None]
-        else:
-            node = self.parse_expression()
-            if self.stream.current.type != 'colon':
-                return node
-            next(self.stream)
-            args = [node]
-
-        if self.stream.current.type == 'colon':
-            args.append(None)
-        elif self.stream.current.type not in ('rbracket', 'comma'):
-            args.append(self.parse_expression())
-        else:
-            args.append(None)
-
-        if self.stream.current.type == 'colon':
-            next(self.stream)
-            if self.stream.current.type not in ('rbracket', 'comma'):
-                args.append(self.parse_expression())
-            else:
-                args.append(None)
-        else:
-            args.append(None)
-
-        return nodes.Slice(lineno=lineno, *args)
-
-    def parse_call(self, node):
-        token = self.stream.expect('lparen')
-        args = []
-        kwargs = []
-        dyn_args = dyn_kwargs = None
-        require_comma = False
-
-        def ensure(expr):
-            if not expr:
-                self.fail('invalid syntax for function call expression',
-                          token.lineno)
-
-        while self.stream.current.type != 'rparen':
-            if require_comma:
-                self.stream.expect('comma')
-                # support for trailing comma
-                if self.stream.current.type == 'rparen':
-                    break
-            if self.stream.current.type == 'mul':
-                ensure(dyn_args is None and dyn_kwargs is None)
-                next(self.stream)
-                dyn_args = self.parse_expression()
-            elif self.stream.current.type == 'pow':
-                ensure(dyn_kwargs is None)
-                next(self.stream)
-                dyn_kwargs = self.parse_expression()
-            else:
-                ensure(dyn_args is None and dyn_kwargs is None)
-                if self.stream.current.type == 'name' and \
-                   self.stream.look().type == 'assign':
-                    key = self.stream.current.value
-                    self.stream.skip(2)
-                    value = self.parse_expression()
-                    kwargs.append(nodes.Keyword(key, value,
-                                                lineno=value.lineno))
-                else:
-                    ensure(not kwargs)
-                    args.append(self.parse_expression())
-
-            require_comma = True
-        self.stream.expect('rparen')
-
-        if node is None:
-            return args, kwargs, dyn_args, dyn_kwargs
-        return nodes.Call(node, args, kwargs, dyn_args, dyn_kwargs,
-                          lineno=token.lineno)
-
-    def parse_filter(self, node, start_inline=False):
-        while self.stream.current.type == 'pipe' or start_inline:
-            if not start_inline:
-                next(self.stream)
-            token = self.stream.expect('name')
-            name = token.value
-            while self.stream.current.type == 'dot':
-                next(self.stream)
-                name += '.' + self.stream.expect('name').value
-            if self.stream.current.type == 'lparen':
-                args, kwargs, dyn_args, dyn_kwargs = self.parse_call(None)
-            else:
-                args = []
-                kwargs = []
-                dyn_args = dyn_kwargs = None
-            node = nodes.Filter(node, name, args, kwargs, dyn_args,
-                                dyn_kwargs, lineno=token.lineno)
-            start_inline = False
-        return node
-
-    def parse_test(self, node):
-        token = next(self.stream)
-        if self.stream.current.test('name:not'):
-            next(self.stream)
-            negated = True
-        else:
-            negated = False
-        name = self.stream.expect('name').value
-        while self.stream.current.type == 'dot':
-            next(self.stream)
-            name += '.' + self.stream.expect('name').value
-        dyn_args = dyn_kwargs = None
-        kwargs = []
-        if self.stream.current.type == 'lparen':
-            args, kwargs, dyn_args, dyn_kwargs = self.parse_call(None)
-        elif (self.stream.current.type in ('name', 'string', 'integer',
-                                           'float', 'lparen', 'lbracket',
-                                           'lbrace') and not
-              self.stream.current.test_any('name:else', 'name:or',
-                                           'name:and')):
-            if self.stream.current.test('name:is'):
-                self.fail('You cannot chain multiple tests with is')
-            args = [self.parse_expression()]
-        else:
-            args = []
-        node = nodes.Test(node, name, args, kwargs, dyn_args,
-                          dyn_kwargs, lineno=token.lineno)
-        if negated:
-            node = nodes.Not(node, lineno=token.lineno)
-        return node
-
-    def subparse(self, end_tokens=None):
-        body = []
-        data_buffer = []
-        add_data = data_buffer.append
-
-        if end_tokens is not None:
-            self._end_token_stack.append(end_tokens)
-
-        def flush_data():
-            if data_buffer:
-                lineno = data_buffer[0].lineno
-                body.append(nodes.Output(data_buffer[:], lineno=lineno))
-                del data_buffer[:]
-
-        try:
-            while self.stream:
-                token = self.stream.current
-                if token.type == 'data':
-                    if token.value:
-                        add_data(nodes.TemplateData(token.value,
-                                                    lineno=token.lineno))
-                    next(self.stream)
-                elif token.type == 'variable_begin':
-                    next(self.stream)
-                    add_data(self.parse_tuple(with_condexpr=True))
-                    self.stream.expect('variable_end')
-                elif token.type == 'block_begin':
-                    flush_data()
-                    next(self.stream)
-                    if end_tokens is not None and \
-                       self.stream.current.test_any(*end_tokens):
-                        return body
-                    rv = self.parse_statement()
-                    if isinstance(rv, list):
-                        body.extend(rv)
-                    else:
-                        body.append(rv)
-                    self.stream.expect('block_end')
-                else:
-                    raise AssertionError('internal parsing error')
-
-            flush_data()
-        finally:
-            if end_tokens is not None:
-                self._end_token_stack.pop()
-
-        return body
-
-    def parse(self):
-        """Parse the whole template into a `Template` node."""
-        result = nodes.Template(self.subparse(), lineno=1)
-        result.set_environment(self.environment)
-        return result
diff --git a/third_party/jinja2/runtime.py b/third_party/jinja2/runtime.py
deleted file mode 100644
index 685a12d..0000000
--- a/third_party/jinja2/runtime.py
+++ /dev/null
@@ -1,667 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    jinja2.runtime
-    ~~~~~~~~~~~~~~
-
-    Runtime helpers.
-
-    :copyright: (c) 2010 by the Jinja Team.
-    :license: BSD.
-"""
-import sys
-
-from itertools import chain
-from jinja2.nodes import EvalContext, _context_function_types
-from jinja2.utils import Markup, soft_unicode, escape, missing, concat, \
-     internalcode, object_type_repr
-from jinja2.exceptions import UndefinedError, TemplateRuntimeError, \
-     TemplateNotFound
-from jinja2._compat import imap, text_type, iteritems, \
-     implements_iterator, implements_to_string, string_types, PY2
-
-
-# these variables are exported to the template runtime
-__all__ = ['LoopContext', 'TemplateReference', 'Macro', 'Markup',
-           'TemplateRuntimeError', 'missing', 'concat', 'escape',
-           'markup_join', 'unicode_join', 'to_string', 'identity',
-           'TemplateNotFound', 'make_logging_undefined']
-
-#: the name of the function that is used to convert something into
-#: a string.  We can just use the text type here.
-to_string = text_type
-
-#: the identity function.  Useful for certain things in the environment
-identity = lambda x: x
-
-_last_iteration = object()
-
-
-def markup_join(seq):
-    """Concatenation that escapes if necessary and converts to unicode."""
-    buf = []
-    iterator = imap(soft_unicode, seq)
-    for arg in iterator:
-        buf.append(arg)
-        if hasattr(arg, '__html__'):
-            return Markup(u'').join(chain(buf, iterator))
-    return concat(buf)
-
-
-def unicode_join(seq):
-    """Simple args to unicode conversion and concatenation."""
-    return concat(imap(text_type, seq))
-
-
-def new_context(environment, template_name, blocks, vars=None,
-                shared=None, globals=None, locals=None):
-    """Internal helper to for context creation."""
-    if vars is None:
-        vars = {}
-    if shared:
-        parent = vars
-    else:
-        parent = dict(globals or (), **vars)
-    if locals:
-        # if the parent is shared a copy should be created because
-        # we don't want to modify the dict passed
-        if shared:
-            parent = dict(parent)
-        for key, value in iteritems(locals):
-            if key[:2] == 'l_' and value is not missing:
-                parent[key[2:]] = value
-    return environment.context_class(environment, parent, template_name,
-                                     blocks)
-
-
-class TemplateReference(object):
-    """The `self` in templates."""
-
-    def __init__(self, context):
-        self.__context = context
-
-    def __getitem__(self, name):
-        blocks = self.__context.blocks[name]
-        return BlockReference(name, self.__context, blocks, 0)
-
-    def __repr__(self):
-        return '<%s %r>' % (
-            self.__class__.__name__,
-            self.__context.name
-        )
-
-
-class Context(object):
-    """The template context holds the variables of a template.  It stores the
-    values passed to the template and also the names the template exports.
-    Creating instances is neither supported nor useful as it's created
-    automatically at various stages of the template evaluation and should not
-    be created by hand.
-
-    The context is immutable.  Modifications on :attr:`parent` **must not**
-    happen and modifications on :attr:`vars` are allowed from generated
-    template code only.  Template filters and global functions marked as
-    :func:`contextfunction`\s get the active context passed as first argument
-    and are allowed to access the context read-only.
-
-    The template context supports read only dict operations (`get`,
-    `keys`, `values`, `items`, `iterkeys`, `itervalues`, `iteritems`,
-    `__getitem__`, `__contains__`).  Additionally there is a :meth:`resolve`
-    method that doesn't fail with a `KeyError` but returns an
-    :class:`Undefined` object for missing variables.
-    """
-    __slots__ = ('parent', 'vars', 'environment', 'eval_ctx', 'exported_vars',
-                 'name', 'blocks', '__weakref__')
-
-    def __init__(self, environment, parent, name, blocks):
-        self.parent = parent
-        self.vars = {}
-        self.environment = environment
-        self.eval_ctx = EvalContext(self.environment, name)
-        self.exported_vars = set()
-        self.name = name
-
-        # create the initial mapping of blocks.  Whenever template inheritance
-        # takes place the runtime will update this mapping with the new blocks
-        # from the template.
-        self.blocks = dict((k, [v]) for k, v in iteritems(blocks))
-
-    def super(self, name, current):
-        """Render a parent block."""
-        try:
-            blocks = self.blocks[name]
-            index = blocks.index(current) + 1
-            blocks[index]
-        except LookupError:
-            return self.environment.undefined('there is no parent block '
-                                              'called %r.' % name,
-                                              name='super')
-        return BlockReference(name, self, blocks, index)
-
-    def get(self, key, default=None):
-        """Returns an item from the template context, if it doesn't exist
-        `default` is returned.
-        """
-        try:
-            return self[key]
-        except KeyError:
-            return default
-
-    def resolve(self, key):
-        """Looks up a variable like `__getitem__` or `get` but returns an
-        :class:`Undefined` object with the name of the name looked up.
-        """
-        if key in self.vars:
-            return self.vars[key]
-        if key in self.parent:
-            return self.parent[key]
-        return self.environment.undefined(name=key)
-
-    def get_exported(self):
-        """Get a new dict with the exported variables."""
-        return dict((k, self.vars[k]) for k in self.exported_vars)
-
-    def get_all(self):
-        """Return a copy of the complete context as dict including the
-        exported variables.
-        """
-        return dict(self.parent, **self.vars)
-
-    @internalcode
-    def call(__self, __obj, *args, **kwargs):
-        """Call the callable with the arguments and keyword arguments
-        provided but inject the active context or environment as first
-        argument if the callable is a :func:`contextfunction` or
-        :func:`environmentfunction`.
-        """
-        if __debug__:
-            __traceback_hide__ = True  # noqa
-
-        # Allow callable classes to take a context
-        fn = __obj.__call__
-        for fn_type in ('contextfunction',
-                        'evalcontextfunction',
-                        'environmentfunction'):
-            if hasattr(fn, fn_type):
-                __obj = fn
-                break
-
-        if isinstance(__obj, _context_function_types):
-            if getattr(__obj, 'contextfunction', 0):
-                args = (__self,) + args
-            elif getattr(__obj, 'evalcontextfunction', 0):
-                args = (__self.eval_ctx,) + args
-            elif getattr(__obj, 'environmentfunction', 0):
-                args = (__self.environment,) + args
-        try:
-            return __obj(*args, **kwargs)
-        except StopIteration:
-            return __self.environment.undefined('value was undefined because '
-                                                'a callable raised a '
-                                                'StopIteration exception')
-
-    def derived(self, locals=None):
-        """Internal helper function to create a derived context."""
-        context = new_context(self.environment, self.name, {},
-                              self.parent, True, None, locals)
-        context.vars.update(self.vars)
-        context.eval_ctx = self.eval_ctx
-        context.blocks.update((k, list(v)) for k, v in iteritems(self.blocks))
-        return context
-
-    def _all(meth):
-        proxy = lambda self: getattr(self.get_all(), meth)()
-        proxy.__doc__ = getattr(dict, meth).__doc__
-        proxy.__name__ = meth
-        return proxy
-
-    keys = _all('keys')
-    values = _all('values')
-    items = _all('items')
-
-    # not available on python 3
-    if PY2:
-        iterkeys = _all('iterkeys')
-        itervalues = _all('itervalues')
-        iteritems = _all('iteritems')
-    del _all
-
-    def __contains__(self, name):
-        return name in self.vars or name in self.parent
-
-    def __getitem__(self, key):
-        """Lookup a variable or raise `KeyError` if the variable is
-        undefined.
-        """
-        item = self.resolve(key)
-        if isinstance(item, Undefined):
-            raise KeyError(key)
-        return item
-
-    def __repr__(self):
-        return '<%s %s of %r>' % (
-            self.__class__.__name__,
-            repr(self.get_all()),
-            self.name
-        )
-
-
-# register the context as mapping if possible
-try:
-    from collections import Mapping
-    Mapping.register(Context)
-except ImportError:
-    pass
-
-
-class BlockReference(object):
-    """One block on a template reference."""
-
-    def __init__(self, name, context, stack, depth):
-        self.name = name
-        self._context = context
-        self._stack = stack
-        self._depth = depth
-
-    @property
-    def super(self):
-        """Super the block."""
-        if self._depth + 1 >= len(self._stack):
-            return self._context.environment. \
-                undefined('there is no parent block called %r.' %
-                          self.name, name='super')
-        return BlockReference(self.name, self._context, self._stack,
-                              self._depth + 1)
-
-    @internalcode
-    def __call__(self):
-        rv = concat(self._stack[self._depth](self._context))
-        if self._context.eval_ctx.autoescape:
-            rv = Markup(rv)
-        return rv
-
-
-class LoopContext(object):
-    """A loop context for dynamic iteration."""
-
-    def __init__(self, iterable, recurse=None, depth0=0):
-        self._iterator = iter(iterable)
-        self._recurse = recurse
-        self._after = self._safe_next()
-        self.index0 = -1
-        self.depth0 = depth0
-
-        # try to get the length of the iterable early.  This must be done
-        # here because there are some broken iterators around where there
-        # __len__ is the number of iterations left (i'm looking at your
-        # listreverseiterator!).
-        try:
-            self._length = len(iterable)
-        except (TypeError, AttributeError):
-            self._length = None
-
-    def cycle(self, *args):
-        """Cycles among the arguments with the current loop index."""
-        if not args:
-            raise TypeError('no items for cycling given')
-        return args[self.index0 % len(args)]
-
-    first = property(lambda x: x.index0 == 0)
-    last = property(lambda x: x._after is _last_iteration)
-    index = property(lambda x: x.index0 + 1)
-    revindex = property(lambda x: x.length - x.index0)
-    revindex0 = property(lambda x: x.length - x.index)
-    depth = property(lambda x: x.depth0 + 1)
-
-    def __len__(self):
-        return self.length
-
-    def __iter__(self):
-        return LoopContextIterator(self)
-
-    def _safe_next(self):
-        try:
-            return next(self._iterator)
-        except StopIteration:
-            return _last_iteration
-
-    @internalcode
-    def loop(self, iterable):
-        if self._recurse is None:
-            raise TypeError('Tried to call non recursive loop.  Maybe you '
-                            "forgot the 'recursive' modifier.")
-        return self._recurse(iterable, self._recurse, self.depth0 + 1)
-
-    # a nifty trick to enhance the error message if someone tried to call
-    # the the loop without or with too many arguments.
-    __call__ = loop
-    del loop
-
-    @property
-    def length(self):
-        if self._length is None:
-            # if was not possible to get the length of the iterator when
-            # the loop context was created (ie: iterating over a generator)
-            # we have to convert the iterable into a sequence and use the
-            # length of that + the number of iterations so far.
-            iterable = tuple(self._iterator)
-            self._iterator = iter(iterable)
-            iterations_done = self.index0 + 2
-            self._length = len(iterable) + iterations_done
-        return self._length
-
-    def __repr__(self):
-        return '<%s %r/%r>' % (
-            self.__class__.__name__,
-            self.index,
-            self.length
-        )
-
-
-@implements_iterator
-class LoopContextIterator(object):
-    """The iterator for a loop context."""
-    __slots__ = ('context',)
-
-    def __init__(self, context):
-        self.context = context
-
-    def __iter__(self):
-        return self
-
-    def __next__(self):
-        ctx = self.context
-        ctx.index0 += 1
-        if ctx._after is _last_iteration:
-            raise StopIteration()
-        next_elem = ctx._after
-        ctx._after = ctx._safe_next()
-        return next_elem, ctx
-
-
-class Macro(object):
-    """Wraps a macro function."""
-
-    def __init__(self, environment, func, name, arguments, defaults,
-                 catch_kwargs, catch_varargs, caller):
-        self._environment = environment
-        self._func = func
-        self._argument_count = len(arguments)
-        self.name = name
-        self.arguments = arguments
-        self.defaults = defaults
-        self.catch_kwargs = catch_kwargs
-        self.catch_varargs = catch_varargs
-        self.caller = caller
-
-    @internalcode
-    def __call__(self, *args, **kwargs):
-        # try to consume the positional arguments
-        arguments = list(args[:self._argument_count])
-        off = len(arguments)
-
-        # if the number of arguments consumed is not the number of
-        # arguments expected we start filling in keyword arguments
-        # and defaults.
-        if off != self._argument_count:
-            for idx, name in enumerate(self.arguments[len(arguments):]):
-                try:
-                    value = kwargs.pop(name)
-                except KeyError:
-                    try:
-                        value = self.defaults[idx - self._argument_count + off]
-                    except IndexError:
-                        value = self._environment.undefined(
-                            'parameter %r was not provided' % name, name=name)
-                arguments.append(value)
-
-        # it's important that the order of these arguments does not change
-        # if not also changed in the compiler's `function_scoping` method.
-        # the order is caller, keyword arguments, positional arguments!
-        if self.caller:
-            caller = kwargs.pop('caller', None)
-            if caller is None:
-                caller = self._environment.undefined('No caller defined',
-                                                     name='caller')
-            arguments.append(caller)
-        if self.catch_kwargs:
-            arguments.append(kwargs)
-        elif kwargs:
-            raise TypeError('macro %r takes no keyword argument %r' %
-                            (self.name, next(iter(kwargs))))
-        if self.catch_varargs:
-            arguments.append(args[self._argument_count:])
-        elif len(args) > self._argument_count:
-            raise TypeError('macro %r takes not more than %d argument(s)' %
-                            (self.name, len(self.arguments)))
-        return self._func(*arguments)
-
-    def __repr__(self):
-        return '<%s %s>' % (
-            self.__class__.__name__,
-            self.name is None and 'anonymous' or repr(self.name)
-        )
-
-
-@implements_to_string
-class Undefined(object):
-    """The default undefined type.  This undefined type can be printed and
-    iterated over, but every other access will raise an :exc:`jinja2.exceptions.UndefinedError`:
-
-    >>> foo = Undefined(name='foo')
-    >>> str(foo)
-    ''
-    >>> not foo
-    True
-    >>> foo + 42
-    Traceback (most recent call last):
-      ...
-    jinja2.exceptions.UndefinedError: 'foo' is undefined
-    """
-    __slots__ = ('_undefined_hint', '_undefined_obj', '_undefined_name',
-                 '_undefined_exception')
-
-    def __init__(self, hint=None, obj=missing, name=None, exc=UndefinedError):
-        self._undefined_hint = hint
-        self._undefined_obj = obj
-        self._undefined_name = name
-        self._undefined_exception = exc
-
-    @internalcode
-    def _fail_with_undefined_error(self, *args, **kwargs):
-        """Regular callback function for undefined objects that raises an
-        `jinja2.exceptions.UndefinedError` on call.
-        """
-        if self._undefined_hint is None:
-            if self._undefined_obj is missing:
-                hint = '%r is undefined' % self._undefined_name
-            elif not isinstance(self._undefined_name, string_types):
-                hint = '%s has no element %r' % (
-                    object_type_repr(self._undefined_obj),
-                    self._undefined_name
-                )
-            else:
-                hint = '%r has no attribute %r' % (
-                    object_type_repr(self._undefined_obj),
-                    self._undefined_name
-                )
-        else:
-            hint = self._undefined_hint
-        raise self._undefined_exception(hint)
-
-    @internalcode
-    def __getattr__(self, name):
-        if name[:2] == '__':
-            raise AttributeError(name)
-        return self._fail_with_undefined_error()
-
-    __add__ = __radd__ = __mul__ = __rmul__ = __div__ = __rdiv__ = \
-        __truediv__ = __rtruediv__ = __floordiv__ = __rfloordiv__ = \
-        __mod__ = __rmod__ = __pos__ = __neg__ = __call__ = \
-        __getitem__ = __lt__ = __le__ = __gt__ = __ge__ = __int__ = \
-        __float__ = __complex__ = __pow__ = __rpow__ = \
-        _fail_with_undefined_error
-
-    def __eq__(self, other):
-        return type(self) is type(other)
-
-    def __ne__(self, other):
-        return not self.__eq__(other)
-
-    def __hash__(self):
-        return id(type(self))
-
-    def __str__(self):
-        return u''
-
-    def __len__(self):
-        return 0
-
-    def __iter__(self):
-        if 0:
-            yield None
-
-    def __nonzero__(self):
-        return False
-    __bool__ = __nonzero__
-
-    def __repr__(self):
-        return 'Undefined'
-
-
-def make_logging_undefined(logger=None, base=None):
-    """Given a logger object this returns a new undefined class that will
-    log certain failures.  It will log iterations and printing.  If no
-    logger is given a default logger is created.
-
-    Example::
-
-        logger = logging.getLogger(__name__)
-        LoggingUndefined = make_logging_undefined(
-            logger=logger,
-            base=Undefined
-        )
-
-    .. versionadded:: 2.8
-
-    :param logger: the logger to use.  If not provided, a default logger
-                   is created.
-    :param base: the base class to add logging functionality to.  This
-                 defaults to :class:`Undefined`.
-    """
-    if logger is None:
-        import logging
-        logger = logging.getLogger(__name__)
-        logger.addHandler(logging.StreamHandler(sys.stderr))
-    if base is None:
-        base = Undefined
-
-    def _log_message(undef):
-        if undef._undefined_hint is None:
-            if undef._undefined_obj is missing:
-                hint = '%s is undefined' % undef._undefined_name
-            elif not isinstance(undef._undefined_name, string_types):
-                hint = '%s has no element %s' % (
-                    object_type_repr(undef._undefined_obj),
-                    undef._undefined_name)
-            else:
-                hint = '%s has no attribute %s' % (
-                    object_type_repr(undef._undefined_obj),
-                    undef._undefined_name)
-        else:
-            hint = undef._undefined_hint
-        logger.warning('Template variable warning: %s', hint)
-
-    class LoggingUndefined(base):
-
-        def _fail_with_undefined_error(self, *args, **kwargs):
-            try:
-                return base._fail_with_undefined_error(self, *args, **kwargs)
-            except self._undefined_exception as e:
-                logger.error('Template variable error: %s', str(e))
-                raise e
-
-        def __str__(self):
-            rv = base.__str__(self)
-            _log_message(self)
-            return rv
-
-        def __iter__(self):
-            rv = base.__iter__(self)
-            _log_message(self)
-            return rv
-
-        if PY2:
-            def __nonzero__(self):
-                rv = base.__nonzero__(self)
-                _log_message(self)
-                return rv
-
-            def __unicode__(self):
-                rv = base.__unicode__(self)
-                _log_message(self)
-                return rv
-        else:
-            def __bool__(self):
-                rv = base.__bool__(self)
-                _log_message(self)
-                return rv
-
-    return LoggingUndefined
-
-
-@implements_to_string
-class DebugUndefined(Undefined):
-    """An undefined that returns the debug info when printed.
-
-    >>> foo = DebugUndefined(name='foo')
-    >>> str(foo)
-    '{{ foo }}'
-    >>> not foo
-    True
-    >>> foo + 42
-    Traceback (most recent call last):
-      ...
-    jinja2.exceptions.UndefinedError: 'foo' is undefined
-    """
-    __slots__ = ()
-
-    def __str__(self):
-        if self._undefined_hint is None:
-            if self._undefined_obj is missing:
-                return u'{{ %s }}' % self._undefined_name
-            return '{{ no such element: %s[%r] }}' % (
-                object_type_repr(self._undefined_obj),
-                self._undefined_name
-            )
-        return u'{{ undefined value printed: %s }}' % self._undefined_hint
-
-
-@implements_to_string
-class StrictUndefined(Undefined):
-    """An undefined that barks on print and iteration as well as boolean
-    tests and all kinds of comparisons.  In other words: you can do nothing
-    with it except checking if it's defined using the `defined` test.
-
-    >>> foo = StrictUndefined(name='foo')
-    >>> str(foo)
-    Traceback (most recent call last):
-      ...
-    jinja2.exceptions.UndefinedError: 'foo' is undefined
-    >>> not foo
-    Traceback (most recent call last):
-      ...
-    jinja2.exceptions.UndefinedError: 'foo' is undefined
-    >>> foo + 42
-    Traceback (most recent call last):
-      ...
-    jinja2.exceptions.UndefinedError: 'foo' is undefined
-    """
-    __slots__ = ()
-    __iter__ = __str__ = __len__ = __nonzero__ = __eq__ = \
-        __ne__ = __bool__ = __hash__ = \
-        Undefined._fail_with_undefined_error
-
-
-# remove remaining slots attributes, after the metaclass did the magic they
-# are unneeded and irritating as they contain wrong data for the subclasses.
-del Undefined.__slots__, DebugUndefined.__slots__, StrictUndefined.__slots__
diff --git a/third_party/jinja2/sandbox.py b/third_party/jinja2/sandbox.py
deleted file mode 100644
index 7e40ab3..0000000
--- a/third_party/jinja2/sandbox.py
+++ /dev/null
@@ -1,367 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    jinja2.sandbox
-    ~~~~~~~~~~~~~~
-
-    Adds a sandbox layer to Jinja as it was the default behavior in the old
-    Jinja 1 releases.  This sandbox is slightly different from Jinja 1 as the
-    default behavior is easier to use.
-
-    The behavior can be changed by subclassing the environment.
-
-    :copyright: (c) 2010 by the Jinja Team.
-    :license: BSD.
-"""
-import types
-import operator
-from jinja2.environment import Environment
-from jinja2.exceptions import SecurityError
-from jinja2._compat import string_types, PY2
-
-
-#: maximum number of items a range may produce
-MAX_RANGE = 100000
-
-#: attributes of function objects that are considered unsafe.
-if PY2:
-    UNSAFE_FUNCTION_ATTRIBUTES = set(['func_closure', 'func_code', 'func_dict',
-                                      'func_defaults', 'func_globals'])
-else:
-    # On versions > python 2 the special attributes on functions are gone,
-    # but they remain on methods and generators for whatever reason.
-    UNSAFE_FUNCTION_ATTRIBUTES = set()
-
-
-#: unsafe method attributes.  function attributes are unsafe for methods too
-UNSAFE_METHOD_ATTRIBUTES = set(['im_class', 'im_func', 'im_self'])
-
-#: unsafe generator attirbutes.
-UNSAFE_GENERATOR_ATTRIBUTES = set(['gi_frame', 'gi_code'])
-
-import warnings
-
-# make sure we don't warn in python 2.6 about stuff we don't care about
-warnings.filterwarnings('ignore', 'the sets module', DeprecationWarning,
-                        module='jinja2.sandbox')
-
-from collections import deque
-
-_mutable_set_types = (set,)
-_mutable_mapping_types = (dict,)
-_mutable_sequence_types = (list,)
-
-
-# on python 2.x we can register the user collection types
-try:
-    from UserDict import UserDict, DictMixin
-    from UserList import UserList
-    _mutable_mapping_types += (UserDict, DictMixin)
-    _mutable_set_types += (UserList,)
-except ImportError:
-    pass
-
-# if sets is still available, register the mutable set from there as well
-try:
-    from sets import Set
-    _mutable_set_types += (Set,)
-except ImportError:
-    pass
-
-#: register Python 2.6 abstract base classes
-try:
-    from collections import MutableSet, MutableMapping, MutableSequence
-    _mutable_set_types += (MutableSet,)
-    _mutable_mapping_types += (MutableMapping,)
-    _mutable_sequence_types += (MutableSequence,)
-except ImportError:
-    pass
-
-_mutable_spec = (
-    (_mutable_set_types, frozenset([
-        'add', 'clear', 'difference_update', 'discard', 'pop', 'remove',
-        'symmetric_difference_update', 'update'
-    ])),
-    (_mutable_mapping_types, frozenset([
-        'clear', 'pop', 'popitem', 'setdefault', 'update'
-    ])),
-    (_mutable_sequence_types, frozenset([
-        'append', 'reverse', 'insert', 'sort', 'extend', 'remove'
-    ])),
-    (deque, frozenset([
-        'append', 'appendleft', 'clear', 'extend', 'extendleft', 'pop',
-        'popleft', 'remove', 'rotate'
-    ]))
-)
-
-
-def safe_range(*args):
-    """A range that can't generate ranges with a length of more than
-    MAX_RANGE items.
-    """
-    rng = range(*args)
-    if len(rng) > MAX_RANGE:
-        raise OverflowError('range too big, maximum size for range is %d' %
-                            MAX_RANGE)
-    return rng
-
-
-def unsafe(f):
-    """Marks a function or method as unsafe.
-
-    ::
-
-        @unsafe
-        def delete(self):
-            pass
-    """
-    f.unsafe_callable = True
-    return f
-
-
-def is_internal_attribute(obj, attr):
-    """Test if the attribute given is an internal python attribute.  For
-    example this function returns `True` for the `func_code` attribute of
-    python objects.  This is useful if the environment method
-    :meth:`~SandboxedEnvironment.is_safe_attribute` is overridden.
-
-    >>> from jinja2.sandbox import is_internal_attribute
-    >>> is_internal_attribute(str, "mro")
-    True
-    >>> is_internal_attribute(str, "upper")
-    False
-    """
-    if isinstance(obj, types.FunctionType):
-        if attr in UNSAFE_FUNCTION_ATTRIBUTES:
-            return True
-    elif isinstance(obj, types.MethodType):
-        if attr in UNSAFE_FUNCTION_ATTRIBUTES or \
-           attr in UNSAFE_METHOD_ATTRIBUTES:
-            return True
-    elif isinstance(obj, type):
-        if attr == 'mro':
-            return True
-    elif isinstance(obj, (types.CodeType, types.TracebackType, types.FrameType)):
-        return True
-    elif isinstance(obj, types.GeneratorType):
-        if attr in UNSAFE_GENERATOR_ATTRIBUTES:
-            return True
-    return attr.startswith('__')
-
-
-def modifies_known_mutable(obj, attr):
-    """This function checks if an attribute on a builtin mutable object
-    (list, dict, set or deque) would modify it if called.  It also supports
-    the "user"-versions of the objects (`sets.Set`, `UserDict.*` etc.) and
-    with Python 2.6 onwards the abstract base classes `MutableSet`,
-    `MutableMapping`, and `MutableSequence`.
-
-    >>> modifies_known_mutable({}, "clear")
-    True
-    >>> modifies_known_mutable({}, "keys")
-    False
-    >>> modifies_known_mutable([], "append")
-    True
-    >>> modifies_known_mutable([], "index")
-    False
-
-    If called with an unsupported object (such as unicode) `False` is
-    returned.
-
-    >>> modifies_known_mutable("foo", "upper")
-    False
-    """
-    for typespec, unsafe in _mutable_spec:
-        if isinstance(obj, typespec):
-            return attr in unsafe
-    return False
-
-
-class SandboxedEnvironment(Environment):
-    """The sandboxed environment.  It works like the regular environment but
-    tells the compiler to generate sandboxed code.  Additionally subclasses of
-    this environment may override the methods that tell the runtime what
-    attributes or functions are safe to access.
-
-    If the template tries to access insecure code a :exc:`SecurityError` is
-    raised.  However also other exceptions may occour during the rendering so
-    the caller has to ensure that all exceptions are catched.
-    """
-    sandboxed = True
-
-    #: default callback table for the binary operators.  A copy of this is
-    #: available on each instance of a sandboxed environment as
-    #: :attr:`binop_table`
-    default_binop_table = {
-        '+':        operator.add,
-        '-':        operator.sub,
-        '*':        operator.mul,
-        '/':        operator.truediv,
-        '//':       operator.floordiv,
-        '**':       operator.pow,
-        '%':        operator.mod
-    }
-
-    #: default callback table for the unary operators.  A copy of this is
-    #: available on each instance of a sandboxed environment as
-    #: :attr:`unop_table`
-    default_unop_table = {
-        '+':        operator.pos,
-        '-':        operator.neg
-    }
-
-    #: a set of binary operators that should be intercepted.  Each operator
-    #: that is added to this set (empty by default) is delegated to the
-    #: :meth:`call_binop` method that will perform the operator.  The default
-    #: operator callback is specified by :attr:`binop_table`.
-    #:
-    #: The following binary operators are interceptable:
-    #: ``//``, ``%``, ``+``, ``*``, ``-``, ``/``, and ``**``
-    #:
-    #: The default operation form the operator table corresponds to the
-    #: builtin function.  Intercepted calls are always slower than the native
-    #: operator call, so make sure only to intercept the ones you are
-    #: interested in.
-    #:
-    #: .. versionadded:: 2.6
-    intercepted_binops = frozenset()
-
-    #: a set of unary operators that should be intercepted.  Each operator
-    #: that is added to this set (empty by default) is delegated to the
-    #: :meth:`call_unop` method that will perform the operator.  The default
-    #: operator callback is specified by :attr:`unop_table`.
-    #:
-    #: The following unary operators are interceptable: ``+``, ``-``
-    #:
-    #: The default operation form the operator table corresponds to the
-    #: builtin function.  Intercepted calls are always slower than the native
-    #: operator call, so make sure only to intercept the ones you are
-    #: interested in.
-    #:
-    #: .. versionadded:: 2.6
-    intercepted_unops = frozenset()
-
-    def intercept_unop(self, operator):
-        """Called during template compilation with the name of a unary
-        operator to check if it should be intercepted at runtime.  If this
-        method returns `True`, :meth:`call_unop` is excuted for this unary
-        operator.  The default implementation of :meth:`call_unop` will use
-        the :attr:`unop_table` dictionary to perform the operator with the
-        same logic as the builtin one.
-
-        The following unary operators are interceptable: ``+`` and ``-``
-
-        Intercepted calls are always slower than the native operator call,
-        so make sure only to intercept the ones you are interested in.
-
-        .. versionadded:: 2.6
-        """
-        return False
-
-
-    def __init__(self, *args, **kwargs):
-        Environment.__init__(self, *args, **kwargs)
-        self.globals['range'] = safe_range
-        self.binop_table = self.default_binop_table.copy()
-        self.unop_table = self.default_unop_table.copy()
-
-    def is_safe_attribute(self, obj, attr, value):
-        """The sandboxed environment will call this method to check if the
-        attribute of an object is safe to access.  Per default all attributes
-        starting with an underscore are considered private as well as the
-        special attributes of internal python objects as returned by the
-        :func:`is_internal_attribute` function.
-        """
-        return not (attr.startswith('_') or is_internal_attribute(obj, attr))
-
-    def is_safe_callable(self, obj):
-        """Check if an object is safely callable.  Per default a function is
-        considered safe unless the `unsafe_callable` attribute exists and is
-        True.  Override this method to alter the behavior, but this won't
-        affect the `unsafe` decorator from this module.
-        """
-        return not (getattr(obj, 'unsafe_callable', False) or
-                    getattr(obj, 'alters_data', False))
-
-    def call_binop(self, context, operator, left, right):
-        """For intercepted binary operator calls (:meth:`intercepted_binops`)
-        this function is executed instead of the builtin operator.  This can
-        be used to fine tune the behavior of certain operators.
-
-        .. versionadded:: 2.6
-        """
-        return self.binop_table[operator](left, right)
-
-    def call_unop(self, context, operator, arg):
-        """For intercepted unary operator calls (:meth:`intercepted_unops`)
-        this function is executed instead of the builtin operator.  This can
-        be used to fine tune the behavior of certain operators.
-
-        .. versionadded:: 2.6
-        """
-        return self.unop_table[operator](arg)
-
-    def getitem(self, obj, argument):
-        """Subscribe an object from sandboxed code."""
-        try:
-            return obj[argument]
-        except (TypeError, LookupError):
-            if isinstance(argument, string_types):
-                try:
-                    attr = str(argument)
-                except Exception:
-                    pass
-                else:
-                    try:
-                        value = getattr(obj, attr)
-                    except AttributeError:
-                        pass
-                    else:
-                        if self.is_safe_attribute(obj, argument, value):
-                            return value
-                        return self.unsafe_undefined(obj, argument)
-        return self.undefined(obj=obj, name=argument)
-
-    def getattr(self, obj, attribute):
-        """Subscribe an object from sandboxed code and prefer the
-        attribute.  The attribute passed *must* be a bytestring.
-        """
-        try:
-            value = getattr(obj, attribute)
-        except AttributeError:
-            try:
-                return obj[attribute]
-            except (TypeError, LookupError):
-                pass
-        else:
-            if self.is_safe_attribute(obj, attribute, value):
-                return value
-            return self.unsafe_undefined(obj, attribute)
-        return self.undefined(obj=obj, name=attribute)
-
-    def unsafe_undefined(self, obj, attribute):
-        """Return an undefined object for unsafe attributes."""
-        return self.undefined('access to attribute %r of %r '
-                              'object is unsafe.' % (
-            attribute,
-            obj.__class__.__name__
-        ), name=attribute, obj=obj, exc=SecurityError)
-
-    def call(__self, __context, __obj, *args, **kwargs):
-        """Call an object from sandboxed code."""
-        # the double prefixes are to avoid double keyword argument
-        # errors when proxying the call.
-        if not __self.is_safe_callable(__obj):
-            raise SecurityError('%r is not safely callable' % (__obj,))
-        return __context.call(__obj, *args, **kwargs)
-
-
-class ImmutableSandboxedEnvironment(SandboxedEnvironment):
-    """Works exactly like the regular `SandboxedEnvironment` but does not
-    permit modifications on the builtin mutable objects `list`, `set`, and
-    `dict` by using the :func:`modifies_known_mutable` function.
-    """
-
-    def is_safe_attribute(self, obj, attr, value):
-        if not SandboxedEnvironment.is_safe_attribute(self, obj, attr, value):
-            return False
-        return not modifies_known_mutable(obj, attr)
diff --git a/third_party/jinja2/tests.py b/third_party/jinja2/tests.py
deleted file mode 100644
index bb32349..0000000
--- a/third_party/jinja2/tests.py
+++ /dev/null
@@ -1,173 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    jinja2.tests
-    ~~~~~~~~~~~~
-
-    Jinja test functions. Used with the "is" operator.
-
-    :copyright: (c) 2010 by the Jinja Team.
-    :license: BSD, see LICENSE for more details.
-"""
-import re
-from collections import Mapping
-from jinja2.runtime import Undefined
-from jinja2._compat import text_type, string_types, integer_types
-import decimal
-
-number_re = re.compile(r'^-?\d+(\.\d+)?$')
-regex_type = type(number_re)
-
-
-test_callable = callable
-
-
-def test_odd(value):
-    """Return true if the variable is odd."""
-    return value % 2 == 1
-
-
-def test_even(value):
-    """Return true if the variable is even."""
-    return value % 2 == 0
-
-
-def test_divisibleby(value, num):
-    """Check if a variable is divisible by a number."""
-    return value % num == 0
-
-
-def test_defined(value):
-    """Return true if the variable is defined:
-
-    .. sourcecode:: jinja
-
-        {% if variable is defined %}
-            value of variable: {{ variable }}
-        {% else %}
-            variable is not defined
-        {% endif %}
-
-    See the :func:`default` filter for a simple way to set undefined
-    variables.
-    """
-    return not isinstance(value, Undefined)
-
-
-def test_undefined(value):
-    """Like :func:`defined` but the other way round."""
-    return isinstance(value, Undefined)
-
-
-def test_none(value):
-    """Return true if the variable is none."""
-    return value is None
-
-
-def test_lower(value):
-    """Return true if the variable is lowercased."""
-    return text_type(value).islower()
-
-
-def test_upper(value):
-    """Return true if the variable is uppercased."""
-    return text_type(value).isupper()
-
-
-def test_string(value):
-    """Return true if the object is a string."""
-    return isinstance(value, string_types)
-
-
-def test_mapping(value):
-    """Return true if the object is a mapping (dict etc.).
-
-    .. versionadded:: 2.6
-    """
-    return isinstance(value, Mapping)
-
-
-def test_number(value):
-    """Return true if the variable is a number."""
-    return isinstance(value, integer_types + (float, complex, decimal.Decimal))
-
-
-def test_sequence(value):
-    """Return true if the variable is a sequence. Sequences are variables
-    that are iterable.
-    """
-    try:
-        len(value)
-        value.__getitem__
-    except:
-        return False
-    return True
-
-
-def test_equalto(value, other):
-    """Check if an object has the same value as another object:
-
-    .. sourcecode:: jinja
-
-        {% if foo.expression is equalto 42 %}
-            the foo attribute evaluates to the constant 42
-        {% endif %}
-
-    This appears to be a useless test as it does exactly the same as the
-    ``==`` operator, but it can be useful when used together with the
-    `selectattr` function:
-
-    .. sourcecode:: jinja
-
-        {{ users|selectattr("email", "equalto", "foo@bar.invalid") }}
-
-    .. versionadded:: 2.8
-    """
-    return value == other
-
-
-def test_sameas(value, other):
-    """Check if an object points to the same memory address than another
-    object:
-
-    .. sourcecode:: jinja
-
-        {% if foo.attribute is sameas false %}
-            the foo attribute really is the `False` singleton
-        {% endif %}
-    """
-    return value is other
-
-
-def test_iterable(value):
-    """Check if it's possible to iterate over an object."""
-    try:
-        iter(value)
-    except TypeError:
-        return False
-    return True
-
-
-def test_escaped(value):
-    """Check if the value is escaped."""
-    return hasattr(value, '__html__')
-
-
-TESTS = {
-    'odd':              test_odd,
-    'even':             test_even,
-    'divisibleby':      test_divisibleby,
-    'defined':          test_defined,
-    'undefined':        test_undefined,
-    'none':             test_none,
-    'lower':            test_lower,
-    'upper':            test_upper,
-    'string':           test_string,
-    'mapping':          test_mapping,
-    'number':           test_number,
-    'sequence':         test_sequence,
-    'iterable':         test_iterable,
-    'callable':         test_callable,
-    'sameas':           test_sameas,
-    'equalto':          test_equalto,
-    'escaped':          test_escaped
-}
diff --git a/third_party/jinja2/utils.py b/third_party/jinja2/utils.py
deleted file mode 100644
index cdd4cd3..0000000
--- a/third_party/jinja2/utils.py
+++ /dev/null
@@ -1,531 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    jinja2.utils
-    ~~~~~~~~~~~~
-
-    Utility functions.
-
-    :copyright: (c) 2010 by the Jinja Team.
-    :license: BSD, see LICENSE for more details.
-"""
-import re
-import errno
-from collections import deque
-from threading import Lock
-from jinja2._compat import text_type, string_types, implements_iterator, \
-     url_quote
-
-
-_word_split_re = re.compile(r'(\s+)')
-_punctuation_re = re.compile(
-    '^(?P<lead>(?:%s)*)(?P<middle>.*?)(?P<trail>(?:%s)*)$' % (
-        '|'.join(map(re.escape, ('(', '<', '&lt;'))),
-        '|'.join(map(re.escape, ('.', ',', ')', '>', '\n', '&gt;')))
-    )
-)
-_simple_email_re = re.compile(r'^\S+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9._-]+$')
-_striptags_re = re.compile(r'(<!--.*?-->|<[^>]*>)')
-_entity_re = re.compile(r'&([^;]+);')
-_letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
-_digits = '0123456789'
-
-# special singleton representing missing values for the runtime
-missing = type('MissingType', (), {'__repr__': lambda x: 'missing'})()
-
-# internal code
-internal_code = set()
-
-concat = u''.join
-
-
-def contextfunction(f):
-    """This decorator can be used to mark a function or method context callable.
-    A context callable is passed the active :class:`Context` as first argument when
-    called from the template.  This is useful if a function wants to get access
-    to the context or functions provided on the context object.  For example
-    a function that returns a sorted list of template variables the current
-    template exports could look like this::
-
-        @contextfunction
-        def get_exported_names(context):
-            return sorted(context.exported_vars)
-    """
-    f.contextfunction = True
-    return f
-
-
-def evalcontextfunction(f):
-    """This decorator can be used to mark a function or method as an eval
-    context callable.  This is similar to the :func:`contextfunction`
-    but instead of passing the context, an evaluation context object is
-    passed.  For more information about the eval context, see
-    :ref:`eval-context`.
-
-    .. versionadded:: 2.4
-    """
-    f.evalcontextfunction = True
-    return f
-
-
-def environmentfunction(f):
-    """This decorator can be used to mark a function or method as environment
-    callable.  This decorator works exactly like the :func:`contextfunction`
-    decorator just that the first argument is the active :class:`Environment`
-    and not context.
-    """
-    f.environmentfunction = True
-    return f
-
-
-def internalcode(f):
-    """Marks the function as internally used"""
-    internal_code.add(f.__code__)
-    return f
-
-
-def is_undefined(obj):
-    """Check if the object passed is undefined.  This does nothing more than
-    performing an instance check against :class:`Undefined` but looks nicer.
-    This can be used for custom filters or tests that want to react to
-    undefined variables.  For example a custom default filter can look like
-    this::
-
-        def default(var, default=''):
-            if is_undefined(var):
-                return default
-            return var
-    """
-    from jinja2.runtime import Undefined
-    return isinstance(obj, Undefined)
-
-
-def consume(iterable):
-    """Consumes an iterable without doing anything with it."""
-    for event in iterable:
-        pass
-
-
-def clear_caches():
-    """Jinja2 keeps internal caches for environments and lexers.  These are
-    used so that Jinja2 doesn't have to recreate environments and lexers all
-    the time.  Normally you don't have to care about that but if you are
-    messuring memory consumption you may want to clean the caches.
-    """
-    from jinja2.environment import _spontaneous_environments
-    from jinja2.lexer import _lexer_cache
-    _spontaneous_environments.clear()
-    _lexer_cache.clear()
-
-
-def import_string(import_name, silent=False):
-    """Imports an object based on a string.  This is useful if you want to
-    use import paths as endpoints or something similar.  An import path can
-    be specified either in dotted notation (``xml.sax.saxutils.escape``)
-    or with a colon as object delimiter (``xml.sax.saxutils:escape``).
-
-    If the `silent` is True the return value will be `None` if the import
-    fails.
-
-    :return: imported object
-    """
-    try:
-        if ':' in import_name:
-            module, obj = import_name.split(':', 1)
-        elif '.' in import_name:
-            items = import_name.split('.')
-            module = '.'.join(items[:-1])
-            obj = items[-1]
-        else:
-            return __import__(import_name)
-        return getattr(__import__(module, None, None, [obj]), obj)
-    except (ImportError, AttributeError):
-        if not silent:
-            raise
-
-
-def open_if_exists(filename, mode='rb'):
-    """Returns a file descriptor for the filename if that file exists,
-    otherwise `None`.
-    """
-    try:
-        return open(filename, mode)
-    except IOError as e:
-        if e.errno not in (errno.ENOENT, errno.EISDIR, errno.EINVAL):
-            raise
-
-
-def object_type_repr(obj):
-    """Returns the name of the object's type.  For some recognized
-    singletons the name of the object is returned instead. (For
-    example for `None` and `Ellipsis`).
-    """
-    if obj is None:
-        return 'None'
-    elif obj is Ellipsis:
-        return 'Ellipsis'
-    # __builtin__ in 2.x, builtins in 3.x
-    if obj.__class__.__module__ in ('__builtin__', 'builtins'):
-        name = obj.__class__.__name__
-    else:
-        name = obj.__class__.__module__ + '.' + obj.__class__.__name__
-    return '%s object' % name
-
-
-def pformat(obj, verbose=False):
-    """Prettyprint an object.  Either use the `pretty` library or the
-    builtin `pprint`.
-    """
-    try:
-        from pretty import pretty
-        return pretty(obj, verbose=verbose)
-    except ImportError:
-        from pprint import pformat
-        return pformat(obj)
-
-
-def urlize(text, trim_url_limit=None, nofollow=False, target=None):
-    """Converts any URLs in text into clickable links. Works on http://,
-    https:// and www. links. Links can have trailing punctuation (periods,
-    commas, close-parens) and leading punctuation (opening parens) and
-    it'll still do the right thing.
-
-    If trim_url_limit is not None, the URLs in link text will be limited
-    to trim_url_limit characters.
-
-    If nofollow is True, the URLs in link text will get a rel="nofollow"
-    attribute.
-
-    If target is not None, a target attribute will be added to the link.
-    """
-    trim_url = lambda x, limit=trim_url_limit: limit is not None \
-                         and (x[:limit] + (len(x) >=limit and '...'
-                         or '')) or x
-    words = _word_split_re.split(text_type(escape(text)))
-    nofollow_attr = nofollow and ' rel="nofollow"' or ''
-    if target is not None and isinstance(target, string_types):
-        target_attr = ' target="%s"' % target
-    else:
-        target_attr = ''
-    for i, word in enumerate(words):
-        match = _punctuation_re.match(word)
-        if match:
-            lead, middle, trail = match.groups()
-            if middle.startswith('www.') or (
-                '@' not in middle and
-                not middle.startswith('http://') and
-                not middle.startswith('https://') and
-                len(middle) > 0 and
-                middle[0] in _letters + _digits and (
-                    middle.endswith('.org') or
-                    middle.endswith('.net') or
-                    middle.endswith('.com')
-                )):
-                middle = '<a href="http://%s"%s%s>%s</a>' % (middle,
-                    nofollow_attr, target_attr, trim_url(middle))
-            if middle.startswith('http://') or \
-               middle.startswith('https://'):
-                middle = '<a href="%s"%s%s>%s</a>' % (middle,
-                    nofollow_attr, target_attr, trim_url(middle))
-            if '@' in middle and not middle.startswith('www.') and \
-               not ':' in middle and _simple_email_re.match(middle):
-                middle = '<a href="mailto:%s">%s</a>' % (middle, middle)
-            if lead + middle + trail != word:
-                words[i] = lead + middle + trail
-    return u''.join(words)
-
-
-def generate_lorem_ipsum(n=5, html=True, min=20, max=100):
-    """Generate some lorem ipsum for the template."""
-    from jinja2.constants import LOREM_IPSUM_WORDS
-    from random import choice, randrange
-    words = LOREM_IPSUM_WORDS.split()
-    result = []
-
-    for _ in range(n):
-        next_capitalized = True
-        last_comma = last_fullstop = 0
-        word = None
-        last = None
-        p = []
-
-        # each paragraph contains out of 20 to 100 words.
-        for idx, _ in enumerate(range(randrange(min, max))):
-            while True:
-                word = choice(words)
-                if word != last:
-                    last = word
-                    break
-            if next_capitalized:
-                word = word.capitalize()
-                next_capitalized = False
-            # add commas
-            if idx - randrange(3, 8) > last_comma:
-                last_comma = idx
-                last_fullstop += 2
-                word += ','
-            # add end of sentences
-            if idx - randrange(10, 20) > last_fullstop:
-                last_comma = last_fullstop = idx
-                word += '.'
-                next_capitalized = True
-            p.append(word)
-
-        # ensure that the paragraph ends with a dot.
-        p = u' '.join(p)
-        if p.endswith(','):
-            p = p[:-1] + '.'
-        elif not p.endswith('.'):
-            p += '.'
-        result.append(p)
-
-    if not html:
-        return u'\n\n'.join(result)
-    return Markup(u'\n'.join(u'<p>%s</p>' % escape(x) for x in result))
-
-
-def unicode_urlencode(obj, charset='utf-8', for_qs=False):
-    """URL escapes a single bytestring or unicode string with the
-    given charset if applicable to URL safe quoting under all rules
-    that need to be considered under all supported Python versions.
-
-    If non strings are provided they are converted to their unicode
-    representation first.
-    """
-    if not isinstance(obj, string_types):
-        obj = text_type(obj)
-    if isinstance(obj, text_type):
-        obj = obj.encode(charset)
-    safe = for_qs and b'' or b'/'
-    rv = text_type(url_quote(obj, safe))
-    if for_qs:
-        rv = rv.replace('%20', '+')
-    return rv
-
-
-class LRUCache(object):
-    """A simple LRU Cache implementation."""
-
-    # this is fast for small capacities (something below 1000) but doesn't
-    # scale.  But as long as it's only used as storage for templates this
-    # won't do any harm.
-
-    def __init__(self, capacity):
-        self.capacity = capacity
-        self._mapping = {}
-        self._queue = deque()
-        self._postinit()
-
-    def _postinit(self):
-        # alias all queue methods for faster lookup
-        self._popleft = self._queue.popleft
-        self._pop = self._queue.pop
-        self._remove = self._queue.remove
-        self._wlock = Lock()
-        self._append = self._queue.append
-
-    def __getstate__(self):
-        return {
-            'capacity':     self.capacity,
-            '_mapping':     self._mapping,
-            '_queue':       self._queue
-        }
-
-    def __setstate__(self, d):
-        self.__dict__.update(d)
-        self._postinit()
-
-    def __getnewargs__(self):
-        return (self.capacity,)
-
-    def copy(self):
-        """Return a shallow copy of the instance."""
-        rv = self.__class__(self.capacity)
-        rv._mapping.update(self._mapping)
-        rv._queue = deque(self._queue)
-        return rv
-
-    def get(self, key, default=None):
-        """Return an item from the cache dict or `default`"""
-        try:
-            return self[key]
-        except KeyError:
-            return default
-
-    def setdefault(self, key, default=None):
-        """Set `default` if the key is not in the cache otherwise
-        leave unchanged. Return the value of this key.
-        """
-        self._wlock.acquire()
-        try:
-            try:
-                return self[key]
-            except KeyError:
-                self[key] = default
-                return default
-        finally:
-            self._wlock.release()
-
-    def clear(self):
-        """Clear the cache."""
-        self._wlock.acquire()
-        try:
-            self._mapping.clear()
-            self._queue.clear()
-        finally:
-            self._wlock.release()
-
-    def __contains__(self, key):
-        """Check if a key exists in this cache."""
-        return key in self._mapping
-
-    def __len__(self):
-        """Return the current size of the cache."""
-        return len(self._mapping)
-
-    def __repr__(self):
-        return '<%s %r>' % (
-            self.__class__.__name__,
-            self._mapping
-        )
-
-    def __getitem__(self, key):
-        """Get an item from the cache. Moves the item up so that it has the
-        highest priority then.
-
-        Raise a `KeyError` if it does not exist.
-        """
-        self._wlock.acquire()
-        try:
-            rv = self._mapping[key]
-            if self._queue[-1] != key:
-                try:
-                    self._remove(key)
-                except ValueError:
-                    # if something removed the key from the container
-                    # when we read, ignore the ValueError that we would
-                    # get otherwise.
-                    pass
-                self._append(key)
-            return rv
-        finally:
-            self._wlock.release()
-
-    def __setitem__(self, key, value):
-        """Sets the value for an item. Moves the item up so that it
-        has the highest priority then.
-        """
-        self._wlock.acquire()
-        try:
-            if key in self._mapping:
-                self._remove(key)
-            elif len(self._mapping) == self.capacity:
-                del self._mapping[self._popleft()]
-            self._append(key)
-            self._mapping[key] = value
-        finally:
-            self._wlock.release()
-
-    def __delitem__(self, key):
-        """Remove an item from the cache dict.
-        Raise a `KeyError` if it does not exist.
-        """
-        self._wlock.acquire()
-        try:
-            del self._mapping[key]
-            try:
-                self._remove(key)
-            except ValueError:
-                # __getitem__ is not locked, it might happen
-                pass
-        finally:
-            self._wlock.release()
-
-    def items(self):
-        """Return a list of items."""
-        result = [(key, self._mapping[key]) for key in list(self._queue)]
-        result.reverse()
-        return result
-
-    def iteritems(self):
-        """Iterate over all items."""
-        return iter(self.items())
-
-    def values(self):
-        """Return a list of all values."""
-        return [x[1] for x in self.items()]
-
-    def itervalue(self):
-        """Iterate over all values."""
-        return iter(self.values())
-
-    def keys(self):
-        """Return a list of all keys ordered by most recent usage."""
-        return list(self)
-
-    def iterkeys(self):
-        """Iterate over all keys in the cache dict, ordered by
-        the most recent usage.
-        """
-        return reversed(tuple(self._queue))
-
-    __iter__ = iterkeys
-
-    def __reversed__(self):
-        """Iterate over the values in the cache dict, oldest items
-        coming first.
-        """
-        return iter(tuple(self._queue))
-
-    __copy__ = copy
-
-
-# register the LRU cache as mutable mapping if possible
-try:
-    from collections import MutableMapping
-    MutableMapping.register(LRUCache)
-except ImportError:
-    pass
-
-
-@implements_iterator
-class Cycler(object):
-    """A cycle helper for templates."""
-
-    def __init__(self, *items):
-        if not items:
-            raise RuntimeError('at least one item has to be provided')
-        self.items = items
-        self.reset()
-
-    def reset(self):
-        """Resets the cycle."""
-        self.pos = 0
-
-    @property
-    def current(self):
-        """Returns the current item."""
-        return self.items[self.pos]
-
-    def __next__(self):
-        """Goes one item ahead and returns it."""
-        rv = self.current
-        self.pos = (self.pos + 1) % len(self.items)
-        return rv
-
-
-class Joiner(object):
-    """A joining helper for templates."""
-
-    def __init__(self, sep=u', '):
-        self.sep = sep
-        self.used = False
-
-    def __call__(self):
-        if not self.used:
-            self.used = True
-            return u''
-        return self.sep
-
-
-# Imported here because that's where it was in the past
-from markupsafe import Markup, escape, soft_unicode
diff --git a/third_party/jinja2/visitor.py b/third_party/jinja2/visitor.py
deleted file mode 100644
index 413e7c3..0000000
--- a/third_party/jinja2/visitor.py
+++ /dev/null
@@ -1,87 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    jinja2.visitor
-    ~~~~~~~~~~~~~~
-
-    This module implements a visitor for the nodes.
-
-    :copyright: (c) 2010 by the Jinja Team.
-    :license: BSD.
-"""
-from jinja2.nodes import Node
-
-
-class NodeVisitor(object):
-    """Walks the abstract syntax tree and call visitor functions for every
-    node found.  The visitor functions may return values which will be
-    forwarded by the `visit` method.
-
-    Per default the visitor functions for the nodes are ``'visit_'`` +
-    class name of the node.  So a `TryFinally` node visit function would
-    be `visit_TryFinally`.  This behavior can be changed by overriding
-    the `get_visitor` function.  If no visitor function exists for a node
-    (return value `None`) the `generic_visit` visitor is used instead.
-    """
-
-    def get_visitor(self, node):
-        """Return the visitor function for this node or `None` if no visitor
-        exists for this node.  In that case the generic visit function is
-        used instead.
-        """
-        method = 'visit_' + node.__class__.__name__
-        return getattr(self, method, None)
-
-    def visit(self, node, *args, **kwargs):
-        """Visit a node."""
-        f = self.get_visitor(node)
-        if f is not None:
-            return f(node, *args, **kwargs)
-        return self.generic_visit(node, *args, **kwargs)
-
-    def generic_visit(self, node, *args, **kwargs):
-        """Called if no explicit visitor function exists for a node."""
-        for node in node.iter_child_nodes():
-            self.visit(node, *args, **kwargs)
-
-
-class NodeTransformer(NodeVisitor):
-    """Walks the abstract syntax tree and allows modifications of nodes.
-
-    The `NodeTransformer` will walk the AST and use the return value of the
-    visitor functions to replace or remove the old node.  If the return
-    value of the visitor function is `None` the node will be removed
-    from the previous location otherwise it's replaced with the return
-    value.  The return value may be the original node in which case no
-    replacement takes place.
-    """
-
-    def generic_visit(self, node, *args, **kwargs):
-        for field, old_value in node.iter_fields():
-            if isinstance(old_value, list):
-                new_values = []
-                for value in old_value:
-                    if isinstance(value, Node):
-                        value = self.visit(value, *args, **kwargs)
-                        if value is None:
-                            continue
-                        elif not isinstance(value, Node):
-                            new_values.extend(value)
-                            continue
-                    new_values.append(value)
-                old_value[:] = new_values
-            elif isinstance(old_value, Node):
-                new_node = self.visit(old_value, *args, **kwargs)
-                if new_node is None:
-                    delattr(node, field)
-                else:
-                    setattr(node, field, new_node)
-        return node
-
-    def visit_list(self, node, *args, **kwargs):
-        """As transformers may return lists in some places this method
-        can be used to enforce a list as return value.
-        """
-        rv = self.visit(node, *args, **kwargs)
-        if not isinstance(rv, list):
-            rv = [rv]
-        return rv
diff --git a/third_party/markupsafe/AUTHORS b/third_party/markupsafe/AUTHORS
deleted file mode 100644
index f7e2942..0000000
--- a/third_party/markupsafe/AUTHORS
+++ /dev/null
@@ -1,13 +0,0 @@
-MarkupSafe is written and maintained by Armin Ronacher and
-various contributors:
-
-Development Lead
-````````````````
-
-- Armin Ronacher <armin.ronacher@active-4.com>
-
-Patches and Suggestions
-```````````````````````
-
-- Georg Brandl
-- Mickaël Guérin
diff --git a/third_party/markupsafe/LICENSE b/third_party/markupsafe/LICENSE
deleted file mode 100644
index 5d26938..0000000
--- a/third_party/markupsafe/LICENSE
+++ /dev/null
@@ -1,33 +0,0 @@
-Copyright (c) 2010 by Armin Ronacher and contributors.  See AUTHORS
-for more details.
-
-Some rights reserved.
-
-Redistribution and use in source and binary forms of the software as well
-as documentation, with or without modification, are permitted provided
-that the following conditions are met:
-
-* Redistributions of source code must retain the above copyright
-  notice, this list of conditions and the following disclaimer.
-
-* Redistributions in binary form must reproduce the above
-  copyright notice, this list of conditions and the following
-  disclaimer in the documentation and/or other materials provided
-  with the distribution.
-
-* The names of the contributors may not be used to endorse or
-  promote products derived from this software without specific
-  prior written permission.
-
-THIS SOFTWARE AND DOCUMENTATION IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT
-NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
-OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE AND DOCUMENTATION, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGE.
diff --git a/third_party/markupsafe/MarkupSafe-0.18.tar.gz.md5 b/third_party/markupsafe/MarkupSafe-0.18.tar.gz.md5
deleted file mode 100644
index 1348d1e..0000000
--- a/third_party/markupsafe/MarkupSafe-0.18.tar.gz.md5
+++ /dev/null
@@ -1 +0,0 @@
-f8d252fd05371e51dec2fe9a36890687  MarkupSafe-0.18.tar.gz
diff --git a/third_party/markupsafe/MarkupSafe-0.18.tar.gz.sha512 b/third_party/markupsafe/MarkupSafe-0.18.tar.gz.sha512
deleted file mode 100644
index ab75220..0000000
--- a/third_party/markupsafe/MarkupSafe-0.18.tar.gz.sha512
+++ /dev/null
@@ -1 +0,0 @@
-0438ddf0fdab465c40d9afba8c14ad346be0868df654c11130d05e329992d456a9bc278551970cbd09244a29c77213885d0c363c951b0cfd4d9aa95b248ecff5  MarkupSafe-0.18.tar.gz
diff --git a/third_party/markupsafe/README.chromium b/third_party/markupsafe/README.chromium
deleted file mode 100644
index 0fcab52..0000000
--- a/third_party/markupsafe/README.chromium
+++ /dev/null
@@ -1,24 +0,0 @@
-Name: MarkupSafe Python Safe String Class
-Short Name: markupsafe
-URL: https://github.com/mitsuhiko/markupsafe
-Version: 0.18
-License: BSD 3-clause License
-License File: NOT_SHIPPED
-Security Critical: no
-
-Description:
-Safe string class, used by Jinja2 template engine.
-
-Source:
-https://pypi.python.org/packages/source/M/MarkupSafe/MarkupSafe-0.18.tar.gz
-MD5: f8d252fd05371e51dec2fe9a36890687
-SHA-512: 0438ddf0fdab465c40d9afba8c14ad346be0868df654c11130d05e329992d456
-         a9bc278551970cbd09244a29c77213885d0c363c951b0cfd4d9aa95b248ecff5
-
-Local Modifications:
-This only includes the markup directory from the tarball and the LICENSE and
-AUTHORS files, removing the unneeded unit tests (tests.py).
-Also includes install script (get_markupsafe.sh) and files of hashes (MD5 is
-also posted on website, SHA-512 computed locally); script checks hash then
-unpacks archive and installs desired files.
-Retrieve or update by executing markupsafe/get_markupsafe.sh from third_party.
diff --git a/third_party/markupsafe/__init__.py b/third_party/markupsafe/__init__.py
deleted file mode 100644
index 25f00d3..0000000
--- a/third_party/markupsafe/__init__.py
+++ /dev/null
@@ -1,234 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    markupsafe
-    ~~~~~~~~~~
-
-    Implements a Markup string.
-
-    :copyright: (c) 2010 by Armin Ronacher.
-    :license: BSD, see LICENSE for more details.
-"""
-import re
-from markupsafe._compat import text_type, string_types, int_types, \
-     unichr, PY2
-
-
-__all__ = ['Markup', 'soft_unicode', 'escape', 'escape_silent']
-
-
-_striptags_re = re.compile(r'(<!--.*?-->|<[^>]*>)')
-_entity_re = re.compile(r'&([^;]+);')
-
-
-class Markup(text_type):
-    r"""Marks a string as being safe for inclusion in HTML/XML output without
-    needing to be escaped.  This implements the `__html__` interface a couple
-    of frameworks and web applications use.  :class:`Markup` is a direct
-    subclass of `unicode` and provides all the methods of `unicode` just that
-    it escapes arguments passed and always returns `Markup`.
-
-    The `escape` function returns markup objects so that double escaping can't
-    happen.
-
-    The constructor of the :class:`Markup` class can be used for three
-    different things:  When passed an unicode object it's assumed to be safe,
-    when passed an object with an HTML representation (has an `__html__`
-    method) that representation is used, otherwise the object passed is
-    converted into a unicode string and then assumed to be safe:
-
-    >>> Markup("Hello <em>World</em>!")
-    Markup(u'Hello <em>World</em>!')
-    >>> class Foo(object):
-    ...  def __html__(self):
-    ...   return '<a href="#">foo</a>'
-    ... 
-    >>> Markup(Foo())
-    Markup(u'<a href="#">foo</a>')
-
-    If you want object passed being always treated as unsafe you can use the
-    :meth:`escape` classmethod to create a :class:`Markup` object:
-
-    >>> Markup.escape("Hello <em>World</em>!")
-    Markup(u'Hello &lt;em&gt;World&lt;/em&gt;!')
-
-    Operations on a markup string are markup aware which means that all
-    arguments are passed through the :func:`escape` function:
-
-    >>> em = Markup("<em>%s</em>")
-    >>> em % "foo & bar"
-    Markup(u'<em>foo &amp; bar</em>')
-    >>> strong = Markup("<strong>%(text)s</strong>")
-    >>> strong % {'text': '<blink>hacker here</blink>'}
-    Markup(u'<strong>&lt;blink&gt;hacker here&lt;/blink&gt;</strong>')
-    >>> Markup("<em>Hello</em> ") + "<foo>"
-    Markup(u'<em>Hello</em> &lt;foo&gt;')
-    """
-    __slots__ = ()
-
-    def __new__(cls, base=u'', encoding=None, errors='strict'):
-        if hasattr(base, '__html__'):
-            base = base.__html__()
-        if encoding is None:
-            return text_type.__new__(cls, base)
-        return text_type.__new__(cls, base, encoding, errors)
-
-    def __html__(self):
-        return self
-
-    def __add__(self, other):
-        if isinstance(other, string_types) or hasattr(other, '__html__'):
-            return self.__class__(super(Markup, self).__add__(self.escape(other)))
-        return NotImplemented
-
-    def __radd__(self, other):
-        if hasattr(other, '__html__') or isinstance(other, string_types):
-            return self.escape(other).__add__(self)
-        return NotImplemented
-
-    def __mul__(self, num):
-        if isinstance(num, int_types):
-            return self.__class__(text_type.__mul__(self, num))
-        return NotImplemented
-    __rmul__ = __mul__
-
-    def __mod__(self, arg):
-        if isinstance(arg, tuple):
-            arg = tuple(_MarkupEscapeHelper(x, self.escape) for x in arg)
-        else:
-            arg = _MarkupEscapeHelper(arg, self.escape)
-        return self.__class__(text_type.__mod__(self, arg))
-
-    def __repr__(self):
-        return '%s(%s)' % (
-            self.__class__.__name__,
-            text_type.__repr__(self)
-        )
-
-    def join(self, seq):
-        return self.__class__(text_type.join(self, map(self.escape, seq)))
-    join.__doc__ = text_type.join.__doc__
-
-    def split(self, *args, **kwargs):
-        return list(map(self.__class__, text_type.split(self, *args, **kwargs)))
-    split.__doc__ = text_type.split.__doc__
-
-    def rsplit(self, *args, **kwargs):
-        return list(map(self.__class__, text_type.rsplit(self, *args, **kwargs)))
-    rsplit.__doc__ = text_type.rsplit.__doc__
-
-    def splitlines(self, *args, **kwargs):
-        return list(map(self.__class__, text_type.splitlines(self, *args, **kwargs)))
-    splitlines.__doc__ = text_type.splitlines.__doc__
-
-    def unescape(self):
-        r"""Unescape markup again into an text_type string.  This also resolves
-        known HTML4 and XHTML entities:
-
-        >>> Markup("Main &raquo; <em>About</em>").unescape()
-        u'Main \xbb <em>About</em>'
-        """
-        from markupsafe._constants import HTML_ENTITIES
-        def handle_match(m):
-            name = m.group(1)
-            if name in HTML_ENTITIES:
-                return unichr(HTML_ENTITIES[name])
-            try:
-                if name[:2] in ('#x', '#X'):
-                    return unichr(int(name[2:], 16))
-                elif name.startswith('#'):
-                    return unichr(int(name[1:]))
-            except ValueError:
-                pass
-            return u''
-        return _entity_re.sub(handle_match, text_type(self))
-
-    def striptags(self):
-        r"""Unescape markup into an text_type string and strip all tags.  This
-        also resolves known HTML4 and XHTML entities.  Whitespace is
-        normalized to one:
-
-        >>> Markup("Main &raquo;  <em>About</em>").striptags()
-        u'Main \xbb About'
-        """
-        stripped = u' '.join(_striptags_re.sub('', self).split())
-        return Markup(stripped).unescape()
-
-    @classmethod
-    def escape(cls, s):
-        """Escape the string.  Works like :func:`escape` with the difference
-        that for subclasses of :class:`Markup` this function would return the
-        correct subclass.
-        """
-        rv = escape(s)
-        if rv.__class__ is not cls:
-            return cls(rv)
-        return rv
-
-    def make_wrapper(name):
-        orig = getattr(text_type, name)
-        def func(self, *args, **kwargs):
-            args = _escape_argspec(list(args), enumerate(args), self.escape)
-            #_escape_argspec(kwargs, kwargs.iteritems(), None)
-            return self.__class__(orig(self, *args, **kwargs))
-        func.__name__ = orig.__name__
-        func.__doc__ = orig.__doc__
-        return func
-
-    for method in '__getitem__', 'capitalize', \
-                  'title', 'lower', 'upper', 'replace', 'ljust', \
-                  'rjust', 'lstrip', 'rstrip', 'center', 'strip', \
-                  'translate', 'expandtabs', 'swapcase', 'zfill':
-        locals()[method] = make_wrapper(method)
-
-    # new in python 2.5
-    if hasattr(text_type, 'partition'):
-        def partition(self, sep):
-            return tuple(map(self.__class__,
-                             text_type.partition(self, self.escape(sep))))
-        def rpartition(self, sep):
-            return tuple(map(self.__class__,
-                             text_type.rpartition(self, self.escape(sep))))
-
-    # new in python 2.6
-    if hasattr(text_type, 'format'):
-        format = make_wrapper('format')
-
-    # not in python 3
-    if hasattr(text_type, '__getslice__'):
-        __getslice__ = make_wrapper('__getslice__')
-
-    del method, make_wrapper
-
-
-def _escape_argspec(obj, iterable, escape):
-    """Helper for various string-wrapped functions."""
-    for key, value in iterable:
-        if hasattr(value, '__html__') or isinstance(value, string_types):
-            obj[key] = escape(value)
-    return obj
-
-
-class _MarkupEscapeHelper(object):
-    """Helper for Markup.__mod__"""
-
-    def __init__(self, obj, escape):
-        self.obj = obj
-        self.escape = escape
-
-    __getitem__ = lambda s, x: _MarkupEscapeHelper(s.obj[x], s.escape)
-    __unicode__ = __str__ = lambda s: text_type(s.escape(s.obj))
-    __repr__ = lambda s: str(s.escape(repr(s.obj)))
-    __int__ = lambda s: int(s.obj)
-    __float__ = lambda s: float(s.obj)
-
-
-# we have to import it down here as the speedups and native
-# modules imports the markup type which is define above.
-try:
-    from markupsafe._speedups import escape, escape_silent, soft_unicode
-except ImportError:
-    from markupsafe._native import escape, escape_silent, soft_unicode
-
-if not PY2:
-    soft_str = soft_unicode
-    __all__.append('soft_str')
diff --git a/third_party/markupsafe/_compat.py b/third_party/markupsafe/_compat.py
deleted file mode 100644
index 29e4a3d..0000000
--- a/third_party/markupsafe/_compat.py
+++ /dev/null
@@ -1,24 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    markupsafe._compat
-    ~~~~~~~~~~~~~~~~~~
-
-    Compatibility module for different Python versions.
-
-    :copyright: (c) 2013 by Armin Ronacher.
-    :license: BSD, see LICENSE for more details.
-"""
-import sys
-
-PY2 = sys.version_info[0] == 2
-
-if not PY2:
-    text_type = str
-    string_types = (str,)
-    unichr = chr
-    int_types = (int,)
-else:
-    text_type = unicode
-    string_types = (str, unicode)
-    unichr = unichr
-    int_types = (int, long)
diff --git a/third_party/markupsafe/_constants.py b/third_party/markupsafe/_constants.py
deleted file mode 100644
index 919bf03..0000000
--- a/third_party/markupsafe/_constants.py
+++ /dev/null
@@ -1,267 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    markupsafe._constants
-    ~~~~~~~~~~~~~~~~~~~~~
-
-    Highlevel implementation of the Markup string.
-
-    :copyright: (c) 2010 by Armin Ronacher.
-    :license: BSD, see LICENSE for more details.
-"""
-
-
-HTML_ENTITIES = {
-    'AElig': 198,
-    'Aacute': 193,
-    'Acirc': 194,
-    'Agrave': 192,
-    'Alpha': 913,
-    'Aring': 197,
-    'Atilde': 195,
-    'Auml': 196,
-    'Beta': 914,
-    'Ccedil': 199,
-    'Chi': 935,
-    'Dagger': 8225,
-    'Delta': 916,
-    'ETH': 208,
-    'Eacute': 201,
-    'Ecirc': 202,
-    'Egrave': 200,
-    'Epsilon': 917,
-    'Eta': 919,
-    'Euml': 203,
-    'Gamma': 915,
-    'Iacute': 205,
-    'Icirc': 206,
-    'Igrave': 204,
-    'Iota': 921,
-    'Iuml': 207,
-    'Kappa': 922,
-    'Lambda': 923,
-    'Mu': 924,
-    'Ntilde': 209,
-    'Nu': 925,
-    'OElig': 338,
-    'Oacute': 211,
-    'Ocirc': 212,
-    'Ograve': 210,
-    'Omega': 937,
-    'Omicron': 927,
-    'Oslash': 216,
-    'Otilde': 213,
-    'Ouml': 214,
-    'Phi': 934,
-    'Pi': 928,
-    'Prime': 8243,
-    'Psi': 936,
-    'Rho': 929,
-    'Scaron': 352,
-    'Sigma': 931,
-    'THORN': 222,
-    'Tau': 932,
-    'Theta': 920,
-    'Uacute': 218,
-    'Ucirc': 219,
-    'Ugrave': 217,
-    'Upsilon': 933,
-    'Uuml': 220,
-    'Xi': 926,
-    'Yacute': 221,
-    'Yuml': 376,
-    'Zeta': 918,
-    'aacute': 225,
-    'acirc': 226,
-    'acute': 180,
-    'aelig': 230,
-    'agrave': 224,
-    'alefsym': 8501,
-    'alpha': 945,
-    'amp': 38,
-    'and': 8743,
-    'ang': 8736,
-    'apos': 39,
-    'aring': 229,
-    'asymp': 8776,
-    'atilde': 227,
-    'auml': 228,
-    'bdquo': 8222,
-    'beta': 946,
-    'brvbar': 166,
-    'bull': 8226,
-    'cap': 8745,
-    'ccedil': 231,
-    'cedil': 184,
-    'cent': 162,
-    'chi': 967,
-    'circ': 710,
-    'clubs': 9827,
-    'cong': 8773,
-    'copy': 169,
-    'crarr': 8629,
-    'cup': 8746,
-    'curren': 164,
-    'dArr': 8659,
-    'dagger': 8224,
-    'darr': 8595,
-    'deg': 176,
-    'delta': 948,
-    'diams': 9830,
-    'divide': 247,
-    'eacute': 233,
-    'ecirc': 234,
-    'egrave': 232,
-    'empty': 8709,
-    'emsp': 8195,
-    'ensp': 8194,
-    'epsilon': 949,
-    'equiv': 8801,
-    'eta': 951,
-    'eth': 240,
-    'euml': 235,
-    'euro': 8364,
-    'exist': 8707,
-    'fnof': 402,
-    'forall': 8704,
-    'frac12': 189,
-    'frac14': 188,
-    'frac34': 190,
-    'frasl': 8260,
-    'gamma': 947,
-    'ge': 8805,
-    'gt': 62,
-    'hArr': 8660,
-    'harr': 8596,
-    'hearts': 9829,
-    'hellip': 8230,
-    'iacute': 237,
-    'icirc': 238,
-    'iexcl': 161,
-    'igrave': 236,
-    'image': 8465,
-    'infin': 8734,
-    'int': 8747,
-    'iota': 953,
-    'iquest': 191,
-    'isin': 8712,
-    'iuml': 239,
-    'kappa': 954,
-    'lArr': 8656,
-    'lambda': 955,
-    'lang': 9001,
-    'laquo': 171,
-    'larr': 8592,
-    'lceil': 8968,
-    'ldquo': 8220,
-    'le': 8804,
-    'lfloor': 8970,
-    'lowast': 8727,
-    'loz': 9674,
-    'lrm': 8206,
-    'lsaquo': 8249,
-    'lsquo': 8216,
-    'lt': 60,
-    'macr': 175,
-    'mdash': 8212,
-    'micro': 181,
-    'middot': 183,
-    'minus': 8722,
-    'mu': 956,
-    'nabla': 8711,
-    'nbsp': 160,
-    'ndash': 8211,
-    'ne': 8800,
-    'ni': 8715,
-    'not': 172,
-    'notin': 8713,
-    'nsub': 8836,
-    'ntilde': 241,
-    'nu': 957,
-    'oacute': 243,
-    'ocirc': 244,
-    'oelig': 339,
-    'ograve': 242,
-    'oline': 8254,
-    'omega': 969,
-    'omicron': 959,
-    'oplus': 8853,
-    'or': 8744,
-    'ordf': 170,
-    'ordm': 186,
-    'oslash': 248,
-    'otilde': 245,
-    'otimes': 8855,
-    'ouml': 246,
-    'para': 182,
-    'part': 8706,
-    'permil': 8240,
-    'perp': 8869,
-    'phi': 966,
-    'pi': 960,
-    'piv': 982,
-    'plusmn': 177,
-    'pound': 163,
-    'prime': 8242,
-    'prod': 8719,
-    'prop': 8733,
-    'psi': 968,
-    'quot': 34,
-    'rArr': 8658,
-    'radic': 8730,
-    'rang': 9002,
-    'raquo': 187,
-    'rarr': 8594,
-    'rceil': 8969,
-    'rdquo': 8221,
-    'real': 8476,
-    'reg': 174,
-    'rfloor': 8971,
-    'rho': 961,
-    'rlm': 8207,
-    'rsaquo': 8250,
-    'rsquo': 8217,
-    'sbquo': 8218,
-    'scaron': 353,
-    'sdot': 8901,
-    'sect': 167,
-    'shy': 173,
-    'sigma': 963,
-    'sigmaf': 962,
-    'sim': 8764,
-    'spades': 9824,
-    'sub': 8834,
-    'sube': 8838,
-    'sum': 8721,
-    'sup': 8835,
-    'sup1': 185,
-    'sup2': 178,
-    'sup3': 179,
-    'supe': 8839,
-    'szlig': 223,
-    'tau': 964,
-    'there4': 8756,
-    'theta': 952,
-    'thetasym': 977,
-    'thinsp': 8201,
-    'thorn': 254,
-    'tilde': 732,
-    'times': 215,
-    'trade': 8482,
-    'uArr': 8657,
-    'uacute': 250,
-    'uarr': 8593,
-    'ucirc': 251,
-    'ugrave': 249,
-    'uml': 168,
-    'upsih': 978,
-    'upsilon': 965,
-    'uuml': 252,
-    'weierp': 8472,
-    'xi': 958,
-    'yacute': 253,
-    'yen': 165,
-    'yuml': 255,
-    'zeta': 950,
-    'zwj': 8205,
-    'zwnj': 8204
-}
diff --git a/third_party/markupsafe/_native.py b/third_party/markupsafe/_native.py
deleted file mode 100644
index 5e83f10..0000000
--- a/third_party/markupsafe/_native.py
+++ /dev/null
@@ -1,46 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    markupsafe._native
-    ~~~~~~~~~~~~~~~~~~
-
-    Native Python implementation the C module is not compiled.
-
-    :copyright: (c) 2010 by Armin Ronacher.
-    :license: BSD, see LICENSE for more details.
-"""
-from markupsafe import Markup
-from markupsafe._compat import text_type
-
-
-def escape(s):
-    """Convert the characters &, <, >, ' and " in string s to HTML-safe
-    sequences.  Use this if you need to display text that might contain
-    such characters in HTML.  Marks return value as markup string.
-    """
-    if hasattr(s, '__html__'):
-        return s.__html__()
-    return Markup(text_type(s)
-        .replace('&', '&amp;')
-        .replace('>', '&gt;')
-        .replace('<', '&lt;')
-        .replace("'", '&#39;')
-        .replace('"', '&#34;')
-    )
-
-
-def escape_silent(s):
-    """Like :func:`escape` but converts `None` into an empty
-    markup string.
-    """
-    if s is None:
-        return Markup()
-    return escape(s)
-
-
-def soft_unicode(s):
-    """Make a string unicode if it isn't already.  That way a markup
-    string is not converted back to unicode.
-    """
-    if not isinstance(s, text_type):
-        s = text_type(s)
-    return s
diff --git a/third_party/markupsafe/_speedups.c b/third_party/markupsafe/_speedups.c
deleted file mode 100644
index f349feb..0000000
--- a/third_party/markupsafe/_speedups.c
+++ /dev/null
@@ -1,239 +0,0 @@
-/**
- * markupsafe._speedups
- * ~~~~~~~~~~~~~~~~~~~~
- *
- * This module implements functions for automatic escaping in C for better
- * performance.
- *
- * :copyright: (c) 2010 by Armin Ronacher.
- * :license: BSD.
- */
-
-#include <Python.h>
-
-#define ESCAPED_CHARS_TABLE_SIZE 63
-#define UNICHR(x) (PyUnicode_AS_UNICODE((PyUnicodeObject*)PyUnicode_DecodeASCII(x, strlen(x), NULL)));
-
-#if PY_VERSION_HEX < 0x02050000 && !defined(PY_SSIZE_T_MIN)
-typedef int Py_ssize_t;
-#define PY_SSIZE_T_MAX INT_MAX
-#define PY_SSIZE_T_MIN INT_MIN
-#endif
-
-
-static PyObject* markup;
-static Py_ssize_t escaped_chars_delta_len[ESCAPED_CHARS_TABLE_SIZE];
-static Py_UNICODE *escaped_chars_repl[ESCAPED_CHARS_TABLE_SIZE];
-
-static int
-init_constants(void)
-{
-	PyObject *module;
-	/* happing of characters to replace */
-	escaped_chars_repl['"'] = UNICHR("&#34;");
-	escaped_chars_repl['\''] = UNICHR("&#39;");
-	escaped_chars_repl['&'] = UNICHR("&amp;");
-	escaped_chars_repl['<'] = UNICHR("&lt;");
-	escaped_chars_repl['>'] = UNICHR("&gt;");
-
-	/* lengths of those characters when replaced - 1 */
-	memset(escaped_chars_delta_len, 0, sizeof (escaped_chars_delta_len));
-	escaped_chars_delta_len['"'] = escaped_chars_delta_len['\''] = \
-		escaped_chars_delta_len['&'] = 4;
-	escaped_chars_delta_len['<'] = escaped_chars_delta_len['>'] = 3;
-	
-	/* import markup type so that we can mark the return value */
-	module = PyImport_ImportModule("markupsafe");
-	if (!module)
-		return 0;
-	markup = PyObject_GetAttrString(module, "Markup");
-	Py_DECREF(module);
-
-	return 1;
-}
-
-static PyObject*
-escape_unicode(PyUnicodeObject *in)
-{
-	PyUnicodeObject *out;
-	Py_UNICODE *inp = PyUnicode_AS_UNICODE(in);
-	const Py_UNICODE *inp_end = PyUnicode_AS_UNICODE(in) + PyUnicode_GET_SIZE(in);
-	Py_UNICODE *next_escp;
-	Py_UNICODE *outp;
-	Py_ssize_t delta=0, erepl=0, delta_len=0;
-
-	/* First we need to figure out how long the escaped string will be */
-	while (*(inp) || inp < inp_end) {
-		if (*inp < ESCAPED_CHARS_TABLE_SIZE) {
-			delta += escaped_chars_delta_len[*inp];
-			erepl += !!escaped_chars_delta_len[*inp];
-		}
-		++inp;
-	}
-
-	/* Do we need to escape anything at all? */
-	if (!erepl) {
-		Py_INCREF(in);
-		return (PyObject*)in;
-	}
-
-	out = (PyUnicodeObject*)PyUnicode_FromUnicode(NULL, PyUnicode_GET_SIZE(in) + delta);
-	if (!out)
-		return NULL;
-
-	outp = PyUnicode_AS_UNICODE(out);
-	inp = PyUnicode_AS_UNICODE(in);
-	while (erepl-- > 0) {
-		/* look for the next substitution */
-		next_escp = inp;
-		while (next_escp < inp_end) {
-			if (*next_escp < ESCAPED_CHARS_TABLE_SIZE &&
-			    (delta_len = escaped_chars_delta_len[*next_escp])) {
-				++delta_len;
-				break;
-			}
-			++next_escp;
-		}
-		
-		if (next_escp > inp) {
-			/* copy unescaped chars between inp and next_escp */
-			Py_UNICODE_COPY(outp, inp, next_escp-inp);
-			outp += next_escp - inp;
-		}
-
-		/* escape 'next_escp' */
-		Py_UNICODE_COPY(outp, escaped_chars_repl[*next_escp], delta_len);
-		outp += delta_len;
-
-		inp = next_escp + 1;
-	}
-	if (inp < inp_end)
-		Py_UNICODE_COPY(outp, inp, PyUnicode_GET_SIZE(in) - (inp - PyUnicode_AS_UNICODE(in)));
-
-	return (PyObject*)out;
-}
-
-
-static PyObject*
-escape(PyObject *self, PyObject *text)
-{
-	PyObject *s = NULL, *rv = NULL, *html;
-
-	/* we don't have to escape integers, bools or floats */
-	if (PyLong_CheckExact(text) ||
-#if PY_MAJOR_VERSION < 3
-	    PyInt_CheckExact(text) ||
-#endif
-	    PyFloat_CheckExact(text) || PyBool_Check(text) ||
-	    text == Py_None)
-		return PyObject_CallFunctionObjArgs(markup, text, NULL);
-
-	/* if the object has an __html__ method that performs the escaping */
-	html = PyObject_GetAttrString(text, "__html__");
-	if (html) {
-		rv = PyObject_CallObject(html, NULL);
-		Py_DECREF(html);
-		return rv;
-	}
-
-	/* otherwise make the object unicode if it isn't, then escape */
-	PyErr_Clear();
-	if (!PyUnicode_Check(text)) {
-#if PY_MAJOR_VERSION < 3
-		PyObject *unicode = PyObject_Unicode(text);
-#else
-		PyObject *unicode = PyObject_Str(text);
-#endif
-		if (!unicode)
-			return NULL;
-		s = escape_unicode((PyUnicodeObject*)unicode);
-		Py_DECREF(unicode);
-	}
-	else
-		s = escape_unicode((PyUnicodeObject*)text);
-
-	/* convert the unicode string into a markup object. */
-	rv = PyObject_CallFunctionObjArgs(markup, (PyObject*)s, NULL);
-	Py_DECREF(s);
-	return rv;
-}
-
-
-static PyObject*
-escape_silent(PyObject *self, PyObject *text)
-{
-	if (text != Py_None)
-		return escape(self, text);
-	return PyObject_CallFunctionObjArgs(markup, NULL);
-}
-
-
-static PyObject*
-soft_unicode(PyObject *self, PyObject *s)
-{
-	if (!PyUnicode_Check(s))
-#if PY_MAJOR_VERSION < 3
-		return PyObject_Unicode(s);
-#else
-		return PyObject_Str(s);
-#endif
-	Py_INCREF(s);
-	return s;
-}
-
-
-static PyMethodDef module_methods[] = {
-	{"escape", (PyCFunction)escape, METH_O,
-	 "escape(s) -> markup\n\n"
-	 "Convert the characters &, <, >, ', and \" in string s to HTML-safe\n"
-	 "sequences.  Use this if you need to display text that might contain\n"
-	 "such characters in HTML.  Marks return value as markup string."},
-	{"escape_silent", (PyCFunction)escape_silent, METH_O,
-	 "escape_silent(s) -> markup\n\n"
-	 "Like escape but converts None to an empty string."},
-	{"soft_unicode", (PyCFunction)soft_unicode, METH_O,
-	 "soft_unicode(object) -> string\n\n"
-         "Make a string unicode if it isn't already.  That way a markup\n"
-         "string is not converted back to unicode."},
-	{NULL, NULL, 0, NULL}		/* Sentinel */
-};
-
-
-#if PY_MAJOR_VERSION < 3
-
-#ifndef PyMODINIT_FUNC	/* declarations for DLL import/export */
-#define PyMODINIT_FUNC void
-#endif
-PyMODINIT_FUNC
-init_speedups(void)
-{
-	if (!init_constants())
-		return;
-
-	Py_InitModule3("markupsafe._speedups", module_methods, "");
-}
-
-#else /* Python 3.x module initialization */
-
-static struct PyModuleDef module_definition = {
-        PyModuleDef_HEAD_INIT,
-	"markupsafe._speedups",
-	NULL,
-	-1,
-	module_methods,
-	NULL,
-	NULL,
-	NULL,
-	NULL
-};
-
-PyMODINIT_FUNC
-PyInit__speedups(void)
-{
-	if (!init_constants())
-		return NULL;
-
-	return PyModule_Create(&module_definition);
-}
-
-#endif
diff --git a/third_party/markupsafe/get_markupsafe.sh b/third_party/markupsafe/get_markupsafe.sh
deleted file mode 100755
index d268832..0000000
--- a/third_party/markupsafe/get_markupsafe.sh
+++ /dev/null
@@ -1,121 +0,0 @@
-#!/bin/bash
-# Download and extract MarkupSafe
-# Homepage:
-# https://github.com/mitsuhiko/markupsafe
-# Download page:
-# https://pypi.python.org/pypi/MarkupSafe
-PACKAGE='MarkupSafe'
-VERSION='0.18'
-PACKAGE_DIR='markupsafe'
-
-CHROMIUM_FILES="README.chromium OWNERS get_markupsafe.sh"
-EXTRA_FILES='LICENSE AUTHORS'
-REMOVE_FILES='tests.py'
-
-SRC_URL='https://pypi.python.org/packages/source/'
-SRC_URL+="${PACKAGE:0:1}/$PACKAGE/$PACKAGE-$VERSION.tar.gz"
-FILENAME="$(basename $SRC_URL)"
-MD5_FILENAME="$FILENAME.md5"
-SHA512_FILENAME="$FILENAME.sha512"
-CHROMIUM_FILES+=" $MD5_FILENAME $SHA512_FILENAME"
-
-BUILD_DIR="$PACKAGE-$VERSION"
-THIRD_PARTY="$(dirname $(realpath $(dirname "${BASH_SOURCE[0]}")))"
-INSTALL_DIR="$THIRD_PARTY/$PACKAGE_DIR"
-OUT_DIR="$INSTALL_DIR/$BUILD_DIR/$PACKAGE_DIR"
-OLD_DIR="$THIRD_PARTY/$PACKAGE_DIR.old"
-
-function check_hashes {
-  # Hashes generated via:
-  # FILENAME=MarkupSafe-0.18.tar.gz
-  # md5sum "$FILENAME" > "$FILENAME.md5"
-  # sha512sum "$FILENAME" > "$FILENAME.sha512"
-  # unset FILENAME
-
-  # MD5
-  if ! [ -f "$MD5_FILENAME" ]
-  then
-    echo "MD5 hash file $MD5_FILENAME not found, could not verify archive"
-    exit 1
-  fi
-
-  # 32-digit hash, followed by filename
-  MD5_HASHFILE_REGEX="^[0-9a-f]{32}  $FILENAME"
-  if ! grep --extended-regex --line-regex --silent \
-    "$MD5_HASHFILE_REGEX" "$MD5_FILENAME"
-  then
-    echo "MD5 hash file $MD5_FILENAME does not contain hash for $FILENAME," \
-         'could not verify archive'
-    echo 'Hash file contents are:'
-    cat "$MD5_FILENAME"
-    exit 1
-  fi
-
-  if ! md5sum --check "$MD5_FILENAME"
-  then
-    echo 'MD5 hash does not match,' \
-         "archive file $FILENAME corrupt or compromised!"
-    exit 1
-  fi
-
-  # SHA-512
-  if ! [ -f "$SHA512_FILENAME" ]
-  then
-    echo "SHA-512 hash file $SHA512_FILENAME not found," \
-         'could not verify archive'
-    exit 1
-  fi
-
-  # 128-digit hash, followed by filename
-  SHA512_HASHFILE_REGEX="^[0-9a-f]{128}  $FILENAME"
-  if ! grep --extended-regex --line-regex --silent \
-    "$SHA512_HASHFILE_REGEX" "$SHA512_FILENAME"
-  then
-    echo "SHA-512 hash file $SHA512_FILENAME does not contain hash for" \
-         "$FILENAME, could not verify archive"
-    echo 'Hash file contents are:'
-    cat "$SHA512_FILENAME"
-    exit 1
-  fi
-
-  if ! sha512sum --check "$SHA512_FILENAME"
-  then
-    echo 'SHA-512 hash does not match,' \
-         "archive file $FILENAME corrupt or compromised!"
-    exit 1
-  fi
-}
-
-
-################################################################################
-# Body
-
-cd "$INSTALL_DIR"
-echo "Downloading $SRC_URL"
-curl --remote-name "$SRC_URL"
-check_hashes
-tar xvzf "$FILENAME"
-# Copy extra files over
-for FILE in $CHROMIUM_FILES
-do
-  cp "$FILE" "$OUT_DIR"
-done
-
-cd "$BUILD_DIR"
-for FILE in $EXTRA_FILES
-do
-  cp "$FILE" "$OUT_DIR"
-done
-
-cd "$OUT_DIR"
-for FILE in $REMOVE_FILES
-do
-  rm -fr "$FILE"
-done
-
-# Replace with new directory
-cd ..
-mv "$INSTALL_DIR" "$OLD_DIR"
-mv "$PACKAGE_DIR" "$INSTALL_DIR"
-cd "$INSTALL_DIR"
-rm -fr "$OLD_DIR"
diff --git a/third_party/ply/LICENSE b/third_party/ply/LICENSE
deleted file mode 100644
index b273866..0000000
--- a/third_party/ply/LICENSE
+++ /dev/null
@@ -1,30 +0,0 @@
-PLY (Python Lex-Yacc)                   Version 3.4
-
-Copyright (C) 2001-2011,
-David M. Beazley (Dabeaz LLC)
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-* Redistributions of source code must retain the above copyright notice,
-  this list of conditions and the following disclaimer.  
-* Redistributions in binary form must reproduce the above copyright notice, 
-  this list of conditions and the following disclaimer in the documentation
-  and/or other materials provided with the distribution.  
-* Neither the name of the David Beazley or Dabeaz LLC may be used to
-  endorse or promote products derived from this software without
-  specific prior written permission. 
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\ No newline at end of file
diff --git a/third_party/ply/README b/third_party/ply/README
deleted file mode 100644
index f384d1a..0000000
--- a/third_party/ply/README
+++ /dev/null
@@ -1,271 +0,0 @@
-PLY (Python Lex-Yacc)                   Version 3.4
-
-Copyright (C) 2001-2011,
-David M. Beazley (Dabeaz LLC)
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-* Redistributions of source code must retain the above copyright notice,
-  this list of conditions and the following disclaimer.  
-* Redistributions in binary form must reproduce the above copyright notice, 
-  this list of conditions and the following disclaimer in the documentation
-  and/or other materials provided with the distribution.  
-* Neither the name of the David Beazley or Dabeaz LLC may be used to
-  endorse or promote products derived from this software without
-  specific prior written permission. 
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-Introduction
-============
-
-PLY is a 100% Python implementation of the common parsing tools lex
-and yacc. Here are a few highlights:
-
- -  PLY is very closely modeled after traditional lex/yacc.
-    If you know how to use these tools in C, you will find PLY
-    to be similar.
-
- -  PLY provides *very* extensive error reporting and diagnostic 
-    information to assist in parser construction.  The original
-    implementation was developed for instructional purposes.  As
-    a result, the system tries to identify the most common types
-    of errors made by novice users.  
-
- -  PLY provides full support for empty productions, error recovery,
-    precedence specifiers, and moderately ambiguous grammars.
-
- -  Parsing is based on LR-parsing which is fast, memory efficient, 
-    better suited to large grammars, and which has a number of nice
-    properties when dealing with syntax errors and other parsing problems.
-    Currently, PLY builds its parsing tables using the LALR(1)
-    algorithm used in yacc.
-
- -  PLY uses Python introspection features to build lexers and parsers.  
-    This greatly simplifies the task of parser construction since it reduces 
-    the number of files and eliminates the need to run a separate lex/yacc 
-    tool before running your program.
-
- -  PLY can be used to build parsers for "real" programming languages.
-    Although it is not ultra-fast due to its Python implementation,
-    PLY can be used to parse grammars consisting of several hundred
-    rules (as might be found for a language like C).  The lexer and LR 
-    parser are also reasonably efficient when parsing typically
-    sized programs.  People have used PLY to build parsers for
-    C, C++, ADA, and other real programming languages.
-
-How to Use
-==========
-
-PLY consists of two files : lex.py and yacc.py.  These are contained
-within the 'ply' directory which may also be used as a Python package.
-To use PLY, simply copy the 'ply' directory to your project and import
-lex and yacc from the associated 'ply' package.  For example:
-
-     import ply.lex as lex
-     import ply.yacc as yacc
-
-Alternatively, you can copy just the files lex.py and yacc.py
-individually and use them as modules.  For example:
-
-     import lex
-     import yacc
-
-The file setup.py can be used to install ply using distutils.
-
-The file doc/ply.html contains complete documentation on how to use
-the system.
-
-The example directory contains several different examples including a
-PLY specification for ANSI C as given in K&R 2nd Ed.   
-
-A simple example is found at the end of this document
-
-Requirements
-============
-PLY requires the use of Python 2.2 or greater.  However, you should
-use the latest Python release if possible.  It should work on just
-about any platform.  PLY has been tested with both CPython and Jython.
-It also seems to work with IronPython.
-
-Resources
-=========
-More information about PLY can be obtained on the PLY webpage at:
-
-     http://www.dabeaz.com/ply
-
-For a detailed overview of parsing theory, consult the excellent
-book "Compilers : Principles, Techniques, and Tools" by Aho, Sethi, and
-Ullman.  The topics found in "Lex & Yacc" by Levine, Mason, and Brown
-may also be useful.
-
-A Google group for PLY can be found at
-
-     http://groups.google.com/group/ply-hack
-
-Acknowledgments
-===============
-A special thanks is in order for all of the students in CS326 who
-suffered through about 25 different versions of these tools :-).
-
-The CHANGES file acknowledges those who have contributed patches.
-
-Elias Ioup did the first implementation of LALR(1) parsing in PLY-1.x. 
-Andrew Waters and Markus Schoepflin were instrumental in reporting bugs
-and testing a revised LALR(1) implementation for PLY-2.0.
-
-Special Note for PLY-3.0
-========================
-PLY-3.0 the first PLY release to support Python 3. However, backwards
-compatibility with Python 2.2 is still preserved. PLY provides dual
-Python 2/3 compatibility by restricting its implementation to a common
-subset of basic language features. You should not convert PLY using
-2to3--it is not necessary and may in fact break the implementation.
-
-Example
-=======
-
-Here is a simple example showing a PLY implementation of a calculator
-with variables.
-
-# -----------------------------------------------------------------------------
-# calc.py
-#
-# A simple calculator with variables.
-# -----------------------------------------------------------------------------
-
-tokens = (
-    'NAME','NUMBER',
-    'PLUS','MINUS','TIMES','DIVIDE','EQUALS',
-    'LPAREN','RPAREN',
-    )
-
-# Tokens
-
-t_PLUS    = r'\+'
-t_MINUS   = r'-'
-t_TIMES   = r'\*'
-t_DIVIDE  = r'/'
-t_EQUALS  = r'='
-t_LPAREN  = r'\('
-t_RPAREN  = r'\)'
-t_NAME    = r'[a-zA-Z_][a-zA-Z0-9_]*'
-
-def t_NUMBER(t):
-    r'\d+'
-    t.value = int(t.value)
-    return t
-
-# Ignored characters
-t_ignore = " \t"
-
-def t_newline(t):
-    r'\n+'
-    t.lexer.lineno += t.value.count("\n")
-    
-def t_error(t):
-    print("Illegal character '%s'" % t.value[0])
-    t.lexer.skip(1)
-    
-# Build the lexer
-import ply.lex as lex
-lex.lex()
-
-# Precedence rules for the arithmetic operators
-precedence = (
-    ('left','PLUS','MINUS'),
-    ('left','TIMES','DIVIDE'),
-    ('right','UMINUS'),
-    )
-
-# dictionary of names (for storing variables)
-names = { }
-
-def p_statement_assign(p):
-    'statement : NAME EQUALS expression'
-    names[p[1]] = p[3]
-
-def p_statement_expr(p):
-    'statement : expression'
-    print(p[1])
-
-def p_expression_binop(p):
-    '''expression : expression PLUS expression
-                  | expression MINUS expression
-                  | expression TIMES expression
-                  | expression DIVIDE expression'''
-    if p[2] == '+'  : p[0] = p[1] + p[3]
-    elif p[2] == '-': p[0] = p[1] - p[3]
-    elif p[2] == '*': p[0] = p[1] * p[3]
-    elif p[2] == '/': p[0] = p[1] / p[3]
-
-def p_expression_uminus(p):
-    'expression : MINUS expression %prec UMINUS'
-    p[0] = -p[2]
-
-def p_expression_group(p):
-    'expression : LPAREN expression RPAREN'
-    p[0] = p[2]
-
-def p_expression_number(p):
-    'expression : NUMBER'
-    p[0] = p[1]
-
-def p_expression_name(p):
-    'expression : NAME'
-    try:
-        p[0] = names[p[1]]
-    except LookupError:
-        print("Undefined name '%s'" % p[1])
-        p[0] = 0
-
-def p_error(p):
-    print("Syntax error at '%s'" % p.value)
-
-import ply.yacc as yacc
-yacc.yacc()
-
-while 1:
-    try:
-        s = raw_input('calc > ')   # use input() on Python 3
-    except EOFError:
-        break
-    yacc.parse(s)
-
-
-Bug Reports and Patches
-=======================
-My goal with PLY is to simply have a decent lex/yacc implementation
-for Python.  As a general rule, I don't spend huge amounts of time
-working on it unless I receive very specific bug reports and/or
-patches to fix problems. I also try to incorporate submitted feature
-requests and enhancements into each new version.  To contact me about
-bugs and/or new features, please send email to dave@dabeaz.com.
-
-In addition there is a Google group for discussing PLY related issues at
-
-    http://groups.google.com/group/ply-hack
- 
--- Dave
-
-
-
-
-
-
-
-
-
diff --git a/third_party/ply/README.chromium b/third_party/ply/README.chromium
deleted file mode 100644
index 6466e54..0000000
--- a/third_party/ply/README.chromium
+++ /dev/null
@@ -1,21 +0,0 @@
-Name: PLY (Python Lex-Yacc)
-Current version: 3.4
-URL: http://www.dabeaz.com/ply/ply-3.4.tar.gz
-License: BSD
-License File: LICENSE
-Security Critical: no
-Version: 3.4
-
-This directory contains a copy of these ply-3.4 components:
-
-README            ply-3.4/README
-Sources           ply-3.4/ply/__init__.py
-                  ply-3.4/ply/lex.py
-                  ply-3.4/ply/yacc.py
-
-
-The license is in LICENSE.
-
-Modifications made with initial commit:
-- Added the file README.chromium (this file)
-- Applies license.patch
diff --git a/third_party/ply/__init__.py b/third_party/ply/__init__.py
deleted file mode 100644
index f3da03e..0000000
--- a/third_party/ply/__init__.py
+++ /dev/null
@@ -1,36 +0,0 @@
-# PLY package
-# Author: David Beazley (dave@dabeaz.com)
-# -----------------------------------------------------------------------------
-# ply: yacc.py
-#
-# Copyright (C) 2001-2011,
-# David M. Beazley (Dabeaz LLC)
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are
-# met:
-#
-# * Redistributions of source code must retain the above copyright notice,
-#   this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright notice,
-#   this list of conditions and the following disclaimer in the documentation
-#   and/or other materials provided with the distribution.
-# * Neither the name of the David Beazley or Dabeaz LLC may be used to
-#   endorse or promote products derived from this software without
-#  specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-# -----------------------------------------------------------------------------
-
-__all__ = ['lex','yacc']
diff --git a/third_party/ply/lex.py b/third_party/ply/lex.py
deleted file mode 100644
index bd32da9..0000000
--- a/third_party/ply/lex.py
+++ /dev/null
@@ -1,1058 +0,0 @@
-# -----------------------------------------------------------------------------
-# ply: lex.py
-#
-# Copyright (C) 2001-2011,
-# David M. Beazley (Dabeaz LLC)
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are
-# met:
-# 
-# * Redistributions of source code must retain the above copyright notice,
-#   this list of conditions and the following disclaimer.  
-# * Redistributions in binary form must reproduce the above copyright notice, 
-#   this list of conditions and the following disclaimer in the documentation
-#   and/or other materials provided with the distribution.  
-# * Neither the name of the David Beazley or Dabeaz LLC may be used to
-#   endorse or promote products derived from this software without
-#  specific prior written permission. 
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-# -----------------------------------------------------------------------------
-
-__version__    = "3.4"
-__tabversion__ = "3.2"       # Version of table file used
-
-import re, sys, types, copy, os
-
-# This tuple contains known string types
-try:
-    # Python 2.6
-    StringTypes = (types.StringType, types.UnicodeType)
-except AttributeError:
-    # Python 3.0
-    StringTypes = (str, bytes)
-
-# Extract the code attribute of a function. Different implementations
-# are for Python 2/3 compatibility.
-
-if sys.version_info[0] < 3:
-    def func_code(f):
-        return f.func_code
-else:
-    def func_code(f):
-        return f.__code__
-
-# This regular expression is used to match valid token names
-_is_identifier = re.compile(r'^[a-zA-Z0-9_]+$')
-
-# Exception thrown when invalid token encountered and no default error
-# handler is defined.
-
-class LexError(Exception):
-    def __init__(self,message,s):
-         self.args = (message,)
-         self.text = s
-
-# Token class.  This class is used to represent the tokens produced.
-class LexToken(object):
-    def __str__(self):
-        return "LexToken(%s,%r,%d,%d)" % (self.type,self.value,self.lineno,self.lexpos)
-    def __repr__(self):
-        return str(self)
-
-# This object is a stand-in for a logging object created by the 
-# logging module.  
-
-class PlyLogger(object):
-    def __init__(self,f):
-        self.f = f
-    def critical(self,msg,*args,**kwargs):
-        self.f.write((msg % args) + "\n")
-
-    def warning(self,msg,*args,**kwargs):
-        self.f.write("WARNING: "+ (msg % args) + "\n")
-
-    def error(self,msg,*args,**kwargs):
-        self.f.write("ERROR: " + (msg % args) + "\n")
-
-    info = critical
-    debug = critical
-
-# Null logger is used when no output is generated. Does nothing.
-class NullLogger(object):
-    def __getattribute__(self,name):
-        return self
-    def __call__(self,*args,**kwargs):
-        return self
-
-# -----------------------------------------------------------------------------
-#                        === Lexing Engine ===
-#
-# The following Lexer class implements the lexer runtime.   There are only
-# a few public methods and attributes:
-#
-#    input()          -  Store a new string in the lexer
-#    token()          -  Get the next token
-#    clone()          -  Clone the lexer
-#
-#    lineno           -  Current line number
-#    lexpos           -  Current position in the input string
-# -----------------------------------------------------------------------------
-
-class Lexer:
-    def __init__(self):
-        self.lexre = None             # Master regular expression. This is a list of
-                                      # tuples (re,findex) where re is a compiled
-                                      # regular expression and findex is a list
-                                      # mapping regex group numbers to rules
-        self.lexretext = None         # Current regular expression strings
-        self.lexstatere = {}          # Dictionary mapping lexer states to master regexs
-        self.lexstateretext = {}      # Dictionary mapping lexer states to regex strings
-        self.lexstaterenames = {}     # Dictionary mapping lexer states to symbol names
-        self.lexstate = "INITIAL"     # Current lexer state
-        self.lexstatestack = []       # Stack of lexer states
-        self.lexstateinfo = None      # State information
-        self.lexstateignore = {}      # Dictionary of ignored characters for each state
-        self.lexstateerrorf = {}      # Dictionary of error functions for each state
-        self.lexreflags = 0           # Optional re compile flags
-        self.lexdata = None           # Actual input data (as a string)
-        self.lexpos = 0               # Current position in input text
-        self.lexlen = 0               # Length of the input text
-        self.lexerrorf = None         # Error rule (if any)
-        self.lextokens = None         # List of valid tokens
-        self.lexignore = ""           # Ignored characters
-        self.lexliterals = ""         # Literal characters that can be passed through
-        self.lexmodule = None         # Module
-        self.lineno = 1               # Current line number
-        self.lexoptimize = 0          # Optimized mode
-
-    def clone(self,object=None):
-        c = copy.copy(self)
-
-        # If the object parameter has been supplied, it means we are attaching the
-        # lexer to a new object.  In this case, we have to rebind all methods in
-        # the lexstatere and lexstateerrorf tables.
-
-        if object:
-            newtab = { }
-            for key, ritem in self.lexstatere.items():
-                newre = []
-                for cre, findex in ritem:
-                     newfindex = []
-                     for f in findex:
-                         if not f or not f[0]:
-                             newfindex.append(f)
-                             continue
-                         newfindex.append((getattr(object,f[0].__name__),f[1]))
-                newre.append((cre,newfindex))
-                newtab[key] = newre
-            c.lexstatere = newtab
-            c.lexstateerrorf = { }
-            for key, ef in self.lexstateerrorf.items():
-                c.lexstateerrorf[key] = getattr(object,ef.__name__)
-            c.lexmodule = object
-        return c
-
-    # ------------------------------------------------------------
-    # writetab() - Write lexer information to a table file
-    # ------------------------------------------------------------
-    def writetab(self,tabfile,outputdir=""):
-        if isinstance(tabfile,types.ModuleType):
-            return
-        basetabfilename = tabfile.split(".")[-1]
-        filename = os.path.join(outputdir,basetabfilename)+".py"
-        tf = open(filename,"w")
-        tf.write("# %s.py. This file automatically created by PLY (version %s). Don't edit!\n" % (tabfile,__version__))
-        tf.write("_tabversion   = %s\n" % repr(__version__))
-        tf.write("_lextokens    = %s\n" % repr(self.lextokens))
-        tf.write("_lexreflags   = %s\n" % repr(self.lexreflags))
-        tf.write("_lexliterals  = %s\n" % repr(self.lexliterals))
-        tf.write("_lexstateinfo = %s\n" % repr(self.lexstateinfo))
-
-        tabre = { }
-        # Collect all functions in the initial state
-        initial = self.lexstatere["INITIAL"]
-        initialfuncs = []
-        for part in initial:
-            for f in part[1]:
-                if f and f[0]:
-                    initialfuncs.append(f)
-
-        for key, lre in self.lexstatere.items():
-             titem = []
-             for i in range(len(lre)):
-                  titem.append((self.lexstateretext[key][i],_funcs_to_names(lre[i][1],self.lexstaterenames[key][i])))
-             tabre[key] = titem
-
-        tf.write("_lexstatere   = %s\n" % repr(tabre))
-        tf.write("_lexstateignore = %s\n" % repr(self.lexstateignore))
-
-        taberr = { }
-        for key, ef in self.lexstateerrorf.items():
-             if ef:
-                  taberr[key] = ef.__name__
-             else:
-                  taberr[key] = None
-        tf.write("_lexstateerrorf = %s\n" % repr(taberr))
-        tf.close()
-
-    # ------------------------------------------------------------
-    # readtab() - Read lexer information from a tab file
-    # ------------------------------------------------------------
-    def readtab(self,tabfile,fdict):
-        if isinstance(tabfile,types.ModuleType):
-            lextab = tabfile
-        else:
-            if sys.version_info[0] < 3:
-                exec("import %s as lextab" % tabfile)
-            else:
-                env = { }
-                exec("import %s as lextab" % tabfile, env,env)
-                lextab = env['lextab']
-
-        if getattr(lextab,"_tabversion","0.0") != __version__:
-            raise ImportError("Inconsistent PLY version")
-
-        self.lextokens      = lextab._lextokens
-        self.lexreflags     = lextab._lexreflags
-        self.lexliterals    = lextab._lexliterals
-        self.lexstateinfo   = lextab._lexstateinfo
-        self.lexstateignore = lextab._lexstateignore
-        self.lexstatere     = { }
-        self.lexstateretext = { }
-        for key,lre in lextab._lexstatere.items():
-             titem = []
-             txtitem = []
-             for i in range(len(lre)):
-                  titem.append((re.compile(lre[i][0],lextab._lexreflags | re.VERBOSE),_names_to_funcs(lre[i][1],fdict)))
-                  txtitem.append(lre[i][0])
-             self.lexstatere[key] = titem
-             self.lexstateretext[key] = txtitem
-        self.lexstateerrorf = { }
-        for key,ef in lextab._lexstateerrorf.items():
-             self.lexstateerrorf[key] = fdict[ef]
-        self.begin('INITIAL')
-
-    # ------------------------------------------------------------
-    # input() - Push a new string into the lexer
-    # ------------------------------------------------------------
-    def input(self,s):
-        # Pull off the first character to see if s looks like a string
-        c = s[:1]
-        if not isinstance(c,StringTypes):
-            raise ValueError("Expected a string")
-        self.lexdata = s
-        self.lexpos = 0
-        self.lexlen = len(s)
-
-    # ------------------------------------------------------------
-    # begin() - Changes the lexing state
-    # ------------------------------------------------------------
-    def begin(self,state):
-        if not state in self.lexstatere:
-            raise ValueError("Undefined state")
-        self.lexre = self.lexstatere[state]
-        self.lexretext = self.lexstateretext[state]
-        self.lexignore = self.lexstateignore.get(state,"")
-        self.lexerrorf = self.lexstateerrorf.get(state,None)
-        self.lexstate = state
-
-    # ------------------------------------------------------------
-    # push_state() - Changes the lexing state and saves old on stack
-    # ------------------------------------------------------------
-    def push_state(self,state):
-        self.lexstatestack.append(self.lexstate)
-        self.begin(state)
-
-    # ------------------------------------------------------------
-    # pop_state() - Restores the previous state
-    # ------------------------------------------------------------
-    def pop_state(self):
-        self.begin(self.lexstatestack.pop())
-
-    # ------------------------------------------------------------
-    # current_state() - Returns the current lexing state
-    # ------------------------------------------------------------
-    def current_state(self):
-        return self.lexstate
-
-    # ------------------------------------------------------------
-    # skip() - Skip ahead n characters
-    # ------------------------------------------------------------
-    def skip(self,n):
-        self.lexpos += n
-
-    # ------------------------------------------------------------
-    # opttoken() - Return the next token from the Lexer
-    #
-    # Note: This function has been carefully implemented to be as fast
-    # as possible.  Don't make changes unless you really know what
-    # you are doing
-    # ------------------------------------------------------------
-    def token(self):
-        # Make local copies of frequently referenced attributes
-        lexpos    = self.lexpos
-        lexlen    = self.lexlen
-        lexignore = self.lexignore
-        lexdata   = self.lexdata
-
-        while lexpos < lexlen:
-            # This code provides some short-circuit code for whitespace, tabs, and other ignored characters
-            if lexdata[lexpos] in lexignore:
-                lexpos += 1
-                continue
-
-            # Look for a regular expression match
-            for lexre,lexindexfunc in self.lexre:
-                m = lexre.match(lexdata,lexpos)
-                if not m: continue
-
-                # Create a token for return
-                tok = LexToken()
-                tok.value = m.group()
-                tok.lineno = self.lineno
-                tok.lexpos = lexpos
-
-                i = m.lastindex
-                func,tok.type = lexindexfunc[i]
-
-                if not func:
-                   # If no token type was set, it's an ignored token
-                   if tok.type:
-                      self.lexpos = m.end()
-                      return tok
-                   else:
-                      lexpos = m.end()
-                      break
-
-                lexpos = m.end()
-
-                # If token is processed by a function, call it
-
-                tok.lexer = self      # Set additional attributes useful in token rules
-                self.lexmatch = m
-                self.lexpos = lexpos
-
-                newtok = func(tok)
-
-                # Every function must return a token, if nothing, we just move to next token
-                if not newtok:
-                    lexpos    = self.lexpos         # This is here in case user has updated lexpos.
-                    lexignore = self.lexignore      # This is here in case there was a state change
-                    break
-
-                # Verify type of the token.  If not in the token map, raise an error
-                if not self.lexoptimize:
-                    if not newtok.type in self.lextokens:
-                        raise LexError("%s:%d: Rule '%s' returned an unknown token type '%s'" % (
-                            func_code(func).co_filename, func_code(func).co_firstlineno,
-                            func.__name__, newtok.type),lexdata[lexpos:])
-
-                return newtok
-            else:
-                # No match, see if in literals
-                if lexdata[lexpos] in self.lexliterals:
-                    tok = LexToken()
-                    tok.value = lexdata[lexpos]
-                    tok.lineno = self.lineno
-                    tok.type = tok.value
-                    tok.lexpos = lexpos
-                    self.lexpos = lexpos + 1
-                    return tok
-
-                # No match. Call t_error() if defined.
-                if self.lexerrorf:
-                    tok = LexToken()
-                    tok.value = self.lexdata[lexpos:]
-                    tok.lineno = self.lineno
-                    tok.type = "error"
-                    tok.lexer = self
-                    tok.lexpos = lexpos
-                    self.lexpos = lexpos
-                    newtok = self.lexerrorf(tok)
-                    if lexpos == self.lexpos:
-                        # Error method didn't change text position at all. This is an error.
-                        raise LexError("Scanning error. Illegal character '%s'" % (lexdata[lexpos]), lexdata[lexpos:])
-                    lexpos = self.lexpos
-                    if not newtok: continue
-                    return newtok
-
-                self.lexpos = lexpos
-                raise LexError("Illegal character '%s' at index %d" % (lexdata[lexpos],lexpos), lexdata[lexpos:])
-
-        self.lexpos = lexpos + 1
-        if self.lexdata is None:
-             raise RuntimeError("No input string given with input()")
-        return None
-
-    # Iterator interface
-    def __iter__(self):
-        return self
-
-    def next(self):
-        t = self.token()
-        if t is None:
-            raise StopIteration
-        return t
-
-    __next__ = next
-
-# -----------------------------------------------------------------------------
-#                           ==== Lex Builder ===
-#
-# The functions and classes below are used to collect lexing information
-# and build a Lexer object from it.
-# -----------------------------------------------------------------------------
-
-# -----------------------------------------------------------------------------
-# get_caller_module_dict()
-#
-# This function returns a dictionary containing all of the symbols defined within
-# a caller further down the call stack.  This is used to get the environment
-# associated with the yacc() call if none was provided.
-# -----------------------------------------------------------------------------
-
-def get_caller_module_dict(levels):
-    try:
-        raise RuntimeError
-    except RuntimeError:
-        e,b,t = sys.exc_info()
-        f = t.tb_frame
-        while levels > 0:
-            f = f.f_back                   
-            levels -= 1
-        ldict = f.f_globals.copy()
-        if f.f_globals != f.f_locals:
-            ldict.update(f.f_locals)
-
-        return ldict
-
-# -----------------------------------------------------------------------------
-# _funcs_to_names()
-#
-# Given a list of regular expression functions, this converts it to a list
-# suitable for output to a table file
-# -----------------------------------------------------------------------------
-
-def _funcs_to_names(funclist,namelist):
-    result = []
-    for f,name in zip(funclist,namelist):
-         if f and f[0]:
-             result.append((name, f[1]))
-         else:
-             result.append(f)
-    return result
-
-# -----------------------------------------------------------------------------
-# _names_to_funcs()
-#
-# Given a list of regular expression function names, this converts it back to
-# functions.
-# -----------------------------------------------------------------------------
-
-def _names_to_funcs(namelist,fdict):
-     result = []
-     for n in namelist:
-          if n and n[0]:
-              result.append((fdict[n[0]],n[1]))
-          else:
-              result.append(n)
-     return result
-
-# -----------------------------------------------------------------------------
-# _form_master_re()
-#
-# This function takes a list of all of the regex components and attempts to
-# form the master regular expression.  Given limitations in the Python re
-# module, it may be necessary to break the master regex into separate expressions.
-# -----------------------------------------------------------------------------
-
-def _form_master_re(relist,reflags,ldict,toknames):
-    if not relist: return []
-    regex = "|".join(relist)
-    try:
-        lexre = re.compile(regex,re.VERBOSE | reflags)
-
-        # Build the index to function map for the matching engine
-        lexindexfunc = [ None ] * (max(lexre.groupindex.values())+1)
-        lexindexnames = lexindexfunc[:]
-
-        for f,i in lexre.groupindex.items():
-            handle = ldict.get(f,None)
-            if type(handle) in (types.FunctionType, types.MethodType):
-                lexindexfunc[i] = (handle,toknames[f])
-                lexindexnames[i] = f
-            elif handle is not None:
-                lexindexnames[i] = f
-                if f.find("ignore_") > 0:
-                    lexindexfunc[i] = (None,None)
-                else:
-                    lexindexfunc[i] = (None, toknames[f])
-        
-        return [(lexre,lexindexfunc)],[regex],[lexindexnames]
-    except Exception:
-        m = int(len(relist)/2)
-        if m == 0: m = 1
-        llist, lre, lnames = _form_master_re(relist[:m],reflags,ldict,toknames)
-        rlist, rre, rnames = _form_master_re(relist[m:],reflags,ldict,toknames)
-        return llist+rlist, lre+rre, lnames+rnames
-
-# -----------------------------------------------------------------------------
-# def _statetoken(s,names)
-#
-# Given a declaration name s of the form "t_" and a dictionary whose keys are
-# state names, this function returns a tuple (states,tokenname) where states
-# is a tuple of state names and tokenname is the name of the token.  For example,
-# calling this with s = "t_foo_bar_SPAM" might return (('foo','bar'),'SPAM')
-# -----------------------------------------------------------------------------
-
-def _statetoken(s,names):
-    nonstate = 1
-    parts = s.split("_")
-    for i in range(1,len(parts)):
-         if not parts[i] in names and parts[i] != 'ANY': break
-    if i > 1:
-       states = tuple(parts[1:i])
-    else:
-       states = ('INITIAL',)
-
-    if 'ANY' in states:
-       states = tuple(names)
-
-    tokenname = "_".join(parts[i:])
-    return (states,tokenname)
-
-
-# -----------------------------------------------------------------------------
-# LexerReflect()
-#
-# This class represents information needed to build a lexer as extracted from a
-# user's input file.
-# -----------------------------------------------------------------------------
-class LexerReflect(object):
-    def __init__(self,ldict,log=None,reflags=0):
-        self.ldict      = ldict
-        self.error_func = None
-        self.tokens     = []
-        self.reflags    = reflags
-        self.stateinfo  = { 'INITIAL' : 'inclusive'}
-        self.files      = {}
-        self.error      = 0
-
-        if log is None:
-            self.log = PlyLogger(sys.stderr)
-        else:
-            self.log = log
-
-    # Get all of the basic information
-    def get_all(self):
-        self.get_tokens()
-        self.get_literals()
-        self.get_states()
-        self.get_rules()
-        
-    # Validate all of the information
-    def validate_all(self):
-        self.validate_tokens()
-        self.validate_literals()
-        self.validate_rules()
-        return self.error
-
-    # Get the tokens map
-    def get_tokens(self):
-        tokens = self.ldict.get("tokens",None)
-        if not tokens:
-            self.log.error("No token list is defined")
-            self.error = 1
-            return
-
-        if not isinstance(tokens,(list, tuple)):
-            self.log.error("tokens must be a list or tuple")
-            self.error = 1
-            return
-        
-        if not tokens:
-            self.log.error("tokens is empty")
-            self.error = 1
-            return
-
-        self.tokens = tokens
-
-    # Validate the tokens
-    def validate_tokens(self):
-        terminals = {}
-        for n in self.tokens:
-            if not _is_identifier.match(n):
-                self.log.error("Bad token name '%s'",n)
-                self.error = 1
-            if n in terminals:
-                self.log.warning("Token '%s' multiply defined", n)
-            terminals[n] = 1
-
-    # Get the literals specifier
-    def get_literals(self):
-        self.literals = self.ldict.get("literals","")
-
-    # Validate literals
-    def validate_literals(self):
-        try:
-            for c in self.literals:
-                if not isinstance(c,StringTypes) or len(c) > 1:
-                    self.log.error("Invalid literal %s. Must be a single character", repr(c))
-                    self.error = 1
-                    continue
-
-        except TypeError:
-            self.log.error("Invalid literals specification. literals must be a sequence of characters")
-            self.error = 1
-
-    def get_states(self):
-        self.states = self.ldict.get("states",None)
-        # Build statemap
-        if self.states:
-             if not isinstance(self.states,(tuple,list)):
-                  self.log.error("states must be defined as a tuple or list")
-                  self.error = 1
-             else:
-                  for s in self.states:
-                        if not isinstance(s,tuple) or len(s) != 2:
-                               self.log.error("Invalid state specifier %s. Must be a tuple (statename,'exclusive|inclusive')",repr(s))
-                               self.error = 1
-                               continue
-                        name, statetype = s
-                        if not isinstance(name,StringTypes):
-                               self.log.error("State name %s must be a string", repr(name))
-                               self.error = 1
-                               continue
-                        if not (statetype == 'inclusive' or statetype == 'exclusive'):
-                               self.log.error("State type for state %s must be 'inclusive' or 'exclusive'",name)
-                               self.error = 1
-                               continue
-                        if name in self.stateinfo:
-                               self.log.error("State '%s' already defined",name)
-                               self.error = 1
-                               continue
-                        self.stateinfo[name] = statetype
-
-    # Get all of the symbols with a t_ prefix and sort them into various
-    # categories (functions, strings, error functions, and ignore characters)
-
-    def get_rules(self):
-        tsymbols = [f for f in self.ldict if f[:2] == 't_' ]
-
-        # Now build up a list of functions and a list of strings
-
-        self.toknames = { }        # Mapping of symbols to token names
-        self.funcsym =  { }        # Symbols defined as functions
-        self.strsym =   { }        # Symbols defined as strings
-        self.ignore   = { }        # Ignore strings by state
-        self.errorf   = { }        # Error functions by state
-
-        for s in self.stateinfo:
-             self.funcsym[s] = []
-             self.strsym[s] = []
-
-        if len(tsymbols) == 0:
-            self.log.error("No rules of the form t_rulename are defined")
-            self.error = 1
-            return
-
-        for f in tsymbols:
-            t = self.ldict[f]
-            states, tokname = _statetoken(f,self.stateinfo)
-            self.toknames[f] = tokname
-
-            if hasattr(t,"__call__"):
-                if tokname == 'error':
-                    for s in states:
-                        self.errorf[s] = t
-                elif tokname == 'ignore':
-                    line = func_code(t).co_firstlineno
-                    file = func_code(t).co_filename
-                    self.log.error("%s:%d: Rule '%s' must be defined as a string",file,line,t.__name__)
-                    self.error = 1
-                else:
-                    for s in states: 
-                        self.funcsym[s].append((f,t))
-            elif isinstance(t, StringTypes):
-                if tokname == 'ignore':
-                    for s in states:
-                        self.ignore[s] = t
-                    if "\\" in t:
-                        self.log.warning("%s contains a literal backslash '\\'",f)
-
-                elif tokname == 'error':
-                    self.log.error("Rule '%s' must be defined as a function", f)
-                    self.error = 1
-                else:
-                    for s in states: 
-                        self.strsym[s].append((f,t))
-            else:
-                self.log.error("%s not defined as a function or string", f)
-                self.error = 1
-
-        # Sort the functions by line number
-        for f in self.funcsym.values():
-            if sys.version_info[0] < 3:
-                f.sort(lambda x,y: cmp(func_code(x[1]).co_firstlineno,func_code(y[1]).co_firstlineno))
-            else:
-                # Python 3.0
-                f.sort(key=lambda x: func_code(x[1]).co_firstlineno)
-
-        # Sort the strings by regular expression length
-        for s in self.strsym.values():
-            if sys.version_info[0] < 3:
-                s.sort(lambda x,y: (len(x[1]) < len(y[1])) - (len(x[1]) > len(y[1])))
-            else:
-                # Python 3.0
-                s.sort(key=lambda x: len(x[1]),reverse=True)
-
-    # Validate all of the t_rules collected 
-    def validate_rules(self):
-        for state in self.stateinfo:
-            # Validate all rules defined by functions
-
-            
-
-            for fname, f in self.funcsym[state]:
-                line = func_code(f).co_firstlineno
-                file = func_code(f).co_filename
-                self.files[file] = 1
-
-                tokname = self.toknames[fname]
-                if isinstance(f, types.MethodType):
-                    reqargs = 2
-                else:
-                    reqargs = 1
-                nargs = func_code(f).co_argcount
-                if nargs > reqargs:
-                    self.log.error("%s:%d: Rule '%s' has too many arguments",file,line,f.__name__)
-                    self.error = 1
-                    continue
-
-                if nargs < reqargs:
-                    self.log.error("%s:%d: Rule '%s' requires an argument", file,line,f.__name__)
-                    self.error = 1
-                    continue
-
-                if not f.__doc__:
-                    self.log.error("%s:%d: No regular expression defined for rule '%s'",file,line,f.__name__)
-                    self.error = 1
-                    continue
-
-                try:
-                    c = re.compile("(?P<%s>%s)" % (fname,f.__doc__), re.VERBOSE | self.reflags)
-                    if c.match(""):
-                        self.log.error("%s:%d: Regular expression for rule '%s' matches empty string", file,line,f.__name__)
-                        self.error = 1
-                except re.error:
-                    _etype, e, _etrace = sys.exc_info()
-                    self.log.error("%s:%d: Invalid regular expression for rule '%s'. %s", file,line,f.__name__,e)
-                    if '#' in f.__doc__:
-                        self.log.error("%s:%d. Make sure '#' in rule '%s' is escaped with '\\#'",file,line, f.__name__)
-                    self.error = 1
-
-            # Validate all rules defined by strings
-            for name,r in self.strsym[state]:
-                tokname = self.toknames[name]
-                if tokname == 'error':
-                    self.log.error("Rule '%s' must be defined as a function", name)
-                    self.error = 1
-                    continue
-
-                if not tokname in self.tokens and tokname.find("ignore_") < 0:
-                    self.log.error("Rule '%s' defined for an unspecified token %s",name,tokname)
-                    self.error = 1
-                    continue
-
-                try:
-                    c = re.compile("(?P<%s>%s)" % (name,r),re.VERBOSE | self.reflags)
-                    if (c.match("")):
-                         self.log.error("Regular expression for rule '%s' matches empty string",name)
-                         self.error = 1
-                except re.error:
-                    _etype, e, _etrace = sys.exc_info()
-                    self.log.error("Invalid regular expression for rule '%s'. %s",name,e)
-                    if '#' in r:
-                         self.log.error("Make sure '#' in rule '%s' is escaped with '\\#'",name)
-                    self.error = 1
-
-            if not self.funcsym[state] and not self.strsym[state]:
-                self.log.error("No rules defined for state '%s'",state)
-                self.error = 1
-
-            # Validate the error function
-            efunc = self.errorf.get(state,None)
-            if efunc:
-                f = efunc
-                line = func_code(f).co_firstlineno
-                file = func_code(f).co_filename
-                self.files[file] = 1
-
-                if isinstance(f, types.MethodType):
-                    reqargs = 2
-                else:
-                    reqargs = 1
-                nargs = func_code(f).co_argcount
-                if nargs > reqargs:
-                    self.log.error("%s:%d: Rule '%s' has too many arguments",file,line,f.__name__)
-                    self.error = 1
-
-                if nargs < reqargs:
-                    self.log.error("%s:%d: Rule '%s' requires an argument", file,line,f.__name__)
-                    self.error = 1
-
-        for f in self.files:
-            self.validate_file(f)
-
-
-    # -----------------------------------------------------------------------------
-    # validate_file()
-    #
-    # This checks to see if there are duplicated t_rulename() functions or strings
-    # in the parser input file.  This is done using a simple regular expression
-    # match on each line in the given file.  
-    # -----------------------------------------------------------------------------
-
-    def validate_file(self,filename):
-        import os.path
-        base,ext = os.path.splitext(filename)
-        if ext != '.py': return         # No idea what the file is. Return OK
-
-        try:
-            f = open(filename)
-            lines = f.readlines()
-            f.close()
-        except IOError:
-            return                      # Couldn't find the file.  Don't worry about it
-
-        fre = re.compile(r'\s*def\s+(t_[a-zA-Z_0-9]*)\(')
-        sre = re.compile(r'\s*(t_[a-zA-Z_0-9]*)\s*=')
-
-        counthash = { }
-        linen = 1
-        for l in lines:
-            m = fre.match(l)
-            if not m:
-                m = sre.match(l)
-            if m:
-                name = m.group(1)
-                prev = counthash.get(name)
-                if not prev:
-                    counthash[name] = linen
-                else:
-                    self.log.error("%s:%d: Rule %s redefined. Previously defined on line %d",filename,linen,name,prev)
-                    self.error = 1
-            linen += 1
-            
-# -----------------------------------------------------------------------------
-# lex(module)
-#
-# Build all of the regular expression rules from definitions in the supplied module
-# -----------------------------------------------------------------------------
-def lex(module=None,object=None,debug=0,optimize=0,lextab="lextab",reflags=0,nowarn=0,outputdir="", debuglog=None, errorlog=None):
-    global lexer
-    ldict = None
-    stateinfo  = { 'INITIAL' : 'inclusive'}
-    lexobj = Lexer()
-    lexobj.lexoptimize = optimize
-    global token,input
-
-    if errorlog is None:
-        errorlog = PlyLogger(sys.stderr)
-
-    if debug:
-        if debuglog is None:
-            debuglog = PlyLogger(sys.stderr)
-
-    # Get the module dictionary used for the lexer
-    if object: module = object
-
-    if module:
-        _items = [(k,getattr(module,k)) for k in dir(module)]
-        ldict = dict(_items)
-    else:
-        ldict = get_caller_module_dict(2)
-
-    # Collect parser information from the dictionary
-    linfo = LexerReflect(ldict,log=errorlog,reflags=reflags)
-    linfo.get_all()
-    if not optimize:
-        if linfo.validate_all():
-            raise SyntaxError("Can't build lexer")
-
-    if optimize and lextab:
-        try:
-            lexobj.readtab(lextab,ldict)
-            token = lexobj.token
-            input = lexobj.input
-            lexer = lexobj
-            return lexobj
-
-        except ImportError:
-            pass
-
-    # Dump some basic debugging information
-    if debug:
-        debuglog.info("lex: tokens   = %r", linfo.tokens)
-        debuglog.info("lex: literals = %r", linfo.literals)
-        debuglog.info("lex: states   = %r", linfo.stateinfo)
-
-    # Build a dictionary of valid token names
-    lexobj.lextokens = { }
-    for n in linfo.tokens:
-        lexobj.lextokens[n] = 1
-
-    # Get literals specification
-    if isinstance(linfo.literals,(list,tuple)):
-        lexobj.lexliterals = type(linfo.literals[0])().join(linfo.literals)
-    else:
-        lexobj.lexliterals = linfo.literals
-
-    # Get the stateinfo dictionary
-    stateinfo = linfo.stateinfo
-
-    regexs = { }
-    # Build the master regular expressions
-    for state in stateinfo:
-        regex_list = []
-
-        # Add rules defined by functions first
-        for fname, f in linfo.funcsym[state]:
-            line = func_code(f).co_firstlineno
-            file = func_code(f).co_filename
-            regex_list.append("(?P<%s>%s)" % (fname,f.__doc__))
-            if debug:
-                debuglog.info("lex: Adding rule %s -> '%s' (state '%s')",fname,f.__doc__, state)
-
-        # Now add all of the simple rules
-        for name,r in linfo.strsym[state]:
-            regex_list.append("(?P<%s>%s)" % (name,r))
-            if debug:
-                debuglog.info("lex: Adding rule %s -> '%s' (state '%s')",name,r, state)
-
-        regexs[state] = regex_list
-
-    # Build the master regular expressions
-
-    if debug:
-        debuglog.info("lex: ==== MASTER REGEXS FOLLOW ====")
-
-    for state in regexs:
-        lexre, re_text, re_names = _form_master_re(regexs[state],reflags,ldict,linfo.toknames)
-        lexobj.lexstatere[state] = lexre
-        lexobj.lexstateretext[state] = re_text
-        lexobj.lexstaterenames[state] = re_names
-        if debug:
-            for i in range(len(re_text)):
-                debuglog.info("lex: state '%s' : regex[%d] = '%s'",state, i, re_text[i])
-
-    # For inclusive states, we need to add the regular expressions from the INITIAL state
-    for state,stype in stateinfo.items():
-        if state != "INITIAL" and stype == 'inclusive':
-             lexobj.lexstatere[state].extend(lexobj.lexstatere['INITIAL'])
-             lexobj.lexstateretext[state].extend(lexobj.lexstateretext['INITIAL'])
-             lexobj.lexstaterenames[state].extend(lexobj.lexstaterenames['INITIAL'])
-
-    lexobj.lexstateinfo = stateinfo
-    lexobj.lexre = lexobj.lexstatere["INITIAL"]
-    lexobj.lexretext = lexobj.lexstateretext["INITIAL"]
-    lexobj.lexreflags = reflags
-
-    # Set up ignore variables
-    lexobj.lexstateignore = linfo.ignore
-    lexobj.lexignore = lexobj.lexstateignore.get("INITIAL","")
-
-    # Set up error functions
-    lexobj.lexstateerrorf = linfo.errorf
-    lexobj.lexerrorf = linfo.errorf.get("INITIAL",None)
-    if not lexobj.lexerrorf:
-        errorlog.warning("No t_error rule is defined")
-
-    # Check state information for ignore and error rules
-    for s,stype in stateinfo.items():
-        if stype == 'exclusive':
-              if not s in linfo.errorf:
-                   errorlog.warning("No error rule is defined for exclusive state '%s'", s)
-              if not s in linfo.ignore and lexobj.lexignore:
-                   errorlog.warning("No ignore rule is defined for exclusive state '%s'", s)
-        elif stype == 'inclusive':
-              if not s in linfo.errorf:
-                   linfo.errorf[s] = linfo.errorf.get("INITIAL",None)
-              if not s in linfo.ignore:
-                   linfo.ignore[s] = linfo.ignore.get("INITIAL","")
-
-    # Create global versions of the token() and input() functions
-    token = lexobj.token
-    input = lexobj.input
-    lexer = lexobj
-
-    # If in optimize mode, we write the lextab
-    if lextab and optimize:
-        lexobj.writetab(lextab,outputdir)
-
-    return lexobj
-
-# -----------------------------------------------------------------------------
-# runmain()
-#
-# This runs the lexer as a main program
-# -----------------------------------------------------------------------------
-
-def runmain(lexer=None,data=None):
-    if not data:
-        try:
-            filename = sys.argv[1]
-            f = open(filename)
-            data = f.read()
-            f.close()
-        except IndexError:
-            sys.stdout.write("Reading from standard input (type EOF to end):\n")
-            data = sys.stdin.read()
-
-    if lexer:
-        _input = lexer.input
-    else:
-        _input = input
-    _input(data)
-    if lexer:
-        _token = lexer.token
-    else:
-        _token = token
-
-    while 1:
-        tok = _token()
-        if not tok: break
-        sys.stdout.write("(%s,%r,%d,%d)\n" % (tok.type, tok.value, tok.lineno,tok.lexpos))
-
-# -----------------------------------------------------------------------------
-# @TOKEN(regex)
-#
-# This decorator function can be used to set the regex expression on a function
-# when its docstring might need to be set in an alternative way
-# -----------------------------------------------------------------------------
-
-def TOKEN(r):
-    def set_doc(f):
-        if hasattr(r,"__call__"):
-            f.__doc__ = r.__doc__
-        else:
-            f.__doc__ = r
-        return f
-    return set_doc
-
-# Alternative spelling of the TOKEN decorator
-Token = TOKEN
-
diff --git a/third_party/ply/license.patch b/third_party/ply/license.patch
deleted file mode 100644
index 7b2621f..0000000
--- a/third_party/ply/license.patch
+++ /dev/null
@@ -1,41 +0,0 @@
-diff --git a/third_party/ply/__init__.py b/third_party/ply/__init__.py
-index 853a985..f3da03e 100644
---- a/third_party/ply/__init__.py
-+++ b/third_party/ply/__init__.py
-@@ -1,4 +1,36 @@
- # PLY package
- # Author: David Beazley (dave@dabeaz.com)
-+# -----------------------------------------------------------------------------
-+# ply: yacc.py
-+#
-+# Copyright (C) 2001-2011,
-+# David M. Beazley (Dabeaz LLC)
-+# All rights reserved.
-+#
-+# Redistribution and use in source and binary forms, with or without
-+# modification, are permitted provided that the following conditions are
-+# met:
-+#
-+# * Redistributions of source code must retain the above copyright notice,
-+#   this list of conditions and the following disclaimer.
-+# * Redistributions in binary form must reproduce the above copyright notice,
-+#   this list of conditions and the following disclaimer in the documentation
-+#   and/or other materials provided with the distribution.
-+# * Neither the name of the David Beazley or Dabeaz LLC may be used to
-+#   endorse or promote products derived from this software without
-+#  specific prior written permission.
-+#
-+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-+# -----------------------------------------------------------------------------
- 
- __all__ = ['lex','yacc']
diff --git a/third_party/ply/yacc.py b/third_party/ply/yacc.py
deleted file mode 100644
index f70439e..0000000
--- a/third_party/ply/yacc.py
+++ /dev/null
@@ -1,3276 +0,0 @@
-# -----------------------------------------------------------------------------
-# ply: yacc.py
-#
-# Copyright (C) 2001-2011,
-# David M. Beazley (Dabeaz LLC)
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are
-# met:
-# 
-# * Redistributions of source code must retain the above copyright notice,
-#   this list of conditions and the following disclaimer.  
-# * Redistributions in binary form must reproduce the above copyright notice, 
-#   this list of conditions and the following disclaimer in the documentation
-#   and/or other materials provided with the distribution.  
-# * Neither the name of the David Beazley or Dabeaz LLC may be used to
-#   endorse or promote products derived from this software without
-#  specific prior written permission. 
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-# -----------------------------------------------------------------------------
-#
-# This implements an LR parser that is constructed from grammar rules defined
-# as Python functions. The grammer is specified by supplying the BNF inside
-# Python documentation strings.  The inspiration for this technique was borrowed
-# from John Aycock's Spark parsing system.  PLY might be viewed as cross between
-# Spark and the GNU bison utility.
-#
-# The current implementation is only somewhat object-oriented. The
-# LR parser itself is defined in terms of an object (which allows multiple
-# parsers to co-exist).  However, most of the variables used during table
-# construction are defined in terms of global variables.  Users shouldn't
-# notice unless they are trying to define multiple parsers at the same
-# time using threads (in which case they should have their head examined).
-#
-# This implementation supports both SLR and LALR(1) parsing.  LALR(1)
-# support was originally implemented by Elias Ioup (ezioup@alumni.uchicago.edu),
-# using the algorithm found in Aho, Sethi, and Ullman "Compilers: Principles,
-# Techniques, and Tools" (The Dragon Book).  LALR(1) has since been replaced
-# by the more efficient DeRemer and Pennello algorithm.
-#
-# :::::::: WARNING :::::::
-#
-# Construction of LR parsing tables is fairly complicated and expensive.
-# To make this module run fast, a *LOT* of work has been put into
-# optimization---often at the expensive of readability and what might
-# consider to be good Python "coding style."   Modify the code at your
-# own risk!
-# ----------------------------------------------------------------------------
-
-__version__    = "3.4"
-__tabversion__ = "3.2"       # Table version
-
-#-----------------------------------------------------------------------------
-#                     === User configurable parameters ===
-#
-# Change these to modify the default behavior of yacc (if you wish)
-#-----------------------------------------------------------------------------
-
-yaccdebug   = 1                # Debugging mode.  If set, yacc generates a
-                               # a 'parser.out' file in the current directory
-
-debug_file  = 'parser.out'     # Default name of the debugging file
-tab_module  = 'parsetab'       # Default name of the table module
-default_lr  = 'LALR'           # Default LR table generation method
-
-error_count = 3                # Number of symbols that must be shifted to leave recovery mode
-
-yaccdevel   = 0                # Set to True if developing yacc.  This turns off optimized
-                               # implementations of certain functions.
-
-resultlimit = 40               # Size limit of results when running in debug mode.
-
-pickle_protocol = 0            # Protocol to use when writing pickle files
-
-import re, types, sys, os.path
-
-# Compatibility function for python 2.6/3.0
-if sys.version_info[0] < 3:
-    def func_code(f):
-        return f.func_code
-else:
-    def func_code(f):
-        return f.__code__
-
-# Compatibility
-try:
-    MAXINT = sys.maxint
-except AttributeError:
-    MAXINT = sys.maxsize
-
-# Python 2.x/3.0 compatibility.
-def load_ply_lex():
-    if sys.version_info[0] < 3:
-        import lex
-    else:
-        import ply.lex as lex
-    return lex
-
-# This object is a stand-in for a logging object created by the 
-# logging module.   PLY will use this by default to create things
-# such as the parser.out file.  If a user wants more detailed
-# information, they can create their own logging object and pass
-# it into PLY.
-
-class PlyLogger(object):
-    def __init__(self,f):
-        self.f = f
-    def debug(self,msg,*args,**kwargs):
-        self.f.write((msg % args) + "\n")
-    info     = debug
-
-    def warning(self,msg,*args,**kwargs):
-        self.f.write("WARNING: "+ (msg % args) + "\n")
-
-    def error(self,msg,*args,**kwargs):
-        self.f.write("ERROR: " + (msg % args) + "\n")
-
-    critical = debug
-
-# Null logger is used when no output is generated. Does nothing.
-class NullLogger(object):
-    def __getattribute__(self,name):
-        return self
-    def __call__(self,*args,**kwargs):
-        return self
-        
-# Exception raised for yacc-related errors
-class YaccError(Exception):   pass
-
-# Format the result message that the parser produces when running in debug mode.
-def format_result(r):
-    repr_str = repr(r)
-    if '\n' in repr_str: repr_str = repr(repr_str)
-    if len(repr_str) > resultlimit:
-        repr_str = repr_str[:resultlimit]+" ..."
-    result = "<%s @ 0x%x> (%s)" % (type(r).__name__,id(r),repr_str)
-    return result
-
-
-# Format stack entries when the parser is running in debug mode
-def format_stack_entry(r):
-    repr_str = repr(r)
-    if '\n' in repr_str: repr_str = repr(repr_str)
-    if len(repr_str) < 16:
-        return repr_str
-    else:
-        return "<%s @ 0x%x>" % (type(r).__name__,id(r))
-
-#-----------------------------------------------------------------------------
-#                        ===  LR Parsing Engine ===
-#
-# The following classes are used for the LR parser itself.  These are not
-# used during table construction and are independent of the actual LR
-# table generation algorithm
-#-----------------------------------------------------------------------------
-
-# This class is used to hold non-terminal grammar symbols during parsing.
-# It normally has the following attributes set:
-#        .type       = Grammar symbol type
-#        .value      = Symbol value
-#        .lineno     = Starting line number
-#        .endlineno  = Ending line number (optional, set automatically)
-#        .lexpos     = Starting lex position
-#        .endlexpos  = Ending lex position (optional, set automatically)
-
-class YaccSymbol:
-    def __str__(self):    return self.type
-    def __repr__(self):   return str(self)
-
-# This class is a wrapper around the objects actually passed to each
-# grammar rule.   Index lookup and assignment actually assign the
-# .value attribute of the underlying YaccSymbol object.
-# The lineno() method returns the line number of a given
-# item (or 0 if not defined).   The linespan() method returns
-# a tuple of (startline,endline) representing the range of lines
-# for a symbol.  The lexspan() method returns a tuple (lexpos,endlexpos)
-# representing the range of positional information for a symbol.
-
-class YaccProduction:
-    def __init__(self,s,stack=None):
-        self.slice = s
-        self.stack = stack
-        self.lexer = None
-        self.parser= None
-    def __getitem__(self,n):
-        if n >= 0: return self.slice[n].value
-        else: return self.stack[n].value
-
-    def __setitem__(self,n,v):
-        self.slice[n].value = v
-
-    def __getslice__(self,i,j):
-        return [s.value for s in self.slice[i:j]]
-
-    def __len__(self):
-        return len(self.slice)
-
-    def lineno(self,n):
-        return getattr(self.slice[n],"lineno",0)
-
-    def set_lineno(self,n,lineno):
-        self.slice[n].lineno = lineno
-
-    def linespan(self,n):
-        startline = getattr(self.slice[n],"lineno",0)
-        endline = getattr(self.slice[n],"endlineno",startline)
-        return startline,endline
-
-    def lexpos(self,n):
-        return getattr(self.slice[n],"lexpos",0)
-
-    def lexspan(self,n):
-        startpos = getattr(self.slice[n],"lexpos",0)
-        endpos = getattr(self.slice[n],"endlexpos",startpos)
-        return startpos,endpos
-
-    def error(self):
-       raise SyntaxError
-
-
-# -----------------------------------------------------------------------------
-#                               == LRParser ==
-#
-# The LR Parsing engine.
-# -----------------------------------------------------------------------------
-
-class LRParser:
-    def __init__(self,lrtab,errorf):
-        self.productions = lrtab.lr_productions
-        self.action      = lrtab.lr_action
-        self.goto        = lrtab.lr_goto
-        self.errorfunc   = errorf
-
-    def errok(self):
-        self.errorok     = 1
-
-    def restart(self):
-        del self.statestack[:]
-        del self.symstack[:]
-        sym = YaccSymbol()
-        sym.type = '$end'
-        self.symstack.append(sym)
-        self.statestack.append(0)
-
-    def parse(self,input=None,lexer=None,debug=0,tracking=0,tokenfunc=None):
-        if debug or yaccdevel:
-            if isinstance(debug,int):
-                debug = PlyLogger(sys.stderr)
-            return self.parsedebug(input,lexer,debug,tracking,tokenfunc)
-        elif tracking:
-            return self.parseopt(input,lexer,debug,tracking,tokenfunc)
-        else:
-            return self.parseopt_notrack(input,lexer,debug,tracking,tokenfunc)
-        
-
-    # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-    # parsedebug().
-    #
-    # This is the debugging enabled version of parse().  All changes made to the
-    # parsing engine should be made here.   For the non-debugging version,
-    # copy this code to a method parseopt() and delete all of the sections
-    # enclosed in:
-    #
-    #      #--! DEBUG
-    #      statements
-    #      #--! DEBUG
-    #
-    # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-    def parsedebug(self,input=None,lexer=None,debug=None,tracking=0,tokenfunc=None):
-        lookahead = None                 # Current lookahead symbol
-        lookaheadstack = [ ]             # Stack of lookahead symbols
-        actions = self.action            # Local reference to action table (to avoid lookup on self.)
-        goto    = self.goto              # Local reference to goto table (to avoid lookup on self.)
-        prod    = self.productions       # Local reference to production list (to avoid lookup on self.)
-        pslice  = YaccProduction(None)   # Production object passed to grammar rules
-        errorcount = 0                   # Used during error recovery 
-
-        # --! DEBUG
-        debug.info("PLY: PARSE DEBUG START")
-        # --! DEBUG
-
-        # If no lexer was given, we will try to use the lex module
-        if not lexer:
-            lex = load_ply_lex()
-            lexer = lex.lexer
-
-        # Set up the lexer and parser objects on pslice
-        pslice.lexer = lexer
-        pslice.parser = self
-
-        # If input was supplied, pass to lexer
-        if input is not None:
-            lexer.input(input)
-
-        if tokenfunc is None:
-           # Tokenize function
-           get_token = lexer.token
-        else:
-           get_token = tokenfunc
-
-        # Set up the state and symbol stacks
-
-        statestack = [ ]                # Stack of parsing states
-        self.statestack = statestack
-        symstack   = [ ]                # Stack of grammar symbols
-        self.symstack = symstack
-
-        pslice.stack = symstack         # Put in the production
-        errtoken   = None               # Err token
-
-        # The start state is assumed to be (0,$end)
-
-        statestack.append(0)
-        sym = YaccSymbol()
-        sym.type = "$end"
-        symstack.append(sym)
-        state = 0
-        while 1:
-            # Get the next symbol on the input.  If a lookahead symbol
-            # is already set, we just use that. Otherwise, we'll pull
-            # the next token off of the lookaheadstack or from the lexer
-
-            # --! DEBUG
-            debug.debug('')
-            debug.debug('State  : %s', state)
-            # --! DEBUG
-
-            if not lookahead:
-                if not lookaheadstack:
-                    lookahead = get_token()     # Get the next token
-                else:
-                    lookahead = lookaheadstack.pop()
-                if not lookahead:
-                    lookahead = YaccSymbol()
-                    lookahead.type = "$end"
-
-            # --! DEBUG
-            debug.debug('Stack  : %s',
-                        ("%s . %s" % (" ".join([xx.type for xx in symstack][1:]), str(lookahead))).lstrip())
-            # --! DEBUG
-
-            # Check the action table
-            ltype = lookahead.type
-            t = actions[state].get(ltype)
-
-            if t is not None:
-                if t > 0:
-                    # shift a symbol on the stack
-                    statestack.append(t)
-                    state = t
-                    
-                    # --! DEBUG
-                    debug.debug("Action : Shift and goto state %s", t)
-                    # --! DEBUG
-
-                    symstack.append(lookahead)
-                    lookahead = None
-
-                    # Decrease error count on successful shift
-                    if errorcount: errorcount -=1
-                    continue
-
-                if t < 0:
-                    # reduce a symbol on the stack, emit a production
-                    p = prod[-t]
-                    pname = p.name
-                    plen  = p.len
-
-                    # Get production function
-                    sym = YaccSymbol()
-                    sym.type = pname       # Production name
-                    sym.value = None
-
-                    # --! DEBUG
-                    if plen:
-                        debug.info("Action : Reduce rule [%s] with %s and goto state %d", p.str, "["+",".join([format_stack_entry(_v.value) for _v in symstack[-plen:]])+"]",-t)
-                    else:
-                        debug.info("Action : Reduce rule [%s] with %s and goto state %d", p.str, [],-t)
-                        
-                    # --! DEBUG
-
-                    if plen:
-                        targ = symstack[-plen-1:]
-                        targ[0] = sym
-
-                        # --! TRACKING
-                        if tracking:
-                           t1 = targ[1]
-                           sym.lineno = t1.lineno
-                           sym.lexpos = t1.lexpos
-                           t1 = targ[-1]
-                           sym.endlineno = getattr(t1,"endlineno",t1.lineno)
-                           sym.endlexpos = getattr(t1,"endlexpos",t1.lexpos)
-
-                        # --! TRACKING
-
-                        # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-                        # The code enclosed in this section is duplicated 
-                        # below as a performance optimization.  Make sure
-                        # changes get made in both locations.
-
-                        pslice.slice = targ
-                        
-                        try:
-                            # Call the grammar rule with our special slice object
-                            del symstack[-plen:]
-                            del statestack[-plen:]
-                            p.callable(pslice)
-                            # --! DEBUG
-                            debug.info("Result : %s", format_result(pslice[0]))
-                            # --! DEBUG
-                            symstack.append(sym)
-                            state = goto[statestack[-1]][pname]
-                            statestack.append(state)
-                        except SyntaxError:
-                            # If an error was set. Enter error recovery state
-                            lookaheadstack.append(lookahead)
-                            symstack.pop()
-                            statestack.pop()
-                            state = statestack[-1]
-                            sym.type = 'error'
-                            lookahead = sym
-                            errorcount = error_count
-                            self.errorok = 0
-                        continue
-                        # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-    
-                    else:
-
-                        # --! TRACKING
-                        if tracking:
-                           sym.lineno = lexer.lineno
-                           sym.lexpos = lexer.lexpos
-                        # --! TRACKING
-
-                        targ = [ sym ]
-
-                        # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-                        # The code enclosed in this section is duplicated 
-                        # above as a performance optimization.  Make sure
-                        # changes get made in both locations.
-
-                        pslice.slice = targ
-
-                        try:
-                            # Call the grammar rule with our special slice object
-                            p.callable(pslice)
-                            # --! DEBUG
-                            debug.info("Result : %s", format_result(pslice[0]))
-                            # --! DEBUG
-                            symstack.append(sym)
-                            state = goto[statestack[-1]][pname]
-                            statestack.append(state)
-                        except SyntaxError:
-                            # If an error was set. Enter error recovery state
-                            lookaheadstack.append(lookahead)
-                            symstack.pop()
-                            statestack.pop()
-                            state = statestack[-1]
-                            sym.type = 'error'
-                            lookahead = sym
-                            errorcount = error_count
-                            self.errorok = 0
-                        continue
-                        # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-                if t == 0:
-                    n = symstack[-1]
-                    result = getattr(n,"value",None)
-                    # --! DEBUG
-                    debug.info("Done   : Returning %s", format_result(result))
-                    debug.info("PLY: PARSE DEBUG END")
-                    # --! DEBUG
-                    return result
-
-            if t == None:
-
-                # --! DEBUG
-                debug.error('Error  : %s',
-                            ("%s . %s" % (" ".join([xx.type for xx in symstack][1:]), str(lookahead))).lstrip())
-                # --! DEBUG
-
-                # We have some kind of parsing error here.  To handle
-                # this, we are going to push the current token onto
-                # the tokenstack and replace it with an 'error' token.
-                # If there are any synchronization rules, they may
-                # catch it.
-                #
-                # In addition to pushing the error token, we call call
-                # the user defined p_error() function if this is the
-                # first syntax error.  This function is only called if
-                # errorcount == 0.
-                if errorcount == 0 or self.errorok:
-                    errorcount = error_count
-                    self.errorok = 0
-                    errtoken = lookahead
-                    if errtoken.type == "$end":
-                        errtoken = None               # End of file!
-                    if self.errorfunc:
-                        global errok,token,restart
-                        errok = self.errok        # Set some special functions available in error recovery
-                        token = get_token
-                        restart = self.restart
-                        if errtoken and not hasattr(errtoken,'lexer'):
-                            errtoken.lexer = lexer
-                        tok = self.errorfunc(errtoken)
-                        del errok, token, restart   # Delete special functions
-
-                        if self.errorok:
-                            # User must have done some kind of panic
-                            # mode recovery on their own.  The
-                            # returned token is the next lookahead
-                            lookahead = tok
-                            errtoken = None
-                            continue
-                    else:
-                        if errtoken:
-                            if hasattr(errtoken,"lineno"): lineno = lookahead.lineno
-                            else: lineno = 0
-                            if lineno:
-                                sys.stderr.write("yacc: Syntax error at line %d, token=%s\n" % (lineno, errtoken.type))
-                            else:
-                                sys.stderr.write("yacc: Syntax error, token=%s" % errtoken.type)
-                        else:
-                            sys.stderr.write("yacc: Parse error in input. EOF\n")
-                            return
-
-                else:
-                    errorcount = error_count
-
-                # case 1:  the statestack only has 1 entry on it.  If we're in this state, the
-                # entire parse has been rolled back and we're completely hosed.   The token is
-                # discarded and we just keep going.
-
-                if len(statestack) <= 1 and lookahead.type != "$end":
-                    lookahead = None
-                    errtoken = None
-                    state = 0
-                    # Nuke the pushback stack
-                    del lookaheadstack[:]
-                    continue
-
-                # case 2: the statestack has a couple of entries on it, but we're
-                # at the end of the file. nuke the top entry and generate an error token
-
-                # Start nuking entries on the stack
-                if lookahead.type == "$end":
-                    # Whoa. We're really hosed here. Bail out
-                    return
-
-                if lookahead.type != 'error':
-                    sym = symstack[-1]
-                    if sym.type == 'error':
-                        # Hmmm. Error is on top of stack, we'll just nuke input
-                        # symbol and continue
-                        lookahead = None
-                        continue
-                    t = YaccSymbol()
-                    t.type = 'error'
-                    if hasattr(lookahead,"lineno"):
-                        t.lineno = lookahead.lineno
-                    t.value = lookahead
-                    lookaheadstack.append(lookahead)
-                    lookahead = t
-                else:
-                    symstack.pop()
-                    statestack.pop()
-                    state = statestack[-1]       # Potential bug fix
-
-                continue
-
-            # Call an error function here
-            raise RuntimeError("yacc: internal parser error!!!\n")
-
-    # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-    # parseopt().
-    #
-    # Optimized version of parse() method.  DO NOT EDIT THIS CODE DIRECTLY.
-    # Edit the debug version above, then copy any modifications to the method
-    # below while removing #--! DEBUG sections.
-    # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-
-    def parseopt(self,input=None,lexer=None,debug=0,tracking=0,tokenfunc=None):
-        lookahead = None                 # Current lookahead symbol
-        lookaheadstack = [ ]             # Stack of lookahead symbols
-        actions = self.action            # Local reference to action table (to avoid lookup on self.)
-        goto    = self.goto              # Local reference to goto table (to avoid lookup on self.)
-        prod    = self.productions       # Local reference to production list (to avoid lookup on self.)
-        pslice  = YaccProduction(None)   # Production object passed to grammar rules
-        errorcount = 0                   # Used during error recovery 
-
-        # If no lexer was given, we will try to use the lex module
-        if not lexer:
-            lex = load_ply_lex()
-            lexer = lex.lexer
-        
-        # Set up the lexer and parser objects on pslice
-        pslice.lexer = lexer
-        pslice.parser = self
-
-        # If input was supplied, pass to lexer
-        if input is not None:
-            lexer.input(input)
-
-        if tokenfunc is None:
-           # Tokenize function
-           get_token = lexer.token
-        else:
-           get_token = tokenfunc
-
-        # Set up the state and symbol stacks
-
-        statestack = [ ]                # Stack of parsing states
-        self.statestack = statestack
-        symstack   = [ ]                # Stack of grammar symbols
-        self.symstack = symstack
-
-        pslice.stack = symstack         # Put in the production
-        errtoken   = None               # Err token
-
-        # The start state is assumed to be (0,$end)
-
-        statestack.append(0)
-        sym = YaccSymbol()
-        sym.type = '$end'
-        symstack.append(sym)
-        state = 0
-        while 1:
-            # Get the next symbol on the input.  If a lookahead symbol
-            # is already set, we just use that. Otherwise, we'll pull
-            # the next token off of the lookaheadstack or from the lexer
-
-            if not lookahead:
-                if not lookaheadstack:
-                    lookahead = get_token()     # Get the next token
-                else:
-                    lookahead = lookaheadstack.pop()
-                if not lookahead:
-                    lookahead = YaccSymbol()
-                    lookahead.type = '$end'
-
-            # Check the action table
-            ltype = lookahead.type
-            t = actions[state].get(ltype)
-
-            if t is not None:
-                if t > 0:
-                    # shift a symbol on the stack
-                    statestack.append(t)
-                    state = t
-
-                    symstack.append(lookahead)
-                    lookahead = None
-
-                    # Decrease error count on successful shift
-                    if errorcount: errorcount -=1
-                    continue
-
-                if t < 0:
-                    # reduce a symbol on the stack, emit a production
-                    p = prod[-t]
-                    pname = p.name
-                    plen  = p.len
-
-                    # Get production function
-                    sym = YaccSymbol()
-                    sym.type = pname       # Production name
-                    sym.value = None
-
-                    if plen:
-                        targ = symstack[-plen-1:]
-                        targ[0] = sym
-
-                        # --! TRACKING
-                        if tracking:
-                           t1 = targ[1]
-                           sym.lineno = t1.lineno
-                           sym.lexpos = t1.lexpos
-                           t1 = targ[-1]
-                           sym.endlineno = getattr(t1,"endlineno",t1.lineno)
-                           sym.endlexpos = getattr(t1,"endlexpos",t1.lexpos)
-
-                        # --! TRACKING
-
-                        # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-                        # The code enclosed in this section is duplicated 
-                        # below as a performance optimization.  Make sure
-                        # changes get made in both locations.
-
-                        pslice.slice = targ
-                        
-                        try:
-                            # Call the grammar rule with our special slice object
-                            del symstack[-plen:]
-                            del statestack[-plen:]
-                            p.callable(pslice)
-                            symstack.append(sym)
-                            state = goto[statestack[-1]][pname]
-                            statestack.append(state)
-                        except SyntaxError:
-                            # If an error was set. Enter error recovery state
-                            lookaheadstack.append(lookahead)
-                            symstack.pop()
-                            statestack.pop()
-                            state = statestack[-1]
-                            sym.type = 'error'
-                            lookahead = sym
-                            errorcount = error_count
-                            self.errorok = 0
-                        continue
-                        # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-    
-                    else:
-
-                        # --! TRACKING
-                        if tracking:
-                           sym.lineno = lexer.lineno
-                           sym.lexpos = lexer.lexpos
-                        # --! TRACKING
-
-                        targ = [ sym ]
-
-                        # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-                        # The code enclosed in this section is duplicated 
-                        # above as a performance optimization.  Make sure
-                        # changes get made in both locations.
-
-                        pslice.slice = targ
-
-                        try:
-                            # Call the grammar rule with our special slice object
-                            p.callable(pslice)
-                            symstack.append(sym)
-                            state = goto[statestack[-1]][pname]
-                            statestack.append(state)
-                        except SyntaxError:
-                            # If an error was set. Enter error recovery state
-                            lookaheadstack.append(lookahead)
-                            symstack.pop()
-                            statestack.pop()
-                            state = statestack[-1]
-                            sym.type = 'error'
-                            lookahead = sym
-                            errorcount = error_count
-                            self.errorok = 0
-                        continue
-                        # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-                if t == 0:
-                    n = symstack[-1]
-                    return getattr(n,"value",None)
-
-            if t == None:
-
-                # We have some kind of parsing error here.  To handle
-                # this, we are going to push the current token onto
-                # the tokenstack and replace it with an 'error' token.
-                # If there are any synchronization rules, they may
-                # catch it.
-                #
-                # In addition to pushing the error token, we call call
-                # the user defined p_error() function if this is the
-                # first syntax error.  This function is only called if
-                # errorcount == 0.
-                if errorcount == 0 or self.errorok:
-                    errorcount = error_count
-                    self.errorok = 0
-                    errtoken = lookahead
-                    if errtoken.type == '$end':
-                        errtoken = None               # End of file!
-                    if self.errorfunc:
-                        global errok,token,restart
-                        errok = self.errok        # Set some special functions available in error recovery
-                        token = get_token
-                        restart = self.restart
-                        if errtoken and not hasattr(errtoken,'lexer'):
-                            errtoken.lexer = lexer
-                        tok = self.errorfunc(errtoken)
-                        del errok, token, restart   # Delete special functions
-
-                        if self.errorok:
-                            # User must have done some kind of panic
-                            # mode recovery on their own.  The
-                            # returned token is the next lookahead
-                            lookahead = tok
-                            errtoken = None
-                            continue
-                    else:
-                        if errtoken:
-                            if hasattr(errtoken,"lineno"): lineno = lookahead.lineno
-                            else: lineno = 0
-                            if lineno:
-                                sys.stderr.write("yacc: Syntax error at line %d, token=%s\n" % (lineno, errtoken.type))
-                            else:
-                                sys.stderr.write("yacc: Syntax error, token=%s" % errtoken.type)
-                        else:
-                            sys.stderr.write("yacc: Parse error in input. EOF\n")
-                            return
-
-                else:
-                    errorcount = error_count
-
-                # case 1:  the statestack only has 1 entry on it.  If we're in this state, the
-                # entire parse has been rolled back and we're completely hosed.   The token is
-                # discarded and we just keep going.
-
-                if len(statestack) <= 1 and lookahead.type != '$end':
-                    lookahead = None
-                    errtoken = None
-                    state = 0
-                    # Nuke the pushback stack
-                    del lookaheadstack[:]
-                    continue
-
-                # case 2: the statestack has a couple of entries on it, but we're
-                # at the end of the file. nuke the top entry and generate an error token
-
-                # Start nuking entries on the stack
-                if lookahead.type == '$end':
-                    # Whoa. We're really hosed here. Bail out
-                    return
-
-                if lookahead.type != 'error':
-                    sym = symstack[-1]
-                    if sym.type == 'error':
-                        # Hmmm. Error is on top of stack, we'll just nuke input
-                        # symbol and continue
-                        lookahead = None
-                        continue
-                    t = YaccSymbol()
-                    t.type = 'error'
-                    if hasattr(lookahead,"lineno"):
-                        t.lineno = lookahead.lineno
-                    t.value = lookahead
-                    lookaheadstack.append(lookahead)
-                    lookahead = t
-                else:
-                    symstack.pop()
-                    statestack.pop()
-                    state = statestack[-1]       # Potential bug fix
-
-                continue
-
-            # Call an error function here
-            raise RuntimeError("yacc: internal parser error!!!\n")
-
-    # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-    # parseopt_notrack().
-    #
-    # Optimized version of parseopt() with line number tracking removed. 
-    # DO NOT EDIT THIS CODE DIRECTLY. Copy the optimized version and remove
-    # code in the #--! TRACKING sections
-    # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-    def parseopt_notrack(self,input=None,lexer=None,debug=0,tracking=0,tokenfunc=None):
-        lookahead = None                 # Current lookahead symbol
-        lookaheadstack = [ ]             # Stack of lookahead symbols
-        actions = self.action            # Local reference to action table (to avoid lookup on self.)
-        goto    = self.goto              # Local reference to goto table (to avoid lookup on self.)
-        prod    = self.productions       # Local reference to production list (to avoid lookup on self.)
-        pslice  = YaccProduction(None)   # Production object passed to grammar rules
-        errorcount = 0                   # Used during error recovery 
-
-        # If no lexer was given, we will try to use the lex module
-        if not lexer:
-            lex = load_ply_lex()
-            lexer = lex.lexer
-        
-        # Set up the lexer and parser objects on pslice
-        pslice.lexer = lexer
-        pslice.parser = self
-
-        # If input was supplied, pass to lexer
-        if input is not None:
-            lexer.input(input)
-
-        if tokenfunc is None:
-           # Tokenize function
-           get_token = lexer.token
-        else:
-           get_token = tokenfunc
-
-        # Set up the state and symbol stacks
-
-        statestack = [ ]                # Stack of parsing states
-        self.statestack = statestack
-        symstack   = [ ]                # Stack of grammar symbols
-        self.symstack = symstack
-
-        pslice.stack = symstack         # Put in the production
-        errtoken   = None               # Err token
-
-        # The start state is assumed to be (0,$end)
-
-        statestack.append(0)
-        sym = YaccSymbol()
-        sym.type = '$end'
-        symstack.append(sym)
-        state = 0
-        while 1:
-            # Get the next symbol on the input.  If a lookahead symbol
-            # is already set, we just use that. Otherwise, we'll pull
-            # the next token off of the lookaheadstack or from the lexer
-
-            if not lookahead:
-                if not lookaheadstack:
-                    lookahead = get_token()     # Get the next token
-                else:
-                    lookahead = lookaheadstack.pop()
-                if not lookahead:
-                    lookahead = YaccSymbol()
-                    lookahead.type = '$end'
-
-            # Check the action table
-            ltype = lookahead.type
-            t = actions[state].get(ltype)
-
-            if t is not None:
-                if t > 0:
-                    # shift a symbol on the stack
-                    statestack.append(t)
-                    state = t
-
-                    symstack.append(lookahead)
-                    lookahead = None
-
-                    # Decrease error count on successful shift
-                    if errorcount: errorcount -=1
-                    continue
-
-                if t < 0:
-                    # reduce a symbol on the stack, emit a production
-                    p = prod[-t]
-                    pname = p.name
-                    plen  = p.len
-
-                    # Get production function
-                    sym = YaccSymbol()
-                    sym.type = pname       # Production name
-                    sym.value = None
-
-                    if plen:
-                        targ = symstack[-plen-1:]
-                        targ[0] = sym
-
-                        # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-                        # The code enclosed in this section is duplicated 
-                        # below as a performance optimization.  Make sure
-                        # changes get made in both locations.
-
-                        pslice.slice = targ
-                        
-                        try:
-                            # Call the grammar rule with our special slice object
-                            del symstack[-plen:]
-                            del statestack[-plen:]
-                            p.callable(pslice)
-                            symstack.append(sym)
-                            state = goto[statestack[-1]][pname]
-                            statestack.append(state)
-                        except SyntaxError:
-                            # If an error was set. Enter error recovery state
-                            lookaheadstack.append(lookahead)
-                            symstack.pop()
-                            statestack.pop()
-                            state = statestack[-1]
-                            sym.type = 'error'
-                            lookahead = sym
-                            errorcount = error_count
-                            self.errorok = 0
-                        continue
-                        # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-    
-                    else:
-
-                        targ = [ sym ]
-
-                        # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-                        # The code enclosed in this section is duplicated 
-                        # above as a performance optimization.  Make sure
-                        # changes get made in both locations.
-
-                        pslice.slice = targ
-
-                        try:
-                            # Call the grammar rule with our special slice object
-                            p.callable(pslice)
-                            symstack.append(sym)
-                            state = goto[statestack[-1]][pname]
-                            statestack.append(state)
-                        except SyntaxError:
-                            # If an error was set. Enter error recovery state
-                            lookaheadstack.append(lookahead)
-                            symstack.pop()
-                            statestack.pop()
-                            state = statestack[-1]
-                            sym.type = 'error'
-                            lookahead = sym
-                            errorcount = error_count
-                            self.errorok = 0
-                        continue
-                        # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-                if t == 0:
-                    n = symstack[-1]
-                    return getattr(n,"value",None)
-
-            if t == None:
-
-                # We have some kind of parsing error here.  To handle
-                # this, we are going to push the current token onto
-                # the tokenstack and replace it with an 'error' token.
-                # If there are any synchronization rules, they may
-                # catch it.
-                #
-                # In addition to pushing the error token, we call call
-                # the user defined p_error() function if this is the
-                # first syntax error.  This function is only called if
-                # errorcount == 0.
-                if errorcount == 0 or self.errorok:
-                    errorcount = error_count
-                    self.errorok = 0
-                    errtoken = lookahead
-                    if errtoken.type == '$end':
-                        errtoken = None               # End of file!
-                    if self.errorfunc:
-                        global errok,token,restart
-                        errok = self.errok        # Set some special functions available in error recovery
-                        token = get_token
-                        restart = self.restart
-                        if errtoken and not hasattr(errtoken,'lexer'):
-                            errtoken.lexer = lexer
-                        tok = self.errorfunc(errtoken)
-                        del errok, token, restart   # Delete special functions
-
-                        if self.errorok:
-                            # User must have done some kind of panic
-                            # mode recovery on their own.  The
-                            # returned token is the next lookahead
-                            lookahead = tok
-                            errtoken = None
-                            continue
-                    else:
-                        if errtoken:
-                            if hasattr(errtoken,"lineno"): lineno = lookahead.lineno
-                            else: lineno = 0
-                            if lineno:
-                                sys.stderr.write("yacc: Syntax error at line %d, token=%s\n" % (lineno, errtoken.type))
-                            else:
-                                sys.stderr.write("yacc: Syntax error, token=%s" % errtoken.type)
-                        else:
-                            sys.stderr.write("yacc: Parse error in input. EOF\n")
-                            return
-
-                else:
-                    errorcount = error_count
-
-                # case 1:  the statestack only has 1 entry on it.  If we're in this state, the
-                # entire parse has been rolled back and we're completely hosed.   The token is
-                # discarded and we just keep going.
-
-                if len(statestack) <= 1 and lookahead.type != '$end':
-                    lookahead = None
-                    errtoken = None
-                    state = 0
-                    # Nuke the pushback stack
-                    del lookaheadstack[:]
-                    continue
-
-                # case 2: the statestack has a couple of entries on it, but we're
-                # at the end of the file. nuke the top entry and generate an error token
-
-                # Start nuking entries on the stack
-                if lookahead.type == '$end':
-                    # Whoa. We're really hosed here. Bail out
-                    return
-
-                if lookahead.type != 'error':
-                    sym = symstack[-1]
-                    if sym.type == 'error':
-                        # Hmmm. Error is on top of stack, we'll just nuke input
-                        # symbol and continue
-                        lookahead = None
-                        continue
-                    t = YaccSymbol()
-                    t.type = 'error'
-                    if hasattr(lookahead,"lineno"):
-                        t.lineno = lookahead.lineno
-                    t.value = lookahead
-                    lookaheadstack.append(lookahead)
-                    lookahead = t
-                else:
-                    symstack.pop()
-                    statestack.pop()
-                    state = statestack[-1]       # Potential bug fix
-
-                continue
-
-            # Call an error function here
-            raise RuntimeError("yacc: internal parser error!!!\n")
-
-# -----------------------------------------------------------------------------
-#                          === Grammar Representation ===
-#
-# The following functions, classes, and variables are used to represent and
-# manipulate the rules that make up a grammar. 
-# -----------------------------------------------------------------------------
-
-import re
-
-# regex matching identifiers
-_is_identifier = re.compile(r'^[a-zA-Z0-9_-]+$')
-
-# -----------------------------------------------------------------------------
-# class Production:
-#
-# This class stores the raw information about a single production or grammar rule.
-# A grammar rule refers to a specification such as this:
-#
-#       expr : expr PLUS term 
-#
-# Here are the basic attributes defined on all productions
-#
-#       name     - Name of the production.  For example 'expr'
-#       prod     - A list of symbols on the right side ['expr','PLUS','term']
-#       prec     - Production precedence level
-#       number   - Production number.
-#       func     - Function that executes on reduce
-#       file     - File where production function is defined
-#       lineno   - Line number where production function is defined
-#
-# The following attributes are defined or optional.
-#
-#       len       - Length of the production (number of symbols on right hand side)
-#       usyms     - Set of unique symbols found in the production
-# -----------------------------------------------------------------------------
-
-class Production(object):
-    reduced = 0
-    def __init__(self,number,name,prod,precedence=('right',0),func=None,file='',line=0):
-        self.name     = name
-        self.prod     = tuple(prod)
-        self.number   = number
-        self.func     = func
-        self.callable = None
-        self.file     = file
-        self.line     = line
-        self.prec     = precedence
-
-        # Internal settings used during table construction
-        
-        self.len  = len(self.prod)   # Length of the production
-
-        # Create a list of unique production symbols used in the production
-        self.usyms = [ ]             
-        for s in self.prod:
-            if s not in self.usyms:
-                self.usyms.append(s)
-
-        # List of all LR items for the production
-        self.lr_items = []
-        self.lr_next = None
-
-        # Create a string representation
-        if self.prod:
-            self.str = "%s -> %s" % (self.name," ".join(self.prod))
-        else:
-            self.str = "%s -> <empty>" % self.name
-
-    def __str__(self):
-        return self.str
-
-    def __repr__(self):
-        return "Production("+str(self)+")"
-
-    def __len__(self):
-        return len(self.prod)
-
-    def __nonzero__(self):
-        return 1
-
-    def __getitem__(self,index):
-        return self.prod[index]
-            
-    # Return the nth lr_item from the production (or None if at the end)
-    def lr_item(self,n):
-        if n > len(self.prod): return None
-        p = LRItem(self,n)
-
-        # Precompute the list of productions immediately following.  Hack. Remove later
-        try:
-            p.lr_after = Prodnames[p.prod[n+1]]
-        except (IndexError,KeyError):
-            p.lr_after = []
-        try:
-            p.lr_before = p.prod[n-1]
-        except IndexError:
-            p.lr_before = None
-
-        return p
-    
-    # Bind the production function name to a callable
-    def bind(self,pdict):
-        if self.func:
-            self.callable = pdict[self.func]
-
-# This class serves as a minimal standin for Production objects when
-# reading table data from files.   It only contains information
-# actually used by the LR parsing engine, plus some additional
-# debugging information.
-class MiniProduction(object):
-    def __init__(self,str,name,len,func,file,line):
-        self.name     = name
-        self.len      = len
-        self.func     = func
-        self.callable = None
-        self.file     = file
-        self.line     = line
-        self.str      = str
-    def __str__(self):
-        return self.str
-    def __repr__(self):
-        return "MiniProduction(%s)" % self.str
-
-    # Bind the production function name to a callable
-    def bind(self,pdict):
-        if self.func:
-            self.callable = pdict[self.func]
-
-
-# -----------------------------------------------------------------------------
-# class LRItem
-#
-# This class represents a specific stage of parsing a production rule.  For
-# example: 
-#
-#       expr : expr . PLUS term 
-#
-# In the above, the "." represents the current location of the parse.  Here
-# basic attributes:
-#
-#       name       - Name of the production.  For example 'expr'
-#       prod       - A list of symbols on the right side ['expr','.', 'PLUS','term']
-#       number     - Production number.
-#
-#       lr_next      Next LR item. Example, if we are ' expr -> expr . PLUS term'
-#                    then lr_next refers to 'expr -> expr PLUS . term'
-#       lr_index   - LR item index (location of the ".") in the prod list.
-#       lookaheads - LALR lookahead symbols for this item
-#       len        - Length of the production (number of symbols on right hand side)
-#       lr_after    - List of all productions that immediately follow
-#       lr_before   - Grammar symbol immediately before
-# -----------------------------------------------------------------------------
-
-class LRItem(object):
-    def __init__(self,p,n):
-        self.name       = p.name
-        self.prod       = list(p.prod)
-        self.number     = p.number
-        self.lr_index   = n
-        self.lookaheads = { }
-        self.prod.insert(n,".")
-        self.prod       = tuple(self.prod)
-        self.len        = len(self.prod)
-        self.usyms      = p.usyms
-
-    def __str__(self):
-        if self.prod:
-            s = "%s -> %s" % (self.name," ".join(self.prod))
-        else:
-            s = "%s -> <empty>" % self.name
-        return s
-
-    def __repr__(self):
-        return "LRItem("+str(self)+")"
-
-# -----------------------------------------------------------------------------
-# rightmost_terminal()
-#
-# Return the rightmost terminal from a list of symbols.  Used in add_production()
-# -----------------------------------------------------------------------------
-def rightmost_terminal(symbols, terminals):
-    i = len(symbols) - 1
-    while i >= 0:
-        if symbols[i] in terminals:
-            return symbols[i]
-        i -= 1
-    return None
-
-# -----------------------------------------------------------------------------
-#                           === GRAMMAR CLASS ===
-#
-# The following class represents the contents of the specified grammar along
-# with various computed properties such as first sets, follow sets, LR items, etc.
-# This data is used for critical parts of the table generation process later.
-# -----------------------------------------------------------------------------
-
-class GrammarError(YaccError): pass
-
-class Grammar(object):
-    def __init__(self,terminals):
-        self.Productions  = [None]  # A list of all of the productions.  The first
-                                    # entry is always reserved for the purpose of
-                                    # building an augmented grammar
-
-        self.Prodnames    = { }     # A dictionary mapping the names of nonterminals to a list of all
-                                    # productions of that nonterminal.
-
-        self.Prodmap      = { }     # A dictionary that is only used to detect duplicate
-                                    # productions.
-
-        self.Terminals    = { }     # A dictionary mapping the names of terminal symbols to a
-                                    # list of the rules where they are used.
-
-        for term in terminals:
-            self.Terminals[term] = []
-
-        self.Terminals['error'] = []
-
-        self.Nonterminals = { }     # A dictionary mapping names of nonterminals to a list
-                                    # of rule numbers where they are used.
-
-        self.First        = { }     # A dictionary of precomputed FIRST(x) symbols
-
-        self.Follow       = { }     # A dictionary of precomputed FOLLOW(x) symbols
-
-        self.Precedence   = { }     # Precedence rules for each terminal. Contains tuples of the
-                                    # form ('right',level) or ('nonassoc', level) or ('left',level)
-
-        self.UsedPrecedence = { }   # Precedence rules that were actually used by the grammer.
-                                    # This is only used to provide error checking and to generate
-                                    # a warning about unused precedence rules.
-
-        self.Start = None           # Starting symbol for the grammar
-
-
-    def __len__(self):
-        return len(self.Productions)
-
-    def __getitem__(self,index):
-        return self.Productions[index]
-
-    # -----------------------------------------------------------------------------
-    # set_precedence()
-    #
-    # Sets the precedence for a given terminal. assoc is the associativity such as
-    # 'left','right', or 'nonassoc'.  level is a numeric level.
-    #
-    # -----------------------------------------------------------------------------
-
-    def set_precedence(self,term,assoc,level):
-        assert self.Productions == [None],"Must call set_precedence() before add_production()"
-        if term in self.Precedence:
-            raise GrammarError("Precedence already specified for terminal '%s'" % term)
-        if assoc not in ['left','right','nonassoc']:
-            raise GrammarError("Associativity must be one of 'left','right', or 'nonassoc'")
-        self.Precedence[term] = (assoc,level)
- 
-    # -----------------------------------------------------------------------------
-    # add_production()
-    #
-    # Given an action function, this function assembles a production rule and
-    # computes its precedence level.
-    #
-    # The production rule is supplied as a list of symbols.   For example,
-    # a rule such as 'expr : expr PLUS term' has a production name of 'expr' and
-    # symbols ['expr','PLUS','term'].
-    #
-    # Precedence is determined by the precedence of the right-most non-terminal
-    # or the precedence of a terminal specified by %prec.
-    #
-    # A variety of error checks are performed to make sure production symbols
-    # are valid and that %prec is used correctly.
-    # -----------------------------------------------------------------------------
-
-    def add_production(self,prodname,syms,func=None,file='',line=0):
-
-        if prodname in self.Terminals:
-            raise GrammarError("%s:%d: Illegal rule name '%s'. Already defined as a token" % (file,line,prodname))
-        if prodname == 'error':
-            raise GrammarError("%s:%d: Illegal rule name '%s'. error is a reserved word" % (file,line,prodname))
-        if not _is_identifier.match(prodname):
-            raise GrammarError("%s:%d: Illegal rule name '%s'" % (file,line,prodname))
-
-        # Look for literal tokens 
-        for n,s in enumerate(syms):
-            if s[0] in "'\"":
-                 try:
-                     c = eval(s)
-                     if (len(c) > 1):
-                          raise GrammarError("%s:%d: Literal token %s in rule '%s' may only be a single character" % (file,line,s, prodname))
-                     if not c in self.Terminals:
-                          self.Terminals[c] = []
-                     syms[n] = c
-                     continue
-                 except SyntaxError:
-                     pass
-            if not _is_identifier.match(s) and s != '%prec':
-                raise GrammarError("%s:%d: Illegal name '%s' in rule '%s'" % (file,line,s, prodname))
-        
-        # Determine the precedence level
-        if '%prec' in syms:
-            if syms[-1] == '%prec':
-                raise GrammarError("%s:%d: Syntax error. Nothing follows %%prec" % (file,line))
-            if syms[-2] != '%prec':
-                raise GrammarError("%s:%d: Syntax error. %%prec can only appear at the end of a grammar rule" % (file,line))
-            precname = syms[-1]
-            prodprec = self.Precedence.get(precname,None)
-            if not prodprec:
-                raise GrammarError("%s:%d: Nothing known about the precedence of '%s'" % (file,line,precname))
-            else:
-                self.UsedPrecedence[precname] = 1
-            del syms[-2:]     # Drop %prec from the rule
-        else:
-            # If no %prec, precedence is determined by the rightmost terminal symbol
-            precname = rightmost_terminal(syms,self.Terminals)
-            prodprec = self.Precedence.get(precname,('right',0)) 
-            
-        # See if the rule is already in the rulemap
-        map = "%s -> %s" % (prodname,syms)
-        if map in self.Prodmap:
-            m = self.Prodmap[map]
-            raise GrammarError("%s:%d: Duplicate rule %s. " % (file,line, m) +
-                               "Previous definition at %s:%d" % (m.file, m.line))
-
-        # From this point on, everything is valid.  Create a new Production instance
-        pnumber  = len(self.Productions)
-        if not prodname in self.Nonterminals:
-            self.Nonterminals[prodname] = [ ]
-
-        # Add the production number to Terminals and Nonterminals
-        for t in syms:
-            if t in self.Terminals:
-                self.Terminals[t].append(pnumber)
-            else:
-                if not t in self.Nonterminals:
-                    self.Nonterminals[t] = [ ]
-                self.Nonterminals[t].append(pnumber)
-
-        # Create a production and add it to the list of productions
-        p = Production(pnumber,prodname,syms,prodprec,func,file,line)
-        self.Productions.append(p)
-        self.Prodmap[map] = p
-
-        # Add to the global productions list
-        try:
-            self.Prodnames[prodname].append(p)
-        except KeyError:
-            self.Prodnames[prodname] = [ p ]
-        return 0
-
-    # -----------------------------------------------------------------------------
-    # set_start()
-    #
-    # Sets the starting symbol and creates the augmented grammar.  Production 
-    # rule 0 is S' -> start where start is the start symbol.
-    # -----------------------------------------------------------------------------
-
-    def set_start(self,start=None):
-        if not start:
-            start = self.Productions[1].name
-        if start not in self.Nonterminals:
-            raise GrammarError("start symbol %s undefined" % start)
-        self.Productions[0] = Production(0,"S'",[start])
-        self.Nonterminals[start].append(0)
-        self.Start = start
-
-    # -----------------------------------------------------------------------------
-    # find_unreachable()
-    #
-    # Find all of the nonterminal symbols that can't be reached from the starting
-    # symbol.  Returns a list of nonterminals that can't be reached.
-    # -----------------------------------------------------------------------------
-
-    def find_unreachable(self):
-        
-        # Mark all symbols that are reachable from a symbol s
-        def mark_reachable_from(s):
-            if reachable[s]:
-                # We've already reached symbol s.
-                return
-            reachable[s] = 1
-            for p in self.Prodnames.get(s,[]):
-                for r in p.prod:
-                    mark_reachable_from(r)
-
-        reachable   = { }
-        for s in list(self.Terminals) + list(self.Nonterminals):
-            reachable[s] = 0
-
-        mark_reachable_from( self.Productions[0].prod[0] )
-
-        return [s for s in list(self.Nonterminals)
-                        if not reachable[s]]
-    
-    # -----------------------------------------------------------------------------
-    # infinite_cycles()
-    #
-    # This function looks at the various parsing rules and tries to detect
-    # infinite recursion cycles (grammar rules where there is no possible way
-    # to derive a string of only terminals).
-    # -----------------------------------------------------------------------------
-
-    def infinite_cycles(self):
-        terminates = {}
-
-        # Terminals:
-        for t in self.Terminals:
-            terminates[t] = 1
-
-        terminates['$end'] = 1
-
-        # Nonterminals:
-
-        # Initialize to false:
-        for n in self.Nonterminals:
-            terminates[n] = 0
-
-        # Then propagate termination until no change:
-        while 1:
-            some_change = 0
-            for (n,pl) in self.Prodnames.items():
-                # Nonterminal n terminates iff any of its productions terminates.
-                for p in pl:
-                    # Production p terminates iff all of its rhs symbols terminate.
-                    for s in p.prod:
-                        if not terminates[s]:
-                            # The symbol s does not terminate,
-                            # so production p does not terminate.
-                            p_terminates = 0
-                            break
-                    else:
-                        # didn't break from the loop,
-                        # so every symbol s terminates
-                        # so production p terminates.
-                        p_terminates = 1
-
-                    if p_terminates:
-                        # symbol n terminates!
-                        if not terminates[n]:
-                            terminates[n] = 1
-                            some_change = 1
-                        # Don't need to consider any more productions for this n.
-                        break
-
-            if not some_change:
-                break
-
-        infinite = []
-        for (s,term) in terminates.items():
-            if not term:
-                if not s in self.Prodnames and not s in self.Terminals and s != 'error':
-                    # s is used-but-not-defined, and we've already warned of that,
-                    # so it would be overkill to say that it's also non-terminating.
-                    pass
-                else:
-                    infinite.append(s)
-
-        return infinite
-
-
-    # -----------------------------------------------------------------------------
-    # undefined_symbols()
-    #
-    # Find all symbols that were used the grammar, but not defined as tokens or
-    # grammar rules.  Returns a list of tuples (sym, prod) where sym in the symbol
-    # and prod is the production where the symbol was used. 
-    # -----------------------------------------------------------------------------
-    def undefined_symbols(self):
-        result = []
-        for p in self.Productions:
-            if not p: continue
-
-            for s in p.prod:
-                if not s in self.Prodnames and not s in self.Terminals and s != 'error':
-                    result.append((s,p))
-        return result
-
-    # -----------------------------------------------------------------------------
-    # unused_terminals()
-    #
-    # Find all terminals that were defined, but not used by the grammar.  Returns
-    # a list of all symbols.
-    # -----------------------------------------------------------------------------
-    def unused_terminals(self):
-        unused_tok = []
-        for s,v in self.Terminals.items():
-            if s != 'error' and not v:
-                unused_tok.append(s)
-
-        return unused_tok
-
-    # ------------------------------------------------------------------------------
-    # unused_rules()
-    #
-    # Find all grammar rules that were defined,  but not used (maybe not reachable)
-    # Returns a list of productions.
-    # ------------------------------------------------------------------------------
-
-    def unused_rules(self):
-        unused_prod = []
-        for s,v in self.Nonterminals.items():
-            if not v:
-                p = self.Prodnames[s][0]
-                unused_prod.append(p)
-        return unused_prod
-
-    # -----------------------------------------------------------------------------
-    # unused_precedence()
-    #
-    # Returns a list of tuples (term,precedence) corresponding to precedence
-    # rules that were never used by the grammar.  term is the name of the terminal
-    # on which precedence was applied and precedence is a string such as 'left' or
-    # 'right' corresponding to the type of precedence. 
-    # -----------------------------------------------------------------------------
-
-    def unused_precedence(self):
-        unused = []
-        for termname in self.Precedence:
-            if not (termname in self.Terminals or termname in self.UsedPrecedence):
-                unused.append((termname,self.Precedence[termname][0]))
-                
-        return unused
-
-    # -------------------------------------------------------------------------
-    # _first()
-    #
-    # Compute the value of FIRST1(beta) where beta is a tuple of symbols.
-    #
-    # During execution of compute_first1, the result may be incomplete.
-    # Afterward (e.g., when called from compute_follow()), it will be complete.
-    # -------------------------------------------------------------------------
-    def _first(self,beta):
-
-        # We are computing First(x1,x2,x3,...,xn)
-        result = [ ]
-        for x in beta:
-            x_produces_empty = 0
-
-            # Add all the non-<empty> symbols of First[x] to the result.
-            for f in self.First[x]:
-                if f == '<empty>':
-                    x_produces_empty = 1
-                else:
-                    if f not in result: result.append(f)
-
-            if x_produces_empty:
-                # We have to consider the next x in beta,
-                # i.e. stay in the loop.
-                pass
-            else:
-                # We don't have to consider any further symbols in beta.
-                break
-        else:
-            # There was no 'break' from the loop,
-            # so x_produces_empty was true for all x in beta,
-            # so beta produces empty as well.
-            result.append('<empty>')
-
-        return result
-
-    # -------------------------------------------------------------------------
-    # compute_first()
-    #
-    # Compute the value of FIRST1(X) for all symbols
-    # -------------------------------------------------------------------------
-    def compute_first(self):
-        if self.First:
-            return self.First
-
-        # Terminals:
-        for t in self.Terminals:
-            self.First[t] = [t]
-
-        self.First['$end'] = ['$end']
-
-        # Nonterminals:
-
-        # Initialize to the empty set:
-        for n in self.Nonterminals:
-            self.First[n] = []
-
-        # Then propagate symbols until no change:
-        while 1:
-            some_change = 0
-            for n in self.Nonterminals:
-                for p in self.Prodnames[n]:
-                    for f in self._first(p.prod):
-                        if f not in self.First[n]:
-                            self.First[n].append( f )
-                            some_change = 1
-            if not some_change:
-                break
-        
-        return self.First
-
-    # ---------------------------------------------------------------------
-    # compute_follow()
-    #
-    # Computes all of the follow sets for every non-terminal symbol.  The
-    # follow set is the set of all symbols that might follow a given
-    # non-terminal.  See the Dragon book, 2nd Ed. p. 189.
-    # ---------------------------------------------------------------------
-    def compute_follow(self,start=None):
-        # If already computed, return the result
-        if self.Follow:
-            return self.Follow
-
-        # If first sets not computed yet, do that first.
-        if not self.First:
-            self.compute_first()
-
-        # Add '$end' to the follow list of the start symbol
-        for k in self.Nonterminals:
-            self.Follow[k] = [ ]
-
-        if not start:
-            start = self.Productions[1].name
-
-        self.Follow[start] = [ '$end' ]
-
-        while 1:
-            didadd = 0
-            for p in self.Productions[1:]:
-                # Here is the production set
-                for i in range(len(p.prod)):
-                    B = p.prod[i]
-                    if B in self.Nonterminals:
-                        # Okay. We got a non-terminal in a production
-                        fst = self._first(p.prod[i+1:])
-                        hasempty = 0
-                        for f in fst:
-                            if f != '<empty>' and f not in self.Follow[B]:
-                                self.Follow[B].append(f)
-                                didadd = 1
-                            if f == '<empty>':
-                                hasempty = 1
-                        if hasempty or i == (len(p.prod)-1):
-                            # Add elements of follow(a) to follow(b)
-                            for f in self.Follow[p.name]:
-                                if f not in self.Follow[B]:
-                                    self.Follow[B].append(f)
-                                    didadd = 1
-            if not didadd: break
-        return self.Follow
-
-
-    # -----------------------------------------------------------------------------
-    # build_lritems()
-    #
-    # This function walks the list of productions and builds a complete set of the
-    # LR items.  The LR items are stored in two ways:  First, they are uniquely
-    # numbered and placed in the list _lritems.  Second, a linked list of LR items
-    # is built for each production.  For example:
-    #
-    #   E -> E PLUS E
-    #
-    # Creates the list
-    #
-    #  [E -> . E PLUS E, E -> E . PLUS E, E -> E PLUS . E, E -> E PLUS E . ]
-    # -----------------------------------------------------------------------------
-
-    def build_lritems(self):
-        for p in self.Productions:
-            lastlri = p
-            i = 0
-            lr_items = []
-            while 1:
-                if i > len(p):
-                    lri = None
-                else:
-                    lri = LRItem(p,i)
-                    # Precompute the list of productions immediately following
-                    try:
-                        lri.lr_after = self.Prodnames[lri.prod[i+1]]
-                    except (IndexError,KeyError):
-                        lri.lr_after = []
-                    try:
-                        lri.lr_before = lri.prod[i-1]
-                    except IndexError:
-                        lri.lr_before = None
-
-                lastlri.lr_next = lri
-                if not lri: break
-                lr_items.append(lri)
-                lastlri = lri
-                i += 1
-            p.lr_items = lr_items
-
-# -----------------------------------------------------------------------------
-#                            == Class LRTable ==
-#
-# This basic class represents a basic table of LR parsing information.  
-# Methods for generating the tables are not defined here.  They are defined
-# in the derived class LRGeneratedTable.
-# -----------------------------------------------------------------------------
-
-class VersionError(YaccError): pass
-
-class LRTable(object):
-    def __init__(self):
-        self.lr_action = None
-        self.lr_goto = None
-        self.lr_productions = None
-        self.lr_method = None
-
-    def read_table(self,module):
-        if isinstance(module,types.ModuleType):
-            parsetab = module
-        else:
-            if sys.version_info[0] < 3:
-                exec("import %s as parsetab" % module)
-            else:
-                env = { }
-                exec("import %s as parsetab" % module, env, env)
-                parsetab = env['parsetab']
-
-        if parsetab._tabversion != __tabversion__:
-            raise VersionError("yacc table file version is out of date")
-
-        self.lr_action = parsetab._lr_action
-        self.lr_goto = parsetab._lr_goto
-
-        self.lr_productions = []
-        for p in parsetab._lr_productions:
-            self.lr_productions.append(MiniProduction(*p))
-
-        self.lr_method = parsetab._lr_method
-        return parsetab._lr_signature
-
-    def read_pickle(self,filename):
-        try:
-            import cPickle as pickle
-        except ImportError:
-            import pickle
-
-        in_f = open(filename,"rb")
-
-        tabversion = pickle.load(in_f)
-        if tabversion != __tabversion__:
-            raise VersionError("yacc table file version is out of date")
-        self.lr_method = pickle.load(in_f)
-        signature      = pickle.load(in_f)
-        self.lr_action = pickle.load(in_f)
-        self.lr_goto   = pickle.load(in_f)
-        productions    = pickle.load(in_f)
-
-        self.lr_productions = []
-        for p in productions:
-            self.lr_productions.append(MiniProduction(*p))
-
-        in_f.close()
-        return signature
-
-    # Bind all production function names to callable objects in pdict
-    def bind_callables(self,pdict):
-        for p in self.lr_productions:
-            p.bind(pdict)
-    
-# -----------------------------------------------------------------------------
-#                           === LR Generator ===
-#
-# The following classes and functions are used to generate LR parsing tables on 
-# a grammar.
-# -----------------------------------------------------------------------------
-
-# -----------------------------------------------------------------------------
-# digraph()
-# traverse()
-#
-# The following two functions are used to compute set valued functions
-# of the form:
-#
-#     F(x) = F'(x) U U{F(y) | x R y}
-#
-# This is used to compute the values of Read() sets as well as FOLLOW sets
-# in LALR(1) generation.
-#
-# Inputs:  X    - An input set
-#          R    - A relation
-#          FP   - Set-valued function
-# ------------------------------------------------------------------------------
-
-def digraph(X,R,FP):
-    N = { }
-    for x in X:
-       N[x] = 0
-    stack = []
-    F = { }
-    for x in X:
-        if N[x] == 0: traverse(x,N,stack,F,X,R,FP)
-    return F
-
-def traverse(x,N,stack,F,X,R,FP):
-    stack.append(x)
-    d = len(stack)
-    N[x] = d
-    F[x] = FP(x)             # F(X) <- F'(x)
-
-    rel = R(x)               # Get y's related to x
-    for y in rel:
-        if N[y] == 0:
-             traverse(y,N,stack,F,X,R,FP)
-        N[x] = min(N[x],N[y])
-        for a in F.get(y,[]):
-            if a not in F[x]: F[x].append(a)
-    if N[x] == d:
-       N[stack[-1]] = MAXINT
-       F[stack[-1]] = F[x]
-       element = stack.pop()
-       while element != x:
-           N[stack[-1]] = MAXINT
-           F[stack[-1]] = F[x]
-           element = stack.pop()
-
-class LALRError(YaccError): pass
-
-# -----------------------------------------------------------------------------
-#                             == LRGeneratedTable ==
-#
-# This class implements the LR table generation algorithm.  There are no
-# public methods except for write()
-# -----------------------------------------------------------------------------
-
-class LRGeneratedTable(LRTable):
-    def __init__(self,grammar,method='LALR',log=None):
-        if method not in ['SLR','LALR']:
-            raise LALRError("Unsupported method %s" % method)
-
-        self.grammar = grammar
-        self.lr_method = method
-
-        # Set up the logger
-        if not log:
-            log = NullLogger()
-        self.log = log
-
-        # Internal attributes
-        self.lr_action     = {}        # Action table
-        self.lr_goto       = {}        # Goto table
-        self.lr_productions  = grammar.Productions    # Copy of grammar Production array
-        self.lr_goto_cache = {}        # Cache of computed gotos
-        self.lr0_cidhash   = {}        # Cache of closures
-
-        self._add_count    = 0         # Internal counter used to detect cycles
-
-        # Diagonistic information filled in by the table generator
-        self.sr_conflict   = 0
-        self.rr_conflict   = 0
-        self.conflicts     = []        # List of conflicts
-
-        self.sr_conflicts  = []
-        self.rr_conflicts  = []
-
-        # Build the tables
-        self.grammar.build_lritems()
-        self.grammar.compute_first()
-        self.grammar.compute_follow()
-        self.lr_parse_table()
-
-    # Compute the LR(0) closure operation on I, where I is a set of LR(0) items.
-
-    def lr0_closure(self,I):
-        self._add_count += 1
-
-        # Add everything in I to J
-        J = I[:]
-        didadd = 1
-        while didadd:
-            didadd = 0
-            for j in J:
-                for x in j.lr_after:
-                    if getattr(x,"lr0_added",0) == self._add_count: continue
-                    # Add B --> .G to J
-                    J.append(x.lr_next)
-                    x.lr0_added = self._add_count
-                    didadd = 1
-
-        return J
-
-    # Compute the LR(0) goto function goto(I,X) where I is a set
-    # of LR(0) items and X is a grammar symbol.   This function is written
-    # in a way that guarantees uniqueness of the generated goto sets
-    # (i.e. the same goto set will never be returned as two different Python
-    # objects).  With uniqueness, we can later do fast set comparisons using
-    # id(obj) instead of element-wise comparison.
-
-    def lr0_goto(self,I,x):
-        # First we look for a previously cached entry
-        g = self.lr_goto_cache.get((id(I),x),None)
-        if g: return g
-
-        # Now we generate the goto set in a way that guarantees uniqueness
-        # of the result
-
-        s = self.lr_goto_cache.get(x,None)
-        if not s:
-            s = { }
-            self.lr_goto_cache[x] = s
-
-        gs = [ ]
-        for p in I:
-            n = p.lr_next
-            if n and n.lr_before == x:
-                s1 = s.get(id(n),None)
-                if not s1:
-                    s1 = { }
-                    s[id(n)] = s1
-                gs.append(n)
-                s = s1
-        g = s.get('$end',None)
-        if not g:
-            if gs:
-                g = self.lr0_closure(gs)
-                s['$end'] = g
-            else:
-                s['$end'] = gs
-        self.lr_goto_cache[(id(I),x)] = g
-        return g
-
-    # Compute the LR(0) sets of item function
-    def lr0_items(self):
-
-        C = [ self.lr0_closure([self.grammar.Productions[0].lr_next]) ]
-        i = 0
-        for I in C:
-            self.lr0_cidhash[id(I)] = i
-            i += 1
-
-        # Loop over the items in C and each grammar symbols
-        i = 0
-        while i < len(C):
-            I = C[i]
-            i += 1
-
-            # Collect all of the symbols that could possibly be in the goto(I,X) sets
-            asyms = { }
-            for ii in I:
-                for s in ii.usyms:
-                    asyms[s] = None
-
-            for x in asyms:
-                g = self.lr0_goto(I,x)
-                if not g:  continue
-                if id(g) in self.lr0_cidhash: continue
-                self.lr0_cidhash[id(g)] = len(C)
-                C.append(g)
-
-        return C
-
-    # -----------------------------------------------------------------------------
-    #                       ==== LALR(1) Parsing ====
-    #
-    # LALR(1) parsing is almost exactly the same as SLR except that instead of
-    # relying upon Follow() sets when performing reductions, a more selective
-    # lookahead set that incorporates the state of the LR(0) machine is utilized.
-    # Thus, we mainly just have to focus on calculating the lookahead sets.
-    #
-    # The method used here is due to DeRemer and Pennelo (1982).
-    #
-    # DeRemer, F. L., and T. J. Pennelo: "Efficient Computation of LALR(1)
-    #     Lookahead Sets", ACM Transactions on Programming Languages and Systems,
-    #     Vol. 4, No. 4, Oct. 1982, pp. 615-649
-    #
-    # Further details can also be found in:
-    #
-    #  J. Tremblay and P. Sorenson, "The Theory and Practice of Compiler Writing",
-    #      McGraw-Hill Book Company, (1985).
-    #
-    # -----------------------------------------------------------------------------
-
-    # -----------------------------------------------------------------------------
-    # compute_nullable_nonterminals()
-    #
-    # Creates a dictionary containing all of the non-terminals that might produce
-    # an empty production.
-    # -----------------------------------------------------------------------------
-
-    def compute_nullable_nonterminals(self):
-        nullable = {}
-        num_nullable = 0
-        while 1:
-           for p in self.grammar.Productions[1:]:
-               if p.len == 0:
-                    nullable[p.name] = 1
-                    continue
-               for t in p.prod:
-                    if not t in nullable: break
-               else:
-                    nullable[p.name] = 1
-           if len(nullable) == num_nullable: break
-           num_nullable = len(nullable)
-        return nullable
-
-    # -----------------------------------------------------------------------------
-    # find_nonterminal_trans(C)
-    #
-    # Given a set of LR(0) items, this functions finds all of the non-terminal
-    # transitions.    These are transitions in which a dot appears immediately before
-    # a non-terminal.   Returns a list of tuples of the form (state,N) where state
-    # is the state number and N is the nonterminal symbol.
-    #
-    # The input C is the set of LR(0) items.
-    # -----------------------------------------------------------------------------
-
-    def find_nonterminal_transitions(self,C):
-         trans = []
-         for state in range(len(C)):
-             for p in C[state]:
-                 if p.lr_index < p.len - 1:
-                      t = (state,p.prod[p.lr_index+1])
-                      if t[1] in self.grammar.Nonterminals:
-                            if t not in trans: trans.append(t)
-             state = state + 1
-         return trans
-
-    # -----------------------------------------------------------------------------
-    # dr_relation()
-    #
-    # Computes the DR(p,A) relationships for non-terminal transitions.  The input
-    # is a tuple (state,N) where state is a number and N is a nonterminal symbol.
-    #
-    # Returns a list of terminals.
-    # -----------------------------------------------------------------------------
-
-    def dr_relation(self,C,trans,nullable):
-        dr_set = { }
-        state,N = trans
-        terms = []
-
-        g = self.lr0_goto(C[state],N)
-        for p in g:
-           if p.lr_index < p.len - 1:
-               a = p.prod[p.lr_index+1]
-               if a in self.grammar.Terminals:
-                   if a not in terms: terms.append(a)
-
-        # This extra bit is to handle the start state
-        if state == 0 and N == self.grammar.Productions[0].prod[0]:
-           terms.append('$end')
-
-        return terms
-
-    # -----------------------------------------------------------------------------
-    # reads_relation()
-    #
-    # Computes the READS() relation (p,A) READS (t,C).
-    # -----------------------------------------------------------------------------
-
-    def reads_relation(self,C, trans, empty):
-        # Look for empty transitions
-        rel = []
-        state, N = trans
-
-        g = self.lr0_goto(C[state],N)
-        j = self.lr0_cidhash.get(id(g),-1)
-        for p in g:
-            if p.lr_index < p.len - 1:
-                 a = p.prod[p.lr_index + 1]
-                 if a in empty:
-                      rel.append((j,a))
-
-        return rel
-
-    # -----------------------------------------------------------------------------
-    # compute_lookback_includes()
-    #
-    # Determines the lookback and includes relations
-    #
-    # LOOKBACK:
-    #
-    # This relation is determined by running the LR(0) state machine forward.
-    # For example, starting with a production "N : . A B C", we run it forward
-    # to obtain "N : A B C ."   We then build a relationship between this final
-    # state and the starting state.   These relationships are stored in a dictionary
-    # lookdict.
-    #
-    # INCLUDES:
-    #
-    # Computes the INCLUDE() relation (p,A) INCLUDES (p',B).
-    #
-    # This relation is used to determine non-terminal transitions that occur
-    # inside of other non-terminal transition states.   (p,A) INCLUDES (p', B)
-    # if the following holds:
-    #
-    #       B -> LAT, where T -> epsilon and p' -L-> p
-    #
-    # L is essentially a prefix (which may be empty), T is a suffix that must be
-    # able to derive an empty string.  State p' must lead to state p with the string L.
-    #
-    # -----------------------------------------------------------------------------
-
-    def compute_lookback_includes(self,C,trans,nullable):
-
-        lookdict = {}          # Dictionary of lookback relations
-        includedict = {}       # Dictionary of include relations
-
-        # Make a dictionary of non-terminal transitions
-        dtrans = {}
-        for t in trans:
-            dtrans[t] = 1
-
-        # Loop over all transitions and compute lookbacks and includes
-        for state,N in trans:
-            lookb = []
-            includes = []
-            for p in C[state]:
-                if p.name != N: continue
-
-                # Okay, we have a name match.  We now follow the production all the way
-                # through the state machine until we get the . on the right hand side
-
-                lr_index = p.lr_index
-                j = state
-                while lr_index < p.len - 1:
-                     lr_index = lr_index + 1
-                     t = p.prod[lr_index]
-
-                     # Check to see if this symbol and state are a non-terminal transition
-                     if (j,t) in dtrans:
-                           # Yes.  Okay, there is some chance that this is an includes relation
-                           # the only way to know for certain is whether the rest of the
-                           # production derives empty
-
-                           li = lr_index + 1
-                           while li < p.len:
-                                if p.prod[li] in self.grammar.Terminals: break      # No forget it
-                                if not p.prod[li] in nullable: break
-                                li = li + 1
-                           else:
-                                # Appears to be a relation between (j,t) and (state,N)
-                                includes.append((j,t))
-
-                     g = self.lr0_goto(C[j],t)               # Go to next set
-                     j = self.lr0_cidhash.get(id(g),-1)     # Go to next state
-
-                # When we get here, j is the final state, now we have to locate the production
-                for r in C[j]:
-                     if r.name != p.name: continue
-                     if r.len != p.len:   continue
-                     i = 0
-                     # This look is comparing a production ". A B C" with "A B C ."
-                     while i < r.lr_index:
-                          if r.prod[i] != p.prod[i+1]: break
-                          i = i + 1
-                     else:
-                          lookb.append((j,r))
-            for i in includes:
-                 if not i in includedict: includedict[i] = []
-                 includedict[i].append((state,N))
-            lookdict[(state,N)] = lookb
-
-        return lookdict,includedict
-
-    # -----------------------------------------------------------------------------
-    # compute_read_sets()
-    #
-    # Given a set of LR(0) items, this function computes the read sets.
-    #
-    # Inputs:  C        =  Set of LR(0) items
-    #          ntrans   = Set of nonterminal transitions
-    #          nullable = Set of empty transitions
-    #
-    # Returns a set containing the read sets
-    # -----------------------------------------------------------------------------
-
-    def compute_read_sets(self,C, ntrans, nullable):
-        FP = lambda x: self.dr_relation(C,x,nullable)
-        R =  lambda x: self.reads_relation(C,x,nullable)
-        F = digraph(ntrans,R,FP)
-        return F
-
-    # -----------------------------------------------------------------------------
-    # compute_follow_sets()
-    #
-    # Given a set of LR(0) items, a set of non-terminal transitions, a readset,
-    # and an include set, this function computes the follow sets
-    #
-    # Follow(p,A) = Read(p,A) U U {Follow(p',B) | (p,A) INCLUDES (p',B)}
-    #
-    # Inputs:
-    #            ntrans     = Set of nonterminal transitions
-    #            readsets   = Readset (previously computed)
-    #            inclsets   = Include sets (previously computed)
-    #
-    # Returns a set containing the follow sets
-    # -----------------------------------------------------------------------------
-
-    def compute_follow_sets(self,ntrans,readsets,inclsets):
-         FP = lambda x: readsets[x]
-         R  = lambda x: inclsets.get(x,[])
-         F = digraph(ntrans,R,FP)
-         return F
-
-    # -----------------------------------------------------------------------------
-    # add_lookaheads()
-    #
-    # Attaches the lookahead symbols to grammar rules.
-    #
-    # Inputs:    lookbacks         -  Set of lookback relations
-    #            followset         -  Computed follow set
-    #
-    # This function directly attaches the lookaheads to productions contained
-    # in the lookbacks set
-    # -----------------------------------------------------------------------------
-
-    def add_lookaheads(self,lookbacks,followset):
-        for trans,lb in lookbacks.items():
-            # Loop over productions in lookback
-            for state,p in lb:
-                 if not state in p.lookaheads:
-                      p.lookaheads[state] = []
-                 f = followset.get(trans,[])
-                 for a in f:
-                      if a not in p.lookaheads[state]: p.lookaheads[state].append(a)
-
-    # -----------------------------------------------------------------------------
-    # add_lalr_lookaheads()
-    #
-    # This function does all of the work of adding lookahead information for use
-    # with LALR parsing
-    # -----------------------------------------------------------------------------
-
-    def add_lalr_lookaheads(self,C):
-        # Determine all of the nullable nonterminals
-        nullable = self.compute_nullable_nonterminals()
-
-        # Find all non-terminal transitions
-        trans = self.find_nonterminal_transitions(C)
-
-        # Compute read sets
-        readsets = self.compute_read_sets(C,trans,nullable)
-
-        # Compute lookback/includes relations
-        lookd, included = self.compute_lookback_includes(C,trans,nullable)
-
-        # Compute LALR FOLLOW sets
-        followsets = self.compute_follow_sets(trans,readsets,included)
-
-        # Add all of the lookaheads
-        self.add_lookaheads(lookd,followsets)
-
-    # -----------------------------------------------------------------------------
-    # lr_parse_table()
-    #
-    # This function constructs the parse tables for SLR or LALR
-    # -----------------------------------------------------------------------------
-    def lr_parse_table(self):
-        Productions = self.grammar.Productions
-        Precedence  = self.grammar.Precedence
-        goto   = self.lr_goto         # Goto array
-        action = self.lr_action       # Action array
-        log    = self.log             # Logger for output
-
-        actionp = { }                 # Action production array (temporary)
-        
-        log.info("Parsing method: %s", self.lr_method)
-
-        # Step 1: Construct C = { I0, I1, ... IN}, collection of LR(0) items
-        # This determines the number of states
-
-        C = self.lr0_items()
-
-        if self.lr_method == 'LALR':
-            self.add_lalr_lookaheads(C)
-
-        # Build the parser table, state by state
-        st = 0
-        for I in C:
-            # Loop over each production in I
-            actlist = [ ]              # List of actions
-            st_action  = { }
-            st_actionp = { }
-            st_goto    = { }
-            log.info("")
-            log.info("state %d", st)
-            log.info("")
-            for p in I:
-                log.info("    (%d) %s", p.number, str(p))
-            log.info("")
-
-            for p in I:
-                    if p.len == p.lr_index + 1:
-                        if p.name == "S'":
-                            # Start symbol. Accept!
-                            st_action["$end"] = 0
-                            st_actionp["$end"] = p
-                        else:
-                            # We are at the end of a production.  Reduce!
-                            if self.lr_method == 'LALR':
-                                laheads = p.lookaheads[st]
-                            else:
-                                laheads = self.grammar.Follow[p.name]
-                            for a in laheads:
-                                actlist.append((a,p,"reduce using rule %d (%s)" % (p.number,p)))
-                                r = st_action.get(a,None)
-                                if r is not None:
-                                    # Whoa. Have a shift/reduce or reduce/reduce conflict
-                                    if r > 0:
-                                        # Need to decide on shift or reduce here
-                                        # By default we favor shifting. Need to add
-                                        # some precedence rules here.
-                                        sprec,slevel = Productions[st_actionp[a].number].prec
-                                        rprec,rlevel = Precedence.get(a,('right',0))
-                                        if (slevel < rlevel) or ((slevel == rlevel) and (rprec == 'left')):
-                                            # We really need to reduce here.
-                                            st_action[a] = -p.number
-                                            st_actionp[a] = p
-                                            if not slevel and not rlevel:
-                                                log.info("  ! shift/reduce conflict for %s resolved as reduce",a)
-                                                self.sr_conflicts.append((st,a,'reduce'))
-                                            Productions[p.number].reduced += 1
-                                        elif (slevel == rlevel) and (rprec == 'nonassoc'):
-                                            st_action[a] = None
-                                        else:
-                                            # Hmmm. Guess we'll keep the shift
-                                            if not rlevel:
-                                                log.info("  ! shift/reduce conflict for %s resolved as shift",a)
-                                                self.sr_conflicts.append((st,a,'shift'))
-                                    elif r < 0:
-                                        # Reduce/reduce conflict.   In this case, we favor the rule
-                                        # that was defined first in the grammar file
-                                        oldp = Productions[-r]
-                                        pp = Productions[p.number]
-                                        if oldp.line > pp.line:
-                                            st_action[a] = -p.number
-                                            st_actionp[a] = p
-                                            chosenp,rejectp = pp,oldp
-                                            Productions[p.number].reduced += 1
-                                            Productions[oldp.number].reduced -= 1
-                                        else:
-                                            chosenp,rejectp = oldp,pp
-                                        self.rr_conflicts.append((st,chosenp,rejectp))
-                                        log.info("  ! reduce/reduce conflict for %s resolved using rule %d (%s)", a,st_actionp[a].number, st_actionp[a])
-                                    else:
-                                        raise LALRError("Unknown conflict in state %d" % st)
-                                else:
-                                    st_action[a] = -p.number
-                                    st_actionp[a] = p
-                                    Productions[p.number].reduced += 1
-                    else:
-                        i = p.lr_index
-                        a = p.prod[i+1]       # Get symbol right after the "."
-                        if a in self.grammar.Terminals:
-                            g = self.lr0_goto(I,a)
-                            j = self.lr0_cidhash.get(id(g),-1)
-                            if j >= 0:
-                                # We are in a shift state
-                                actlist.append((a,p,"shift and go to state %d" % j))
-                                r = st_action.get(a,None)
-                                if r is not None:
-                                    # Whoa have a shift/reduce or shift/shift conflict
-                                    if r > 0:
-                                        if r != j:
-                                            raise LALRError("Shift/shift conflict in state %d" % st)
-                                    elif r < 0:
-                                        # Do a precedence check.
-                                        #   -  if precedence of reduce rule is higher, we reduce.
-                                        #   -  if precedence of reduce is same and left assoc, we reduce.
-                                        #   -  otherwise we shift
-                                        rprec,rlevel = Productions[st_actionp[a].number].prec
-                                        sprec,slevel = Precedence.get(a,('right',0))
-                                        if (slevel > rlevel) or ((slevel == rlevel) and (rprec == 'right')):
-                                            # We decide to shift here... highest precedence to shift
-                                            Productions[st_actionp[a].number].reduced -= 1
-                                            st_action[a] = j
-                                            st_actionp[a] = p
-                                            if not rlevel:
-                                                log.info("  ! shift/reduce conflict for %s resolved as shift",a)
-                                                self.sr_conflicts.append((st,a,'shift'))
-                                        elif (slevel == rlevel) and (rprec == 'nonassoc'):
-                                            st_action[a] = None
-                                        else:
-                                            # Hmmm. Guess we'll keep the reduce
-                                            if not slevel and not rlevel:
-                                                log.info("  ! shift/reduce conflict for %s resolved as reduce",a)
-                                                self.sr_conflicts.append((st,a,'reduce'))
-
-                                    else:
-                                        raise LALRError("Unknown conflict in state %d" % st)
-                                else:
-                                    st_action[a] = j
-                                    st_actionp[a] = p
-
-            # Print the actions associated with each terminal
-            _actprint = { }
-            for a,p,m in actlist:
-                if a in st_action:
-                    if p is st_actionp[a]:
-                        log.info("    %-15s %s",a,m)
-                        _actprint[(a,m)] = 1
-            log.info("")
-            # Print the actions that were not used. (debugging)
-            not_used = 0
-            for a,p,m in actlist:
-                if a in st_action:
-                    if p is not st_actionp[a]:
-                        if not (a,m) in _actprint:
-                            log.debug("  ! %-15s [ %s ]",a,m)
-                            not_used = 1
-                            _actprint[(a,m)] = 1
-            if not_used:
-                log.debug("")
-
-            # Construct the goto table for this state
-
-            nkeys = { }
-            for ii in I:
-                for s in ii.usyms:
-                    if s in self.grammar.Nonterminals:
-                        nkeys[s] = None
-            for n in nkeys:
-                g = self.lr0_goto(I,n)
-                j = self.lr0_cidhash.get(id(g),-1)
-                if j >= 0:
-                    st_goto[n] = j
-                    log.info("    %-30s shift and go to state %d",n,j)
-
-            action[st] = st_action
-            actionp[st] = st_actionp
-            goto[st] = st_goto
-            st += 1
-
-
-    # -----------------------------------------------------------------------------
-    # write()
-    #
-    # This function writes the LR parsing tables to a file
-    # -----------------------------------------------------------------------------
-
-    def write_table(self,modulename,outputdir='',signature=""):
-        basemodulename = modulename.split(".")[-1]
-        filename = os.path.join(outputdir,basemodulename) + ".py"
-        try:
-            f = open(filename,"w")
-
-            f.write("""
-# %s
-# This file is automatically generated. Do not edit.
-_tabversion = %r
-
-_lr_method = %r
-
-_lr_signature = %r
-    """ % (filename, __tabversion__, self.lr_method, signature))
-
-            # Change smaller to 0 to go back to original tables
-            smaller = 1
-
-            # Factor out names to try and make smaller
-            if smaller:
-                items = { }
-
-                for s,nd in self.lr_action.items():
-                   for name,v in nd.items():
-                      i = items.get(name)
-                      if not i:
-                         i = ([],[])
-                         items[name] = i
-                      i[0].append(s)
-                      i[1].append(v)
-
-                f.write("\n_lr_action_items = {")
-                for k,v in items.items():
-                    f.write("%r:([" % k)
-                    for i in v[0]:
-                        f.write("%r," % i)
-                    f.write("],[")
-                    for i in v[1]:
-                        f.write("%r," % i)
-
-                    f.write("]),")
-                f.write("}\n")
-
-                f.write("""
-_lr_action = { }
-for _k, _v in _lr_action_items.items():
-   for _x,_y in zip(_v[0],_v[1]):
-      if not _x in _lr_action:  _lr_action[_x] = { }
-      _lr_action[_x][_k] = _y
-del _lr_action_items
-""")
-
-            else:
-                f.write("\n_lr_action = { ");
-                for k,v in self.lr_action.items():
-                    f.write("(%r,%r):%r," % (k[0],k[1],v))
-                f.write("}\n");
-
-            if smaller:
-                # Factor out names to try and make smaller
-                items = { }
-
-                for s,nd in self.lr_goto.items():
-                   for name,v in nd.items():
-                      i = items.get(name)
-                      if not i:
-                         i = ([],[])
-                         items[name] = i
-                      i[0].append(s)
-                      i[1].append(v)
-
-                f.write("\n_lr_goto_items = {")
-                for k,v in items.items():
-                    f.write("%r:([" % k)
-                    for i in v[0]:
-                        f.write("%r," % i)
-                    f.write("],[")
-                    for i in v[1]:
-                        f.write("%r," % i)
-
-                    f.write("]),")
-                f.write("}\n")
-
-                f.write("""
-_lr_goto = { }
-for _k, _v in _lr_goto_items.items():
-   for _x,_y in zip(_v[0],_v[1]):
-       if not _x in _lr_goto: _lr_goto[_x] = { }
-       _lr_goto[_x][_k] = _y
-del _lr_goto_items
-""")
-            else:
-                f.write("\n_lr_goto = { ");
-                for k,v in self.lr_goto.items():
-                    f.write("(%r,%r):%r," % (k[0],k[1],v))
-                f.write("}\n");
-
-            # Write production table
-            f.write("_lr_productions = [\n")
-            for p in self.lr_productions:
-                if p.func:
-                    f.write("  (%r,%r,%d,%r,%r,%d),\n" % (p.str,p.name, p.len, p.func,p.file,p.line))
-                else:
-                    f.write("  (%r,%r,%d,None,None,None),\n" % (str(p),p.name, p.len))
-            f.write("]\n")
-            f.close()
-
-        except IOError:
-            e = sys.exc_info()[1]
-            sys.stderr.write("Unable to create '%s'\n" % filename)
-            sys.stderr.write(str(e)+"\n")
-            return
-
-
-    # -----------------------------------------------------------------------------
-    # pickle_table()
-    #
-    # This function pickles the LR parsing tables to a supplied file object
-    # -----------------------------------------------------------------------------
-
-    def pickle_table(self,filename,signature=""):
-        try:
-            import cPickle as pickle
-        except ImportError:
-            import pickle
-        outf = open(filename,"wb")
-        pickle.dump(__tabversion__,outf,pickle_protocol)
-        pickle.dump(self.lr_method,outf,pickle_protocol)
-        pickle.dump(signature,outf,pickle_protocol)
-        pickle.dump(self.lr_action,outf,pickle_protocol)
-        pickle.dump(self.lr_goto,outf,pickle_protocol)
-
-        outp = []
-        for p in self.lr_productions:
-            if p.func:
-                outp.append((p.str,p.name, p.len, p.func,p.file,p.line))
-            else:
-                outp.append((str(p),p.name,p.len,None,None,None))
-        pickle.dump(outp,outf,pickle_protocol)
-        outf.close()
-
-# -----------------------------------------------------------------------------
-#                            === INTROSPECTION ===
-#
-# The following functions and classes are used to implement the PLY
-# introspection features followed by the yacc() function itself.
-# -----------------------------------------------------------------------------
-
-# -----------------------------------------------------------------------------
-# get_caller_module_dict()
-#
-# This function returns a dictionary containing all of the symbols defined within
-# a caller further down the call stack.  This is used to get the environment
-# associated with the yacc() call if none was provided.
-# -----------------------------------------------------------------------------
-
-def get_caller_module_dict(levels):
-    try:
-        raise RuntimeError
-    except RuntimeError:
-        e,b,t = sys.exc_info()
-        f = t.tb_frame
-        while levels > 0:
-            f = f.f_back                   
-            levels -= 1
-        ldict = f.f_globals.copy()
-        if f.f_globals != f.f_locals:
-            ldict.update(f.f_locals)
-
-        return ldict
-
-# -----------------------------------------------------------------------------
-# parse_grammar()
-#
-# This takes a raw grammar rule string and parses it into production data
-# -----------------------------------------------------------------------------
-def parse_grammar(doc,file,line):
-    grammar = []
-    # Split the doc string into lines
-    pstrings = doc.splitlines()
-    lastp = None
-    dline = line
-    for ps in pstrings:
-        dline += 1
-        p = ps.split()
-        if not p: continue
-        try:
-            if p[0] == '|':
-                # This is a continuation of a previous rule
-                if not lastp:
-                    raise SyntaxError("%s:%d: Misplaced '|'" % (file,dline))
-                prodname = lastp
-                syms = p[1:]
-            else:
-                prodname = p[0]
-                lastp = prodname
-                syms   = p[2:]
-                assign = p[1]
-                if assign != ':' and assign != '::=':
-                    raise SyntaxError("%s:%d: Syntax error. Expected ':'" % (file,dline))
-
-            grammar.append((file,dline,prodname,syms))
-        except SyntaxError:
-            raise
-        except Exception:
-            raise SyntaxError("%s:%d: Syntax error in rule '%s'" % (file,dline,ps.strip()))
-
-    return grammar
-
-# -----------------------------------------------------------------------------
-# ParserReflect()
-#
-# This class represents information extracted for building a parser including
-# start symbol, error function, tokens, precedence list, action functions,
-# etc.
-# -----------------------------------------------------------------------------
-class ParserReflect(object):
-    def __init__(self,pdict,log=None):
-        self.pdict      = pdict
-        self.start      = None
-        self.error_func = None
-        self.tokens     = None
-        self.files      = {}
-        self.grammar    = []
-        self.error      = 0
-
-        if log is None:
-            self.log = PlyLogger(sys.stderr)
-        else:
-            self.log = log
-
-    # Get all of the basic information
-    def get_all(self):
-        self.get_start()
-        self.get_error_func()
-        self.get_tokens()
-        self.get_precedence()
-        self.get_pfunctions()
-        
-    # Validate all of the information
-    def validate_all(self):
-        self.validate_start()
-        self.validate_error_func()
-        self.validate_tokens()
-        self.validate_precedence()
-        self.validate_pfunctions()
-        self.validate_files()
-        return self.error
-
-    # Compute a signature over the grammar
-    def signature(self):
-        try:
-            from hashlib import md5
-        except ImportError:
-            from md5 import md5
-        try:
-            sig = md5()
-            if self.start:
-                sig.update(self.start.encode('latin-1'))
-            if self.prec:
-                sig.update("".join(["".join(p) for p in self.prec]).encode('latin-1'))
-            if self.tokens:
-                sig.update(" ".join(self.tokens).encode('latin-1'))
-            for f in self.pfuncs:
-                if f[3]:
-                    sig.update(f[3].encode('latin-1'))
-        except (TypeError,ValueError):
-            pass
-        return sig.digest()
-
-    # -----------------------------------------------------------------------------
-    # validate_file()
-    #
-    # This method checks to see if there are duplicated p_rulename() functions
-    # in the parser module file.  Without this function, it is really easy for
-    # users to make mistakes by cutting and pasting code fragments (and it's a real
-    # bugger to try and figure out why the resulting parser doesn't work).  Therefore,
-    # we just do a little regular expression pattern matching of def statements
-    # to try and detect duplicates.
-    # -----------------------------------------------------------------------------
-
-    def validate_files(self):
-        # Match def p_funcname(
-        fre = re.compile(r'\s*def\s+(p_[a-zA-Z_0-9]*)\(')
-
-        for filename in self.files.keys():
-            base,ext = os.path.splitext(filename)
-            if ext != '.py': return 1          # No idea. Assume it's okay.
-
-            try:
-                f = open(filename)
-                lines = f.readlines()
-                f.close()
-            except IOError:
-                continue
-
-            counthash = { }
-            for linen,l in enumerate(lines):
-                linen += 1
-                m = fre.match(l)
-                if m:
-                    name = m.group(1)
-                    prev = counthash.get(name)
-                    if not prev:
-                        counthash[name] = linen
-                    else:
-                        self.log.warning("%s:%d: Function %s redefined. Previously defined on line %d", filename,linen,name,prev)
-
-    # Get the start symbol
-    def get_start(self):
-        self.start = self.pdict.get('start')
-
-    # Validate the start symbol
-    def validate_start(self):
-        if self.start is not None:
-            if not isinstance(self.start,str):
-                self.log.error("'start' must be a string")
-
-    # Look for error handler
-    def get_error_func(self):
-        self.error_func = self.pdict.get('p_error')
-
-    # Validate the error function
-    def validate_error_func(self):
-        if self.error_func:
-            if isinstance(self.error_func,types.FunctionType):
-                ismethod = 0
-            elif isinstance(self.error_func, types.MethodType):
-                ismethod = 1
-            else:
-                self.log.error("'p_error' defined, but is not a function or method")
-                self.error = 1
-                return
-
-            eline = func_code(self.error_func).co_firstlineno
-            efile = func_code(self.error_func).co_filename
-            self.files[efile] = 1
-
-            if (func_code(self.error_func).co_argcount != 1+ismethod):
-                self.log.error("%s:%d: p_error() requires 1 argument",efile,eline)
-                self.error = 1
-
-    # Get the tokens map
-    def get_tokens(self):
-        tokens = self.pdict.get("tokens",None)
-        if not tokens:
-            self.log.error("No token list is defined")
-            self.error = 1
-            return
-
-        if not isinstance(tokens,(list, tuple)):
-            self.log.error("tokens must be a list or tuple")
-            self.error = 1
-            return
-        
-        if not tokens:
-            self.log.error("tokens is empty")
-            self.error = 1
-            return
-
-        self.tokens = tokens
-
-    # Validate the tokens
-    def validate_tokens(self):
-        # Validate the tokens.
-        if 'error' in self.tokens:
-            self.log.error("Illegal token name 'error'. Is a reserved word")
-            self.error = 1
-            return
-
-        terminals = {}
-        for n in self.tokens:
-            if n in terminals:
-                self.log.warning("Token '%s' multiply defined", n)
-            terminals[n] = 1
-
-    # Get the precedence map (if any)
-    def get_precedence(self):
-        self.prec = self.pdict.get("precedence",None)
-
-    # Validate and parse the precedence map
-    def validate_precedence(self):
-        preclist = []
-        if self.prec:
-            if not isinstance(self.prec,(list,tuple)):
-                self.log.error("precedence must be a list or tuple")
-                self.error = 1
-                return
-            for level,p in enumerate(self.prec):
-                if not isinstance(p,(list,tuple)):
-                    self.log.error("Bad precedence table")
-                    self.error = 1
-                    return
-
-                if len(p) < 2:
-                    self.log.error("Malformed precedence entry %s. Must be (assoc, term, ..., term)",p)
-                    self.error = 1
-                    return
-                assoc = p[0]
-                if not isinstance(assoc,str):
-                    self.log.error("precedence associativity must be a string")
-                    self.error = 1
-                    return
-                for term in p[1:]:
-                    if not isinstance(term,str):
-                        self.log.error("precedence items must be strings")
-                        self.error = 1
-                        return
-                    preclist.append((term,assoc,level+1))
-        self.preclist = preclist
-
-    # Get all p_functions from the grammar
-    def get_pfunctions(self):
-        p_functions = []
-        for name, item in self.pdict.items():
-            if name[:2] != 'p_': continue
-            if name == 'p_error': continue
-            if isinstance(item,(types.FunctionType,types.MethodType)):
-                line = func_code(item).co_firstlineno
-                file = func_code(item).co_filename
-                p_functions.append((line,file,name,item.__doc__))
-
-        # Sort all of the actions by line number
-        p_functions.sort()
-        self.pfuncs = p_functions
-
-
-    # Validate all of the p_functions
-    def validate_pfunctions(self):
-        grammar = []
-        # Check for non-empty symbols
-        if len(self.pfuncs) == 0:
-            self.log.error("no rules of the form p_rulename are defined")
-            self.error = 1
-            return 
-        
-        for line, file, name, doc in self.pfuncs:
-            func = self.pdict[name]
-            if isinstance(func, types.MethodType):
-                reqargs = 2
-            else:
-                reqargs = 1
-            if func_code(func).co_argcount > reqargs:
-                self.log.error("%s:%d: Rule '%s' has too many arguments",file,line,func.__name__)
-                self.error = 1
-            elif func_code(func).co_argcount < reqargs:
-                self.log.error("%s:%d: Rule '%s' requires an argument",file,line,func.__name__)
-                self.error = 1
-            elif not func.__doc__:
-                self.log.warning("%s:%d: No documentation string specified in function '%s' (ignored)",file,line,func.__name__)
-            else:
-                try:
-                    parsed_g = parse_grammar(doc,file,line)
-                    for g in parsed_g:
-                        grammar.append((name, g))
-                except SyntaxError:
-                    e = sys.exc_info()[1]
-                    self.log.error(str(e))
-                    self.error = 1
-
-                # Looks like a valid grammar rule
-                # Mark the file in which defined.
-                self.files[file] = 1
-
-        # Secondary validation step that looks for p_ definitions that are not functions
-        # or functions that look like they might be grammar rules.
-
-        for n,v in self.pdict.items():
-            if n[0:2] == 'p_' and isinstance(v, (types.FunctionType, types.MethodType)): continue
-            if n[0:2] == 't_': continue
-            if n[0:2] == 'p_' and n != 'p_error':
-                self.log.warning("'%s' not defined as a function", n)
-            if ((isinstance(v,types.FunctionType) and func_code(v).co_argcount == 1) or
-                (isinstance(v,types.MethodType) and func_code(v).co_argcount == 2)):
-                try:
-                    doc = v.__doc__.split(" ")
-                    if doc[1] == ':':
-                        self.log.warning("%s:%d: Possible grammar rule '%s' defined without p_ prefix",
-                                         func_code(v).co_filename, func_code(v).co_firstlineno,n)
-                except Exception:
-                    pass
-
-        self.grammar = grammar
-
-# -----------------------------------------------------------------------------
-# yacc(module)
-#
-# Build a parser
-# -----------------------------------------------------------------------------
-
-def yacc(method='LALR', debug=yaccdebug, module=None, tabmodule=tab_module, start=None, 
-         check_recursion=1, optimize=0, write_tables=1, debugfile=debug_file,outputdir='',
-         debuglog=None, errorlog = None, picklefile=None):
-
-    global parse                 # Reference to the parsing method of the last built parser
-
-    # If pickling is enabled, table files are not created
-
-    if picklefile:
-        write_tables = 0
-
-    if errorlog is None:
-        errorlog = PlyLogger(sys.stderr)
-
-    # Get the module dictionary used for the parser
-    if module:
-        _items = [(k,getattr(module,k)) for k in dir(module)]
-        pdict = dict(_items)
-    else:
-        pdict = get_caller_module_dict(2)
-
-    # Collect parser information from the dictionary
-    pinfo = ParserReflect(pdict,log=errorlog)
-    pinfo.get_all()
-
-    if pinfo.error:
-        raise YaccError("Unable to build parser")
-
-    # Check signature against table files (if any)
-    signature = pinfo.signature()
-
-    # Read the tables
-    try:
-        lr = LRTable()
-        if picklefile:
-            read_signature = lr.read_pickle(picklefile)
-        else:
-            read_signature = lr.read_table(tabmodule)
-        if optimize or (read_signature == signature):
-            try:
-                lr.bind_callables(pinfo.pdict)
-                parser = LRParser(lr,pinfo.error_func)
-                parse = parser.parse
-                return parser
-            except Exception:
-                e = sys.exc_info()[1]
-                errorlog.warning("There was a problem loading the table file: %s", repr(e))
-    except VersionError:
-        e = sys.exc_info()
-        errorlog.warning(str(e))
-    except Exception:
-        pass
-
-    if debuglog is None:
-        if debug:
-            debuglog = PlyLogger(open(debugfile,"w"))
-        else:
-            debuglog = NullLogger()
-
-    debuglog.info("Created by PLY version %s (http://www.dabeaz.com/ply)", __version__)
-
-
-    errors = 0
-
-    # Validate the parser information
-    if pinfo.validate_all():
-        raise YaccError("Unable to build parser")
-    
-    if not pinfo.error_func:
-        errorlog.warning("no p_error() function is defined")
-
-    # Create a grammar object
-    grammar = Grammar(pinfo.tokens)
-
-    # Set precedence level for terminals
-    for term, assoc, level in pinfo.preclist:
-        try:
-            grammar.set_precedence(term,assoc,level)
-        except GrammarError:
-            e = sys.exc_info()[1]
-            errorlog.warning("%s",str(e))
-
-    # Add productions to the grammar
-    for funcname, gram in pinfo.grammar:
-        file, line, prodname, syms = gram
-        try:
-            grammar.add_production(prodname,syms,funcname,file,line)
-        except GrammarError:
-            e = sys.exc_info()[1]
-            errorlog.error("%s",str(e))
-            errors = 1
-
-    # Set the grammar start symbols
-    try:
-        if start is None:
-            grammar.set_start(pinfo.start)
-        else:
-            grammar.set_start(start)
-    except GrammarError:
-        e = sys.exc_info()[1]
-        errorlog.error(str(e))
-        errors = 1
-
-    if errors:
-        raise YaccError("Unable to build parser")
-
-    # Verify the grammar structure
-    undefined_symbols = grammar.undefined_symbols()
-    for sym, prod in undefined_symbols:
-        errorlog.error("%s:%d: Symbol '%s' used, but not defined as a token or a rule",prod.file,prod.line,sym)
-        errors = 1
-
-    unused_terminals = grammar.unused_terminals()
-    if unused_terminals:
-        debuglog.info("")
-        debuglog.info("Unused terminals:")
-        debuglog.info("")
-        for term in unused_terminals:
-            errorlog.warning("Token '%s' defined, but not used", term)
-            debuglog.info("    %s", term)
-
-    # Print out all productions to the debug log
-    if debug:
-        debuglog.info("")
-        debuglog.info("Grammar")
-        debuglog.info("")
-        for n,p in enumerate(grammar.Productions):
-            debuglog.info("Rule %-5d %s", n, p)
-
-    # Find unused non-terminals
-    unused_rules = grammar.unused_rules()
-    for prod in unused_rules:
-        errorlog.warning("%s:%d: Rule '%s' defined, but not used", prod.file, prod.line, prod.name)
-
-    if len(unused_terminals) == 1:
-        errorlog.warning("There is 1 unused token")
-    if len(unused_terminals) > 1:
-        errorlog.warning("There are %d unused tokens", len(unused_terminals))
-
-    if len(unused_rules) == 1:
-        errorlog.warning("There is 1 unused rule")
-    if len(unused_rules) > 1:
-        errorlog.warning("There are %d unused rules", len(unused_rules))
-
-    if debug:
-        debuglog.info("")
-        debuglog.info("Terminals, with rules where they appear")
-        debuglog.info("")
-        terms = list(grammar.Terminals)
-        terms.sort()
-        for term in terms:
-            debuglog.info("%-20s : %s", term, " ".join([str(s) for s in grammar.Terminals[term]]))
-        
-        debuglog.info("")
-        debuglog.info("Nonterminals, with rules where they appear")
-        debuglog.info("")
-        nonterms = list(grammar.Nonterminals)
-        nonterms.sort()
-        for nonterm in nonterms:
-            debuglog.info("%-20s : %s", nonterm, " ".join([str(s) for s in grammar.Nonterminals[nonterm]]))
-        debuglog.info("")
-
-    if check_recursion:
-        unreachable = grammar.find_unreachable()
-        for u in unreachable:
-            errorlog.warning("Symbol '%s' is unreachable",u)
-
-        infinite = grammar.infinite_cycles()
-        for inf in infinite:
-            errorlog.error("Infinite recursion detected for symbol '%s'", inf)
-            errors = 1
-        
-    unused_prec = grammar.unused_precedence()
-    for term, assoc in unused_prec:
-        errorlog.error("Precedence rule '%s' defined for unknown symbol '%s'", assoc, term)
-        errors = 1
-
-    if errors:
-        raise YaccError("Unable to build parser")
-    
-    # Run the LRGeneratedTable on the grammar
-    if debug:
-        errorlog.debug("Generating %s tables", method)
-            
-    lr = LRGeneratedTable(grammar,method,debuglog)
-
-    if debug:
-        num_sr = len(lr.sr_conflicts)
-
-        # Report shift/reduce and reduce/reduce conflicts
-        if num_sr == 1:
-            errorlog.warning("1 shift/reduce conflict")
-        elif num_sr > 1:
-            errorlog.warning("%d shift/reduce conflicts", num_sr)
-
-        num_rr = len(lr.rr_conflicts)
-        if num_rr == 1:
-            errorlog.warning("1 reduce/reduce conflict")
-        elif num_rr > 1:
-            errorlog.warning("%d reduce/reduce conflicts", num_rr)
-
-    # Write out conflicts to the output file
-    if debug and (lr.sr_conflicts or lr.rr_conflicts):
-        debuglog.warning("")
-        debuglog.warning("Conflicts:")
-        debuglog.warning("")
-
-        for state, tok, resolution in lr.sr_conflicts:
-            debuglog.warning("shift/reduce conflict for %s in state %d resolved as %s",  tok, state, resolution)
-        
-        already_reported = {}
-        for state, rule, rejected in lr.rr_conflicts:
-            if (state,id(rule),id(rejected)) in already_reported:
-                continue
-            debuglog.warning("reduce/reduce conflict in state %d resolved using rule (%s)", state, rule)
-            debuglog.warning("rejected rule (%s) in state %d", rejected,state)
-            errorlog.warning("reduce/reduce conflict in state %d resolved using rule (%s)", state, rule)
-            errorlog.warning("rejected rule (%s) in state %d", rejected, state)
-            already_reported[state,id(rule),id(rejected)] = 1
-        
-        warned_never = []
-        for state, rule, rejected in lr.rr_conflicts:
-            if not rejected.reduced and (rejected not in warned_never):
-                debuglog.warning("Rule (%s) is never reduced", rejected)
-                errorlog.warning("Rule (%s) is never reduced", rejected)
-                warned_never.append(rejected)
-
-    # Write the table file if requested
-    if write_tables:
-        lr.write_table(tabmodule,outputdir,signature)
-
-    # Write a pickled version of the tables
-    if picklefile:
-        lr.pickle_table(picklefile,signature)
-
-    # Build the parser
-    lr.bind_callables(pinfo.pdict)
-    parser = LRParser(lr,pinfo.error_func)
-
-    parse = parser.parse
-    return parser
diff --git a/ui/gfx/geometry/mojo/BUILD.gn b/ui/gfx/geometry/mojo/BUILD.gn
deleted file mode 100644
index f6cda9d..0000000
--- a/ui/gfx/geometry/mojo/BUILD.gn
+++ /dev/null
@@ -1,49 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//mojo/public/tools/bindings/mojom.gni")
-
-# This target does NOT depend on skia. One can depend on this target to avoid
-# picking up a dependency on skia.
-mojom("mojo") {
-  sources = [
-    "geometry.mojom",
-  ]
-}
-
-mojom("test_interfaces") {
-  sources = [
-    "geometry_traits_test_service.mojom",
-  ]
-
-  public_deps = [
-    ":mojo",
-  ]
-}
-
-source_set("unit_test") {
-  testonly = true
-
-  sources = [
-    "geometry_struct_traits_unittest.cc",
-  ]
-
-  deps = [
-    ":test_interfaces",
-    "//base",
-    "//mojo/public/cpp/bindings",
-    "//testing/gtest",
-    "//ui/gfx/geometry",
-  ]
-}
-
-source_set("struct_traits") {
-  sources = [
-    "geometry_struct_traits.h",
-  ]
-  public_deps = [
-    ":mojo_shared_cpp_sources",
-    "//ui/gfx/geometry",
-  ]
-}
diff --git a/ui/gfx/geometry/mojo/DEPS b/ui/gfx/geometry/mojo/DEPS
deleted file mode 100644
index 3ad6543..0000000
--- a/ui/gfx/geometry/mojo/DEPS
+++ /dev/null
@@ -1,4 +0,0 @@
-include_rules = [
-  "+mojo/public",
-  "+ui/gfx/geometry",
-]
diff --git a/ui/gfx/geometry/mojo/geometry.mojom b/ui/gfx/geometry/mojo/geometry.mojom
deleted file mode 100644
index 9714386..0000000
--- a/ui/gfx/geometry/mojo/geometry.mojom
+++ /dev/null
@@ -1,63 +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.
-
-module gfx.mojom;
-
-struct Point {
-  int32 x;
-  int32 y;
-};
-
-struct PointF {
-  float x;
-  float y;
-};
-
-struct Size {
-  int32 width;
-  int32 height;
-};
-
-struct SizeF {
-  float width;
-  float height;
-};
-
-struct Rect {
-  int32 x;
-  int32 y;
-  int32 width;
-  int32 height;
-};
-
-struct RectF {
-  float x;
-  float y;
-  float width;
-  float height;
-};
-
-struct Insets {
-  int32 top;
-  int32 left;
-  int32 bottom;
-  int32 right;
-};
-
-struct InsetsF {
-  float top;
-  float left;
-  float bottom;
-  float right;
-};
-
-struct Vector2d {
-  int32 x;
-  int32 y;
-};
-
-struct Vector2dF {
-  float x;
-  float y;
-};
diff --git a/ui/gfx/geometry/mojo/geometry.typemap b/ui/gfx/geometry/mojo/geometry.typemap
deleted file mode 100644
index 686ea05..0000000
--- a/ui/gfx/geometry/mojo/geometry.typemap
+++ /dev/null
@@ -1,32 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-mojom = "//ui/gfx/geometry/mojo/geometry.mojom"
-public_headers = [
-  "//ui/gfx/geometry/point.h",
-  "//ui/gfx/geometry/point_f.h",
-  "//ui/gfx/geometry/size.h",
-  "//ui/gfx/geometry/rect.h",
-  "//ui/gfx/geometry/rect_f.h",
-  "//ui/gfx/geometry/safe_integer_conversions.h",
-  "//ui/gfx/geometry/insets.h",
-  "//ui/gfx/geometry/vector2d.h",
-  "//ui/gfx/geometry/vector2d_f.h",
-]
-traits_headers = [ "//ui/gfx/geometry/mojo/geometry_struct_traits.h" ]
-deps = [
-  "//ui/gfx/geometry/mojo:struct_traits",
-]
-type_mappings = [
-  "gfx.mojom.Point=gfx::Point",
-  "gfx.mojom.PointF=gfx::PointF",
-  "gfx.mojom.Size=gfx::Size",
-  "gfx.mojom.SizeF=gfx::SizeF",
-  "gfx.mojom.Rect=gfx::Rect",
-  "gfx.mojom.RectF=gfx::RectF",
-  "gfx.mojom.Insets=gfx::Insets",
-  "gfx.mojom.InsetsF=gfx::InsetsF",
-  "gfx.mojom.Vector2d=gfx::Vector2d",
-  "gfx.mojom.Vector2dF=gfx::Vector2dF",
-]
diff --git a/ui/gfx/geometry/mojo/geometry_struct_traits.h b/ui/gfx/geometry/mojo/geometry_struct_traits.h
deleted file mode 100644
index a31d738..0000000
--- a/ui/gfx/geometry/mojo/geometry_struct_traits.h
+++ /dev/null
@@ -1,146 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef UI_GFX_GEOMETRY_MOJO_GEOMETRY_STRUCT_TRAITS_H_
-#define UI_GFX_GEOMETRY_MOJO_GEOMETRY_STRUCT_TRAITS_H_
-
-#include "ui/gfx/geometry/insets.h"
-#include "ui/gfx/geometry/insets_f.h"
-#include "ui/gfx/geometry/mojo/geometry.mojom-shared.h"
-#include "ui/gfx/geometry/point.h"
-#include "ui/gfx/geometry/point_f.h"
-#include "ui/gfx/geometry/rect.h"
-#include "ui/gfx/geometry/rect_f.h"
-#include "ui/gfx/geometry/size.h"
-#include "ui/gfx/geometry/size_f.h"
-#include "ui/gfx/geometry/vector2d.h"
-#include "ui/gfx/geometry/vector2d_f.h"
-
-namespace mojo {
-
-template <>
-struct StructTraits<gfx::mojom::InsetsDataView, gfx::Insets> {
-  static int top(const gfx::Insets& p) { return p.top(); }
-  static int left(const gfx::Insets& p) { return p.left(); }
-  static int bottom(const gfx::Insets& p) { return p.bottom(); }
-  static int right(const gfx::Insets& p) { return p.right(); }
-  static bool Read(gfx::mojom::InsetsDataView data, gfx::Insets* out) {
-    out->Set(data.top(), data.left(), data.bottom(), data.right());
-    return true;
-  }
-};
-
-template <>
-struct StructTraits<gfx::mojom::InsetsFDataView, gfx::InsetsF> {
-  static float top(const gfx::InsetsF& p) { return p.top(); }
-  static float left(const gfx::InsetsF& p) { return p.left(); }
-  static float bottom(const gfx::InsetsF& p) { return p.bottom(); }
-  static float right(const gfx::InsetsF& p) { return p.right(); }
-  static bool Read(gfx::mojom::InsetsFDataView data, gfx::InsetsF* out) {
-    out->Set(data.top(), data.left(), data.bottom(), data.right());
-    return true;
-  }
-};
-
-template <>
-struct StructTraits<gfx::mojom::PointDataView, gfx::Point> {
-  static int x(const gfx::Point& p) { return p.x(); }
-  static int y(const gfx::Point& p) { return p.y(); }
-  static bool Read(gfx::mojom::PointDataView data, gfx::Point* out) {
-    out->SetPoint(data.x(), data.y());
-    return true;
-  }
-};
-
-template <>
-struct StructTraits<gfx::mojom::PointFDataView, gfx::PointF> {
-  static float x(const gfx::PointF& p) { return p.x(); }
-  static float y(const gfx::PointF& p) { return p.y(); }
-  static bool Read(gfx::mojom::PointFDataView data, gfx::PointF* out) {
-    out->SetPoint(data.x(), data.y());
-    return true;
-  }
-};
-
-template <>
-struct StructTraits<gfx::mojom::RectDataView, gfx::Rect> {
-  static int x(const gfx::Rect& p) { return p.x(); }
-  static int y(const gfx::Rect& p) { return p.y(); }
-  static int width(const gfx::Rect& p) { return p.width(); }
-  static int height(const gfx::Rect& p) { return p.height(); }
-  static bool Read(gfx::mojom::RectDataView data, gfx::Rect* out) {
-    if (data.width() < 0 || data.height() < 0)
-      return false;
-
-    out->SetRect(data.x(), data.y(), data.width(), data.height());
-    return true;
-  }
-};
-
-template <>
-struct StructTraits<gfx::mojom::RectFDataView, gfx::RectF> {
-  static float x(const gfx::RectF& p) { return p.x(); }
-  static float y(const gfx::RectF& p) { return p.y(); }
-  static float width(const gfx::RectF& p) { return p.width(); }
-  static float height(const gfx::RectF& p) { return p.height(); }
-  static bool Read(gfx::mojom::RectFDataView data, gfx::RectF* out) {
-    if (data.width() < 0 || data.height() < 0)
-      return false;
-
-    out->SetRect(data.x(), data.y(), data.width(), data.height());
-    return true;
-  }
-};
-
-template <>
-struct StructTraits<gfx::mojom::SizeDataView, gfx::Size> {
-  static int width(const gfx::Size& p) { return p.width(); }
-  static int height(const gfx::Size& p) { return p.height(); }
-  static bool Read(gfx::mojom::SizeDataView data, gfx::Size* out) {
-    if (data.width() < 0 || data.height() < 0)
-      return false;
-
-    out->SetSize(data.width(), data.height());
-    return true;
-  }
-};
-
-template <>
-struct StructTraits<gfx::mojom::SizeFDataView, gfx::SizeF> {
-  static float width(const gfx::SizeF& p) { return p.width(); }
-  static float height(const gfx::SizeF& p) { return p.height(); }
-  static bool Read(gfx::mojom::SizeFDataView data, gfx::SizeF* out) {
-    if (data.width() < 0 || data.height() < 0)
-      return false;
-
-    out->SetSize(data.width(), data.height());
-    return true;
-  }
-};
-
-template <>
-struct StructTraits<gfx::mojom::Vector2dDataView, gfx::Vector2d> {
-  static int x(const gfx::Vector2d& v) { return v.x(); }
-  static int y(const gfx::Vector2d& v) { return v.y(); }
-  static bool Read(gfx::mojom::Vector2dDataView data, gfx::Vector2d* out) {
-    out->set_x(data.x());
-    out->set_y(data.y());
-    return true;
-  }
-};
-
-template <>
-struct StructTraits<gfx::mojom::Vector2dFDataView, gfx::Vector2dF> {
-  static float x(const gfx::Vector2dF& v) { return v.x(); }
-  static float y(const gfx::Vector2dF& v) { return v.y(); }
-  static bool Read(gfx::mojom::Vector2dFDataView data, gfx::Vector2dF* out) {
-    out->set_x(data.x());
-    out->set_y(data.y());
-    return true;
-  }
-};
-
-}  // namespace mojo
-
-#endif  // UI_GFX_GEOMETRY_MOJO_GEOMETRY_STRUCT_TRAITS_H_
diff --git a/ui/gfx/geometry/mojo/geometry_struct_traits_unittest.cc b/ui/gfx/geometry/mojo/geometry_struct_traits_unittest.cc
deleted file mode 100644
index d595794..0000000
--- a/ui/gfx/geometry/mojo/geometry_struct_traits_unittest.cc
+++ /dev/null
@@ -1,206 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/message_loop/message_loop.h"
-#include "mojo/public/cpp/bindings/binding_set.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "ui/gfx/geometry/mojo/geometry_traits_test_service.mojom.h"
-#include "ui/gfx/geometry/point.h"
-
-namespace gfx {
-
-namespace {
-
-class GeometryStructTraitsTest : public testing::Test,
-                                 public mojom::GeometryTraitsTestService {
- public:
-  GeometryStructTraitsTest() {}
-
- protected:
-  mojom::GeometryTraitsTestServicePtr GetTraitsTestProxy() {
-    return traits_test_bindings_.CreateInterfacePtrAndBind(this);
-  }
-
- private:
-  // GeometryTraitsTestService:
-  void EchoPoint(const Point& p, const EchoPointCallback& callback) override {
-    callback.Run(p);
-  }
-
-  void EchoPointF(const PointF& p,
-                  const EchoPointFCallback& callback) override {
-    callback.Run(p);
-  }
-
-  void EchoSize(const Size& s, const EchoSizeCallback& callback) override {
-    callback.Run(s);
-  }
-
-  void EchoSizeF(const SizeF& s, const EchoSizeFCallback& callback) override {
-    callback.Run(s);
-  }
-
-  void EchoRect(const Rect& r, const EchoRectCallback& callback) override {
-    callback.Run(r);
-  }
-
-  void EchoRectF(const RectF& r, const EchoRectFCallback& callback) override {
-    callback.Run(r);
-  }
-
-  void EchoInsets(const Insets& i,
-                  const EchoInsetsCallback& callback) override {
-    callback.Run(i);
-  }
-
-  void EchoInsetsF(const InsetsF& i,
-                   const EchoInsetsFCallback& callback) override {
-    callback.Run(i);
-  }
-
-  void EchoVector2d(const Vector2d& v,
-                    const EchoVector2dCallback& callback) override {
-    callback.Run(v);
-  }
-
-  void EchoVector2dF(const Vector2dF& v,
-                     const EchoVector2dFCallback& callback) override {
-    callback.Run(v);
-  }
-
-  base::MessageLoop loop_;
-  mojo::BindingSet<GeometryTraitsTestService> traits_test_bindings_;
-
-  DISALLOW_COPY_AND_ASSIGN(GeometryStructTraitsTest);
-};
-
-}  // namespace
-
-TEST_F(GeometryStructTraitsTest, Point) {
-  const int32_t x = 1234;
-  const int32_t y = -5678;
-  gfx::Point input(x, y);
-  mojom::GeometryTraitsTestServicePtr proxy = GetTraitsTestProxy();
-  gfx::Point output;
-  proxy->EchoPoint(input, &output);
-  EXPECT_EQ(x, output.x());
-  EXPECT_EQ(y, output.y());
-}
-
-TEST_F(GeometryStructTraitsTest, PointF) {
-  const float x = 1234.5f;
-  const float y = 6789.6f;
-  gfx::PointF input(x, y);
-  mojom::GeometryTraitsTestServicePtr proxy = GetTraitsTestProxy();
-  gfx::PointF output;
-  proxy->EchoPointF(input, &output);
-  EXPECT_EQ(x, output.x());
-  EXPECT_EQ(y, output.y());
-}
-
-TEST_F(GeometryStructTraitsTest, Size) {
-  const int32_t width = 1234;
-  const int32_t height = 5678;
-  gfx::Size input(width, height);
-  mojom::GeometryTraitsTestServicePtr proxy = GetTraitsTestProxy();
-  gfx::Size output;
-  proxy->EchoSize(input, &output);
-  EXPECT_EQ(width, output.width());
-  EXPECT_EQ(height, output.height());
-}
-
-TEST_F(GeometryStructTraitsTest, SizeF) {
-  const float width = 1234.5f;
-  const float height = 6789.6f;
-  gfx::SizeF input(width, height);
-  mojom::GeometryTraitsTestServicePtr proxy = GetTraitsTestProxy();
-  gfx::SizeF output;
-  proxy->EchoSizeF(input, &output);
-  EXPECT_EQ(width, output.width());
-  EXPECT_EQ(height, output.height());
-}
-
-TEST_F(GeometryStructTraitsTest, Rect) {
-  const int32_t x = 1234;
-  const int32_t y = 5678;
-  const int32_t width = 4321;
-  const int32_t height = 8765;
-  gfx::Rect input(x, y, width, height);
-  mojom::GeometryTraitsTestServicePtr proxy = GetTraitsTestProxy();
-  gfx::Rect output;
-  proxy->EchoRect(input, &output);
-  EXPECT_EQ(x, output.x());
-  EXPECT_EQ(y, output.y());
-  EXPECT_EQ(width, output.width());
-  EXPECT_EQ(height, output.height());
-}
-
-TEST_F(GeometryStructTraitsTest, RectF) {
-  const float x = 1234.1f;
-  const float y = 5678.2f;
-  const float width = 4321.3f;
-  const float height = 8765.4f;
-  gfx::RectF input(x, y, width, height);
-  mojom::GeometryTraitsTestServicePtr proxy = GetTraitsTestProxy();
-  gfx::RectF output;
-  proxy->EchoRectF(input, &output);
-  EXPECT_EQ(x, output.x());
-  EXPECT_EQ(y, output.y());
-  EXPECT_EQ(width, output.width());
-  EXPECT_EQ(height, output.height());
-}
-
-TEST_F(GeometryStructTraitsTest, Insets) {
-  const int32_t top = 1234;
-  const int32_t left = 5678;
-  const int32_t bottom = 4321;
-  const int32_t right = 8765;
-  gfx::Insets input(top, left, bottom, right);
-  mojom::GeometryTraitsTestServicePtr proxy = GetTraitsTestProxy();
-  gfx::Insets output;
-  proxy->EchoInsets(input, &output);
-  EXPECT_EQ(top, output.top());
-  EXPECT_EQ(left, output.left());
-  EXPECT_EQ(bottom, output.bottom());
-  EXPECT_EQ(right, output.right());
-}
-
-TEST_F(GeometryStructTraitsTest, InsetsF) {
-  const float top = 1234.1f;
-  const float left = 5678.2f;
-  const float bottom = 4321.3f;
-  const float right = 8765.4f;
-  gfx::InsetsF input(top, left, bottom, right);
-  mojom::GeometryTraitsTestServicePtr proxy = GetTraitsTestProxy();
-  gfx::InsetsF output;
-  proxy->EchoInsetsF(input, &output);
-  EXPECT_EQ(top, output.top());
-  EXPECT_EQ(left, output.left());
-  EXPECT_EQ(bottom, output.bottom());
-  EXPECT_EQ(right, output.right());
-}
-
-TEST_F(GeometryStructTraitsTest, Vector2d) {
-  const int32_t x = 1234;
-  const int32_t y = -5678;
-  gfx::Vector2d input(x, y);
-  mojom::GeometryTraitsTestServicePtr proxy = GetTraitsTestProxy();
-  gfx::Vector2d output;
-  proxy->EchoVector2d(input, &output);
-  EXPECT_EQ(x, output.x());
-  EXPECT_EQ(y, output.y());
-}
-
-TEST_F(GeometryStructTraitsTest, Vector2dF) {
-  const float x = 1234.5f;
-  const float y = 6789.6f;
-  gfx::Vector2dF input(x, y);
-  mojom::GeometryTraitsTestServicePtr proxy = GetTraitsTestProxy();
-  gfx::Vector2dF output;
-  proxy->EchoVector2dF(input, &output);
-  EXPECT_EQ(x, output.x());
-  EXPECT_EQ(y, output.y());
-}
-
-}  // namespace gfx
diff --git a/ui/gfx/geometry/mojo/geometry_traits_test_service.mojom b/ui/gfx/geometry/mojo/geometry_traits_test_service.mojom
deleted file mode 100644
index 8d4fb94..0000000
--- a/ui/gfx/geometry/mojo/geometry_traits_test_service.mojom
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module gfx.mojom;
-
-import "ui/gfx/geometry/mojo/geometry.mojom";
-
-// All functions on this interface echo their arguments to test StructTraits
-// serialization and deserialization.
-interface GeometryTraitsTestService {
-  [Sync]
-  EchoPoint(Point p) => (Point pass);
-
-  [Sync]
-  EchoPointF(PointF p) => (PointF pass);
-
-  [Sync]
-  EchoSize(Size s) => (Size pass);
-
-  [Sync]
-  EchoSizeF(SizeF s) => (SizeF pass);
-
-  [Sync]
-  EchoRect(Rect r) => (Rect pass);
-
-  [Sync]
-  EchoRectF(RectF r) => (RectF pass);
-
-  [Sync]
-  EchoInsets(Insets i) => (Insets pass);
-
-  [Sync]
-  EchoInsetsF(InsetsF i) => (InsetsF pass);
-
-  [Sync]
-  EchoVector2d(Vector2d v) => (Vector2d pass);
-
-  [Sync]
-  EchoVector2dF(Vector2dF v) => (Vector2dF pass);
-};
diff --git a/ui/gfx/range/mojo/BUILD.gn b/ui/gfx/range/mojo/BUILD.gn
deleted file mode 100644
index b6d458d..0000000
--- a/ui/gfx/range/mojo/BUILD.gn
+++ /dev/null
@@ -1,49 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//mojo/public/tools/bindings/mojom.gni")
-
-# This target does NOT depend on skia. One can depend on this target to avoid
-# picking up a dependency on skia.
-mojom("mojo") {
-  sources = [
-    "range.mojom",
-  ]
-}
-
-mojom("test_interfaces") {
-  sources = [
-    "range_traits_test_service.mojom",
-  ]
-
-  public_deps = [
-    ":mojo",
-  ]
-}
-
-source_set("unit_test") {
-  testonly = true
-
-  sources = [
-    "range_struct_traits_unittest.cc",
-  ]
-
-  deps = [
-    ":test_interfaces",
-    "//base",
-    "//mojo/public/cpp/bindings",
-    "//testing/gtest",
-    "//ui/gfx/range",
-  ]
-}
-
-source_set("struct_traits") {
-  sources = [
-    "range_struct_traits.h",
-  ]
-  public_deps = [
-    ":mojo_shared_cpp_sources",
-    "//ui/gfx/range",
-  ]
-}
diff --git a/ui/gfx/range/mojo/DEPS b/ui/gfx/range/mojo/DEPS
deleted file mode 100644
index 418fc69..0000000
--- a/ui/gfx/range/mojo/DEPS
+++ /dev/null
@@ -1,4 +0,0 @@
-include_rules = [
-  "+mojo/public",
-  "+ui/gfx/range",
-]
diff --git a/ui/gfx/range/mojo/range.mojom b/ui/gfx/range/mojo/range.mojom
deleted file mode 100644
index 079c146..0000000
--- a/ui/gfx/range/mojo/range.mojom
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module gfx.mojom;
-
-struct Range {
-  uint32 start;
-  uint32 end;
-};
-
-struct RangeF {
-  float start;
-  float end;
-};
diff --git a/ui/gfx/range/mojo/range.typemap b/ui/gfx/range/mojo/range.typemap
deleted file mode 100644
index ebf07d1..0000000
--- a/ui/gfx/range/mojo/range.typemap
+++ /dev/null
@@ -1,17 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-mojom = "//ui/gfx/range/mojo/range.mojom"
-public_headers = [
-  "//ui/gfx/range/range.h",
-  "//ui/gfx/range/range_f.h",
-]
-traits_headers = [ "//ui/gfx/range/mojo/range_struct_traits.h" ]
-deps = [
-  "//ui/gfx/range/mojo:struct_traits",
-]
-type_mappings = [
-  "gfx.mojom.Range=gfx::Range",
-  "gfx.mojom.RangeF=gfx::RangeF",
-]
diff --git a/ui/gfx/range/mojo/range_struct_traits.h b/ui/gfx/range/mojo/range_struct_traits.h
deleted file mode 100644
index e717d41..0000000
--- a/ui/gfx/range/mojo/range_struct_traits.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef UI_GFX_RANGE_MOJO_RANGE_STRUCT_TRAITS_H_
-#define UI_GFX_RANGE_MOJO_RANGE_STRUCT_TRAITS_H_
-
-#include "ui/gfx/range/mojo/range.mojom-shared.h"
-#include "ui/gfx/range/range.h"
-#include "ui/gfx/range/range_f.h"
-
-namespace mojo {
-
-template <>
-struct StructTraits<gfx::mojom::RangeDataView, gfx::Range> {
-  static uint32_t start(const gfx::Range& r) { return r.start(); }
-  static uint32_t end(const gfx::Range& r) { return r.end(); }
-  static bool Read(gfx::mojom::RangeDataView data, gfx::Range* out) {
-    out->set_start(data.start());
-    out->set_end(data.end());
-    return true;
-  }
-};
-
-template <>
-struct StructTraits<gfx::mojom::RangeFDataView, gfx::RangeF> {
-  static float start(const gfx::RangeF& r) { return r.start(); }
-  static float end(const gfx::RangeF& r) { return r.end(); }
-  static bool Read(gfx::mojom::RangeFDataView data, gfx::RangeF* out) {
-    out->set_start(data.start());
-    out->set_end(data.end());
-    return true;
-  }
-};
-
-}  // namespace mojo
-
-#endif  // UI_GFX_RANGE_MOJO_RANGE_STRUCT_TRAITS_H_
diff --git a/ui/gfx/range/mojo/range_struct_traits_unittest.cc b/ui/gfx/range/mojo/range_struct_traits_unittest.cc
deleted file mode 100644
index 70b32f3..0000000
--- a/ui/gfx/range/mojo/range_struct_traits_unittest.cc
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/message_loop/message_loop.h"
-#include "mojo/public/cpp/bindings/binding_set.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "ui/gfx/range/mojo/range_traits_test_service.mojom.h"
-
-namespace gfx {
-
-namespace {
-
-class RangeStructTraitsTest : public testing::Test,
-                              public mojom::RangeTraitsTestService {
- public:
-  RangeStructTraitsTest() {}
-
- protected:
-  mojom::RangeTraitsTestServicePtr GetTraitsTestProxy() {
-    return traits_test_bindings_.CreateInterfacePtrAndBind(this);
-  }
-
- private:
-  // RangeTraitsTestService:
-  void EchoRange(const Range& p, const EchoRangeCallback& callback) override {
-    callback.Run(p);
-  }
-
-  void EchoRangeF(const RangeF& p,
-                  const EchoRangeFCallback& callback) override {
-    callback.Run(p);
-  }
-
-  base::MessageLoop loop_;
-  mojo::BindingSet<RangeTraitsTestService> traits_test_bindings_;
-
-  DISALLOW_COPY_AND_ASSIGN(RangeStructTraitsTest);
-};
-
-}  // namespace
-
-TEST_F(RangeStructTraitsTest, Range) {
-  const uint32_t start = 1234;
-  const uint32_t end = 5678;
-  gfx::Range input(start, end);
-  mojom::RangeTraitsTestServicePtr proxy = GetTraitsTestProxy();
-  gfx::Range output;
-  proxy->EchoRange(input, &output);
-  EXPECT_EQ(start, output.start());
-  EXPECT_EQ(end, output.end());
-}
-
-TEST_F(RangeStructTraitsTest, RangeF) {
-  const float start = 1234.5f;
-  const float end = 6789.6f;
-  gfx::RangeF input(start, end);
-  mojom::RangeTraitsTestServicePtr proxy = GetTraitsTestProxy();
-  gfx::RangeF output;
-  proxy->EchoRangeF(input, &output);
-  EXPECT_EQ(start, output.start());
-  EXPECT_EQ(end, output.end());
-}
-
-}  // namespace gfx
diff --git a/ui/gfx/range/mojo/range_traits_test_service.mojom b/ui/gfx/range/mojo/range_traits_test_service.mojom
deleted file mode 100644
index 3cde75c..0000000
--- a/ui/gfx/range/mojo/range_traits_test_service.mojom
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module gfx.mojom;
-
-import "ui/gfx/range/mojo/range.mojom";
-
-// All functions on this interface echo their arguments to test StructTraits
-// serialization and deserialization.
-interface RangeTraitsTestService {
-  [Sync]
-  EchoRange(Range p) => (Range pass);
-
-  [Sync]
-  EchoRangeF(RangeF p) => (RangeF pass);
-};